工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

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 4WD RCカーとジョイスティックコントローラー、またはアナログジョイスティックでArduino 4WDスマートカーをいかに簡単に制御できるかというものです。

このRCジョイスティック制御カーは、送受信機としてnRF24L01を使用します。開放空間で最大1キロメートルの通信距離があります。また、非常にシンプルで作りやすいです。

1. ジョイスティックコントローラー

ジョイスティック用コンポーネント:

ジョイスティックシールドをArduinoの上に装着すると、シンプルなコントローラーになります。7つのモーメンタリプッシュボタン(大4つ、小2つ、ジョイスティック選択ボタン)と2軸サムジョイスティックにより、往年のNintendoコントローラー級の機能がArduinoに加わります。このユニットはNokia 5110 LCDとnRF24L01インターフェースも提供します。

特徴

実際には「BTE16-49 - nRF24L01+RFX2401C +PA+LNA アンテナシールドケース付きワイヤレス通信モジュール 2.4GHz 20dbm 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

製造プロセス

  1. Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
  2. DIY Arduino USBゲームコントローラー - 高性能ゲームパッドを自作
  3. 古いラジコンカーをXboxコントローラーで操作可能に - ArduinoとUSBホストシールドで実現
  4. Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
  5. ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
  6. Arduino駆動3Dプリントロボットアームの製作:ステップバイステップガイド
  7. DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
  8. スマート駐車場カウンター:Arduino、Processing、PHPでリアルタイム車両管理
  9. Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
  10. ゲーム用カスタムArduinoジョイスティックハンドルの製作
  11. Arduinoで自作RCポルシェカー:ステップバイステップガイド