悲剧的一周
由 动力老男孩 发表于 2010/07/31 18:36:28上周夸下海口,说准备做一个两轮的平衡小车。当时的想法实在是非常肤浅:把手机捆在NXT身上,不断的向NXT发送当前的倾斜角度,NXT根据角度进行调整。当小车向前倾的时候,轮子就向前滚,小车向后倾时,轮子就向后滚。同时根据角度倾斜的大小来设置轮子的滚动速度。
按照这个思路开始搭建,因为手头的乐高颗粒严重不够,只好从萝卜头身上割了点肉下来,即使这样也只能用小件拼大件,最后搭了个像怪物似的“两轮平衡小车”:
细心的同学可能发现小车的背后有个亮度传感器,这个是后话,等会儿解释。最初我的想法是手机通过蓝牙和NXT连接并控制电机运动。HTC手机控制NXT的代码如下(其中Timer设置的时间间隔是50ms):
private Nxt nxt; private void ConnectButton_Click(object sender, EventArgs e) { try { nxt = new Nxt(); nxt.Connect("COM9"); } catch (Exception) { nxt.Dispose(); nxt = null; } } private void nxtTimer_Tick(object sender, EventArgs e) { if (nxt != null) { try { GVector gvector = mySensor.GetGVector(); //1.75 is the fix number for center line double gz = gvector.Z - 1.75; sbyte power = Convert.ToSByte(-8 * gz); nxt.SetOutputState(MotorPort.PortB, power, MotorModes.Regulated, MotorRegulationMode.Speed, 0, MotorRunState.Running, 0); } catch (Exception) { } } }
冒着被丈母娘训斥的危险折腾到半夜,终于完工了。一般来说,工作的完成意味着悲剧的开始:这个小车反应非常迟钝,先躺到地上,然后轮子才开始动,就像个耍赖的小P孩。我试过把50ms的Timer调的更小,但是这时候手机已经处理不过来,反而更慢了。
本来想把这个失败的作品马上拆了(萝卜头的胳膊还处于脱臼状态),但是有点儿不甘心。于是第二天又想了个“好办法”:也许是蓝牙传输太慢,我能不能根据倾斜角度来改变屏幕的颜色,然后NXT用亮度传感器通过读屏幕颜色来控制电机呢?于是脱臼的萝卜头又被拆掉了一个传感器,凑成了这样一个小车:
用来改变屏幕颜色的代码如下:
private void UpdateSpeed() { GVector gvector = mySensor.GetGVector(); int gray = Convert.ToInt32(256 * (gvector.Z + 9.8) / 19.6); if (gray < 0) gray = 0; if (gray > 255) gray = 255; this.BackColor = Color.FromArgb(gray, gray, gray); }
再次折腾到半夜。事实证明,变色的反应速度比蓝牙要快一点,但还是不足以让小车保持平衡。小车吱吱嘎嘎前后晃动几下,就倒在了地上。这个平衡小车的尝试到此宣告失败。失败的原因总结如下:
1,小车重心太高,以至于倒下的速度太快,这个因为零件太少实在没办法
2,数据反应速度太慢,经我测试,WM手机+C#的最快反应速度只能到50ms,对于平衡这样的工作来说实在是太漫长了
搭车再提供一项悲剧,我用了两年的笔记本坏掉了,虽然还能凑合用,但是显卡貌似没有绿色了。没错,这个就是315曝光的HP笔记本,从症状判断应该是显卡损坏,坏掉的时候正好过了保修期几天…..
昨晚拆性大发,把这个烂笔记本拆了个七零八落:
拆完发现主板的显卡是集成的,没啥好玩的,只好又装回去。还好,重新装好后只剩下两颗螺丝,开机居然还可以使用,创下我破坏史上的最低纪录。
这就是一周总结了,奋战了三个晚上,没做出啥成果,只能供大家娱乐一下了。后来在网上搜了一下,还真有NXT的两轮平衡小车,用亮度传感器+两个电机,有兴趣的同学自己去研究一下吧:
看看Robin的这个:
http://www.tudou.com/programs/view/Bur6aJG9vmU/
Robin果然是高人啊!还带配乐跳舞的
这个是用了HiTechnic的加速度传感器吗
我企图用手机来处理加速度,可能这个思路本身就不太可行
主要问题可能在于响应速度太慢
原来是用NXT+陀螺仪做平衡机器人主体,用加速度传感器做遥控
这个实在是精彩,受教了!
Segway搭过两次,还是比较简单实在的一个机器人。不过那个用图形化的程序看起来实在很头疼。
再接再励
高科技的东东
哈哈,我也想做这么个东西,不过一直断断续续的没仔细弄
HP问题机型据说延保了啊,不要继续破坏了,拿去售后看看吧XD
我之前打电话问过客服,Presario v3000系列不在延保范围内
真是奸商啊,V3000系列在国内卖的很火
延保的机型貌似都很少见
PS:我没有破坏,现在已经装回去了,除了颜色不对外,貌似其他功能都还正常
我的就是Presario v3000,自己也拆过,上次查了下,在延保内
不会吧,我的是V3803,给惠普金牌店打的电话,被明确告知不能保修
这是位高人
我也尝试用arduino做一个平衡机器人,也失败了,感觉要考虑的问题还是挺多的,像是电机的扭力,机器人本身的重心,还有倾角感应器读取数据的过滤等等。
我觉得关键问题在于传感器
光靠重力感应来平衡是不行的,一定要用陀螺仪传感器
只靠重力传感器应该是不行的。就算是3轴加速度传感器估计也不行。
主要原因是,在小车开始失去重心的开始阶段,细微的变化,传感器没那么敏感。
陀螺仪应该是正解。
当然你说的反应时间也是个问题。蓝牙的传输延迟时间、手机里系统的运行速度,都是问题。
Segway用的是另外一种方法,它是靠反光的强度,来确定平衡位置的。当平衡状态变化时,会造成反光角度的变化,从而带来光强的变化,然后用PID算法来调整平衡。很聪明的做法。
同意
看了原文作者的描述,据说他的这个作品调试起来不是那么容易
毕竟光强和角度不是线性关系,还是陀螺仪好用!
我春节时和女儿一起玩过那个自平衡机器人,对台面的一致性要求比较高,后来我们是在台子上铺了白纸才比较容易平衡得起来。
已经是调试好的程序了尚且这么不容易,想想他调试PID参数时,要花多少力气啊。佩服。
你们也调出来了,赞一个!
陀螺仪以及三维加速度传感器,国外网上貌似每个近500美刀。贵啊…
写错了,应该是50美刀。
供参考… 非广告,哈哈~ 我的口水啊…
http://www.hitechnic.com/cgi-bin/commerce.cgi?preadd=action&key=NGY1044
http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=101