ASi (アナンシ) ロボットコンパニオンの製作 — Arduino NanoとLEDマトリクスで表情豊かな相棒を作ろう
必要なパーツと材料
| パーツ | 数量 | 備考 |
|---|---|---|
| Arduino Nano R3 | 1 | 目の表示制御用 |
| SG90 マイクロサーボモーター | 1 | 首 (目) の左右回転用 |
| MAX7219 赤色LEDドットマトリクスディスプレイモジュール | 1 | 8x8が2個で目を構成 |
| 単3電池ボックス (4本用) | 1 | リチウムイオン電池 3.7V 200mAhでも代用可 |
| ネジセット | 1 | |
| 透明アクリル製バスボム用球体シェル | 1 | 頭部カバー用 |
| Adafruit Trinket 5V | 1 | 首のサーボ制御用 (独立動作) |
必要な工具と機械
- 3Dプリンタ (汎用)
- グルーガン (汎用)
プロジェクトの物語
もともとはThingiverseの「Xpider」を作る予定でしたが、Alex Glow氏の「Archimedes」を見て衝撃を受け、自分だけのロボットコンパニオンを作りたくなりました。フクロウ型ではなく、特別な存在にしたいと考え、アフリカの民話に登場するトリックスターであり物語の神「アナンシ (Anansi) 」にインスパイアされ、物語を持つボットとして「ASi」と名付けました (実際はv4で、v1〜v3はプロトタイプ)。
組み立て手順
オリジナルのXpider設計をベースに大幅な改良を加え、多くのパーツを再設計しました。主な3Dプリントパーツは以下の通りです。

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


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

デュアルマイクロコントローラ構成
ASiは2つのマイクロコントローラで制御されます:
- Trinket: サーボを制御し、首をランダムな間隔で左右に振る
- Arduino Nano: MAX7219ドットマトリクス2個で構成される「目」を制御。視線移動、まばたき、様々な表情エフェクトをランダムに再生。人が見ていると目を合わせているように見える効果があります。



電源は2つの小型ブレッドボードに分けて、単3電池4本 (またはリチウムイオン電池) をデイジーチェーン接続しています。リチウムイオン電池を使う場合、なぜか動作が不安定になることがあったため、2個のリチウム電池を同一スイッチで並列接続して同時起動する方式を推奨します。
頭部の製作
頭部はホリデーシーズンに入手したクリスマス用球体オーナメントを使用。一歩引いて黒のスプレーで薄く塗装し、ホットグルーでネックパーツに接着するだけで完成です。



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

ソースコード
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ファイル)
- 脚先端パーツ
- サーボ用回転ギア (サーボホーンに嵌め込んでネジ止め)
- ボディ本体
- 底部パーツ
- 大腿パーツ
- 脚ジョイント
- 脚連結用ネジとナット
- 首回転用ギア (サーボホーンをセンターに通すタイプ推奨)
- 中間パーツ
- 首用サーボホルダー
- ネックプレート (アクリル球を接着する部分)
回路図


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