ArduinoとLEGOでラジコンカーを作ってみた!

最近 NRF24L01を使って無線でデータを転送する方法を知りました。

そのNRF24L01というのは、1個約200円という破格の値段でありながら、1100mもの長距離通信ができてしまうという、優れものです。(実際には100mぐらいまでしか通信できませんが、、、)

よいうことで今回は、ArduinoとNRF24L01を使って、LEGOの車をリモコンで制御する、いわゆるラジコンカーを作ってみました!

今回は、こちらのラジコンカーの詳細を紹介していきます。

LEGOの車

こちらが、車体です。空中配線がぐちゃぐちゃですが、気にしないようにしましょう!

NRF24L01で、データを受信してArduino Nanoを介してモーターを回転させています。

使用電子部品
Arduino Nano(互換品)  https://amzn.to/3CN5uaA
NRF24L01  https://amzn.to/3ZGkuRg
EV3 Largeモーター ×2 https://amzn.to/3S9LXaG
Cytron 4V~16V DCモータードライバ
EV3 リチウムイオンバッテリー https://amzn.to/3Ejgmh6

駆動には、EV3のLargeモーターを左右に1つずつ合計2つ使います。左右両方のモーターを回転させれば、直進して、左のモーターだけを回転させれば右に曲がるというわけです。

前輪にはオムニホイールが付いています。このオムニホイールのおかげで、カーブでもスムーズに走行することができます。

リモコン

操縦はジョイスティックを使います。ジョイスティックを傾けた方向に進んでいきます。

片手で操作できるので、とてもカンタンです!

角電池を握るように持って、親指で操作します。

こちらも同様に、配線がゴチャゴチャしてますが、今回作ったものは試作機なので良しとします。

使用電子部品
Arduino Nano(互換品)  https://amzn.to/3EmhrVE
ジョイスティック     https://amzn.to/3H9fQ7g
角電池(9V)       https://amzn.to/3CRluIR

プログラム

//車側(受信側)

#include <SPI.h>
#include <RF24.h>

RF24 radio(8 , 10);                      // CE,CSN
const byte address[6] = "00001";        // 送信アドレス
int read_date[2];

void setup() {
  radio.begin();                           // 無線オブジェクトの初期化
  radio.openReadingPipe(0, address);       // データ受信アドレスを指定
  radio.setPALevel(RF24_PA_MAX);           // 出力を最大に
  radio.setDataRate(RF24_250KBPS);          // 通信速度を250kbpsに指定
  radio.setChannel(0);                     // 通信周波数を設定
  radio.startListening();                  // 送信側として設定

  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);
}

void loop() {
  if (radio.available()) {
    radio.read(&read_date, sizeof(read_date));      // データを受信
    if (read_date[0] == 0) {                       // 以下データを元にモーターを回転
      digitalWrite(3, LOW);
      digitalWrite(5, LOW);
    } else if (read_date[0] > 0) {
      digitalWrite(3, LOW);
      analogWrite(5, read_date[0]);
    } else {
      analogWrite(3, read_date[0] * -1);
      digitalWrite(5, LOW);
    }

    if (read_date[1] == 0) {
      digitalWrite(6, LOW);
      digitalWrite(9, LOW);
    } else if (read_date[1] > 0) {
      digitalWrite(6, LOW);
      analogWrite(9, read_date[1]);
    } else {
      analogWrite(6, read_date[1] * -1);
      digitalWrite(9, LOW);
    }
  }
}
//リモコン側(送信側)

#define x_center 513      // ジョイスティック横軸の中心値
#define x_max 1017       // ジョイスティック横軸の最大値
#define y_center 495     // ジョイスティック縦軸の中心値
#define y_max 1020       // ジョイスティック縦軸の最大値

#include <SPI.h>
#include <RF24.h>

RF24 radio(9, 10);                      // CE,CSN
const byte address[6] = "00001";        // 送信アドレス
int write_date[2], right, left;

void setup() {
  radio.begin();                           // 無線オブジェクトの初期化
  radio.openWritingPipe(address[1]);       // 送信アドレスを指定
  radio.setPALevel(RF24_PA_MAX);           // 出力を最大に
  radio.setDataRate(RF24_250KBPS);         // 通信速度を250kbpsに指定
  radio.setChannel(0);                     // 通信周波数を設定
  radio.stopListening();                   // 送信側として設定
}

void loop() {
  if (analogRead(7) >= y_center) {                          // 以下ジョイスティックの値を取得
    right = map(analogRead(7), y_center, y_max, 0, -150);
    left = map(analogRead(7), y_center, y_max, 0, -150);
  } else {
    right = map(analogRead(7), y_center, 0, 0, 150);
    left = map(analogRead(7), y_center, 0, 0, 150);
  }

  if (analogRead(6) >= x_center) {
    right -= map(analogRead(6), x_center, x_max, 0, -100);
    left += map(analogRead(6), x_center, x_max, 0, -100);
  }

  if (analogRead(6) >= x_center) {
    right -= map(analogRead(6), x_center, x_max, 0, -100);
    left += map(analogRead(6), x_center, x_max, 0, -100);
  } else {
    right -= map(analogRead(6), x_center, 0, 0, 100);
    left += map(analogRead(6), x_center, 0, 0, 100);
  }

  write_date[0] = right;
  write_date[1] = left;
  radio.write(&write_date, sizeof(write_date));           // データを送信
}

まとめ!

NRF24L01を使って初めてラジコンカーを作ってみたのですが、やはり超楽しいですね。子供の頃は、市販品のラジコンカーーでよく遊びましたが、今では自分で作ることができてとてもうれしいです。

皆さんも是非、作って遊んでみてください!

1 COMMENT

現在コメントは受け付けておりません。