打造我的聊天機器人!
系列四:使用 IBM IoT 平台和 MQTT 操控機器人動作
前面三個系列的範例都是用 Mac 筆電做收音和播放聲音,如果想要操控機器人的動作的話,那就勢必要有一個真實的機器人硬體了,在以下範例將會用 MTK LinkIt Smart 7688 Duo 來接收 Mac 筆電透過網路傳來的指令,然後驅動步進馬達的轉動,例如動動手臂之類的。
網路連接的部分,會使用到 IBM Bluemix 和 MQTT,範例已經在「IBM Bluemix:連接多組感測器和終端設備」介紹過了,以下快速帶過主要設定,首先先介紹 Node-RED 的邏輯怎麼拉:
其實跟之前範例一模一樣。至於 7688 broker,則是改成接收 Action(動作)的 Event:
IBM IoT out 也是把 Event 改成 Action,用來傳遞控制機器人的動作命令:
這樣就完成了Node-RED部分。
MQTT程式部分將會分為Publish和Subscribe,其中Publish的程式可參考以下範例:
其中在發送事件的地方,第22行程式碼,Event改成了Action,而最後的字串也改成了指令’hello’:
這樣Node-RED的7688 broker才會正確接收到指令。
至於MQTT Subscribe部分,在7688 duo開發版收到MQTT的事件後,還要再把指令傳到7688 duo的Arduino晶片中做控制機器人的處理,因此除了原本的MQTT架構外,還需要使用Serial Port來把指令傳送給Arduino中,而這部分的程式是參考陳伯儒(Blue)的Gitbook。
var SerialPort = require("serialport").SerialPort;serialPort = new SerialPort("/dev/ttyS0", {
baudrate: 57600
}, function () {
console.log('Connected.');
});
因為7688 duo的Linux晶片與Arduino晶片是用ttyS0在溝通,所以這邊SerialPort就帶入ttyS0,而baudrate則是用57600。
iot_client.on("message", function(topic,payload){
if (payload == 'hello') {
serialPort.write('1');
} else if (payload == 'order'){
serialPort.write('2');
} else if (payload == 'check'){
serialPort.write('3');
}
});
如果MQTT收到了 Action 的訊息,那就判斷指令是 hello、order或是check,然後傳送相對應的值到 Arduino 晶片中。
詳細程式範例可參考以下網址:
最後是 Arduino 部分,首先在 setup() 函數中定義 Serial1.begin(57600),也就是與 Linux 晶片溝通的 baudrate 是用 57600。
接下來 loop() 函數中用 Serial1.available() 判斷是否有資料進來,如果有就用Serial1.read() 來接收從 Linux 晶片傳來的資料:
void setup() {
Serial.begin(115200);
Serial1.begin(57600);
}void loop() {
if (Serial1.available()){
byte robot_control = Serial1.read();
if (robot_control != -1) {
switch(robot_control) {
case '1':
// Robot motion 1
break;
case '2':
// Robot motion 2
break;
case '3':
// Robot motion 3
break;
default:
break;
}
}
}
}
其中 switch case 終究能定義不同指令下,機器人的動作各是那些。
最後如果想下載 Arduino 的原始碼可在以下網址下載: