首页 >> 幻化重生,送她一只可以行走泰迪熊吧!
幻化重生,送她一只可以行走泰迪熊吧!
来源:  时间:2015-05-05
分享到:

这个行走泰迪熊机器人的大脑是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接口的网络摄像头和麦克风)可以识别人脸和声音。祝享受创客的快乐!