一 目的
此文章记录了arduino与陶晶驰串口屏实现联动,点击屏幕双态开关远程控制arduino2560板载的直流电机和无刷电机开关。为手搓乒乓球发球机做准备。
二 接线
2.1串口屏接线
串口屏与Arduino UNO接线如下:
————————————————
RX <-> TX0(D1) //此种接线必须在串口屏下载时断开连接,arduino通讯时断开串口屏下载工 具,因为串口不能一对多。同样此链接无法实现连接串口屏时串口监视。
TX <-> RX0(D0) //可以通过软串口进行,比如示例图片中接线D6和D7。
GND <-> GND
VCC <-> VCC
————————————————
2.2 nRF24L01与arduino uno接线
nRF24L01 与Arduino UNO接线如下:
————————————————
/*nRF24L01 Arduino UNO
VCC <-> 3.3V
GND <-> GND
CE <-> D9
CSN <-> D10
MOSI <-> D11
MISO <-> D12
SCK <-> D13
IRQ <-> 不接
————————————————
2.3 nRF24L01与arduino 2560接线
nRF24L01 与Arduino MEGA接线如下:
————————————————
/*nRF24L01 Arduino MEGA
VCC <-> 3.3V
GND <-> GND
CE <-> D53
CSN <-> D49
MOSI <-> D51
MISO <-> D50
SCK <-> D52
IRQ <-> 不接
————————————————
三 代码
3.1 发射端代码
#define lenth 6
#include <SoftwareSerial.h>#include <SPI.h>
#include "printf.h"
#include "RF24.h"
#define CE_PIN 9
#define CSN_PIN 10
//#define LED_BUILTIN 13
// 定义引脚
RF24 radio(CE_PIN, CSN_PIN);const byte addresses[][6]={"66666","88888"};//为双向通信创建两个通道地址,6为写通道,8为读取通道
bool radioNumber = 1; //接收机和发射机区分标志,可不用 ,本案例保留
bool role = false; // 接收机和发射机区分转换位,可不用 ,本案例保留 true = TX role, false = RX role
float payload = 0.0;//发射成功,标记
const char text[32] ={0};//用于存放接收到的数据SoftwareSerial TJC(6,7);//7接 串 口 屏 或 串 口 工 具 的RX, arduino的6接 串 口 屏 或 串 口 工 具 的TXvoid sendend()//结束代码
{TJC.write(0xff);TJC.write(0xff);TJC.write(0xff);
}// the setup function runs once when you press reset or power the board
void setup() {Serial.begin(9600);//串口屏采用相同的波特率while (!Serial) {// some boards need to wait to ensure access to serial over USB}//等待串口准备好Serial.println(F("串口准备就绪"));if (!radio.begin()) {Serial.println(F("发射器无应答!!"));while (1) {} // hold in infinite loop}//等待发射器回应radio.setChannel(114);//设置信道(0-127),114号通道radio.openWritingPipe(addresses[0]);//88888radio.openReadingPipe(1, addresses[1]); // 66666radio.setPALevel(RF24_PA_HIGH);Serial.println(F("发射器准备就绪"));//pinMode(LED_BUILTIN, OUTPUT);TJC.begin(115200);//串口屏采用相同的波特率}// the loop function runs over and over again forever
void loop() {char str[100];int m = 0;//以下判断接收到的串口的信息while (TJC.available() >= lenth) {unsigned char comd[lenth];unsigned char head = TJC.peek();if (head == 0x55){TJC.readBytes(comd,lenth);if (comd[3] == 0xff && comd[4] == 0xff && comd[5] == 0xff){if (comd[1] == 0x00) {if (comd[2] == 0x01) {sprintf(str, "t8.txt=\"供求机构打开\"");//屏幕输出打开TJC.print(str);//给串口屏反馈 sendend();//digitalWrite(LED_BUILTIN, HIGH); // 板载LED点亮,灯不亮LED在13引脚,与SCK冲突//Serial.println("开灯");//给串口反馈状态//将指令发射出去radio.stopListening();const char text2[] = {"supplyOpen"};radio.write(&text2, sizeof(text2));delay(100);Serial.println("状态已发送给MAGA:");Serial.println("接收通道打开");radio.startListening();delay(100);}if (comd[2]==0x00){sprintf(str, "t8.txt=\"供球机构关闭\"");//屏幕输出关闭TJC.print(str); sendend();//digitalWrite(LED_BUILTIN, LOW); // 板载LED熄灭//Serial.println("关灯");//将指令发射出去radio.stopListening();const char text2[] = {"supplyClose"};radio.write(&text2, sizeof(text2));delay(100);Serial.println("状态已发送给MAGA:");Serial.println("接收通道打开");radio.startListening();delay(100);}} else if (comd[1] == 0x01) {if (comd[2] == 0x01) {sprintf(str, "t9.txt=\"射球机构打开\"");//屏幕输出打开TJC.print(str);//给串口屏反馈 sendend();//digitalWrite(LED_BUILTIN, HIGH); // 板载LED点亮,灯不亮LED在13引脚,与SCK冲突Serial.println("射球机构打开");//给串口反馈状态//将指令发射出去radio.stopListening();const char text2[] = {"shootOpen"};radio.write(&text2, sizeof(text2));delay(100);Serial.println("状态已发送给MAGA:");Serial.println("接收通道打开");radio.startListening();delay(100);}if (comd[2]==0x00){sprintf(str, "t9.txt=\"射球机构关闭\"");//屏幕输出关闭TJC.print(str); sendend();//digitalWrite(LED_BUILTIN, LOW); // 板载LED熄灭Serial.println("射球机构关闭");//将指令发射出去radio.stopListening();const char text2[] = {"shootClose"};radio.write(&text2, sizeof(text2));delay(100);Serial.println("状态已发送给MAGA:");Serial.println("接收通道打开");radio.startListening();delay(100);}}}} else{TJC.read();}}
}
3.2 串口屏代码
串口屏代码:弹起事件
printh 55
printh 00
prints bt0.val,1//根据不同的按键修改bt0按键代码
printh ff ff ff
串口屏代码:按下事件
if(bt0.val==1)//根据不同的按键修改bt0按键代码
{bt0.txt="关闭"
}
if(bt0.val==0)
{bt0.txt="打开"
}
3.3 接收端代码
//arduino maga 接收端代码,接收到open 打开LED灯,接收到close 关闭LED灯。
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>#define SCK_PIN 52
#define MOSI_PIN 51
#define MISO_PIN 50#define DC_EN A3//直流电机调速器控制,供求机构#include <Servo.h>//无刷电机控制,射球机构Servo esc1; // 创建一个Servo对象,用于控制ESC
Servo esc2; // 创建一个Servo对象,用于控制ESC//#define
RF24 radio(53, 49);// CE, CSN
const char text[32]={0};//用于存放接收到的数据
const byte addresses[][6]={"66666","88888"};//为双向通信创建两个通道地址,6为写通道,8为读取通道
int led=13;//2560上的LED为D13.void setup()
{Serial.begin(9600);while (!Serial) {// some boards need to wait to ensure access to serial over USB}//等待串口准备好Serial.println(F("串口准备就绪"));if (!radio.begin()) {Serial.println(F("接收器无应答!!"));while (1) {} // hold in infinite loop}//等待发射器回应radio.begin();radio.setChannel(114);//设置信道(0-127),114号通道radio.openWritingPipe(addresses[1]);//66666radio.openReadingPipe(1, addresses[0]); // 88888radio.setPALevel(RF24_PA_HIGH);Serial.println(F("接收器准备就绪"));radio.startListening();pinMode(DC_EN, OUTPUT); // 设置引脚为输出模式esc1.attach(4); // 将ESC1连接到数字引脚4esc2.attach(5); // 将ESC2连接到数字引脚5esc1.writeMicroseconds(1000); // 设置初始脉冲宽度为1000us(中立点)esc2.writeMicroseconds(1000); // 设置初始脉冲宽度为1000us(中立点)esc1.writeMicroseconds(2000);esc2.writeMicroseconds(2000);delay(500);esc1.writeMicroseconds(1000);esc2.writeMicroseconds(1000);
}void loop()
{ //Serial.println("代码在这里执行");//uint8_t pipe;//if (radio.available(&pipe))if (radio.available()>0) // 是否有有效数据可以读取 { //Serial.println("接收到数据1");radio.read(&text,sizeof(text));// delay(500);String comdata = "";comdata += text;//Serial.println("接收到数据:");//Serial.println(comdata);if (comdata == "supplyOpen") {Serial.print("接收到:");Serial.println(comdata);digitalWrite(led,HIGH);analogWrite(DC_EN,177);radio.stopListening();radio.startListening();}if (comdata == "supplyClose") {Serial.print("接收到:");Serial.println(comdata);digitalWrite(led,LOW);analogWrite(DC_EN,0);radio.stopListening();radio.startListening();}if (comdata == "shootOpen") {Serial.print("接收到:");Serial.println(comdata);//digitalWrite(led,HIGH);esc1.writeMicroseconds(1500);esc2.writeMicroseconds(1500);radio.stopListening();radio.startListening();}if (comdata == "shootClose") {Serial.print("接收到:");Serial.println(comdata);//digitalWrite(led,LOW);esc1.writeMicroseconds(1000);esc2.writeMicroseconds(1000);radio.stopListening();radio.startListening();}else{radio.startListening();Serial.println("未收到数据");}
}
}
四 遥控器界面
4.1本例控制界面
4.2 首页
4.3 姿态数据界面
4.4 模拟控制界面
五 实际操控
演示视频
手搓乒乓球发球机
六 源文件
6.1 串口屏文件
请上文章顶端下载
6.2 遥控器文件
请上文章顶端下载
6.3 接收器文件
请上文章顶端下载