人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | |
| サーボモーター | 3 | |
| Androidデバイス | 1 | センサー源として使用 |
| レギュレート電源基板 (12V, 5V, 3.3V) | 1 |
必要な工具と機器
- はんだごて
アプリとオンラインサービス
- SensoDuino (Androidアプリ)
プロジェクト概要
低コストで何か新しいことをやりたくて計画しました。ロボティクスは大好きですが、サーボなどのパーツ代がネックで手を出せていませんでした。今回、4個のサーボモーターをわずか13ドルで入手。すでにLinkIt ONEボードとArduinoボードも持っていました。
そこで、安価に人間の頭のように3軸で動くロボットヘッドを作ることにしました。 さまざまなセンサーと手法を検討し、手持ちのパーツだけで実現する方法を見つけました。このプロジェクトで多くのことを学びました。太字で学んだことを強調しています。
スマートフォンの傾きセンサーを使ってヘッドを制御
ステップ1: 必要な材料
使用材料
- Arduino Uno
- LinkIt ONEボード
- サーボモーター 3個
- SensoDuino (無料Androidアプリ) – こちらからダウンロード
- レギュレート電源基板 (12V, 5V, 3.3V出力)
- ユニバーサル基板
- 基板用メスコネクター
- 廃アルミ押出材切れ端
- ホットグルーガン
- 12Vおよび5V ACアダプター
- 装飾用アイテムいろいろ
なぜLinkIt ONEとArduino Unoの両方が必要か
LinkIt ONEボードと3Vサーボを持っているならArduino Unoは不要(私の5VサーボはLinkIt ONEで正常動作しなかったため)。
Arduino UnoとBluetoothモジュールを持っているならLinkIt ONEは不要。
Bluetoothシールドを持っていなかったため、LinkIt ONEとArduino Unoの組み合わせにしました。
ステップ2: 自作サーボシールド
- Arduino用サーボモーターシールドを自作(3Vサーボ使用時でもLinkIt ONEはPWMピンが2本しかないので注意)
- サーボモーター用のシールド基板を作成
- このボードでArduinoピン(3, 5, 6, 9, 10, 11)から最大6個のサーボを制御可能
- 3線式サーボを使用。電源は外部5Vレギュレート電源基板から供給
- サーボ制御時はArduinoにACアダプター電源を使用すること。PCのUSB電源だと振動が発生し、サーボが過熱して破損する原因になります(私のサーボ1個が犠牲になりました)
ステップ3: LinkIt ONE接続
- LinkIt ONEがArduinoと通信してサーボを制御
- LinkIt ONEのTxをArduinoのRxに接続、両方のGNDも共通接続
- データ受信時、Arduinoに転送
※ Arduino Bluetoothシールドがあれば、1ボードで全制御可能です。
ステップ4: サーボ初期位置設定
- 全サーボを90度に設定。上記プログラム(
Servoposition.ino)をArduinoに書き込み - サーボ電源とArduino電源をレギュレート電源基板の5Vと12Vピンに接続
- サーボメスコネクターを、Arduinoデジタルピン3, 5, 6に接続した基板のオスコネクターに挿す
- 12Vアダプターをレギュレート電源基板に接続
- アダプタースイッチオン
- 全モーターがプログラム通り90度に回転
モーターを外し、ローター位置を動かさずに連結します。
Arduino IDEコードはServoposition.inoとして提供
ステップ5: 設計計画
- ヘッドを3軸(X, Y, Z)で回転
- 回動作:
- a) Yaw(ヨー) – 左右を見る
- b) Pitch(ピッチ) – 上下を見る
- c) Roll(ロール) – 横に傾ける
- まず両面テープでサーボを仮配置
- アルミ材をL字に切断し、上部サーボと中部サーボを接続
- サーボホーンを計画通りまたは写真のように接続
- 全サーボの中心が90度で真っ直ぐになるように
- 両面テープで固定し、他サーボと干渉しないか動作確認
ステップ6: 本組み立て
- 永久固定の段階
- 両面テープを1つずつ剥がし、ホットグルーで永久固定
- サーボを傷つけないよう注意
- 再度サーボコネクターをArduinoに接続し、電源投入
- 最終画像のように全サーボが真っ直ぐ立つことを確認
ステップ7: Androidアプリ設定
- AndroidでSensoDuinoを開く。全センサーの読み取り値表示とBluetooth送信が可能
- 最新センサーがリストされ、搭載センサーのみ選択可能
- メニューから「Connect Bluetooth」選択
- 利用可能なBluetoothデバイス一覧表示
- LinkIt ONEのBluetoothを選択
- 本プロジェクトでは「Orientation(方位)」センサーを使用。1つ目のチェックで有効化、2つ目のチェックでBluetooth送信有効化
- メニューの「Performance」で各センサーの更新間隔を設定
ステップ8: コーディング
2つのコードがあります:
- LinkIt ONE用:Bluetoothでモバイルからデータ取得、シリアルポート経由でArduinoに送信
- Arduino用:シリアルポートでデータ受信、文字列結合、
indexOfとsubstringでデータ分割。各軸の値を取得し、Arduinoのmap関数で0-180度に変換してサーボ制御。Bluetoothシールド使用時は要件に合わせてプログラム変更
プログラムの仕組み
- Orientationセンサーでロボットが人間のように頭を動かす
- a) Yaw:磁気方位で0-360度。90-270度の範囲を使用し、180度をサーボの90度(中心)にマッピング。帽子装着時に180度を正面に向ける
- b) Pitch:前方上下。センサー値-180〜+180。-90〜+90を使用
- c) Roll:横傾き。0-90-0--90-0の周期。-90〜90を使用
LinkIt ONEコード: Linkitonehead.ino
Arduinoコード: Arduinohead.ino
ステップ9: 基板の重ね合わせ
- 両シールド基板をマイコンの上に重ねる
- 両面テープで積層固定
- 端子ショートに注意
ステップ10: 手持ちテスト
全電源オン、スマホを手に持ってテスト。Yawで180度(正面)を向いた状態で座り、スマホを動かして3軸すべてのサーボを制御。
ステップ11: 顔の取り付け
- クリスマスシーズンだったので、サンタクロース人形がたくさん売られていた
- 1体購入し、頭部を両面テープで最上部サーボアームに固定
ステップ12: コントロール用帽子の製作
- 普通の帽子を用意
- 帽子前面に両面テープを貼る(写真参照)
- スマホを両面テープで固定
ステップ13: テスト動画(低パフォーマンス)
センサー更新レート250ミリ秒ごとのテスト
ステップ14: 最終動画(高パフォーマンス)
センサー読み取りレート100ミリ秒ごと(1秒10回)での動作
コード
- Servoposition.ino
- Linkitonehead.ino
- Arduinohead.ino
Servoposition.ino (Arduino)
#include <Servo.h>
Servo leftright;
Servo updown;
Servo shake;
void setup() {
Serial.begin(9600);
leftright.attach(3);
updown.attach(5);
shake.attach(6);
leftright.write(90);
updown.write(90);
shake.write(90);
}
void loop() {
}
Linkitonehead.ino (Arduino)
#include <LBT.h>
#include <LBTServer.h>
int readval;
String inputString = "";
String outputString = "";
int firstpoint = 0;
int secondpoint = 0;
void setup() {
if (!LBTServer.begin((uint8_t*)"Sivam_LIO")) {
return;
}
Serial1.begin(9600);
}
void loop() {
uint8_t buf[64];
int bytesRead;
if (LBTServer.connected()) {
while (true) {
bytesRead = LBTServer.readBytes(buf, 32);
if (!bytesRead) break;
inputString = "";
for (int j = 0; j < 32; j++) {
char inChar = char(buf[j]);
inputString += inChar;
}
Serial1.println(inputString);
delay(100);
}
} else {
LBTServer.accept(5);
}
}
Arduinohead.ino (Arduino)
#include <Servo.h>
Servo leftright;
Servo updown;
Servo shake;
String inputString = "";
boolean stringComplete = false;
String teststr2;
String sensorid;
String sensorrecid;
String sensorval1;
String sensorval2;
String sensorval3;
int S1, S2, S3;
int startchr = 0, endchr = 0;
int rot1, rot2, rot3;
void setup() {
Serial.begin(9600);
leftright.attach(3);
updown.attach(5);
shake.attach(6);
}
void loop() {
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
if (inChar != '\n') {
inputString += inChar;
}
}
startchr = inputString.indexOf('>');
if (startchr >= 0) {
endchr = inputString.indexOf('>', startchr + 1);
if (endchr > 0) {
teststr2 = inputString.substring(startchr, endchr);
inputString = inputString.substring(endchr);
startchr = teststr2.indexOf(',');
sensorid = teststr2.substring(1, startchr);
endchr = teststr2.indexOf(',', startchr + 1);
sensorrecid = teststr2.substring(startchr + 1, endchr);
startchr = endchr;
endchr = teststr2.indexOf(',', startchr + 1);
sensorval1 = teststr2.substring(startchr + 1, endchr);
startchr = endchr;
endchr = teststr2.indexOf(',', startchr + 1);
sensorval2 = teststr2.substring(startchr + 1, endchr);
startchr = endchr;
sensorval3 = teststr2.substring(startchr + 1);
S1 = sensorval1.toInt();
S2 = sensorval2.toInt();
S3 = sensorval3.toInt();
rot1 = map(S1, 90, 270, 180, 0);
if (rot1 < 0) rot1 = 0;
else if (rot1 > 180) rot1 = 180;
rot2 = map(S2, -90, 90, 0, 180);
if (rot2 < 0) rot2 = 0;
else if (rot2 > 180) rot2 = 180;
rot3 = map(S3, 90, -90, 0, 180);
if (rot3 < 0) rot3 = 0;
else if (rot3 > 180) rot3 = 180;
if (rot1 != 0 && rot1 != 180) leftright.write(rot1);
if (rot2 != 0 && rot2 != 180) updown.write(rot2);
if (rot3 != 0 && rot3 != 180) shake.write(rot3);
delay(15);
}
}
}
製造プロセス
- DIY Wall-E 風 Raspberry Pi CD ボックスロボット
- ローリングアラームロボット:Raspberry Pi と Google カレンダーで動くスマートモバイル目覚ましシステム
- RasPiRobot Board V2:Raspberry Pi を強力なロボットコントローラーに拡張
- Arduinoで作るモーター駆動のマインクラフト クリーパー ロボット
- アーキメデス:感情センシングAIロボットフクロウ
- Windows 10 IoT Coreで音声制御コンピュータビジョンロボットを構築
- ROSロボット:Raspberry Piでターミナル操作ナビゲーション
- Microsoft KinectをRaspberry Piと統合しSonbiロボットでリアルタイム人物検出
- シンプルPiロボット - Raspberry Piで2WD自律ローバーを構築
- 真の資産:小売業務における人的資本
- ソフトロボットがカメラと影で人間の触れ合いを検出――低コスト・非接触ソリューション