m3pi

このページは現在変更中です。約1週間ごとに追加していきます。

m3piの概略

m3piはKazuhiro Ouchiさんのm3piを作ってみようのページに説明(たぶんはじめの頃)と概略があります。

現在は以下のような製品として売られていますので、m3piとして購入することでファームウエアの更新は不要になっています。バッテリーは充電式のニッケル水素電池が推奨なのでエネループを使用できます。
充電端子が備わっていますが、日本で対応していそうなものがないので、使用していません。
(回路図だと直列の充電(4.8V)が必要そう。NiHiの充電はめんどくさそうです)

http://mbed.org/media/uploads/chris/_scaled_pololu_m3pi.jpg

回路図は、ここにあります。
回路や機構の特徴的は

  • 電圧をいったんアップして一定に保つようにしていること
  • 光センサーの強度を一定にするためにセンサーの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.