arduino uno IR 接收器电机控制
Posted
技术标签:
【中文标题】arduino uno IR 接收器电机控制【英文标题】:arduino uno IR receiver motor control 【发布时间】:2015-05-26 12:41:41 【问题描述】:您好,我是新来的,并且已经在寻找解决此问题的方法,但似乎是独一无二的。
我有一个 arduino uno,我想通过红外遥控器无线控制多个直流电机的速度和方向。我已经设法连接了一个电机并通过按遥控器上的一个按钮让 arduino 将其打开,但是我无法通过按另一个按钮来关闭它。当我打开 arduino 的串行监视器时会发生什么,它识别出第一个 IR 信号并打开电机。然而,当电机旋转时(并且仅在电机旋转时),arduino 会检测到无穷无尽的 IR 信号流,这些信号会阻止 arduino 接收任何真实信号。即使将 IR 接收器从电路中拔出,也会发生这种情况。我正在使用模拟写入()函数来打开电机,如果我将脉冲降低到足以使电机不转动(但发出噪音),它可以用遥控器启动和停止,因为它不转动,因此不会使 arduino 接收红外信号。如果我使脉冲足够低,我可以强行停止电机,IR 信号就会停止。
我不知道发生了什么,并尝试更改我的代码和电路。
这是我正在使用的代码 - 我从 adafruit 复制并修改了一个读取 IR 命令的代码。
/* Raw IR commander
This sketch/program uses the Arduno and a PNA4602 to
decode IR received. It then attempts to match it to a previously
recorded IR signal
Code is public domain, check out www.ladyada.net and adafruit.com
for more tutorials!
*/
// We need to use the 'raw' pin reading methods
// because timing is very important here and the digitalRead()
// procedure is slower!
//uint8_t IRpin = 2;
// Digital pin #2 is the same as Pin D2 see
// http://arduino.cc/en/Hacking/PinMapping168 for the 'raw' pin mapping
#define IRpin_PIN PIND
#define IRpin 2
// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define MAXPULSE 65000
#define NUMPULSES 50
// what our timing resolution should be, larger is better
// as its more 'precise' - but too large and you wont get
// accurate timing
#define RESOLUTION 20
// What percent we will allow in variation to match the same code
#define FUZZINESS 20
// we will store up to 100 pulse pairs (this is -a lot-)
uint16_t pulses[NUMPULSES][2]; // pair is high and low pulse
uint8_t currentpulse = 0; // index for pulses we're storing
#include "own_codes.h"
int numberpulses = 0;
int a;
void setup(void)
Serial.begin(9600);
Serial.println("Ready to decode IR!");
void loop(void)
numberpulses = listenForIR();
Serial.print("Heard ");
Serial.print(numberpulses);
Serial.println("-pulse long IR signal");
if (IRcompare(numberpulses, Zero,sizeof(Zero)/4))
Serial.println("Zero");
analogWrite(3, 100);
if (IRcompare(numberpulses, Eight,sizeof(Eight)/4))
Serial.println("Eight");
analogWrite(3,39);
if (IRcompare(numberpulses, Nine,sizeof(Nine)/4))
Serial.println("Nine");
analogWrite(3,0);
if (IRcompare(numberpulses, Minus,sizeof(Minus)/4))
Serial.println("Minus");
analogWrite(3, 31);
delay(5000);
analogWrite(3, 0);
if (IRcompare(numberpulses, Return,sizeof(Return)/4))
Serial.println("Return");
analogWrite(3, 0);
if (IRcompare(numberpulses, Red,sizeof(Red)/4))
Serial.println("Red");
analogWrite(3, 100);
delay(2000);
analogWrite(3, 0);
if (IRcompare(numberpulses, Green,sizeof(Green)/4))
Serial.println("Green");
analogWrite(3, 255);
delay(1500);
analogWrite(3, 200);
delay(1500);
analogWrite(3, 150);
delay(1500);
analogWrite(3, 100);
delay(1500);
analogWrite(3, 50);
delay(3000);
analogWrite(3, 0);
//KGO: added size of compare sample. Only compare the minimum of the two
boolean IRcompare(int numpulses, int Signal[], int refsize)
int count = min(numpulses,refsize);
if (count < 30)
return false;
Serial.print("count set to: ");
Serial.println(count);
for (int i=0; i< count-1; i++)
int oncode = pulses[i][1] * RESOLUTION / 10;
int offcode = pulses[i+1][0] * RESOLUTION / 10;
#ifdef DEBUG
Serial.print(oncode); // the ON signal we heard
Serial.print(" - ");
Serial.print(Signal[i*2 + 0]); // the ON signal we want
#endif
// check to make sure the error is less than FUZZINESS percent
if ( abs(oncode - Signal[i*2 + 0]) <= (Signal[i*2 + 0] * FUZZINESS / 100))
#ifdef DEBUG
Serial.print(" (ok)");
#endif
else
#ifdef DEBUG
Serial.print(" (x)");
#endif
// we didn't match perfectly, return a false match
return false;
#ifdef DEBUG
Serial.print(" \t"); // tab
Serial.print(offcode); // the OFF signal we heard
Serial.print(" - ");
Serial.print(Signal[i*2 + 1]); // the OFF signal we want
#endif
if ( abs(offcode - Signal[i*2 + 1]) <= (Signal[i*2 + 1] * FUZZINESS / 100))
#ifdef DEBUG
Serial.print(" (ok)");
#endif
else
#ifdef DEBUG
Serial.print(" (x)");
#endif
// we didn't match perfectly, return a false match
return false;
#ifdef DEBUG
Serial.println();
#endif
// Everything matched!
return true;
int listenForIR(void)
currentpulse = 0;
while (1)
uint16_t highpulse, lowpulse; // temporary storage timing
highpulse = lowpulse = 0; // start out with no pulse length
// while (digitalRead(IRpin)) // this is too slow!
while (IRpin_PIN & (1 << IRpin))
// pin is still HIGH
// count off another few microseconds
highpulse++;
delayMicroseconds(RESOLUTION);
// If the pulse is too long, we 'timed out' - either nothing
// was received or the code is finished, so print what
// we've grabbed so far, and then reset
// KGO: Added check for end of receive buffer
if (((highpulse >= MAXPULSE) && (currentpulse != 0))|| currentpulse == NUMPULSES)
return currentpulse;
// we didn't time out so lets stash the reading
pulses[currentpulse][0] = highpulse;
// same as above
while (! (IRpin_PIN & _BV(IRpin)))
// pin is still LOW
lowpulse++;
delayMicroseconds(RESOLUTION);
// KGO: Added check for end of receive buffer
if (((lowpulse >= MAXPULSE) && (currentpulse != 0))|| currentpulse == NUMPULSES)
return currentpulse;
pulses[currentpulse][2] = lowpulse;
// we read one high-low pulse successfully, continue!
currentpulse++;
void printpulses(void)
Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
for (uint8_t i = 0; i < currentpulse; i++)
Serial.print(pulses[i][0] * RESOLUTION, DEC);
Serial.print(" usec, ");
Serial.print(pulses[i][3] * RESOLUTION, DEC);
Serial.println(" usec");
// print it in a 'array' format
Serial.println("int IRsignal[] = ");
Serial.println("// ON, OFF (in 10's of microseconds)");
for (uint8_t i = 0; i < currentpulse-1; i++)
Serial.print("\t"); // tab
Serial.print(pulses[i][4] * RESOLUTION / 10, DEC);
Serial.print(", ");
Serial.print(pulses[i+1][0] * RESOLUTION / 10, DEC);
Serial.println(",");
Serial.print("\t"); // tab
Serial.print(pulses[currentpulse-1][5] * RESOLUTION / 10, DEC);
Serial.print(", 0;");
这里是电路图片的链接,我将红外接收器电路与电机电路结合在一起。 (我不允许直接发布图片)
红外接收器:https://learn.adafruit.com/system/assets/assets/000/000/555/medium800/light_arduinopna4602.gif?1396763990
电机电路: http://cdn.instructables.com/F9L/KDFG/GU7FXUMH/F9LKDFGGU7FXUMH.MEDIUM.jpg
任何帮助将不胜感激,谢谢。
【问题讨论】:
【参考方案1】:以下是有关电机干扰的一些信息:
http://forum.allaboutcircuits.com/threads/stop-noise-from-motor-to-arduino-mcu.90733/
http://forum.arduino.cc/index.php?topic=60247.0
【讨论】:
以上是关于arduino uno IR 接收器电机控制的主要内容,如果未能解决你的问题,请参考以下文章
Arduino UNO利用电位器模拟输量输入控制步进电机调速
使用 H-Bridge 和 neopixel 以及 Arduino UNO 控制直流电机
Proteus仿真Arduino UNO+ uln2003驱动步进电机+按键启保停控制