Rocky Rover: PixyCamとArduino 101でロボットビジョンシステムを構築
必要な部品と材料
| 部品名 | 数量 |
|---|---|
| Arduino 101 | 1 |
| Adafruit Motor/Stepper Shield V2 | 1 |
| SparkFun Dagu DG102 タンクシャーシ | 1 |
| 単3電池 | 1セット |
| USB-A to Bケーブル | 1 |
| Adafruit USBバッテリーパック | 1 |
| M2.5スペーサー(ナット・ネジ付き) | 4 |
| JSTバッテリーコネクター(オス/メス) | 1組 |
| ピンヘッダー 40P 1列 (0.1インチ) | 1 |
| ジャンパーワイヤー(オス-オス) | 1セット |
| Pixy (CMUcam5) | 1 |
| Pixyパンチルトキット | 1 |
使用ツール・サービス
- Arduino IDE
- Blynk(スマホ操作用)
プロジェクト概要
Intel Arduino 101ベースのPixyCam搭載ローバー
Hackster LiveイベントでIntelがスポンサーとなり、Arduino 101が提供されました。Johnathan Hottell氏のチュートリアルに従ってBLEローバーを構築し、さらにPixyCamを追加してビジョン機能を拡張しました。バッテリーホルダーを前方に移動し、パン/チルトカメラを搭載できるようにしています。
PixyCamについて
PixyCamはDIYロボティクス向けの高速ビジョンセンサーです。ボタンを押すだけでオブジェクトを学習でき、数百個のオブジェクトを同時に追跡し、追跡対象のデータのみを出力します。
今回はオレンジ色のカボチャを追跡対象としました。
セットアップとパンチルト機構の組み立て手順はこちら(画像豊富で分かりやすい)。

PixyCam Arduino API
Arduinoでの使用はシンプルです。SPIとPixyヘッダーをインクルードし、グローバルインスタンスを作成します。
#include <SPI.h>
#include <Pixy.h>
Pixy pixy;
最も重要なメソッドはgetBlocks()で、検出されたオブジェクト数を返します。pixy.blocks[]配列で各オブジェクトの情報(シグネチャ番号、中心座標X/Y、幅、高さ、角度、print()メソッド)にアクセスできます。
ローバー用コード(抜粋)
オリジナルのBLEコードをベースに、オブジェクト追跡機能を追加しました。
void setup() {
.....
pixy.init();
....
}
void loop() {
......
static int i = 0;
int j;
uint16_t blocks;
char buf[32];
int32_t panError, tiltError;
blocks = pixy.getBlocks();
if (blocks) {
panError = X_CENTER - pixy.blocks[0].x;
tiltError = pixy.blocks[0].y - Y_CENTER;
panLoop.updatePan(panError);
tiltLoop.update(tiltError);
pixy.setServos(panLoop.m_pos, tiltLoop.m_pos);
i++;
if (i % 10 == 0) {
int trackedBlock = 0;
sprintf(buf, "Detected %d:\n", blocks);
Serial.print(buf);
long maxSize = 0;
for (j = 0; j < blocks; j++) {
sprintf(buf, " block %d: ", j);
Serial.print(buf);
pixy.blocks[j].print();
long newSize = pixy.blocks[j].height * pixy.blocks[j].width;
if (newSize > maxSize) {
trackedBlock = j;
maxSize = newSize;
}
}
// モーター制御ロジック(面積ベースで前進/後退/停止)
int32_t followError = RCS_CENTER_POS - panLoop.m_pos;
size += pixy.blocks[trackedBlock].width * pixy.blocks[trackedBlock].height;
size -= size >> 3;
int forwardSpeed = constrain(400 - (size/256), -100, 400);
int32_t differential = (followError + (followError * forwardSpeed)) >> 8;
int leftSpeed = constrain(forwardSpeed + differential, -400, 400);
int rightSpeed = constrain(forwardSpeed - differential, -400, 400);
motor1->setSpeed(leftSpeed);
motor3->setSpeed(leftSpeed);
motor2->setSpeed(rightSpeed);
motor4->setSpeed(rightSpeed);
double width = pixy.blocks[trackedBlock].width;
if (width <= 5) { }
else if (width < 20 && !running) {
Serial.println("running");
motor1->run(FORWARD); motor3->run(FORWARD);
motor2->run(FORWARD); motor4->run(FORWARD);
running = true;
}
else if (width > 80 && !running) {
Serial.println("running");
motor1->run(BACKWARD); motor3->run(BACKWARD);
motor2->run(BACKWARD); motor4->run(BACKWARD);
running = true;
}
else if (width >= 20 && width <= 80 && running) {
motor1->setSpeed(128); motor2->setSpeed(128);
motor3->setSpeed(128); motor4->setSpeed(128);
motor2->run(RELEASE); motor4->run(RELEASE);
motor1->run(RELEASE); motor3->run(RELEASE);
running = false;
}
}
}
}
Blynkで手動操作する場合は、PixyCamにレンズキャップを付けて干渉を防いでください。
製造プロセス
- Arduino POVクロック:残像効果で浮かび上がるLED時計を自作する
- SERENA:Arduino Mega 2560とTFT LCDタッチスクリーン搭載カスタムアラームシステム
- Arduino駆動3Dプリントロボットアームの製作:ステップバイステップガイド
- Arduinoプロジェクトのための最適化電源ソリューション
- Arduinoベースのヌンチャク操作6自由度ロボットアームキット
- Arduino 101 BLE + Blynk:スマホで操作するBluetooth戦車ロボット
- Arduino 101とtinyTILE BLEでスマートマッチングサングラスを作る
- Arduino UNOとATtiny85で作る携帯型POV(残像)ディスプレイ
- DIY Arduino スマートウォッチ — Apple Watch 風腕時計を自作
- スマート地下室換気システム:Arduinoで湿度制御
- ロボット手術ビジョンシステムの照明設計最適化