Arduinoでラジコンを作った。
前回,車とダブルギアボックスを使って車が動くようになったのだが,これだと左右の前輪がつながっているのでうまく曲がらない。そこで,ボールキャスターを使って左右に曲がるようにした。
さらに,BluetoothモジュールRN-42を使ってPCから操作できるようにした。
表裏はこんな感じ。
構成としては以下の通り。
- タミヤのユニバーサルボード,タイヤセット,ボールキャスター,ダブルギアボックスで基本の車を作成
- 単4電池とボックスでモータの電源を確保,6P電池とジャンパピン付きスナップでArduino用の電源を確保
- モータードライバTA7291Pを2個使って,モーター,Arduino電源,モータ電源を接続
- RN-42 Bluetooth 2mmピッチ変換モジュールをXBee用2.54mmピッチ変換基板でブレッドボードに載せる
RN42については,買ったものがXBee用の2mmピッチだったので,2.54mmピッチに変換。秋月電子の変換ボードは3.3Vレギュレータ付きなので,電源は5Vそのままつなげるが,ArduinoからRN42へのシリアル通信は3.3Vに変換しないといけないので適当に抵抗で電圧を落とす必要がある。はんだ付けも多少慣れたけど2mmピッチは小さすぎて辛い。
RN42の使い方はWebを探すと先人が情報を残してくれているが,Macのコンソールが一番楽そうなのでMacから繋いでみる。RN42を配線して電圧をかけると赤LEDが点滅し,それだけでMac上でBluetoothデバイスとして見つかる。ペアリングすると赤LEDが点灯するので,コンソールから「screen /dev/tty.RNBT-DF42-RNI-SPP 115200」を実行。キーボードで通信ができる。
回路図。Fritzingを使用して作図。ごちゃごちゃするのでGND省略してるけど,適当にArduinoのGNDか電池のマイナスにつなぐ。
プログラム。どうしてもハード部分がメインになるのでソフト部分は超適当だけど,上げておこう。
int rpositive = 9; int rnegative = 6; int lpositive = 11; int lnegative = 3; int led = 13; int lspeed = 0; int rspeed = 0; char inByte = 0; void setup() { Serial.begin(115200); pinMode(lpositive, OUTPUT); pinMode(lnegative, OUTPUT); pinMode(rpositive, OUTPUT); pinMode(rnegative, OUTPUT); pinMode(led, OUTPUT); analogWrite(lpositive, 0); analogWrite(lnegative, 0); analogWrite(rpositive, 0); analogWrite(rnegative, 0); } void loop() { if (Serial.available() > 0) { inByte = Serial.read(); if (inByte == 'w') { // forward lspeed += 50; rspeed += 50; Serial.println('f'); } else if (inByte == 's') { // backward lspeed -= 50; rspeed -= 50; Serial.println('b'); } else if (inByte == 'a') { // left lspeed += 50; rspeed -= 50; Serial.println('l'); } else if (inByte == 'd') { // right lspeed -= 50; rspeed += 50; Serial.println('r'); } else if (inByte == 'z') { // stop lspeed = 0; rspeed = 0; Serial.println('s'); } if(lspeed > 200) { lspeed = 200; } if(rspeed > 200) { rspeed = 200; } if(lspeed < -200) { lspeed = -200; } if(lspeed < -200) { lspeed = -200; } if(lspeed >= 0) { analogWrite(lpositive, lspeed); analogWrite(lnegative, 0); } else { analogWrite(lpositive, 0); analogWrite(lnegative, -lspeed); } if(rspeed >= 0) { analogWrite(rpositive, rspeed); analogWrite(rnegative, 0); } else { analogWrite(rpositive, 0); analogWrite(rnegative, -rspeed); } if(lspeed != 0 || rspeed != 0) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } delay(100); } }
次はスマホからBluetooth接続できるようにしてスマホから操作するかな。