Arduino 4WD 遥控车
组件和用品
| × | 2 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 2 | ||||
| × | 2 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
|
应用和在线服务
|
关于这个项目
故事
大家好!这是我的下一个项目 - 带有操纵杆控制器的 Arduino 4WD 遥控汽车或使用模拟操纵杆控制 Arduino 4WD 智能汽车是多么容易。
这款遥控摇杆控制车使用NRF24l01作为发射器和接收器。它在开放空间中的射程可达 1 公里。也非常简单易做。
1. 摇杆控制器
操纵杆组件:
操纵杆盾牌位于您的 Arduino 顶部,并将其变成一个简单的控制器。 7 个瞬时按钮(4 个大按钮、2 个小按钮和一个操纵杆选择按钮)和一个两轴拇指操纵杆为您的 Arduino 功能提供与旧任天堂控制器相同的功能。本机还提供诺基亚5110 LCD和nRF24L01接口。
特点:
- nRF24L01 接口
- 诺基亚 5110 LCD 接口
- 蓝牙接口
- 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间距管脚,完全兼容无功放模块接口,方便更换提升距离
- 传输距离可达1000米
2. 摇杆控制器 图>
Joystick Shield 有 4 个大按钮 + 2 个小按钮 + 操纵杆选择按钮和一个两轴拇指操纵杆(X 轴从 0 到 1023,Y 轴从 0 到 1023)该盾牌位于 Arduino 顶部并将其变成一个简单的控制器。在我的草图中,按钮向上用于蜂鸣器(喇叭),按钮右 - 前灯(LED + 电阻器 200 欧姆),按钮左 - 后灯(LED + 电阻器 200 欧姆)。不使用其他按钮。
操纵杆测试:
图> 图>空闲状态:X=499,Y=502,上=1,右=1,下=1,左=1
图> 图> 图> 图> 图> 图>
3. Arduino 4WD 遥控车
图> 图> 图> 图> 图> 图> 图> 图>
按照上面的接线图进行连接。
注意:在上传代码之前,您必须从 Arduino Uno 板(引脚 0、1)断开跳线。
一旦您正确完成所有步骤,汽车就可以出发了!
给 Arduino Car 和操纵杆控制器供电后,您可以使用操纵杆来控制汽车,通过向前和向后移动操纵杆,汽车将向前或向后移动,左右移动操纵杆将使汽车左右转弯。
敬请关注!
代码
- Car_nRF24.ino
- Joystick_nRF24.ino
Car_nRF24.inoArduino
Arduino 遥控车代码/* JoyStick 模块接收器代码 - 连接:nRF24L01 模块参见:1 - GND 2 - VCC 3.3V !!!不是 5V 3 - CE 到 Arduino 引脚 6 4 - CSN 到 Arduino 引脚 8 5 - SCK 到 Arduino 引脚 13 6 - MOSI 到 Arduino 引脚 11 7 - MISO 到 Arduino 引脚 12 8 - 未使用 *///-----(导入需要的库)-----#include#include #include /*-----( 声明常量和引脚号)-----* /#define CE_PIN 6#define CSN_PIN 8// 注意:常量末尾的“LL”是“LongLong” typeconst uint64_t pipe =0xE8E8F0F0E1LL; // 定义传输管道#define light_Front 18 //用于Arduino Uno的LED右前引脚A4#define light_Back 19 //用于Arduino Uno的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 合1 电机右前#define IN_12 1 // L298N #1 in 2 motor Front Right#define IN_13 2 // L298N #1 in 3 motor Back Right#define IN_14 4 // L298N #1 in 4 motor Back Right#define IN_21 14 // L298N # 2 合 1 电机左前#define IN_22 15 // L298N #2 2 电机左前#define IN_23 16 // L298N #2 3 电机左后#define IN_24 17 // L298N #2 4 电机左后/* -----(声明对象)-----*/RF24 radio(CE_PIN, CSN_PIN); // 创建一个 Radio/*-----( 声明变量 )-----*/int joystick[6]; // 保存操纵杆读数的 6 元素数组int speedRight =0;int speedLeft =0;int xAxis, yAxis;// 来自操纵杆的四个按钮变量int buttonUp;int buttonRight;int buttonDown;int buttonLeft;void setup(){ pinMode(light_Front,输出); pinMode(light_Back,输出); pinMode(horn_Buzz,输出); pinMode(ENA_m1,输出); pinMode(ENB_m1,输出); pinMode(ENA_m2,输出); pinMode(ENB_m2,输出); pinMode(IN_11,输出); pinMode(IN_12,输出); pinMode(IN_13,输出); pinMode(IN_14,输出); pinMode(IN_21,输出); pinMode(IN_22,输出); pinMode(IN_23,输出); pinMode(IN_24, OUTPUT);/* Serial.begin(9600); Serial.println("Nrf24L01 接收器启动"); */ radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening();}void loop(){ if ( radio.available() ) { radio.read(joystick, sizeof(joystick) ); xAxis =操纵杆[0]; yAxis =操纵杆 [1]; // 操纵杆数组中的四个按钮变量 int buttonUp =joystick[2]; int buttonRight =游戏杆[3]; int buttonDown =游戏杆[4]; int buttonLeft =游戏杆[5]; //Serial.println(); // 用于调试 // 获取数据负载 - 下面的调试代码 if (buttonUp ==HIGH){digitalWrite(horn_Buzz, LOW);} else {digitalWrite(horn_Buzz, HIGH);} if (buttonRight ==HIGH){digitalWrite( light_Front, LOW);} else {digitalWrite(light_Front, HIGH);} if (buttonLeft ==HIGH){digitalWrite(light_Back, LOW);} else {digitalWrite(light_Back, HIGH);}// Y轴用于向前和向后控制 if (yAxis <470) { // 设置右电机向后 digitalWrite(IN_11, LOW);数字写入(IN_12,高);数字写入(IN_13,高);数字写入(IN_14,低); // 设置左电机向后 digitalWrite(IN_21, HIGH);数字写入(IN_22,低);数字写入(IN_23,低);数字写入(IN_24,高); // 将下降的 Y 轴读数从 470 到 0 转换为 0 到 255 值,用于增加电机速度的 PWM 信号 speedRight =map(yAxis, 470, 0, 0, 255); speedLeft =map(yAxis, 470, 0, 0, 255); }else if (yAxis> 550) { // 设置右电机前进 digitalWrite(IN_11, HIGH);数字写入(IN_12,低);数字写入(IN_13,低);数字写入(IN_14,高); // 设置左电机前进 digitalWrite(IN_21, LOW);数字写入(IN_22,高);数字写入(IN_23,高);数字写入(IN_24,低); // 将增加的 Y 轴读数从 550 到 1023 转换为用于增加电机速度的 PWM 信号的 0 到 255 值 speedRight =map(yAxis, 550, 1023, 0, 255); speedLeft =map(yAxis, 550, 1023, 0, 255); } // 如果操纵杆保持在中间,电机不会移动 else { speedRight =0;速度左 =0; }// X 轴用于左右控制 if (xAxis <470) { // 将 X 轴读数从 470 下降到 0 转换为从 0 到 255 递增的值 int xMapped =map(xAxis, 470, 0, 0 , 255); // 向左移动 - 降低左侧电机速度,增加右侧电机速度 speedLeft =speedLeft - xMapped; speedRight =speedRight + xMapped; // 限制从 0 到 255 的范围 if (speedLeft <0) { speedLeft =0; } if (speedRight> 255) { speedRight =255; } } if (xAxis> 550) { // 将增加的 X 轴读数从 550 到 1023 转换为 0 到 255 值 int xMapped =map(xAxis, 550, 1023, 0, 255); // 向右移动 - 降低右侧电机速度,增加左侧电机速度 speedLeft =speedLeft + xMapped; speedRight =speedRight - xMapped; // 限制从 0 到 255 的范围 if (speedLeft> 255) { speedLeft =255; } if (speedRight <0) { speedRight =0; } } // 防止低速时的嗡嗡声(根据您的电机进行调整。如果 PWM 值低于 70,我的电机无法启动) if (speedLeft <70) { speedLeft =0; } if (speedRight <70) { speedRight =0;模拟写入(ENA_m1,speedRight); // 向电机 A 发送 PWM 信号 analogWrite(ENB_m1, speedRight);模拟写入(ENA_m2,speedLeft); // 向电机 B 发送 PWM 信号 analogWrite(ENB_m2, speedLeft); /* Serial.print("X ="); Serial.print(xAxis); Serial.print(" Y ="); Serial.print(yAxis); Serial.print(" Up ="); Serial.print(操纵杆[2]); Serial.print(" Right ="); Serial.print(操纵杆[3]); Serial.print(" 下 ="); Serial.print(操纵杆[4]); Serial.print(" Left ="); Serial.println(操纵杆[5]); */ } }
Joystick_nRF24.inoArduino
操纵杆控制器代码/* 操纵杆模块收发器代码 - 连接:nRF24L01 模块参见:1 - GND 2 - VCC 3.3V !!!不是 5V 3 - CE 到 Arduino 引脚 9 4 - CSN 到 Arduino 引脚 10 5 - SCK 到 Arduino 引脚 13 6 - MOSI 到 Arduino 引脚 11 7 - MISO 到 Arduino 引脚 12 8 - 未使用 默认按钮引脚:向上 - 引脚 2 右 - pin 3 Down - pin 4 Left - pin 5 - Analog Joystick module GND to Arduino GND VCC to Arduino +5V X Pot to Arduino A0 Y Pot to Arduino A1/*-----(导入需要的库)----- */#include#include "nRF24L01.h"#include "RF24.h"#define CE_PIN 9#define CSN_PIN 10#define xAxis 14 // A0 for Arduino UNO#define yAxis 15 // A1 for Arduino UNO// 注意:常量末尾的“LL”是“LongLong” typeconst uint64_t pipe =0xE8E8F0F0E1LL; //定义传输管道/*-----(声明对象)-----*/RF24 radio(CE_PIN, CSN_PIN); // 创建一个 Radio/*-----( 声明变量 )-----*/int joystick[6]; // 6 个元素数组保存操纵杆读数和 4 个按钮int buttonUp =2;int buttonRight =3;int buttonDown =4;int buttonLeft =5;void setup() { Serial.begin(9600);收音机。开始(); radio.openWritingPipe(pipe); radio.stopListening(); //声明所有按钮的pinMode和初始状态pinMode(buttonUp,INPUT_PULLUP); pinMode(buttonRight,INPUT_PULLUP); pinMode(buttonDown,INPUT_PULLUP); pinMode(buttonLeft,INPUT_PULLUP);数字写入(按钮向上,低);数字写入(buttonRight,低);数字写入(buttonDown,低); digitalWrite(buttonLeft,LOW);}void loop() { joystick[0] =analogRead(xAxis);操纵杆 [1] =模拟读取(yAxis);操纵杆 [2] =数字读取(按钮向上);游戏杆[3] =digitalRead(buttonRight);操纵杆[4] =digitalRead(buttonDown);操纵杆[5] =数字读取(buttonLeft); radio.write(操纵杆,大小(操纵杆));延迟(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(" 下 ="); Serial.print(digitalRead(buttonDown)); Serial.print(" Left ="); Serial.println(digitalRead(buttonLeft));}
示意图
rc_car_tp3A7JlpYw.fzz制造工艺