[经验] 【Landzo C1试用体验】-抓住电机旋转不正常的元凶,原来是它搞的鬼!

[复制链接]

技术员

发表于 2016-6-16 22:25:53   893 查看 5 回复 显示全部楼层 倒序浏览
分享
本帖最后由 liuxing4585 于 2016-6-16 22:31 编辑

上一篇中,刚子根据网上的例程,调用Servo.h实现了舵机的旋转和角度控制,根据接口板上的标示,使用的是D10做信号线,这次实验想学习一下电机的旋转控制。
最初的想法是在上一期舵机程序上增加,看到接口板上的接口是D6 D9 D3 D5四个引脚来控制电机驱动芯片:L9110S,先来点资料,看看怎么控制。
360截图20160616210954919.jpg

360截图20160616211010119.jpg

360截图20160616211027846.jpg

360截图20160616211038118.jpg

360截图20160616211055451.jpg

根据Arduino的资料,可知道D3 D5 D6 D9均为PWM输出口,可以实现电机调速,因此编写了一下程序,想实现电机正转3秒-停1秒-反转3秒-停1秒,不断循环。代码如下:
  1. #include <Servo.h>
  2. Servo myservo;  //创建一个舵机控制对象
  3.                           // 使用Servo类最多可以控制8个舵机
  4. int pos = 0;    // 该变量用与存储舵机角度位置

  5. void setup()
  6. {
  7.   myservo.attach(10);  // 该舵机由arduino第10脚控制
  8.    for(pos = 98; pos < 180; pos += 1)  // 从0度到180度运动
  9.   {                                                     // 每次步进一度
  10.     myservo.write(pos);        // 指定舵机转向的角度
  11.     delay(15);                       // 等待15ms让舵机到达指定位置
  12.   }
  13.   for(pos = 180; pos>=1; pos-=1)   //从180度到0度运动  
  14.   {                                
  15.     myservo.write(pos);         // 指定舵机转向的角度
  16.     delay(15);                        // 等待15ms让舵机到达指定位置
  17.   }
  18.    for(pos = 0; pos < 98; pos += 1)  // 从0度到180度运动
  19.   {                                                     // 每次步进一度
  20.     myservo.write(pos);        // 指定舵机转向的角度
  21.     delay(15);                       // 等待15ms让舵机到达指定位置
  22.   }
  23. pinMode( 3, OUTPUT);
  24. pinMode( 6, OUTPUT);
  25. pinMode( 5, OUTPUT);
  26. pinMode( 9, OUTPUT);
  27. }

  28. void loop()
  29. {
  30. analogWrite(3 , 0);
  31. analogWrite(5 , 200);
  32.   analogWrite(6 , 200);
  33.   analogWrite(9 , 0);
  34.   delay( 3000 );
  35. analogWrite(3 , 0);
  36. analogWrite(5 , 0);
  37.   analogWrite(6 , 0);
  38.   analogWrite(9 , 0);
  39.   delay( 500 );
  40.   analogWrite(3 , 200);
  41.   analogWrite(5 , 0);
  42.   analogWrite(6 , 0);
  43.   analogWrite(9 , 200);
  44. delay( 3000 );
  45. analogWrite(3 , 0);
  46. analogWrite(5 , 0);
  47.   analogWrite(6 , 0);
  48.   analogWrite(9 , 0);
  49.   delay( 500 );
  50. }
复制代码
可是电机转起来却不太正常,D9所控制的电机只能单方向旋转,刚开始以为是电机驱动模块有问题,于是将D9接LED指示灯,发现LED闪烁也不正常,观察控制引脚输出指示灯,发现输出不正常。因此确定是D9引脚的问题。
将舵机代码注释掉,发现旋转正常了。原来是Servo类搞的鬼,它把D9 D10都控制了。
回头仔细看Servo的说明,
1.servo类成员函数
函数
说明
attach()
设定舵机的接口,只有9或10接口可利用。
write()
用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°。
writeMicroseconds() 
用于设定舵机旋转角度的语句,直接用微秒作为参数。
read()
用于读取舵机角度的语句,可理解为读取最后一条write()命令中的值。
attached()
判断舵机参数是否已发送到舵机所在接口。
detach()
使舵机与其接口分离,该接口(9或10)可继续被用作PWM接口。

原来是没使用detach()进行接口分离,加进程序试一下。
myservo.detach();//释放供电机PWM使用
发现没有作用。。。
  1. #include <Servo.h>
  2. Servo myservo;  //创建一个舵机控制对象
  3.                           // 使用Servo类最多可以控制8个舵机
  4. int pos = 0;    // 该变量用与存储舵机角度位置

  5. void setup()
  6. {
  7.   myservo.attach(10);  // 该舵机由arduino第10脚控制

  8.    for(pos = 98; pos < 180; pos += 1)  // 从0度到180度运动
  9.   {                                                     // 每次步进一度
  10.     myservo.write(pos);        // 指定舵机转向的角度
  11.     delay(15);                       // 等待15ms让舵机到达指定位置
  12.   }
  13.   for(pos = 180; pos>=1; pos-=1)   //从180度到0度运动  
  14.   {                                
  15.     myservo.write(pos);         // 指定舵机转向的角度
  16.     delay(15);                        // 等待15ms让舵机到达指定位置
  17.   }
  18.    for(pos = 0; pos < 98; pos += 1)  // 从0度到180度运动
  19.   {                                                     // 每次步进一度
  20.     myservo.write(pos);        // 指定舵机转向的角度
  21.     delay(15);                       // 等待15ms让舵机到达指定位置
  22.   }
  23.    myservo.detach();//释放9脚供电机使用
  24. pinMode( 3, OUTPUT);
  25. pinMode( 6, OUTPUT);
  26. pinMode( 5, OUTPUT);
  27. pinMode( 9, OUTPUT);
  28. }

  29. void loop()
  30. {
  31. analogWrite(3 , 0);
  32. analogWrite(5 , 200);
  33.   analogWrite(6 , 200);
  34.   analogWrite(9 , 0);
  35.   delay( 3000 );
  36. analogWrite(3 , 0);
  37. analogWrite(5 , 0);
  38.   analogWrite(6 , 0);
  39.   analogWrite(9 , 0);
  40.   delay( 500 );
  41.   analogWrite(3 , 200);
  42.   analogWrite(5 , 0);
  43.   analogWrite(6 , 0);
  44.   analogWrite(9 , 200);
  45. delay( 3000 );
  46. analogWrite(3 , 0);
  47. analogWrite(5 , 0);
  48.   analogWrite(6 , 0);
  49.   analogWrite(9 , 0);
  50.   delay( 500 );
  51. }
复制代码
完全注释掉舵机程序,电机能够正常动作了。看来还得重新研究舵机控制方式了。使用从网络上找到的例程试一下,
  1. #include <Servo.h>
  2. Servo myservo;  //创建一个舵机控制对象
  3.                           // 使用Servo类最多可以控制8个舵机
  4. int pos = 0;    // 该变量用与存储舵机角度位置
  5. int sp1=10;//定义舵机接口数字接口7
  6. int pulsewidth;//定义脉宽变量
  7. int val;
  8. int val1;
  9. int myangle1;
  10. void servopulse(int sp1,int val1)//定义一个脉冲函数
  11. {
  12.   myangle1=map(val1,0,180,500,2480);
  13.   digitalWrite(sp1,HIGH);//将舵机接口电平至高
  14.   delayMicroseconds(myangle1);//延时脉宽值的微秒数
  15.   digitalWrite(sp1,LOW);//将舵机接口电平至低
  16.   delay(20-val1/1000);
  17. }
  18. void setup()
  19. {
  20.   pinMode( 3, OUTPUT);
  21.   pinMode( 6, OUTPUT);
  22.   pinMode( 5, OUTPUT);
  23.   pinMode( 9, OUTPUT);
  24.   pinMode(10,OUTPUT);//设定舵机接口为输出接口

  25.   

  26. }

  27. void loop()
  28. {
  29. analogWrite(3 , 0);
  30. analogWrite(5 , 200);
  31.   analogWrite(6 , 200);
  32.   analogWrite(9 , 0);
  33.   delay( 3000 );
  34. analogWrite(3 , 0);
  35. analogWrite(5 , 0);
  36.   analogWrite(6 , 0);
  37.   analogWrite(9 , 0);
  38.   delay( 500 );
  39.   analogWrite(3 , 200);
  40.   analogWrite(5 , 0);
  41.   analogWrite(6 , 0);
  42.   analogWrite(9 , 200);
  43. delay( 3000 );
  44. analogWrite(3 , 0);
  45. analogWrite(5 , 0);
  46.   analogWrite(6 , 0);
  47.   analogWrite(9 , 0);
  48.   delay( 500 );
  49.    for(pos = 98; pos < 180; pos += 1)  // 从0度到180度运动
  50.   {                                                     // 每次步进一度
  51.     servopulse(sp1,pos);        // 指定舵机转向的角度
  52.     delay(15);                       // 等待15ms让舵机到达指定位置
  53.   }
  54.   for(pos = 180; pos>=1; pos-=1)   //从180度到0度运动  
  55.   {   
  56.                  
  57.     servopulse(sp1,pos);        // 指定舵机转向的角度
  58.     delay(15);                        // 等待15ms让舵机到达指定位置
  59.   }
  60.    for(pos = 0; pos < 98; pos += 1)  // 从0度到180度运动
  61.   {                                                     // 每次步进一度
  62.    servopulse(sp1,pos);        // 指定舵机转向的角度
  63.     delay(15);                       // 等待15ms让舵机到达指定位置
  64.   }
  65. }
复制代码
2016_06_16_22_10_58.gif




标签:电机 Arduino

试用达人

发表于 2016-6-17 11:04:13  
华强PCB打样
帖子抓住了一个点 详尽地说明了问题的解决过程 有图有真相 很好很好
回复

点赞

助理工程师

发表于 2016-6-21 12:45:10  
  1. for(pos = 98; pos < 180; pos += 1)  // 从0度到180度运动
  2.   {                                                     // 每次步进一度
  3.     myservo.write(pos);        // 指定舵机转向的角度
  4.     delay(15);                       // 等待15ms让舵机到达指定位置
  5.   }
  6.   for(pos = 180; pos>=1; pos-=1)   //从180度到0度运动  
  7.   {                                
  8.     myservo.write(pos);         // 指定舵机转向的角度
  9.     delay(15);                        // 等待15ms让舵机到达指定位置
  10.   }
  11.    for(pos = 0; pos < 98; pos += 1)  // 从0度到180度运动
  12.   {                                                     // 每次步进一度
  13.     myservo.write(pos);        // 指定舵机转向的角度
  14.     delay(15);                       // 等待15ms让舵机到达指定位置
  15.   }
复制代码


这段代码是不是有问题呢?从0到180  与180 到0不同的
for(pos = 98; pos < 180; pos += 1)  // 从0度到180度运动
for(pos = 180; pos>=1; pos-=1)   //从180度到0度运动  
for(pos = 0; pos < 98; pos += 1)  // 从0度到180度运动
其中的区别在哪里呢?
回复

点赞

技术员

发表于 2016-6-22 10:46:45    楼主|
dvd1478 发表于 2016-6-21 12:45
这段代码是不是有问题呢?从0到180  与180 到0不同的
for(pos = 98; pos < 180; pos += 1)  // 从0度到180度运动
for(pos = 180; pos>=1; pos-=1)   //从180度到0度运动  

直接用0  180  90 的话,感觉超声波模块不正,所以稍微调整了一下
回复

点赞

资深工程师

发表于 2016-6-22 11:16:54  
非常好的资料   感谢分享
回复

点赞

技术员

发表于 2017-3-11 19:11:40  
向楼主学习不论技术还是精神
回复

点赞

高级模式
您需要登录后才可以回帖 登录 | 注册

专家问答 查看更多>>
关闭

站长推荐 上一条 /7 下一条

小黑屋|手机版|Archiver| 电子发烧友 ( 粤ICP备14022951号-2 )     

GMT+8, 2017-3-26 17:15 , Processed in 0.165576 second(s), 16 queries , Memcache On.

微信扫描
快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

我的提问

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

单片机论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

-

硬件设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PCB设计论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

树莓派论坛

智能硬件论坛

开发快智能硬件开发平台

Intel物联网开发者专区

Waveshare

乐美客SBC专区

Arduino论坛

BeagleBone论坛

机器人论坛

创客神器NanoPi

小钢炮CANNON

比派科技banana pi专区

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

个人版区

阿东Verilog技术专版

直流马达驱动电路设计

LabVIEW英雄联盟

特权同学FPGA专区

-

厂商专区

灵动微电子 MM32

盈鹏飞嵌入式

TI论坛

TI Deyisupport社区

芯灵思嵌入式论坛

Tisan

米尔科技

庆科社区

WIZnet技术专区

Cypress技术论坛

飞凌嵌入式

Qualcomm技术论坛

英创嵌入式

机智云GoKit论坛

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区