Arduino系统是电子积木式创意工具,它的官网:https://www.arduino.cc/。而乐高NXT套件是国际公认的机器人原型创意工具,LEGO的官网:https://mindstorms.lego.com/en-US/default.aspx?icmp=COFranchiseUSMINDSTORMS。乐高NXT套件虽然有自己的电控积木,但它还是以机械结构件见长。Arduino系统主要是电控产品,某些公司虽然给Arduino系统定制了一些例如舵机、传感器连接板和智能车车身等金属结构件,但与乐高机械结构件相差甚远,主要表现这几个方面:1、搭建方案的网络共享资源的丰富性;2、搭建积木的种类和搭建灵活性;3、国际知名度和用户人群数量。所以我在想为啥不把Arduino电子积木与LEGO机械积木结合起来做创意作品,让Arduino人群与LEGO人群相互交流。

     看上图,Arduino控制器读取电位计的模数转换值,然后换算成舵机的角度位置,输出并驱动舵机,于是转动电位计手柄,舵机上的乐高人偶就会随之转动,蛮卡通。看视频:

    现在谈谈如何用乐高Technic电池盒供电;如何把舵机输出轴与乐高结构件连接起来。

    这次舵机控制实验采用的是DFRobot公司出品的Arduino Duemilanove 328主板和 传感器扩展板V5,网址:https://dfrobot.taobao.com/
 
    由于舵机驱动需要较大电流,所以单独给Arduino主板供电并驱动舵机,会使Arduino主板上的电源芯片发热甚至烧毁,于是最好采用两套电源,一套电源,我用9V方形电池通过电源线上的插头插到Arduino主板的圆孔插座中,给Arduino主板供电,另一套电源,我用乐高Technic电池盒单独给Arduino主板上传感器扩展板的舵机电源端子供电,驱动舵机。传感器扩展板V5可以自动隔离两套电源,记住舵机供电电压不能超过7.2v,乐高Technic电池盒里我装上了6节5号充电电池,一节充电电池最大电压是1.2v,正好6节电池电压为7.2v。
       乐高Technic电池盒电源线是四根线组成,那么哪两根线是电源的VCC线和GND线。看下图:
    应该是最边上的两根线,至于哪根线是VCC线和GND线,用万用表量一下,就判断出来了,注意别短路了,我用电工胶布把没用的另两根线绝缘了。
     乐高的NXT套件和散件都可以从淘宝轻易买到的,比如这个乐高电池盒的购买网址:https://shop58786155.taobao.com/search.htm?spm=1103wg5H.1-bW8K*.6-5eKRxL&scid=141009670&scname=tefG%2BEVsZWN0cmljKMir0MIp&checkedRange=true&queryType=cat
 
    了解下,Arduino控制器如何与乐高结构件结合,看图:
 
 
    看得出,我找到了一些乐高积木,它们的孔与Arduino板子上的安装孔正好对得上,再用螺钉螺帽连接即可。
    再看下舵机如何与乐高结构件结合:
 
    乐高的皮带轮零件与舵机圆盘联轴器的孔可以对上,我用了两个自攻螺钉把它们连接起来,然后乐高十字轴零件就可以插到皮带轮零件的十字孔里,于是十字轴零件便成为舵机的输出轴!这个输出轴可以带动乐高人偶转,那么可以带动乐高风扇,或者运输机转动吗?当然!
     舵机有很多规格,但所有的舵机都有外接三根控制线,分别用三种颜色进行区分,由于舵机品牌不同,颜色也会有所差异,色为接地线,色为电源正极线,色为信号线。我这个实验把舵机的控制线插接在Arduino传感器扩展板的9号数字端口上,插接方向要根据扩展板的标注来,色线插在GND端子上,色线插在VCC端子上,色线插在D端子上。
 
实验程序:
 
#include 《Servo.h> //声明伺服马达函数库
Servo myservo;  // 定义伺服马达对象
int pot_value = 0;  //把电位计连接在9号模拟量引脚
int val;     //存储电位计模数转换后的数位量
int pos=0;   //马达位置变量
//初始化
void setup()
{
  myservo.attach(9);  //初始化9号引脚来控制马达                     
}
//循环执行主程序中的指令
void loop()
{
  val = analogRead(pot_value);
 // 读取电位计的模数转换值(0到1023之间) 
  pos = map(val, 0, 1023, 0, 179);     
  //把电位计的模数转换值正比转换为伺服马达位置角度
  myservo.write(pos);     // 启动伺服电机转动到指定位置
  delay(15);             // 等待15ms,让马达转动到位
}
   2012来了!龙年大吉!