头像-24028

片片见真情

  • 上海市上海市
  • 单片机
  • 消费电子

个人成就

获得 0 次赞

帮助过0人

红外遥控小车遇到的问题,续2

继昨天的问题,今天又做了些测试,取得了一些进展,和大家分享。 依旧是昨天的装置 昨天把在测试红外控制马达的时候是一边用手抓着马达,一边用遥控器遥控,今天无意中把马达放下,手不碰它,再用遥控去控制,竟然发现可以成功控制马达的开和关了。 之后我又做了几个针对马达环境的实验,期间用了4.5V,6V,9V三种不同的B电源电压。 1、马达放在纸上,测试结果是三种电压都能接受的到红外信号,其中4.5V不会出现乱码,6V(次数少)和9V(次数少)均会出现乱码情况。 2、马达悬在空中什么也不接触,三种电压均能接受到红外信号,其中4.5V不会出现乱码,6V(次数少)和9V(次数多)会出现乱码。 3、放在电脑主机铁皮上,均能接受到红外信号,其中4.5V不会出现乱码,6V(次数少)和9V(次数少)均会出现乱码。 上述实验中,但凡我把一只手指轻轻按在马达上,则接收不到任何的红外信号,给人一种直观的感觉就是红外信号的接受与它所处的环境有关系。另外,我把A电源另外分出来接给马达(撤去B电源),也可以成功驱动马达的开和关。 请问为什么手放上去就接受不到红外信号呢?

红外遥控小车遇到的问题,续

这次我做了更加详细的实验,来继续寻找上一贴所未解决的问题。结果是依旧没能找到答案。求大家一起讨论。                                                实物图                                电路简化图(未包括监测灯部分) 问题:想用红外遥控简单的操控马达的开始和停止。用的是ARDUINO。 当按下开始键时,马达顺利工作,但是当按下停止键时,没有反应了。通过设置检测灯发现了原因是这样的:当按下开始键,红外接收端成功接收到正确编码,并成功指导L298n工作。但是自此后无论按下停止键还是开始键,红外接收端接收不到任何红外信号。    对此情况做的几个尝试性的实验: 1、当马达告诉运转的时候,用手强制按住马达使之不能动,此时红外遥控回复正常。 2、把马达从电路中拔掉,红外控制一切正常。 3、用一个与马达电阻相同的1欧电阻代替马达接入马达输出端。电阻开始发热,此时红外控制一切正常。(由此猜测是马达的问题,不知道对不对) 4、把开发板的地与电机电源的地分开接,问题依旧存在。 5、去除L298N模块,去掉单片机对马达的控制,直接在把6V的直流电接入马达,让它告诉运转。同时开启单片机,通过观察监测灯观察红外控制,发现一切正常(由此排除了是马达运转造成的电磁干扰)。 6、用两块开发板,一块专门用来做红外测试,一块用来通过L298n使马达工作,结果发现当马达工作的时候,红外控制一切正常(故排除了是L298N本身造成的电磁干扰) 个人猜想:会不会是马达的问题,因为我之前有用红外通过ULN2003成功控制过步进电机,这回换了个马达就不行了。真心求教!!!

自制红外遥控小车遇到的问题

我用的是arduino开发板,遇到的问题总结起来有两个 第一次,我把单片机控制端和汽车动力马达的电源公用,简易电路图如图1,最后我发现当我按下遥控器的开始键(将连接ULN2003的I/0口置1)启动电机以后,电机正常工作,之后当我按下停止键(。。。置0),电机不能正常停下来,而是一直工作,我用串口助手检测单片机收到的代码,发现按下开始键的时候,接受到的代码正确,之后按下停止键,则每按一次,收到的代码均不一样,所以不能使电机停下来。 最后我把电机的电源给切掉,只让红外收发装置工作,发现一切正常,均能收到正确的代码。 请问电机是如何影响红外接收器接收代码的?求教。。 第二次,我用两个独立电源,分别驱动单片机模块和电机马达模块,简易如图2。结果如下:当B电源电压不高(如3V)的时候(马达转速慢),红外遥控运行正常,能正常开始和停止。但是当电源电压很大(如>5V)的时候,出现了能正常控制它开始,却停不下来(按停止键没用)的现象。而当我用手强制让轮子停下来,再按停止键的时候,又能正常停止,仿佛和马达的转速有关,慢的时候正常控制,快的时候只能开不能停。这是什么原因呢?求指教。。 不好意思啊 因为在百度我也问了 所以直接COPY过来了

ULN2003是如何实现对输入电压放大的

如图所以 该图表示的是用ULN2003驱动直流电机。 我用万用表测量了几个点的电压值(与接GND的电压差)。已经用红笔圈起来了。 另我不解的是不是说UNL2003能放大电压吗,但是我测量到的是51单片机I/0出来的5V电压经过ULN2003以后反而变小(0.02V)了。这该怎么解释啊。这里VCC都是稳定的5V。

求救:红外控制28BYJ-48

如标题,我想用红外遥控器实现控制28BYJ-48电机 正转 反转 停止 三个功能。 但实际效果是遥控器按下去以后电机只工作了一会,之后就停下来了,再按其他键也没有反应。 反复琢磨自己的程序,都觉得没有问题。 故想请大家帮我看看到底是哪里出错了。 #include sbit A1=P3^0;    sbit B1=P3^1; sbit C1=P3^2; sbit D1=P3^3;      //A1-D1 分别是电机的四个接口,我是通过ULN2003来实现对单片机I/0口输出电压的放大,之后再接给电机。 unsigned char time; bit n; bit m; unsigned char a[33]; unsigned char b[4]; unsigned char i=0; unsigned char code display[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; bit startflag; unsigned char time;    //用于定时器中断的时间记录 bit n;                           //外部中断 判别标志 1表示中断发生 bit m; unsigned char a[33];   //红外接收的33个中断信号 unsigned char b[4];    //解码后的 分别对应引导码 客户码 操作码 操作反码 unsigned char i=0;  void DelayUs2x(unsigned char t)     //延时函数 {     while(--t); } void DelayMs(unsigned char t)    //延时函数 {        while(t--)  {      //大致延时1mS      DelayUs2x(245); DelayUs2x(245);  } void timer_inital()     //定时器初始化 { ET0=1; TMOD=0x02; EA=1; TH0=0; TL0=0; TR0=1; } void EX0_inital()   //外部中断初始化 { EA=1; EX0=1; IT0=1; } void EXO(void)interrupt 0    //外部中断函数 1、把每次中断所用的时间记录到了a[33]里面,以便之后的解码  2、把n置为1来标志中断 { if(startflag)                             {     if(time=33)    //引导码 遥控器的头码,9ms+4.5ms                         i=0;     a[i]=time;                         //存储每个电平的持续时间,用于以后判断是0还是1     time=0;     i++;     if(i==33)       {   n=1 ; i=0; startflag=0; m=1;       }    }   else { time=0; startflag=1; } } void timer(void)interrupt 1         //计时器中断函数 记录时间用 { time++; } void codetransmit()                  //解码函数 解码以后的8为二进制存入b[4]中 { unsigned char j,k,l,y; l=1; for(j=0;j=1; if(a[l]>7)   y=y|0x80; l++;  }   b[j]=y;      y=0;   } } void step1()                           //电机工作函数 { A1=1;B1=0;C1=0;D1=0; } void step2()                       //电机工作函数 { A1=0;B1=1;C1=0;D1=0; } void step3()                      //电机工作函数 { A1=0;B1=0;C1=1;D1=0; } void step4()                     //电机工作函数 { A1=0;B1=0;C1=0;D1=1; } void machine1()             //电机工作函数 正转 { step1();DelayMs(5); step2();DelayMs(5); step3();DelayMs(5); step4();DelayMs(5); } void machine2()             //电机工作函数 倒转 { step4();DelayMs(5); step3();DelayMs(5); step2();DelayMs(5); step1();DelayMs(5); } void machinestop()       //电机工作函数 停止 { A1=0;B1=0;C1=0;D1=0;DelayMs(5); } void work(unsigned char value)    //电机工作 { switch(value)    { case 0x44:             //转码后如果是0x44,则正转              m=0;              machine1();              if(m==1)         //我检查过,发现这里m的值在刚开始的时候为0,当电机停止的时候就置1了,所以电机不会工作了。但是我                                        怎么都想不通这里m怎么会置1的,又没有发生中断,只有中断发生的时候m才被置1啊。                  n=1;              else                  n=0;              break; case 0x40:                   //转码后如果是0x40,则倒转             m=0;             machine2();             if(m==1)               n=1;             else                n=0;             break; case 0x43:                   //转码后如果是0x43,则停止             m=0;             machinestop();             if(m==1)                n=1;            else                n=0;            break; default:break;    } } void main() { unsigned char value; timer_inital(); EX0_inital(); while(1)   {    if(n==1)        {         codetransmit();         value=b[2];         }    work(value);    DelayMs(5);   } }