PELCO-D解码,遥控陀机云台
混论坛一段时间,看了各种教程,现把各种教程组合,做了个PELCO-D解码器,考虑布线问题,所以用24L01发送到云台,程序都来自论坛,我不是程序员,我只是程序搬运工。http://player.youku.com/player.php/sid/XMjc3MjQwNTQ4MA==/v.swf
解码+发送:
/*引脚接法:
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; //地址码
ZJ3=comdata; //指令码1
ZJ4=comdata; //指令码2
ZJ5=comdata; //数据码1
ZJ6=comdata; //数据码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;
data = RVX & 0xFF; //低八位给data,
data = RVX >> 8; //高八位给data。
data = RVY & 0xFF; //低八位给data,
data = RVY >> 8; //高八位给data。
data = s_w & 0xFF; //低八位给data,
data = s_w >> 8; //高八位给data。
data = SER & 0xFF; //低八位给data,
data = SER >> 8; //高八位给data。
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;
if(Mirf.dataReady()){ //等待接收数据准备好
Mirf.getData(data); //接收数据到data数组
//data<左移8位与data并,重组数据。
VRX = (unsigned int)((data << 8) | data);
VRY = (unsigned int)((data << 8) | data);
SW =(unsigned int)((data << 8) | data);
SER = (unsigned int)((data << 8) | data);
}
}
//------------------------------------------------
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);
}
页:
[1]