一 目的
此文章记录了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接 串 口 屏 或 串 口 工 具 的TX
void 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]);//88888
radio.openReadingPipe(1, addresses[1]); // 66666
radio.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]);//66666
radio.openReadingPipe(1, addresses[0]); // 88888
radio.setPALevel(RF24_PA_HIGH);
Serial.println(F("接收器准备就绪"));
radio.startListening();
pinMode(DC_EN, OUTPUT); // 设置引脚为输出模式
esc1.attach(4); // 将ESC1连接到数字引脚4
esc2.attach(5); // 将ESC2连接到数字引脚5
esc1.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 接收器文件
请上文章顶端下载