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

ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう

必要なパーツと材料

パーツ数量備考
Arduino Nano R31目の表示制御用
SG90 マイクロサーボモーター1首 (目) の左右回転用
MAX7219 赤色LEDドットマトリクスディスプレイモジュール18x8が2個で目を構成
単3電池ボックス (4本用)1リチウムイオン電池 3.7V 200mAhでも代用可
ネジセット1
透明アクリル製バスボム用球体シェル1頭部カバー用
Adafruit Trinket 5V1首のサーボ制御用 (独立動作)

必要な工具と機械

プロジェクトの物語

もともとはThingiverseの「Xpider」を作る予定でしたが、Alex Glow氏の「Archimedes」を見て衝撃を受け、自分だけのロボットコンパニオンを作りたくなりました。フクロウ型ではなく、特別な存在にしたいと考え、アフリカの民話に登場するトリックスターであり物語の神「アナンシ (Anansi) 」にインスパイアされ、物語を持つボットとして「ASi」と名付けました (実際はv4で、v1〜v3はプロトタイプ)。

組み立て手順

オリジナルのXpider設計をベースに大幅な改良を加え、多くのパーツを再設計しました。主な3Dプリントパーツは以下の通りです。

ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう

組み立ては直感的ですが、参考画像を掲載します。

ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう
ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう

電子部品の配置はヘッドの上部または下部どちらでも構いませんが、サーボは必ずギアを取り付けた状態で固定してください。

ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう

デュアルマイクロコントローラ構成

ASiは2つのマイクロコントローラで制御されます:

ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう
ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう
ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう

電源は2つの小型ブレッドボードに分けて、単3電池4本 (またはリチウムイオン電池) をデイジーチェーン接続しています。リチウムイオン電池を使う場合、なぜか動作が不安定になることがあったため、2個のリチウム電池を同一スイッチで並列接続して同時起動する方式を推奨します。

頭部の製作

頭部はホリデーシーズンに入手したクリスマス用球体オーナメントを使用。一歩引いて黒のスプレーで薄く塗装し、ホットグルーでネックパーツに接着するだけで完成です。

ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう
ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう
ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう

装着方法

底部の穴にアーマチュアワイヤーを通し、バックパックのショルダーストラップに巻き付けて肩に乗せるスタイルです。

ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう

ソースコード

ASi Eye (Arduino Nano用)

MAX7219 x2で目を制御。ランダムな視線移動、まばたき、多彩な表情エフェクト (クロスアイ、回転、グローなど) を実装。

#include <LedControl.h>

#define PIN_EYES_DIN 12
#define PIN_EYES_CS 11
#define PIN_EYES_CLK 10
LedControl lc = LedControl(PIN_EYES_DIN, PIN_EYES_CLK, PIN_EYES_CS, 2);

// 目のパターン定義
bool rotateMatrix0 = false;
bool rotateMatrix1 = false;
byte eyeBall[8] = {
  B00111100, B01111110, B11111111, B11111111,
  B11111111, B11111111, B01111110, B00111100
};
byte eyePupil = B11100111;
byte eyeCurrent[8];
int currentX, currentY;
int cntLoop = 0, cntEffect = 0;
#define MIN -2
#define MAX 2
#define DELAY_BLINK 40
#define EFFECT_ITERATION 4

void setup() {
  lc.shutdown(0,false); lc.shutdown(1,false);
  lc.setIntensity(0,1); lc.setIntensity(1,1);
  lc.clearDisplay(0); lc.clearDisplay(1);
  // 起動時のLEDテストアニメーション
  byte b = B10000000;
  for (int c=0; c<=7; c++) {
    for (int r=0; r<=7; r++) { setRow(0,r,b); setRow(1,r,b); }
    b >>= 1; delay(50);
  }
  b = B11111111;
  for (int r=0; r<=7; r++) { setRow(0,r,b); setRow(1,r,b); }
  delay(500);
  lc.clearDisplay(0); lc.clearDisplay(1); delay(500);
  randomSeed(analogRead(0));
  displayEyes(0,0); delay(2000);
  blinkEyes(true,false); blinkEyes(false,true); delay(1000);
}

void loop() {
  // ランダムな位置に視線移動
  moveEyes(random(MIN, MAX+1), random(MIN, MAX+1), 50);
  delay(random(5,7) * 500);
  
  // まばたき (20%の確率)
  if (random(0,5) == 0) {
    delay(500); blinkEyes(); delay(500);
  }
  
  // 表情エフェクト (定期的に実行)
  if (EFFECT_ITERATION > 0) {
    cntLoop++;
    if (cntLoop == EFFECT_ITERATION) {
      cntLoop = 0;
      if (cntEffect > 6) cntEffect = 0;
      switch(cntEffect) {
        case 0: crossEyes(); delay(1000); break;
        case 1: roundSpin(2); delay(1000); break;
        case 2: crazySpin(2); delay(1000); break;
        case 3: methEyes(); delay(1000); break;
        case 4: lazyEye(); delay(1000); break;
        case 5: blinkEyes(true,false); blinkEyes(false,true); delay(1000); break;
        case 6: glowEyes(3); delay(1000); break;
      }
      cntEffect++;
    }
  }
}

// 以下、ヘルパー関数群 (blinkEyes, displayEyes, moveEyes, crossEyes, 
// roundSpin, crazySpin, methEyes, lazyEye, glowEyes, setRow, bitswap 等)
// 完全なコードはGitHubまたは元記事参照

ASi Neck with Trinket (Trinket用)

サーボをランダムに動かし、首振り動作を実現。LED点滅も併せて制御。

#define SERVO_PIN 4        // Trinketではピン1または4のみ使用可
#define SERVO_MIN 4        // ~1msパルス
#define SERVO_MAX 26       // ~2msパルス
Adafruit_TiCoServo servo;

void setup(void) {
  #if (F_CPU == 16000000L)
    clock_prescale_set(clock_div_1); // 16MHz Trinket用プリセット設定
  #endif
  servo.attach(SERVO_PIN);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);
}

uint32_t lastLookTime = 0;

void loop(void) {
  unsigned long t = millis();
  // 0.5秒以上経過 & 10%の確率で首振り
  if ((t - lastLookTime) > 500) {
    if (random(10) == 0) {
      servo.write(random(SERVO_MIN, SERVO_MAX));
      lastLookTime = t;
    }
  }
  // 独立して10%の確率でLED点滅 (まばたき風)
  if (random(10) == 0) {
    digitalWrite(LED_PIN, LOW);
    delay(random(50, 250));
    digitalWrite(LED_PIN, HIGH);
  }
  delay(100);
}

3Dプリント用カスタムパーツ (STLファイル)

回路図

ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう
ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう

製造プロセス

  1. Raspberry Pi と Arduino を連携させてロボットを自作:ステップバイステップガイド
  2. DIY Wall-E 風 Raspberry Pi CD ボックスロボット
  3. PiCy:自分だけの小さな Raspberry Pi 搭載ロボットを作ろう
  4. ローリングアラームロボット:Raspberry Pi と Google カレンダーで動くスマートモバイル目覚ましシステム
  5. Arduinoで作るモーター駆動のマインクラフト クリーパー ロボット
  6. アーキメデス:感情センシングAIロボットフクロウ
  7. Windows 10 IoT Coreで音声制御コンピュータビジョンロボットを構築
  8. ROSロボット:Raspberry Piでターミナル操作ナビゲーション
  9. シンプルPiロボット - Raspberry Piで2WD自律ローバーを構築
  10. 飲料ロボットの技術・自動化・業界役割:バブルティー・コーヒー自動化の最前線
  11. ロボット自動化がEV需要急増に対応しバッテリー生産を加速