ESP8266读取枪控ppm信号远程控制RC小车

**ESP8266读取ppm信号方法,远程玩具车专用
底部的代码是:读取接收机的PWM信号,再发送到服务器的中转的 **

下面的代码是可以读取到小飞象枪控或者麦克遥控器的PPM信号的.亲测有效.

这个代码不同于直接读取遥控接收机的PWM信号,而是直接使用音频线的方法读取PPM.高手自己将读取的数据发送到服务器.

我们使用免费的然也物联,也可以自己搭建EMQ的MQTT协议服务器作为中转.

服务器不会搭建的,可以找我

我们公开下面的代码是希望在采集就不会的人,大部分将采集到的数据发送到服务器是没问题的.
比如我们做过ESP8266读取小飞象X6枪控的PPM,然后发送到服务器,远程控制RC玩具车.实时性很高的.

需要完整可以远控的源代码也可以

int datachan[4][8];//建立二维数组
int x, y, chx;
int channel[8];//要输出的数组
void dataget();//获取PPM函数
void channelprint();//处理原始PPM信号的函数

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  // Serial.println(pulseIn(14, HIGH));
  dataget();
  channelprint();
  for (int i = 0; i < 8; i++) {
    Serial.println(channel[i]);//以数组形式输出最终信号
  }
  Serial.println("");
}

void dataget() {//接收PPM信号录入datachan数组----2号引脚
  while (pulseIn(5, HIGH) < 5000) {}
  for (y = 0; y < 4; y++) {
    while (pulseIn(5, HIGH) < 5000) {}
    for (x = 0; x < 8; x++){
      datachan[y][x] = pulseIn(5, HIGH);
    }
  }
}

void channelprint(){//接收到的PPM信号处理对求平均
  int i=0,sum=0;
  for(x=0;x<8;x++){
    for(y=0;y<4;y++){
      sum=sum+datachan[y][x];
      chx=sum/4;
      sum=0;
      channel[i]=chx;
      i++;
    }
  }
}

既然都说到这里了,我的伙伴们做的另一份代码,也将公之于众.

他就是刚才说的,是读取接收机的PWM信号,再发送到服务器的中转的.
读取端代码如下:
如果您说代码不可用,请打死我,谢谢

#include 
#include 
#include

#include 
#include 
#include 
// 设置wifi接入信息(根据小车要连接的WiFi信息进行修改)
WiFiServer server(80);

//MQTT服务器可以自己搭建EMQ,也可以用免费的然也物联(有点延迟、测试期推荐)
const char* mqttServer = "您服务器的公网ip";
String topicString = "ES001";//这个是订阅号,请务必保持和接收端一致

//一共修改3个地方1-服务器公网ip  2-订阅号  3-端口号(1883)
//还不会:这一串看得懂不??
//      1
//      7
//      7
//      7
//      6
//      4
//      0
//      0
//      8
//      3
//      9
Servo servoA;
Servo servoB;
Servo servoC;
//volatile uint16_t values[6] = {90};
int Avalue=90;
int Bvalue=90;
int Cvalue=90;

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);

void setup() {
  Serial.begin(115200);               // 启动串口通讯(波特率为115200,波特率可以理解为串口传输数据的速度)
  pinMode(05,OUTPUT);
  pinMode(04,OUTPUT);
  pinMode(00,OUTPUT);
//  pinMode(15,OUTPUT);
//  pinMode(13,OUTPUT);
//  pinMode(12,OUTPUT);
  
  LED();
  
  servoA.attach(05,500,2500);
  servoA.write(90);
      
  servoB.attach(04);
  servoB.write(90);
      
  servoC.attach(00,500,2500);
  servoC.write(0);
      

  
  WiFiManager wifiManager;
  wifiManager.autoConnect("车辆接收端配网");
  Serial.println("Connected.");
  server.begin();
  
  WiFi.mode(WIFI_STA);  //设置ESP8266工作模式为无线终端模式(8266像手机一样连接到wifi的模式)
  connectWifi();  // 连接WiFi
  mqttClient.setServer(mqttServer, 1883);// 设置MQTT服务器和端口号
  mqttClient.setCallback(receiveCallback);// 设置MQTT订阅回调函数
  connectMQTTserver();// 连接MQTT服务器
}

void loop() {
  if (mqttClient.connected()) { // 如果开发板成功连接服务器
    mqttClient.loop();          // 处理信息以及心跳
  } else {                      // 如果开发板未能成功连接服务器
    //Stop();
    connectMQTTserver();        // 则尝试连接服务器
  }


  
}

// 连接MQTT服务器并订阅信息
void connectMQTTserver() {
  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
  String clientId = "esp8266-" + WiFi.macAddress();

  // 连接MQTT服务器
  if (mqttClient.connect(clientId.c_str())) {
    Serial.println("MQTT Server Connected.");
    Serial.println("Server Address:");
    Serial.println(mqttServer);
    Serial.println("ClientId: ");
    Serial.println(clientId);
    subscribeTopic(); // 订阅指定主题
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    //Stop();
    delay(5000);
  }
}

// 收到信息后的回调函数
char AA[4],BB[4],CC[4],DD[4],EE[4],FF[4];//储存接受到的油门和方向数据

int Alocation,Blocation,Clocation,Dlocation,Elocation,Flocation;

int TD1,TD2,TD3,TD4,TD5,TD6;  //CH1 CH2 CH3 CH4 CH5 CH6

void receiveCallback(char* topic, byte* payload, unsigned int length) {
  
  int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,I=0,j=0;
  analogWrite(02,180);
  for ( int i = 0; i <5; i++) //CH1
  {
    if ((char)payload[i]!='A')
    {
      AA[a]=(char)payload[i];
      a+=1;
    }
     else
     {
       Blocation=i;
       break;
     }
   }
   
   for (int i = Blocation+1; i < length; i++) //CH2
   {
     if ((char)payload[i]!='B')
     {
        BB[b]=(char)payload[i];
        b+=1;
     }
     else
     {
        Clocation=i;
        break;
     }
    }

    for (int i = Clocation+1; i < length; i++) //CH3
   {
     if ((char)payload[i]!='C')
     {
        CC[c]=(char)payload[i];
        c+=1;
     }
     else
     {
        Dlocation=i;
        break;
     }
    }

    for (int i = Dlocation+1; i < length; i++) //CH4
   {
     if ((char)payload[i]!='D')
     {
        DD[d]=(char)payload[i];
        d+=1;
     }
     else
     {
        Elocation=i;
        break;
     }
    }

    for (int i = Elocation+1; i < length; i++) //CH5
   {
     if ((char)payload[i]!='E')
     {
        EE[e]=(char)payload[i];
        e+=1;
     }
     else
     {
        Flocation=i;
        break;
     }
    }

    for (int i = Flocation+1; i < length; i++) //CH6
   {
     if ((char)payload[i]!='F')
     {
        FF[f]=(char)payload[i];
        f+=1;
     }
     else
     {
        break;
     }
    }

    TD1=String(AA).toInt();

    Avalue=TD1;
    
    TD2=String(BB).toInt();

    Bvalue=TD2;
    
    TD3=String(CC).toInt();  

    Cvalue=TD3;
    

Serial.print(Avalue);
Serial.print("\t");
Serial.print(Bvalue);
Serial.print("\t");
Serial.print(Cvalue);
Serial.println();
Go();
  for (int i = 0; i < 3; i++) 
  {  
      AA[i]='\0';
      BB[i]='\0';
      CC[i]='\0';
      DD[i]='\0';
      EE[i]='\0';
      FF[i]='\0';
  } 
  analogWrite(02,0);
}

// 订阅指定主题
void subscribeTopic() {
  char subTopic[topicString.length() + 1];
  strcpy(subTopic, topicString.c_str());
  if (mqttClient.subscribe(subTopic)) {
    Serial.println("Subscrib Topic:");
    Serial.println(subTopic);
    analogWrite(02,180);
  } else {
    Serial.print("Subscribe Fail...");
    analogWrite(02,0);
   // Stop();
  }
}

void connectWifi() {
  //WiFi.begin(ssid, password);
  //等待WiFi连接,成功连接后输出成功信息
  while (WiFi.status() != WL_CONNECTED) {
    analogWrite(02,0);
    delay(1000);  
    //Stop();
    Serial.print(".");
    analogWrite(02,180);
  }
  Serial.println("");
  Serial.println("WiFi Connected!");
  Serial.println("");
  analogWrite(02,180);
}
void Go(){
  servoA.write(Avalue);
  servoB.write(Bvalue);
  servoC.write(Cvalue);
}

void LED()
{
  analogWrite(02,0);
  for(int i=0;i<=150;i++)
  {
    analogWrite(02,i);
    delay(20);
  }
  for(int i=150;i>=0;i-=2)
  {
    analogWrite(02,i);
    delay(20);
  }
  for(int i=0;i<3;i++)
  {
    analogWrite(02,0);
    delay(180);
    analogWrite(02,180);
    delay(180);
  }
  analogWrite(02,0);
}

这个代码就是用WEB配网的,啥意思呢?就是烧录以后,手机打开WIFI列表:接收机配网
看见这个WIFI,点击配网就行。

小白发现以上代码用不了,原因是有2个库你没有安装
1-WiFiManager.h
2-PubSubClient.h
玩过arduino的都知道怎么去管理库找来安装,WiFiManager.h这个库有点麻烦,但是他是太极创客团队汉化的,当然也有英文版的,想研究透彻就百度:太极创客 进去搜WiFiManager 人家课程保姆式的。

下面安排8266的代码,这个8266做读取接收机的

#include 
#include 

#include 
#include 
#include 

//MQTT服务器地址:broker.hivemq.com   test.ranye-iot.net
const char* mqttServer = "您的公网服务器ip";
String topicString = "ES001";//订阅号,务必和发射端一致

const int CH1=05;    //接收机1通道 
const int CH2=04;    //接收机2通道 
const int CH3=15;    //接收机3通道 
const int CH4=13;    //接收机4通道 
const int CH5=12;    //接收机5通道 
const int CH6=14;    //接收机6通道 

int A,B,C,D,E,F;
 
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
 
void setup() {
  Serial.begin(115200);

  pinMode(CH1,INPUT);
  pinMode(CH2,INPUT);
  pinMode(CH3,INPUT);
  pinMode(CH4,INPUT);
  pinMode(CH5,INPUT);
  pinMode(CH6,INPUT);

  LED();
  analogWrite(16,180);// 电源指示灯
  WiFiManager wifiManager;
  wifiManager.autoConnect("遥控器发射端配网");
  Serial.println("Connected.");
  
  WiFi.mode(WIFI_STA);
  connectWifi();
  mqttClient.setServer(mqttServer, 1883);
  connectMQTTServer();
}
 
void loop() { 
  if (mqttClient.connected()) 
  { 
      // 如果开发板成功连接服务器
      pubMQTTmsg();
      analogWrite(02,180);
      // 保持心跳
      mqttClient.loop();
  } else {     
    analogWrite(02,0);
    connectMQTTServer();   
  }
}
 
void connectMQTTServer(){
  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
  String clientId = "esp8266-" + WiFi.macAddress();
 
  // 连接MQTT服务器
  if (mqttClient.connect(clientId.c_str())) { 
    Serial.println("MQTT Server Connected.");
    Serial.println("Server Address: ");
    Serial.println(mqttServer);
    Serial.println("ClientId:");
    Serial.println(clientId);
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    delay(3000);
  }   
}
 
// 发布信息
void pubMQTTmsg(){
  static int value; // 客户端发布信息用数字
  char publishTopic[topicString.length() + 1];  
  strcpy(publishTopic, topicString.c_str());

  A=pulseIn(CH1,HIGH);
  A=map(A/10,100,200,0,180);
  if(A<=0){
    A=0;  
  }else if(A>=180){
    A=180;  
  }
  
  B=pulseIn(CH2,HIGH);
  B=map(B/10,100,200,0,180);
  if(B<=0){
    B=0;  
  }else if(B>=180){
    B=180;  
  }
  
  C=pulseIn(CH3,HIGH);
  C=map(C/10,100,200,0,180);
  if(C<180){
    C=0;
  }else{
    C=180;
  }
  
//  D=pulseIn(CH4,HIGH);
//  D=map(D/10,100,200,0,180);
  D=90;
  if(D<90){
    D=0;
  }else if(D>=90&&D<180){
    D=90;
  }else{
    D=180;  
  }
  
//  E=pulseIn(CH5,HIGH);
//  E=map(E/10,100,200,0,180);
  E=90;
  if(E<0){
    E=0;
  }
  
//  F=pulseIn(CH6,HIGH);
//  F=map(F/10,100,200,0,180);
  F=90;
  if(F<0){
    F=0;
  }
    
  // 建立发布信息。信息内容以Hello World为起始,后面添加发布次数。
  String messageString = String(A)+"A"+String(B)+"B"+String(C)+"C"+String(D)+"D"+String(E)+"E"+String(F)+"F";  
  char publishMsg[messageString.length() + 1];   
  strcpy(publishMsg, messageString.c_str());
  
  // 实现ESP8266向主题发布信息
  if(mqttClient.publish(publishTopic, publishMsg)){
    Serial.println(publishMsg); 
    analogWrite(02,180);
    delay(30);
    analogWrite(02,0);
    delay(30); 
    analogWrite(02,180); 
    delay(30);
    analogWrite(02,0);
    delay(30);   
  } else {
    Serial.println("Message Publish Failed."); 
    analogWrite(02,0);
  }
}
 
// ESP8266连接wifi
void connectWifi(){
 
  //WiFi.begin(ssid, password);
 
  //等待WiFi连接,成功连接后输出成功信息
  while (WiFi.status() != WL_CONNECTED) {
    analogWrite(00,0);
    delay(1000);
    analogWrite(00,180);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Connected!");  
  analogWrite(00,180);
  Serial.println(""); 
}
void LED()
{
  analogWrite(16,0);
  analogWrite(00,0);
  analogWrite(02,0);
  for(int i=0;i<=150;i++)
  {
    analogWrite(16,i);
    analogWrite(00,i);
    analogWrite(02,i);
    delay(20);
  }
  for(int i=150;i>=0;i-=2)
  {
    analogWrite(16,i);
    analogWrite(00,i);
    analogWrite(02,i);
    delay(20);
  }
  for(int i=0;i<3;i++)
  {
    analogWrite(16,0);
    analogWrite(00,0);
    analogWrite(02,0);
    delay(180);
    analogWrite(16,180);
    analogWrite(00,180);
    analogWrite(02,180);
    delay(180);
  }
  analogWrite(16,0);
  analogWrite(00,0);
  analogWrite(02,0);
  
}
//还不会:这一串看得懂不??
//      1
//      7
//      7
//      7
//      6
//      4
//      0
//      0
//      8
//      3
//      9

以上代码亲测可用,假代码请打死我,谢谢

如果您想要ESP8266通过音频线读取PPM波的版本:接通暗号在代码中

和大仙网控一样的,电路也可以给你提供,插上音频线自动开机,取下自动关机。

代码多的很,先分享到这里

什么8266远程控制8266之类的

ESP32控制8266之类的,摇杆手柄,按键手柄我都有

话不多说,技术交流:接通暗号在代码中

你可能感兴趣的:(物联网)