Arduino 4WD RCカー完全ガイド:ジョイスティック操作・nRF24L01通信
部品と材料
| Arduino UNO | ×2 |
| SparkFun nRF24L01+ トランシーバー(RP-SMA) | ×2 |
| Funduino ジョイスティックシールド V1.A | ×1 |
| SparkFun デュアルHブリッジ モータードライバー L298 | ×2 |
| 4WD スマートロボットカーチャシキット | ×1 |
| LED(汎用) | ×3 |
| 抵抗 221Ω | ×2 |
| ブレッドボード(汎用) | ×2 |
| 18650電池 | ×2 |
| モバイルバッテリー | ×1 |
| ジャンパーワイヤー(汎用) | ×1 |
必要な工具と機械
- はんだごて(汎用)
アプリとオンラインサービス
- Arduino IDE
プロジェクト概要
ストーリー
皆さん、こんにちは!これは私の次のプロジェクト、Arduino 4WD RCカーとジョイスティックコントローラー、またはアナログジョイスティックでArduino 4WDスマートカーをいかに簡単に制御できるかというものです。
このRCジョイスティック制御カーは、送受信機としてnRF24L01を使用します。開放空間で最大1キロメートルの通信距離があります。また、非常にシンプルで作りやすいです。
1. ジョイスティックコントローラー
ジョイスティック用コンポーネント:
ジョイスティックシールドをArduinoの上に装着すると、シンプルなコントローラーになります。7つのモーメンタリプッシュボタン(大4つ、小2つ、ジョイスティック選択ボタン)と2軸サムジョイスティックにより、往年のNintendoコントローラー級の機能がArduinoに加わります。このユニットはNokia 5110 LCDとnRF24L01インターフェースも提供します。
特徴
- nRF24L01インターフェース
- Nokia 5110 LCDインターフェース
- Bluetoothインターフェース
- I2Cインターフェース
- Arduino互換
- 動作電圧 3.5Vまたは5V
実際には「BTE16-49 - nRF24L01+RFX2401C +PA+LNA アンテナシールドケース付きワイヤレス通信モジュール 2.4GHz 20dbm 1000m」としてラベルされています。
販売者指定の特性:
- 2.4GHzグローバルオープンISMバンド、ライセンスフリー使用
- 最大動作速度2Mbps、効率的なGFSK変調、音声・映像伝送可能
- 125チャネル、マルチポイント通信と周波数ホッピング通信に対応
- 内蔵ハードウェアCRCエラー検出とポイントツーマルチポイント通信制御
- 動作電圧 3.0-3.6V、送信電力 20dBm (VDD = 3.3V)
- 外部2.4GHzアンテナ
- 2.54mmピッチピン、アンプモジュールなしで完全互換、距離延長のために簡単に交換可能
- 伝送距離最大1000m
2. ジョイスティックコントローラー(詳細)
ジョイスティックシールドには、大ボタン4つ+小ボタン2つ+ジョイスティック選択ボタン、2軸サムジョイスティック(X軸0-1023、Y軸0-1023)があります。シールドをArduinoに装着するとシンプルなコントローラーになります。私のスケッチでは、上ボタンはブザー(クラクション)、右ボタンはフロントライト(LED+200Ω抵抗)、左ボタンはバックライト(LED+200Ω抵抗)に割り当てています。他のボタンは未使用です。
ジョイスティックテスト:
アイドル状態:X=499, Y=502, 上=1, 右=1, 下=1, 左=1
3. Arduino 4WD RCカー
上記の配線図に従って接続してください。
注意: コードをアップロードする前に、Arduino Unoボードからジャンパーワイヤー(ピン0, 1)を外してください。
すべての手順を正しく実行すれば、カーは走行準備完了です!
Arduinoカーとジョイスティックコントローラーに電源を入れた後、ジョイスティックを前後に動かすとカーが前進・後退し、左右に動かすとカーが左右に曲がります。
コード
Car_nRF24.ino(Arduino RCカー側)
/* JoyStickモジュール受信コード - 接続: nRF24L01モジュール 1 - GND 2 - VCC 3.3V !!! 5Vではない 3 - CE to Arduino pin 6 4 - CSN to Arduino pin 8 5 - SCK to Arduino pin 13 6 - MOSI to Arduino pin 11 7 - MISO to Arduino pin 12 8 - 未使用 */ #include#include #include #define CE_PIN 6 #define CSN_PIN 8 const uint64_t pipe = 0xE8E8F0F0E1LL; #define light_Front 18 // LEDフロント右 ピンA4 #define light_Back 19 // LEDバック右 ピンA5 #define horn_Buzz 7 #define ENA_m1 3 // 右フロントモーター速度 #define ENB_m1 5 // 右バックモーター速度 #define ENA_m2 9 // 左フロントモーター速度 #define ENB_m2 10 // 左バックモーター速度 #define IN_11 0 // L298N #1 in1 右フロント #define IN_12 1 // L298N #1 in2 右フロント #define IN_13 2 // L298N #1 in3 右バック #define IN_14 4 // L298N #1 in4 右バック #define IN_21 14 // L298N #2 in1 左フロント #define IN_22 15 // L298N #2 in2 左フロント #define IN_23 16 // L298N #2 in3 左バック #define IN_24 17 // L298N #2 in4 左バック RF24 radio(CE_PIN, CSN_PIN); int joystick[6]; int speedRight = 0, speedLeft = 0; int xAxis, yAxis; int buttonUp, buttonRight, buttonDown, buttonLeft; void setup() { pinMode(light_Front, OUTPUT); pinMode(light_Back, OUTPUT); pinMode(horn_Buzz, OUTPUT); pinMode(ENA_m1, OUTPUT); pinMode(ENB_m1, OUTPUT); pinMode(ENA_m2, OUTPUT); pinMode(ENB_m2, OUTPUT); pinMode(IN_11, OUTPUT); pinMode(IN_12, OUTPUT); pinMode(IN_13, OUTPUT); pinMode(IN_14, OUTPUT); pinMode(IN_21, OUTPUT); pinMode(IN_22, OUTPUT); pinMode(IN_23, OUTPUT); pinMode(IN_24, OUTPUT); radio.begin(); radio.openReadingPipe(1, pipe); radio.startListening(); } void loop() { if (radio.available()) { radio.read(joystick, sizeof(joystick)); xAxis = joystick[0]; yAxis = joystick[1]; buttonUp = joystick[2]; buttonRight = joystick[3]; buttonDown = joystick[4]; buttonLeft = joystick[5]; // ボタン処理 digitalWrite(horn_Buzz, buttonUp == HIGH ? LOW : HIGH); digitalWrite(light_Front, buttonRight == HIGH ? LOW : HIGH); digitalWrite(light_Back, buttonLeft == HIGH ? LOW : HIGH); // Y軸:前進・後退制御 if (yAxis < 470) { // 後退 digitalWrite(IN_11, LOW); digitalWrite(IN_12, HIGH); digitalWrite(IN_13, HIGH); digitalWrite(IN_14, LOW); digitalWrite(IN_21, HIGH); digitalWrite(IN_22, LOW); digitalWrite(IN_23, LOW); digitalWrite(IN_24, HIGH); speedRight = map(yAxis, 470, 0, 0, 255); speedLeft = map(yAxis, 470, 0, 0, 255); } else if (yAxis > 550) { // 前進 digitalWrite(IN_11, HIGH); digitalWrite(IN_12, LOW); digitalWrite(IN_13, LOW); digitalWrite(IN_14, HIGH); digitalWrite(IN_21, LOW); digitalWrite(IN_22, HIGH); digitalWrite(IN_23, HIGH); digitalWrite(IN_24, LOW); speedRight = map(yAxis, 550, 1023, 0, 255); speedLeft = map(yAxis, 550, 1023, 0, 255); } else { // 中立 speedRight = 0; speedLeft = 0; } // X軸:左右制御 if (xAxis < 470) { // 左折 int xMapped = map(xAxis, 470, 0, 0, 255); speedLeft -= xMapped; speedRight += xMapped; if (speedLeft < 0) speedLeft = 0; if (speedRight > 255) speedRight = 255; } if (xAxis > 550) { // 右折 int xMapped = map(xAxis, 550, 1023, 0, 255); speedLeft += xMapped; speedRight -= xMapped; if (speedLeft > 255) speedLeft = 255; if (speedRight < 0) speedRight = 0; } // 低速時のブザー防止(モーターに合わせて調整) if (speedLeft < 70) speedLeft = 0; if (speedRight < 70) speedRight = 0; analogWrite(ENA_m1, speedRight); analogWrite(ENB_m1, speedRight); analogWrite(ENA_m2, speedLeft); analogWrite(ENB_m2, speedLeft); } }
Joystick_nRF24.ino(ジョイスティックコントローラー側)
/* JoyStickモジュール送信コード - 接続: nRF24L01モジュール 1 - GND 2 - VCC 3.3V !!! 5Vではない 3 - CE to Arduino pin 9 4 - CSN to Arduino pin 10 5 - SCK to Arduino pin 13 6 - MOSI to Arduino pin 11 7 - MISO to Arduino pin 12 8 - 未使用 デフォルトボタンピン: 上-ピン2, 右-ピン3, 下-ピン4, 左-ピン5 アナログジョイスティック: GND-Arduino GND, VCC-Arduino +5V Xポット-Arduino A0, Yポット-Arduino A1 */ #include#include "nRF24L01.h" #include "RF24.h" #define CE_PIN 9 #define CSN_PIN 10 #define xAxis 14 // A0 #define yAxis 15 // A1 const uint64_t pipe = 0xE8E8F0F0E1LL; RF24 radio(CE_PIN, CSN_PIN); int joystick[6]; int buttonUp = 2, buttonRight = 3, buttonDown = 4, buttonLeft = 5; void setup() { Serial.begin(9600); radio.begin(); radio.openWritingPipe(pipe); radio.stopListening(); pinMode(buttonUp, INPUT_PULLUP); pinMode(buttonRight, INPUT_PULLUP); pinMode(buttonDown, INPUT_PULLUP); pinMode(buttonLeft, INPUT_PULLUP); digitalWrite(buttonUp, LOW); digitalWrite(buttonRight, LOW); digitalWrite(buttonDown, LOW); digitalWrite(buttonLeft, LOW); } void loop() { joystick[0] = analogRead(xAxis); joystick[1] = analogRead(yAxis); joystick[2] = digitalRead(buttonUp); joystick[3] = digitalRead(buttonRight); joystick[4] = digitalRead(buttonDown); joystick[5] = digitalRead(buttonLeft); radio.write(joystick, sizeof(joystick)); delay(20); // シリアル出力でデバッグ Serial.print("X = "); Serial.print(analogRead(xAxis)); Serial.print(" Y = "); Serial.print(analogRead(yAxis)); Serial.print(" Up = "); Serial.print(digitalRead(buttonUp)); Serial.print(" Right = "); Serial.print(digitalRead(buttonRight)); Serial.print(" Down = "); Serial.print(digitalRead(buttonDown)); Serial.print(" Left = "); Serial.println(digitalRead(buttonLeft)); }
回路図
rc_car_tp3A7JlpYw.fzz
製造プロセス
- Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
- DIY Arduino USBゲームコントローラー - 高性能ゲームパッドを自作
- 古いラジコンカーをXboxコントローラーで操作可能に - ArduinoとUSBホストシールドで実現
- Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduino駆動3Dプリントロボットアームの製作:ステップバイステップガイド
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- スマート駐車場カウンター:Arduino、Processing、PHPでリアルタイム車両管理
- Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
- ゲーム用カスタムArduinoジョイスティックハンドルの製作
- Arduinoで自作RCポルシェカー:ステップバイステップガイド