ホーム | 電子工作 | 腕ロボット | 二足歩行ロボット | 無線コントローラ | 工作機械 | 動画 | 自作ソフト | Web作成 | テキスト | その他 |
台車ロボットの製作(2009年1月〜5月) |
台車とかの材料をどうしようか? |
基本的なことはわかったつもりなので、今度は台車ロボットに挑戦した。 台車ロボットとは、台車にマイコンを載せて、モーター、センサーをつけ、障害物にぶつかりそうになると向きを変えてまた動き出す。 というようなものをイメージしてとりかかった。 さて、台車に何を使おうか? 車はどこから調達? モーターはどんなものを? センサーはどんなん? 問題点は山積みです。 これらの台車・車とかはネットで調べていくと、タミヤ模型のおもちゃ素材が使えることがわかった。今度はどこで購入しようか? ということになります ネットで調べていくと、上新電機のWebサイトで買えることがわかった。そこで近所の上新電機に入ってみると、上新電機のキッズランド にいろんなおもちゃの素材が並べてあった。 感動! |
H8(3052)の基盤が大きすぎる |
![]() かなりあとになってわかるのですが、このIOボードは学習用ボードであるために大きいのであって、CPUボード正味の大きさは名刺大の 大きさであるということです。IOボードさえ自前で何とかできればこのCPUのほうがいいわけです。 写真の大きいボード(IOボード)の上に載っているのがCPUボードです。悲しいかな電子工作を始めた初心者ですのでこん なことはわかるはずもありません。H8(3052)は大きすぎる! ほかの小さなものに換えよう! ということで先に突き進みます。 |
H8タイニー(3664)に換える |
![]() ほかに電池も必要です。 秋月電子のネットで調べるとH8タイニーというマイコンボードがありました。このサイズの小さいことにほれて CPUをこれに換えました。 H8タイニーという名前だけに非常に小さいでした。IOボード込みで50mm×70mmほどの大きさです。左の写真がそれで、写真の右のものが CPUボードのみのものです。CPUボードのみだとさらに小さくなります。 このキットを組み立てて、LED・センサー・モータードライブIC・モータをつなげていくことになります。 |
H8タイニー(3664)のIOポート |
中央の四角いものがそのCPUボードす。コネクタがCN1とCN2の2つあります。それぞれにピンが26個あります。 この図の下にポートの番号とそのポートがあるコネクタの対応をまとめています。 ポートは1,2,5,7,8と5つありますが、8ピンフルに使えるのは5と8だけなので ポート5とポート8を使います。 ポート5をモーター制御に、ポート8をLED制御に使うことにします。 |
LEDを光らす |
![]() 右の写真の真ん中の基板がH8タイニーのIOボードで、その上にH8(3664)のCPUボードが 載っています。 センサーを前右用と前左用と2つつける予定です。 前右方向との障害物との距離、前左方向との障害物との距離によって異なるLEDを光らそう、と思うのでそれように別々 のボードに5個ずつLEDをつけました。 右写真がその点灯実験のためのものです。下のC言語プログラムによって左右のLEDを順番に光らすことができます。 |
次が点灯実験のためのC言語プログラムです。 ポート8をLEDのための出力ポートに使っています。 ポート8は8ピンありますので、合計8個のLEDを制御できます。 写真を見ればわかるように、前左・前右用にそれぞれ5つLEDを使っています。 前左用がポート8の0ビット目から3ビット目まで、前右用が4ビット目から7ビット目まで。 左用も右用も最後のビット(ピン)をLED4個目・5個目の両方につなげています。 main()関数の中のdata1[]というバッファで光るLEDを決めています。 次に与えているデータと光るLEDとの関係が良くわかるように、16進データをビット展開しておきます。 0x01: 0000 0001 0ビット目に対応したLEDが光る 0x02: 0000 0010 1ビット目に対応したLEDが光る 0x04: 0000 0100 2ビット目に対応したLEDが光る 0x08: 0000 1000 3ビット目に対応したLEDが光る 3ビット目のものからは2つのLEDにつなげています。 以上が前左のLEDのためのものです。 0x10: 0001 0000 4ビット目に対応したLEDが光る 0x20: 0010 0000 5ビット目に対応したLEDが光る 0x40: 0100 0000 6ビット目に対応したLEDが光る 0x80: 1000 0000 7ビット目に対応したLEDが光る 7ビット目のものからは2つのLEDにつなげています。 以上が前右のLEDのためのものです。 ひとつのLEDが光ってすぐに次のLEDが光るようにすると、点滅が速過ぎて人間の目にはどのLEDが光っているか良くわかりません。 そこでひとつのLEDが光って次のLEDが光るまでに待ち時間を入れます。 その待ち時間の関数がwait関数です。プログラムでその待ち時間を作っています。 |
距離センサー(GP2D12) |
![]() ![]() 左のような形をしています。 目玉が2つついています。一方の目玉から赤外線を発射して障害物からの反射をもう一方の目玉で受けます。 ![]() 障害物との距離の多少によって@につなげた線からの出力電圧が変化します。 それの入出力特性曲線が左の図です。 横軸が障害物との距離、縦軸が出力電圧です。 障害物との距離が8cmから10cmのときに、出力ピーク電圧が出ます。 このために、センサーと障害物との距離が8cmから10cmぐらいになるようにこのセンサーの取り付け位置を考える必要があります。 あるいはプログラムでこのあたりを調整します。 |
AD変換機能 |
距離センサーGP2D12の出力は電圧です。障害物との距離に応じてアナログである0.4Vから2.6Vまでの電圧を出力します。 ところがマイコンで処理ができるのはデジタルである数値です。 そこでアナログである電圧からデジタルである数値に変換することが必要です。 幸いにもH8(3664)にはこのアナログからデジタルに変換する機能であるAD変換機能が付属しています。 この機能を使って距離センサーGP2D12からの出力電圧を数値に変換します。 H8(3664)のIOポートを見ますと、CN1の3〜10までのピンがAD変換に使うことができるピンです。 センサーは前左用と前右用の2個使っていますので、AD変換するピンも2つ必要ですのでAN0とAN1、 ピンではCN1のピン10とCN2のピン9を使います。 回路的には前左用センサーの信号出力コネクタををCN1のピン10に、前右用のセンサーの信号出力コネクタををCN1のピン9 につなげます。 そのあとはプログラムで処理します。 |
距離センサーとLED |
距離センサーで障害物との距離を測り、障害物との距離に応じて光らすLEDを変えます。 回路的にはセンサーについてはすでに説明しています。 LEDの接続は、前にやったLED実験とまったく同じにします。 つまり、前左用にはポート8の0ビット目から3ビット目までの4ピン、CN2の9から12です。 前右用にはポート8の4ビット目から7ビットまでの4ピン、CN2の13から16です。 このためのプログラムを次に出します。 このプログラムでは、ポート5を出力に設定してます。ポート5はモータ制御のために使っています。これについては後で詳しく述べます。 |
10ms間隔で障害物との距離を監視することにします。 main関数のwhile(1)までがタイマー機能とAD変換機能を使うための準備です。 AD変換機能の精度は10ビットです。 これを0から255までの数値に粗く落とします。 このためのコードがAD.DRA>>8、AD.DRB>>8です。 x0 = AD.DRA>>8 x1 = AD.DRB>>8 により前左方向の障害物との距離と前右方向の障害物との距離が0〜255に変換されてそれぞれx0とx1に格納されます。 最初に前左方向の障害物との距離に当たる数値によってどのLEDを光らすかという数値をy8に格納し、次に前右方向の障害物との距離に当たる数値 からどのLEDを光らすかの数値とビット的にOR処理をすることにより、ポート8のすべてのLEDにあたる数値をバイトデータで与えています。 |
モータとモータ制御 |
![]() ![]() DCモータは端子が2個ありその2つの端子に電池のプラスとマイナスの端子をつけると回転します。プラスとマイナスを逆につけると逆に回転します。 ということは台車につけると前方向に進み、逆回転で後ろ方向に進みます。 しかし、この端子を逆に付ける、ということを手動でするのは現実的ではありません。 ![]() 本を読むと最もよく使われていたのがTA7291Pです。よくわかりませんでしたが、安価(2個で¥300)なのでこれを使いました。 TA7291Pの端子は全部で10個あります。左の表を見てもらいますと、1から10までの端子番号についての説明があります。 端子番号3と9はNCといって使用しません。1番から10番までが端子がありますが、右上の図で10個のピンでどちらから数えて1番2番 かというと、向かって左側から(切り欠きのある方)1番と数える。 一般的にはVs=Vrefにします。 VCCにはマイコンからの5V出力ピンをつなぎます。 VS、Vrefには安定した電圧をかけたいので外部電源からの電圧をつなぎます。モータドライバICの内部ではゲートを1つ通ります。 ひとつ通るたびに1Vの電圧効果がありますので1Vの電圧効果があるとして3.5Vの電圧をかければよいと考えて4.5V(電池3個) の電池につなぎます。 ![]() モータドライバICの5、6番ピンが信号入力端子IN1,IN2になっています。 このIN1、IN2にH8(3664)からの制御信号を流します。 制御信号を流すためのポートとしてポート5を使います。 IN1,IN2につなぐと、IN1(ポート5のピン0)に1、IN2(ポート5のピン1)に0 を流すと正転(前進)、IN1に0、IN2に1を流すと逆転(後進)します。 左図はTA7291Pのメーカーの取説に載っているものですが、回路の基本的な接続方法です。 TA7291Pひとつでモータ1個分、つまり車輪ひとつ分です。 実際には車輪は2個ありますのでこの組み合わせが2組いるわけです。 そこで、ポート5のピン0とピン1を左車輪用の信号を流し、ポート5のピン2とピン3を右車輪用の信号を流すことにします。 TA7291Pの入力信号はIN1=1、IN2=0で前進ですので、 左車輪の前進はP50=1,P51=0、右車輪の前進はP52=1、P53=0になります。 台車全体を考えると、前進は左車輪も右車輪もともに前進なのでP50=1、p51=0,P52=1,P52=0。 このようにポート5の下位4ビットを車輪の制御のために使います。上位4ビットは使いませんので常に0にしておきます。 すると前進させるためには、ポート5に対して0000 0101、16進数で考えると0x05を与えればいいことになります。 同じように考えて停止(ブレーキ)させるには、0000 1111 16進数では0x0Fを与えます。 右のほうに後進させる時は、左車輪を後進(P50=0、P51=1)、右車輪を停止(P52=0、P53=0)させればいいですので、 0000 0010 16進数では0x02を与えます。 |
次は完成させた台車のためのC言語プログラムです。 3664のタイマー機能により10ms毎に距離センサーからの信号電圧を監視して、その電圧の多少によってLEDと車輪を制御しています。 変数modeを1(前進)、2(停止)、3(右後進)と考え、modeの初期値を1(前進)にします。 変数moveflagの値を0(進行方向に変化なし)と1(進行方向に変化あり)の値を考えて、前左の障害物との距離、前右との障害物との距離によって 障害物との距離が小さくなった時はmoveflagの値を1にして、modeの値を変化させてそのmodeの値によって次の動きを決めています。 |
出来上がった台車ロボット |
![]() ![]() なぜ、クマさんなのか! というと台車のどっちが前・後かを判別つかないかが最も大きな理由です。 よく見てもらうとわかるのですが、距離センサーを2つつけています。ひとつは前左の障害物の検出、もうひとつは前右の障害物の検出に使っています。 台車の前後にLEDを5つずつつけています。前左との障害物との距離、前右との障害物との距離によって光るLEDを変化させています。 ![]() ![]() |