工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト

部品と材料

部品 数量 備考
Arduino UNO 1
サーボモーター 3
Androidデバイス 1 センサー源として使用
レギュレート電源基板 (12V, 5V, 3.3V) 1

必要な工具と機器

アプリとオンラインサービス

プロジェクト概要

低コストで何か新しいことをやりたくて計画しました。ロボティクスは大好きですが、サーボなどのパーツ代がネックで手を出せていませんでした。今回、4個のサーボモーターをわずか13ドルで入手。すでにLinkIt ONEボードとArduinoボードも持っていました。

そこで、安価に人間の頭のように3軸で動くロボットヘッドを作ることにしました。 さまざまなセンサーと手法を検討し、手持ちのパーツだけで実現する方法を見つけました。このプロジェクトで多くのことを学びました。太字で学んだことを強調しています。

スマートフォンの傾きセンサーを使ってヘッドを制御

ステップ1: 必要な材料

人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト

使用材料

  1. Arduino Uno
  2. LinkIt ONEボード
  3. サーボモーター 3個
  4. SensoDuino (無料Androidアプリ) – こちらからダウンロード
  5. レギュレート電源基板 (12V, 5V, 3.3V出力)
  6. ユニバーサル基板
  7. 基板用メスコネクター
  8. 廃アルミ押出材切れ端
  9. ホットグルーガン
  10. 12Vおよび5V ACアダプター
  11. 装飾用アイテムいろいろ

なぜLinkIt ONEとArduino Unoの両方が必要か

LinkIt ONEボードと3Vサーボを持っているならArduino Unoは不要(私の5VサーボはLinkIt ONEで正常動作しなかったため)。

Arduino UnoとBluetoothモジュールを持っているならLinkIt ONEは不要。

Bluetoothシールドを持っていなかったため、LinkIt ONEとArduino Unoの組み合わせにしました。

ステップ2: 自作サーボシールド

人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
  1. Arduino用サーボモーターシールドを自作(3Vサーボ使用時でもLinkIt ONEはPWMピンが2本しかないので注意)
  2. サーボモーター用のシールド基板を作成
  3. このボードでArduinoピン(3, 5, 6, 9, 10, 11)から最大6個のサーボを制御可能
  4. 3線式サーボを使用。電源は外部5Vレギュレート電源基板から供給
  5. サーボ制御時はArduinoにACアダプター電源を使用すること。PCのUSB電源だと振動が発生し、サーボが過熱して破損する原因になります(私のサーボ1個が犠牲になりました)

ステップ3: LinkIt ONE接続

人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
  1. LinkIt ONEがArduinoと通信してサーボを制御
  2. LinkIt ONEのTxをArduinoのRxに接続、両方のGNDも共通接続
  3. データ受信時、Arduinoに転送

※ Arduino Bluetoothシールドがあれば、1ボードで全制御可能です。

ステップ4: サーボ初期位置設定

人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
  1. 全サーボを90度に設定。上記プログラム(Servoposition.ino)をArduinoに書き込み
  2. サーボ電源とArduino電源をレギュレート電源基板の5Vと12Vピンに接続
  3. サーボメスコネクターを、Arduinoデジタルピン3, 5, 6に接続した基板のオスコネクターに挿す
  4. 12Vアダプターをレギュレート電源基板に接続
  5. アダプタースイッチオン
  6. 全モーターがプログラム通り90度に回転

モーターを外し、ローター位置を動かさずに連結します。

Arduino IDEコードはServoposition.inoとして提供

ステップ5: 設計計画

人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
  1. ヘッドを3軸(X, Y, Z)で回転
  2. 回動作:
    • a) Yaw(ヨー) – 左右を見る
    • b) Pitch(ピッチ) – 上下を見る
    • c) Roll(ロール) – 横に傾ける
  3. まず両面テープでサーボを仮配置
  4. アルミ材をL字に切断し、上部サーボと中部サーボを接続
  5. サーボホーンを計画通りまたは写真のように接続
  6. 全サーボの中心が90度で真っ直ぐになるように
  7. 両面テープで固定し、他サーボと干渉しないか動作確認

ステップ6: 本組み立て

人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
  1. 永久固定の段階
  2. 両面テープを1つずつ剥がし、ホットグルーで永久固定
  3. サーボを傷つけないよう注意
  4. 再度サーボコネクターをArduinoに接続し、電源投入
  5. 最終画像のように全サーボが真っ直ぐ立つことを確認

ステップ7: Androidアプリ設定

人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
  1. AndroidでSensoDuinoを開く。全センサーの読み取り値表示とBluetooth送信が可能
  2. 最新センサーがリストされ、搭載センサーのみ選択可能
  3. メニューから「Connect Bluetooth」選択
  4. 利用可能なBluetoothデバイス一覧表示
  5. LinkIt ONEのBluetoothを選択
  6. 本プロジェクトでは「Orientation(方位)」センサーを使用。1つ目のチェックで有効化、2つ目のチェックでBluetooth送信有効化
  7. メニューの「Performance」で各センサーの更新間隔を設定

ステップ8: コーディング

2つのコードがあります:

  1. LinkIt ONE用:Bluetoothでモバイルからデータ取得、シリアルポート経由でArduinoに送信
  2. Arduino用:シリアルポートでデータ受信、文字列結合、indexOfとsubstringでデータ分割。各軸の値を取得し、Arduinoのmap関数で0-180度に変換してサーボ制御。Bluetoothシールド使用時は要件に合わせてプログラム変更

プログラムの仕組み

  1. Orientationセンサーでロボットが人間のように頭を動かす
  2. a) Yaw:磁気方位で0-360度。90-270度の範囲を使用し、180度をサーボの90度(中心)にマッピング。帽子装着時に180度を正面に向ける
  3. b) Pitch:前方上下。センサー値-180〜+180。-90〜+90を使用
  4. c) Roll:横傾き。0-90-0--90-0の周期。-90〜90を使用

LinkIt ONEコード: Linkitonehead.ino

Arduinoコード: Arduinohead.ino

ステップ9: 基板の重ね合わせ

人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
  1. 両シールド基板をマイコンの上に重ねる
  2. 両面テープで積層固定
  3. 端子ショートに注意

ステップ10: 手持ちテスト

全電源オン、スマホを手に持ってテスト。Yawで180度(正面)を向いた状態で座り、スマホを動かして3軸すべてのサーボを制御。

ステップ11: 顔の取り付け

人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
  1. クリスマスシーズンだったので、サンタクロース人形がたくさん売られていた
  2. 1体購入し、頭部を両面テープで最上部サーボアームに固定

ステップ12: コントロール用帽子の製作

人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
人の頭をロボットヘッドに変身 – Arduino駆動DIYプロジェクト
  1. 普通の帽子を用意
  2. 帽子前面に両面テープを貼る(写真参照)
  3. スマホを両面テープで固定

ステップ13: テスト動画(低パフォーマンス)

センサー更新レート250ミリ秒ごとのテスト

ステップ14: 最終動画(高パフォーマンス)

センサー読み取りレート100ミリ秒ごと(1秒10回)での動作

コード

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);
    }
  }
}

製造プロセス

  1. DIY Wall-E 風 Raspberry Pi CD ボックスロボット
  2. ローリングアラームロボット:Raspberry Pi と Google カレンダーで動くスマートモバイル目覚ましシステム
  3. RasPiRobot Board V2:Raspberry Pi を強力なロボットコントローラーに拡張
  4. Arduinoで作るモーター駆動のマインクラフト クリーパー ロボット
  5. アーキメデス:感情センシングAIロボットフクロウ
  6. Windows 10 IoT Coreで音声制御コンピュータビジョンロボットを構築
  7. ROSロボット:Raspberry Piでターミナル操作ナビゲーション
  8. Microsoft KinectをRaspberry Piと統合しSonbiロボットでリアルタイム人物検出
  9. シンプルPiロボット - Raspberry Piで2WD自律ローバーを構築
  10. 真の資産:小売業務における人的資本
  11. ソフトロボットがカメラと影で人間の触れ合いを検出――低コスト・非接触ソリューション