极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10586|回复: 4

【遥控器控制小车】Arduino如何获取遥控器平均数值?

[复制链接]
发表于 2015-7-30 13:56:50 | 显示全部楼层 |阅读模式
本帖最后由 dkm382638608 于 2015-8-14 20:36 编辑

因为我是通过获取遥控器的数值大小来控制电机正反转的,但是现在有个问题就是遥控器反馈的数据有时会夹杂着一两个不正常的数据,所有导致车子行走不稳定,求大神指点,是把获取的数据平均处理还是其他方法,求教!谢谢! 以下是所有源码!
需要的就拿去研究吧。

[pre lang="arduino" line="1" file="carppm"]
//read PPM signals from 2 channels of an RC reciever
//http://arduino.cc/forum/index.php/topic,42286.0.html

//把需要处理的接收机的两个通道分别接arduino的数字口2、3脚
//Most Arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3).
//The Arduino Mega has an additional four: numbers 2 (pin 21), 3 (pin 20), 4 (pin 19), and 5 (pin 18).
int ppm1 = 2;  
int ppm2 = 3;

unsigned long rc1_PulseStartTicks,rc2_PulseStartTicks;       
volatile int rc1_val, rc2_val;  

void setup() {
        Serial.begin(9600);  

        pinMode(4,OUTPUT);
        pinMode(5,OUTPUT);
        pinMode(6,OUTPUT);
        pinMode(7,OUTPUT);
        pinMode(8,OUTPUT);
        pinMode(9,OUTPUT);
        pinMode(10,OUTPUT);
        pinMode(11,OUTPUT);        
        
        //PPM inputs from RC receiver
        pinMode(ppm1, INPUT);
        pinMode(ppm2, INPUT);

        // 电平变化即触发中断
        attachInterrupt(0, rc1, CHANGE);   
        attachInterrupt(1, rc2, CHANGE);
}

void rc1()
{
        // did the pin change to high or low?
        if (digitalRead( ppm1 ) == HIGH)
                rc1_PulseStartTicks = micros();    // store the current micros() value
        else
                rc1_val = micros() - rc1_PulseStartTicks;
}

void rc2()
{
        // did the pin change to high or low?
        if (digitalRead( ppm2 ) == HIGH)
                rc2_PulseStartTicks = micros();   
        else
                rc2_val = micros() - rc2_PulseStartTicks;
}

void loop() {
          Serial.print("channel 1:  ");
        Serial.print(rc1_val);  
        Serial.print("        ");
        Serial.print("channel 2:  ");   
        Serial.println(rc2_val);  

if(rc2_val!=0)
{
  if(rc2_val>1900)
    {
      up();
    }
  if(rc2_val<1100)
    {
      dow();   
    }
}

if(rc1_val!=0)
{
  if(rc1_val>1900)
    {
      lef();
    }
  if(rc1_val<1100)
    {
      rig();
    }

}
if(rc1_val>1400 &&rc1_val<1600 &&rc2_val>1400 &&rc2_val<1600)
  {
    sto();
  }
}
void up()
{
    digitalWrite(4,HIGH);      
    digitalWrite(5,LOW);      
    digitalWrite(6,HIGH);   
    digitalWrite(7,LOW);      

    digitalWrite(8,HIGH);      
    digitalWrite(9,LOW);      
    digitalWrite(10,HIGH);   
    digitalWrite(11,LOW);
}
void dow()
{
    digitalWrite(4,LOW);      
    digitalWrite(5,HIGH);      
    digitalWrite(6,LOW);   
    digitalWrite(7,HIGH);      

    digitalWrite(8,LOW);      
    digitalWrite(9,HIGH);      
    digitalWrite(10,LOW);   
    digitalWrite(11,HIGH);   
}
void rig()
{
    digitalWrite(8,LOW);      
    digitalWrite(9,HIGH);      
    digitalWrite(10,HIGH);   
    digitalWrite(11,LOW);   
}
void lef()
{
    digitalWrite(8,HIGH);      
    digitalWrite(9,LOW);      
    digitalWrite(10,LOW);   
    digitalWrite(11,HIGH);     
}
void sto()
{
    digitalWrite(4,LOW);      
    digitalWrite(5,LOW);      
    digitalWrite(6,LOW);      
    digitalWrite(7,LOW);      
    digitalWrite(8,LOW);      
    digitalWrite(9,LOW);      
    digitalWrite(10,LOW);   
    digitalWrite(11,LOW);
}[/code]
回复

使用道具 举报

 楼主| 发表于 2015-7-30 13:58:06 | 显示全部楼层
六通的接受机+遥控
回复 支持 反对

使用道具 举报

发表于 2015-7-30 16:14:01 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-30 19:36:35 | 显示全部楼层
I-robofan 发表于 2015-7-30 16:14
滤波
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=7694&highlight=%C2%CB%B2%A8

太高深卡不懂= =
回复 支持 反对

使用道具 举报

发表于 2015-7-30 23:53:30 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-19 01:11 , Processed in 0.036947 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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