
两年前我接触Arduino时,就感觉它是一个很好的国际流行创意工具,以电控积木见长,主要用于机器人和互动媒体作品的创意。但把它用到机器人上,却没有百搭型的机械积木与其配合,所以又从网上发现了另一个国际流行的创意工具,乐高LEGO,又花费了我一年多的时间去探讨LEGO,对它有了比较深的了解,训练出了一定的设计和搭建功力。目前我正在努力把两者结合起来,让机器人作品创意更加方便和有效率。
乐高NXT机器人套件NXT不仅有丰富种类的机械机构件,而且还有些好用的电控积木,特别是有三个NXT伺服电机,不仅可以随意地控制转角,还可以同时控制转速,这是普通舵机做不到的。另外如果Arduino控制器能控制NXT电机,那么可以在基本上不改变机械结构的情况下,把网络上的丰富的NXT机器人作品改装成Arduino作品,我感觉这样,是件很惬意的事!到底现在有没有Arduino控制器与LEGO电控积木的接口板,2011年刚有,是美国货,那就是NXShield接口板,网址:http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=144&MMN_position=73:73。国内爱好者可以用信用卡海淘回来,购买方法:http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=87&MMN_position=54:54。十几天就到货了。看来新东西大都是美国货,我只是Arduino应用者,所以只能花钱购买。算了,别谈这些了,好像我在做广告,晕菜!只是提供下信息,方便大家一起来研讨创客文化。

看看NXShield-D接口板有些什么端口吧,NXShield接口板的NXT端口有8个,分成两组:BANK A和BANK B,并分别排列于板子两侧,每一侧都有2个电机端口和2个传感器端口。还有6个Arduino数字端口,可以接Arduino数字传感器和舵机以及提供PWM信号。可惜的是对于NXShield-D接口板,Arduino模拟量端口已经全部占用了,当然可以用接口板上的I2C接线端再接另一个Arduino控制器,用那个Arduino控制器上的模拟量端口就可以解决这个问题,我下一篇文章就讲这个问题。NXShield-D接口板提供了两组I2C接线端,一个是公头接线端,紧挨着的另一个是母头接线端,I2C接线端为向外扩展Arduino控制器和I2C传感器提供了可能。
我把DFRobot公司出品的Arduino控制板翻过身来,叠放插接在NXShield接口板,形成了一个能控制NXT电机和传感器的Arduino控制器。正好两个板子都是黑的,叠在一起,还蛮COOL的。
现在谈谈如何安装NXShield接口板的Arduino库文件和例子程序到Arduino编程环境里,有了Arduino库文件,控制NXT电控积木,编程就很方便了。
首先您点击这个网站,看官方咋说的。http://www.openelectrons.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=7。网址画面如下图:

点击上图用墨绿色方框标注的图标,就可以下载了,要下载NXShield_AVR-0.0.95.zip
解压后你会发现有“NXShield_AVR”库文件夹和“NXShield_AVR_examples”例子文件夹,再怎么安装到Arduino编程软件里,可以看上图英文说明。您看看,我安装成功了。

这篇文章我介绍NXShield应用的两个例子,一是:用NXT触动传感器控制NXT伺服电机,二是:用Arduino触摸开关控制NXT电机。看视频。
NXShield官方网站有三个PDF说明文档,我看到台湾的网站已经把它们翻译成了中文,可以先下载看看。
8842446333036.zip
台湾这个网站与我博客的思路一样,我经常拜读该网站内容,可是只能翻墙去看,这么好的科技创客网站为啥封了。网址:http://tw.myblog.yahoo.com/lego-caveschool/,台湾在创客文化领域确实跟上了国际潮流,这一点值得我们同根同源的中国人学习啊。

用NXT触动传感器控制NXT伺服电机的程序:
//记住下载程序后,要按下NXShield接口板的“go”按键
#include <Wire.h> //声明I2C库文件
#include <NXShield.h> //声明NXShield库文件
#include <NXTTouch.h> //声明NXT触动传感器库文件
//声明 nxshield为NXShield变量
NXShield nxshield;
//声明NXTTouch为NXTTouch变量
NXTTouch touch1;
void setup()
{
Serial.begin(115200); // 启动串口通讯
delay(500); // 等待500ms
// 初始化NXShield接口板上i2c传感器.
nxshield.init( SH_SoftwareI2C );
Serial.println ("Press GO button to continue");
//等待,直到按下NXShield接口板上 GO 按钮
nxshield.waitForButtonPress(BTN_GO);
// 初始化NXShield接口板上模拟传感器,把它连接到BANK_A的BAS1传感器端口上.
touch1.init( &nxshield, SH_BAS1 );
// 复位NXShield接口板上BANK_B 的NXT电机.
nxshield.bank_b.motorReset();
}
void loop()
{
char str[256];
//如果按下NXTtouch触碰传感器
if ( touch1.isPressed())
{
//NXT电机位于NXShield接口板bank_b的1号电机端口,方向为Forward,功率为50.
nxshield.bank_b.motorRunUnlimited(SH_Motor_1, SH_Direction_Forward, 50);
}
//如果松开NXTtouch触碰传感器
else {
//NXT电机位于NXShield接口板bank_b的1号电机端口,以“精准”方式停车.
nxshield.bank_b.motorStop(SH_Motor_1, SH_Next_Action_Brake);
}
}
用Arduino触摸开关控制NXT伺服电机的程序:
//记住下载程序后,要按下NXShield接口板的“go”按键
#include <Wire.h> //声明I2C库文件
#include <NXShield.h>//声明NXShield库文件
//声明 nxshield为NXShield变量
NXShield nxshield;
int touchPin = 9; // 变量指向触摸开关,把触摸开关连接到数字端口9
int touchState ; // 变量用于存储触摸开关动作状态
//初始化程序
void setup()
{
pinMode(touchPin, INPUT); // 与触摸开关连接的端口定义为输入模式
Serial.begin(115200); // 启动串口通讯
delay(500); //等待500ms
//初始化NXShield接口板上i2c传感器.
nxshield.init( SH_SoftwareI2C );
//等待,直到按下NXShield接口板上 GO 按钮
nxshield.waitForButtonPress(BTN_GO);
// 复位NXShield接口板上BANK_B 的NXT电机.
nxshield.bank_b.motorReset();
}
//主程序
void loop()
{
//读取触摸开关动作状态
touchState = digitalRead(touchPin);
//
if ( touchState == HIGH)
{
//NXT电机位于NXShield接口板bank_b的1号电机端口,方向为Forward,功率为50.
nxshield.bank_b.motorRunUnlimited(SH_Motor_1, SH_Direction_Forward, 50);
}
else {
//NXT电机位于NXShield接口板bank_b的1号电机端口,以“精准”方式停车.
nxshield.bank_b.motorStop(SH_Motor_1, SH_Next_Action_Brake);
}
}
比如控制NXT电机连续旋转的命令,motorRunlimited,点击这个命令,会出现这个命令的说明页面,如下图:
motorRunlimited命令后面跟着三个参数项:SH_Motor,SH_Direction,speed,这三个参数项具体选何种参数,比如SH_Direction,您继续点击SH_Direction,会发现有两种参数可控选择,SH_Direction_Reverse和SH_Direction_Forward,您到底选哪个,先把NXShield买来吧!根据您的Arduino与LEGO结合的作品任务而定。