nuissq 发表于 2017-5-18 23:05:40

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]
查看完整版本: PELCO-D解码,遥控陀机云台