解釋一下運作原理:
- 將大眼仔相對 web cam 的位置, 分成五種級距 (左二, 左一, 中, 右一, 右二).
- 將 Processing + OpenCV 傳回來的人臉框位置, 也分成五種級距 (左二, 左一, 中, 右一, 右二).
- 定義不同位置的大眼仔如何回應人臉框位置.

不同位置的大眼仔, 轉頭的角度會有不同.
程式碼
(Arduino, for master device)
//
// OT108Eyeballs_i2c_m.ino
// - Use I2C bus to control multiple devices
// - Master device
//
#include <Wire.h>
#include <Servo.h>
#include <AniEyeball.h>
#define N_SLAVE 1
#define N_EYEBALL 2
#define FACE_TRACKING_MODE 1
AniEyeball ot108eyeball[N_EYEBALL];
// 眼皮_PIN # i
// 眼球_PIN # i 1
const byte servoPin[N_EYEBALL*2] = {2,3,4,5};
// 定義大眼仔的相對位置
const byte flagAnyEyeballPos[N_EYEBALL] = {FT_R1, FT_R2};
const int WORKING_MODE = FACE_TRACKING_MODE;
// for command string handling (from serial port)
char inData[80];
byte index = 0;
byte count = 0;
#define NO_PREFIX 0
#define S_PREFIX 1
#define P_PREFIX 1
#define E_PREFIX 1
#define TOKEN_S "s"
#define TOKEN_P "p"
#define TOKEN_E "e"
byte pfxS = NO_PREFIX;
byte pfxP = NO_PREFIX;
byte pfxE = NO_PREFIX;
byte sAll = 0; // all slaves mode
byte sNum = 0; // slave-#
byte pNum = 0; // pattern-#
byte eNum = 0; // eyeball-#
byte fFinish = 0;
void setup()
{
Wire.begin();
Serial.begin(9600);
for (int i=0; i<N_EYEBALL; i )
{
ot108eyeball[i].setPinP(servoPin[i*2]);
ot108eyeball[i].setPinB(servoPin[i*2 1]);
if (WORKING_MODE == FACE_TRACKING_MODE)
ot108eyeball[i].setFaceTrackingFlag(flagAnyEyeballPos[i]);
}
}
void loop()
{
while (Serial.available() > 0)
{
char aChar = Serial.read();
if (aChar == '\n')
{
// End of string detected. Time to parse
char *p = inData; //assign the string to *p
int counter = 0; //initialise the counter
String str;
str = strtok(p, ",");
while (str != NULL)
{
Serial.println(str);
ParseCommand(str);
counter ;
str = strtok(NULL, ",");
}
index = 0;
inData[index] = NULL;
Serial.write("done\n");
}
else
{
inData[index] = aChar;
index ;
inData[index] = '\0'; // Keep the string NULL terminated
}
}
if (fFinish)
{
// 全部命令解析完成, 來操控 slave 吧
if (sAll)
{
for (int i=0; i<N_SLAVE; i )
{
//
// 暫且忽略 e 命令吧, 以後有空再補上
//
Wire.beginTransmission(i 1);
Wire.write(pNum);
Wire.endTransmission();
}
}
else
{
// 特定 salves
Wire.beginTransmission(sNum);
Wire.write(pNum);
Wire.endTransmission();
}
// 不光是 slave 要做事, master 自己也要做啊.
for (int i=0; i<N_EYEBALL; i )
{
if (WORKING_MODE == FACE_TRACKING_MODE)
ot108eyeball[i].faceTrackingMoving(pNum);
else
ot108eyeball[i].acting(pNum);
}
resetFlags();
}
// if no inputs from remote, how about letting master device's eyeballs moving
// tweeting();
}
void ParseCommand(String str)
{
// the input commands formats:
// * s
// - all: all slaves
// - (num): slave-#(num)
// * e
// - (num): eyeball-#(num)
// * p
// - (num): pattern-#(num)
//
// the command example:
// s,all,p,1 -> all slaves, run pattern-1
// s,5,e,1,p,3 -> slave-5, eyeball-1, run pattern-3
// s,5,p,3 -> slave-5, all eyeballs, run pattern-3
if (str == TOKEN_S && pfxS == NO_PREFIX) // 開始 s 命令
{
pfxS = S_PREFIX;
}
else if (str == "all" && pfxS == S_PREFIX) // s 命令, all
{
sAll = 1;
pfxS = NO_PREFIX; // s 命令結束
}
else if (pfxP == NO_PREFIX && pfxE == NO_PREFIX && pfxS == S_PREFIX) // 仍在解析 s 命令, 尚未走到 p 或 e 命令
{
sNum = str.toInt();
pfxS = NO_PREFIX; // s 命令結束
}
else if (str == TOKEN_E && pfxE == NO_PREFIX && pfxP == NO_PREFIX && pfxS == NO_PREFIX) // 開始 e 命令
{
pfxE = E_PREFIX;
}
else if (str == TOKEN_P && pfxP == NO_PREFIX && pfxE == NO_PREFIX && pfxS == NO_PREFIX) // 開始 p 命令
{
pfxP = P_PREFIX;
}
else if (pfxE == E_PREFIX && pfxP == NO_PREFIX && pfxS == NO_PREFIX) // 解析 e 命令的參數
{
eNum = str.toInt();
pfxE = NO_PREFIX; // e 命令結束
}
else if (pfxP == P_PREFIX && pfxE == NO_PREFIX && pfxS == NO_PREFIX) // 解析 p 命令的參數
{
pNum = str.toInt();
pfxP = NO_PREFIX; // p 命令結束
fFinish = 1;
}
}
void resetFlags()
{
pfxS = NO_PREFIX;
pfxP = NO_PREFIX;
pfxE = NO_PREFIX;
sAll = 0;
sNum = 0;
pNum = 0;
eNum = 0;
fFinish = 0;
}
(Arduino, for slave device)
//
// OT108Eyeballs_i2c_s.ino
// - Use I2C bus to control multiple devices
// - Slave device
//
#include <Wire.h>
#include <Servo.h>
#include <AniEyeball.h>
#define N_EYEBALL 2
#define FACE_TRACKING_MODE 1
const int SLAVE_ADDRESS = 1;
AniEyeball ot108eyeball[N_EYEBALL];
// 眼皮_PIN # i
// 眼球_PIN # i 1
const byte servoPin[N_EYEBALL*2] = {2,3,4,5};
// 定義大眼仔的相對位置
const byte flagAnyEyeballPos[N_EYEBALL] = {FT_R1, FT_R2};
const int WORKING_MODE = FACE_TRACKING_MODE;
char inByte = 0;
void setup()
{
Wire.begin(SLAVE_ADDRESS); // join I2C bus as a slave with address 1
Wire.onReceive(receiveEvent); // register event
Serial.begin(9600);
for (int i=0; i<N_EYEBALL; i )
{
ot108eyeball[i].setPinP(servoPin[i*2]);
ot108eyeball[i].setPinB(servoPin[i*2 1]);
if (WORKING_MODE == FACE_TRACKING_MODE)
ot108eyeball[i].setFaceTrackingFlag(flagAnyEyeballPos[i]);
}
}
void loop()
{
// 可能要有緩衝, 以免灌進太多指令, 來不及處理
if (inByte)
{
for (int i=0; i<N_EYEBALL; i )
{
if (WORKING_MODE == FACE_TRACKING_MODE)
ot108eyeball[i].faceTrackingMoving(inByte);
else
ot108eyeball[i].acting(inByte);
}
inByte = 0;
}
else
{
//ot108eyeball[i].tweeting();
}
}
void receiveEvent(int howMany)
{
// master 傳來的命令格式為一數值, 代表 pattern-#.
while (Wire.available())
{
inByte = Wire.read();
}
}
(Processing + OpenCV) (感謝 Philip Zheng 提供程式與大力幫忙)
import processing.serial.*;
import processing.video.*;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.CvType;
import org.opencv.core.Size;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.Objdetect;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.awt.image.Raster;
Serial myPort; // Create object from Serial class
String cmdstring = "";
int timeInterval = 500;
int lastUpdate;
Capture cap;
int pixCnt;
BufferedImage bm;
CascadeClassifier faceDetector;
MatOfRect faceDetections;
void setup() {
size(640, 480);
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
println(Core.VERSION);
cap = new Capture(this, width, height);
cap.start();
bm = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
pixCnt = width*height*4;
faceDetector = new CascadeClassifier(dataPath("haarcascade_frontalface_default.xml"));
faceDetections = new MatOfRect();
myPort = new Serial(this, Serial.list()[5], 9600);
lastUpdate = millis() - timeInterval;
}
void convert(PImage _i) {
bm.setRGB(0, 0, _i.width, _i.height, _i.pixels, 0, _i.width);
Raster rr = bm.getRaster();
byte [] b1 = new byte[pixCnt];
rr.getDataElements(0, 0, _i.width, _i.height, b1);
Mat m1 = new Mat(_i.height, _i.width, CvType.CV_8UC4);
m1.put(0, 0, b1);
Mat m2 = new Mat(_i.height, _i.width, CvType.CV_8UC1);
Imgproc.cvtColor(m1, m2, Imgproc.COLOR_BGRA2GRAY);
faceDetector.detectMultiScale(m2, faceDetections, 3, 1,
Objdetect.CASCADE_DO_CANNY_PRUNING, new Size(40, 40), new Size(240, 240));
bm.flush();
m2.release();
m1.release();
}
void draw()
{
if (!cap.available())
return;
background(0);
cap.read();
convert(cap);
image(cap, 0, 0);
for (Rect rect: faceDetections.toArray())
{
noFill();
stroke(255, 0, 0);
rect(rect.x, rect.y, rect.width, rect.height);
//arduino serial command will be here
if (millis()-lastUpdate >= timeInterval)
{
print("1 sec... ");
println(rect.x);
if (rect.x <= 170)
cmdstring = "s,1,p,-2\n";
else if (rect.x > 170 && rect.x <= 270)
cmdstring = "s,1,p,-1\n";
else if (rect.x > 270 && rect.x <= 370)
cmdstring = "s,1,p,0\n";
else if (rect.x > 370 && rect.x <= 470)
cmdstring = "s,1,p,1\n";
else
cmdstring = "s,1,p,2\n";
myPort.write(cmdstring);
lastUpdate = millis();
}
}
}
後記
這示範有幾個地方待改進, 先記下來, 以後有空再慢慢改.
- 人臉框與實際人臉的移動方向左右相反.
- 人臉得很靠近 webcam 才辨識的準.
- 應該改成人群追蹤, 會比較適合開放空間的展示.
[萊恩大兵的其它文章]
自製大四軸
* 自製大四軸, (1) 零組件篇, 遙控器 (Drone, Quadcopter, Futaba, Maker, Arduino, Animatronic Eye)
* 自製大四軸, (2) 零組件篇, 飛控板 (Drone, Quadcopter, MultiWii, Arduino, Futaba, Maker)
* 自製大四軸, (3) 零組件篇, 自行雷切木質機架 (Drone, Quadcopter, Maker, Laser Cut)
* 自製大四軸, (4) 零組件篇, 馬達與電變調整 (Drone, Quadcopter, Maker, Electric Speed Control, Motor)
* 自製大四軸, (5) 組裝篇, 四軸飛行器成形 (Drone, Quadcopter, MultiWii, Arduino, Maker, Electric Speed Control, Motor)
* 自製大四軸, (6) 調整篇, 飛行前兩三事 (Drone, Quadcopter, Maker, Futaba, Arduino, MultiWii)
* 自製大四軸, (7) 充電篇, iMax B6 充電器操作記要 (Charger, Battery)
自動報球速的棒球
* 自動報球速的棒球, (1) 概念與雛形 (Arduino, MPU-6050, HC-06)
* 自動報球速的棒球, (2) 第一版試作品 (Arduino, NanoWii, microSD, MPU6050)
* 自動報球速的棒球, (3) 拋接實驗的數據分析 (Arduino, NanoWii, microSD, MPU6050)
* 做實驗, 寫入 EEPROM 的速度能否跟得上 MPU6050 的數據產出? (Arduino, MPU-6050, EEPROM)
* 筆記, NanoWii, 一些經驗分享 (Arduino, NanoWii, MPU6050)
* Murmur, 很小很強大的穿戴式裝置模組 (Realtag, Bluetooth, CC2540, MPU6050, BMP180)
CC2540 Bluetooth Low Energy
* 筆記, CC2540 Bluetooth Low Energy, (1) 開發環境 架設 (Bluetooth, CC2540)
* 筆記, CC2540 Bluetooth Low Energy, (2) 跑第一個範例程式 (Bluetooth, CC2540)
* 筆記, CC2540 Bluetooth Low Energy, (3) SimpleBLEPeripheral 簡單介紹 (Bluetooth, CC2540)
* 筆記, CC2540 Bluetooth Low Energy, (4) 在智慧手機上執行範例程式 (Bluetooth, CC2540)
* 筆記, CC2540 Bluetooth Low Energy, (5) 偵測與發送 iBeacon 訊號 (Bluetooth, CC2540, iBeacon)
* 實作, iBeacon 發訊器 x 防丟器 (Bluetooth, CC2540, iBeacon)
* 實作, iBeacon 尋寶遊戲 (Bluetooth, CC2540, iBeacon, iOS app)
* 實作, BLE + iOS app, 遙控燈泡君 (Bluetooth, CC2540, iOS app)
* 做實驗, 用 iBeacon 做自動控制的可行性 (Bluetooth, iBeacon, CC2540, Automation, URL Scheme, iOS app)
藍色小鋪一起來做
* 藍色小鋪一起來做, (1) 用 beacon 控制開關的枱燈
* 藍色小鋪一起來做, (2) 講解 BLE CC2540 UART 通訊範例程式 (Bluetooth, CC2540, UART)
* 藍色小鋪一起來做, (3) 藍牙枱燈專案實作 (上) (Bluetooth, CC2540)
* 藍色小鋪一起來做, (4) 藍牙枱燈專案實作 (下) (Bluetooth, CC2540)
* 藍色小鋪一起來做, (5) iBeacon scanner 專案示範與解說 (Bluetooth, CC2540, iBeacon)
* 藍色小鋪一起來做, (6) 完成, 用 iBeacon 控制開關的枱燈 (Bluetooth, CC2540, iBeacon)
小惡魔 無線溫度感測器
* 小惡魔, (1) 溫度感測 + 物聯網 (Electric Imp, Xively, LM35, Internet of Things)
* 小惡魔, (2) 溫度感測 + 物聯網 + 事件觸發 (Electric Imp, Xively, LM35, Internet of Things)
108 大眼仔
* 108 大眼仔, 初登場 (Arduino, SG-90, Maker Faire Taipei 2014, Animatronic Eye)
* 108 大眼仔, 進化, (1) 專屬程式庫 (Arduino, SG90, Animatronic Eye)
* 108 大眼仔, 進化, (2) 當我們串在一起 (Arduino, SG90, Animatronic Eye, I2C)
* 108 大眼仔, 進化, (3) 檢查 Gmail 信箱 (Arduino, SG90, Animatronic Eye, Temboo)
* 108 大眼仔, 進化, (4) 看著我的臉 (Arduino, SG90, Animatronic Eye, OpenCV, Processing, I2C)
* 108 大眼仔, 進化, (5) 迎著人來人往 (Arduino, SG90, Animatronic Eye, OpenCV, Processing, I2C)
* 108 大眼仔, 檢討筆記, 我要一個打十個 (Arduino, SG90, Animatronic Eye)
Plot Clock
* Murmur, 有趣的零件售價
* Murmur, Arduino 保險桿 (Arduino, bumper, 3D printing)
* Murmur, 許一個 maker 分享網站
* Murmur, 物聯網新概念- The Physical Web (Internet of Things, The Physical Web)
* Murmur, 關於 HP Sprout 的一點想法
* Murmur, 說中文很難嗎? (Toy, Reed Switch, Voice Recorder Module)
* Murmur, 停車場自動繳費機的兩三事 (Kiosk)
* Murmur, 為什麼是 WiFi? 關於小米空氣清淨器的一點看法.. (Internet of Things)
* Murmur, 機器人是時尚元素? (Robot, Fashion)
* 體驗, 原住民互動故事書@宜蘭大同鄉泰雅生活館
* 體驗, 蛋生音互動裝置@兒童美術館 (Arduino, 3D Printing, HC-SR04, Interactive)
* 開箱, 鋼彈小劇場 (Pepper's Ghost, GUNDAM)
* 開箱, 偉力控二號機, 小四軸飛行器 (CG022, Quadcopter)
* 偉力控二號機, 修理防護罩與飛行心得 (CG022, Quadcopter)
* 偉力控二號機, 我想有個家 (CG022, Quadcopter)
* 偉控力二號機, 換馬達 (CG022, Quadcopter)
* 偉力控二號機, 盒子上的洞 (CG022, Quadcopter)
* 實作, 電容感應音樂樹
* 修理, 樂高馬達 8883 (LEGO 8883 Power Functions M-Motor)
* 修理, (part 2) 樂高馬達 8883 (LEGO 8883 Power Functions M-Motor)
* 修理, 液晶螢幕 (LCD)
自製大四軸
* 自製大四軸, (1) 零組件篇, 遙控器 (Drone, Quadcopter, Futaba, Maker, Arduino, Animatronic Eye)
* 自製大四軸, (2) 零組件篇, 飛控板 (Drone, Quadcopter, MultiWii, Arduino, Futaba, Maker)
* 自製大四軸, (3) 零組件篇, 自行雷切木質機架 (Drone, Quadcopter, Maker, Laser Cut)
* 自製大四軸, (4) 零組件篇, 馬達與電變調整 (Drone, Quadcopter, Maker, Electric Speed Control, Motor)
* 自製大四軸, (5) 組裝篇, 四軸飛行器成形 (Drone, Quadcopter, MultiWii, Arduino, Maker, Electric Speed Control, Motor)
* 自製大四軸, (6) 調整篇, 飛行前兩三事 (Drone, Quadcopter, Maker, Futaba, Arduino, MultiWii)
* 自製大四軸, (7) 充電篇, iMax B6 充電器操作記要 (Charger, Battery)
自動報球速的棒球
* 自動報球速的棒球, (1) 概念與雛形 (Arduino, MPU-6050, HC-06)
* 自動報球速的棒球, (2) 第一版試作品 (Arduino, NanoWii, microSD, MPU6050)
* 自動報球速的棒球, (3) 拋接實驗的數據分析 (Arduino, NanoWii, microSD, MPU6050)
* 自動報球速的棒球, (2) 第一版試作品 (Arduino, NanoWii, microSD, MPU6050)
* 自動報球速的棒球, (3) 拋接實驗的數據分析 (Arduino, NanoWii, microSD, MPU6050)
* 做實驗, 寫入 EEPROM 的速度能否跟得上 MPU6050 的數據產出? (Arduino, MPU-6050, EEPROM)
* 筆記, NanoWii, 一些經驗分享 (Arduino, NanoWii, MPU6050)
* Murmur, 很小很強大的穿戴式裝置模組 (Realtag, Bluetooth, CC2540, MPU6050, BMP180)
* 筆記, NanoWii, 一些經驗分享 (Arduino, NanoWii, MPU6050)
* Murmur, 很小很強大的穿戴式裝置模組 (Realtag, Bluetooth, CC2540, MPU6050, BMP180)
CC2540 Bluetooth Low Energy
* 筆記, CC2540 Bluetooth Low Energy, (1) 開發環境 架設 (Bluetooth, CC2540)
* 筆記, CC2540 Bluetooth Low Energy, (2) 跑第一個範例程式 (Bluetooth, CC2540)
* 筆記, CC2540 Bluetooth Low Energy, (3) SimpleBLEPeripheral 簡單介紹 (Bluetooth, CC2540)
* 筆記, CC2540 Bluetooth Low Energy, (4) 在智慧手機上執行範例程式 (Bluetooth, CC2540)
* 筆記, CC2540 Bluetooth Low Energy, (5) 偵測與發送 iBeacon 訊號 (Bluetooth, CC2540, iBeacon)
* 實作, iBeacon 發訊器 x 防丟器 (Bluetooth, CC2540, iBeacon)
* 實作, iBeacon 尋寶遊戲 (Bluetooth, CC2540, iBeacon, iOS app)
* 實作, BLE + iOS app, 遙控燈泡君 (Bluetooth, CC2540, iOS app)
* 做實驗, 用 iBeacon 做自動控制的可行性 (Bluetooth, iBeacon, CC2540, Automation, URL Scheme, iOS app)
* 筆記, CC2540 Bluetooth Low Energy, (2) 跑第一個範例程式 (Bluetooth, CC2540)
* 筆記, CC2540 Bluetooth Low Energy, (3) SimpleBLEPeripheral 簡單介紹 (Bluetooth, CC2540)
* 筆記, CC2540 Bluetooth Low Energy, (4) 在智慧手機上執行範例程式 (Bluetooth, CC2540)
* 筆記, CC2540 Bluetooth Low Energy, (5) 偵測與發送 iBeacon 訊號 (Bluetooth, CC2540, iBeacon)
* 實作, iBeacon 發訊器 x 防丟器 (Bluetooth, CC2540, iBeacon)
* 實作, iBeacon 尋寶遊戲 (Bluetooth, CC2540, iBeacon, iOS app)
* 實作, BLE + iOS app, 遙控燈泡君 (Bluetooth, CC2540, iOS app)
* 做實驗, 用 iBeacon 做自動控制的可行性 (Bluetooth, iBeacon, CC2540, Automation, URL Scheme, iOS app)
藍色小鋪一起來做
* 藍色小鋪一起來做, (1) 用 beacon 控制開關的枱燈
* 藍色小鋪一起來做, (2) 講解 BLE CC2540 UART 通訊範例程式 (Bluetooth, CC2540, UART)
* 藍色小鋪一起來做, (3) 藍牙枱燈專案實作 (上) (Bluetooth, CC2540)
* 藍色小鋪一起來做, (4) 藍牙枱燈專案實作 (下) (Bluetooth, CC2540)
* 藍色小鋪一起來做, (5) iBeacon scanner 專案示範與解說 (Bluetooth, CC2540, iBeacon)
* 藍色小鋪一起來做, (6) 完成, 用 iBeacon 控制開關的枱燈 (Bluetooth, CC2540, iBeacon)
小惡魔 無線溫度感測器
* 小惡魔, (1) 溫度感測 + 物聯網 (Electric Imp, Xively, LM35, Internet of Things)
* 小惡魔, (2) 溫度感測 + 物聯網 + 事件觸發 (Electric Imp, Xively, LM35, Internet of Things)
* 小惡魔, (2) 溫度感測 + 物聯網 + 事件觸發 (Electric Imp, Xively, LM35, Internet of Things)
108 大眼仔
Plot Clock
* 體驗, 蛋生音互動裝置@兒童美術館 (Arduino, 3D Printing, HC-SR04, Interactive)
* 實作, 電容感應音樂樹
* 修理, 樂高馬達 8883 (LEGO 8883 Power Functions M-Motor)
* 修理, (part 2) 樂高馬達 8883 (LEGO 8883 Power Functions M-Motor)
* 修理, 液晶螢幕 (LCD)
* 108 大眼仔, 初登場 (Arduino, SG-90, Maker Faire Taipei 2014, Animatronic Eye)
* 108 大眼仔, 進化, (1) 專屬程式庫 (Arduino, SG90, Animatronic Eye)
* 108 大眼仔, 進化, (2) 當我們串在一起 (Arduino, SG90, Animatronic Eye, I2C)
* 108 大眼仔, 進化, (3) 檢查 Gmail 信箱 (Arduino, SG90, Animatronic Eye, Temboo)
* 108 大眼仔, 進化, (4) 看著我的臉 (Arduino, SG90, Animatronic Eye, OpenCV, Processing, I2C)
* 108 大眼仔, 進化, (5) 迎著人來人往 (Arduino, SG90, Animatronic Eye, OpenCV, Processing, I2C)
* 108 大眼仔, 檢討筆記, 我要一個打十個 (Arduino, SG90, Animatronic Eye)
* 108 大眼仔, 進化, (1) 專屬程式庫 (Arduino, SG90, Animatronic Eye)
* 108 大眼仔, 進化, (2) 當我們串在一起 (Arduino, SG90, Animatronic Eye, I2C)
* 108 大眼仔, 進化, (3) 檢查 Gmail 信箱 (Arduino, SG90, Animatronic Eye, Temboo)
* 108 大眼仔, 進化, (4) 看著我的臉 (Arduino, SG90, Animatronic Eye, OpenCV, Processing, I2C)
* 108 大眼仔, 進化, (5) 迎著人來人往 (Arduino, SG90, Animatronic Eye, OpenCV, Processing, I2C)
* 108 大眼仔, 檢討筆記, 我要一個打十個 (Arduino, SG90, Animatronic Eye)
* Murmur, 有趣的零件售價
* Murmur, Arduino 保險桿 (Arduino, bumper, 3D printing)
* Murmur, 許一個 maker 分享網站
* Murmur, 物聯網新概念- The Physical Web (Internet of Things, The Physical Web)
* Murmur, 關於 HP Sprout 的一點想法
* Murmur, 說中文很難嗎? (Toy, Reed Switch, Voice Recorder Module)
* Murmur, 停車場自動繳費機的兩三事 (Kiosk)
* Murmur, 為什麼是 WiFi? 關於小米空氣清淨器的一點看法.. (Internet of Things)
* Murmur, 機器人是時尚元素? (Robot, Fashion)
* 體驗, 原住民互動故事書@宜蘭大同鄉泰雅生活館* Murmur, Arduino 保險桿 (Arduino, bumper, 3D printing)
* Murmur, 許一個 maker 分享網站
* Murmur, 物聯網新概念- The Physical Web (Internet of Things, The Physical Web)
* Murmur, 關於 HP Sprout 的一點想法
* Murmur, 說中文很難嗎? (Toy, Reed Switch, Voice Recorder Module)
* Murmur, 停車場自動繳費機的兩三事 (Kiosk)
* Murmur, 為什麼是 WiFi? 關於小米空氣清淨器的一點看法.. (Internet of Things)
* Murmur, 機器人是時尚元素? (Robot, Fashion)
* 體驗, 蛋生音互動裝置@兒童美術館 (Arduino, 3D Printing, HC-SR04, Interactive)
* 開箱, 鋼彈小劇場 (Pepper's Ghost, GUNDAM)
* 開箱, 偉力控二號機, 小四軸飛行器 (CG022, Quadcopter)
* 偉力控二號機, 修理防護罩與飛行心得 (CG022, Quadcopter)
* 偉力控二號機, 我想有個家 (CG022, Quadcopter)
* 偉控力二號機, 換馬達 (CG022, Quadcopter)
* 偉力控二號機, 盒子上的洞 (CG022, Quadcopter)
* 開箱, 偉力控二號機, 小四軸飛行器 (CG022, Quadcopter)
* 偉力控二號機, 修理防護罩與飛行心得 (CG022, Quadcopter)
* 偉力控二號機, 我想有個家 (CG022, Quadcopter)
* 偉控力二號機, 換馬達 (CG022, Quadcopter)
* 偉力控二號機, 盒子上的洞 (CG022, Quadcopter)
* 修理, 樂高馬達 8883 (LEGO 8883 Power Functions M-Motor)
* 修理, (part 2) 樂高馬達 8883 (LEGO 8883 Power Functions M-Motor)
* 修理, 液晶螢幕 (LCD)


沒有留言:
張貼留言