这个行走泰迪熊机器人的大脑是Intel Edison,骨架则是第一代史宾机器人(Robosapien v1)。现在您可以用Robosapien X替代,它价格更低,但是硬件绝对出众,价签标价为100美金,但在亚马逊只需62美金即可买到。Robosapien需要遥控操作,所以笔者尝试将Intel Edison作为云大脑与Robosapien连接。Intel Edison使用的是Atom双核处理器,性能卓越,并自带wifi和蓝牙模块,这样的配置可以轻松的驱动价格实惠的人形机器人,实现真正的人工智能。
第一步:准备材料
● Intel Edison开发套件和Arduino原型扩展板(100美金;您也可以使用价格更划算的SparkFun blocks,因为我们只需要使用控制台(console)USB接口,电压输入接口和一个PWM GPIO接口)
● Robosapien X(价签标价100美金,现在亚马逊零售价为62美金)
● 宜家瓦林比约泰迪熊(15美金)
● 1个移动电源(30美金。从radioshack购买)。您也可以尝试不使用移动电源。
● 4颗1号电池(笔者花费不到5美金在radionshack上购买)
● 公对公和公对母跳线
● 1个红外线二极管(笔者花0.75美金从Ardafruit购得,不包邮。一个额外的可见发光二极管对测试非常有帮助)
● 1个200欧姆的电阻
● 绝缘胶带
● 包装花生
● 用于固定支撑的铁丝
● 魔术贴
● 针线包
准备上面这些材花费笔者200美金多点,对于制作一个智能机器人来说这点花费实在是算不了什么。
当然为了制作智能泰迪熊我们还需要一台电脑(windows, mac, or linux系统均可)
第二步:拆除Robosapien的包装和拆开取出泰迪熊的填充物
● 拆除Robosapien的包装。因为Robosapien的包装很结实,所以需要15分钟的时间拆除包装。
● 将泰迪熊后面的线拆开,能放进Robosapien机器人即可。
● 去掉手掌和脚掌的垫子,以便能漏出Robosapien的手和脚。
● 将泰迪熊里面的所有填充物取出来。
● 为了确保Robosapien正常行走,我们需要保持机器人的重心,因此我们用包装花生填充泰迪熊的头部(只填充头部)。
● 将Robosapien放进泰迪熊中。
第三步:装配Intel Edison和连接二极管
● 根据Edison Arduino的装配说明装配您的Intel Edison。确认Arduino扩展板上的发光二极管正常闪烁和wifi连接正常。
● 将2根合适长度的跳线(公对母)接到Edison的印刷电路板上,跳线公头接电路板。黄色跳线接接地引脚。红色跳线接2号针脚。
● 将200欧姆的电阻与红色跳线连接,电阻的另一端与一小段母对母的跳线连接。
● 红色母对母跳线的末端与红外线二极管的长引脚相连。
● 红外线二极管的短引脚和黄色跳线的末端相连。
● 用绝缘胶带将接头裹好。
● 具体接线情况可以参考上面的图片。
第四步:设置软件
● 新建一个Arduino文件夹,将下面的代码复制进去
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
#include <stdio.h>
#include <stdlib.h>
const int led = 2; //using external LED
const int boardLED=13;
const int waitMS = 25; //1 000 000 / 39 200 = 25.5102040816
const int headerPulse = 6666;
const int headerSpace = 3333;
const int onePulse = 833; //833*3 or 3333
const int oneSpace = 3333;
const int zeroPulse = 833;
const int zeroSpace = 833;
//VERY IMPORTANT NOTE
//delayMicros on an Edison will delay you a minimum of 90MS!!!!
void sendPair(int p, int s, int w)
{
int targetMicros=micros()+p;
int micros1;
int micros2=micros();
while(micros()<targetMicros)
{
int micros1=micros2;
digitalWrite(led, HIGH);
digitalWrite(boardLED, HIGH);
int microsTarget=micros1+w;
//digitalWrite(boardLED, HIGH);
//delayMicroseconds(1);
int micros2;
while((micros2=micros())<microsTarget)
{}
int H=micros2-micros1;
micros1=micros2;
digitalWrite(led, LOW);
digitalWrite(boardLED, LOW);
microsTarget=micros1+w;
while((micros2=micros())<microsTarget)
{}
/*Serial.println("High");
Serial.println(H);
Serial.println(w);
Serial.println("Low");
Serial.println(micros2-micros1);*/
}
delayMicroseconds(s);
}
void sendHeader()
{
sendPair(headerPulse, headerSpace, waitMS);
};
void sendOne()
{
//Serial.println("sendOne!");
sendPair(onePulse, oneSpace, waitMS);
};
void sendZero()
{
//Serial.println("sendZero!");
sendPair(zeroPulse, zeroSpace, waitMS);
};
void sendCommand(unsigned char cmdIn)
{
unsigned char cmd=cmdIn;
Serial.println("Start cmd");
Serial.println(cmd);
sendHeader();
for(int i=0; i<8; i++)
{
//Serial.println(cmd);
if(cmd&128)
sendOne();
else
sendZero();
cmd=cmd<<1;
}
Serial.println("End cmd");
}
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
Serial.begin(9600);
//Serial.println("Launching node");
//system("node &");
//Serial.println("Finished node launch");
pinMode(boardLED, OUTPUT);
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() { // wait for a second
//digitalWrite(led, HIGH);
//
/*
sendHeader();
//wave is 0x88
sendOne();
sendZero();
sendZero();
sendZero();
sendOne();
sendZero();
sendZero();
sendZero();
*/
//
//fopen("/tmp/robocmd","r");
//sendCommand(0x8E); //0x88 high5 0x8E fart
int maxfsize=500;
system("curl https://blazing-fire-1158.firebaseio.com/robosapien.json > /tmp/robocmd.txt");
char *cmdStr = (char*)malloc(maxfsize + 1);
FILE *lockFile = fopen("/tmp/robolock", "r");
if(!lockFile)
{
FILE *cmdFile = fopen("/tmp/robocmd.txt", "rb");
if(cmdFile)
{
fseek(cmdFile, 0, SEEK_END);
long fsize = ftell(cmdFile);
if(fsize<3)
{
fclose(cmdFile);
Serial.println("File length too short. Size in bytes is: ");
Serial.println(fsize);
}
else
{
fseek(cmdFile, 1, SEEK_SET); //avoid leading quote
fread(cmdStr, fsize, 1, cmdFile);
fclose(cmdFile);
cmdStr[fsize] = 0;
cmdStr[fsize-1] = 0; //delete trailing quote
int cmdInt=atoi(cmdStr);
Serial.println("Command Number");
Serial.println(cmdInt);
if(cmdInt>=0)
{
Serial.println("Executing Command");
sendCommand(cmdInt); //0x88 high5 0x8E fart
Serial.println("Command Executed, erasing command from firebase");
system("curl -X PUT -d '\"-1\"' https://blazing-fire-1158.firebaseio.com/robosapien.json");
Serial.println("Command erased");
}
}
}
}
}
● 在firebase上申请一个免费的账号。
● 下载firebase客户端。
● 搜索下面2段代码:
● system("curl https://blazing-fire-1158.firebaseio.com/robosapien.json > /tmp/robocmd.txt");
● system("curl -X PUT -d '\"-1\"' https://blazing-fire-1158.firebaseio.com/robosapien.json");
● 用您自己的账号和密码登陆即可。您可以通过修改curl命令或在firebase控制面板上通过设置身份验证实现安全设置。
● 上传Arduino文件。
第五步:连接Edison和泰迪熊
● Edison的包装盒可以作为组装好的Intel Edison开发板的外壳,记得在外壳弄几个洞,方便USB数据线连接开发板接口和方便红外线二极● 管伸出外壳。
● 用魔术贴将包装盒固定到Robosapien的身体上。为了加固包装盒,您也可以用魔术贴将包装盒和泰迪熊粘到一起。
● 将移动电源固定到Robosapien的身体上,然后连接电源和Edison。
● 用绝缘胶带将红外线二极管粘到泰迪熊头部附近。因为红外线适合短距离数据传输,所以红外线二极管需要靠近泰迪熊头部。
● 警告:除了红外线二极管外,其他所有部件都应该固定在Robosapien的腰部,以保证机器人的重心不变。
● 将泰迪熊的后面缝好,但要留出足够的缝隙,以便手伸进泰迪熊里面连接和断开USB电源。(如果移动电源没电了是需要拿出来充电的。)
● 恭喜您,现在已经用有了一个联网的智能机器人了。
● 你可以访问https://github.com/patrickms/IntelHackathon2014Oct.查看和参考javascript客户端代码和node.js服务。
第六步:未来的打算
Intel Edison本身的功能就很强大。现在的项目是联网的泰迪熊,而对Edison的使用和开发还不够。其实Edison可以运行OpenCV(计算机视觉)和PocketSphinx(声音识别)软件,这就意味着泰迪熊(花30美金装一个UBS接口的网络摄像头和麦克风)可以识别人脸和声音。祝享受创客的快乐!