おわりに
6日でできる!吉野式ロボットのハードウェア編のまとめを行います。
6日目のプログラムを組み合わせれば、簡単な二足歩行ロボットが実現できます。
(これは別途ソフトウェア編で詳しく解説して行きます。)
各部の調整と合わせて、サーボモーターを制御するプログラミングを行います。
// Arduino Humanoid Robot 0.1
// 定義
// Servo
#include
#define MAX_SERVO_NUM 8
Servo servo[MAX_SERVO_NUM];
// サーボのオフセット
// 座標系 ロボットの正面から見て 右→X+ 奥 Y+ 上 Z+
// サーボモーターの番号 ロボットの正面から見て 右すね0 右もも1 左すね2 左すね3 腰 4 右腕 5 左腕 6 頭 7
// 回転方向 前がプラス 後ろがマイナス、正面から見て右がプラスになるように servoDirを設定する。
const int8_t servoDir[MAX_SERVO_NUM] = {1, 1, -1, -1, -1, -1, 1, -1}; // 軸の方向 前が+、右が+
int8_t servoOffset[MAX_SERVO_NUM] = {0,0,0,0,0,0,0,0}; // サーボーの原点オフセット座標(角度)
//const int8_t servoOffset[MAX_SERVO_NUM] = {-2, -10, 0, +4, +5, 0, +4, -4}; // サーボーの原点オフセット座標(角度)
int8_t basicPosition[MAX_SERVO_NUM+1] =
{
{0,0,0,0,0,0,0,0,0}, // 立つ
{1,99,99,99,99,99,99,99,99} // 脱力
};
// 初期設定
// Setup First Power On at Once
void setup() {
// initialize serial communication:
Serial.begin(9600);
// put your setup code here, to run oncel 100 100
// Servo Init:
for (int i = 0; i < MAX_SERVO_NUM; i++)
{
servo[i].attach(i + 2);
servo[i].write(90+servoOffset[i]); // tell servo to go to position in variable 'pos'
delay(1); // waits 15ms for the servo to reach the position
}
delay(200); // waits 15ms for the servo to reach the position
for (int i = 0; i < MAX_SERVO_NUM; i++)
{
// servo[i].writeMicroseconds(0);
servo[i].detach();
}
}
// メインループ
void loop() {
// if there's any serial available, read it:
while (Serial.available() > 0) {
//Serial.print(Serial.available());
char command = Serial.read();
// SERVO Set command
if ( command == 'S' || command == 's' ) // 'S' is Servo Command "S,Servo_no,Angle"
{
Serial.print(command);
Serial.print(',');
int servoNo = Serial.parseInt();
Serial.print(servoNo);
Serial.print(',');
int servoAngle = Serial.parseInt();
Serial.print(servoAngle);
Serial.print('\n');
if ( 0 <= servoNo && servoNo < MAX_SERVO_NUM )
{
servo[servoNo].attach(servoNo + 2);
servo[servoNo].write(servoAngle);
delay(300);
servo[servoNo].detach();
}
} // SERVO Set END
// SERVO All command
if ( command == 'A' || command == 'a' ) // 'A' is Servo All Command "A,Angle0, Angle1...Angle7"
{
Serial.print(command);
int angle[MAX_SERVO_NUM];
for (int i = 0; i < MAX_SERVO_NUM; i++)
{
angle[i] = Serial.parseInt();
Serial.print(',');
Serial.print(angle[i]);
servo[i].attach(i + 2);
}
for (int i = 0; i < MAX_SERVO_NUM; i++)
{
int servoAngle = 90+servoOffset[i] + (angle[i] * servoDir[i]);
if ( 10 < servoAngle && servoAngle < 175)
{
servo[i].write(servoAngle);
}
Serial.print(',');
Serial.print(servoAngle);
}
delay(500);
for (int i = 0; i < MAX_SERVO_NUM; i++)
{
servo[i].detach();
}
Serial.print('\n');
} // SERVO All End
}// End loop
}
// End
//---------------------
調整手順
1.サーボホーン設定
servoCenter を8個全ての初期値を90度にしてロボットを起動します。
90度が基本で、±9度以内ならこの値を設定して調整します。それ以上なら歯がずれているので、一旦サーボホーンを外し、”気をつけ”の姿勢に近くなるようにずらして取り付けます。
SG90はギアが18枚なので、歯一つで 360/18 = 20度となります。
だいたい合っていればOKで、10度以内なら後でソフトウェア的に微調整を行います。
2.モーターの回転方向設定
Ddirection はモーターの回転方向の指定で、’1’が順方向、’-1’が逆方向となります。
ロボットを自分の正面において、自分の方向に来る方を+になるように設定してあります。
首と腰の回転方向はロボットから見て右がプラスで、左がマイナスです。
サーボモーターの番号は、 ロボットの正面から見て
右すね0 右もも1 左すね2 左すね3 腰 4 右腕 5 左腕 6 頭 7
です。
3. サーボ―を動かす
スケッチをArduino Nanoに書き込んでサーボモーターを動かしてみましょう。
サーボモーターをひとつづつ動かすのはSコマンドを使います。
シリアルモニタを起動し、以下のコマンドを送ります。
s,7,10
S はサーボを動かすコマンドで、次にサーボの番号と角度を入れます。
サーボー番号七番は、首のサーボモーターです。
角度はオフセット調整していない絶対角度でしていします。
つまり、90度を入れると正面を向くはずです。
s,7,90
他のサーボモーターも動作を確認しておきます。
4.サーボをまとめて動かす。
サーボモーターをまとめて動かすには、Aコマンドを使います。
Aコマンドは相対角度で指定します。つまりすべて0にすると基本姿勢を取ります。
応答は、コマンド、相対角度、絶対角度の順に返してきます。
シリアルモニタを起動し、以下のコマンドを送ります。
a,0,0,0,0,0,0,0,0
コマンドの応答が返って来たでしょうか。
a,0,0,0,0,0,0,0,0,90,90,90,90,90,90,90,90
aに続き、0 が8個、90が8個返って来たら正常です。
ロボットがちょっと身じろぎするはずです。
次に以下のコマンドを送ります。
a,0,0,0,0,0,0,0,45
コマンドの応答が以下のように帰ってきたら正常です。
a,0,0,0,0,0,0,0,45,90,90,90,90,90,90,90,45
首をロボットから見て右に45度振っているでしょうか
つづいて以下のコマンドを送ります。
a,0,0,0,0,0,0,0,-45
コマンドの応答が以下のように帰ってきたら正常です。
a,0,0,0,0,0,0,0,-45,90,90,90,90,90,90,90,135
首をロボットから見て左に45度振っているでしょうか
最後に頭をホームポジションに戻しておきます。
a,0,0,0,0,0,0,0,0
同様に他のサーボモーターも動作を確認しておきます。
5.姿勢の微調整
サーボモーターが動いた所で、servoOffset の初期値を変更して、ロボットが正しい姿勢で立つように微調整して行きます。
int8_t servoOffset[MAX_SERVO_NUM] = {0,0,0,0,0,0,0,0}; // サーボーの原点オフセット座標(角度)
AコマンドやSコマンドを使って、サーボモーターの初期値をひとつづつ合わせて行きます。
足は左右のずれが、横から見てぴったり重なるように合わせます。
ショートステーには穴が開いているので、重なっていれば穴の向こう側が見えるはずです。
腰は頭がほぼ垂直なるように調整しますが、気持ち自分から見て左(ロボットしては右)に傾けて下さい。
これは、真ん中で丁度バランスがとれると、腰のサーボモーターがプルプルすることがあるので、少し片方に寄せて防ぎます。
腕は上腕が真っすぐ下を向くよう調整して下さい。
プルプルする場合は、肘より下をネジを緩めて少し前に出して固定して下さい。
それでも止まらない場合は、小さなOリングをサーボモーターとサーボ―ホーンの間に挟みます。
頭はしっかり超音波センサーが前を向くように調整します。
プルプルする場合は、小さなOリングをサーボモーターとサーボ―ホーンの間に挟みます。
調査が終わるとこんな感じになります。
const int8_t servoOffset[MAX_SERVO_NUM] = {-2, -10, 0, +4, +5, 0, +4, -4}; // サーボーの原点オフセット座標(角度)
6.機械軸の再調整
吉野式ロボットは、腰が水平になっていることが、正しく歩行する前提条件となっています。
オフセットを調整した後に、よく見て腰が前後、左右に傾いている場合は、足のリンクを回して長さを調整し腰が水平になるように調整して下さい。
オフセットがずれているようなら、再度5をやり直して、しっかりした初期位置を出して下さい。
おしまい
”二足歩行ロボットなんて作るのは意外と簡単だ”と思ってくれれば、公開した甲斐があると言うものです。
機体用の部品は余っていると思うので、おこずかいで部品を追加して二体目を作ったり、友達に分けてあげたり、クラスや部活の全員で作るのも面白いと思います。
【次回予告】
SW編その1では、これまでに紹介した機能を組み合わせて、簡単なモーションを実行するプログラムを公開する予定です。
購入品情報
Oリング
サーボモーターのプルプルを止めるOリングです。
桜シール

Amazonアソシエイト by

このロボットの原典となっている本を最後にのせておきます。
ロボットの自作に興味を持って、原理的にももっと知りたい人は購入しておいて損はないと思います。このブログでは説明が足りない部分がかかれています。
Kindle版:
最初に買ったのはKindle版です。安いですが、本を単純に取り込んだだけなので、文字が小さく、スマホやタブレットの小さい画面では読めません。また、600ページを超える大型本なので、読み込むと端末が重いです。(結局紙の本を買う事に・・・)
デジタル印刷技術を使った最新版です。内容は変わっていないようですが新品が欲しい人はどうぞ。(〇川はコレクションとしては欲しいけど持っていません。)