Posts Tagged ‘攻略’

四轴飞行器攻略3:串口通信

虽然四轴飞行器还没有最后完工,但我觉得这不妨碍先发一部分攻略。作为一个新手,我在调试过程中遇到了很多问题,现在不记下来的话,等完工了很可能都忘了;另外,高手们也可以通过我的攻略,看看有没有什么错误,或者哪里可以优化;最主要的是,独乐乐不如众乐乐,分享是DIYer们的精神之一 :)

上次整理了四轴攻略的目录,今天正式把它放在导航栏成为一个新项目,目录的顺序是按照我制作的顺序来组织的。
比如刚买回来电机和电调,本来应该先做电机控制实验。但是看了说明书发现这种电机还需要初始化,而且初始化需要可调比例的PWM方波(具体的设置方法会在后续的电调部分介绍)。对于控制来说,调节方法至少有两种:一种用旋转电位器连接Arduino的模拟输入,另一种是用计算机或者手机通过串口控制调节。

因为电机的初始化只需要做一次,为了这个增加电位器好像没有必要;而串口通信则会贯通在整个控制和调试的过程中,所以我决定先从它开始实验。

串口通信其实之前已经做过很多小实验了,简单的一段演示代码如下:

Serial.begin(9600);  // 设置波特率
Serial.write(123);   // 向控制端写数据
while(Serial.available()) {
       // 如果有数据,则读取数据
       byte data = Serial.read();
}

很快你会发现这段简单的小代码有一些问题。

1. 传输速度:
代码中的9600是波特率,也就是数据通信的速度,它是目前比较流行的传输速率。以这个速度通信的话,每发送一个字节(Byte)到控制端需要的时间大概是1毫秒。需要注意的是,为了精确控制四轴的平衡,我们需要尽量在短时间内多读取各种传感器的值。以目前的350Hz的采样率来说,每2.85毫秒就需要读取一次陀螺仪和重力感应器。这种情况下,1Byte/ms的传输速度显然是不能容忍的。解决的办法就是修改波特率,Arduino支持的波特率包括:300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 和 115200。如果修改的话,相应的控制端也需要修改成一样的。
大家可能会说,为什么不全都用高速的呢?实际上能使用多少的波特率,跟处理器的主频有关;而且主频最好是波特率的整数倍,否则的话可能会增加错误率。对于我这个四轴来说,如果用USB和电脑通信,可以达到最高的115200;如果用蓝牙和手机通信,只能达到9600的波特率(因为蓝牙模块修改波特率还需要额外购买一个控制板)
很让人高兴的一点是,Arduino支持在运行过程中动态修改波特率。所以可以首先使用9600连接,当发现连接对象是电脑时,调整为115200:

    if(controlType == 100 && !connectToPc) {
      Serial.end();
      connectToPc = true;
      Serial.begin(115200);
    }

需要说明的是,只有发送数据才有这个问题,对于单向接收数据基本是没有关系的。因为Arduino接收的数据会放在缓冲区里,在读取的时候数据已经下载完毕,主程序不需要等待接收。

2. 关于通信协议
对于一个新手来说,协议可能是个特别吓人的词汇,感觉是权威机构才能制定的东西。事实上,在单片机领域经常需要自己定义协议。下面我们看看到底是怎么回事。
前面的代码中演示了如何接收一个字节的数据,问题是:如果需要接受多个控制数据,读取程序怎么知道哪个字节是控制那个参数呢?
我用了一个非常简单的协议,每组数据6个字节,其中第一个字节是FF,其他字节都小于255。这样一来,我们在读取数据时,如果看到FF就知道它是数组的第一个元素了。
当然我这里是一个简单的协议,对于复杂的系统,数据中很可能也带有FF数据,这种情况该怎么办呢?其实也很简单,就像高等语言中的转义功能。如果数据中有FF,那么我们把它改成FE01。等等,如果数据中原来就有FE01怎么办?我们可以把所有的FE改成FE02。这样就完成了转义。学过HTML语言的同学,可以用&转义符做参考进行理解。

3. 校验位
接下来是另外一个问题。单片机通信并不像我曾经想象的那样稳定和精确,它其实是有可能丢数据的。例如串口数据到达的时候,Arduino的中断正好被触发,这时候数据就丢了。
丢一个数据可能会带来非常严重的后果,例如我的控制参数,第一个是油门,第二个是PID的积分参数,第三个是PID的微分参数。如果第二个数据丢了,我就会认为第三个是积分参数,这两个参数如果相差较大的话,也许四轴就坠毁了……
所以在协议里,还需要确认一下收到的数据是否完整和正确,这里就需要用到校验位。一个常用的简单的方法是,把一组数据依次进行异或操作,把结果作为最后一个字节的数据一起发出去。接收端收到数据后,也相应的做一次异或操作,看看两个值是否相等。从数学上看,也可以把接收数据全部异或起来,如果等于0就对了。(这种异或校验法不能完全保证正确性,有一定的概率会误判,但是大多数情况够用了)
如果校验错误的话,我们宁可把这一组数据丢掉,也不能使用错误的参数。

void loop()
{
    while(Serial.available()) {
        pushData(Serial.read());
    }
}
int bufferIndex = 0;
void pushData(byte data)
{
  //验证是否数据的开始
  if (bufferIndex < 1 && data != (byte)0xFF) {
    bufferIndex = 0;
  } else {
    buffer[bufferIndex] = data;
    if (bufferIndex == 5) {
      setParams();
    }
    bufferIndex = (bufferIndex + 1) % 6;
  }
}
void setParams()
{
  // 因为超声波中断可能导致数据丢失,所以需要额外的一个字节用于校验
  if(buffer[1] ^ buffer[2] ^ buffer[3] ^ buffer[4] == buffer[5]) {
    ctrlPower = buffer[1];
    reportType = buffer[2];
    P_Control = buffer[3] / 200.0;
    I_Control = buffer[4] / 200.0;
    // 其他处理
  }
}

总结,其实所谓的“协议”,就是在数据通信时商量好的“规则”,按照这个规则,我们才能保证接收到正确的数据。

盗梦陀螺攻略3- 上拉式磁悬浮

有了磁悬浮陀螺的念头,我没有直接开始做下推式,而是先做一个上拉式的练练手。这件事的经历说明:对一个新手来说,可以采用由浅入深,先易后难的策略;虽然总时间可能会更长一点,但是对增强信心,掌握经验很有帮助。(好吧,水木的Joker们看到这句话一定会想歪,色情猥琐男们请自觉面壁)

上拉式磁悬浮原理相当简单。先用万能的乐高颗粒搭一个架子,把绕好的线圈固定在上面。然后用钕铁硼强磁做一个浮子。小窍门来了,我们在线圈的上方放置一个大磁铁,一开始浮子会被吸在线圈下方,慢慢的向上抬大磁铁,到一定高度时,浮子吸不住了向下落。记住这个位置,把大磁铁固定在那里。这样的效果是:线圈里只要通一点电流,就可以吸住浮子,电流一断浮子就会下落。

线圈和浮子的安装

线圈和浮子的安装

图中的浮子下面有个白色的东西,其实那不是什么秘诀,只是我用来标示上下的记号。大磁铁下面有好几个乐高齿轮,其实那都是调节高度用的,之所以用齿轮而不是用圆片倒是有原因的,因为我觉得比较酷 :D

电路方面,上拉式磁悬浮只需要一个传感器,但是我还是焊了双路的板子,这样和将来的下推式用同一块就可以。电路图还没时间学习怎么画,先用画笔凑合弄了个原理图,里面省略了一些细节,不过应该能看明白了。

上拉式磁悬浮原理图

上拉式磁悬浮原理图

请注意我的电路中用了两个电位器。其中电位器1是多圈电位器,作用是调节传感器输出范围。3503很灵敏,电流被放大以后,很容易就超出0到5V的测量范围,所以在需要一个精密的电位器,让输出范围尽量在5V以内。电位器2是用来调节浮子位置的,它是我们设置的“目标位置”。Arduino开发板的作用,就是调整线圈电流大小,从而控制浮子上下移动,最终让传感器的读数等于我们设定的目标值。实物的接线图请看:

接线图,貌似不太清楚

接线图,貌似不太清楚

这个可能大点

这个可能大点

代码就非常简单了,所有的代码只有下面这几行:

int readPin = 2;    //用来连接输入
int i1Pin = 36;     //连接电机驱动板的I1接口
int i2Pin = 37;     //连接电机驱动板的I2接口
int powerPin = 8;   //连接电机驱动板的EA接口
int adjustPin = 6;

boolean flag = true;
int power = 0;
int readValue = 0;
int adjustValue = 0;

void GetPowerValue()
{
  power = readValue - adjustValue;
  if(power < 0) power = 0;
  if(power > 50) power = 50;
  power = power * 16 / 10;
}

void setup()
{
  pinMode(i1Pin, OUTPUT);     //I1和I2都是数字信号
  pinMode(i2Pin, OUTPUT);     //通过设置I1和I2来控制电流方向
  pinMode(powerPin, OUTPUT);  //按占空比方式输出的模拟信号
  digitalWrite(i1Pin, !flag);
  digitalWrite(i2Pin, flag);
  //Serial.begin(9600);          //设置波特率
}

void loop()
{
  //读取电位器和传感器的读数
  readValue = analogRead(readPin);
  //传感器的电压范围是220~580,所以调节电位器的范围可以稍作调整
  adjustValue = analogRead(adjustPin) / 3 + 220;
  GetPowerValue();
  //Serial.println(readValue);
  //Serial.println(adjustValue);
  //Serial.println(power);

  analogWrite(powerPin, power);
  //delay(2000);
  //delay(1);
}

代码虽然简单,但是在制作的过程中却走了很多弯路。这段代码的重点在于:
power = power * 16 / 10;

这个相当于是调整线圈电流的放大倍数,参数1.6如果小了则吸不住浮子,大了则无法稳定。程序中的16如果换成15或者17都不行的。因为这么一个小小的问题,我走了一星期的弯路。当时怀疑原理不对,在反复检查无果之后,已经跟圈妈提出放弃这个项目。幸好这时候得到了圈圈妈“严厉”的鼓励:遇到这么点困难就打退堂鼓,以后怎么做大事!从另一个角度说,当你想尽办法几乎绝望的时候,其实已经接近成功了,因为你已经排除了大部分错误。

果然第二天就解决了问题!后来在制作下推式的时候,类似的事情又一次发生,那次主要问题在于线圈绕的不行,而重做线圈是一个非常浩大的工程,同样也是在圈妈的鼓励下,终于下决心重新做一遍。在此向顽强的圈妈表示敬意(圈妈表示鸭梨不大,反正她不出力干活^_^ )

这个实验最终的经验总结如下:
1,参数很重要!如果你的磁悬浮上下跳动的厉害,恭喜你,其实你已经接近成功了。
2,这个试验中的参数有效范围非常窄,跟程序也有关系,后面会介绍一种PID算法,可以扩大范围,更容易调节。
3,坚持,太累的时候放松一下,然后换个思路想想。

视频如下:

盗梦陀螺攻略2- 线圈和传感器

相信很多人看过原理图之后,和我一样信心满满,这个东西太容易做了,不就是照图焊器件嘛,一星期就可以搞定了!

真正动起手来,才知道没那么容易。第一件事就郁闷了:去哪里找线圈?在淘宝搜了一大圈也没找到合适的。铜丝直径?线圈直径?线圈高度?绕多少匝?线圈之间距离?乱七八糟的好多事情,who tama knows!

最后只能去电子城买了一公斤的铜丝回来自己绕。那时候我还不知道有“线圈骨架”这么个名词,没找到合适的东西,就自己做了几个轴。于是出现了下面这么多奇形怪状的线圈:

奇形怪状的线圈们

奇形怪状的线圈们

更奇形怪状的线圈们

更奇形怪状的线圈们

细心的同学可能会发现,其中有些是带铁芯的(我分别用大螺丝和一毛钱的硬币柱当过铁芯),有些是没有铁芯的。事实证明,磁悬浮的线圈不能有铁芯!这点和我最初的直觉有点不符,因为觉得加了铁芯后磁场会更强。事实上因为我们的浮子是钕铁硼强磁,铁芯对它的吸力远大于线圈产生的磁力。也就是说,带铁芯的线圈只能产生“很大的吸力”和“更大的吸力”,没法产生“较小的吸力”和“较小的斥力”

绕线圈是一个非常痛苦的差事,我数过一个线圈平均大概是800匝左右,绕的我头昏眼花。所以后来做了一个绕线用的小东西,这就是我喜欢乐高的原因,很简单的一堆颗粒,可以拼出很多你想要的东西:

乐高制作的绕线器

乐高制作的绕线器

用绕线器绕出的线圈们

用绕线器绕出的线圈们

后来买了线圈骨架,这下绕的就好看多了。对于下推式磁悬浮,一共需要4个线圈。霍尔传感器尽量放在4个线圈的中心位置,这样的好处是线圈通电时,感应的磁场在中心处几乎都互相抵消了,只有浮子的移动才会影响到传感器的读数。

霍尔传感器安装在中心位置

霍尔传感器安装在中心位置

事实上,传感器的位置并不需要太严格。因为霍尔测量的是垂直它表面的磁通量。只要传感器的高度在线圈的高度中心,这里的磁通量都是平行与传感器的,也不会产生影响。

高度尽量居中

高度尽量居中

我的第一个版本的悬浮,传感器就是用胶布贴在侧面的中心,一样可以悬浮。缺点是浮子移动时,磁场的变化不是线性的,容易产生振动。

高度居中时,水平位置要求并不高

高度居中时,水平位置要求并不高

接线方面,互相对面的一组线圈之间反相连接。也就是说当在一对线圈两端通电时,一个会对浮子产生斥力,另一个会产生引力,正好是相反的,连推带拉才給力!

下面这个是背面的接线图,其中中心位置的是两个传感器,我把它们引出到两个杜邦头插针上,这样可以方便插拔。对面的线圈分别把相同极性的抽头焊在一起:

接线图,希望你能看懂

接线图,希望你能看懂

最后发一个关于线圈的经验小贴士,省的大家再重做无用功了:
1,产生相同的磁力,铜丝越细需要的电压越高,因为电阻比较大。我用的是0.27的铜丝,20V的电源。(用20V的原因是我有个坏掉的笔记本,利用下电源)
2,磁力的大小跟匝数关系不大,因为匝数增大的时候,电阻也增大,电流减小,产生的磁场差不多。但是匝数越多越省电。
3,四个线圈之间距离要稍大一点,浮子会更稳定,当然也别大的离谱,我的经验是线圈中心的直径和浮子直径差不多。
4,传感器的位置尽量在线圈中间,高度上也尽量放在中心的高度。
5,不要装铁芯。
6,给线头留长点,当你辛苦装上几个线圈,突然发现线头不够长的时候,会有看破红尘的感觉。

盗梦陀螺攻略1- 原理图与器件清单

本来昨天就想发这个帖子,因为想画一个原理图出来,所以这两天试着安装了Protel和PCsELcad。结果整了两天也没把图画好,看来圈圈妈说的对,这一行我确实门还没迈进去。既然这样,我先把网上找到的电路图发出来,其实基本是差不多的。
这次做悬浮陀螺,我从中国电子开发网上找到了很多资料,其中下推式磁悬浮的电路,基本上是参考了网友liguang70217的ATmega8单片机方案,点击这里可以查看原帖。
下推式磁悬浮电路图

下推式磁悬浮电路图

更清晰的pdf版本可以从这里下载。看到这里,有些同学们估计已经坐不住了:嗨,早说有这个网站,我们直接去看就得了,何必在这里等攻略捏?
其实Ourdev的磁悬浮开源活动,从09年4月份就开始了,所以心急的同学们应该反省一下自己的搜索能力。另外,那个论坛基本上是高手出没的地方,我等无门无派的新手,看人家双截棍耍的挺酷,自己一动手往往碰的鼻青脸肿。所以我默认来这里看攻略的,都是跟我一样的新手们,尽量从新手的角度来记录制作过程。
首先简单介绍一下这个电路的原理:
图中右下角的两个3503,就是传说中的线性霍尔传感器,安装在浮子的正下方,分别用来测量横竖两个方向的磁场强度;当磁场变化时,输出电压也会相应变化;因为传感器的变化量一般都比较小,所以需要经过放大,这里用的是LM358数字放大电路;放大后的信号由ATMag8单片机采集,经过一定的算法之后,输出控制信号;因为单片机的控制信号支持的电流都比较小,需要用这个信号驱动一个大电流控制板,让它通过电压的变化来控制线圈磁场,从而实现对悬浮物的控制。
因为小爱计划暂时停止了,我手头有一块富裕的Arduino Mega168控制板和一块L298N直流电路板,所以我正好就以手头的这两块板子为基础做实验。当然,DIY的乐趣在于学习和改造,我的磁悬浮和这个电路有下面这些区别:
1. 因为单片机改成了Arduino开发板,所以图中单片机周边的电容和晶振就不需要了。
2. 因为没有合适的电源,我把那个坏掉的笔记本电源利用上了,额定电压20V,最大电流2A。
3.Arduino的电源是9V,所以加了一块lm7809用来生成9V电压。
4.10k和4.7K的电阻,我换成了100k和2k,好像影响不大。
5.L298N的驱动,图中是每组用两根控制线驱动,我改用三根,编程的时候会方便点(这个后面再介绍)
6.外接了两个旋转电位器,用来调节平衡,这个主要是为了装箱子以后方便,免得总开箱用螺丝刀拧。
7.对应的代码,需要针对Arduino进行修改。
因为电路图不太会画,这里就不贴啦。下面是器件清单和相应的资料pdf,方便大家查询:
器件名称 规格 数量 功能 文档
直流稳压电源 20V,2A 1 电源
UGN3503 2 线性霍尔传感器,
用于测量磁场强度
UGN3503.pdf
LM358N 1 数字电流放大器 LM358N.pdf
LM7809 1 输出9V电压,给Arduino供电 lm7809.pdf
Arduino开发板 Mega 168 1 数据采集,逻辑控制,输出控制 见攻略
L298N控制板 1 大电流输出,用于控制线圈磁场 见攻略
电阻 100K
2K
2
2
用于数据采集电路 这个不需要了吧
多圈电位器 10K 2 用于设置空载时的电压。
需要精确设置
dwq1
调节电位器 10K 2 用于调节位置,
精度要求不高
dwq2
导线 最好是芯硬一点的 若干
杜邦头 若干 线多的时候,用这个接插比较方便 dbt
线圈骨架 D32*D15*H18 4 用来绕线圈 gj
漆包线铜丝 直径0.27mm 1公斤 绕线圈
洞洞板 最好买3连孔的,好焊 2块 用来焊电路 ddb
乐高颗粒 齿轮,连杆等 若干 用来搭一些简单结构
圆环形黑磁铁 145*80*20 1个 产生斥力让浮子悬浮 请咨询幼儿园小朋友
钕铁硼强磁 D15*4mm
D30*2mm
D31.7*19.1*3.2mm
1
1
1
用来组装浮子 请咨询幼儿园小朋友
一元钱硬币 1 浮子配重 请咨询央行行长
牙医专用石膏 1公斤装 1 做陀螺造型用 请咨询牙医或骨科大夫
指甲油 古铜色 1 陀螺上漆 请咨询您的mm
好了,以上就是所有需要的材料,下面插播花絮几则:
1,在电路图里,有两个LM358放大器,于是我一开始蹭蹭的就焊了两块上去,后来才知道,这个LM358有两路放大器的,焊一个就够。据圈妈说,这个是原理图,跟器件的真实形状,管脚顺序都未必一样(那个是PCB图)。好吧,新手就是这样….
2.当时为了绕线圈,我在淘宝试过好多关键词,什么线圈轴,线圈,电磁铁芯等等,都没有搜到,只好用乐高的齿轮+轴绕线圈。因为绕的质量不好,调试时吃尽了苦头(振动非常大)再后来,才知道这东西原来叫线圈骨架,买回来重绕,立竿见影的就成功了!
3,我的板子焊好后,得意洋洋的拿去给圈妈鉴定。圈妈惊呆了,作为一个资深业内人士,这么多年来新手见得多了,但是焊的这么丑的真是第一回见:布局不合理,导线满天飞,而且还有各种虚焊连焊,简直可以当反面教材了。唯一欣慰的是能闻到点烤肉味,让人食欲大开。
唉,为了不影响圈圈,我一直在一个阴暗的跑步机架子上焊东西,这样就算不错了,至少运行还蛮稳定的,请欣赏漫天的飞线:
新手焊的板子

新手焊的板子

解魔方的机器人攻略28 – 总结

经过这么长的时间,终于把萝卜头的制作攻略全部发完了。这次发攻略的过程,我把萝卜头重新搭建了一遍,把所有的代码也整理重写了。新版的小萝卜头看上去更好看一点(个人感觉,呵呵),代码容错能力也强了很多。现在在各种不同的灯光条件下,基本都可以正确识别颜色,并且转动过程中,魔方掉下来的情况也很少见了。终于松了一口气,对博客和对萝卜头都算有一个交代了。

我家圈圈很快就要降生,接下来的一段时间博客可能会很少更新。小爱的进度看来已经远远落后,目前还只是一个可以用手机遥控的小车。不过来日方长,我会继续制作并且和大家分享的。

NXT端的程序下载(源代码)

PC端的程序下载(exe)

下面转几个国外达人制作的魔方机器人,其中最快的已经可以在十秒左右解出魔方。据说人类的世界记录是7秒多,有志于突破人类极限的朋友,可以参考参考,我非常愿意为此贡献一点力量。

世界最快的乐高魔方机器人

目前最快的魔方机器人

目前最快的魔方机器人

作者把视频发在了youtube上,无法转载,有兴趣的同学请自行翻墙过去看看:
http://www.youtube.com/user/RoboticSolutions
介绍文章:
http://singularityhub.com/2010/02/17/lego-robot-solves-any-rubiks-cube-in-less-than-12-seconds-video/

五阶魔方机器人
用的也是Lego studio摄像头+NXT,5阶魔方还原算法自然是这个机器人的核心,但并非lego范畴,这里可以看到David Gilday愈加成熟的PC端处理程序,看起来相当酷。此外玩过多阶魔方的朋友都知道,这种魔方的翻转定位是最大的问题,所以这款机器人采用了一个相对丑陋的框式造型来帮助解决这个问题,气势上差了一点,但毕竟是第一款,6分43秒185步的测试水平也算世界纪录了。

视频地址

URL:
http://www.tudou.com/programs/view/HXeCwaDdXW0/

大型魔方机器人
大型机械臂,从取魔方,识别,到翻转,放回,仿佛可以看见不远将来家里的小机器人接过你随手拧乱的魔方,咻咻复原的可爱场景。
视频地址:

URL:
http://www.tudou.com/programs/view/TLuTp8mWLPM/

四阶魔方机器人
这是一款用NXT+N95手机的魔方机器人,旋转的结构很酷:
http://blog.izxg.com/?tag=%E4%B9%90%E9%AB%98

解魔方的机器人攻略8 – 底座电机

底座完工以后,需要把它连接到电机上。需要注意的是,我们还需要把这个底座变成一个40度左右的斜坡。为什么要有坡度呢,肯定不是吃饱了撑的。因为萝卜头只有一个爪子用来翻转魔方,有了坡度以后,借助重力作用,轻轻一推就可以翻过去。
经过我多次实验,坡度太大的时候魔方容易滚出台外,坡度太小了又翻不过去,这个40度左右刚刚好。

说起这个,我想起前不久的老同学聚会,有些同学太“爽快”,聚会非要喝到人仰马翻为止。其实任何事物都要掌握一个度,所谓“酒饮微醉,花看半开”。不喝酒没气氛,喝多了太伤身,还鬼哭狼嚎的。。。就像这个斜坡似的,恰到好处最合适。

又扯远了,先远观一下我们即将要做的部分(下图的右边部分)

接下来要介绍右侧的电机和斜坡支架

接下来要介绍右侧的电机和斜坡支架

好,接下来继续看图说话:

在底盘背面加上四个转向固定连杆

在底盘背面加上四个转向固定连杆

插上以后的效果

插上以后的效果

电机连接需要的配件

电机连接需要的配件

电机连接效果

电机连接效果

后来发现那个大直角插件有问题,换成黄色的这个了,懒得再拍一遍,凑合看吧

后来发现那个大直角插件有问题,换成黄色的这个了,懒得再拍一遍,凑合看吧

连上以后的效果,领会精神吧,自己试试

连上以后的效果,领会精神吧,自己试试

支架需要的配件

支架需要的配件组装后的支架

我最爱的转向“插销”,又结实又好用

我最爱的转向“插销”,又结实又好用

支架和电机连接

支架和电机连接

加一个蓝色插销加强一下

加一个蓝色插销加强一下

连上一个大直角,这个是以后用的,先放着

连上一个大直角,这个是以后用的,先放着

准备做另一边的支架

准备做另一边的支架

组装后的第二个支架

组装后的第二个支架

支架与电机连接

支架与电机连接

这些是固定宽度的撑杆

这些是固定宽度的撑杆

这个支架还没有完全连起来,给它添加一个直角连接,连接的照片忘拍了,自己试试吧

这个支架还没有完全连起来,给它添加一个直角连接,连接的照片忘拍了,自己试试吧

完工了!看看四脚朝天的效果图

完工了!看看四脚朝天的效果图

解魔方的机器人攻略2 – 选择方案

有了想法,接下来该怎么行动呢?我建议的方式是:
考查 -> 确定方案 -> 架构 -> 实现 -> 改进

我们先开始考查,随便Bing一下 rubik+cube+robot 。你可以找到各种奇奇怪怪的魔方机器人,例如:

各种神奇的魔方机器人(无聊的人还真不少)

各种神奇的魔方机器人(无聊的人还真不少)

需要链接的请点这里:
http://www.switched.com/2009/09/17/teens-rubiks-cube-robot-solves-classic-puzzle/
http://video.google.com/videoplay?docid=-2084071621500271233#
http://www.youtube.com/watch?v=jkft2qaKv_o
http://www.engadget.com/2007/12/17/kawasaki-robot-solves-rubiks-cube-in-six-seconds-flat/
http://tiltedtwister.com/

我决定参考(请注意是参考而不是抄袭)图中左下的方案,该方案基于Lego公司的NXT Mindstorm机器人套装制作,有以下优点:
1,成熟产品,无需设计电路和焊接
2,积木式设计,扩展性超强
3,三组电机,多种传感器,蓝牙连接,功能很完善
4,有很多第三方的开发包,编写代码很方便
5,价格可以承受(2k左右)

它的缺点:
1,个头小,功率不高,转魔方没问题,干重体力活就不行了
2,塑料连接件,容易出现误差
3,想进一步扩展电子设备较困难

万丈高楼平地起,确定方案就是迈出了第一步!请注意:貌似最轻松的这一步恰恰是最关键的,因为它会影响到之后的所有工作。这个考查阶段,我大概用了一星期的时间查阅资料,对比和估算了各种方案需要的时间和经费;另外还需要一个大概的可行性分析,确定这个方案可以行的通。

现在回过头来看,可行性分析非常重要但也不要钻牛角尖,因为做一件事很少能一帆风顺,总会遇到各种出乎意料的问题。只要不轻言放弃,开发人员永远都可以兵来将挡,水来土掩。

接下来就准备掏银子采购吧,像泡妞一样,该出手时就出手!

解魔方的机器人攻略1 – 前因后果

在开始介绍方案之前,我先回答一个问题。有人问我,为什么你无端端的会想起做一个解魔方的机器人呢?

(嗖~~镜头切换到1990年)
玩具店里,一个小P孩正呆呆的看着一架模型飞机。他的眼睛里充满了渴望,小伙儿追求姑娘的眼神也不过如此。
但是他没有哭闹着要买,因为他知道家里没有多少钱(哈哈,这娃真懂事啊)
最后他挑了一个很便宜的魔方,这个魔方成了他几年内唯一的玩具。
那个时代没有网络,信息匮乏,这个不算聪明也不算太笨的小P孩,自己一个人闷头玩了两年,终于找到了还原的方法。

(嗖~~镜头又切换到1996年)
在座如果有北航的校友,应该知道冯如杯科技制作竞赛,每年各系都有老师组织并指导学生参赛。
航空发动机系的新生:老师,我想做一个能转魔方的机器人
指导老师(观察中:这个学生真是特别啊–看上去特别呆):
嗯,你的想法非常好,不过我觉得实现起来很难,而且没有什么实用价值,另外咱们系也没多少经费……
于是这个不切实际的想法就这样被咔嚓了。
题外话:其实当时计算机还在Dos时代,Internet更是还没在北京出现,做这样的机器人确实非常困难。我后来参加的Atar9C发动机实体模型项目,获得了冯如杯的二等奖。
这个发动机至今还展览在北航三号教学楼的发动机陈列室里,回想起来还是无法抑制的臭美啊!

(镜头再次切换)
某公司老板酷爱长跑,为了迎接新加坡马拉松大赛,他组织了一次公司内的热身长跑活动。
在这次活动里,只要跑完20公里,就可以获得几百大洋的奖金。
有一位年轻人恰好出差到此,跑两小时就有几百大洋入账,不赚白不赚啊!
不幸的事情发生了,半路上他亲眼目睹了一个同事倒下,心脏病突发。
虽然这种事在长跑中很常见,虽然和这位同事素不相识,但是年轻人还是被震撼了
人生如白驹过隙,你曾经想过要做一些事情,但是“有空了再说吧”,“有钱了再说吧”。。懒人的借口总是好找的。
当然,大多数人不会以这种突然的方式离去,他们只是在不知不觉中变老,然后有一天,他们会“突然”发现自己没多少时间了。
所以他决定做点事情,从十多年前被鄙视的小心愿开始做起。
题外话:世事就像变幻莫测的魔方,一串貌似毫不相关的因,可能会结出一个莫名其妙的果。这就是传说中的蝴蝶效应吧!