混论坛一段时间,看了各种教程,现把各种教程组合,做了个PELCO-D解码器,考虑布线问题,所以用24L01发送到云台,程序都来自论坛,我不是程序员,我只是程序搬运工。
解码+发送:
/*引脚接法:
nRF24L01 Arduino UNO
VCC <-> 3.3V
GND <-> GND
CE <-> D9
CSN <-> D10
MOSI<-> D11
MISO<-> D12
SCK <-> D13
IRQ <-> 不接
*/
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
int16_t RVX,RVY,SW,a_x,a_y,s_w;
char SER='b';
String comdata = "";
char ZJ1,ZJ2,ZJ3,ZJ4,ZJ5,ZJ6,ZJ7; //存放PELCO-D数据用
void setup()
{
Serial.begin(2400);
pinMode(4,OUTPUT); //4脚接了485模块RE脚
digitalWrite(4,LOW); //置低电平接收数据
Mirf.cePin = 9; //设置CE引脚为D9
Mirf.csnPin = 10; //设置csn引脚为D10
Mirf.spi = &MirfHardwareSpi;
Mirf.init(); //初始化nRF24L01
Mirf.setRADDR((byte *)"Sen01");
Mirf.payload = 8; //发送4组数据,共8字节。
Mirf.channel = 3; //发送通道,可以填0~128,收发必须一致。
Mirf.config();
}
unsigned int data=0;
void loop(){
while (Serial.available() > 0){ //等待串口是否有数据输入
comdata += char(Serial.read());//有数据则读入缓存
delay(6); //延时等数据全部传完
}
if (comdata.length() > 0){
ZJ2=comdata[1]; //地址码
ZJ3=comdata[2]; //指令码1
ZJ4=comdata[3]; //指令码2
ZJ5=comdata[4]; //数据码1
ZJ6=comdata[5]; //数据码2
//Serial.print(comdata);
comdata = "";
}
if(ZJ2==0x02){ //判断地址码
switch(ZJ4){ //地址码正确则判断指令码
case 0x08:SER='u';break; //上
case 0x10:SER='d';break; //下
case 0x02:SER='r';break; //右
case 0x04:SER='l';break; //左
case 0x00:SER='f';break; //停
}
RED_KEY(); //读按键状态
SEND_DATA(); //通过24L01发送数据
delay(10);//这个用来控制采样速度
}//---没收到串口数据才执行下面语句-------------------
RED_KEY();
SEND_DATA();
delay(10);//这个用来控制采样速度
}
//-----------读按键状态--------------------------------------
void RED_KEY(){
a_x = analogRead(A1);//读PS2游戏摇杆控制杆X轴
a_y = analogRead(A0);//读PS2游戏摇杆控制杆Y轴
s_w = analogRead(A2);//读PS2游戏摇杆控制杆SW
RVX=a_x/4; //取值0-255
RVY=a_y/4; //取值0-255
}
//-----------通过24L01发送数据---------------------------------
void SEND_DATA(){
byte data[Mirf.payload];
data[0] = RVX & 0xFF; //低八位给data[0],
data[1] = RVX >> 8; //高八位给data[1]。
data[2] = RVY & 0xFF; //低八位给data[2],
data[3] = RVY >> 8; //高八位给data[3]。
data[4] = s_w & 0xFF; //低八位给data[4],
data[5] = s_w >> 8; //高八位给data[5]。
data[6] = SER & 0xFF; //低八位给data[6],
data[7] = SER >> 8; //高八位给data[7]。
Mirf.setTADDR((byte *)"Rec01");
Mirf.send(data);
while(Mirf.isSending()) {} //while死循环等待发送完毕,才能进行下一步操作。
}
接收+控制
/*
nRF24L01 Arduino Receiver接收端
Ansifa
2015/3/7
引脚接法:
nRF24L01 Arduino UNO
VCC <-> 3.3V
GND <-> GND
CE <-> D9
CSN <-> D10
MOSI<-> D11
MISO<-> D12
SCK <-> D13
IRQ <-> 不接
*/
#include <Servo.h>
Servo servo1;
Servo servo2;
int i,val1,val2;
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
int adata[]= {0,0,0};
int olddata[] = {0,0,0};
int adata0 =0, adata1 = 0,adata2=0,olddata0=0,olddata1=0,olddata2=0;
int16_t VRX, VRY,GGX,GGY, SW,output;
char SER;
void setup()
{
pinMode(8,OUTPUT); //接了有源嗡鸣器
digitalWrite(8, LOW);//开嗡鸣器,哔一声后开始工作
Serial.begin(9600);
Mirf.cePin = 9; //设置CE引脚为D9
Mirf.csnPin = 10; //设置CE引脚为D10
Mirf.spi = &MirfHardwareSpi;
Mirf.init(); //初始化nRF24L01
Mirf.setRADDR((byte *)"Rec01");
Mirf.payload = 8;
Mirf.channel = 3; //发送通道,可以填0~128,收发必须一致。
Mirf.config();
servo1.attach(A3);//舵機一接pin A3
servo2.attach(A1);//舵機一接pin A1
delay(100);
digitalWrite(8, HIGH); //关嗡鸣器
val1=100; //陀机角度初始位处于中间位置
val2=100; //陀机角度初始位处于中间位置
}
void loop()
{
rem(); //读nRF24L01数据
panduan(); //nRF24L01解码
Se_r(); //串口解码
Servop1(); //第一个陀机
Servop2(); //第二个陀机
//Serial.print("RVX= ");
//Serial.println(VRX);
//Serial.print("RVY ");
//Serial.println(VRY);
//Serial.print("SW= ");
//Serial.println(SW);
// Serial.print("SER= ");
//Serial.print(SER);
}
//---------------24l01接收-----------------------
void rem(){
byte data[Mirf.payload];
if(Mirf.dataReady()){ //等待接收数据准备好
Mirf.getData(data); //接收数据到data数组
//data[1]<左移8位与data[0]并,重组数据。
VRX = (unsigned int)((data[1] << 8) | data[0]);
VRY = (unsigned int)((data[3] << 8) | data[2]);
SW = (unsigned int)((data[5] << 8) | data[4]);
SER = (unsigned int)((data[7] << 8) | data[6]);
}
}
//------------------------------------------------
void panduan(){ //遥控解码
switch (VRX){case 0:val1--; delay(10); break;
case 255:val1++;delay(10);break;}
switch (VRY){case 255:val2--;delay(10); break;
case 0:val2++;delay(10);break;}
switch (SW){ case 0:val2=100;val1=100;;break;} //按下按键回到初始位
}
//-----串口数据解码-------------------------------------
void Se_r(){
switch(SER)
{
case 'u':val1--;break;//上
case 'd':val1++;break; //下
case 'r':val2--;break; //右
case 'l':val2++;break; //左
}
delay(10); //陀机转向速度控制
}
//-------第一个陀机---------------------------------------
void Servop1(){
if( val2>255){val2=254;}
if(val2<-1){val2=0;}
servo1.write(val2);
}
//----第二个陀机------------------------------------------
void Servop2(){
if( val1>255){val1=254;}
if(val1<-1){val1=0;}
servo2.write(val1);
}
|