やっとZumo Robotがゲームパッドで動かせました。
今回も難航しました。
先週からずっとZumo Robotをゲームパッドで動かすことに注力してきましたが、やっと動かすことができました。
今回は、Arduinoの構文で戸惑いました。
使ってみて思ったのは、pythonって素晴らしい、ということを再確認したことでした。
pythonで悩んだことが無いようなところでつまづいた次第です。
この記事では、Zumo Robotをワイヤレスのゲームパッドで動かすためのコードを中心に記載したいと思います。
コードの構成は?
コードは以下のものを参考にして作りました。
ここにあるUSBHIDJoystickを改造して作りました。
USBHIDJoystickはHIDタイプのゲームパッドの操作データを受信するためのコードです。
2つのジョイスティックと沢山のボタンのデータを受信します。
今回は、これに
1)ゲームパッドからのデータ受信コードの統合
2)Zumo Robotを動かすためのコードの追加
3)ゲームパッドのジョイスティックのデータを元にZumo Robotの
モーター速度を計算しZumo Robotに指示を出すコードの追加
を行いました。
では、順に説明していきましょう。
ゲームパッドからのデータ受信コードの統合
USBHIDJoystickでは、コードは下の3つのファイルに分かれています。
・USBHIDJoystick.ino
・hidjoystickrptparser.h
・hidjoystickrptparser.cpp
JoystickEventsクラスのインスタンスJoyEventsの関数が、ボタンの状態変化を検知して都度シリアルに書き出すというプログラムになっています。
これらはライブラリとして存在しているので、今回の作業で手を加えるのを避けるためにUSBHIDJoystickMotor.inoというファイルを新たに作り、これに変更を加えることとしました。
USBHIDJoystickMotor.inoは、USBHIDJoystick.inoにhidjoystickrptparser.hとhidjoystickrptparser.cppの必要なコードを抜粋して追加、書き換えをすることで作りました。
参考としたネットの記事を添付します。
この記事の記載内容に沿って進め、概ね問題なく作り上げることができました。
ゲームパッドからの受信成功です。
Zumo Robotを動かすためのコードの追加
これも簡単で、以下のコードの追加でOKです。
実際に使うのは、ZumoMotor.hのみですが、今後のことを考えて他のコードも追加しておきました。
#include <QTRSensors.h>
#include <ZumoReflectanceSensorArray.h>
#include <ZumoMotors.h>
#include <ZumoBuzzer.h>
#include <Pushbutton.h
モーター速度を計算しZumo Robotに指示を出すコードの追加
問題はここでした。
今回は、ジョイスティックのデータの内、左側のジョイスティックの情報を使うこととしました。
左側のジョイスティックの操作でZumo Robotの走行速度と姿勢をコントロールします。
ジョイスティックの情報は一般的には下の記事のようになっています。
今回は、ジョイスティックのAXIS-XとAXIS-Yのデータを使います。
僕が今回使うゲームパッドは、AXIS-Xのデータの範囲は、0から255でジョイスティックを左に持って行ったときに値はゼロで中央の時に値が127、一番右が255となっていました。
また、AXIS-Yに関しては、一番下に持って行ったときに値が255で中央の時に値が128、一番上に持っていった時の値がゼロでした。
問題は、USBHIDJoystick.inoでゲームパッドからのデータをint形式で扱っており、intの範囲が-32768から32767であるはずなのに、8ビット以上の掛け算をした場合に計算結果がへんてこりんになってしまいました。
これは未だに原因が明確には判っていません。
Arduinoのコードに慣れていないのでやってはいけないことをやってしまっているのだとは思いますが、pythonでは味わったことのない悩みというか使い方というか、兎に角面倒でした。
結局は動くコードを探した、というのが本音です。
Zumo Robotは左右2つのモーターの速度差で操舵を行います。
各モーターへの指示は、-400から400までの値で行います。
ゲームパッドのジョイスティックのデータAXIS-XとAXIS-Yを使って左右のモーターへの指示値を作ります。
試行錯誤の結果、各モーターへの速度指示の基本はAXIS-Yの値を使って計算し、その値をAXIS-Xの値を使って修正し、操舵を行う、というスタイルにしました。
要は、AXIS-XとAXIS-Yの符号の組み合わせで、前進、後進、右折、左折を判定してAXIS-Yを元に計算したモーター速度に対してAXIS-Xを元に計算した速度を引いたり足したりして最終的に左右のモーターの速度を計算しました。
このコードをZumo Robotにインストールして動作確認まで終わりました。
いよいよ明日は、実際に走行させてみようと思います。
それにしてもArduinoのコードは悩ましい。
色々と触って癖を把握する必要がありそうです。
(記事後記)
Arduinoを触っているうちに物欲がわき、以下のものを買ってしまいました。
まずは、カメラESP32-CAM
続いて、ESP32-DEVKIT-C
どちらも1000円前後で買いやすい値段でした。
色々触ってみようと思います。