二足歩行ロボット「Baby Dino」を作ろう – Arduino Megaで恐竜ロボット自作
必要な部品と材料
- Arduino Mega 2560 × 1
- 9V電池 × 1
- HC-SR04 超音波距離センサー × 1
- SG90 マイクロサーボ × 5
プロジェクト概要
Baby Dinoは段ボール製の二足歩行ロボットです。脚に各2個、頭に1個の計5個のサーボを搭載し、超音波センサーで障害物を検知して回避動作を行います。簡単な材料で作れる初心者向けロボット工作です。
手順1: はじめに
- ArduinoベースのDIYロボット
- 段ボール製
- 障害物を検知したら左右に回避
手順2: 必要な部品
- Arduino Uno / Nano / Mega のいずれか × 1
- 9gサーボ × 5
- HC-SR04 超音波センサー × 1
- LiPo電池 (2S) または9V電池 × 1
手順3: サーボの原点合わせ
- 調整用プログラム (fix.ino) をダウンロード・書き込み
- 配線図に従ってサーボを接続
- サーボホーンを取り付け、全サーボを90度位置に合わせる
手順4: 設計・切り出し
- 設計データをダウンロードしA4で印刷
- 段ボールに貼り付けて切り出し
手順5: 最終組み立て
- サーボを段ボールに取り付け
- メインプログラム (uBipedino.ino) を書き込み
- サーボと超音波センサーを配線
- ケーブルを尻尾のようにまとめる
- 電池を接続して完成!
コード
fix.ino (サーボ原点合わせ用)
#include
Servo s1, s2, s3, s4, s5;
void setup() {
s1.attach(8); s2.attach(9); s3.attach(10);
s4.attach(11); s5.attach(12);
}
void loop() {
s1.write(90); s2.write(90); s3.write(90);
s4.write(90); s5.write(90);
}
biped (メインプログラム)
#include
#include
// ピン定義 (接続に合わせて変更)
#define IRsensorPin 13 // 超音波センサー代わりにIRセンサー使用時
#define TRIGGER_PIN 12 // 超音波Trig
#define ECHO_PIN 11 // 超音波Echo
#define LEFTLEG 7
#define RIGHTLEG 10
#define LEFTFOOT 8
#define RIGHTFOOT 9
#define HEAD 6
#define MAX_DISTANCE 200 // 最大測定距離(cm)
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
Servo Lleg, Rleg, Lfoot, Rfoot, Head;
int Hcenter = 70;
int RLcenter = 100;
int RFcenter = 65;
int LLcenter = 90;
int LFcenter = 75;
int tAngle = 30; // 傾き角度
int uAngle = 35; // 旋回角度
int sAngle = 35; // 振り角度
int hAngle = Hcenter;
// 前進
void Forward(byte Steps, byte Speed) {
Serial.println("Forward");
TiltRightUp(tAngle, Speed);
for (byte j = 0; j < Steps; ++j) {
SwingRight(sAngle, Speed);
TiltRightDown(tAngle, Speed);
TiltLeftUp(tAngle, Speed);
SwingRcenter(sAngle, Speed);
SwingLeft(sAngle, Speed);
TiltLeftDown(tAngle, Speed);
TiltRightUp(tAngle, Speed);
SwingLcenter(sAngle, Speed);
}
TiltRightDown(tAngle, Speed);
}
// 左旋回
void TurnLeft(byte Steps, byte Speed) {
Serial.println("TurnLeft");
TiltLeftUp(uAngle, Speed);
delay(20);
for (byte j = 0; j < Steps; ++j) {
LeftLegIn(sAngle, Speed);
TiltLeftDown(uAngle, Speed);
TiltRightUp(uAngle, Speed);
delay(20);
LeftLegIcenter(sAngle, Speed);
RightLegOut(sAngle, Speed);
TiltRightDown(uAngle, Speed);
TiltLeftUp(uAngle, Speed);
delay(20);
RightLegOcenter(sAngle, Speed);
}
TiltLeftDown(uAngle, Speed);
}
// 右旋回
void TurnRight(byte Stps, byte Speed) {
Serial.println("TurnRight");
TiltRightUp(uAngle, Speed);
delay(20);
for (byte f = 0; f <= Stps; ++f) {
RightLegIn(sAngle, Speed);
TiltRightDown(uAngle, Speed);
TiltLeftUp(uAngle, Speed);
delay(20);
RightLegIcenter(sAngle, Speed);
LeftLegOut(sAngle, Speed);
TiltLeftDown(uAngle, Speed);
TiltRightUp(uAngle, Speed);
delay(20);
LeftLegOcenter(sAngle, Speed);
}
TiltRightDown(uAngle, Speed);
}
// 頭部制御
void HeadRight() { Serial.println("HeadRight"); Head.write(Hcenter - 105); delay(1000); }
void HeadLeft() { Serial.println("HeadLeft"); Head.write(Hcenter + 105); delay(1000); }
void HeadCenter(){ Serial.println("HeadCenter"); Head.write(Hcenter); delay(1000); }
// 足首傾き制御
void TiltRightUp(byte ang, byte sp) {
for (int i = 0; i <= ang; i += 5) {
Lfoot.write(LFcenter + i); Rfoot.write(RFcenter + i); delay(sp);
}
}
void TiltRightDown(byte ang, byte sp) {
for (int i = ang; i > 0; i -= 5) {
Lfoot.write(LFcenter + i); Rfoot.write(RFcenter + i); delay(sp);
}
}
void TiltLeftUp(byte ang, byte sp) {
for (int i = 0; i <= ang; i += 5) {
Lfoot.write(LFcenter - i); Rfoot.write(RFcenter - i); delay(sp);
}
}
void TiltLeftDown(byte ang, byte sp) {
for (int i = ang; i > 0; i -= 5) {
Lfoot.write(LFcenter - i); Rfoot.write(RFcenter - i); delay(sp);
}
}
// 脚振り制御 (以下同様のパターンで SwingRight, SwingRcenter, SwingLeft, SwingLcenter,
// RightLegIn, RightLegIcenter, RightLegOut, RightLegOcenter,
// LeftLegIn, LeftLegIcenter, LeftLegOut, LeftLegOcenter を定義)
// ... 省略 ...
void setup() {
Serial.begin(19200);
Serial.println("Bipedino setup is running.");
Lleg.attach(LEFTLEG); Rleg.attach(RIGHTLEG);
Lfoot.attach(LEFTFOOT); Rfoot.attach(RIGHTFOOT);
Head.attach(HEAD);
CenterServos();
delay(500);
for (int i = 0; i < 5; ++i) { GetSonar(); delay(1000); }
Serial.println("Bipedino is ready.");
}
void loop() {
unsigned int cmCenter = MAX_DISTANCE, cmLeft = MAX_DISTANCE, cmRight = MAX_DISTANCE;
HeadCenter();
cmCenter = GetSonar();
if (cmCenter < 20) {
HeadRight(); cmRight = GetSonar(); HeadCenter();
if (cmRight > 20) { TurnRight(1, 30); }
else {
HeadLeft(); cmLeft = GetSonar(); HeadCenter();
if (cmLeft > 20) { TurnLeft(1, 30); }
}
} else {
int nSteps = cmCenter / 5;
if (nSteps > 5) nSteps = 5;
else nSteps = 1;
Serial.print("Steps <"); Serial.print(nSteps); Serial.println(">");
for (int n = 0; n < nSteps; n++) Forward(1, 30);
}
}
int GetSonar() {
unsigned int uS = sonar.ping();
Serial.print("Ping: "); Serial.print(uS / US_ROUNDTRIP_CM); Serial.println("cm");
return uS / US_ROUNDTRIP_CM;
}
void CenterServos() {
Lleg.write(LLcenter); Rleg.write(RLcenter);
Lfoot.write(LFcenter); Rfoot.write(RFcenter);
Head.write(Hcenter);
delay(1000);
}
回路図

製造プロセス
- おしゃぶり:設計、安全基準、製造の洞察
- ベビーキャリア:歴史・設計・安全性から見る乳児キャリーの進化
- ベビーワイプの科学と市場:材料、製造、将来トレンド
- ベビーフォーミュラ(乳児用調製粉乳):科学、製造、将来展望
- ベビーカー(ストローラー)の進化と製造:揺り籠から現代プラムまで
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- ArduinoとHC-SR04で作るサーボ駆動障害物回避ロボット
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」