极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13520|回复: 0

PELCO-D解码,遥控陀机云台

[复制链接]
发表于 2017-5-18 23:05:40 | 显示全部楼层 |阅读模式
混论坛一段时间,看了各种教程,现把各种教程组合,做了个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);   
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 02:00 , Processed in 0.047930 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表