极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: wing

桌面精灵甦醒——感谢OCROBOT提供绝版电机驱动

[复制链接]
发表于 2016-9-19 15:21:03 | 显示全部楼层 |阅读模式

十分感谢毅神和其他OC工作人员,在他们的支持下桌面精灵复活了



桌面精灵设计理念是无须人手控制,自动运行,能避开障碍物,到桌面边缘回后退或者转向,不会从桌面掉落。
原版使用标准UNO为主控,初代ocrobot motor shield驱动电机,多个红外距离传感器,和普通轮子减速电机为动力装置。
对我来说是一个有重大意义的作品,意外事故导致硬件部分尽失,在OC的帮助下重获供绝版电机驱动板,才得以重生。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2016-9-19 15:21:36 | 显示全部楼层
本帖最后由 wing 于 2019-9-14 22:17 编辑

占位备说明0

中秋节后快递哥就送来了这份特别的礼物



黑色盒子十分高大尚的感觉



这个是改进了的驱动板,下图是我原来用的,大家可以对比下有什么不同



如果没看出来,可能是拍的不好,其实上图比下图多了两针

目前桌面精灵已经修复了70%,可以运动一下了,而且升级为履带









这个地方UNO有个电容顶着,多出来这两针只能掰弯了

来个视频

https://v.youku.com/v_show/id_XM ... j.8428770.3416059.1

运动还不太流畅,没进行微调呢,还有很多工作未做

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-19 15:21:48 | 显示全部楼层
本帖最后由 wing 于 2016-9-24 18:15 编辑

占位备说明1

原型的修复已经基本完成了,然而存在的问题也不少。

供电方式很奇葩,9v镍氢充电池+一个7.4v锂电,
锂电是给主控的UNO的,而9v是供电机的,可怜的250mAh要抗起两个电机的负担,就看它什么时候被玩坏了。

车架方面选用了万用洞洞板,体积虚肥,而且结构强度较差,考虑下一版本用6061为底盘材料。
另外由于原本的轮子比现在的履带尺寸稍小,造成传感器有盲点,小角度靠近桌面边沿可能不被感知。
另外传感器选择了150~800量程的,这是一个错误。基于传感器的问题其实有很多,之后考虑单独发帖讨论这一问题。

OC的电机板占用了D3针脚,导致无法使用中断方式获取旋转编码器的数据,当然原来的电机是没有编码器的,所以当时也没考虑这点。
作为设计的原型暂时不考虑加入编码器的功能了,希望gama电机板不占这个端口吧,另外一个好消息是101的全部数字针脚都可以用中断。

下面附上代码,其实我写了很多版本的代码,这个版本算是比较稳定的,然而也牺牲了运动的流畅性。


  1. const byte p1_a=145;  //A机直行动力
  2. const byte p1_b=191;  //B机直行动力
  3. const byte p2_a=128;  //A机转向动力
  4. const byte p2_b=128;  //B机转向动力

  5. int d1;    //1传感基础值
  6. int d2;    //2传感基础值
  7. int d3;    //3传感基础值
  8. int d4;    //4传感基础值

  9. const int l1=50;    //1传感临界差值
  10. const int l2=50;    //2传感临界差值
  11. const int l3=50;    //3传感临界差值
  12. const int l4=50;    //4传感临界差值

  13. const uint8_t s_1=5;  //前向传感器针脚号
  14. const uint8_t s_2=4;  //右向传感器针脚号
  15. const uint8_t s_3=3;  //后向传感器针脚号
  16. const uint8_t s_4=2;  //左向传感器针脚号

  17. //boolean a1;  //1姿态可用 前行
  18. //boolean a2;  //2姿态可用 右转
  19. //boolean a3;  //3姿态可用 后退
  20. //boolean a4;  //4姿态可用 左转

  21. boolean first_flg;  //首次分析标记


  22. void setup()
  23. {
  24. //启用电机A的三个管脚,全部设置为输出状态  
  25.   pinMode(12,OUTPUT);
  26.   pinMode(3,OUTPUT);
  27.   pinMode(9,OUTPUT);     
  28. //启用电机B的三个管脚,全部设置为输出状态  
  29.   pinMode(13,OUTPUT);
  30.   pinMode(11,OUTPUT);
  31.   pinMode(8,OUTPUT);     
  32. //RGB LED的三个管脚,全部设置为输出状态
  33.   pinMode(2,OUTPUT);  //G绿  运转
  34.   pinMode(4,OUTPUT);  //B蓝  分析
  35.   pinMode(7,OUTPUT);  //R红  停

  36. //初始化传感数据
  37. d1=0;    //1传感基础值  A5
  38. d2=0;    //2传感基础值  A4
  39. d3=0;    //3传感基础值  A3
  40. d4=0;    //4传感基础值  A2

  41. //a1=false;  //1姿态可用 前行
  42. //a2=false;  //2姿态可用 右转
  43. //a3=false;  //3姿态可用 后退
  44. //a4=false;  //4姿态可用 左转   

  45. first_flg=true;  //首次分析标记

  46. //Serial.begin(9600);          //  setup serial
  47. }

  48. void p_stop(unsigned long t)
  49. {
  50. //停车
  51. digitalWrite(9, HIGH);       //刹车电机A的制动
  52. digitalWrite(8, HIGH);       //刹车电机B的制动
  53. analogWrite(3,0);      //A0功率输出
  54. analogWrite(11,0);     //B0功率输出  
  55. //红灯
  56. digitalWrite(2, LOW);
  57. digitalWrite(4, LOW);
  58. digitalWrite(7, HIGH);
  59. //延时
  60. delay(t);
  61. }

  62. void p_run(unsigned long t,byte m)
  63. {
  64. //运行
  65.   if (m==1)  //前行
  66.   {
  67.   //A机状态
  68.   digitalWrite(9, LOW);       //松开电机A的制动
  69.   digitalWrite(12, HIGH);     //设置方向为正向
  70.   //B机状态
  71.   digitalWrite(8, LOW);       //松开电机B的制动
  72.   digitalWrite(13, LOW);     //设置方向为反向
  73.   //A机动力
  74.   analogWrite(3,p1_a);      
  75.   //B机动力
  76.   analogWrite(11,p1_b);   
  77.   }
  78.   if (m==2)  //右转
  79.   {
  80.   //A机状态
  81.   digitalWrite(9, LOW);       //松开电机A的制动
  82.   digitalWrite(12, LOW);     //设置方向为正向
  83.   //B机状态
  84.   digitalWrite(8, LOW);       //松开电机B的制动
  85.   digitalWrite(13, LOW);     //设置方向为正向
  86.   //A机动力
  87.   analogWrite(3,p2_a);     
  88.   //B机动力
  89.   analogWrite(11,p2_b);      
  90.   }  
  91.   if (m==3)  //后退
  92.   {
  93.   //A机状态
  94.   digitalWrite(9, LOW);       //松开电机A的制动
  95.   digitalWrite(12,LOW);     //设置方向为反向
  96.   //B机状态
  97.   digitalWrite(8, LOW);       //松开电机B的制动
  98.   digitalWrite(13,HIGH);     //设置方向为正向
  99.   //A机动力
  100.   analogWrite(3,p1_a);      
  101.   //B机动力
  102.   analogWrite(11,p1_b);   
  103.   }
  104.   if (m==4)  //左转
  105.   {
  106.   //A机状态
  107.   digitalWrite(9, LOW);       //松开电机A的制动
  108.   digitalWrite(12, HIGH);     //设置方向为反向
  109.   //B机状态
  110.   digitalWrite(8, LOW);       //松开电机B的制动
  111.   digitalWrite(13, HIGH);     //设置方向为反向
  112.   //A机动力
  113.   analogWrite(3,p2_a);     
  114.   //B机动力
  115.   analogWrite(11,p2_b);      
  116.   }   
  117. //绿灯
  118. digitalWrite(2, HIGH);
  119. digitalWrite(4, LOW);
  120. digitalWrite(7, LOW);
  121. //延时
  122. delay(t);
  123. }

  124. int p_scan(uint8_t p)
  125. {
  126. int distance[8];
  127. int v;
  128. int m;
  129. int n;
  130. int val;

  131. v=0;
  132. for (n=0; n <= 7; n++){
  133.   delay(100);
  134.   val = analogRead(p);    //p号传感器数值
  135.   distance[n]=val;   
  136. }
  137. for (m=0;m<=6;m++){
  138.   for (n=m+1;n<=7;n++){
  139.     if (distance[m]>distance[n])
  140.     {
  141.       val=distance[m];
  142.       distance[m]=distance[n];
  143.       distance[n]=val;
  144.       }
  145.   }
  146. }  
  147. val=0;
  148. for (n=2; n <= 5; n++){
  149.    val=val+distance[n];
  150. }
  151. v=val/4;      
  152. return(v);
  153. }

  154. void p_init()
  155. {
  156. int i;
  157. int val;
  158. int v;

  159.   if (first_flg)
  160.   {
  161.     //三色灯
  162.     digitalWrite(2, HIGH);
  163.     digitalWrite(4, HIGH);
  164.     digitalWrite(7, HIGH);
  165.    
  166.     //初始分析  
  167.     //1前方距离
  168.     val=0;
  169.     for (i=0; i <= 3; i++){
  170.        val=val+p_scan(s_1);
  171.     }
  172.     d1=val/4;  //1传感基础值
  173.     //2右方距离
  174.     val=0;
  175.     for (i=0; i <= 3; i++){
  176.        val=val+p_scan(s_2);
  177.     }
  178.     d2=val/4;  //2传感基础值  
  179. //    Serial.println(d2);             // debug value   
  180.     //3后方距离
  181.     val=0;
  182.     for (i=0; i <= 3; i++){
  183.        val=val+p_scan(s_3);
  184.     }
  185.    d3=val/4;  //3传感基础值         
  186.     //4左方距离
  187.     val=0;
  188.     for (i=0; i <= 3; i++){
  189.        val=val+p_scan(s_4);
  190.     }
  191.    d4=val/4;  //4传感基础值         

  192.   first_flg=false;  

  193.   delay(2000);
  194.   }

  195. }


  196. boolean p_analyze(uint8_t a)
  197. {
  198.   p_init();
  199.   
  200. //蓝灯
  201. digitalWrite(2, LOW);
  202. digitalWrite(4, HIGH);
  203. digitalWrite(7, LOW);  

  204. int i;
  205. int val;
  206. int v;
  207. boolean action_flg;

  208.   action_flg=false;
  209.   //常态分析     
  210.   val=p_scan(a);
  211.   if (a==s_1) //前行动作
  212.   {
  213.     v=val-d1;   
  214.     if ((v<l1)&&(v>l1*-1))
  215.     {
  216.       action_flg=true;  //1姿态可用 前行
  217.     }
  218.   }
  219.   if (a==s_2) //右转动作
  220.   {
  221.     v=val-d2;   
  222.     if ((v<l2)&&(v>l2*-1))
  223.     {
  224.       action_flg=true;  //2姿态可用 右转
  225.     }   
  226.   }   
  227.   if (a==s_4) //左转动作
  228.   {
  229.     v=val-d4;   
  230.     if ((v<l4)&&(v>l4*-1))
  231.     {
  232.       action_flg=true;  //4姿态可用 左转
  233.     }   
  234.   }
  235.   if (a==s_3) //后退动作
  236.   {
  237.     v=val-d3;   
  238.     if ((v<l3)&&(v>l3*-1))
  239.     {
  240.       action_flg=true;  //3姿态可用 后退
  241.     }   
  242.   }
  243. return(action_flg);
  244. }


  245. void loop()
  246. {
  247. int  r;
  248. boolean go_flg;
  249.   
  250. //停车
  251. p_stop(1000);

  252. //观察下周围的情况   
  253. if (p_analyze(s_1)){
  254.   //直走 1.5s
  255.   p_run(1500,1);
  256.   }
  257. else{  
  258.   go_flg=false;
  259.   while (!go_flg)
  260.   {
  261.     r=random(2,4);
  262.     //右转***********************
  263.     if (r==2){
  264.       if (p_analyze(s_2)){
  265.         go_flg=true;
  266.         p_run(3000,r);      
  267.        }
  268.     }
  269.     //后退***********************
  270.     if (r==3){
  271.       if (p_analyze(s_3)){
  272.         go_flg=true;
  273.         p_run(3000,r);      
  274.        }
  275.     }   
  276.     //左转***********************
  277.     if (r==4){
  278.       if (p_analyze(s_4)){
  279.         go_flg=true;
  280.         p_run(3000,r);      
  281.        }
  282.     }      
  283.   }
  284. }
  285. }  
复制代码


回复 支持 反对

使用道具 举报

发表于 2016-9-19 16:54:30 | 显示全部楼层
占位备说明2 点赞预留
回复 支持 反对

使用道具 举报

发表于 2016-9-19 20:43:29 | 显示全部楼层
这个履带机器人,用电机驱动 TB6612FNG驱动的就很好,不过电流接近700~1000mA,用干电池是不好工作的,用航模大C电池能够好使。

另外,这个履带唯一的缺点就是支架位置不合适,接近角太小,一点越障能力都没有!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-20 09:50:48 | 显示全部楼层
wetnt 发表于 2016-9-19 20:43
这个履带机器人,用电机驱动 TB6612FNG驱动的就很好,不过电流接近700~1000mA,用干电池是不好工作的,用航 ...

的确越障能力不怎么样,只能在平面玩下。
电池方面其实是9v镍氢充电池,另一个是锂电(红色扎带那个),说到这个锂电还是LEO送给我的。
航模用的锂电池之前也看过下,如果要玩的好还得配个平衡充,真心买不起。
电机驱动方面我比较保守而且很坚持,另外这款电机的电流个体差异很大的,当时卖家说空载电流就3百多毫安,其实是靠不住的
回复 支持 反对

使用道具 举报

发表于 2016-9-22 09:50:40 | 显示全部楼层
我怎么有种庆幸我包的好看的感觉……
哈哈哈,我包的板子!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-24 16:06:28 | 显示全部楼层
董董soul 发表于 2016-9-22 09:50
我怎么有种庆幸我包的好看的感觉……
哈哈哈,我包的板子!

呵呵,原型虽然已经修复了,但是也存在不少问题。
开始准备开发下一个版本了,然而电机驱动是不可或缺的,我一直在等gama的电机板出来呢
到时候可能还得麻烦您包呢
回复 支持 反对

使用道具 举报

发表于 2016-10-9 20:23:20 | 显示全部楼层


楼主这种车体的“洞洞板”哪里有卖的?感觉非常好用啊!求地址或名称!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-9 22:52:25 | 显示全部楼层
wetnt 发表于 2016-10-9 20:23
楼主这种车体的“洞洞板”哪里有卖的?感觉非常好用啊!求地址或名称!

在某宝买的,如果你未想好支架结构,用于临时搭建还是挺方便的。
缺点是结构比较松散
具体名称我发信息给你吧
回复 支持 反对

使用道具 举报

发表于 2016-10-12 09:16:33 | 显示全部楼层
wing 发表于 2016-10-9 22:52
在某宝买的,如果你未想好支架结构,用于临时搭建还是挺方便的。
缺点是结构比较松散
具体名称我发信息 ...

收到楼主信息了,淘宝上看了还是那家的货。之前买过他们的塑料板,做结构有点软。不知道你这个板子强度如何,会不会晃荡。

这种洞洞板如果有金属的就好了,德国有家玩具的卖这个板子,不过比较贵啊。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-12 12:58:05 | 显示全部楼层
wetnt 发表于 2016-10-12 09:16
收到楼主信息了,淘宝上看了还是那家的货。之前买过他们的塑料板,做结构有点软。不知道你这个板子强度如 ...

这种材料结构还是比较松散,所以2号才选用6061
回复 支持 反对

使用道具 举报

发表于 2016-11-14 17:19:48 | 显示全部楼层
wing 发表于 2016-10-12 12:58
这种材料结构还是比较松散,所以2号才选用6061

6061怎么用?是自己打孔么?还是有现成的那种洞洞板?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-15 11:20:34 | 显示全部楼层
自己打孔,新贴子已经放出实物了

桌面精灵进化——2号车架制作完毕
http://www.geek-workshop.com/thread-27631-1-1.html
(出处: 极客工坊)
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 12:36 , Processed in 0.040528 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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