Tag Archives: ibm

[TJBOT紙板機器人]CAVEDU 組裝設計升級 2.0

您如果還沒看過我們上一篇TJBot組裝心得發表文,趕快去看不用擔心,這不會影響您的閱讀順序,但是可能會少一些閱讀樂趣。

如果您是在【機器人王國商城】shop.robotkingdom.com.tw購買TJBot的套件,請以本篇敘述的方式來組裝。

購買TjBot傳送門:http://shop.robotkingdom.com.tw/humanoid-robot/tjbot01.html

作者/攝影  鄭建彥
時間  15分鐘
成本  總共約新台幣3,675 元 (想買TJBOT材料包可點選 商城連結 )
難度  * * *
材料表
  • TJBot的雷切紙模板
  • Raspberry Pi B+(或是更新的版本、ASUS Tinker也可以)與相關配件(micro SD卡與5V3A變壓器)
  • USB麥克風
  • 小喇叭
  • 5mmLED
  • SG90伺服機
  • 170孔麵包板
  • Raspberry Pi 攝影機(非必須)。

我們的TJBot的雷切圖檔與手臂的3D設計檔:http://www.thingiverse.com/thing:2191961

 

建議工具:

  • 寬度6mm雙面膠。
  • 直尺(金屬製為佳),協助折線用,不用太長。
  • 小隻的十字螺絲起子。
  • 美工刀。

注意事項:

  1. 手還是會弄的髒髒的:因為是雷切紙板,紙板的邊緣會有燒焦的痕跡,組裝時不可避免的會弄到手,愛乾淨的朋友可以帶個手套再來組。
  2. 組裝說明請多看幾次:雖然不是什麼很難的模型,在你動手前,還是請多多參考相關影片https://www.youtube.com/watch?v=bLt3Cf2Ui3o、https://youtu.be/MpL4BeQ3Nqc,或是其他人的組裝分享文(如本篇跟1.0 版之組裝教學),減少不必要的悲劇或是意外。
  3. 紙板折錯方向是會斷掉的:雖然本次的版本已經減少部分容易損壞的部分,部分固定方式改成以雙面膠固定。但雷切出來的折線,不適合反覆彎折,會 斷 掉!請先確定方向再折。若不幸真的斷了,不須覺得世界末日,拿膠帶來黏就好。如果不喜歡膠帶黏過的感覺,沒關係,我們很樂意再賣你一套材料包。
  4. 妥善運用直尺:金屬製15公分直尺會是你組裝的好幫手,除了可以幫你順利的折出完美的轉角,在榫接時也很好用。
  5. 不要硬拔:在取下零件時,請用美工刀將連接處劃開。
  6. 找一個小盒子,把小零件都先放在裡面。
  7. 建議先不要把雙面膠撕開,先確定各部分都在對的地方,確定無誤後,再黏起來。
  8. 注意方向:我是沒有發生啦,但有些朋友會把TJBot的手組到另一邊去。
  9. 錯了就錯了,斷了就斷了,不完美才是特色,最糟不過再來買一套。

這是基於本團隊組裝好幾台TJBot後的心得,在挫折與沮喪之中,跑到河邊看魚逆流而上,由衷讚嘆師父的偉大,有感而發,才開發出來的。

部分組裝方式跟之前的版本相同,如果在本篇看不清楚,可以參考上一篇(點閱數入手)-[TJBOT紙板機器人] 第一次製作機器人就上手-組裝篇

 

STEP 1  組裝底座

在寫有Fold Down的地方貼上雙面膠,正反面都要貼喔。

STEP 2  組裝頭部

方法同STEP 1。

STEP 3 組合下半身

STEP 4. 裝上Raspberry Pi攝影機(選配,但我裝了),沒要裝攝影機的朋友請看STEP 5

STEP 5 放入控制板

上次已經裝過Raspberry Pi,這次我們裝的是剛剛上市的ASUS Tinker,Tinker的外型跟Raspberry Pi完全相容,裝進TJBot完全沒問題。

 

STEP 6裝喇叭與麥克風

喇叭上的電源開關先撥到ON,否則裝好之後不太容易摸到電源開關。

PART 7 裝手臂

之前紙板的手臂不容易順利摺好,經過幾次不愉快的經驗之後,我們決定改用3D印表機製作。如果你想要自己印,歡迎使用我們的設計檔案。

伺服機先歸到中心點:先將伺服機轉到適當的位置,手臂朝上時是中點,往前後都各有90度的動作範圍。

PART 8 組裝固定板

黏上麵包板:我們有預留固定麵包板的位置,把麵包板背面的雙面膠撕開,對準刻痕,黏上去。

 

PART 9 把臉裝上去。

來個完成照!

裝飾一下你的TJBot。(下圖是我家公子們的真跡)

參考資料:

相關文章:

 

[TJBOT紙板機器人] 第一次製作機器人就上手-程式進階篇_語音控制LED

本文將介紹如何在 Raspberry Pi 上設定 TJBot 所需之硬體與軟體環境,並結合 IBM Bluemix 的 Sppech to text 服務打造一台能以語音指令控制LED的機器人。

機器人外殼組裝請參考:http://wp.me/p3T9Qk-5B1

作者/攝影  曾吉弘
時間  6小時(組裝、環境設定與編寫程式等)
成本
難度 * * * * * * *
材料表
  • TjBot紙板模型(未組裝) X1
  • 樹莓派 Raspberry Pi 3 Model B X1
  • 5V3A USB交換式電源供應器 X1
  • Class 10 16G micro SD卡 X1
  • 小喇叭 X1
  • USB 迷你麥克風 X1
  • LED 5mm 白發紅光 X1
  • SG90小型伺服機 X1
  • EIC 170孔麵包板 X1
  • 電阻 220歐姆 X1
  • 線材 X1

1.Raspberry Pi設定

請燒錄最新的 Raspbian 作業系統讓 Raspberry Pi 開機,本文使用 Raspberry Pi 3,但經測試,Raspberry Pi 2 也可正常使用。

2.安裝所需套件

Raspberry Pi 連上網路之後,請依序在 Raspberry Pi 的 terminal 中執行以下指令:

  • sudo apt-get update   (更新可用軟體)
  • sudo apt-get dist-upgrade   (升級軟體)
  • curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash –
  • sudo apt-get install -y nodejs   (安裝js)
  • sudo apt-get install alsa-base alsa-utils (安裝alsa聲音程式)
  • git clone https://github.com/ibmtjbot/tjbot.git (取得本專案之github source)
  • cd tjbot/recipes/speech_to_text (切換到指定資料夾)
  • npm install   (安裝所需之npm套件與檔案)
  • npm install onoff

安裝完之後您的資料夾應該長這樣,有一個 /node_modules 資料夾,裡面是必要的函式庫:

3. Bluemix 設定

本段將介紹如何在 IBM Bluemix 上建立一個 Speech to text 服務。這個服務可以把我們對麥克風說的話轉成文字,讓Raspberry Pi 來辨識並執行對應動作

請註冊一個免費的 IBM bluemix 帳號

 

完成之後完成之後可於畫面左上角點選 [服務]/ [Watson] 即可看到我們所建立的 my-stt-service 服務。

4. 所需零件

所需硬體

   5. 硬體設定

請如下圖連接硬體,GND接到 Pi 的GND,LED則分別將正極接到Raspberry Pi 3 的GPIO14腳位(下圖右排,第4隻),負極則接到Raspberry Pi 3 的GND腳位(下圖右排,第3隻)

 

stt.js

程式大致上分成以下步驟:

  1. 設定Bluemix
    在此須正確輸入您的 Bluemix 帳號密碼
  2. 設定麥克風
    設定麥克風來取得您說話時的語音輸入檔。更多資訊請參考https://www.npmjs.com/package/mic
  3. 把語音指令轉成文字
    本步驟會把麥克風所錄製的聲音檔送到 “Watson Speech to Text”服務,並以”textStream” 回傳轉譯後的文字。可用的語系有以下,請由程式碼中的 var recognizeparams = {
    content_type: ‘audio/l16; rate=44100; channels=2’,
    model: ‘en-US_BroadbandModel’
    };

來設定:

  • zh-CN_NarrowbandModel
  • zh-CN_BroadbandModel
  • pt-BR_NarrowbandModel
  • pt-BR_BroadbandModel
  • ja-JP_NarrowbandModel
  • ja-JP_BroadbandModel
  • fr-FR_BroadbandModel
  • es-ES_NarrowbandModel
  • es-ES_BroadbandModel
  • en-US_NarrowbandModel
  • en-US_BroadbandModel (預設)
  • en-UK_NarrowbandModel
  • en-UK_BroadbandModel
  • ar-AR_BroadbandModel

4.解析文字

在此會在解析後文字中找尋有沒有我們所設定的關鍵字,例如”on”、”off”與”light”。您可以說各種組合,例如”lights on”、”turn the lights on”或”turn on the lights”等等,在此我們使用的文字解析服務而非單純的字串辨識。您可由 parseText 函式中可看到定義關鍵字的方式,您可以根據這樣的架構加入更多關鍵字以及配對,一步步讓您的TJbot 更聰明。

/************************************************************************
* Copyright 2016 IBM Corp. All Rights Reserved.
*
* Watson Maker Kits
*
* This project is licensed under the Apache License 2.0, see LICENSE.*
*
************************************************************************
*
* Control a NeoPixel LED unit connected to a Raspberry Pi pin through voice commands
* Must run with root-level protection
* sudo node stt.js

 Based on example NeoPixel code by Jeremy Garff (jer@jers.net)

 Follow the instructions in http://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/ to
 get the system ready to run this code.
*/

//modified to single LED version, no NeoPixel needed, CAVEDU, Feb 2017

//STEP1
var watson = require('watson-developer-cloud');
var config = require('./config');  // gets our username and passwords from the config.js files
var speech_to_text = watson.speech_to_text({
    username: config.username,
    password: config.password,
    version: config.version
});

//STEP2
// Initiate Microphone Instance to Get audio samples
var mic = require('mic');
var micInstance = mic({ 'rate': '44100', 'channels': '2', 'debug': false, 'exitOnSilence': 6 });
var micInputStream = micInstance.getAudioStream();

micInputStream.on('data', function(data) {
    //console.log("Recieved Input Stream: " + data.length);
});

micInputStream.on('error', function(err) {
    console.log("Error in Input Stream: " + err);
});

micInputStream.on('silence', function() {
    // detect silence.
});
micInstance.start();
console.log("TJBot is listening, you may speak now.");

//設定GPIO來控制LED亮滅
var Gpio = require('onoff').Gpio;
var led = new Gpio(14, 'out');

//STEP3
var recognizeparams = {
  content_type: 'audio/l16; rate=44100; channels=2',
  model: 'en-US_BroadbandModel'  //請由此設定語系
};
var textStream = micInputStream.pipe(
    speech_to_text.createRecognizeStream(recognizeparams)
);

//STEP4
textStream.setEncoding('utf8');
textStream.on('data', function(str) {
    console.log(' ===== Speech to Text ===== : ' + str); // print each text we receive
    parseText(str);
});

textStream.on('error', function(err) {
  console.log(' === Watson Speech to Text : An Error has occurred =====') ; // handle errors
  console.log(err) ;
  console.log("Press <ctrl>+C to exit.") ;
});

function parseText(str) {
    if (containsText(str, "light") && containsText(str, "on")) {
        console.log("Turn ON");
        led.writeSync(1)
    } else if (containsText(str, "light") && containsText(str, "off")) {
        console.log("Turn OFF");
        led.writeSync(0)
    } else {
        console.log("Please say something like turn on/off the light");
    }
}

function containsText(str, keyword) {
    return str.indexOf(keyword) >= 0;
}

7. 測試與執行

請回到您的Pi,把上述程式碼中的 username 與 password 改成您個人的 Bluemix 帳號密碼即可。請在 terminal 中輸入以下指令即可執行本程式:

 

sudo node stt.js

 

請對您的 TJBot 說話吧,只要一句話中包含了關鍵字”on”與”light”,就會亮燈,如果包含關鍵字”off”與”light”則會熄燈。因此您可以說 “light on” 或是 “turn on the light” 都是可以的。

 

如果無法辨識關鍵字會提示您相關的關鍵字。從 parseText 函式中可看到定義關鍵字的方式,您可以根據這樣的架構加入更多關鍵字以及配對,讓您的TJBot 更聰明喔!

 

參考資料:

http://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/

 

相關文章:

[TJBOT紙板機器人] 第一次製作機器人就上手-組裝篇

[IBM Watsonbot ] Facebook粉絲頁聊天機器人

有了線上客服與聊天機器人結合不孤單!!

本文將介紹WatsonBot,這是一個Facebook粉絲頁聊天機器人(當然不需要實體的機器人啦),由台灣IBM所開發。

 

作者/攝影  曾吉弘
時間  馬上開始
成本  $0
難度  * (簡單,別上癮)

您想和他講什麼都可以,他能回覆天氣,搜尋電影美食還有分析照片內容喔。更多內容就一起來玩玩看吧。想了解這項技術的朋友,歡迎報名3/17 的 [IBM x AI 機器人實作坊],帶您用Raspberry Pi 做出一台語音輸入(麥克風)來控制語音輸出(外接喇叭)與LED的機器人,當然會用到 IBM 的相關雲服務啦~   請參考以下影片:

請打開Watsonbot的頁面,開始閒聊吧~ 基本的天氣與關鍵字都沒問題,講一些有的沒的也不至於雞同鴨講。

也會提示使用者如何輸入,例如[地點 + 美食],但我用南機場夜市沒成功。鋼彈倒是有不錯的結果。

可以請WatsonBot幫你找電影,直接回傳網頁連結,但搜尋來源是豆瓣網(https://movie.douban.com/

上傳照片也沒問題,會回傳 image tag 以及基本顏色分析(感謝阿吉老師家的發發當model)

 

相關文章:

 

LinkIt ONE 結合 IBM BlueMix 雲服務 – 即時檢測 DHT11 溫濕度感測器資料

本文是參考 IBM 開發者論壇上 IoTGeek 網友的教學,使用聯發科 LinkIt ONE 開發板經由 Wi-Fi 連上 IBM Bluemix 雲服務。

前置作業:

  1. 註冊 IBM Bluemix ID (可免費試用 30 天)
  2. 作業系統:Microsoft Windows XP/Vista/7/8 或 Mac OS X 10.9 以上。請確認您的電腦已經安裝上述版本的 Arduino IDE 與 LinkIt ONE SDK:教學請點我
  3. Arduino IDE:版本需為 1.5.6-r2 BETA 與 1.5.7 BETA,這是為了配合 LinkIt ONE SDK 的緣故。
  4. 請確認您知道如何將 LinkIt ONE 連上 WiFi:教學請點我

下載 LinkItONE-IBMBluemix 範例程式並修改對應參數

  1. 請由此下載範例草稿碼:https://github.com/iotgeek/LinkItONE-IBMBluemix
  2. 請根據本網頁說明來完成 https://github.com/iotgeek/LinkItONE-IBMBluemix/blob/master/README.md
  3. 如果您有 Grove 擴充板的話,請將其裝上 LinkIt ONE,接著在 D2 腳位上裝一個溫度感測器。

4-15a

  1. 在 Arduino IDE 中開啟 quickstart.ino (在剛剛下載的 .zip 檔中),請將其中的 WiFi 相關資訊(帳號、密碼與 WPA/WEP 加密方式等)修改為您的環境參數。
  2. 在草稿碼中修改 servername,格式:”666666.messaging.internetofthings.ibmcloud.com“, “666666” 是您的組織 (organization) 名稱
  3. 在草稿碼中修改 clientName,格式:”LinkItONE: aabbccddeeff “,”aabbccddeeff ” 是 MAC Address,以 LinkIt ONE 來說就是 2CXXXXXXXXXX (寫在 LinkIt ONE 背面,如下圖);”666666″ 是您的組織 (organization) 名稱 ,裝置種類則是 LinkItONE。

1-07

#define WIFI_AP “your_ap_ssid”                  
// WiFi AP 名稱

#define WIFI_PASSWORD “your_password”      
// 輸入 WiFi AP 密碼

#define WIFI_AUTH LWIFI_WPA
// choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP, depending on security type of your WiFi access point.

char macstr[] = “aabbccddeeff”;
// Enter the device mac address here. You can see the WiFi MAC address printed on the backside                                                                                of the LinkIt ONE board.

上傳並執行

編譯並上傳這份草稿碼到 LinkIt ONE,上傳好之後板子就會連上 WiFi AP (一切順利的話),接著板子就會把溫濕度資料以 MQTT 訊息格式送到 IBM Bluemix。

請用網頁瀏覽器開啟:https://quickstart.internetofthings.ibmcloud.com/#/ ,請在畫面左側輸入您剛剛在 quickstart.ino 中所修改的同一組 MAC Address,再按下 “Go” 就可以看到來自 LinkIt ONE 的即時溫溼度資料:

ibmInternetofthingsfoundation_quickstart

執行畫面如下圖。您也可以從同一個帳號下管理所有連到您的 IBM Bluemix 下的各種裝置。

QuickStart_graph2

 

quickstart.ino

/*
  MQTT IOT Example - LinkIt One board to IBM Bluemix Connection quick start
 - continuously obtains values from the Virtuabotix DHT11 temperature/humidity sensor
 - formats the results as a JSON string for the IBM IOT example
 - connects to an MQTT server (either local or at the IBM IOT Cloud)
 - and publishes the JSON String to the topic named quickstart:MY_MAC_ADDRESS
 */



#include <SPI.h>


#include <LWiFi.h>
#include <LWiFiClient.h>
#include "DHT.h"

/* PubSubClient has been taken from https://github.com/knolleary/pubsubclient/tree/master/PubSubClient */
#include <PubSubClient.h>

#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)

/* Modification Needed : 
   Enter your WIFI Access Credentials. 
*/
#define WIFI_AP "your_ap_ssid"
#define WIFI_PASSWORD "your_password"
#define WIFI_AUTH LWIFI_WEP  // choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP.



char macstr[] = "aabbccddeeff";  // Enter the device mac address here



// Note this next value is only used if you intend to test against a local MQTT server
byte localserver[] = {192,168,1,196};

char servername[] = "quickstart.messaging.internetofthings.ibmcloud.com";
String clientName = String("d:quickstart:arduino:") + macstr; 
String topicName = String("iot-2/evt/status/fmt/json");

float tempF = 0.0;
float tempC = 0.0;
float humidity = 0.0;

DHT dht(DHTPIN, DHTTYPE);
LWiFiClient wifiClient;
PubSubClient client(servername, 1883, 0, wifiClient);

// Uncomment this next line and comment out the line after it to test against a local MQTT server
//PubSubClient client(localserver, 1883, 0, ethClient);


void InitLWiFi()
{
  LWiFi.begin();
  // Keep retrying until connected to AP
  Serial.println("Connecting to AP");
  while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD)))
  {
    delay(1000);
  }
  
  
  Serial.println("Connected to AP");
}

void setup()
{
   Serial.begin(9600);
   dht.begin();
   InitLWiFi();
}

void loop()
{
  IPAddress server(localserver);
  
  char deviceName[] = "Linkitone";
  char clientStr[34];
  clientName.toCharArray(clientStr,34);
  char topicStr[26];
  topicName.toCharArray(topicStr,26);
  
  
  getData();
  
 


  if (!client.connected()) {
    Serial.print("Trying to connect to: ");
    Serial.println(clientStr);
   
    Serial.println("Connecting to server "); 
    while (! client.connect(clientStr))
    {
      Serial.println("Re-Connecting to SERVER");
      delay(3000);
    }
   Serial.println("Connected to server");
    
  }
  
  if (client.connected() ) {
    
    Serial.println("Connected to server : Building jason");
    
    String json = buildJson();
    char jsonStr[200];
    json.toCharArray(jsonStr,200);
    Serial.println("Connected to server : publishing");
    boolean pubresult = client.publish(topicStr,jsonStr);
    Serial.print("attempt to send ");
    Serial.println(jsonStr);
    Serial.print("to ");
    Serial.println(topicStr);
    if (pubresult)
      Serial.println("successfully sent");
    else
      Serial.println("unsuccessfully sent");
  }
  delay(5000);
}

String buildJson() {
  String data = "{";
  data+="\n";
  data+= "\"d\": {";
  data+="\n";
  data+="\"myName\": \"LinkIt ONE DHT11\",";
  data+="\n";
  data+="\"temperature (F)\": ";
  data+=(int)tempF;
  data+= ",";
  data+="\n";
  data+="\"temperature (C)\": ";
  data+=(int)tempC;
  data+= ",";
  data+="\n";
  data+="\"humidity\": ";
  data+=(int)humidity;
  data+="\n";
  data+="}";
  data+="\n";
  data+="}";
  return data;
}

void getData() {

    // Reading temperature or humidity takes about 250 milliseconds!
    // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
    if(dht.readHT(&tempC, &humidity))
    {
        Serial.println("------------------------------");
        Serial.print("temperature = ");
        Serial.println(tempC);
        tempF = (tempC * 2 ) + 30;
        
        Serial.print("humidity = ");
        Serial.println(humidity);
    }
    
    delay(2000);

}
quickstart.ino