C++
Arduino
RaspberryPi
ROS
IoT

RaspberryPi3とZumoとROSで半永久自走式充放電ロボを作成したい_005日目_Arduino+モーター制御

◆ 前回記事

RaspberryPi3とZumoとROSで半永久自走式充放電ロボを作成したい_004日目_Action の続き

◆ はじめに

ROSの超基本的な動作イメージがつかめたところで、予告通り、一時的にROSから離れてモーターやセンサーの制御に手を出そうと思う。
すでにHWの組み立てはある程度進めてあるが、接続されているセンサー類の制御は今のところ全くノータッチの状態。
少し値は張るが、わずか10cm四方、高さ数cmのサイズに自律走行で必要となりそうなセンサー類がギッシリ詰まっている躯体 「Pololu Zumo 32U4 (100:1 HPモーター)」 を調達してある。

選定時のポイントは、

  • 制御用のライブラリがある程度用意されていること
  • ハイパワーであること
  • 小型であること
  • 超低レベルなセンサー回りがあらかじめ実装されていること
  • 必要ならば多少高価でもいい

◆ Pololu Zumo 32U4 (100:1 HPモーター)

【メーカー参考記事】
https://www.pololu.com/product/3127
https://www.pololu.com/category/170/zumo-32u4-robot

【メーカー公式の紹介動画】 画像をクリックするとYoutube再生が始まる
特に、00:20 あたりから 01:30 あたりまでの動画は「うぉ〜、すげぇ〜」となった。
zumo-32u4-robot

0J6690.600x480.jpg0J6721.600x480.jpg

  • ATmega32U4 AVRマイクロコントローラ Arduino Leonardo/Arduino Micro互換
  • デュアルモータドライバ
  • 直行エンコーダ
  • 3軸加速度計
  • ジャイロ
  • 全方位コンパス
  • ラインセンサ
  • 近接センサ(前方+左右両サイド)
  • ハイパワーモーター
  • LCDも付属しているが必要ないので外す

やりたいこと が軒並みマシンスペックを要求しそうなことばかりなので、なるべくあちこちに負荷を分散させたい。
高レベルの画像処理や自己位置推定の処理は RaspberryPi3 に任せ、低レベルのセンサー制御やモーター制御はArduinoに任せるコンセプトとする。

◆ 環境

◆ 開発機へArduinoIDEの導入

下記をダウンロード(arduino-1.8.5-linux64.tar.xz)

$ cd ~
$ wget -O arduino-1.8.5-linux64.tar.xz https://www.arduino.cc/download.php?f=/arduino-nightly-linux64.tar.xz
解凍
$ tar Jxfv arduino-1.8.5-linux64.tar.xz
$ rm arduino-1.8.5-linux64.tar.xz
インストール
$ cd arduino-1.8.5
$ sudo chmod +x ./install.sh
$ sudo ./install.sh
$ sudo chmod 777 ~/Desktop/arduino-arduinoide.desktop

◆ Zumo32U4用ライブラリ・ドライバのインストール

ArduinoIDEを起動→スケッチ→ライブラリをインクルード→ライブラリを管理
18.png

検索ボックスに「Zumo32U4」を入力→インストールボタンクリック
19.png

ArduinoIDEを再起動 (管理者権限で起動しないとLinux to Arduinoのプログラム書き込み時に Permission Denied エラーになる)

$ sudo -H ./arduino

ファイル→環境設定
20.png

「スケッチブックの保存場所:」に「/home/<username>/Arduino」を入力
「追加のボードマネージャのURL」に
「https://files.pololu.com/arduino/package_pololu_index.json 」 を入力してOK
21.png

ツール→ボード→ボードマネージャー
22.png

検索ボックスで「Pololu A-Star」を検索→インストール
23.png

ツール→ボード→「Pololu A-Star 32U4」を選択
24.png

PC と Zumo32U4 を microUSB で接続

ツール→シリアルポート→「/dev/ttyACM0」 を選択

下記コマンドを実行し、Linuxユーザにシリアルポートへのアクセス権限を付与する

Linuxユーザへのシリアルポートアクセス権限の付与
$ sudo apt-get install arduino
$ sudo addgroup <username> dialout
$ sudo usermod -a -G dialout <username>

◆ PCとZumoをUSBケーブルで接続した際のシリアルポート番号を調べるコマンド

$ ls -l /dev/ttyACM*

◆ Arduinoの基本

【参考】 https://www.elekit.co.jp/software/SW-1016

  • モーター制御 とか、シリアル通信 とか、響きがカッコいい。
  • Arduino基板の電源を入れたときには、全てのポートが入力ポート(INPUT)になっている 例)pinMode(n, INPUT)
  • void setup() と void loop() のワンセットを必ず記載?
  • void setup() でピンモードの初期化などの処理を行う
  • void loop() で無限ループ処理
  • 基盤によってピン番号と接続されているセンサー類が決まっている→32U4の仕様を調べなければ・・・
  • 全ての処理は非同期的に呼び出されるため、適切にdelay関数を呼んで処理待ちを作らないと処理が終わる前に次の処理で命令が上書きされ、まともに動かなくなる
  • Zumo用 モーター制御ライブラリの関数
    • setLeftSpeed (左側モーター制御)
    • setRightSpeed(右側モーター制御)
    • setSpeeds (左右モーター同時制御)
      • -400 逆転MAXパワー
      • 0   停止
      • 400  正転MAXパワー

◆ モーターを制御して 1周自動旋回させてみる

Zumoに最初からハードウェア実装されている ButtonA を押すと、1秒待機したあとに自動で周回し続けるようにする。
スケッチの読み方が全く分からず、試行錯誤に大きく時間を割いたわりに、たったこれだけのプログラムであっけなく右折左折前進後進制御できることに気付く。

MortorControl.ino
#include <Wire.h>
#include <Zumo32U4.h>

Zumo32U4Motors motors;
Zumo32U4ButtonA buttonA;

void setup()
{
  buttonA.waitForButton();
  delay(1000);
}

void loop()
{
  motors.setSpeeds(50, 50);
  delay(1000);
  motors.setSpeeds(0, 0);
  delay(2);
  motors.setRightSpeed(100);
  delay(2400);
  motors.setRightSpeed(0);
  delay(2);
}

左上の「→」マークをクリックして Arduino へプログラムを書き込む。
25.png

そして、基板上の「ButtonA」を押すと。。。

こいつ…動くぞ!

子供が初めて歩いたときバリにうれしい!! :relaxed:

ezgif.com-gif-maker.gif
※ 動作確認をする際に、本体底面に内蔵させているモーター用バッテリがタイミング良く電池切れになり、やむなく給電用の有線を2本接続している。

◆ 本日のまとめ

  • ArduinoIDE のダウンロードに2時間近く掛かる。 のっけからげんなり。。。
  • スケッチには大したプログラムを書かなくても、かなりの部分をよろしくやってくれる
  • 馴染みのない非同期前提のロジックを書く必要があり、delayの調整に心が折れそうになる
  • 起動するたびにハードウェアボタンを押したくない

◆ 次回予告

Bluetoothによる無線シリアル制御にチャレンジし、 RaspberryPi でコマンドを中継して制御できるようにしたい。
実装の刻みはかなり細かいが、着実に毎週進めていくぞぉ!

◆ 次回記事

RaspberryPi3とZumoとROSで半永久自走式充放電ロボを作成したい_006日目_Arduino+RaspberryPi+Bluetooth+シリアル通信+ROS連携 へ続く