記事の詳細
汎用電動機制御基板をつかってロボットカーを製作してみよう!【ソフト編】
さて前回のハード編に続いて 今回はソフトウェアを扱います。
https://github.com/bit-trade-one/ADRPT8C_Generic_Motor_Controller
↑サンプルプログラムはこちらから!↑
ハードを動かすには、ソフトが必要です。必要なソフトの構成を、下記のように考えてみます。
入力処理:センサからの情報を論理処理部に伝える。
- 論理処理:動かしたい内容を論理的にプログラムする。
- 出力処理:論理処理部からの情報で、アクチュエータ(DCモータ)を制御する。
従来のソフトの作り方は、Python言語で、入力、論理、出力処理を一つのプログラムで作るのが一般的であると思います、自分も今まではそういう作り方でした、ただこのような作り方だと、ネットワーク処理、並列処理が難しくなります。
今回、ネットワーク処理、並列処理をできるだけ容易に行うため、論理処理部をNODE-REDにし、
入力、出力処理部を別々に、pythonプログラムで作ることにしました。
入力処理部のソフト仕様
・ADコンバータから、値(ch0からch6)を読む
左右の距離センサは、ch6,7に接続しているので、基準距離(例:30cm)を0とする
基準距離より近ければ -0.5から0の値
基準距離より遠ければ、 0から+0.5の値
・その値を、JSON形式で、複数の値を同時にMQTTプロトコルで、NODE-REDに送る
JSON形式にしたのは、node-redで扱いやすく、複数の値を同時に送れ、値の種類を自由に定義できるからです。
MQTTにしたのは、IoT用のプロトコルで、NODE-REDで標準でノードがあり、扱いやすいからです。
出力処理部のソフト仕様
・node-redからMQTTプロトコルで、複数の値を同時にJSON形式で受ける。
・DCモータを動かすための、値(ch6からch7)を読む
読んだ値(-0.5~0~+0.5)により、DCモータを前進、後進させる
ソフトの全体図を示します。
まず、ハードがソフトから見れるかどうか確認するため、sshターミナルソフト(例:Mobaxterm)で、下記コマンドを実行し、I2Cデバイスを確認しておきます。
pi@raspberrypi:~ $ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: 60 — — — — — — — — — — — — — — —
70: 70 — — — — — — —
pi@raspberrypi:~ $
Pythonプログラムのファイルのリストを下記に示します
MCP3208-MQTTout-pub-DCmotor.py アナログ入力をMQTTでNODE-REDに渡す
pwm-pca9685-mqttin-sub-dcmotor.py NODE-REDから、MQTTで情報を受け取り、DCモータを制御する
適切な、フォルダに、上記2ファイルをコピーしておく
私は、WINSCPを使い下記のようにコピーしています。
Pythonプログラムには、下記ライブラリ等のインストールが必要です
PWM出力のライブラリ
MQTTのpythonライブラリ
MQTTブローカ
mosquitto
ライブラリのインストールは、下記のようにしました。
- まずGITのサイトにブラウザで見てみます。
- サイトの説明にある下記コマンドをsshで実行します
sudo pip install adafruit-pca9685
実行結果を張っておきます。
pi@raspberrypi:~ $ sudo pip install adafruit-pca9685
Collecting adafruit-pca9685
Downloading Adafruit_PCA9685-1.0.1-py2-none-any.whl
Requirement already satisfied: Adafruit-GPIO>=0.6.5 in /usr/local/lib/python2.7/dist-packages/Adafruit_GPIO-1.0.3-py2.7.egg (from adafruit-pca9685)
Requirement already satisfied: adafruit-pureio in /usr/local/lib/python2.7/dist-packages/Adafruit_PureIO-0.2.1-py2.7.egg (from Adafruit-GPIO>=0.6.5->adafruit-pca9685)
Requirement already satisfied: spidev in /usr/lib/python2.7/dist-packages (from Adafruit-GPIO>=0.6.5->adafruit-pca9685)
Installing collected packages: adafruit-pca9685
Successfully installed adafruit-pca9685-1.0.1
spberrypi:~ $
ほかのライブラリも同様にインストールします。
MQTTブローカは、下記のようにinstallします。
Sudo apt-get install mosquitto
次に、pythonのプログラムを実行してみます。
pi@raspberrypi:~ $ cd raz-robo/spi-mcp3208-ad-conv/
pi@raspberrypi:~/raz-robo/spi-mcp3208-ad-conv $ sudo python3 MCP3208-MQTTout-pub-DCmotor.py
print文を入れてありますので、適切な値が表示されれば成功です。
注意としては、出力用pythonプログラムで、jsonデータを読み込むとき、node-redで想定外の文字が余計に付加され、うまく読めませんでした、pythonの文字列置換機能で、予定な文字を削除して、何とか読めました。
自立制御の一見複雑そうな動きを、左右全く独立で動かすことにより、簡単に動かすことができました、これは、以前 子供の科学という雑誌で、左右の太陽電池と左右のモータをクロスでつないで、光の方向に走る模型のカーというアイデアを見ました、今回そのアイデアを応用しています。
自分でも、こんなに容易に、ロボットカーが動いて、感激しています。
次回はロボット・カーを動かすためのNODE-REDプログラムについて解説します。お楽しみに!
汎用電動機制御基板をつかってロボットカーを製作してみよう!【NODE-REDプログラム編】はこちら!