悲剧的一周

上周夸下海口,说准备做一个两轮的平衡小车。当时的想法实在是非常肤浅:把手机捆在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笔记本,从症状判断应该是显卡损坏,坏掉的时候正好过了保修期几天…..

昨晚拆性大发,把这个烂笔记本拆了个七零八落:

臭名昭著的HP Presario笔记本

臭名昭著的HP Presario笔记本

拆完发现主板的显卡是集成的,没啥好玩的,只好又装回去。还好,重新装好后只剩下两颗螺丝,开机居然还可以使用,创下我破坏史上的最低纪录。

这就是一周总结了,奋战了三个晚上,没做出啥成果,只能供大家娱乐一下了。后来在网上搜了一下,还真有NXT的两轮平衡小车,用亮度传感器+两个电机,有兴趣的同学自己去研究一下吧:

http://www.nxtprograms.com/segway/index.html

NXT两轮平衡小车

NXT两轮平衡小车



对 “悲剧的一周” 的 21 条 评论

    • Robin果然是高人啊!还带配乐跳舞的 :D
      这个是用了HiTechnic的加速度传感器吗
      我企图用手机来处理加速度,可能这个思路本身就不太可行
      主要问题可能在于响应速度太慢

    • 原来是用NXT+陀螺仪做平衡机器人主体,用加速度传感器做遥控
      这个实在是精彩,受教了! :)

  1. lifanxi 说:

    Segway搭过两次,还是比较简单实在的一个机器人。不过那个用图形化的程序看起来实在很头疼。

  2. SEVEN 说:

    再接再励

  3. Clown 说:

    高科技的东东

  4. 胡泊 说:

    哈哈,我也想做这么个东西,不过一直断断续续的没仔细弄

  5. st.w 说:

    HP问题机型据说延保了啊,不要继续破坏了,拿去售后看看吧XD

  6. 感恩 说:

    这是位高人

  7. double 说:

    我也尝试用arduino做一个平衡机器人,也失败了,感觉要考虑的问题还是挺多的,像是电机的扭力,机器人本身的重心,还有倾角感应器读取数据的过滤等等。

  8. galiu 说:

    只靠重力传感器应该是不行的。就算是3轴加速度传感器估计也不行。
    主要原因是,在小车开始失去重心的开始阶段,细微的变化,传感器没那么敏感。
    陀螺仪应该是正解。
    当然你说的反应时间也是个问题。蓝牙的传输延迟时间、手机里系统的运行速度,都是问题。

    Segway用的是另外一种方法,它是靠反光的强度,来确定平衡位置的。当平衡状态变化时,会造成反光角度的变化,从而带来光强的变化,然后用PID算法来调整平衡。很聪明的做法。

发表评论

可以使用下列 XHTML 标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>