Raspberry Pi Zero W 単体でラジコンカー自作
前回Raspberry Pi Zero Wでサーボモータを制御してみてラズパイでなにかしらを制御するのはシンドいなぁという感想を得たのですが。。。デジタル信号制御なら問題ないだろということで、I2C入力のモータドライバでラジコン作りました。
ここではスマホアプリ Blynk とラズパイでI2C入力のモータドライバを介してモータをコントロールします。
目次
構成
部品
- Raspberry Pi Zero W
- モバイルバッテリー
ON/OFFボタンがついていて負荷がなくてもスリープしないので便利です。
-
I2Cモータードライバ・モジュール DRV8830
- 円形ロボットシャーシキット
I2Cモータードライバ・モジュール DRV8830
I2C入力によって、モータ供給電圧(スピード)と供給電圧方向(回転方向)を制御します。円形ロボットシャーシキットの左右のモータを制御するため2個のモジュールを使用しました。
I2Cアドレス設定
2個のモジュールを制御する必要がありますので、それぞれ異なるI2Cアドレスを設定します。
本モジュールは基板上のジャンパA1, A0のステートによって以下の表のようにアドレスを指定することができます。
表のアドレスxは読み込み時には1、書き込み時は0をしてします。ここでは書き込みのみ使用します。左モータ用モジュールのジャンパを両方GND (アドレス:0x60)、右モータ用モジュールのジャンパを両方Open (アドレス:0x64)としました。
書き込みI2Cデータ
アドレス0x00に8bitの情報を書き込むことでモータを制御します。
各ビットの設定は以下の通り
blynk設定
ここではblynk の2個のジョイスティックのx軸を使用して左右のモータを制御します。
新規プロジェクトを作成します。ハードウェアはラズパイ zeroがまだないのでとりあえずRaspberry Pi 3Bを選択。Conection TypeにはWiFiを指定します。
AUTH TOKENはコードコンパイル時に使用しますのでメール送信してメモしておきます。
ウィジェットとしてジョイスティックを2個配置します。
2個のジョイスティックの設定はそれぞれのx軸をヴァーチャルピンV0, V1に出力させ、値は-63~63としました。
プログラム
サーボ制御同様にC++を採用しました。
Blynkライブラリインストール
ラズパイにBlynkライブラリをインストールします。
詳細は https://github.com/blynkkk/blynk-library/tree/master/linux 通りでターミナルを起動して
$ git clone https://github.com/blynkkk/blynk-library.git
でOK
ラズパイI2C有効化
Raspberry Piの設定を開きインターフェースのタグでI2Cの有効を選択しRebootします。
C++プログラミング
Blynkライブラリがインストールされるとホームにblynk-library/linuxフォルダが生成されます。linuxフォルダをコピーするなどして、その中のmain.cppを以下のように書き換えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#define BLYNK_PRINT stdout #ifdef RASPBERRY #include <BlynkApiWiringPi.h> #else #include <BlynkApiLinux.h> #endif #include <BlynkSocket.h> #include <BlynkOptionsParser.h> #include <wiringPiI2C.h> static BlynkTransportSocket _blynkTransport; BlynkSocket Blynk(_blynkTransport); #include <BlynkWidgets.h> int motorL = 0x60; int motorR = 0x64; int rot = 0; //モータドライバ I2C制御 motor driver I2C //参考:http://makers-with-myson.blog.so-net.ne.jp/2014-05-15 void writeMotorResister(int motor,int rot, int vset){ int vdata = vset << 2 | rot; int fd = wiringPiI2CSetup(motor); int result = wiringPiI2CWriteReg8(fd, 0x00, vdata); } //ジョイスティックL x軸(V0)値受信 BLYNK_WRITE(V0) { int x = param[0].asInt(); printf("L value: %d\n", x); //I2C書き込み if(x > 0){ writeMotorResister(motorL, 1, abs(x)); //前進 } else if(x < 0){ writeMotorResister(motorL, 2, abs(x)); //後進 } else{ writeMotorResister(motorL, 0, 0); //スタンバイ } } //ジョイスティックR x軸(V1)値受信 BLYNK_WRITE(V1) { int x = param[0].asInt(); printf("R value: %d\n", x); //I2C書き込み if(x > 0){ writeMotorResister(motorR, 1, abs(x)); //前進 } else if(x < 0){ writeMotorResister(motorR, 2, abs(x)); //後進 } else{ writeMotorResister(motorR, 0, 0); //スタンバイ } } void setup(){ } void loop(){ Blynk.run(); } int main(int argc, char* argv[]){ const char *auth, *serv; uint16_t port; parse_options(argc, argv, auth, serv, port); Blynk.begin(auth, serv, port); setup(); while(true) { loop(); } return 0; } |
BlynkのV0, V1で値を受けてモータの回転方向とスピードを制御しています。
wiringPiのI2Cライブラリを使用しています。
コンパイル
main.cppのあるフォルダに移動して以下を実行。
$ make clean all target=raspberry
Blynk実行
つづいて以下を実行
$ sudo ./blynk --token=Blynkアプリで取得したAuthToken
上図のようにReadyで準備OK!
動作
いい感じ!デジタル通信による制御であればラズパイでも問題なく色々できそうです♪
こちらはどのラズパイを利用していますか?
Pi3など、、 詳細を教えて頂きたいです。
コメントありがとうございます。
部品欄に記載してあるRaspberry Pi Zero Wを使用しております。
ご確認ください。
i2cを搭載していないモータードライバモジュール(TA7291P)を使用したいのですが,こちらと同様の手順で同様の物が製作できるでしょうか?教えていただきたいです。
コメントありがとうございます。
こちらはI2C入力のモータドライバのみに適応できる製作方法です。