前の10件 | -
ソース部分作成3 (1-9.ソース:共通関数) [ロボット制作(tankun-mk1)] [ロボット制作(tankun-mk1)]
おはようぼざいます。結局、遅くなりました
前回、中途半端になっていた各関数を紹介していきます。
各関数を作成しているのは色んな箇所で似たような処理をする部分を
一か所にまとめることで単純に書くソース量を減らすのと、
変更があった場合に修正箇所を少なくできるためです
[モータ操作]
まずはキャタピラ部分のモータ操作。
呼び元からは「前進」「右旋回」など動く方向だけを与えて、
関数の中で両モータの前進・後退を制御します。
[超音波センサの距離取得]
超音波センサから距離を取得する関数と、
前方に障害物があるかチェックする関数です。
チェックは引数でエラー距離を受ける事で汎用的にしています。
[サーボの制御]
引数で受けた角度にサーボを回転させて、一定時間のディレイをいれてます
[次の行き先チェック]
この関数は
1.進みたい方向にサーボを回転させて
2.超音波センサで、その方向に障害物があるかチェックして
3.障害物がなければ進む
という動きです。
先に右をチェックして、障害物があれば左をチェックして、
さらに障害物がある場合は少し下がっています。
かなり長くなりましたがこんな感じです。
各関数の説明が雑なので、折を見て補足していきますね。
では次回は、、、ついに完成かも
前回、中途半端になっていた各関数を紹介していきます。
各関数を作成しているのは色んな箇所で似たような処理をする部分を
一か所にまとめることで単純に書くソース量を減らすのと、
変更があった場合に修正箇所を少なくできるためです
[モータ操作]
まずはキャタピラ部分のモータ操作。
呼び元からは「前進」「右旋回」など動く方向だけを与えて、
関数の中で両モータの前進・後退を制御します。
void motor_move( int mode ) { // GO STOP LEFT RIGHT BACK int motor_0_0[6] = { HIGH, HIGH, LOW, HIGH, LOW}; int motor_0_1[6] = { LOW, HIGH, HIGH, LOW, HIGH}; int motor_1_0[6] = { HIGH, HIGH, HIGH, LOW, LOW}; int motor_1_1[6] = { LOW, HIGH, LOW, HIGH, HIGH}; short delay_time[6] = { 800, 1000, 1100, 1100, 1000 }; digitalWrite( PIN_MTR_LEFT_GO, motor_0_0[mode] ); digitalWrite( PIN_MTR_LEFT_BACK, motor_0_1[mode] ); digitalWrite( PIN_MTR_RIGHT_GO, motor_1_0[mode] ); digitalWrite( PIN_MTR_RIGHT_BACK, motor_1_1[mode] ); delay( delay_time[mode] ); return; }
[超音波センサの距離取得]
超音波センサから距離を取得する関数と、
前方に障害物があるかチェックする関数です。
チェックは引数でエラー距離を受ける事で汎用的にしています。
int check_sonic_sensor_dst( int err_dst, int mode) { float Distance; // ---------------------------------------------- // 距離を取得 // ---------------------------------------------- Distance = get_sonic_sensor_dst(); if ( Distance == 3 ) { Distance = get_sonic_sensor_dst(); } if ( ( Distance >= 5 ) && ( Distance <= err_dst ) ) { motor_move(MTR_SET_MODE_STOP); // 引数で受けたエラー距離を超えた Serial.print("kyo'risenti',me-'toru"); delay(3500); return 1; } // if( mode == 1 ) { // Serial.print("kyo'ri senti',me-'toru"); // delay(3000); // } return 0; } int get_sonic_sensor_dst() { int Duration; float Distance; int pin_trig=PIN_SENSOR_FRONT_TRIG; int pin_echo=PIN_SENSOR_FRONT_ECHO; // 距離を求めるおまじない digitalWrite( pin_trig, LOW ); delayMicroseconds(1); digitalWrite( pin_trig, HIGH ); delayMicroseconds(1); digitalWrite( pin_trig, LOW ); // 距離を取得 Duration = pulseIn( pin_echo, HIGH ); // Serial.print(Duration); // Serial.println("Duration"); if( Duration > 0 ) { // 距離をcmに変換 Distance = Duration /2; Distance = Distance*340*100/1000000; // Serial.print(Distance); // Serial.println("Distance"); return Distance; }else { return 3; } }
[サーボの制御]
引数で受けた角度にサーボを回転させて、一定時間のディレイをいれてます
void exec_sensor_servo_ungle(int ungle) { servo_front.write(ungle); delay(SERVO_UNGLE_DELAY_TIME); return; }
[次の行き先チェック]
この関数は
1.進みたい方向にサーボを回転させて
2.超音波センサで、その方向に障害物があるかチェックして
3.障害物がなければ進む
という動きです。
先に右をチェックして、障害物があれば左をチェックして、
さらに障害物がある場合は少し下がっています。
void set_next_away() { int Dst_Check=0; int Mode=MTR_SET_MODE_RIGHT; exec_sensor_servo_ungle(SERVO_UNGLE_RIGHT); delay(1000); Dst_Check=check_sonic_sensor_dst(SENSOR_SIDE_ERROR_DST, 1); if ( Dst_Check == 0 ) { delay(500); Serial.println("mi'gini;susu'mi,masu'"); delay(3000); }else { delay(100); exec_sensor_servo_ungle(SERVO_UNGLE_FRONT); delay(100); exec_sensor_servo_ungle(SERVO_UNGLE_LEFT); delay(500); Dst_Check=check_sonic_sensor_dst(SENSOR_SIDE_ERROR_DST, 1); if ( Dst_Check == 0 ) { Mode=MTR_SET_MODE_LEFT; delay(500); // Serial.println("hida'rini;maga'ri,ma'-su"); Serial.println("hida'rini;susu'mi,masu'"); delay(3000); } } delay(100); exec_sensor_servo_ungle(SERVO_UNGLE_FRONT); delay(100); if ( Dst_Check == 0 ) { motor_move(Mode); motor_move(MTR_SET_MODE_STOP); delay(100); motor_move(MTR_SET_MODE_STOP); motor_move(MTR_SET_MODE_GO); }else { motor_move(MTR_SET_MODE_BACK); } return; }
かなり長くなりましたがこんな感じです。
各関数の説明が雑なので、折を見て補足していきますね。
では次回は、、、ついに完成かも
ソース部分作成2 (1-8.ソース:loop関数) [ロボット制作(tankun-mk1)]
おはようぼざいます。
今回はloop関数について説明していきます。
全体の動作としては以下です。
1)開始スイッチが押されたかをチェックする
2)押されたらwhile(1)回り以下を検出するまで進む
2-1)停止スイッチが押されたか
2-2)前方に障害物を発見したか
3)前方に障害物を発見したら以下を行う
4)モータを止めて右と左に障害物があるかチェック
5)障害物がない方向に進む
6)左右両方に障害物がある場合は少し下がる
ただし「距離を求める」「サーボを回転させる」などの
各動作はサブ関数化しており次回紹介します。
(なるべく早く更新するようにします)
こんな感じです。
では、次回はサブ関数を紹介して具体的な動作を見ていきまーす
今回はloop関数について説明していきます。
全体の動作としては以下です。
1)開始スイッチが押されたかをチェックする
2)押されたらwhile(1)回り以下を検出するまで進む
2-1)停止スイッチが押されたか
2-2)前方に障害物を発見したか
3)前方に障害物を発見したら以下を行う
4)モータを止めて右と左に障害物があるかチェック
5)障害物がない方向に進む
6)左右両方に障害物がある場合は少し下がる
ただし「距離を求める」「サーボを回転させる」などの
各動作はサブ関数化しており次回紹介します。
(なるべく早く更新するようにします)
void loop() { int Dst_Check=0; // 開始スイッチが押されたら動作を開始する // 開始スイッチが押されたかチェック sw_start = digitalRead(PIN_SW_START); sw_stop = digitalRead(PIN_SW_STOP); if ( sw_start == 1 ) { Serial.println("susumi;ma'-su"); delay(1500); // サーボモータを正面に exec_sensor_servo_ungle(SERVO_UNGLE_FRONT); motor_move(MTR_SET_MODE_GO); // 停止スイッチが押されるまで回る while(1) { Dst_Check=check_sonic_sensor_dst(SENSOR_FRONT_ERROR_DST, 0); if ( Dst_Check == 1 ) { delay(1000); set_next_away(); } // 停止スイッチが押されたかチェック sw_stop = digitalRead(PIN_SW_STOP); if ( sw_stop == 1 ) { // モータを止める motor_move(MTR_SET_MODE_STOP); delay(100); Serial.println("tomari';ma-su"); delay(2000); break; } delay(1000); } } sw_start = 0; sw_stop = 0; delay(1000); }
こんな感じです。
では、次回はサブ関数を紹介して具体的な動作を見ていきまーす
ソース部分作成1 (1-7.ソース:定義とsetup関数) [ロボット制作(tankun-mk1)]
おはようございます
今日からロボット作成のソース部分を紹介していきます。
まずは、定義部分とsetup関数から
最初に定義部分
[define部分]
PIN_XX:Arduinoデジタルピン接続番号の定義です。
MTR_XX:モータの進む、止まる、旋回の定義です。
ここの使い方は追々、説明します。
SERVO_XX:サーボモータの回転角度と回転待ち時間です。
SENSOR_XX:進行方向に障害物があるかのチェック距離(cm)です。
[グローバル変数]
seup関数,loop関数など複数の関数で使用する定義を
ここに書くことで全関数で使用可能になります。
servo_front:サーボモータの定義です。setup関数で初期化を行い、
loop関数で横に向けたりと回転させます。
sw_start,stop:スタート、ストップボタンの定義です。
setup関数はこんな感じです。
[シリアル定義]
いつものシリアル設定です。
[ピン設定]
pinMode関数はArduinoに接続するピンの初期化です。
defineで定義した各変数を使用して初期化します。
[前方のサーボセンサー]
attachで使用するピンを定義し、
exec_sensor_servo_ungle関数は自前定義で、
この関数でサーボを回転させます。
今回は正面の90℃に設定します。
[exec_sensor_servo_ungle関数]
引数で受けた角度でサーボモータを回転させる関数です。
servo_front.writeが回転で、引数で受けた角度を設定します。
回転中に次の処理を行うと動作が不安定になる可能性があるので
delay関数で少し時間待ちを与えて回転が終わるまで待ちます。
今回はこんな感じです。
次回は本処理のloop関数を解説していきまーす。
今日からロボット作成のソース部分を紹介していきます。
まずは、定義部分とsetup関数から
最初に定義部分
// サーボのインクルード #include// 前方の超音波センサー #define PIN_SENSOR_FRONT_ECHO 2 #define PIN_SENSOR_FRONT_TRIG 3 // スタート・ストップスイッチ #define PIN_SW_START 4 #define PIN_SW_STOP 5 // モータ #define PIN_MTR_LEFT_GO 7 #define PIN_MTR_LEFT_BACK 6 #define PIN_MTR_RIGHT_GO 9 #define PIN_MTR_RIGHT_BACK 8 // 前方のサーボ #define PIN_SERVO_FRONT 10 // ---------------------------------------- // 制御コード // ---------------------------------------- #define MTR_SET_MODE_GO 0 #define MTR_SET_MODE_STOP 1 #define MTR_SET_MODE_LEFT 2 #define MTR_SET_MODE_RIGHT 3 #define MTR_SET_MODE_BACK 4 // ---------------------------------------- // サーボ制御 // ---------------------------------------- #define SERVO_UNGLE_FRONT 90 #define SERVO_UNGLE_RIGHT 25 #define SERVO_UNGLE_LEFT 155 #define SERVO_UNGLE_DELAY_TIME 1500 // センサー #define SENSOR_FRONT_ERROR_DST 14 #define SENSOR_SIDE_ERROR_DST 20 // ======================================= // グローバル変数定義 // ======================================= // ---------------------------------------------- // サーボ // ---------------------------------------------- Servo servo_front; // ---------------------------------------------- // スイッチ // ---------------------------------------------- int sw_start,sw_stop;
[define部分]
PIN_XX:Arduinoデジタルピン接続番号の定義です。
MTR_XX:モータの進む、止まる、旋回の定義です。
ここの使い方は追々、説明します。
SERVO_XX:サーボモータの回転角度と回転待ち時間です。
SENSOR_XX:進行方向に障害物があるかのチェック距離(cm)です。
[グローバル変数]
seup関数,loop関数など複数の関数で使用する定義を
ここに書くことで全関数で使用可能になります。
servo_front:サーボモータの定義です。setup関数で初期化を行い、
loop関数で横に向けたりと回転させます。
sw_start,stop:スタート、ストップボタンの定義です。
setup関数はこんな感じです。
void setup() { // ---------------------------------------------- // シリアル設定 // ---------------------------------------------- Serial.begin(9600); Serial.println("Hello!"); // ---------------------------------------------- // ピン設定 // ---------------------------------------------- // スイッチ pinMode( PIN_SW_START, INPUT ); pinMode( PIN_SW_STOP, INPUT ); // モーター pinMode( PIN_MTR_RIGHT_GO, OUTPUT ); pinMode( PIN_MTR_RIGHT_BACK, OUTPUT ); pinMode( PIN_MTR_LEFT_GO, OUTPUT ); pinMode( PIN_MTR_LEFT_BACK, OUTPUT ); // 前方の超音波センサー pinMode( PIN_SENSOR_FRONT_TRIG, OUTPUT); pinMode( PIN_SENSOR_FRONT_ECHO, INPUT); // 前方のサーボセンサー servo_front.attach(PIN_SERVO_FRONT); exec_sensor_servo_ungle(SERVO_UNGLE_FRONT); // スイッチをOFF(LOW)に初期化 sw_start=LOW; sw_stop=LOW; } void exec_sensor_servo_ungle(int ungle) { servo_front.write(ungle); delay(SERVO_UNGLE_DELAY_TIME); return; }
[シリアル定義]
いつものシリアル設定です。
[ピン設定]
pinMode関数はArduinoに接続するピンの初期化です。
defineで定義した各変数を使用して初期化します。
[前方のサーボセンサー]
attachで使用するピンを定義し、
exec_sensor_servo_ungle関数は自前定義で、
この関数でサーボを回転させます。
今回は正面の90℃に設定します。
[exec_sensor_servo_ungle関数]
引数で受けた角度でサーボモータを回転させる関数です。
servo_front.writeが回転で、引数で受けた角度を設定します。
回転中に次の処理を行うと動作が不安定になる可能性があるので
delay関数で少し時間待ちを与えて回転が終わるまで待ちます。
今回はこんな感じです。
次回は本処理のloop関数を解説していきまーす。
局地戦特化型?!マッドリバー・ジャマイカ! [アルコール系]
久しぶりのビール紹介です。
今回は、まず名前が凄いです!!
マッドリバー・ジャマイカ
名前、ラベルデザインともに強烈な個性があります
ネットで見ていると「口当たりが良くて飲み過ぎ注意」とありました。
が、、、個人的な感想としては最初はキリンラガーに近い味なのですが、
後から独特の苦みと香りが。
結構、主張が強く口の中に残ります。
調べてみるとオレンジフレーバーが使用されているらしく、
ホップの苦みと合わさって、この味になっているみたいですね。
この後味が強くて好きな人と嫌いな人がはっきり分かれそうな味かなぁ。
僕はハイネケン、バド、ジントニックといったスッキリ系の
お酒が好きなので今回のビールは少し合いませんでした
逆にラガービール、焼酎やウィスキーなど香りが強いお酒が好きな人、
色んなお酒を飲みなれているベテランドリンカーの人などは
かなりハマる可能性があるのかなーと思います
名前、人を選ぶ味、玄人好みのスパイス、まさに局地戦専用に
ふさわしいビールということで、ビール界のドムトローペンに
位置づけたいと思います。
今回は、まず名前が凄いです!!
マッドリバー・ジャマイカ
名前、ラベルデザインともに強烈な個性があります
ネットで見ていると「口当たりが良くて飲み過ぎ注意」とありました。
が、、、個人的な感想としては最初はキリンラガーに近い味なのですが、
後から独特の苦みと香りが。
結構、主張が強く口の中に残ります。
調べてみるとオレンジフレーバーが使用されているらしく、
ホップの苦みと合わさって、この味になっているみたいですね。
この後味が強くて好きな人と嫌いな人がはっきり分かれそうな味かなぁ。
僕はハイネケン、バド、ジントニックといったスッキリ系の
お酒が好きなので今回のビールは少し合いませんでした
逆にラガービール、焼酎やウィスキーなど香りが強いお酒が好きな人、
色んなお酒を飲みなれているベテランドリンカーの人などは
かなりハマる可能性があるのかなーと思います
名前、人を選ぶ味、玄人好みのスパイス、まさに局地戦専用に
ふさわしいビールということで、ビール界のドムトローペンに
位置づけたいと思います。
電子回路部分作成2 (1-6.回路:音声部分) [ロボット制作(tankun-mk1)]
おはようございます。すみません、完全に放置してました
さて久しぶりにロボット作成していきます。
今回は音声回路部分です。
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
まずは音声合成LSI。
[上段(左から)]
7番目GND:ブレッドボードのGND部分と接続(*1)
9番目VCC:ブレッドボードの3.3V部分と接続
14番目PMOD1:ブレッドボードの3.3V部分と接続
[下段(左から)]
2番目RXD:Arduinoのデジタル1番ピン(TX)
4番目SMOD0:ブレッドボードの3.3V部分と接続
5番目SMOD1:ブレッドボードの3.3V部分と接続
8番目VCC:ブレッドボードの3.3V部分と接続
9番目GND:ブレッドボードのGND部分と接続
*8ー9番:0.1uFのコンデンサ
12番目:47KΩ抵抗でオペアンプとの間の空いている場所へ
そこから0.1uFコンデンサを経由してOPアンプの下段3番へ
14番目PMOD0:ブレッドボードのGND部分と接続
次にOPアンプ。
[下段(左から)]
2番目ーINPUT:3番目から1KΩ抵抗と接続
4番目と接続
3番目+INPUT:音声LSIの下段12番目を参照
4番目GND:ブレッドボードのGNDと接続
[上段(左から)]
3番目Vcc:ブレッドボードの3.3Vと接続
4番目OUTPUT:47uF電解コンデンサを経由して空いてる場所へ接続
その空いている場所からスピーカへ
加えて100pFコンデンサを空いている場所へ接続
*スピーカの、もう片方はGNDと接続してください。
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
こんな感じです。。。ちょっと複雑ですね。
これで回路部分は完成したので、次回はプログラム部分を紹介してきまーす
さて久しぶりにロボット作成していきます。
今回は音声回路部分です。
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
まずは音声合成LSI。
[上段(左から)]
7番目GND:ブレッドボードのGND部分と接続(*1)
9番目VCC:ブレッドボードの3.3V部分と接続
14番目PMOD1:ブレッドボードの3.3V部分と接続
[下段(左から)]
2番目RXD:Arduinoのデジタル1番ピン(TX)
4番目SMOD0:ブレッドボードの3.3V部分と接続
5番目SMOD1:ブレッドボードの3.3V部分と接続
8番目VCC:ブレッドボードの3.3V部分と接続
9番目GND:ブレッドボードのGND部分と接続
*8ー9番:0.1uFのコンデンサ
12番目:47KΩ抵抗でオペアンプとの間の空いている場所へ
そこから0.1uFコンデンサを経由してOPアンプの下段3番へ
14番目PMOD0:ブレッドボードのGND部分と接続
次にOPアンプ。
[下段(左から)]
2番目ーINPUT:3番目から1KΩ抵抗と接続
4番目と接続
3番目+INPUT:音声LSIの下段12番目を参照
4番目GND:ブレッドボードのGNDと接続
[上段(左から)]
3番目Vcc:ブレッドボードの3.3Vと接続
4番目OUTPUT:47uF電解コンデンサを経由して空いてる場所へ接続
その空いている場所からスピーカへ
加えて100pFコンデンサを空いている場所へ接続
*スピーカの、もう片方はGNDと接続してください。
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
こんな感じです。。。ちょっと複雑ですね。
これで回路部分は完成したので、次回はプログラム部分を紹介してきまーす
電子回路部分作成1 (1-5.回路:モータ、スイッチ) [ロボット制作(tankun-mk1)]
おはようございます。
試験終わった~受かるといいなぁ。
さて、更新を完全に怠っていましたが今日から再開です
今日からロボット作成として電子回路部分を作成していきます。
まず先に完成後の回路はこちら
普段は赤い線(Vcc)と黒い線(GND)の部分がブレッドボードの
上下それぞれにあったと思いますが、今回は写真の通り
VccとGNDが片方にしかないタイプを使用します。
また、Vccの部分ですが左と右でわかれているので、
異なる電圧を接続可能となっており、
今回はArduinoから左側に3.3V、右側に5.0Vを接続します。
補足として、a-fの部分が電気的に繋がっていてg-lの部分が繋がっています。
つまりa-fとg-l部分は繋がっていないので別のハードを並べられます。
いきなり全部は難しいので今回は
モーター部分とスイッチ部分からいきますね
まずはモーター部分
左右のキャタピラを別々に制御するのでドライバICを2つ以下で使用します。
ポイントは両ドライバICでVcc,GND部分など電源に関わる部分は
共通化してもまとめても問題ないのでお互いを接続しています。
[上段ドライバIC]
1,2番ピン:Arduinoの6,7番ピンと接続します
3,5番ピン:0.01pFのコンデンサで接続します
4,6,7番ピン:下段ドライバICの4,6,7番ピンと接続します
[下段ドライバIC]
1,2番ピン:Arduinoの8,9番ピンと接続します
3,5番ピン:0.01pFのコンデンサで接続します
4番ピン:ブレッドボードのGND部分と接続します(黒線の部分)
6番ピン:0.1pFでブレッドボードのGND部分と接続します
7番ピン:ブレッドボードのVcc部分と接続します(赤線の部分)
続けてスイッチ部分
写真を参考にボタンをそれぞれVcc,GND(10KΩ経由)に接続します。
また写真の赤枠部分にArduinoのピンと接続します。
青ボタンをArduinoの4番ピン、赤ボタンを5番ピンにします。
今日はここまでです次回は音声部分をやろうかな。
試験終わった~受かるといいなぁ。
さて、更新を完全に怠っていましたが今日から再開です
今日からロボット作成として電子回路部分を作成していきます。
まず先に完成後の回路はこちら
普段は赤い線(Vcc)と黒い線(GND)の部分がブレッドボードの
上下それぞれにあったと思いますが、今回は写真の通り
VccとGNDが片方にしかないタイプを使用します。
また、Vccの部分ですが左と右でわかれているので、
異なる電圧を接続可能となっており、
今回はArduinoから左側に3.3V、右側に5.0Vを接続します。
補足として、a-fの部分が電気的に繋がっていてg-lの部分が繋がっています。
つまりa-fとg-l部分は繋がっていないので別のハードを並べられます。
いきなり全部は難しいので今回は
モーター部分とスイッチ部分からいきますね
まずはモーター部分
左右のキャタピラを別々に制御するのでドライバICを2つ以下で使用します。
ポイントは両ドライバICでVcc,GND部分など電源に関わる部分は
共通化してもまとめても問題ないのでお互いを接続しています。
[上段ドライバIC]
1,2番ピン:Arduinoの6,7番ピンと接続します
3,5番ピン:0.01pFのコンデンサで接続します
4,6,7番ピン:下段ドライバICの4,6,7番ピンと接続します
[下段ドライバIC]
1,2番ピン:Arduinoの8,9番ピンと接続します
3,5番ピン:0.01pFのコンデンサで接続します
4番ピン:ブレッドボードのGND部分と接続します(黒線の部分)
6番ピン:0.1pFでブレッドボードのGND部分と接続します
7番ピン:ブレッドボードのVcc部分と接続します(赤線の部分)
続けてスイッチ部分
写真を参考にボタンをそれぞれVcc,GND(10KΩ経由)に接続します。
また写真の赤枠部分にArduinoのピンと接続します。
青ボタンをArduinoの4番ピン、赤ボタンを5番ピンにします。
今日はここまでです次回は音声部分をやろうかな。
ドラえもんと桜 [その他]
Arduinoで超音波センサを使って距離を測ろう [Arduino入門編]
おはようございます。
今回は超音波センサーという物を使って、
障害物までの距離測定を行います。
使用するのはこちら。HC-SR04という代物です。
超音波センサーは物によって測定できる障害物の距離が異なっていて、
いい物だと2000円ぐらいして遠距離までの障害物を検知できますが、
低価格のものは300円程度で買えて、測定可能距離は3cm~1.5m程度になります。
僕はこの低価格版を3個持っていますが今のところ、
何の不具合もなく使えています
超音波センサーの動作・仕組みですが簡単に書くと以下です。
1)Arduinoからセンサーに指示をだす
2)センサーが前方に超音波を発射
3)超音波は障害物にぶつかると反射して返ってくる
4)センサーは反射して返ってくるまでの時間をArduinoに返す
5)Arduinoはこの時間から障害物までの距離を求める
写真にある「目」みたいなものが
超音波マイクといって、片方から超音波を発射して、
もう片方の「目」から反射した超音波を受信します。
超音波って聞くと危険な気がしますが人体には何の影響もないのでご安心を
それでは実際の使い方です。接続はこちら
1)センサーのVCCをArduinoの5Vに接続
2)センサーのGNDをArduinoのGNDに接続
3)センサーのTrig,EchoをArduinoのデジタルピンに接続
ソースはこちらです
1) 超音波センサー初期化
TRIGピンがセンサに超音波を発射させるために使用します。
なので出力のOUTPUTを指定します。
ECHOがセンサから超音波の反射時間を取得します。
なのでINPUTを指定します。
2) センサーに超音波の発射指示
TRIGピンをHIGH->LOWとすると超音波が発射されます。
3) 超音波の跳ね返り時間を取得
pulseIn関数は、指定したピンがHIGHの時間を返してくれます
ECHOピンはTRIGピン側で発射した超音波が跳ね返りを受信して、
その期間だけHIGHになります。
つまりpulseIn関数でECHOピンを指定すれば超音波を発射して、
跳ね返るまでの時間を取得できることになります。
4) 距離をcmに変換
取得出来た時間は往復時間なので、まずは片道の半分にします。
pulseIN関数で取得できるのはマイクロ秒なので、
cm/secに変換します。
障害物までの距離が測定できるようになりました
これでロボット作成に必要な最低限の説明が完了です。
そこで次回からは中途半端になっていたロボット作成を
ついに再開します。。。実はもう作ってあるので更新は早くできるはず。
春の情報処理試験を受けるので、最近更新が遅くてすみません
今回は超音波センサーという物を使って、
障害物までの距離測定を行います。
使用するのはこちら。HC-SR04という代物です。
超音波センサーは物によって測定できる障害物の距離が異なっていて、
いい物だと2000円ぐらいして遠距離までの障害物を検知できますが、
低価格のものは300円程度で買えて、測定可能距離は3cm~1.5m程度になります。
僕はこの低価格版を3個持っていますが今のところ、
何の不具合もなく使えています
超音波センサーの動作・仕組みですが簡単に書くと以下です。
1)Arduinoからセンサーに指示をだす
2)センサーが前方に超音波を発射
3)超音波は障害物にぶつかると反射して返ってくる
4)センサーは反射して返ってくるまでの時間をArduinoに返す
5)Arduinoはこの時間から障害物までの距離を求める
写真にある「目」みたいなものが
超音波マイクといって、片方から超音波を発射して、
もう片方の「目」から反射した超音波を受信します。
超音波って聞くと危険な気がしますが人体には何の影響もないのでご安心を
それでは実際の使い方です。接続はこちら
1)センサーのVCCをArduinoの5Vに接続
2)センサーのGNDをArduinoのGNDに接続
3)センサーのTrig,EchoをArduinoのデジタルピンに接続
ソースはこちらです
// 前方の超音波センサー #define PIN_SENSOR_FRONT_TRIG 3 #define PIN_SENSOR_FRONT_ECHO 4 void setup() { Serial.begin(9600); // 1) 超音波センサー初期化 pinMode( PIN_SENSOR_FRONT_TRIG, OUTPUT); pinMode( PIN_SENSOR_FRONT_ECHO, INPUT); } void loop() { int Duration; float Distance; // 2) センサーに超音波の発射指示 digitalWrite( PIN_SENSOR_FRONT_TRIG, LOW ); delayMicroseconds(1); digitalWrite( PIN_SENSOR_FRONT_TRIG, HIGH ); delayMicroseconds(1); digitalWrite( PIN_SENSOR_FRONT_TRIG, LOW ); // 3) 超音波の跳ね返り時間を取得 Duration = pulseIn( PIN_SENSOR_FRONT_ECHO, HIGH ); if( Duration > 0 ) { // 4) 距離をcmに変換(音速を340m/sとする) Distance = Duration /2; Distance = Distance*340*100/1000000; // 距離を出力 Serial.println("kyori ha:"); Serial.print(Distance:); Serial.println("cm dayo"); } delay(1500); }
1) 超音波センサー初期化
TRIGピンがセンサに超音波を発射させるために使用します。
なので出力のOUTPUTを指定します。
ECHOがセンサから超音波の反射時間を取得します。
なのでINPUTを指定します。
2) センサーに超音波の発射指示
TRIGピンをHIGH->LOWとすると超音波が発射されます。
3) 超音波の跳ね返り時間を取得
pulseIn関数は、指定したピンがHIGHの時間を返してくれます
ECHOピンはTRIGピン側で発射した超音波が跳ね返りを受信して、
その期間だけHIGHになります。
つまりpulseIn関数でECHOピンを指定すれば超音波を発射して、
跳ね返るまでの時間を取得できることになります。
4) 距離をcmに変換
取得出来た時間は往復時間なので、まずは片道の半分にします。
pulseIN関数で取得できるのはマイクロ秒なので、
cm/secに変換します。
障害物までの距離が測定できるようになりました
これでロボット作成に必要な最低限の説明が完了です。
そこで次回からは中途半端になっていたロボット作成を
ついに再開します。。。実はもう作ってあるので更新は早くできるはず。
春の情報処理試験を受けるので、最近更新が遅くてすみません
果肉のむき出し感がメタス?!ミスティック•ラドラー [アルコール系]
こんちには。
先日、また変わったビールを飲みました。
ベルギー産のミスティック•ラドラーというビールです
こちら。
そう、レモンが入ったフルーツビールです。
まずグラスに注ぐとレモノの皮?果肉?!も混ざっていました。
ジューシーさ倍増ですね。。。たぶん。
見た目は普段のビールより黄色が強くて綺麗でした
味ですが、、、予想通りビール感は、かなり弱くて、
シャンディーガフをジンジャーエールじゃなくて、
キリンレモンで作った感じが近いかもしれません。
ビールが少し苦手な人もコレは飲みやすいと思います。
とてもフルーティーですが、食材を選ぶのではと思います。
ピザやハンバーガーなど少しヘビーな洋食を食べる時に、
一緒に飲むとスッキリできていいかなと思いました。
間違っても日本食や中華料理には合わせない事をススメます。
自分がやらかしました
この日の夕飯はガッツリ日本食で、これを飲んだ後に足りなくて
普通に日本のビールを飲みました。
自分がよくいくお店にフルーツビールとしは
「青りんご」「ライム」がありました。
こちらも気になるので近々、飲んでみようと思います
先日、また変わったビールを飲みました。
ベルギー産のミスティック•ラドラーというビールです
こちら。
そう、レモンが入ったフルーツビールです。
まずグラスに注ぐとレモノの皮?果肉?!も混ざっていました。
ジューシーさ倍増ですね。。。たぶん。
見た目は普段のビールより黄色が強くて綺麗でした
味ですが、、、予想通りビール感は、かなり弱くて、
シャンディーガフをジンジャーエールじゃなくて、
キリンレモンで作った感じが近いかもしれません。
ビールが少し苦手な人もコレは飲みやすいと思います。
とてもフルーティーですが、食材を選ぶのではと思います。
ピザやハンバーガーなど少しヘビーな洋食を食べる時に、
一緒に飲むとスッキリできていいかなと思いました。
間違っても日本食や中華料理には合わせない事をススメます。
自分がやらかしました
この日の夕飯はガッツリ日本食で、これを飲んだ後に足りなくて
普通に日本のビールを飲みました。
自分がよくいくお店にフルーツビールとしは
「青りんご」「ライム」がありました。
こちらも気になるので近々、飲んでみようと思います
Arduinoでサーボモータを使って見よう [Arduino入門編]
こんばんは~
最近はガンプラやビールの紹介ばかりだったので、
久しぶりに真面目に書きます。
今回は「サーボモータ」の制御です。
サーボモータとはコレです。
普通のモータはArduinoから電気を流すと高速で回り続けると思います。
それに対してサーボモータは普通のモータとは違って、
Arduino側から角度を指定して動作させます。
文章ではわかりづらいと思うので写真を使って説明。
まずサーボモータは基本的にはサーボホーンというものを取り付けて使います。
下の写真にある十字架みたいなものがそれです。
この状態からサーボモータに45°と命令を出すと以下のように
指定角度まで回転して止まります。
このように自分な好きな角度に移動させて止められるので、
ロボットの各関節やセンサーの向きを変えるのに使用されます。
それでは実際に使っていきます。
Arduinoへの接続は以下です。
サーボモータの配線はJRCタイプとフタバタイプという2つがあるのですが、
色で判断して以下でつなぎます。
赤(VCC):Arduinoの5.0Vへ
黒or茶色(GND):ArduinoのGNDへ
白or橙:Arduinoのデジタルピンへ
ソース説明とサンプルは以下です。
1.ライブラリインクルードと変数定義
Arduinoではサーボモータを簡単に使用できるように、
専用のライブラリが用意されています。
そこで「Servo.h 」と書いてをインクルードし、
変数名を「Servo」でグローバル域にサーボメンバを定義します。
2.初期化
次にsetup()関数でattachというライブラリを使って、
サーボを初期化します。これでサーボモーターが使用可能になります。
ライブラリの引数には自分が接続したArduinoのピン番号を指定します。
3.サーボモータの制御
後はwrite関数をコールする事で好きな角度に
サーボモーターを回す事ができます。
4.注意点1:角度
サーボに指定する角度ですが分度器をイメージしてください。
つまり正面は90°、左は0°、右は180°となります。
正面が0°と勘違いしやすいの注意です。
5.注意2:角度指定後のdelay()
サーボに角度を指定して回転させた後は少しdelayを入れましょう。
これは完全に指定角度に移動させるため待ち時間です。
これでサーボモーターが制御できるようになりました
僕が作るロボットでは今のところ正面につける超音波センサーから
距離を求める時に使用します。
この流れで次回は超音波センサーの使い方を説明していきたいと思います
最近はガンプラやビールの紹介ばかりだったので、
久しぶりに真面目に書きます。
今回は「サーボモータ」の制御です。
サーボモータとはコレです。
普通のモータはArduinoから電気を流すと高速で回り続けると思います。
それに対してサーボモータは普通のモータとは違って、
Arduino側から角度を指定して動作させます。
文章ではわかりづらいと思うので写真を使って説明。
まずサーボモータは基本的にはサーボホーンというものを取り付けて使います。
下の写真にある十字架みたいなものがそれです。
この状態からサーボモータに45°と命令を出すと以下のように
指定角度まで回転して止まります。
このように自分な好きな角度に移動させて止められるので、
ロボットの各関節やセンサーの向きを変えるのに使用されます。
それでは実際に使っていきます。
Arduinoへの接続は以下です。
サーボモータの配線はJRCタイプとフタバタイプという2つがあるのですが、
色で判断して以下でつなぎます。
赤(VCC):Arduinoの5.0Vへ
黒or茶色(GND):ArduinoのGNDへ
白or橙:Arduinoのデジタルピンへ
ソース説明とサンプルは以下です。
1.ライブラリインクルードと変数定義
Arduinoではサーボモータを簡単に使用できるように、
専用のライブラリが用意されています。
そこで「Servo.h 」と書いてをインクルードし、
変数名を「Servo」でグローバル域にサーボメンバを定義します。
2.初期化
次にsetup()関数でattachというライブラリを使って、
サーボを初期化します。これでサーボモーターが使用可能になります。
ライブラリの引数には自分が接続したArduinoのピン番号を指定します。
3.サーボモータの制御
後はwrite関数をコールする事で好きな角度に
サーボモーターを回す事ができます。
4.注意点1:角度
サーボに指定する角度ですが分度器をイメージしてください。
つまり正面は90°、左は0°、右は180°となります。
正面が0°と勘違いしやすいの注意です。
5.注意2:角度指定後のdelay()
サーボに角度を指定して回転させた後は少しdelayを入れましょう。
これは完全に指定角度に移動させるため待ち時間です。
#include// サーボ変数をグローバルに定義 Servo servo; void setup() { // デジタル5番ピンにサーボを接続し初期配置 servo.attach(5); servo.write(90); delay(1000); } void loop() { // サーボの角度を10°->170°->90°へと順に移動 servo.write(10); delay(1500); servo.write(170); delay(1500); servo.write(90); delay(1500); }
これでサーボモーターが制御できるようになりました
僕が作るロボットでは今のところ正面につける超音波センサーから
距離を求める時に使用します。
この流れで次回は超音波センサーの使い方を説明していきたいと思います
前の10件 | -