できること

ギリギリの距離で止めよう!Arduinoと距離センサで作るチキンレーサー!(第3回・最終回)

第1回:ギリギリの距離で止めよう!Arduinoと距離センサで作るチキンレーサー!
第2回:ギリギリの距離で止めよう!Arduinoと距離センサで作るチキンレーサー!

 

Arduinoでセンサを動かす電子工作を紹介する本企画。教えてくれるのは、デバプラでも過去に「Arduino電子工作の基本」などを連載してくれた福田和宏さんです!

第2回ではチキンレーサーで利用する電子部品の動作と電子回路全体の作成について説明しました。最終回となる第3回では、筐体とプログラムを作成しチキンレーサーを完成させます。

筐体を作成する

筐体の作成には、第1回で紹介した「円形ロボットシャーシキット」をベースとすることにしました。円形ロボットシャーシキットには、2枚の金属板を使って2層にし、モータと車輪を取り付けることで動く車体を手軽に作れます。

しかし、今回のように2枚の電子基板、電池2個、超音波距離センサ、マイクロスイッチを取り付けるには手狭となります。また、円形ロボットシャーシキットに付属する前輪用のボールキャストではまっすぐ進みづらい上、ちょっとした段差があると進行方向がずれてしまう恐れもあります。

そこで、3Dプリンタを利用し、部品を取り付けるための独自パーツを作り、筐体を作ることにしました。著者は3Dプリンタを利用しましたが、板などを加工して作ることもできますので工夫して作成してみてください。

モータや車輪を取り付け

一番下の層には、左右にそれぞれモータのほかに、第2回で作成したモータ制御用基板を取り付けます。また、前方には3Dプリンタで自作した台で延長し、ミニ四駆用の車輪を前輪として利用しました。さらに、前方の壁にぶつかる部分にはマイクロスイッチを左右に取り付けています。

下層の部品配置

超音波センサと電池を取り付け

モータの上の層には電池を取り付けます。今回は、Arduinoとモータ動作用の電池を別々に用意しました。どちらも9Vの電圧が供給できる006Pを採用しています。チキンレーサーでは壁に衝突するなど衝撃が加わります。このためしっかりと電池を取り付けておかないと、電池の固定が取れてしまいかねません。また、モータは電力を多く利用するため、電池がなくなりやすいです。なくなった場合に交換しやすくするために、3Dプリンタで電池ボックスを用意し、背面から簡単に取り替えられるようにしました。

また、前方には超音波センサを取り付け、壁までの距離を計測できるようにしました。今回利用する超音波センサの「HC-SR04」は2cm以下の計測ができません。このため、超音波センサはチキンレーサーの先頭部分(マイクロスイッチが押される場所)より2cm以上後方に取り付けるようにします。

超音波センサと電池を配置

メイン基板の取り付け

最上部にはメイン基板を取り付けます。電池ボックスの上蓋を3Dプリンタで作成し、その上にメイン基板を取り付けられるようにしました。

メイン基板を配置

筐体が組み上がったら、車輪を取り付け、各電子部品からの配線をメインボードに接続すれば完成です。

配線を接続する

また、コントロール用のスイッチは有線でつなぐようになっているので、数m程度の配線を用意し、スイッチに取り付けておきます。

バンパで衝撃を吸収する

チキンレーサーは、ギリギリに止めるのを失敗すれば壁にぶつかってしまいます。壁にぶつかると本体は衝撃を受けてしまいます。特に今回のような3Dプリンタで出力した部品がある場合は、衝撃が加わることで割れてしまうこともあります。さらに、超音波距離センサの取り付けがズレてしまい、距離を正しく計測できなくなるということも起こりえます。

このため、壁に衝突した衝撃を和らげ、本体が壊れないようにする必要がありますが、チキンレーサーではそのために「バンパ」を利用しています。バンパにはバネが取り付けてあり、壁にぶつかると衝撃を吸収し、本体に影響を及ぼさないようにしています。

今回は3Dプリンタで自作したバンパを使いました。また、バンパには壁に衝突したことを検知するマイクロスイッチを取り付けてあります。バンパに当たったときにスイッチが押されるように取り付けています。

05-2_2

なお、低速で動かす場合には、万が一衝突してしまってもさほど衝撃は強くないためバンパを用意する必要はありません。

プログラムを作成する

筐体ができあがったらプログラムを作成して完成させます。プログラムの主要な構造は以下のようになっています。

06-1_2

各機能を実現するには第1回第2回で説明したそれぞれのパーツを動作する方法をつなぎ合わせることとなります。例えば、走り出してスイッチが押されるか、バンパが押されるかの判断するプログラムは以下のようになっています。

lcddisp.clear();
lcddisp.move( 0x00, 0x00 );
lcddisp.charwrite( "     G  O  !    " );

digitalWrite( MOTOR1_PIN, HIGH );

flag = 0;
while( 1 ){
    if( digitalRead( BUMPER_PIN ) == LOW ){
        flag = 2;
        break;
    }
    if( digitalRead( SW_PIN ) == LOW ){
        flag = 1;
        break;
    }
}

digitalWrite( MOTOR1_PIN, LOW );

1~3行目では、液晶ディスプレイに「G O !」と表示して走り出すことを知らせます。5行目のdigitalWrite()でモータドライバに接続された端子をHIGHにすることでモータを動かし、前進させます。

8行目のwhile()でスイッチが押されるか、バンパのマイクロスイッチが押されるまで永続的に繰り返します。繰り返し中は、スイッチとマイクロスイッチの状態を随時確認しています。

9行目はバンパのスイッチが押された、つまり壁に衝突したかを判断します。digitalReadでマイクロスイッチが接続された端子の状態を確認して、Lowになっていたらマイクロスイッチが押されたと判断します。flag変数を「2」にすることで壁にぶつかったことを記録します。11行目のbreakでwhileの繰り返しから抜けます。

13行目は、スイッチが押された、つまりプレイヤが停止操作したことを判断します。マイクロスイッチの場合同様に、スイッチが接続された端子の状態を確認し、Lowになったら押したと判断します。flag変数に「1」を記録し、breakで繰り返しから抜けます。

繰り返しを抜けたら19行目でモータドライバを接続した端子をLowにして動作を停止させています。

この後、flag変数を確認して処理します。「1」であれば成功したと判断して超音波距離センサーで壁までの距離を計測して液晶ディスプレイに表示します。「2」の場合は液晶ディスプレイに「Fail…」と表示して失敗したことを知らせます。

プログラムの全体は、以下からダウンロードできます。

プログラムをダウンロードする(chickenracer.zip)

他の処理については、ダウンロードしたプログラムを参照ください。Arduino IDEでファイルを開き、Arduino Nanoにプログラムを転送すればチキンレーサーを動作できます。

距離の補正機能も装備

壁との距離を計測する場合には、壁に当たった状態で距離が「0cm」となるようにする必要があります。これには、超音波距離センサで計測した距離から超音波センサとスイッチまでの距離を計算で引くことで求まります。例えば、超音波距離センサとマイクロスイッチまでの距離が3.5cmの場合に、計測した距離が5.1cmならば、壁までの距離は「1.6cm」と求まります。

距離を補正する

しかし、利用しているうちに取り付けがズレてゆき、超音波距離センサとマイクロスイッチまでの距離が変わってしまうことがあります。すると、壁にぶつかっても0cmとならなくなり、成功した際に計測した距離がマイナスで表示されてしまうこともあります。

その都度、プログラムで計算式を書き換えてArduinoに転送するのでは非常に手間がかかります。そこで、距離の補正値を簡単に調節する機能を搭載することとしました。

補正は、チキンレーサーが壁に当たった状態(マイクロスイッチが押された状態)にし、液晶ディスプレイ右下に配置した距離補正スイッチを押します。すると、壁までの距離を計測します。この値を実際の計測値から引くことで正しい距離を求められるようになります。

チキンレーサーを動かす

完成したチキンレーサー

それでは、できあがったチキンレーサーを動かしてみましょう。電源スイッチをオンにすると、液晶ディスプレイに「Chicken Racer」と表示されます。ゲームを楽しむ場合には、有線で接続しておいたコントロールスイッチを押します。すると、LEDでカウントダウンを開始します。

カウントダウンのLEDが緑に点灯したらチキンレーサーが前進を始めます。壁の直前でコントロールスイッチを押してチキンレーサーを止めましょう。

壁にぶつからず停止できれば、液晶ディスプレイに壁までの距離が表示されます。もし、失敗した場合は「Fail…」と表示して失敗を知らせます。ゲーム終了後にバンパのマイクロスイッチを押すとリセットされ、再度ゲームが開始できます。

これで、チキンレーサーが完成となりました。本連載で紹介した電子部品の動かし方や作る工程は他の作品を作る場合にも役立ちますので、ぜひ参考にして、Arduinoを使っていろいろな電子工作にチャレンジしてみてください!

 

 

今回の連載の流れ

第1回:ギリギリの距離で止めよう!Arduinoと距離センサで作るチキンレーサー!
第2回:ギリギリの距離で止めよう!Arduinoと距離センサで作るチキンレーサー!
第3回:ギリギリの距離で止めよう!Arduinoと距離センサで作るチキンレーサー!(今回)

アバター画像

札幌在住のライター。電子工作やパソコン、Linux、スマートフォンなどの記事を執筆。「ラズパイマガジン」や「日経Linux」へ記事の執筆。著書として「これ1冊でできる!ラズベリー・パイ 超入門 」(ソーテック社)、「電子部品ごとの制御を学べる!Arduino 電子工作 実践講座」(ソーテック社)、「Arduino[実用]入門」(技術評論社)など。 現在、ものづくりをしたいメンバーを集めて電子工作を利用した作品などを制作する「サッポロ電子クラフト部」を主催(https://sapporo-elec.com/)。誰でも参加可能ですので、ご参加をお待ちしています。

【動画で解説】ラズパイZeroで小型AIカメラを作ろう!