Stay hungry, Stay foolish

带着Hungry Robot参加北京的maker faire,它可能是全场最受欢迎的robot了。

关于Hungry Robot

Hungry Robot是EunchanPark制作的一系列有趣的机器人中的一个。

来自丹麦的EunchanPark喜欢做令人快乐之事,也乐于与社区分享创作的过程。[Happy Things Maker]是Ta的使命。EunchanPark想建立“快乐之物博物馆”,在其中尽可能多地放置令人愉悦之物。这是Ta的100 HAPPY THINGS

Hungry Robot100 HAPPY THINGS之一。

EunchanPark创作Hungry Robot的动机是

I want to make a robot for emotional purpose not for functional. This is fun, makes smile and feels good.

Hungry Robot的外壳采用3D打印制作,控制芯片选用Arduino。这些东西都对社区开放:

我的制作笔记

TrashEatingRobot源码中可以看出,Hungry Robot的控制逻辑十分简单: 当红外测距传感器检测到有物体靠近时(如有人放置硬币),便触发舵机转动,把硬币倒入口中。这就是Hungry Robot的所有控制逻辑。

较之于Arduino,我更喜欢micro:bit,所以决定采用micro:bit来制作Hungry Robot。

开始制作

准备工作

制作Hungry Robot,需要以下素材

  • micro:bit
  • 3D打印的机器人外壳
  • 红外测距传感器模块(夏普 GP2Y0A21YK0F 10-80cm)
  • SG90舵机
  • 尼龙扎带(细)
  • 导线若干

以上物资都可以通过淘宝搞定。除了micro:bit,其他材料都在几块钱到十几块钱之间。

单独说说3D打印的机器人外壳,如果你有3D打印机,直接从Hungry Robot 3D print files中下载模型,打印出来即可。如果你没有3D打印机,可以在淘宝上购买3D打印服务,给店家发去3D打印文件即可。

我采用了光敏树脂,打印出的外壳十分细腻。

组装机器人

如何从一堆零件中,组装出Hungry Robot呢?

Hungry Robot (Eat everything) long take without edit (How to make)给出了细致的引导。

视频在Youtube上,需要翻墙。我已经把它搬运到本地.你可以在此观看

开始编程

我喜欢把对知识的教学放在制作项目的过程中,之前在基于兴趣的学习面临的诘难写道:

当一个孩子有了兴趣和冲动,Ta为了追逐这个兴趣,就需要动手实践。你知道的,魔鬼都在细节里,动手实践的过程总会碰到许多障碍,于是Ta就要熟悉材料,运用独创性、坚持以及机智,这个过程必然包含着各种训练、以及需要教育者提供知识来帮助Ta。

约翰.杜威说:

如果我们有设备和材料的结构,在我们面前就开辟了另一条路径。我们可以指导儿童的活动,使它们沿着一定方向运行,把它们渐渐引导到这条道路逻辑上必然要达到的目标上。

接下来让我们看看制作Hungry Robot,需要熟悉的材料,并在这个过程中学习编程相关的知识。

红外测距传感器

在Hungry Robot中,红外测距传感器用于测距,当检测到有物体靠近时(有人放置硬币),则触发舵机转动。

图中的三条线中:

  • 红色接电源线(Vcc)
  • 黑色接地(GND)
  • 黄色是数据线(Vo),我将其接在micro:bit pin1引脚,你可以选择其他引脚

红外测距传感器通过黄色数据线,对外输出模拟信号(analog signal),制作Hungry Robot并不需要对模拟信号有深入连接,你只需知道红外测距传感器在测距时,会把距离信息对外输出就行。

如果你对模拟信号有兴趣,维基百科是很好的学习入口,无论你对什么有兴趣,维基百科常是入门的好伴侣。

下边我们动手来熟悉一下红外测距传感器。

使用mu-editor作为编辑器,来为micro:bit编程。

mu-editor是一款Python编辑器,我们可以使用Python来为micro:bit编程。当然也可以使用图形化编辑器makecode

连接好电路之后,使用数据线将microbit连上电脑,打开mu-editor,只需要4行代码我们就能源源不断获取红外测距传感器测得的信息

1
2
3
4
5
6
from microbit import *

while True:
    distance = pin1.read_analog()
    print(distance)  # 说明
    sleep(100)

写完代码后,我们需要将代码烧入(flash)到microbit,在编辑器中点击flash即可。microbit背后的信号灯开始闪烁,片刻之后,闪烁停止,代码烧入即已完成。

此时打开编辑器上的REPL按钮,将看到红外测距传感器输出的模拟信号。

repl

这些模拟信号并不是真实的距离。在这个例子中,我们并不需要知道模拟信号如何转化为距离,我们只需要观察模拟信号与距离的关系即可。

mu-editor可以将打印出来的模拟信号绘制成一条曲线

plotter

为了将模拟信号绘制成曲线,需要微调一下代码

1
2
3
4
5
6
from microbit import *

while True:
    distance = pin1.read_analog()
    print((distance,)) # 
    sleep(100)

将distance改为 (distance,)(distance,)是python中的元组。Plotter会将元组中的数据绘制成图像。可以暂时不关心这些,这些只是语法上的约定,对于学习编程没有特别重要。需要时查一下规则就行,不必去记它。

重新烧入(flash),点击Plotter按钮,即可看到红外测距传感器输出的信号被绘制成了图像。如果你观察仔细,会发现信号中存在噪声。

将你的手掌从远到近,逐渐靠近红外测距传感器,你将看到曲线的变化。距离越近,数值越大

演示

经过一番实验,我将临界值设为700. 当我的手离机器人大约10多厘米时,图中数值大约是700。我们用这个数值表达:有东西机器人很近,翻译成你看到的场面就是: 你正把拿着硬币靠近机器人,准备放在它手上。

mu-editor是个非常好的Python编辑器,它使用简单,对初学者友好,很适合用来做一些探索性的实验。

舵机

下边来说说舵机。我们采用SG90舵机,这是使用最广的控制舵机,价格低廉。

如果你对舵机的控制原理有兴趣,可以使用搜索引擎做细致的了解(PWM)。在此我们只需知道,通过编程可以控制舵机转动某个角度就足够了。

SG90舵机如图所示。

sg90
  • 红色: VCC
  • 棕色: GND
  • 橙黄是信号线(脉冲输入)

将舵机的橙黄是信号线接在microbit的pin0上。

最初我完全准备采用Python来实现Hungry Robot的控制逻辑,结果发现,使用Python控制SG90舵机并不方便,社区里有人写了一些通用的源码,来精确控制舵机转动角度,但源码似乎有问题servo.py

最终决定采用makecode来编程。

最终项目

先把最终项目的源码直接放上来,大家可以点击查看

梳理一下代码逻辑:在一个无限循环中,不断检测红外测距传感器测得的距离,当距离小于临界值时(说明有人给它喂食),则调用eat函数,eat函数用于驱动舵机:从180度的位置,转动都60度的位置,再转回去,舵机带动手臂,于是完成了进食。这些角度通过实验来获得。

tips

推荐使用电脑或移动电源为microbit供电,使用5号电池组供电,可能无法驱动电机。

scratch3-dapter版hungry robot

使用scratch3-dapter将hungry robot的舵机接管到scratch3中,如此一来,就可以让hungry robot与所有扩展交互,诸如接入物联网或人工智能。

makecode固件部分的源码

scratch部分的源码为:

在我的例子中,我将hungry robot与声音响度积木结合,当我们给hungry robot喂食时,它无动于衷,只有我们敲敲碗,它才张嘴吃东西。我们于是制作了一个巴布洛夫的robot

后话: 漫游者计划

某天逛树莓派社区,发现NASA(美国国家航空航天局)开放了一个教育项目: JPL Open Source Rover Project。我很喜欢这个项目,但制作这个项目可能得花费我好多个周末的时间。想在青旅(我在南京和朋友一起开了家青旅)中邀请更多的人周末一起来制作这个项目,召集那些对此有热情的人,大家分工协作。如此一来,就不会像大多的个人周末项目,因为遇到困难而放弃。更多的人参与,意味着,更多元的技能,以及更多的碰撞和灵感。好比我极不擅长拼搭的工作,但善于编程。在这个过程里,我就可以观察和学习那些善于拼搭的人,是如何做好这个工作的,同时,我也可以带着那些渴望获得编程技能的小伙伴一起编程。

那我自己是否应该先拼完下整个项目,有了充分把握,再带着大家一起做呢?

我很快否定了这个想法,我并不乐意对项目了然于心,之后作为老师/志愿者带着大家玩。这个过程,不只教学者没有获得成长,学习者也无法看到制作项目的真实过程。制作真实的项目,会遇到困难,需要思考来解决问题。如果有个人充当上帝的角色,什么都懂,也设计了路线,那么其他人只是按照固定的流程在做机械性的工作。这没什么价值。我希望让大家参与到真实项目里。这也是我们吸引志愿者以及有专长的人的原因,他们不只是来做贡献,所有人都将面对未知、获得成长。不喜欢课堂上的那种不真实,我喜欢杜威说的

education as life

生活没有彩排,每天都是现场直播,这正是它有趣且令人充满热情的原因。

漫游者计划希望去实践这些。我这个月底去广州,我们会在天河的中心区域拿下一个办公室,它是可编程的,而且会非常酷。我们在其中创作各种好玩的项目,我们也在其中办公以及交流,我们会开放它,作为漫游者计划的据点之一。

在漫游者计划中。参与者、志愿者、学习者、教师这些角色融为一体。或者说我们不需要这些角色分类,在这儿,只有协作者,即便是一对父母带着他们的孩子前来,他们也是平等的协作者。对参与者的年龄没有限制,多元总是好的,它会带来更多的创意。

我将漫游者计划视为探索codelab.club的一步。它club的一种形式。

其他的club形式会并行运作。诸如邀请制的club,在这种club中,我们每周末的晚上,会进行线下成员聚会,会邀请一些有趣的hacker/maker做分享和交流,大家分享有趣的信息以及各自正在制作的项目。这种club是邀请制,你可以邀请你周围最聪明的朋友加入,但要求申请者有自己的作品,且能展示自己创作和分享的热情。

参考