SSブログ
Arduino入門編 ブログトップ

Arduinoで超音波センサを使って距離を測ろう [Arduino入門編]

おはようございます。

今回は超音波センサーという物を使って、
障害物までの距離測定を行います。

使用するのはこちら。HC-SR04という代物です。
P1060306.jpg

超音波センサーは物によって測定できる障害物の距離が異なっていて、
いい物だと2000円ぐらいして遠距離までの障害物を検知できますが、
低価格のものは300円程度で買えて、測定可能距離は3cm~1.5m程度になります。

僕はこの低価格版を3個持っていますが今のところ、
何の不具合もなく使えています[手(チョキ)]

超音波センサーの動作・仕組みですが簡単に書くと以下です。
 1)Arduinoからセンサーに指示をだす
 2)センサーが前方に超音波を発射
 3)超音波は障害物にぶつかると反射して返ってくる
 4)センサーは反射して返ってくるまでの時間をArduinoに返す
 5)Arduinoはこの時間から障害物までの距離を求める

写真にある「目」みたいなものが
超音波マイクといって、片方から超音波を発射して、
もう片方の「目」から反射した超音波を受信します。

超音波って聞くと危険な気がしますが人体には何の影響もないのでご安心を[ドコモ提供]

それでは実際の使い方です。接続はこちら
sonic_sensor.jpg

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に変換します。

障害物までの距離が測定できるようになりました[exclamation×2]
これでロボット作成に必要な最低限の説明が完了です。

そこで次回からは中途半端になっていたロボット作成
ついに再開します。。。実はもう作ってあるので更新は早くできるはず。

春の情報処理試験を受けるので、最近更新が遅くてすみません[もうやだ~(悲しい顔)]

Arduinoでサーボモータを使って見よう [Arduino入門編]

こんばんは~
最近はガンプラやビールの紹介ばかりだったので、
久しぶりに真面目に書きます。

今回は「サーボモータ」の制御です。
サーボモータとはコレです。
servo.jpg

普通のモータはArduinoから電気を流すと高速で回り続けると思います。
それに対してサーボモータは普通のモータとは違って、
Arduino側から角度を指定して動作させます。

文章ではわかりづらいと思うので写真を使って説明。

まずサーボモータは基本的にはサーボホーンというものを取り付けて使います。
下の写真にある十字架みたいなものがそれです。
servo_ungle1.jpg

この状態からサーボモータに45°と命令を出すと以下のように
指定角度まで回転して止まります。
servo_ungle.jpg

このように自分な好きな角度に移動させて止められるので、
ロボットの各関節やセンサーの向きを変えるのに使用されます。

それでは実際に使っていきます。
Arduinoへの接続は以下です。

servo_kairo.jpg

サーボモータの配線は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);
}



これでサーボモーターが制御できるようになりました[exclamation×2]
僕が作るロボットでは今のところ正面につける超音波センサーから
距離を求める時に使用します。

この流れで次回は超音波センサーの使い方を説明していきたいと思います[わーい(嬉しい顔)]



Arduinoでモーターを制御 [Arduino入門編]

おはようございます。すみません、サボってました。。。

今日から再開です☆☆
さて今日はモーターを制御させてみようと思います。
「モーターの制御」とは、Arduinoから以下を制御させる事になります。
 ー 普段はモーターを止めておく
 ー あるタイミングでモーターを前方向に進める
 ー あるタイミングでモーターを後方向に進める

普通にモーターを動かすだけなら何も使わずに接続するだけでいいのですが、
青ボタンが押されたら前進、赤ボタンが押されたら停止など、
タイミングによってモーターを制御する必要がでてきます。

そこで使用するのがモータードライバというチップです。
今回使用したのはTOSHIBA TA7267BPというチップ。
P1060212.jpg

これはArduinoからチップに渡す入力端子が2つついていて、
その2つに渡す信号の組合せでモーターを制御できます。
つまり好きなモーターで動かすキャタピラを前に進めたり、
止めたり、戻したりができるようになるのです♪

ピン配置と使い方は以下です[ひらめき]

 PIN#1,2入力端子
  この2つがモーターの回転方向を制御をする入力端子です。
  この2つをArduinoと接続します。信号と動作の関係は以下です。
   1/1 ブレーキ(モーター停止)
   0/1 正回転でモーターを回す
   1/0 逆回転でモーターを回す
   0/0 ストップ(モーター停止)
 PIN#3/5 出力端子
  この2つをモーターに接続します
 PIN#4 GND
  ArduinoのGND側と接続します
 PIN#6 Vs
  乾電池側の+と接続します
 PIN#7 Vcc
  Arduinoの5Vと接続します

具体的な接続図とサンプルソースはこんな感じ[わーい(嬉しい顔)]
(回路図は使用しているチップの絵が見つからなかったので、
他で代用しました。。。ご了承下さい)

#define PIN_MTR_GO    3
#define PIN_MTR_BACK  4

void setup() {
  pinMode( PIN_MTR_GO, OUTPUT );
  pinMode( PIN_MTR_BACK, OUTPUT );
}

void loop() {
  digitalWrite( PIN_MTR_GO,    HIGH );
  digitalWrite( PIN_MTR_BACK,  HIGH );
  delay(1500);

  digitalWrite( PIN_MTR_GO,    LOW );
  digitalWrite( PIN_MTR_BACK,  HIGH );
  delay(1500);

  digitalWrite( PIN_MTR_GO,    HIGH );
  digitalWrite( PIN_MTR_BACK,  LOW );
  delay(1500);

  digitalWrite( PIN_MTR_GO,    LOW );
  digitalWrite( PIN_MTR_BACK,  LOW );
  delay(1500);
}


motor.jpg

これでモーターが止まったり、右・左それぞれに回転します。
実際のキャタピラロボットではモーターが2つ必要なので、
その辺りの接続・ソースも追々紹介していきまーす。

ATP3011を使ってArduinoを喋らせよう [Arduino入門編]

おはようございます。雪、降ってますね[雪]
さて今日はArudinoを喋らせてみようと思います[るんるん]

使うのはこちら、ATP3011という音声合成LSIです。
P1060169.jpg

このLSIは、Arduinoからメッセージをおくるだけで、
LSIに接続したスピーカーから、そのメッセージが音声として出力されます。
出力はUART,I2C,SPIの3種類をサポートしています。

要はArduinoで「Serial.println("aiueo");」と書くと、
「あいうえお」と喋るのです[手(チョキ)]
しかも1個850円。これでロボットが喋ると考えると凄いです[exclamation×2]

さて、配線です。見ての通りピンがメチャクチャ多いです。
ただし使うのは以下のみで番号は左からです。

[下段]
2番目 RX
 音声の受信ピンです。ArduinoのTX(送信)と接続すると送受信が成立して、
 Arduinoが送ったメッセージが受信できます

4番目 SMOD#0 / 5番目SMOD#1
 通信モードでArduinoから、どの形式でメッセージを送るかを制御します。
 モードは以下で1だと5V、0だとGNDに接続します。
  「S#0=1 / S#1=1でUART」「S#0=0 / S#1=1でI2C」
  「S#0=1 / S#1=0 か S#0=0 / S#1=0でSPI」となります。
 Serial.println("");を喋らすときはUARTモードになるので両方5Vに接続します

7,8番目 VCC/GND
 7がVCCで8がGNDです。今回、VCCには普段の5Vではなく3.3Vを接続します。
 理由ですが5vは他のサーボやセンサーなどで使用しているので、
 同じにすると何かノイズ?が入って動作が不安定になりました。
 抵抗・コンデンサを使って制御すれば大丈夫なんだろうけど
 詳しくないので、他とは別の専用電源として3.3Vを使うことにしました

12番目 AOUT
 音声出力端子でスピーカーに接続します。
 データシートを読むと4KHzのローパスフィルタが追加が必要らしいです。
 この辺りは詳しくないので、とりあえずスキップ。

14番目 PMOD#0、上段14番目 PMOD#1
 動作モードでArduinoからのメッセージを喋らせるか、
 LSI内部の固定メッセージを喋らせるかで以下のモードがあります。
  「P#0=1 / P#1=1で基本:Arduinoからのメッセージで喋る」
  「P#0=0 / P#1=1でセーフ:Arduinoからのメッセージで喋る」
  「P#0=1/ P#1=0でスタンドアロン:LSI内部の固定メッセージを喋る」
  「P#0=0 / P#1=0でデモ:LSI内部のメッセージを確認で喋る」
 となります。
 基本とセーフの違いはセーフの場合、送信ボーレートが9600固定となり、
 Arduinoはデフォルトがボーレート9600固定なのでセーフモードにします。
 こちらも1は5V,0はGNDへの接続になります

配線後の写真がこちら。
P1060172.jpg

これで、「Serial.println("aiueo");」と書くと、
「あいうえお」と喋ってくれます[exclamation×2]
でも、ちょっと音量が小さいですよね?!この辺は次回で~[手(パー)]

Arduinoのソースを書いてみよう2 [Arduino入門編]

おはようございます。

さて、今回はArduinoソースの書き方に関する続きです。
前回if文があって、今後のためな気がしたので[あせあせ(飛び散る汗)]

[defineと関数定義]
#define AAA "aiueo"

void setup() {
}

void loop() {
  delay(1000);
}

[前回の復習]
・#defineは固定の数値、文字列を定義するのに使います。
 僕は主にピン番号を定義する時などに使用します。
 ピン番号を後で変えたくなった時に修正箇所が1箇所ですむから便利[ひらめき]
・setup()はarduinoが動作する時、最初に一回だけ動く関数です
 ここでは主にピン番号の設定やハードウェアの初期化を行います。
・loop()はsetup()完了後にコールされ無限に何度も実行されます。
 この関数がArduinoのメインになり、ハードウェアの制御や状態確認を行います。
・delay()は引数に入れた値分だけ時間待ちを行い1000=1秒です

[ピンの操作]
  
  // ハードウェアから値を読み取りたい場合
  pinMode(11, INPUT);
  digitalRead(11);

  // ハードウェアに値を設定したい場合
  pinMode(12 OUTPUT);
  digitalWrite(12,HIGH);

[pinMode]
・ハードウェアを制御する場合、最初に書く関数です。
 Arduinoに使用するピン番号と、そのピンの使用目的を教えてあげます
 ・第一引数で使用するピン番号をしていして、
 ・第二引数でINPUT(値を読み取る場合設定)かOUTPUT(値を設定したい場合設定)を書きます

[digitalRead,digitalWrite]
・digitalReadは「ボタン」や「センサー」などから値を取得するために使用します。
 この場合、pinModeでINPUTを設定しておく必要があります。

・digitalWriteは「LED」や「モーター」などハードウェアに値を設定するために使用します。
 この場合、pinModeでOUTPUTを設定しておく必要があります。
 また第二引数にはハードウェアに設定する値(HIGH,LOW)を書きます。

[変数定義、if文、関数コール]
  
  int VALUE=0;
  VALUE=digitalRead(11);
  if( VALUE == HIGH ) {
  }else if( VALUE == LOW ) {
  }else {
  }

  if( VALUE != 0 ) {
    my_function(1)
  }else if( VALUE > 10 ) {
    my_function(2)
  }else if( VALUE <= 10 ) {
    my_function(3)
  }else {
  }


void my_function(int MODE) {
}


[変数]
・int VALUE=0;と書いているのが変数宣言です。
 ハードウェアから取得した値など、覚えておきたい内容がある場合、
 上記のように変数を宣言して値を設定しておきます。

上記のように関数に引数を渡す事も可能です。

[if文]
・「ボタンが押されたらモーターを動かす」などハードウェアから取得した値で
 その後の動作を変えたい場合、if文を使用します。

 if文は()の中に比較条件を書きます。
  ==:左辺と右辺の値が同じ
  !=:左辺と右辺の値が異なる
  >=:左辺が右辺以上(=をなくすと超過)
  <=:左辺が右辺以下(=をなくすと未満)
 上記のようにelse ifを使用すことで複数の条件で分岐が可能です。
 どの条件に合致しない場合の処理はelseと書き、その中に書きます。

[関数定義]
・setup()やloop()にあったような関数は自分専用のものも定義可能です。
 上記にあるmy_function()が自分用関数になります。
 関数には引数を渡すことも可能です。
 「モーターの制御回転」「モーターの停止」など
 処理に共通部分がある場合、関数を使用して処理を一箇所にまとめ、
 引数で微妙な違いをif文で切り分けるとソース共通化できて効率的です。
 
長くなりましたがArduinoの基本構文はこんな感じです。

Arduinoでボタンの制御(ポーリング方式編) [Arduino入門編]

おはようございます。

今日はArduinoを使ってボタンの制御を行っていきます。
ボタンの制御方法は以下の2種類があります。
 1)ボタンの状態をArduinoから確認しに行く方法
 2)ボタンが押されたらArduinoに通知してもらう方法

組込み用語としては前者をポーリング方式
後者を割込み方式と言ったりします。

今回は前者のポーリング方式編です。
ポーリング方式はArduino側からハードウェア(今回はボタン)の状態を
定期的に読みに行って適宜状態を確認する方法です。

回路はこんな感じ~
button_sample2.jpg
[ブレッドボード側]
 青ボタン:片方をプラス側、もう片方を抵抗10Kでマイナス側につなぐ
 赤ボタン:片方をプラス側、もう片方を抵抗10Kでマイナス側につなぐ
 LED:マイナス側を抵抗1KΩでマイナス側につなぐ

[Arduino側]
 2番ピン:青ボタンのプラス側につなぐ
 3番ピン:赤ボタンのプラス側につなぐ
 4番ピン:LEDのプラス側につなぐ
 5Vピン:ブレッドボードのプラス側につなぐ
 GNDピン:ブレッドボードのマイナス側につなぐ

ソースコードはこんな感じ
#define PIN_NO_BTN_ON 2
#define PIN_NO_BTN_OFF 3
#define PIN_NO_LED 4

void setup() {
  // 1)ボタンは値を読み込む側なのでINPUTで設定
  pinMode(PIN_NO_BTN_ON, INPUT);
  pinMode(PIN_NO_BTN_OFF, INPUT);

  // 2)LEDは値を書き込む側なのでOUTPUTで設定
  pinMode(PIN_NO_LED, OUTPUT);
}

void loop() {
  // 3)ボタンの値を取得するための変数を宣言
  int btn_on_check=0;
  int btn_off_check=0;

  // 4)赤、青の各ボタンの状態を取得
  btn_on_check=digitalRead(PIN_NO_BTN_ON);
  btn_off_check=digitalRead(PIN_NO_BTN_OFF);

  // 5)青ボタン、赤ボタンのどっちが押された(HIGH)かチェック 
  if( btn_on_check == HIGH ) {
    // 6)青ボタンが押されたらLEDをON(HIGH) 
    digitalWrite(PIN_NO_LED, HIGH);
  }else if( btn_off_check == HIGH ) {
 // 7)赤ボタンが押されたらLEDをOFF(LOW)
    digitalWrite(PIN_NO_LED, LOW);
  }
  delay(50);
}


今回はsetup()でピンの設定をINPUT,OUTPUTの両方を使用しました。

[値の読み込み方法]
コメントの1)でボタンなどの値を読み込む側はINPUTを設定しています。
コメントの4)でdigitalRead関数を使ってINPUTに設定した
ピンから接続先ハードウェアの状態を取得しています。
digitalWriteと違って書き込む値がないので引数は読み込むピン番号のみです。

[値の判定方法]
コメントの5)で青・赤ボタンの状態をチェックしています。
チェックにはif文という構文を使います。
基本構文に関してはまた別の機会に紹介しますね[バッド(下向き矢印)]

これでloop()関数にて毎回、青・赤ボタンの状態をチェックしにいき、
状態に応じてLEDの点灯・消灯を行います。
これがポーリング方式でしたぁ~[わーい(嬉しい顔)]

次回は割込み方式でボタンを制御してみたいと思います[手(グー)]

Arduinoのソースを書いてみよう1 [Arduino入門編]

おはようございます。
では、前回のサンプルをベースにソースの書き方を[手(チョキ)]

その前にArduinoでハードウェアを制御するまでの大まかな流れは以下です
 1)制御するArduinoとハードウェアを接続する
 2)Arduinoにハードウェアを接続した事を教える
 3)Arduinoからハードウェアを制御する

まずは配線とソースはこちら
led_sample.jpg

1)制御するArduinoとハードウェアを接続する

「Arduinoでハードウェアを制御する」とはArduinoからハードウェアに電気を流したり、止めたり、命令をだしたりすることになります。
そこでまず人の手で制御したいハードウェアとArduinoを各ピンで接続します。

まず電気はプラス側からマイナス側に流れます。
ハードウェアを制御する場合、電気はArduinoから供給したいので、
Arduinoのプラス側とマイナス側をハードウェアに接続すればいいことになります。

プラス側としてLEDのプラス側をArduinoの13番ピンに接続します。
これでArduinoから「13番ピンに電気を流す」と命令すれば電気が流れLEDが点灯し、「13番ピンに電気を流さない」と命令すれば電気が止まりLEDが消灯します。

マイナス側としてLEDのマイナス側をArduinoのGND(グランド)に制御します。GNDは電気のマイナス側を意味しています。

これでプラスとマイナスが繋がり電気が流れる仕組みが完成しました。
そして、これが電子回路の作成になります[演劇]


2)Arduinoにハードウェアを接続した事を教える
Arduinoでは最初に「void setup(){中身}」を書きます。

#define LED_PIN_NO 13

void setup() {
  // 「13番ピンを使うよ」と宣言
  pinMode(LED_PIN_NO, OUTPUT);
}


これは初期設定用と思って下さい。
Arduinoが起動したらsetup()内の「中身の部分」が最初に一回だけ実行されます。

そこでsetup()の中では初期設定として主に以下を行います。
 1)Arduinoで使用するピンを宣言する
 2)(必要な場合のみ)ハードウェアの初期設定を行う

ここで「13番ピンを使うよ」と宣言すれば、Arduinoで13ピンに電気を流したり、
止めたりできます。宣言は最初に行えばいいのでsetup()で1回のみ行います。

宣言の行い方は以下です。
 1)pinModeという関数をコール
 2)第1引数には制御したいピン番号を設定
 3)第2引数には制御が入力か、出力かを設定

第1引数は数値で13と書けばいいです。
ただし今回はソース冒頭に「#define」を宣言して設定しています。
#defineを使用すると「この変数は値を絶対に変えません」となり、
書き換えはエラーになります。ピン番号は固定なので#defineを使いました。

第2引数は「LEDのようにArduinoから命令をだしたいときはOUTPUT」
「センサーのようにハードウェアから情報を取得したいときはINPUT」と書きます。

3)Arduinoからハードウェアを制御する
void loop() {
  // LED点灯
  digitalWrite(LED_PIN_NO, HIGH);

  // 2秒待つ
  delay(2000);

  // LED消灯
  digitalWrite(LED_PIN_NO, LOW);

   // 2秒待つ
 delay(2000);
}


次にvoid loop()です。
これはループの名の通り無限に繰り返される処理部分となります。
Arduinoではloop()を繰り返し処理を実行する仕組みになっています。
ソースにあるdelay(2000)は2秒待つという時間待ちになります。

ハードウェアの制御ですが以下で行います
 1)電気の流す・止めるはdigitalWrite関数で設定
 2)第1引数には制御するピン番号を設定
 3)第2引数はHIGHで電気が流れ、LOWで電気が止まる

今回は間に2秒の時間待ちを入れてHIGH,LOWと順に宣言しています。
よって「2秒おきにLEDが点灯・消灯を無限に繰り返す」ことになります[ひらめき]

長くなりましたが入門編第1回は終了でーす[わーい(嬉しい顔)]
お疲れ様でしたぁ~[手(パー)]

Arduino入門編 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。