m3pi
このページは現在変更中です。約1週間ごとに追加していきます。
m3piの概略
m3piはKazuhiro Ouchiさんのm3piを作ってみようのページに説明(たぶんはじめの頃)と概略があります。
現在は以下のような製品として売られていますので、m3piとして購入することでファームウエアの更新は不要になっています。バッテリーは充電式のニッケル水素電池が推奨なのでエネループを使用できます。
充電端子が備わっていますが、日本で対応していそうなものがないので、使用していません。
(回路図だと直列の充電(4.8V)が必要そう。NiHiの充電はめんどくさそうです)
回路図は、ここにあります。
回路や機構の特徴的は
- 電圧をいったんアップして一定に保つようにしていること
- 光センサーの強度を一定にするためにセンサーのLEDが直列で接続されていること
- (3pi User Manual参照)piには30:1のギアボックスを備えていること。
- (3pi User Manual参照)モータの回転方向とブレーキを備えていること
よく使う仕様はm3piのCookBookに書いてある以下の2つ
- Speed of rotation: 720 degrees per second at half speed
- Forward/Backward: 470mm per second at half speed
LEDで文字を表示する
Import programm3pi_LED
m3piのLEDを使って、回転しながらHelloを表示するプログラムです。
最初の定義で1の部分を赤で塗るとわかりやすいです。
#include "mbed.h" #include "m3pi.h" m3pi m3pi; DigitalOut led1(p19); DigitalOut led2(p18); DigitalOut led3(p17); DigitalOut led4(p16); DigitalOut led5(p15); DigitalOut led6(p14); DigitalOut led7(p13); int s1[]={0,1,0,0,0,1,0,1,1,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0}; int s2[]={0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0}; int s3[]={0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0}; int s4[]={0,1,1,1,1,1,0,1,1,1,1,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0}; int s5[]={0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0}; int s6[]={0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0}; int s7[]={0,1,0,0,0,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0}; int main() { int i,j; m3pi.locate(0,1); m3pi.printf("M3PI LED"); wait (2.0); m3pi.left(1); // Turn left at full speed wait (0.1); // wait half a second for (j=0; j<50; j++) { for (i=0; i<31; i++) { led1=s1[i]; led2=s2[i]; led3=s3[i]; led4=s4[i]; led5=s5[i]; led6=s6[i]; led7=s7[i]; wait (0.005); } wait(0.25-0.005*31); //フルスピードだと4回転/秒なのでその間待ちます。 } wait (0.5); m3pi.stop(); }
ライントレース
ライントレースは線の上をトレースして走る車です。
まずはセンサーを調べましょう
センサー(低レベル)の確認
m3piのライブラリは低レベルのセンサーデータを取得するコマンドはないので、命令を送ります。
センサー強度は0-2000で帰ってくる。
低レベルセンサーのコマンドは0x86で10バイト(2バイト×5個)戻ってくるので
(http://www.pololu.com/docs/0J21/10.aより)
黒のほうが数値が大きくなっていることが判る。
Import programm3pi_raw_sensor
m3pi raw sensor
#include "mbed.h" #include "m3pi.h" m3pi m3pi; int main() { unsigned char x[10]; int i; while(1) { m3pi.putc(0x86); for(i=0;i<10;i++){ x[i]=m3pi.getc(); } m3pi.locate(0,0); m3pi.printf(" %2x %2x",(x[3]*0x100+x[2])/8,(x[7]*0x100+x[6])/8); m3pi.locate(0,1); m3pi.printf("%2x %2x %2x",(x[1]*0x100+x[0])/8,(x[5]*0x100+x[4])/8,(x[9]*0x100+x[8])/8); wait(0.2); } }
一般的なライントレース
黒を感じている方のモータを動かすことでライントレースできます。
(右に黒があれば右のモータを動かすことで左を向きます)
#include "mbed.h" #include "m3pi.h" m3pi m3pi; int main() { unsigned char x[10]; int i; while(1) { m3pi.putc(0x86); for(i=0;i<10;i++){ x[i]=m3pi.getc(); } m3pi.locate(0,0); m3pi.printf(" %2x %2x",(x[3]*0x100+x[2])/8,(x[7]*0x100+x[6])/8); m3pi.locate(0,1); m3pi.printf("%2x %2x %2x",(x[1]*0x100+x[0])/8,(x[5]*0x100+x[4])/8,(x[9]*0x100+x[8])/8); if(x[1]*0x100+x[0]>x[9]*0x100+x[8]){ m3pi.left_motor(0.5); m3pi.right_motor(0); }else{ m3pi.left_motor(0); m3pi.right_motor(0.5); } } }
Import programm3pi_raw_line
m3pi raw sensorを使ったライントレース
ライブラリのラインセンサー
ライブラリを使用すると-1.0から1.0までの数値でラインの位置を教えてくれます。
Import programm3pi_Line_test
m3pi ラインセンサー
#include "mbed.h" #include "m3pi.h" m3pi m3pi; int main() { m3pi.locate(0,1); m3pi.printf("LineTest"); wait(2.0); m3pi.sensor_auto_calibrate(); while(1) { m3pi.locate(1,0); m3pi.printf("%f",m3pi.line_position()); wait(0.2); } }
サンプルのライントレース
ライントレースの標準的なサンプルは
http://mbed.org/cookbook/m3pi-LineFollowingにあります。
標準的なライントレース
前のライントレースよりは少し賢いです。
PIDを用いたライントレース
動きが早いです!
Line Maze
解くところまで
3piのマニュアルのプログラムを移植しています。 考え方は後程
Import programm3pi_LineMaze3
LineMaze
2回目は早く動かす
Import programm3pi_LineMaze5
LineMaze
Please log in to post comments.