在本篇文章中,我们将制作一款两轮遥控机器人小车,使用的组件包含nRF24L01模块、Arduino UNO和Funduino操纵杆扩展板组成的控制部分,Arduino nano开发板以及和一个用于控制直流电机的L298N电机驱动器。
nRF24L01和L298N电机驱动器为机器人小车提供动力,并且以arduino nano为大脑。此外,为了控制这款车,我们使用Arduino UNO和Funduino操纵杆模块。
nRF24L01射频收发器芯片
nRF24L01是一款真正快速、低成本的RF收发器芯片。它的工作频率为2.4GHz,速率高达2Mbps,功耗极低,这意味着一节5号电池可以为其供电多年。它的工作电压范围为1.9至3.6V,峰值RX / TX电流小于14mA。

增强型ShockBurst硬件协议加速器还可以卸载应用微控制器的时间关键协议功能,实现与低成本第三方微控制器的高级和强大无线连接。
Funduino操纵杆Arduino扩展板
Funduino是一款非常酷的Arduino扩展板,可轻松放在Arduino UNO之上,我们可以轻松地将普通的Arduino UNO转换为用户友好的操纵杆。

屏蔽提供简单的模拟输入,带有操纵杆和四个独立按钮。还包括两个额外的小按钮。
操纵杆可用于控制各种事物,例如屏幕上的旋律、机器人或像素,并且按钮可用于导航或游戏控制。
所需的硬件
● Arduino UNO开发板
● Arduino nano开发板
● Funduino操纵杆扩展板
● L298N电机驱动器
● 2个nRF24L01
● 移动电源
● 机器人汽车底盘
● 2个直流电机

硬件组装
将Arduino Uno和Funduino组装在一起。将Funduino置于Uno之上。它很容易组装。

接下来,将nRF24L01插入Funduino操纵杆模块顶部,如下图所示。

硬件接线

如果您从亚马逊购买了一个机器人底盘套件,请首先进行组装。接下来,按照Fritzing图并将所有组件连接到Arduino Nano,如下所示。
注意:如果马达不动,要给L298n 12+和GND接入一个5-12v的供电,来驱动马达
下图是组装完成后的效果:

测试Funduino
上传控制端和机器人小车的代码后,就可以进行测试了! 下图是小车的控制方式:

发射端代码:
//Arduino Joystick shield Code #include <nRF24L01.h> #include <RF24.h> #include <SPI.h> #define CE_PIN 9 #define CSN_PIN 10 int up_button = 2; // Boton Amarillo - A int down_button = 4; // Boton Amarillo - C int left_button = 5; // Boton Azul - D int right_button = 3; // Boton Azul - B int start_button = 6; // Boton F int select_button = 7; // Boton E int analog_button = 8; // int x_axis = A0; int y_axis = A1; int buttons[]={up_button, down_button,left_button, right_button,start_button,select_button,analog_button}; const uint64_t pipe = 0xE8E8F0F0E1LL; RF24 radio(CE_PIN,CSN_PIN); char msg[20] = ""; void setup(){ for(int i; i <7 ; i++) { pinMode(buttons[i],INPUT); digitalWrite(buttons[i],HIGH); } Serial.begin(9600); radio.begin(); radio.openWritingPipe(pipe); } void loop(){ if(digitalRead(up_button)==LOW) { char msg[]="up"; radio.write(&msg,sizeof(msg)); delay(300); Serial.println("UP Button Pressed"); } if(digitalRead(down_button)==LOW) { char msg[]="down"; radio.write(&msg,sizeof(msg)); delay(300); Serial.println("Down Button Pressed"); } if(digitalRead(left_button)==LOW) { char msg[]="left"; radio.write(&msg,sizeof(msg)); delay(300); Serial.println("Left Button Pressed"); } if(digitalRead(right_button)==LOW) { char msg[]="right"; radio.write(&msg,sizeof(msg)); delay(300); Serial.println("Rigth Button Pressed"); } if(digitalRead(start_button)==LOW) { char msg[]="start"; radio.write(&msg,sizeof(msg)); delay(300); Serial.println("Start Button Pressed"); } if(digitalRead(select_button)==LOW) { char msg[]="select"; radio.write(&msg,sizeof(msg)); delay(300); Serial.println("Select Button Pressed"); } if(digitalRead(analog_button)==LOW) { char msg[]="analgobut"; radio.write(&msg,sizeof(msg)); delay(300); Serial.println("Analog Button Pressed"); } Serial.print("\n X = "),Serial.print(analogRead(x_axis)),Serial.print(" \n Y = "), Serial.print(analogRead(y_axis)); Serial.print(" "); delay(500); }
接收端代码:
// Arduino Car Code #include <nRF24L01.h> #include <RF24.h> #include <RF24_config.h> #include <SPI.h> #define CE_PIN 9 #define CSN_PIN 10 const int RightMotorF= 3; const int RightMotorB= 4; const int LeftMotorF= 5; const int LeftMotorB= 6; char data[20]=""; RF24 radio(CE_PIN,CSN_PIN); const uint64_t pipe = 0xE8E8F0F0E1LL; void setup() { pinMode(RightMotorF,OUTPUT); pinMode(RightMotorB,OUTPUT); pinMode(LeftMotorF,OUTPUT); pinMode(LeftMotorB,OUTPUT); Serial.begin(9600); radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening(); } void loop(){ String msg=""; if ( radio.available() ) { radio.read( data,sizeof(data) ); Serial.println(data); msg=data; if(msg=="up") { digitalWrite(RightMotorB,LOW); digitalWrite(LeftMotorB,LOW); digitalWrite(RightMotorF,HIGH); digitalWrite(LeftMotorF,HIGH); Serial.println("Motor forward"); } else if(msg=="down") { digitalWrite(RightMotorB,HIGH); digitalWrite(LeftMotorB,HIGH); digitalWrite(RightMotorF,LOW); digitalWrite(LeftMotorF,LOW); Serial.println("Motor Back"); } else if(msg=="left") { digitalWrite(RightMotorB,LOW); digitalWrite(LeftMotorB,HIGH); digitalWrite(RightMotorF,HIGH); digitalWrite(LeftMotorF,LOW); Serial.println("Left"); delay(300); digitalWrite(RightMotorB,LOW); digitalWrite(LeftMotorB,LOW); digitalWrite(RightMotorF,LOW); digitalWrite(LeftMotorF,LOW); } else if(msg=="right") { digitalWrite(RightMotorB,HIGH); digitalWrite(LeftMotorB,LOW); digitalWrite(RightMotorF,LOW); digitalWrite(LeftMotorF,HIGH); Serial.println("right"); delay(300); digitalWrite(RightMotorB,LOW); digitalWrite(LeftMotorB,LOW); digitalWrite(RightMotorF,LOW); digitalWrite(LeftMotorF,LOW); } else if(msg=="analgobut") { digitalWrite(RightMotorB,LOW); digitalWrite(LeftMotorB,LOW); digitalWrite(RightMotorF,LOW); digitalWrite(LeftMotorF,LOW); Serial.println("STOP it"); } } }
访问次数: 2