当乐高遇见Arduino:如何从外部控制乐高组件

当乐高遇见Arduino:如何从外部控制乐高组件

乐高的Mindstorm 套件的发布,将可编程机器人带到了一个新的高度。相比上代RCX产品,该套件配备了更加强劲的主机,增加了红外测距、颜色光线识别等感应器,同时电机也改为伺服控制,可以实现较为精准的转动控制。但官方的套件提供的设备种类有限,尤其是探测模块,在一定程度上限制了创意的发挥。

官方NXT套件只提供了大型电机和中型电机两种动力电机,探测器模块也只有触动、超声波、颜色、红外、温度、电压等几种,受限于主机接口数量,至多只能同时控制4路舵机及4路检测器。乐高提供的图形化编程,虽可以快速实现程序设计,但程序基本以单流程为主,若涉及多探测器多舵机多条件的复杂编程也爱莫能助,需要借助C++等语言来实现。

当乐高遇见Arduino:如何从外部控制乐高组件

Lego图形编程界面支持的设备

很显然乐高的重点在于教育功能的实现而不在于功能模块的数量,但乐高也保留了足够的扩展性。乐高的接口采用NXT socket协议,并且支持I2C协议,为第三方硬件产品的适配提供了可能。国外MindSensors.com上有丰富的扩展模块可选,但是价格昂贵,几个探测器的价格就可以购买一套全新的Mindstorms套件了。

当乐高遇见Arduino:如何从外部控制乐高组件
当乐高遇见Arduino:如何从外部控制乐高组件

MindSensors产品及价格

相应的产品国内并无销售,即便经过复杂繁琐的海淘流程,费劲周折海淘回来的产品也无法直接使用EV3的图形化编程完成程序设计,因为这些模块并没有对应的编程电池,仍需要借助C++等语言代码编程。既然我们需要这种第三方硬件及编程语言扩展的支持,我们应该尽量选择一种在产品易于获取、价格经济、语言简便且迁移性强的解决方案

那如何解决玩家日益增长的功能需求同乐高产品扩展性及经济性之间的矛盾呢?

同为开源的智能硬件产品Arduino的出现,着实让我们眼前一亮。

Arduino核心是一款微处理器,支持数字信号与模拟信号的输入输出。强大的扩展性与标准化的I/O接口,让Arduino几乎无所不能。原生支持的数十种数字或模拟设备,让其可玩性大大增加,而丰富的外接控制芯片,又将其扩展性发挥到极致。这些扩展芯片将需要复杂编程和操控的设备(如步进电机等)以类似与乐高产品模块化的形式连接到Arduino主板上,程序的设计难度也因与控制芯片匹配的库文件的引用而大幅简化,这使得程序可读性提高并能轻松实现不同探测器不同动力设备之间复杂的协同与约束。

Arduino产品线弥补了乐高产品电子模块的不足,并且成本低廉易于获取。但Arduino再强大,也只是一块控制板,虽可快速实现逻辑编程及设备控制,却无法实现机械传动及结构搭建,无法做出完整的产品,而这正是乐高的长处。

当乐高遇见Arduino:如何从外部控制乐高组件

Arduino常用探测器模块

 

Arduino和lego一个强在电子逻辑,一个强在结构搭建,两者优势互补。

借用《Make:Lego and Arduino Projects》中的一句话:

Make amazing robots and gadgets with two of today’s hottest DIY technologies。 With this easy-to-follow guide, you will learn how to build device with Lego Mindstorms NTX2.0 and the Arduino prototyping platform, Mindstorms alone lets you create incredible gadgets. Bring in Arduino for some jaw-dropping functionality and open a whole new world of possibilities.

是的,开启一个充满无限可能新世界。

那么如何让这两款科技结合呢,目前有3种不同的方式:

  1. 纯arduino控制,使用Arduino探测器及非乐高的电机、舵机或步进电机,仅使用乐高的结构与传动功能;

  2. 由Arduino控制乐高探测器(或Arduino探测器)及舵机,相当于用Arduino板子替代乐高主机;

  3. 由乐高主机控制,通过I2C协议,控制Arduino,此时Arduino作为从机,成为乐高的外设探测器扩展板。

三种实现方式对比

当乐高遇见Arduino:如何从外部控制乐高组件

方法1是目前最常见的实现方式;方法3需要在EV3和Arduino中分别编程,非常繁琐,却不失是一种思路。限于篇幅和主题,这两种方法以后再与大家讨论,今天主要讲讲方法2.

方法2可以实现乐高产品线内的闭环,机械结构与动力全由乐高产品实现,也避免出现方法1中乐高舵机闲置浪费的情况。编程也较方法3简单,只需要在Arduino内编程即可,也提高了编程的效率。

选定了思路,接下来面临的就是Arduino与Lego产品通讯的问题。Arduino接口为数模接口,Lego使用的是NXT socket6线接口,两者可以通过L239D芯片通讯。

所以最简单的办法是我们拼一个控制板出来。

当乐高遇见Arduino:如何从外部控制乐高组件

电路图

这种方法简便易行,但长久使用则有诸多不便,接线易松动,面包板还需要额外供电,所以这并不是我们的最优选择。

最优选择是购买成型的扩展板。

目前市面上成型的板子有两种,一是EVShield,一种是Bricktronics。前者同样需要海淘且价格昂贵($75.75);后者淘宝即可购得,使用的便是L239D芯片实现对Lego NXT设备的控制。

当乐高遇见Arduino:如何从外部控制乐高组件

EVshield  与   Bricktronics

本文以Bricktronics为例。

国内可以购得的Bricktronics板子大致分两种,仅可控制舵机和可同时控制检测器和舵机两种:

当乐高遇见Arduino:如何从外部控制乐高组件

图中第一款产品占用Arduino一侧整排接口,可同时控制两路舵机,空出的接口可用于外接各类探测器;第二款产品配合Arduino Mega使用,可同时控制6路舵机及4路探测器,但Mega板子的接口基本全被占用,没被占用的也很难引出使用,适合纯乐高产品线的编程。第三款产品为中间款的升级版,将Arduino Mega未用到的接口引出,用于外接Arduino的探测器或其他外设,同时增加了蓝牙和Wifi的支持,是目前比较完美的板子了。

附一个基于Bricktronics的多探测器多舵机控制的实例,这个实例将会在《当乐高遇见Arduino》系列文章中逐步完善。

当乐高遇见Arduino:如何从外部控制乐高组件

例子中用到了轮组。乐高的舵机能实现1度精准控制,但在实际应用中若要让电机1度1度的低速旋转,电机会有抖动并且到达位置角度时电机不容易锁住(前后扭动乐高大舵机的红色部分转轴,你会发现电机内齿轮组之间有缝隙,齿轮之间不是严密咬合状态)。所以想要较精准的实现旋转控制,最简单的办法是通过轮组的方式,将电机旋转量放大。将需要的小角度旋转转变为电机的较大角度转动以消除抖动减小误差。

当乐高遇见Arduino:如何从外部控制乐高组件

轮组传动

当乐高遇见Arduino:如何从外部控制乐高组件

传感器编程