桌面精灵甦醒——感谢OCROBOT提供绝版电机驱动
十分感谢毅神和其他OC工作人员,在他们的支持下桌面精灵复活了
桌面精灵设计理念是无须人手控制,自动运行,能避开障碍物,到桌面边缘回后退或者转向,不会从桌面掉落。
原版使用标准UNO为主控,初代ocrobot motor shield驱动电机,多个红外距离传感器,和普通轮子减速电机为动力装置。
对我来说是一个有重大意义的作品,意外事故导致硬件部分尽失,在OC的帮助下重获供绝版电机驱动板,才得以重生。 本帖最后由 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-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);
}
}
}
}
}
占位备说明2 点赞预留 这个履带机器人,用电机驱动 TB6612FNG驱动的就很好,不过电流接近700~1000mA,用干电池是不好工作的,用航模大C电池能够好使。
另外,这个履带唯一的缺点就是支架位置不合适,接近角太小,一点越障能力都没有! wetnt 发表于 2016-9-19 20:43
这个履带机器人,用电机驱动 TB6612FNG驱动的就很好,不过电流接近700~1000mA,用干电池是不好工作的,用航 ...
的确越障能力不怎么样,只能在平面玩下。
电池方面其实是9v镍氢充电池,另一个是锂电(红色扎带那个),说到这个锂电还是LEO送给我的。
航模用的锂电池之前也看过下,如果要玩的好还得配个平衡充,真心买不起。
电机驱动方面我比较保守而且很坚持,另外这款电机的电流个体差异很大的,当时卖家说空载电流就3百多毫安,其实是靠不住的 我怎么有种庆幸我包的好看的感觉……
哈哈哈,我包的板子! 董董soul 发表于 2016-9-22 09:50
我怎么有种庆幸我包的好看的感觉……
哈哈哈,我包的板子!
呵呵,原型虽然已经修复了,但是也存在不少问题。
开始准备开发下一个版本了,然而电机驱动是不可或缺的,我一直在等gama的电机板出来呢
到时候可能还得麻烦您包呢 http://image.geek-workshop.com/forum/201609/19/153453knczc9kizq9niygb.jpg
楼主这种车体的“洞洞板”哪里有卖的?感觉非常好用啊!求地址或名称! wetnt 发表于 2016-10-9 20:23
楼主这种车体的“洞洞板”哪里有卖的?感觉非常好用啊!求地址或名称!
在某宝买的,如果你未想好支架结构,用于临时搭建还是挺方便的。
缺点是结构比较松散
具体名称我发信息给你吧 wing 发表于 2016-10-9 22:52
在某宝买的,如果你未想好支架结构,用于临时搭建还是挺方便的。
缺点是结构比较松散
具体名称我发信息 ...
收到楼主信息了,淘宝上看了还是那家的货。之前买过他们的塑料板,做结构有点软。不知道你这个板子强度如何,会不会晃荡。
这种洞洞板如果有金属的就好了,德国有家玩具的卖这个板子,不过比较贵啊。 wetnt 发表于 2016-10-12 09:16
收到楼主信息了,淘宝上看了还是那家的货。之前买过他们的塑料板,做结构有点软。不知道你这个板子强度如 ...
这种材料结构还是比较松散,所以2号才选用6061 wing 发表于 2016-10-12 12:58
这种材料结构还是比较松散,所以2号才选用6061
6061怎么用?是自己打孔么?还是有现成的那种洞洞板? 自己打孔,新贴子已经放出实物了
桌面精灵进化——2号车架制作完毕
http://www.geek-workshop.com/thread-27631-1-1.html
(出处: 极客工坊)
页:
[1]