wing 发表于 2016-9-19 15:21:03

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


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



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

wing 发表于 2016-9-19 15:21:36

本帖最后由 wing 于 2019-9-14 22:17 编辑

占位备说明0

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



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



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



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

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









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

来个视频

https://v.youku.com/v_show/id_XMTczMDEyODcxNg==.html?spm=a2h3j.8428770.3416059.1

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

wing 发表于 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的全部数字针脚都可以用中断。

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


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

int d1;    //1传感基础值
int d2;    //2传感基础值
int d3;    //3传感基础值
int d4;    //4传感基础值

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

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

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

boolean first_flg;//首次分析标记


void setup()
{
//启用电机A的三个管脚,全部设置为输出状态
pinMode(12,OUTPUT);
pinMode(3,OUTPUT);
pinMode(9,OUTPUT);   
//启用电机B的三个管脚,全部设置为输出状态
pinMode(13,OUTPUT);
pinMode(11,OUTPUT);
pinMode(8,OUTPUT);   
//RGB LED的三个管脚,全部设置为输出状态
pinMode(2,OUTPUT);//G绿运转
pinMode(4,OUTPUT);//B蓝分析
pinMode(7,OUTPUT);//R红停

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

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

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

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

void p_stop(unsigned long t)
{
//停车
digitalWrite(9, HIGH);       //刹车电机A的制动
digitalWrite(8, HIGH);       //刹车电机B的制动
analogWrite(3,0);      //A0功率输出
analogWrite(11,0);   //B0功率输出
//红灯
digitalWrite(2, LOW);
digitalWrite(4, LOW);
digitalWrite(7, HIGH);
//延时
delay(t);
}

void p_run(unsigned long t,byte m)
{
//运行
if (m==1)//前行
{
//A机状态
digitalWrite(9, LOW);       //松开电机A的制动
digitalWrite(12, HIGH);   //设置方向为正向
//B机状态
digitalWrite(8, LOW);       //松开电机B的制动
digitalWrite(13, LOW);   //设置方向为反向
//A机动力
analogWrite(3,p1_a);      
//B机动力
analogWrite(11,p1_b);   
}
if (m==2)//右转
{
//A机状态
digitalWrite(9, LOW);       //松开电机A的制动
digitalWrite(12, LOW);   //设置方向为正向
//B机状态
digitalWrite(8, LOW);       //松开电机B的制动
digitalWrite(13, LOW);   //设置方向为正向
//A机动力
analogWrite(3,p2_a);   
//B机动力
analogWrite(11,p2_b);      
}
if (m==3)//后退
{
//A机状态
digitalWrite(9, LOW);       //松开电机A的制动
digitalWrite(12,LOW);   //设置方向为反向
//B机状态
digitalWrite(8, LOW);       //松开电机B的制动
digitalWrite(13,HIGH);   //设置方向为正向
//A机动力
analogWrite(3,p1_a);      
//B机动力
analogWrite(11,p1_b);   
}
if (m==4)//左转
{
//A机状态
digitalWrite(9, LOW);       //松开电机A的制动
digitalWrite(12, HIGH);   //设置方向为反向
//B机状态
digitalWrite(8, LOW);       //松开电机B的制动
digitalWrite(13, HIGH);   //设置方向为反向
//A机动力
analogWrite(3,p2_a);   
//B机动力
analogWrite(11,p2_b);      
}   
//绿灯
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
digitalWrite(7, LOW);
//延时
delay(t);
}

int p_scan(uint8_t p)
{
int distance;
int v;
int m;
int n;
int val;

v=0;
for (n=0; n <= 7; n++){
delay(100);
val = analogRead(p);    //p号传感器数值
distance=val;   
}
for (m=0;m<=6;m++){
for (n=m+1;n<=7;n++){
    if (distance>distance)
    {
      val=distance;
      distance=distance;
      distance=val;
      }
}
}
val=0;
for (n=2; n <= 5; n++){
   val=val+distance;
}
v=val/4;      
return(v);
}

void p_init()
{
int i;
int val;
int v;

if (first_flg)
{
    //三色灯
    digitalWrite(2, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(7, HIGH);
   
    //初始分析
    //1前方距离
    val=0;
    for (i=0; i <= 3; i++){
       val=val+p_scan(s_1);
    }
    d1=val/4;//1传感基础值
    //2右方距离
    val=0;
    for (i=0; i <= 3; i++){
       val=val+p_scan(s_2);
    }
    d2=val/4;//2传感基础值
//    Serial.println(d2);             // debug value   
    //3后方距离
    val=0;
    for (i=0; i <= 3; i++){
       val=val+p_scan(s_3);
    }
   d3=val/4;//3传感基础值         
    //4左方距离
    val=0;
    for (i=0; i <= 3; i++){
       val=val+p_scan(s_4);
    }
   d4=val/4;//4传感基础值         

first_flg=false;

delay(2000);
}

}


boolean p_analyze(uint8_t a)
{
p_init();

//蓝灯
digitalWrite(2, LOW);
digitalWrite(4, HIGH);
digitalWrite(7, LOW);

int i;
int val;
int v;
boolean action_flg;

action_flg=false;
//常态分析   
val=p_scan(a);
if (a==s_1) //前行动作
{
    v=val-d1;   
    if ((v<l1)&&(v>l1*-1))
    {
      action_flg=true;//1姿态可用 前行
    }
}
if (a==s_2) //右转动作
{
    v=val-d2;   
    if ((v<l2)&&(v>l2*-1))
    {
      action_flg=true;//2姿态可用 右转
    }   
}   
if (a==s_4) //左转动作
{
    v=val-d4;   
    if ((v<l4)&&(v>l4*-1))
    {
      action_flg=true;//4姿态可用 左转
    }   
}
if (a==s_3) //后退动作
{
    v=val-d3;   
    if ((v<l3)&&(v>l3*-1))
    {
      action_flg=true;//3姿态可用 后退
    }   
}
return(action_flg);
}


void loop()
{
intr;
boolean go_flg;

//停车
p_stop(1000);

//观察下周围的情况   
if (p_analyze(s_1)){
//直走 1.5s
p_run(1500,1);
}
else{
go_flg=false;
while (!go_flg)
{
    r=random(2,4);
    //右转***********************
    if (r==2){
      if (p_analyze(s_2)){
      go_flg=true;
      p_run(3000,r);      
       }
    }
    //后退***********************
    if (r==3){
      if (p_analyze(s_3)){
      go_flg=true;
      p_run(3000,r);      
       }
    }   
    //左转***********************
    if (r==4){
      if (p_analyze(s_4)){
      go_flg=true;
      p_run(3000,r);      
       }
    }      
}
}
}


幻生幻灭 发表于 2016-9-19 16:54:30

占位备说明2 点赞预留

wetnt 发表于 2016-9-19 20:43:29

这个履带机器人,用电机驱动 TB6612FNG驱动的就很好,不过电流接近700~1000mA,用干电池是不好工作的,用航模大C电池能够好使。

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

wing 发表于 2016-9-20 09:50:48

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

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

董董soul 发表于 2016-9-22 09:50:40

我怎么有种庆幸我包的好看的感觉……
哈哈哈,我包的板子!

wing 发表于 2016-9-24 16:06:28

董董soul 发表于 2016-9-22 09:50
我怎么有种庆幸我包的好看的感觉……
哈哈哈,我包的板子!

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

wetnt 发表于 2016-10-9 20:23:20

http://image.geek-workshop.com/forum/201609/19/153453knczc9kizq9niygb.jpg

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

wing 发表于 2016-10-9 22:52:25

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

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

wetnt 发表于 2016-10-12 09:16:33

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

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

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

wing 发表于 2016-10-12 12:58:05

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

这种材料结构还是比较松散,所以2号才选用6061

wetnt 发表于 2016-11-14 17:19:48

wing 发表于 2016-10-12 12:58
这种材料结构还是比较松散,所以2号才选用6061

6061怎么用?是自己打孔么?还是有现成的那种洞洞板?

wing 发表于 2016-11-15 11:20:34

自己打孔,新贴子已经放出实物了

桌面精灵进化——2号车架制作完毕
http://www.geek-workshop.com/thread-27631-1-1.html
(出处: 极客工坊)
页: [1]
查看完整版本: 桌面精灵甦醒——感谢OCROBOT提供绝版电机驱动