こんにちはせしろです。
PS4コントローラも使えることが分かったので、今回は回路を考えようと思います。といっても、モーター2台を動かすだけですが・・・。
今回はモータードライバーがいらず、Arduinoから直接動かせる「サーボモータ」を使おうと思っています。車輪を回すので360度連続サーボですね。
用意したもの
しかしこのサーボモータ、4.8V電源で110rpm、6Vの電源で130rpmとちょっと物足りないかな。速度を上げる工夫は必要かもしれません。まあ今回の目的は、回路を作って実際に動かすところまでですので後から考えることにします。
配線してみる
こんな感じに配線してみます。実際はこれにUSBホストシールドが乗ります。Arduinoへの給電はとりあえずUSBで行います。
余談ですが、この画像は回路作成ソフト「Fritzing」を使用しています。数年前は無償のソフトだったようですが、現在は有償(8ユーロ:約1000円程)となっています。回路図やブレッドボード図、パターン図も作れます。
ブレッドボードを使ってあれやこれや配線した際に、前はどうやったっけ?ってことが無いように、メモ代わりに導入しました。
詳しく説明してくれているブログもありますので、「fritzing」で検索してみてください。
で、配線したのがこちら
うん、多分大丈夫だろう。
スケッチを書いてみる
ド素人なので、難しいことははっきりいって出来ません。なので「USB Host Shield Library 2.0 PS4BT 」コードから不要な部分を削除。見よう見まねでコードをちょこちょこっと書いてみました。
L2とR2は前進。 L1ボタンとR1ボタン押しながらL2、R2で後退するようにしました。
/* Test code... */
#include <Servo.h>
Servo servo1;
Servo servo2;
int val1 = 90 ;
int val2 = 90 ;
#include <PS4BT.h>
#include <usbhub.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>
USB Usb;
BTD Btd(&Usb);
//PS4BT PS4(&Btd, PAIR);
PS4BT PS4(&Btd);
void setup() {
//USBHost初期化
Serial.begin(115200);
#if !defined(__MIPSEL__)
while (!Serial);
#endif
if (Usb.Init() == -1) {
while (1); // Halt
}
servo1.attach(3);
servo2.attach(5);
}
void loop() {
Usb.Task();
if (PS4.connected()) {
val1 = PS4.getAnalogButton(L2);
val2 = PS4.getAnalogButton(R2);
if (PS4.getButtonPress(L1)) {
val1 = map(val1, 0, 255, 90, 0);
}
else {
val1 = map(val1, 0, 255, 90, 180);
}
if (PS4.getButtonPress(R1)) {
val2 = map(val2, 0, 255, 90, 180);
}
else {
val2 = map(val2, 0, 255, 90, 0);
}
if (PS4.getButtonClick(PS)) {
PS4.disconnect();
}
}
servo1.write(val1);
servo2.write(val2);
}
動作確認
同時に回すと若干ですが回転数に差があるのが分かります。色々試しましたが私では改善することはできませんでした・・・。
まぁ今後の課題として取っておくことにします。
まとめ
とても簡単に動かすことが出来ました。がんばれば他にもいろんなことが出来そうな気がしてきます。
さて、次は車体ですかね。