Archive for the ‘闲扯专用目录’ Category

刚进了一个树莓派

本来想把办公室了的小推柜改装一下,架一个摄像头,装几个电动轮子,再加个小音箱麦克风。这样就变成一个在办公室跑来跑去的小柜子了……

其实更想做成WallE的样子,不过那样工程貌似过于浩大,先熟悉熟悉开发环境吧 :)

【补充】这几天在上面安装了Linux操作系统,有几点吐槽:

1. 性能还是略为偏弱,比如高清输出的时候非常慢,上网还勉强,看大片就别指望了;

2. IO口有点少,如果想做个小机器,最多支持三、四个步进电机,有点儿少了。可能还需要给它配一个Arduino专门驱动设备;

3. 只能接网线,不能用wifi,这个太蛋疼了。过几天再买个USB的网卡跟它配上吧。

4. 耗电量比较大,如果做成移动小车的话,估计需要配个大电池

几个与“玩火”相关的有趣小实验

今天在微博上看到一个朋友的提问:
家里这个奶锅用了几个礼拜了,锅底的纸还没被烧掉,不理解啊[汗][汗]

小奶锅的纸没有被烧坏

小奶锅的纸没有被烧坏

看来生活中到处都充满了热爱学习的理工男:)。小奶锅的纸不会被烧坏,是因为它虽然处在熊熊烈火里,但是温度却并不高。它贴在导热性能非常好的金属锅底,锅里有开水的时候,由于沸点是稳定的,同时汽化热是很高的,能迅速带走热量。这样就会把最高温度维持在一百度附近,所以纸不会烧坏。(需要注意的是,跟汽化相对的是凝结,这时候也会释放大量的热量,所以被水蒸气烫伤往往比开水烫伤更严重)

想起以前看过的一些有趣的小实验,跟大家分享一下。

1. 纸锅烧水

这个 实验其实就是上面这个现象的进阶版,在生活最方便的实验环境就是纸杯+蜡烛了,直接从网上找个了图,有兴趣的兄弟回去可以试试 :)

纸锅烧水

纸锅烧水

2. 鲁珀特之泪

曾经有一次,老家的叔叔特地给我打电话说了一件怪事:他们家的玻璃台盆突然“爆炸”了,而且是炸成很小很小的颗粒状。当时他们正好全家都出门了,家里也没有开洗衣机或其他的东西。所以他们担心是家里进贼了,或者是不是中了什么邪。特地上网查了下,这是由于玻璃制品冷却不均匀产生的巨大内应力造成的。 作为家里的知识分子代表,我详细的给他们介绍了原理,总算打消了他们请道士驱邪的念头。

鲁珀特之泪是一个把内应力现象用到极致的有趣物理实验。操作也很简单:把玻璃在坩埚里烧化,然后迅速的倒入一桶冷水里。熔化的液滴就会形成漂亮的玻璃蝌蚪。

鲁珀特之泪

鲁珀特之泪

这只蝌蚪有种神奇的特性,它的脑袋很硬,你可以用榔头敲打,但是当你掰断它那细长的尾巴尖时,整个鲁珀特之泪就会在瞬间化为粉末!抄来的一段说明:
鲁珀特之泪碎裂的原理叫做“裂纹扩展”,源于其内部不均衡的压力:当熔化的玻璃滴入冰水中时,玻璃表面迅速冷却形成外壳,而壳下的玻璃还仍然是液态。等到核部的玻璃也冷却凝结时,由于体积变化,液态的玻璃自然而然地向着已经是固态的外壳收缩,导致靠近表面的玻璃受到很大的压应力、而核心位置则被拉扯向四周,受到拉应力。当尾部遭到破坏时,这些残余应力迅速释放出来,使得裂纹瞬间传遍全体、支离破碎,据高速摄影技术观测,其裂纹的传递速度可达秒速1450米-1900米。

眼见为实,转一个视频大家看看吧

3. 莱顿弗洛斯特现象

把一颗烧到红腾腾的铁球扔进水里会怎样?很多人觉得会有一番超级剧烈的、冰与火一般的缠斗,伴随着疯狂的气泡和各种难以忍受的声音……事实上,这颗高温的铁蛋会像糖心蛋一般,静静地躺在水底,同时身上带着一圈小气泡。

莱顿弗洛斯特现象

莱顿弗洛斯特现象

莱顿弗洛斯特是一名科学家,他在1756年发现,“液体不会润湿炙热的表面,而仅仅在其上形成一个蒸汽层”,这便是莱顿弗洛斯特现象。而具体到这个视频,当烧红的铁球被扔进水里,刹那间形成的水蒸汽,将把铁球包裹起来,就像是一个隔离带,将之与周围的水隔开,于是,我们就看到了最初的“糖心蛋”。
跟它类似的实验是,把一个铁勺子烧到滚烫,这时候倒一点儿水到勺子里。水并不会立刻像进油锅那样炸起来,而是缩成一个球状在勺子里“跳舞”。

4. 低温版莱顿弗洛斯特现象

对于液氮这样的低温液体,室温和人体的温度对它来说,就已经是“高温”了,所以就出现了很多有趣的低温版实验。

例如:把手伸进零下196度的液氮里和把手伸进零度的冰水里,哪个更冷?看一个很酷的图吧:

液氮实验

液氮实验

液氮遇到高温的人类爪子,会迅速的形成一层气体隔离层,而气体是热的不良导体,所以感觉上反而不如伸到冰水里冷。据说物理系的牛人们会做一个更可怕的实验,他们把少量液氮含到嘴里,就会看到液氮在舌尖上跳舞,然后嗤嗤的冒着白烟……

<End>

PS: 最近被朋友批评说更新的太慢了, 主要是因为四轴飞行器已经暂停很久,而且北京的冬天又脏又冷,没有合适的地方可以开工。但是想起来,生活中其实还是有一些好玩的事情,有时间的话还是应该多蹦跶出来和朋友聊聊。

再PS:不管是高温还是低温的实验,都是有危险的,请谨慎操作!最后转一个带着蛋蛋的忧伤,但是很好笑的帖子

本来我(指原作者mike)可以跟所有人一样顺利完成研究课题然后毕业的,但是两个月前的一件小事,却于我有意义,将我从既定的人生轨道拖开,使我至今忘记不得。当然你也许听说过那个所谓的谣言,主角就是在下,现在我可以亲口告诉你传说中的未删节版本。

在开学第二周,物理系组织了新生欢迎会。作为一项传统,我们用液氮来做冰激凌——当然它不是食用成分,而是作为冷凝剂。当一滴液氮落到桌子上时,它展示了奇异的舞蹈动作。于是新生们奇怪了:怎么会这样?

于是我解释道:氮气在接触到桌面时表面部分已经蒸发,形成一个气垫阻止它继续下落;并且起到隔热效果,减少了进一步的蒸发,因此它不会马上沸腾甚至不接触桌面,看起来就像在跳舞。

我又说了,同样原则可能适用于不小心用液氮洗手活当饮料喝下去的情况,原则上说喝下液氮应该不会造成伤害的。以我在低温实验室的多年经验,这在物理学上应该是可行的。

但是没有人相信我,“你会被整个儿冻成冰雕,就像《终结者2》里一样”。靠,敢蔑视师兄的权威,于是我倒了一杯液氮一饮而尽,爽!一股青烟从我鼻子冒出来,大家都呆了。

2秒后我崩溃了,瘫倒在地板上,动弹不得,感到极度的痛苦。救护车和警车一起赶到,把被终结的我送到医院。一路上没人能解释我是怎么了。

第二天我被病房里机器的滴滴响声中醒来,这时我终于承认喝下液氮是不对的,虽然这与我的信仰不符。

随后我了解到关于液氮的几件事。你能把液氮倒进嘴里然后表演喷烟,但是你不能把它吞下去。因为闭合的会厌阻止气体的逃逸,于是它们被迫进入你的体内;而且食道会压缩里面的任何东西,因此即便有稀薄的气垫保护,液氮还是与食道发生了亲密接触。

原来如此。6年前我曾经玩过这个把戏,但是没有吞下去过,昨晚上我一定是在某个环节搞错了。

结果我从会厌到胃底都被严重损坏。快速扩散的气体压迫胸腔,然后肺部都破裂了。在一整夜的手术后,医生们切掉一部分胃,用一台机器上运行我的整个消化系统,直到第二天我的肺功能开始恢复。

后来他们对我的恢复能力感到惊奇(靠!怎么说我也是大师兄)。几天后我能自己呼吸,一周后我能坐起来,两周后能走动和进食,八周后基本上都愈合了,除了一些不太好看的伤痕。

有个好消息就是,我是首个摄取低温材料的医学案例。强烈推荐你看最新的英格兰医学学报,将有三篇有关的文章。

因为这次冒险我多了一个外号叫硝基迈克(Nitro-Mike),以及给物理系增加了一个经典玩笑,偶尔学校的文章上还会提到我。”嘿,那不是迈克最喜欢喝的饮料吗?”

热水先结冰?

这几天不知道为什么,一条新闻被各个报纸转载:

【为何热水冻结更快?英国悬赏1000英镑求解】将一杯35℃的水和一杯100℃的水放入冰箱,100℃的水先结冰,这是为什么?此谜也称“姆佩巴效应”,培根和笛卡尔都曾试图揭谜,均告失败。现在,英国皇家化学学会向公众悬赏1000英镑破解,截止日期为7月30日。

如果你在网上搜一下,会看到很多答案,包括:越热的水散热越快、水中气体减少不容易结晶等等。
事实上十年前我读研的时候,就看过这个理论,当时觉得非常不靠谱,就做了一个实验。放了两杯水到窗外(当时北京正在冬季),事实证明这个理论基本是胡扯,冷水的杯子先结冰!

今天再次看到这些报纸转载,我决定再做一次实验。首先用一个量杯来保证两杯水是一样多的:

小量杯

小量杯

21:46分,同时放到温度为-18度的冰箱冷冻室,并且标上了冷热的记号:

冷水和热水同时放进冷冻室

冷水和热水同时放进冷冻室

我每隔几分钟就去看一次,到22:30分时,冷水杯表明出现薄薄的冰层,热水杯完全没有任何迹象。

冷水杯出现冰层,热水杯全是水

冷水杯先出现冰层

到22:50分时,热水杯出现薄薄的冰层,冷水杯上面冰层已经较厚了:

热水杯也开始结冰了热水杯出现冰层的时候,冷水杯已经比较厚了

到23点10分,冷水杯已经基本用手捏不动了,而热水杯底部还是软的。事实证明,还是冷水杯冻的更快!

哎呀,这么无聊的一个实验,我自己都觉得做的很不值啊。但是看到网上的各种原理说明,这些人就不能动手做一个毫无成本的实验吗?

企图修改电调PWM频率的实验

之前控制电调的PWM频率是50Hz,怀疑可能是这个频率较低,所以导致了四轴飞行器无法平衡。今天特地做了一个小实验,用两个参数:
一个调节油门,用0~200控制油门的高低;
一个调节频率,计划从50Hz实验到450Hz。

我使用的电调是天行者SKYWALKER 20A无刷电调。在实验中差点发生危险,当频率不在50Hz时,调节油门电机完全不动;这时候把频率调回50Hz,因为之前的油门值设置的很大,所以瞬间就升到了很大的转速,一片有裂纹的叶片直接甩断飞出来。可能是震动太大把蓝牙弄松了,所以用手机关闭电源未遂,最后我从后面拔掉了电源线才算完事。
当然目前就说PWM不可改有点武断,可能代码中还有逻辑错误。今晚不打算试了,虎口震的发麻,心有余悸的……

小结:
1. 任何时候,开通电机前都要戴好护目镜;
2. 测试电调和电机时,应该把叶片拆掉;
3. 调节参数时,应该先把一些危险参数还原;

下面是使用的代码,明天拆掉页面继续实验。

void loop()
{
  long t0 = micros(); //记录进入loop的时间
  while(Serial.available()) {
    // 这里是获取控制指令
    pushData(Serial.read());
  }
  double frequency = ctrlFreq * 2 + 50;  //(ctrlFreq 0~200对应50到450)
  double T = 1000000 / frequency; // 一个周期的微秒值
  double len = (0.9 + ctrlPower / 200.0) * T / 20;  //(ctrlPower 0~200对应总周期0.9ms~1.9ms)
  delayMicroseconds(t0 + T - len - micros());
  for(int i = 0; i < 4; i++) digitalWrite(motorPins[i], HIGH);
  delayMicroseconds(len);
  for(int i = 0; i < 4; i++) digitalWrite(motorPins[i], LOW);
}

半个月没啥进展

上次说到减小重力传感器的读数权重,得到了比较好的角度波形图。充满希望的去试飞了一次,结果还是非常不稳定。
正好这两周很忙,这件事情就被搁置了,正好有时间仔细的回想思考问题。

这次又发现了一个潜在的可能原因,就是控制电调(电子调速器)的PWM频率。当时看说明书,提到电调需要工作在50Hz的PWM条件下,这样一来,实际上我费尽心思把角度读数采样提高到350Hz是没有意义的,因为读7次角度后才会修改一次电机转速。

刚才搜到了一篇文章,提到了以下内容(来自5imx
控制频率低,普通电调在设计的时候大多考虑的是标准PWM(PPM)脉宽,而标准PWM(PPM)的控制频率只有50Hz即20ms一个周期。虽然标准的PWM只有50Hz的控制频率,但多数电调都能工作在比这个高的多的范围内而不会有任何异常。在我们测试过的电调中,它们基本上都能很好的工作在200Hz到300Hz的控制频率上,但这个频率只能满足一般的需求。

这样说来,适当提高PWM的频率还是有点希望的,但是这个是不是问题的罪魁祸首还不能确定,只能改改看了。
之前做磁悬浮的时候,曾经找过资料,可以把Arduino的系统PWM提高到1000Hz以上,所以看上去比较稳定。但是这个系统的PWM用在四轴上却有点问题,因为电调的转速区间很小。对于50Hz(20毫秒)的PWM来说,控制转速的区间大约在0.9ms到2.1ms之间。对应的Arduino的PWM值范围是12到26之间,也就是说从最低转速调到最高转速,只有14级的范围。这个跳跃的范围有点过大了,而且从我实测的经验看,19还飞不起来,20可能就已经飞的很高了 :(

所以这次还需要对程序进行比较大的修改,同样需要在代码中直接用DigitalWrite操作PWM输出,希望这次能有好运!

如何购买缺失的乐高零件

有不少朋友曾经问我该买哪个版本的NXT,以及不够的零件怎么补,这里统一回答一下。

以很多人关注的大圆盘齿轮为例,我的9797套装里有这个零件,可以在下面这个页面查看9797的明细表:
http://peeron.com/inv/sets/9797

注意URL最后面的9797可以改成你所知的其他套装编号。在列表里可以看到大齿轮的编号是:48452cx1

如果你只打算买这一个零件,去淘宝搜这个型号就可以了。如果你想买一个其他套装带这个零件的,就点这个零件的链接进去。这时候就会显示哪些套装中包含这个大齿轮。

四轴飞行器

最近工作压力稍微小了一点,开始蠢蠢欲动,准备跟风做一个四轴飞行器。
简单的查了点资料,在淘宝上居然已经有2000元以内的产品卖了,而且可以手机遥控、带摄像头、自动平稳….
真是情何以堪啊,我们这些DIYer不仅做出来没人家好看,而且可能要花更多钱。
好吧,唯一能安慰自己的就是,自己动手做的会觉得更爽一点,就好比你不会去街上买个娃回家一样 :) (别想歪了,我并没有说“制作娃的过程更有乐趣”)
 
有人推荐了两个开源的四轴飞行器网站:
http://www.mikrokopter.com/ucwiki/MikroKopter (这个简直是坑爹,貌似是德语的)
【补充】据好心的ktrym提醒,这个网页有英文版的:http://www.mikrokopter.com/ucwiki/en/MikroKopter
http://ng.uavp.ch/moin/FrontPage (虽然我不太喜欢英文,但是跟上面那个比,这个就很亲切了)

在淘宝搜了下,各色零件似乎都有卖的,而且方案很多。我希望能做一个带视频传输的,用手机可以控制的版本。
具体是用蓝牙、WIFI还是3G暂时没有想好,各种飞控和电调也还需要继续调研。总之现在处于摸索阶段,欢迎有经验的童鞋们一起讨论。

补充几个资料:
http://code.google.com/p/arducopter/wiki/ArduCopter
http://gaishi.vicp.net/

三傻大闹宝莱坞

最近刚刚看了一部老电影:三傻大闹宝莱坞,果然是一部被烂译名陷害的好片。

虽然不年轻了,但还是心潮澎湃了一把。看来咱们的教育跟印度阿三们没啥区别,读书的功利性都太强。感慨的话就不多说了,体制也轮不到咱来批评,在这里表达一下对老薛同学的敬意。他差点进了一个大型国企,从此“安度青年”,过上幸福的生活。而现在却跑到地球的对面去学物理,在实验室里玩激光,玩磁悬浮。不过,这才是我们这类人的理想生活啊。

前不久回老家,有一件有趣的事情。我的小侄子今年上五年级,玩具库里有个辉光球。有一天他兴致勃勃的跑过来告诉大家,说他把手放在辉光球上的时候,家里固定电话的屏幕就亮了,手拿开就灭了。我们这群大人纷纷表达了鄙夷之情,觉得这件事情不可能,也很无聊。
后来小侄子坚持让我们去看,结果都傻眼了,电话不仅屏幕亮了,还显示了一个2266号码的未接来电!
经过我们的实验,大致明白了原因。家里的电话是无绳电话,而辉光球的辐射电波,频率正好和子机的2,6这两个号码重合;主机以为有未接来电,就亮起来了。手放上去的时候应该是起了放大器的作用(事实上离的很近的时候,不用手扶也可以)。家里有辉光球和西门子无绳电话的朋友可以自己实验一下。
在网上搜了下,原来辉光球的辐射很巨大,据说把荧光灯管放在它的边上,可以被点亮:

来自一个教学实验:辉光球点亮荧光灯

来自一个教学实验:辉光球点亮荧光灯

当然,说这个故事的目的不仅仅是让大家防辐射,而是感慨孩子们的好奇心和观察力。我们也曾经精力过剩,看到什么都想知道原理,可是现在被埋在工作中,记忆力、观察力和创造力都严重衰退。看完电影,我差点想把工作辞了,尝试下“专注于自己的兴趣,成功就会随之而来”。不过一觉醒来,还是回到现实:毕竟咱不是天才,而且还得赚钱吃饭,还是在业余时间抽空玩吧 :(
不过我萌生了一个想法,打算建一个网站,供咱们这些心存梦想的老男孩们交流使用,没准将来也能冒出几个专利来。到时希望有兴趣的朋友们过来添砖加瓦!

打扫灰尘

最近因为没做啥新东西,所以一直没有来更新博客。突然发现上一篇已经是两个月前的了,赶紧上来扫扫灰尘。既然没动手干活,就分享点关注的新玩意儿吧 :)

最近特别火的就是四轴飞行器了,之前有几位朋友给我留过言,大概查了查,确实有趣!

四轴飞行器

四轴飞行器

四轴跟普通的遥控直升机相比,控制灵活,反应迅速,国外甚至有人用它来打乒乓球。最可贵的是,可以找到很多开源的资料。例如这个简易的控制原理:

四轴飞行器控制原理

四轴飞行器控制原理

另外一个好玩的东西是3D打印机,这玩意儿用粉末或者能快速凝固的材料,一层一层的打出三维的模型。同样它也能找到很多的开源资料,包括电路图,机械结构等等。当然,开源归开源,精度越高,尺寸越大,需要的钞票就越多 :)

下面这是一个巨大的三维打印机,显然又是万恶腐朽的西方发达资本主义国家弄的。这个家伙貌似是用沙子做打印材料,通过高温熔解后打印成型:

巨大的三维打印机

巨大的三维打印机

另外有一些小巧而精致的打印作品,这些应该是用树脂粉做材料,向精细的方向发展的:

精细的三维打印作品1

精细的三维打印作品1

精细的三维打印作品2

精细的三维打印作品2

精细的三维打印作品3

精细的三维打印作品3

另外一个新闻是Arduino发布了面向Android设备的Mega ADK控制板。这一对长的很像的双胞胎,最近很受关注。毕竟机器人还是以运动为主,有了移动设备,就不用背着笔记本到处跑了。用手机遥控的机器人和小车已经非常多,网上把这兄弟两的搭档叫做Amarino: Android meets Arduino。希望有时间的时候,把萝卜头改造成手机控制的版本,至少读颜色和移动性会强很多!

Mega ADK控制板

Mega ADK控制板

最后必须说一个巨酷无比的发明:Kinect,微软这次终于弄出一个让人眼前一亮的好东西!

网上经常能看到有趣的视频,例如Kinect试衣镜等等。其实Kinect最酷的地方在于,它可以让你赤手空拳的遥控东西。哈哈,想象一下吧,将来在家里指向电视,它亮了;在空中一拉,冰箱门开了;恶狠狠的瞪蚊子一眼,一束激光扫过…..哇塞,简直就是X战警+哈利波特嘛

这个YY的有点过了,不过至少已经有人实现了用Kinect遥控四轴飞行器:

Kinect体感遥控的飞行器

Kinect体感遥控的飞行器

啊啊啊,有超能力的感觉真好啊,嘿嘿。下个月公司的工作应该会到一个里程碑阶段,到时候就可以有点时间继续折腾了。我已经迫不及待的打算弄一套Kinect,希望这个月里再降点价 :D

集中回复关于下推式磁悬浮的一些问题

wlreg 等同学在PID平衡算法问了好多问题,那个页面的评论太长,已经找不到组织了,所以重开一个页面回答一些问题。

Q1、看了攻略和上面的评论,整个装置通上电后通过电位器先将接运放的传感器的输出调节为2.5V,然后再放浮子上去。霍尔传感器感应的气势是浮子的磁通吗?然后通过传感器的输出变化反应浮子的倾斜程度?(错了请指正呀,感谢的说。)
今天在图书馆居然被我找到一本关于PID控制器的书,对照了一下上面的符号和程序上的符号,大概理解了一些之前不懂的变量的意义,但是程序上还是有地方不懂,希望老男孩筒子指导一下吧。

A:气势这个词用的相当诡异,可能是因为wlreg同学刚喝了藿香正气水吧 :)
首先,电位器把输出调节到2V附近而不是2.5V附近,印象中那个东东输出的电压上限是3.7V,从读数上看最大值到750左右,我大概取了个中间值,对应的读数是400左右。
传感器感应的是浮子的磁通量的“变化量”,因为传感器垂直安装在线圈的中心高度,所以线圈中通电时对传感器基本没影响。而底座大磁环是不动的,所以传感器的读数变化基本都是由于浮子引起的。请注意这里浮子不会倾斜,只会水平移动!通过读数变化就可以知道浮子移动的方向。

—————————————————————

Q2:一开始的端口设置里,int rotatePin=3,rotatePin这个变量貌似一直都没有用过吧(只在上面程序注释里看见出现过)……

A:介位童鞋,你算是说对了,这个变量没有用。那它为啥会出现在代码里呢?其实在我的博客的某个角落里,写过企图给线圈加上旋转磁场,最后没有成功。所以这是一段没有删除干净的代码……嘿嘿,这个角落实在太角落了,以至于我也没有找到,汗

—————————————————————

Q3:Kp是比例系数,Kd是微分系数,这个程序采用的是增进式PID?那么setKd,和setKp这些系数都是实验慢慢调试出来的吗?如果我做的有些部件(磁铁的大小之类的)的和老男孩筒子列表里的有出入,那么这些值都要自己找了?

A: 没错,这些值都要自己找,但是也并非没有经验可循,建议先记录一段log到电脑上,然后把power值和传感器读数列出来对比,就可以估算出这些值了。推荐一个叫Origin的画图软件,可以画出图表对比。据说用excel也可以 :)

—————————————————————

Q4: 程序第82行,if(debug) tick=0;
这里debug不是设定为false吗?后面也貌似没有看见有更改过这个值,那么这一句实质上是永远不会运行的吧?

A: 当你需要调试的时候,把它改为true然后重新烧入板子。debug模式下不是为了悬浮的,而是为了拧那个电位器。
这个说来话长了:那两个电位器的螺丝孔很小,我需要两只手配合才能拧它。这样就不方便用万用表读数,我那个乱七八糟的洞洞板已经焊不下新的线头用来测量。所以你看到下面的几句:
    Serial.println(adjustValue1);   
    Serial.println(adjustValue2);   
    Serial.println(readValue1);   
    Serial.println(readValue2);  

这几行代码把读数打印到屏幕上,这样我就可以两只手调电阻,抬头看读数鸟。
另外顺便加了几行代码,用来判断线圈通电的方向是不是正确。

—————————————————————

Q5:程序第87行,if(tick2>=2;
这个是右移两位的意思吗?就是相当于除以4了,这个的意义何在呢?

A:读4次然后求平均嘛

—————————————————————

Q7、程序144行,if(debug)下面的括起来的真的会运行吗?

A:这个问题其实在Q4解释过了

—————————————————————

Q8: 程序第162行,delay(32000)
32000这个其实不用纠结的吧?但是总觉得很特殊的样子,为什么是这个设置……

A: 在PWM的秘密的两篇文章里,提到了改变PWM频率后,delay(n)的周期会产生变化,这里32000大约是0.5秒左右。对于我们这种老眼昏花的同志,再快就看不清了。

—————————————————————

Q9:程序第131行,Pid1.target = min(755, min(adjustValue1 + offset, Pid1.target));
755这个值是什么样来的呢?不是很明白的样子……

A:参见Q1,这个755应该是我调节时曾经见过的最大值。

————————————————————–

Q10: 额,之前那个问题也问错了,程序的PID应该是位置型的……
不过按照那个位置型PID的公式,貌似下面的这段就有点不解了
——————————————————
error = readValue1 – Pid1.target;
v = error – Pid1.preError;
Pid1.v = (Pid1.v * 6 + v) / 7;
Pid1.power = (int)error * Pid1.Kd + Pid1.v * Pid1.Kp;
——————————————————
按照公式,这里应该是
Pid1.power =Pid1.Kd*v+Pid1.Kp*(int)error
不是吗?

A: 这次真的满头大汗了,仔细看了一下,我好像确实是把kd和kp两个参数的含义搞错了。今天忙了一天,现在大脑还是一团浆糊,明天早上再看一眼确认。不过参数虽然含义弄错了,那些参数值是可用的,你把代码里所有的kd和kp互换一下吧 :)
另外,(int) 要放在最前面,是把结果取整用的。

——————————————————————————

Q11: 又有了一个新问题。仔细看了一下程序
第87行
———————————————–
if(tick2<50) {tick = 0;return;}
————————————————
按照我学的C语言的理解(只是入门级别,可能有错),这里有一个return语句,就是执行到这个return的话就会跳出函数体了,而这里正在执行的函数式loop函数,也就是说执行到这里,就跳出loop函数不往下执行了,按照开发板的运作,loop这个函数又会被从头开始执行。而程序的113行和119行也有一个return语句……
其实我想问的是,按我的理解这段if(tick==500)这段程序是用来检测端口的值用的……其实特意弄tick和tick2这两个变量以及return语句这样来检测端口的用途是什么呢……这段有些弄不懂意图……

A:你看这一段中间有一句:if(writeLog)。所以总体来说,tick1和tick2都是用来记录log用的,所以你不用太纠结于这段代码是什么意思。说实话我刚才看了一会儿也有点头昏眼花,恨不得把作者揪出来打一顿。仔细回想了一下,最早只有tick1,当循环500次以后,集中发送一次log(因为串口发数据很慢,会影响采样频率)。后来发现500次还不到1秒钟,这时候可能刚刚放上去还没平稳呢。所以加上了一个tick2,这个500次的循环执行50次以后,大概是30秒,这时候再发送最后的500个数据。
然后再看一下真正运行时的情况,这时候writeLog=false,这些代码基本都属于没有用的了,另外还有一些莫名其妙的tick2 = 0;  tick>500之类的,应该都是进化过程中的垃圾产物。

—————————————————————–

第一回遇到这么认真的读者。其实看代码重在领会精神,没必要理解每一行代码的作用。但是认真的同学也有认真的好处,钻研精神值得赞赏!尤其是那个kp和kd的参数,

其他页面的问题就回答到相应的留言下面了,那里评论没有那么长 :)