最近 NRF24L01を使って無線でデータを転送する方法を知りました。
そのNRF24L01というのは、1個約200円という破格の値段でありながら、1100mもの長距離通信ができてしまうという、優れものです。(実際には100mぐらいまでしか通信できませんが、、、)
よいうことで今回は、ArduinoとNRF24L01を使って、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を使って初めてラジコンカーを作ってみたのですが、やはり超楽しいですね。子供の頃は、市販品のラジコンカーーでよく遊びましたが、今では自分で作ることができてとてもうれしいです。
皆さんも是非、作って遊んでみてください!
[…] ArduinoとLEGOでラジコンカーを作ってみた! […]