悲剧的一周
由 动力老男孩 发表于 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的两轮平衡小车,用亮度传感器+两个电机,有兴趣的同学自己去研究一下吧: