記事の詳細

さて前回のハード編に続いて 今回はソフトウェアを扱います。

razurobo1

ハードを動かすには、ソフトが必要です。必要なソフトの構成を、下記のように考えてみます。

入力処理:センサからの情報を論理処理部に伝える。

  1. 論理処理:動かしたい内容を論理的にプログラムする。
  2. 出力処理:論理処理部からの情報で、アクチュエータ(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モータを前進、後進させる

ソフトの全体図を示します。

zentairazurobosofuto
まず、ハードがソフトから見れるかどうか確認するため、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を使い下記のようにコピーしています。

razrobosofuto2

Pythonプログラムには、下記ライブラリ等のインストールが必要です

PWM出力のライブラリ

Adafruit_Python_PCA9685

MQTTのpythonライブラリ

paho.mqtt.python

MQTTブローカ

mosquitto
ライブラリのインストールは、下記のようにしました。

  1. まずGITのサイトにブラウザで見てみます。
  2. サイトの説明にある下記コマンドを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プログラム編】はこちら!

 

WP-製品紹介M29-ADRPTB8C

関連記事

ページ上部へ戻る