ホーム | 電子工作 | 腕ロボット | 二足歩行ロボット | 無線コントローラ | 工作機械 | 動画 | 自作ソフト | Web作成 | テキスト | その他 |
二足歩行ロボットの電子工作(2010年12月〜) |
||
PWM波形の考え直し(フリーランニングタイマー)2010年12月 | ||
フリーランニング動作でタイマーを使った方がPWM波形を生成しやすいことが分かりました。 H8の3052のハードウエアマニュアルを読むと自由に読み込み・書き込みが出来る16ビットのタイマーカウンタTCNTがあることがわかりました。 ![]() それを読んでやってみるとうまくフリーランニング動作を使ったPWM波形を生成することが出来ました。 まずカウンタのクロックを選びます。このカウンタクロックはシステムクロックφを分周したクロック(φ/2、φ/4、φ/8)から選択できます。 H8の3052の場合、システムクロックは25MHzなのでカウンタクロックはφ/8を選ぶとΦ/8=25MHz/8=3.125MHz。 1周期は1/3.125MHz。1カウンタごとに1/3.125M秒だけ時間が刻まれることになります。ちょうど3125だけカウンタが過ぎると1Msの時間が 過ぎることになります。 ハードウエアマニュアルにはこう書いてあります。 ITU チャネル0〜4 のカウンタ(TCNT)はリセット直後は、すべてフリーランニングカウンタの設定となっており、 TSTR の対応するビットを1 にセットするとフリーランニングカウンタとしてアップカウント動作を開始します。 TCNT がオーバフロー(H'FFFF→H'0000)するとTSR のOVF フラグが1 にセットされます。 このとき、対応するTIER のOVIE ビットが1 ならば、CPU に割込みを要求します。 TCNT はオーバフロー後、H'0000 から再びアップカウント動作を継続します。 このポート1のビット0からPWM波形を出力するためのフローチャートをこのようなもので、これに従ったソースコードは下のようになります。 インクルードファイル<3048f.h>で定義されているのですがITU0のタイマーカウンタのレジスタは ITU0.TCNT と記述されています。 1行目に #include <3048f.h> と書いておけばこのレジスタをITU0.TCNTで表すことができます。 先ほど書きましたようにこのレジスタは書換・読込が自由にできるレジスタです。
![]() 5V出力し続けている時間を6250にしています。そのあと62500まで待ち時間が0Vです。 すると理論上は2msだけ5Vを出力し、20ms経過するまで0Vが続く ことになります。 確かにその通りの波形が生成されていることがわかります。 |
||
回路図の作成(2011年1月) | ||
![]() サーボが全部で12個あります。これ以外にジャイロセンサ・距離センサ・加速度センサを搭載します。 顔の目・口を光らすためにLEDを3個つけます。 これがそのための回路図です。 回路図にはアース・VCCの線を省いていますので中途半端な感じになっています。 ピッチ軸:前後回転 ロール軸:左右回転 ヨー軸:地面と平行に回転 |
||
電子回路組込み(2011年2月) | ||
![]() ![]() これがその画像です。 この単3電池4個はサーボモータを駆動させるためのものです。 右の画像はこの基板の裏です。この配線にはすごく苦労しました。 ![]() 左の図が胸ボックスと腰ボックスを後ろから見たものです。 上の胸ボックスにはH8(3052)を載せた基盤とCPUを駆動させるための9V電池、 下の腰ボックスには中継コネクタの基盤とサーボ駆動電池があります。 顔に小さい基盤をつけ6ピンコネクタで中継して胸のCPUと顔のLED・距離センサとを結んでいます。 胸の基盤から出ているケーブルはサーボモータ・ジャイロセンサ・加速度センサ、顔のLED・距離センサの ためのものです。 サーボモータ・ジャイロセンサ・加速度センサのためのケーブルは腰の基盤の8ピンコネクタにつながり、 さらにそれぞれの3ピンコネクタを中継してつながります。 加速度センサのためのケーブルは腰の基盤の3ピンコネクタを中継してつなげています。 腰の基盤上の小さい基盤が加速度センサです。 この加速度センサの端子(X,Y,Z軸に対応)3つをH8(3052)のAD変換端子につなぎます。 このためのコネクタがその上のX,Y,Zと書いてある3ピンコネクタです。 |
||
電子回路組込み完了(2011年2月) | ||
下の画像は配線が完了したものです。 自宅の前で撮影したものです。 右も同じロボットですが、背景の奥行きを見せるために後ろの方まで表示させましたのでロボットのみかけの大きさが小さくなっています。 まだプログラムを入れていませんので動きません。 これから12個のモータをどのように動かせばいいのかを考えてプログラムを組みます。 実際に動き出せば嬉しいです。 ![]() ![]() |
||
PCとマイコンとの通信(2011年3月) | ||
「二足歩行ロボット入門」に書かれているように、PCのVisual Basicでアプリを作って
PCからデータをロボットに流してロボットのサーボ位置をきちんとしようとしました。 本の通りにやったのにPCとロボットとの通信が出来ませんでした。 本を再度読み返すと229ページのC言語のロボットプログラムの初期化関数の説明中に 「本来ならここにシリアル・コミュニケーション ・インタフェース機能の初期化もあるべきなのですがモニタデバッガが初期化を済ませてありその通信条件を そのまま使うので省略しました。将来プログラムをモニタから起動するのではなくH8内蔵ROMから独自に 起動する形に書き換えるときは忘れずに追加してください。」 とありました。 本の説明でのWindowsのOSはwindowsXPで僕の使っているPCのOSはwindows7です。本の方では PCのターミナルソフトとしてHtermを使っていますが、windows7ではHtermが省かれていて ありません。 それで僕の方では、ターミナルソフトでのシリアルインタフェースの初期化が出来ていないと気がつきました。 そこで前に書いたRikiyaさんのWEBサイト(http://homepage1.nifty.com/rikiya/index.htm) に書いてあるシリアルインターフェースについての記事を勉強して、初期化の部分をそのまま利用した ところ(通信速度に関するデータはH8のpdfを参照)見事に動きました。 これに力を得て手元にあったマイコンボードを利用して、PC側にVisual Basicで簡単なアプリを作り、 このアプリ上のボタンをクリックすると、マイコンボード上の赤と黄色のLEDを「両方光る、 ![]() ![]() 左がVBで作ったアプリ、右がPCにつながっているマイコンボードです。 マイコンボード上の左上にこのアプリで光らそうとしている二つのLEDです。 ふたつのLEDはポート3の0ビット目と2ビット目につなげています。 画像では「両方光る」のボタンをクリックすることによって赤黄の両方とも光った状態です。 右上のコネクタがシリアル(RS232C)のコネクタでここにケーブルを介してPCのUSBに つながっています。 このケーブルはUSBとシリアルを結ぶケーブルで秋月電子で購入したものです。windows7でもきちんと 動作しています。 |
||
下はマイコン(H8の3052)を動かすためのC言語プログラムです。 ITUの初期化はITU0を初期化するだけでいいのですが、ITU1を削除するのも面倒なので残しています。 シリアル通信初期化の部分はRikiyaさんの方とほぼ同じなのですが、通信速度を19200bpsに設定する、 の行と1ms待つ、の行を少し変えています。 シリアルコミュニケーションの初期化は、譲歩同期式、データ長8ビット、パリティなし、STOPビット1、 通信速度19200bpsでしています。 この設定値はPC側の設定と合わせておく必要がありますが、VBでは通信速度を同じ19200bpsにしただけで 通信できました。通信速度以外の設定値はこの値がPC側のVBの既定値と思います。 VBではこれ以外に、PortNameとReadTimeOutを設定する必要があります。USBにつないでいるのでその都度 PortNameは変化します。僕の場合はCOM3かCOM4でした。 ReadTimeOut(受信時に応答がなければエラーとするまでの時間)は3000(ms)にしました。 通信速度についてH8の電子マニュアルを調べますと、25MHZのH8(3052)の場合、 「シリアルのBRRレジスタの値を9600bps=80,19200bps=40,38400bps=19に設定しなさい」 とありました。 そこで19200bpsに設定したいのでBRRレジスタの値を40にしました。 下から4行目は、信号を受信したら受信確認のために「k」の文字をシリアルに送るための行です。 VBの方では、それを受けて送信を確認しています。 下から3行目は20msの待ち時間です。 つまり20msごとにシリアルインタフェースにVBからの新たな信号が来ていないかを見に行っている わけです。 信号の値(signal)は最初に0にしています。つまり最初はLEDがふたつとも消えた状態になります。
|
||
失敗1(〜2011年6月) | ||
失敗です。 電源、スイッチをONにして、いろいろな数値をサーボに与えてモータの動作確認をしようとしました。 最初の5分くらいはそれらしき動作をするのですが、その後は異常な動きをします。 そこで、サーボに与えている電圧の値を調べました。 サーボに与えるべき電圧は定格で5Vです。 乾電池4個の電圧6Vをサーボに与えています。 「スイッチをONした直後は5V以上をキープしているのですが5分ぐらい経つと3V未満に電圧が下がる」ということがわかりました。 「電池からの電源を切り、再度電池の電源をONにすると、5V以上の電圧を5分ぐらいキープしてそのあと急速に3V未満に 電圧が下がる」ということもわかりました。 ネットに何か情報がないか、いろいろ調べました。 すると「普通の乾電池ではサーボの電源には不向きである。充電池でないとサーボには耐えられない。」ということがわかりました。 そこで、6Vの充電池を購入して再度挑戦です。 しかし結果は前と同じです。 それで「あのロボットの吉野さん」にメールを送り、ご意見を伺いました。 すると「使っているモータ(秋月電子で購入したGWSMICRO/2BBMG/J]が電圧を食いすぎる」というお返事をいただきました。このモータは 小型の割にトルクが強い(5.4kg)ので買ったものです。 また吉野さんのWEBサイトを訪問して、このサイトに書いてあるSRM102というモータを購入しました。 ところがこのモータは前のモータとはサイズが全然違い、かなり大きいのです。 作っているロボットの体の部品はモータに合わせて寸法をとっていますので、出来上がったロボットのサーボをそっくり入れ替える ことはできません。部品はすべて作り直しです。 |
||
二足歩行2号の組立まで(2011年7月〜9月) | ||
1号と作り方はほぼ同じですが異なるところもありますので、異なるところを中心に新たに作成した
ロボット(2号)の制作を紹介いたします。![]() ![]() ![]() 頭につけている目玉みたいなもの、距離センサーなのですが、これをつけるのにすごく苦労しました。 1号では、顔の幅が広かったので、距離センサーを顔にねじで直接くっつけました。 この2号では、顔をスマートにしようとして顔の幅を狭くしました。このことが仇になりました。 このセンサの両側にねじをつける穴があります。顔の幅が狭いためにねじ1本で直接顔につける ことが出来ません。 そこで細長い板を作ってまず距離センサをねじでこの板に取り付けます。 この板を顔に取り付けるために、細長い板の中心部に二つ穴をあけてこの穴にねじを 逆向きに固定します。 普通にねじをつけるだけではねじの頭・ナットが細長い板の表面から出っ張ります。 だから細長い板にあけた穴の両側に面取りをしてねじの頭とナットが板に埋め込まれるようにしました。 板の両端の穴もねじの頭が埋め込まれるように面取りをしています。 真ん中の写真が細長い板にセンサを取り付けた状態、右の写真が細長い板の4つの穴に面取りを した状態です。 ![]() ![]() ![]() 左の写真が胸と腰を後ろから見たものです。 真中が胸、右が腰のボックスです。 胸のボックスにはサーボを動かす信号を発生するためのマイコンが載った基盤があります。 1号では胸のボックスにマイコンを駆動させる電池を置きました。 右の写真を見てもらえばわかりますように、2号ではこれを腰のボックスの後ろ外側に取り付けています。 その分、胸のボックスはすっきりしています。 ![]() ![]() 腰のボックスの左側には、サーボへのケーブル、胸の基盤からのケーブル、スイッチ等が載った基盤を配置しています。 腰のボックスの右側は、内部にサーボを駆動する充電池(6V)、外側に胸のマイコンを 駆動する電池を配置しています。 ![]() ![]() ロボットを道路に置いてみました。 歩かすにはマイコンにそのためのプログラムを転送する必要があります。 歩行プログラムを転送していませんのでまだ動きません。 |
||
二足歩行2号の歩行プログラムの方針(2011年10月) |
||
1.歩行するときの左右の足の軌跡の数値データを実際のmm単位で取る。 2.1のデータをサーボの信号データに変換する。 3.2のデータをサーボに送る。 この手順ですが、具体的には次のようになります。 足の軌跡の数値データ(mm単位)をいかにしてサーボの信号データに変換するか! になりますが・・ 足を前に何mm、上に何mm移動させるには膝の2つのそれぞれサーボが何度回転すればいいかを求めます。 このサーボの回転数をサーボに与えるパルス幅に対応した数値に直します。 こうやって求めたパルス幅に対応した数値データ列をサーボに送ればよいことになります。 文章で書くのはこんなものですが、これがなかなか難しいです。 |
||
二足歩行2号の配線の考え直し(2013年2月〜) |
||
この1年以上ものあいだ、2011年10月に立てた方針に従ってやってきました。 プログラムをいろんな風に試しました。 それらしい動きはするのですが思い通りに動いてくれません。 またやけにモータを動かす電池の減りが早い気がします。 そこで再度、吉野氏の著書「二足歩行ロボットの自作入門」を読み返してみました。 この書物では「モータの3芯コネクタを切断して『信号、電源、アース』の3線に分離して、 信号線は信号線だけの基盤に、電源線、アース線もそれぞれだけが集めた基盤に直結して います。さらに電源線をつなぐ基盤としてを使っています。」 これだけでかなりの電気抵抗を減らせるのでは、と思いました。 3芯コネクタはそのままで、『全面が銅箔の基盤』を使ってやってみようと思います。 |
||
サーボモータの検証機器の制作(2013年3月〜10月) |
||
![]() ![]() 『全面が銅箔の基盤』を使って配線やり直しがほぼ出来た頃、2、3個のサーボモータが 『あれ!』と思うような動きをしました。 そこで、使っていない『H8 3052マイコン』を利用して『サーボ検証器』を作りました。 さらに8極のディップスイッチを取り付けました。下の方の横に長い青いやつです。 デモンストレーションのために手持ちのサーボを右上に取り付けています。別のサーボをテストするときは このサーボのコネクタを外してテストしたいサーボのコネクタを取り付けることになります。 二つの部分に分かれています。左側がマイコン部分、右側がサーボを接続する部分とLED部です。 マイコン部の左上に2極ディップスイッチ(青いやつ)を新たに取り付けました。 このままで通常動作、両方スイッチをON(下に押し下げ)にするとマイコンへの書き込み可となります。 これによってプログラム書き込みが格段と楽になりました。これまでは2本のジャンパピンを挿す ことによりMD2をグラウンドに、FWEを5Vにショートさせてブートモードにしてプログラムを 書き込み、2本のジャンパピンを外して書き込んだプログラムを動作させていました。 ディップスイッチは8個のスイッチを使うことができますので、P2ポートの第0ビットから第7ビット の計8個のピンを使っています。 ディップスイッチの接続は図のようにします。 ![]() これにより、ディップスイッチスイッチONのときはP2の第0ビットの電位が0、 ディップスイッチOFFのときはP2の第0ビットの電位がほぼVCCの電位となります。 つまり、ディップスイッチのON・OFFでP2の第0ビットの電位がLOW・HIGHに 変化します。 この変化をプログラムで利用します。 このようなVCCに介する抵抗をプルアップ抵抗といいます。 ところが、今使っているマイコンのP2,P4,P5はプルアップ抵抗を内蔵していて、 プログラム上でこのプルアップ機能をON・OFF出来ます。 プルアップ抵抗とは、このようなVCC電圧が付属していることがわからなくて、実際の抵抗を つけて試したりして、何日間かを無駄にしました。 ネットで調べてやっとわかりました。 サーボモータの取り付け部の下の黒い所には単4電池4個が入っていますので、サーボの 駆動力は6Vということになります。 マイコンからのPWM波形はP6ポートの第5ピンによって生成して、ケーブルを経由して サーボ取り付け部に送られます。 8極のディップスイッチなので8つの最大8つの機能を持たすことができます。次のような 8つの機能をもたせました。 ディップスイッチの1のON:『基準位置と+90度回転を繰り返し』、 ディップスイッチの2のON:『基準位置と−90度回転を繰り返し』 ディップスイッチの3のON:『+90度と−90度回転を繰り返し』 ![]() 左がその設定画面で、PC側でVisualBasicで作ったものです。 上下二つの部分からなっています。 常時LED部の左端の上から3ツ目が点灯します。これはPC側からの命令を常時モニタリング しているということです。 上部に4つのボタンがあります。それぞれをクリックするたびにそこに表示されている数値に 相当する回転をサーボに与えます。 同時に常時点灯の右の2つのLEDが表示通りに点灯(消灯)します。 下部の上下矢印のボタンをクリックするたびにテキストボックスの 数値が50または200上下します。 好みの数値に設定した後に送信ボタンをクリックすると その数値に対応した角度までサーボモータの羽が回転します。 サーボモータの回転角度の基準位置に対応した数値は「4678(H8 3052 ではそうなります)」、この数値を与えるとPWMのパルス幅が1.5msになります ので理論的にはサーボモータの回転角度が基準位置です。 ディップスイッチの5のON:5×5個のLEDを順番に点灯表示 ディップスイッチの6のON:5×5個のLEDで文字列「CNON」を順次表示 ディップスイッチの7のON:5×5個のLEDで文字列「FOREVER」を順次表示 ディップスイッチの8のON:5×5個のLEDで文字列「LEVEYOU」を順次表示 実はこの『サーボ検証器』を作っているとき、拡張性を考えて8極のディップスイッチをつけ ました。サーボ用に4個の機能を与えて、あと4個の機能を拡張できる可能性が残りました。 そんなとき妻から「LEDは光らへんのん?」と言われました。 そこでポート2つ分の4×4個のLEDをつけて「ランダム点灯」とか試していました。 そんなときまた妻から「アルファベットは?」と言われました。 しかし、4×4個のLEDでは限られたアルファベットしか表示させることはできません。ただ、 5×5個のLEDならかろうじてあらゆるアルファベットを表示させることができる、と思い、 右と下にもう一段LEDを増やすことにしました。 しかし、この「もう一段」が難物でした。合計25個分のLEDの配線、これにはLED1個 について1個の抵抗が必要なのですごい数の、煩雑な配線となります。 そんなわけで挫折しかかった頃、秋月のサイトを何気なく見ていると、抵抗内蔵のLEDが あるではありませんか? これで狭い場所に抵抗を省くことができ、なんとか25個のLEDを付けることができました。 いろいろ調べてみると、この抵抗内蔵のLEDは秋月でしか売っていませんでした。 なんやかんやで出来上がりと思った頃、マイコンが変な動作をします。今まで正常に動作していた ピンが動作しなかったり、そのうち新規に書き込みができなくなりました。 結局、書き込みが許されていた回数を超過したようでした。 2年ぐらい使い、何回も書き込みをするとこのようになるのですね・・・・。 秋月から「H8 3052」のボードのみを新たに買い、交換してやっとできあがりました。 P6ポートの第5bitを使ってサーボを動かすためのPWM波形を出します。 PWMを生成するための待ち時間を2124、7250にすることにより、−90度 と+90度を実現しています。 つまりパルス幅が0.68msでサーボが−90度回り、2.32msでサーボが+90度回転するということになります。 PWM波形の間隔は20msが基本ですが、13msにしても動作しました。 LEDで文字を表示するための文字のコード化ですが、下のようにLEDに番号をつけた結果、文字をコードで 表せるようにしました。 C言語プログラムのmain関数の最初の配列がそれです。 @ABC25 GFED24 HIJK23 ONML22 PQRS21この下にこのためのC言語プログラムとVisualBasicのプログラムを載せます。 C言語プログラムのシリアル関係部はrikiyaさんのサイトからほぼ丸写しです。 VisualBasicの部分は吉野さんのサイトのプログラムをこれ用に直しました。
|