2019年8月29日木曜日

ESP32でスマホとシリアル通信 その2 BluetoothでLチカ

1.BluetoothでLチカ制御

前回、Bluetoothでの双方向通信に成功しましたので、ついでに少しスケッチを修正してスマホからESP32のLチカを制御した様子が以下の動画です。


撮影が悪くて画面が良く見えませんが、"1"を送信してESP32上の青色LED(LED0)を点灯、"0"で消灯です。LEDの載ってないボードの場合は、適当なLチカ回路を組んでみましょう。

2.改良スケッチ

Lチカ用に改良したスケッチは以下の通りです。
Arduino IDEでESP32の動作テストの際と同様、基板上のLED0を点灯させています。


#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

int outpin = 2;

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32");
  pinMode(outpin, OUTPUT);
}

void loop() {
  if (Serial.available()) {
    SerialBT.write(Serial.read());
  }
  if (SerialBT.available()) {
    char SW = SerialBT.read();

    if (SW == '1'){
        Serial.print("input char is ");
        Serial.print(SW);       
        Serial.println(" / LED ON.");
        digitalWrite(outpin,HIGH);
    }
    else if (SW == '0'){
        Serial.print("input char is ");
        Serial.print(SW); 
        Serial.println(" / LED OFF.");
        digitalWrite(outpin,LOW);
    }
  }
  
  delay(20);
}

3.便利なシリアル通信コントローラアプリ
「Serial Bluetooth Terminal」もとても便利なのですが、ESP32へ定型のコマンドを送るには少々面倒です。そこで「ボタンを押したらLED ON」の様な操作が出来るようなアプリをつくろうかな・・・・と思っていたら、便利なアプリを見つけてしまったのでこちらを使います。(Android studioもインストールしてやる気まんまんだったのですが。。)

使用したのは「BlueTooth Serial Controler」です。
操作画面は次の通りで、CONNECTからESP32と接続し、PREFERENCEから各ボタンにコマンドを割り付けます。今回は左上のボタンの名前を「ON」にしてコマンドは"1"、一つ右のボタン名を「OFF」にして"0"を割り付けました。


それぞれのボタンでLEDの制御が出来ています。
まだ試していませんが、他にもたくさんの機能が実装されていますので、当面はこのアプリで事足りそうです。

4.ついでにPWMでLチカも

ロボット制御の事を考えると、PWM制御の事も確認しておきたいので、PWMを使ったLEDの照度コントロールも試しておきました。
Arduinoでは、servo.hというライブラリを使用していましたが、ESP32ではledcWrite()と言う関数が使えます。
使うLEDはいつものLED0ですが、ledcWrite()を使う際はアナログ出力を使用するため、ピン番号は2では無くA12となります。下のESP-WROOM-32のピンアウト図を見るとGPIOのピン2がアナログのA12と共有されていることが判ります。



ledcWrite()の使い方だけ簡単に説明しておきます。

  1. ledcSetup(chan,freq,bit_num)でチャンネルのパラメータを定義。chanはPWM制御を使うチャンネル番号で、同時に16チャンネル、0~15が使用出来ます。freqはPWM周波数、最大312.5KHz。bit_numはデューティ比設定の分解能で最大8ビット(256段階)です。
  2. ledcAttachPin(pin,chan)でPWM制御するピンを指定。選択したpinにledcSetupで指定した設定が適用されます。
  3. ledcWrite(chan,duty)で明るさを指定して点灯。指定したchanをdutyに設定した値に対応したduty比で点灯させます。dutyはbit_numで指定した値しか取れませんので、bit_numが8の場合は0~255、bit_numが7であれば0-127・・・となります

詳細はこちらのサイトに詳しく載っています。

これを踏まえたうえで、BluetoothからONにするとPWM制御でLEDが点滅するスケッチを書いてみました。


//スマホからの通信でLEDをPWM点灯させる

#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

const int outpin = A12

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32");

  ledcSetup(0,12800,8);
  ledcAttachPin(outpin,0);
}

void loop() {
  static int brightness = 0;
  static int diff = 1;
  static char SW = 0;

  ledcWrite(0, brightness);

  if (SerialBT.available()) {
    SW = SerialBT.read();
    Serial.println(SW);
  }

  if (SW == '1'){
    if (brightness == 0) {
      diff = 1;
    } else if (brightness == 255) {
      diff = -1;
    }
    brightness += diff;
  }

  else if (SW == '0'){
    brightness = 0;
  }
  delayMicroseconds(1000); //1000で点滅サイクル約0.5sec、100で0.05sec、10だと0.005secなので点滅に見えない。
}

6.ledcWriteの限界?

ledcWrite関数でサーボもコントロールできそうなのですが、気になったのがbit_numで定義するデューティ比の分解能です。最大値の8bitとした場合でも256段階にしかなりません。
一方、servo.hでは、周期20msecのPWM信号に対してµsec単位でパルス幅を設定できます。これは20000段階でのデューティ比制御に等しく、ledcWriteで同程度の制御を行う場合は、14bit(16384段階)もしくは15bit(32768段階)に相当します。

ここまで理解したところでledcWrite関数は使えないかなと思いかけたのですが、こちらのサイトで最大16bitの精度で制御を行う方法が紹介されていました。大変参考になります。これならサーボ制御にも問題は無いでしょう。

7.まとめ

ESP32の簡単な使い方は見えてきました。ついでにサーボ制御のテストもやっておこうか、四足ロボットの製作記録も更新したいし、プリメイドAIも3台ゲットしたのに手を付けられていない。。。。

2019年8月28日水曜日

四脚歩行ロボットを作る その6.5 よつあしロボミニはなぜ歩く事ができるのか?

1.きっかけはこのツイート

気になるツイートを見かけました。
M5Stickを使って、小さな4脚ロボットを動かしているのですが、それぞれ1関節だけの新シンプルなロボット。
一本一本の足を見ると、サーボホーンがその場で往復運動をしているだけなので、ロボットはどちらへも進めない様な気がしますが、上手に歩いています。

どうして歩けるのか?
いくつか仮説を立てました。
  1. 足の裏に摩擦力を偏向させる「何か」が貼り付けられている
  2. ロボットの重心がずれていて一方方向の摩擦が強くなり前進できる
  3. 歩くピッチを前後でアンバランスさせることで2と同様の効果を出している
良く観察してみても足の裏になにか細工してる様子は無いし、なによりも面白くないので仮説1は却下。仮説2も最初に目が行くところですが、では前進しか出来ない構造なのか?だとしたら面白くないですね。そしてさらに良く観察すると、前足の方が後足よりも足の動作角度が広く、上下動も激しい。これなら足ごとに制御を変える事で前後進はもとより旋回運動もできそう。と言う事で本命は仮説3とあいなります。

2.仮説をたてたら即検証

なんとなく仮説3がいちばんもっともらしいな、とは思いますが試してみなければわからないので実際に作って検証してみました。


結果は、動画の通り歩く事が出来ました。動画では、前進10歩、更新10歩、左旋回前進10歩、右旋回前進10歩をループしています。

3.構造

検証内容の説明の前に製作したロボットの構造と回路について。

Twitterの動画はSG-90らしきサーボモーター4個の上にM5StickCを載せて制御していますがあいにくM5StickCは持ち合わせが無かったので代わりに以下の部品構成で製作しました。
  1. SG-92R×4台(SG-90の高トルク版。動作速度はほぼ同じ)
  2. 3tアクリル板(適当サイズ)
  3. スイッチ付き電池ボックス、単3×4本
  4. ユニバーサル基板(適当サイズ)
  5. Arduino nano(ユニバーサル基板にてサーボと接続)
製作方法もとても簡略化しています。まずアクリル板にSG-92Rを両面テープで固定。その上に電池ボックスを両面テープで固定して基本構造は完成です。
上手く取り付ければ、アクリル板も不要で電池ボックスにサーボ
制御はArduino nanoで行いますが、入力ピン取り出しの為にユニバーサル基板にピンソケットを立てています。基板上には、Arduino接続用の他、電池から電源入力のための2ピンのピンソケット×1、サーボ出力の為の3ピンのピンヘッダー×4を取り付けました。

ユニバーサル基板は電池ボックスの上にM1ネジで取り付けました。

4.回路

今回使用したArduino NANOのピンアウトと回路は次の通り。

Arduino NANO Pinout


よつあしロボットMINIの回路図
堂々と載せてはいますが、あまりやってはいけない回路になっています。電源に単三エネループ×4を使用していますが、Arduino NANOの外部電源供給はVinへ7V~12Vです。
電源はエネループ直列4本で理論値4.8V、実測5.6Vでした。Vinに入れるには電圧不足ですので、サーボ駆動用電源を共有して5V出力ピンに直結しています。
NANOは駆動電圧5Vなのでこれでもぎりぎり動作していますが、Vinとは異なり保護回路が入っていないため、ボードを破損する可能性があります。

5.動作パターン

今回、仮説3を元に試行錯誤しながら動作パターンをを作成しました。

①基本条件
・各足は、定めたピッチ(角度)に従って、一定のタイミングで往復運動する。
・ピッチは、中点(0°)を中心に対して±の幅をピッチ幅(θ°)として与える。
・右前足と左後足は同位相。左前足と右後足は、右前足と逆位相。
②前進
・左右前足のピッチ幅65°
・左右後足のピッチ幅30°
③後進
・左右前足のピッチ幅30°
・左右後足のピッチ幅65°
④左旋回前進
・右前足のピッチ幅65°
・左前足のピッチ幅50°
・右後足のピッチ幅45°
・左後足のピッチ幅30°
➄右旋回前進
・右前足のピッチ幅50°
・左前足のピッチ幅65°
・右後足のピッチ幅30°
・左後足のピッチ幅45°

※基本動作パターンは上記の通りですが、工作精度やサーボの動作精度などのバランスに合わせて微調整したパラメータをセットしています。概ね、前進力を高めたいサーボのピッチ幅を大きくとる事で調整しています。

6.考察

ロボット組立前はどうして進むことが出来るのか仮説を三つ立てていましたが、いずれも説得力に欠けるものでした。
仮説1でも歩行は可能と思われますが、検証により、その他の方法でも歩く事が出来ると証明できました。

仮説2についてはすべての足のピッチを揃え、荷重バランスのみ変更してもあまり安定した歩行が出来なかったため、却下しました。理想条件では、前後の足で荷重バランスを変えたとしても一本の足が生み出す前進力と後進力がバランスして、進むことにはならないはずです。
一本の足の動きに注目した場合、歩行動作は中立状態の①を原点とし、
①→②→①→③→①という動作の繰り返しとなる。②→①→③の動作と
③→①→②の動作が相殺し合って、どちらかへ進むことは出来ない。
左右の足の動きの合成力を考えた場合、右足の②→①→③の動作と、
左足の③→①→②の動作が同じタイミングで発生し、力を相殺する。
仮説3についてはいちばんもっともらしいかとも思いましたが、重心位置の変化だけでは、仮説2と同様に前進力は得られません。

そこで考えたのが仮説4です。
仮説4とは、前後の足のピッチ変更により、ボディに傾きが発生。足の中立位置が傾きます。すると、前進力と後進力の発生タイミングがずれて、前進→停止→前進→停止というループで前進している。という仮説です。
軸が傾く事により、②→①の間に前進力、①→②の間に後進力が発生する。
①→③の間は、反対サイドの足が接地し、こちらサイドの足は中に浮くため
前進力は発生しない。右足が②→①に動くと同時に左足は③→①に動くが、
このタイミングでは右足のみが力を発生し、前進する。次に右足が①→③に
動く際に、左足が①→②に動き、左足のみが力を発生、前進の慣性力を相殺
して停止する。

考察してみて意外だったのは、力のベクトル(前進力と後進力)のバランスのみに着目して、なぜ進めるのか?と感じていたのですが、それぞれのタイミングがわずかにずれるだけで本体の変位が変わる(前に進む)ということでした。当然と言えば当然なのですが意外と盲点でした。

まだ、詳細な検証の余地はありますが、ほぼ間違いなさそうな仮説が出たのでとりあえずこの実験は終了です。一応スケッチも載せておきます。

7.スケッチ

#include <Servo.h>

//サーボを宣言。servo0が右前足(FR)、1が左前(FL)、2が右後(RR)、3が左後
Servo servo0;
Servo servo1;
Servo servo2;
Servo servo3;

//出力ピン設定
const int outpin0 = 10; //右前(FR)
const int outpin1 = 9;   //左前(FF)
const int outpin2 = 6;   //右後(RR)
const int outpin3 = 5;   //左後(RL)

//サーボ中立位置の調整。任意の数値を入れて、中立時にセンターが合うように調整
const int servo0Shift = -10;
const int servo1Shift = -6;
const int servo2Shift = -10;
const int servo3Shift = -8;

void setup() {
  //出力ピンにサーボをアタッチ
  servo0.attach(outpin0);
  servo1.attach(outpin1);
  servo2.attach(outpin2);
  servo3.attach(outpin3);

  Serial.begin(9600);
  //電源オンで、中立位置
  servo0.write(90 + servo0Shift);
  servo1.write(90 + servo1Shift);
  servo2.write(90 + servo2Shift);
  servo3.write(90 + servo3Shift);

  delay(2000);
}

void loop() {
  static int count = 0;
  static int FR = 90;
  static int FL = 90;
  static int RR = 90;
  static int RL = 90;

//forward 10歩前進
  if (count / 10 == 0) {
    FR = 65;
    FL = 65;
    RR = 30;
    RL = 30;
  }
//back 10歩後進
  else if (count / 10 == 1 ){
    FR = 30;
    FL = 30;
    RR = 66;
    RL = 65;
  }

//turn left 10歩左旋回
  else if (count / 10 == 2 ){
    FR = 65;
    FL = 55;
    RR = 45;
    RL = 30;
  }

//turn right 10歩右旋回
  else if (count / 10 == 3 ){
    FR = 50;
    FL = 65;
    RR = 30;
    RL = 45;
  }
  count = count + 1;
  if (count == 40){
    count = 0;
  }

  servo0.write(90 + FR + servo0Shift);
  servo1.write(90 + FL + servo1Shift);
  servo2.write(90 - RR + servo2Shift);
  servo3.write(90 - RL + servo3Shift);
  delay(300);
  servo0.write(90 - FR + servo0Shift);
  servo1.write(90 - FL + servo1Shift);
  servo2.write(90 + RR + servo2Shift);
  servo3.write(90 + RL + servo3Shift);
  delay(300);
}

2019年8月26日月曜日

四脚歩行ロボットを作る その6 バンビ1号大地に立つ・・・のか?

1.立ちません

結論から言います。
立ちません。
歩きません。

前回までに制作した骨格部分の上に、電池(単四eneloop×4本)と制御用のArduino(互換機)を搭載したところ、剛性不足と加工精度不足のため、歩くことはもちろん自力で立つこともできませんでした。

2.歩様のテスト

立ちませんし歩けませんが、めげずに歩様のテストを行います。
こちらをご覧ください。


適当なモノマネ動作ですが、歩いている雰囲気は出せたのではないでしょうか。
スケッチは以下の変数に応じて歩様を変更できるようにしてみました。
  • 歩速
  • 歩幅
  • 接地率(1サイクルの中で足が接地している割合)
  • 体高(接地面から肩までの高さ)
  • 足上げ高さ
  • 右前足に対する位相差
体高だけ下げるとこんな感じに。


体高を下げすぎて、肘部分のサーボがボデーに干渉してしまってます。

体高はもとに戻して、歩幅と歩速を小さくするとトボトボ歩きになります。なんとなくもの悲しい雰囲気がでてませんか?


3.制御と電源

今回、制御にはArduino MEGA 2560の互換件、小型化ボードのMega2560PRO miniなるボードを使っています。ピン数は減らさずにボード面積を大幅に小さくしています。無理やり小さくしているのでGPIOが2列配置になっているのが少々使いにくいのですが、全部使うことなど無いのでそれほど問題にはなりません。
価格はAliexpressで送料込653円でした。
Mega2560 PRO mini

PINOUT図


Pro MicroやPro mini、Nano系列では、PWM出力が不足する為、I2C接続で利用するPWMモータードライバ等を追加する必要がありますが、このボードであればボードサイズ(重量)増加は最低限に抑えつつ、ワンボードで制御できるため採用しました。価格だけであれば、Pro MicroとPCA9685を組み合わせた方が半額ぐらいで出来てしまいますが。

電源は、単四eneloop×4本(約4.8V)とし、サーボとMega2560PROの5Vアウトプットへ直結してます。サーボはともかくボードのアウトプット直結は保護回路もなく事故の元ですので自己責任で。。。

今回の反省は、何も考えずにボードにピンヘッダを立てたことでしょうか。上向きにピンヘッダ立てた方がテストには便利だった気がします。
あと、サーボごとに出力をまとめた基板を自作したので、結局サーボドライバと同じくらいの大きさの基盤が追加されました。I2C接続とかは考えなくて済んだけど。。。

4.まとめ

バンビ1号は歩けませんでしたが、四足歩行について自分なりの考察が進んだ気がします。歩くことの難しさも実感とされてきました。
重心の遷移が継続的に発生し、外力の影響も受けているにもかからず、歩行状態を破綻させないというのはとても高度な制御が必要なのでしょう。それを意識できずにやっている生物の能力の高さを痛感します。
ロボットへの考察を深めるほど、生物への興味が湧いてくるのが興味深い今日この頃です。

2019年8月24日土曜日

四脚歩行ロボットを作る その5 四脚歩行の分析

1.四脚歩行について考察

バンビ1号の完成により、ソフト開発が出来る様になりました。
当初の予定通り、四脚歩行の「モノマネ」をしてみましょう。

まず参考にしたのはこちらの動画です。


本物の犬ではありませんが、モデル化してくれてるので実物よりも判りやすいですね。
正確な理解ではありませんが、歩様によって名前がついており、これはwalk(なみあし)でしょうか。さらに早くなるに従い、trot(はやあし)、canter(駆足)、galop(襲歩)と呼ぶ様です。

簡単に分析してみると、左右の前足はほぼ1/2周期のズレで同時に着地している時間がわずかに存在しています。左右の後足も前足と同様の関係にありそうです。前後の足の周期は微妙なタイミングで、右前脚が着地するよりもわずかに早く左足が持ち上げられています。

全体的に眺めると、常に2本乃至は3本の足が着地しており、左右の足は逆位相、前後の足は3/8とか5/16周期ぐらいの位相のズレが有るイメージですね。

ややこしいので模式図にしてみるとこんな感じでしょうか。簡易的に考えるため、一歩の周期を16分割しています。

walk時の足の状態模式図
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
右前足
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
左前足
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
右後足
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
左後足
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
足が着地している
 
足が浮いている

2.足の動きのモデル

足を動かす際の周期はおおよそイメージが付きました。
続いて、一本づつの足の動きについてですが、バンビ1号は実物に比べると関節を省略した構造になっていますのであまり表現力が有りません(足首の返しとか出来るととてもそれっぽくなりそうですが)。
いきなり複雑な動きを制御するのも難易度が高くなりすぎますので、足先位置の軌跡を次のように単純化します。本来は蒲鉾型に近い軌跡になりそうですが、単純化して三角形として考えます。
一本一本の足はこのモデルの様に動かし、動かすタイミングをずらすことで、四本足の動きを表現してみます。

3.ロボット制御はパラパラ漫画

ロボット制御のサイトをあさるとロボット制御はパラパラ漫画だと言います。ロボットの動きを時間で分解し、ある瞬間ごとのサーボ位置を再現してつなげていくと動的なモーションが完成しているという考え方です。
今回もその方法に沿ってスケッチを書いてみます。

4.足先の座標計算

上で考えた様な足の動きをサーボモーターでトレースしようとするには、
  1. 足先の座標を計算する
  2. 狙いの座標に足先を動かすためのサーボモータの角度を計算する
  3. サーボモータに指令を出す
と言うながれになります。
足先の軌跡は単純化していますので、歩幅と肩位置の高さと、軌跡の最高点を決めてやれば軌跡の形が定まります。
また、座標は時間の経過に応じて定まりますので、歩くスピードと、足先の接地時間、滞空時間の比率を決めると、時間Tでの足先の座標が決まります。

x(T)=x(0)+vx(T)
y(T)=y(0)+vy(T)

式を立てるとすると、こんな感じ。一次元の方程式なのでこれなら中学生レベルの私でも大丈夫です。
実際には三角形の軌跡なので、一歩当たりの周期や肩までの高さ、歩幅、足の振り上げ高さあたりを任意に決めると各頂点ごとにx(0)とy(0)やvx、vyが決まります。

このあたり、計算ばかりであまり面白くないので今回はすっ飛ばします。
機会があれば次の逆運動計算と合わせてまとめるかも。

5.逆運動計算

もう一つ厄介な計算が逆運動計算です。
これは足先の座標を満足するためのサーボの角度を算出する計算です。
今回用いた2関節の足の場合、こちらのサイトに2リンク系の逆運動計算が詳しく紹介されていますので、ほぼそのまま利用しました。
少々ややこしいですが、最後の式を計算させれば、肩位置サーボの角度(θ1)と肘位置サーボの角度(θ2)が求められます。
なお逆運動計算では逆三角関数を利用する為、スケッチを書く際にはmath.hライブラリをインクルードしておきましょう。

6.まとめ

あれやこれやの計算が出てきますが、資料を探してそのまま使っているだけです。時間をかけてブログ等で解説してくださっている先人に感謝です。
次回はいよいよバンビ1号を動かしてみたいと思います。

2019年8月22日木曜日

四脚歩行ロボットを作る その4 図面も書かずに組立

1.ブラケット類は簡単プラ製

ロボット製作の醍醐味はソフト製作でしょうかハード製作でしょうか?
正解は両方です!

ということでロボット本体の製作に取り掛かります。基本構造は前回の通り。骨格はサーボブラケットと兼用です。
材質は、かっこいいアルミ製などにトライしたいのですが、加工手段を持っていなためまずは樹脂製でやってみます。今回のロボットはサーボが小さく、重量やトルクも大したこと無いなんとかなるでしょう。

図面引いて3Dプリンタって方法もありますが、CADも3Dプリンタも持ってないのでアクリル板を手加工してみます。

2.現物合わせに四苦八苦

樹脂製のブラケット製作ですが、廃材再利用のアクリル板を活用してみました。
5㎜厚と3㎜厚のアクリル板を細く切断したり削ったりして、必要な幅の角棒に加工します。


サーボの取付け向きなどに合わせた長さにカットし、にネジ穴をあけてサーボと締結します。
サーボ本体の取付けはM2ネジを使います。下穴はφ1.5。
サーボホーンの取付けはM1.2で下穴はφ1.0。

ネジを取り付けるためにタップも買ったのですが、タップ加工無しの方ががっちり締結出来たので不要でした。タッピングネジじゃなくても、下穴だけでネジが効きます。

3.サーボホーン取付け時の注意点

今回使用するSG90は、作動範囲が180°しかありません。サーボホーン取付け位置には注意しないと、動かしたい範囲で動かせません。

サーボホーンを取り付ける際にはサーボをセンター位置(0~180°の90°)にセットした上で、サーボホーンを関節可動範囲の中央位置になる様取り付けます。ただしサーボの歯車位置の都合でちょうど90°には出来ないケースがほとんどです。この様な場合はソフト的にトリムを掛けましょう。幸いなことにSG90の作動範囲は180°とされていますが、実際には200°くらいは動きます。

4.とにかく形になりました。

加工にはそれなりに手間がかかりましたが、なんとか形になりました。





形になって分かったのですが(組み立てながらうすうす気付いてはいましたが)、圧倒的強度不足&加工精度不足です。
加工の手間を減らすため、サーボブラケットは、サーボホーン側のみの片支え構造にしています。この構造は、軽量化や脚の可動範囲の確保にも役立つと考えて採用しました。

強度不足対策のため、厚さ5㎜のアクリル板を使い、十分な剛性を持たせていたのですが想定していなかった弱点はサーボホーンの強度でした。ブラケットはがっちりしてますが、サーボホーンの付け根がグニャグニャ曲がっています。。。内蔵ギヤの軸も動いているのかな?


アルミ製のサーボホーンでもあればとも思ったのですが、安物サーボのSG90にそのようなアフターパーツは出てない様ですね。もしアルミ製に変えても内蔵の樹脂ギヤに負荷が集中してしまいそうな気もします。
2号機では、サーボホーンの反対側にフリーホーンを取り付けるのが無難ですね。

また、加工精度不足、サーボのトリム不足、剛性不足もろもろ相まって、4本脚を同じ姿勢にすると同時に着地出来ていない模様。そもそも剛性不足のフニャフニャくんなのでどの程度の寸法誤差がでているのかよく判りませんが。

5.まとめ

勢いで作った初号機ですので不具合が出るのは想定内です。
それにしても剛性不足でろくに立つことも出来ない姿はまさに生まれたての子鹿の様相です。改めて命名「バンビ1号」。

とは言え、2号機製作に向けてのノウハウはいろいろ獲得できたように思います。
バンビ1号君も無駄にはせず、歩行動作プログラムの検証用に利用したいと思います。

四脚歩行ロボットを作る その3 構造を考える

1.犬だか馬鹿だか

更新が停滞していたよつあしロボットの(ひと月ほど前の)進捗です。

今回はロボットの構造とおおよその寸法についてです。
憧れの大先輩Spot Miniさんは、とてもすらっとした体形をされています。

スレンダーな胴体とほっそりした脚ですが、引っ張られても蹴られても軽やかなステップで決して倒れる事は有りません。
見れば見るほど洗練された機能美を感じますが、良く見ると犬?では無い様な気がします。

いろんな犬と比較すると、犬の方が短足気味な気がします。大体の犬では、つま先から肩や股関節までの長さ(脚の長さ)(H)と、肩から股関節の長さ(胴の長さ)(L)を比較すると、L>Hとなっている様です。一方でわれらがSpot先輩は、L=H寄りのL≦Hの様に見えます。

前肢の関節の向きは異なりますが、足の長さだけなら、とか鹿寄りなんですね。
構造を考えるうえで、軽やかに見えるスタイルも重要ですので、可能な限り足長にしておきたいと思います。

2.基本構造

一肢につき3自由度を与える事は以前にも述べましたが、関節の配置も何通りか選択肢があります。いくつか案をかんがえたのですが、今回は下図の通りとしました。力学的には少し無理のある形状ですが小型軽量なため、少々の無理は効きそうだと判断しています。座標計算が少し簡単になる構造を選びました。

ちなみに今回は3DCADでの設計は行いません。
工作精度も強度もそこそこで良いので、サクサク組んで早く試してみたいので。

3.実寸法の検討

基本構造と全体のバランスイメージが固まったので、実際のサーボサイズに合わせて脚と胴の長さを決定します。
サーボサイズを考慮した構造は次の通りです。側面から見た図となります。

配置の都合で、胴の長さはサーボサイズでほぼ決まっています。前肢から後肢の間の距離は約110㎜となります。
脚の長さはL≦Hから、110㎜以上。とはいえ、あまり長くするとサーボへの負荷が大きくなりすぎますのでH=110㎜としました。計算の簡略化のため、肩から肘、肘から足先の長さは1:1としました。

4.トルクの確認

さて、何となくの形状バランスだけで形を決めてみましたが、サーボモータのパワーについても考察しておく必要が有ります。
4脚ロボットですのでロボットの自重を4本の足で支えなければなりません。ではロボットの重量は?と考えるとまだまだ決まってないのですが、現在判明しているだけでも次の重量がかかります。

単4エネループ×4本=13g×4本=52g
サーボ×12個=9g×12個=108g

あとは電池ボックス、基板、ブラケット、マイコンボード、圧力センサー、ジャイロセンサー、PWM増設基板等です。
おそらくこれらで100g程度にはなりそうですので暫定目標は体重250gとしておきます。

サーボの回転方向へかかる負荷は、脚に掛かる負荷を回転方向のベクトル成分に分解してやる必要がありますが、最悪の場合100%がサーボへの負荷となります。仮に250gの負荷が11cmの長さの足一本に掛かった場合、最大で2750g・cm=2.75kg・cmとなり、SG90のストールトルク1.8kg・cmを大きく超過してしまいます。
しかしながら、一本脚に、体重と同荷重以上の負荷がかかると言う状況は(飛んだり跳ねたりしなければ)まずありえません。常に2本以上の脚が接地してなおかつ関節の角度も適切であれば、体重の20~30%程度の負荷に収まるのではないかと予測しています。

ちなみに高トルクタイプのSG92Rであれば、ストールトルクは2.5kg・cmですのでまだトルクが足りませんが、基本2本の脚で支えると考えて1.375kg・cm。衝撃荷重や安全率を考慮するとまだ足りませんね。

4.まとめ

こまごま考えてみましたが、初号機はいろんな問題を探すべきテストベッドですので、あまり深く考えすぎずに手を動かしてみましょう。

ESP32でスマホとシリアル通信(Arduino IDE編)

1.Bluetoothの種類

Bluetoothには種類があるそうです。
ひとつは通常のBluetooth、二つ目は省電力用のRedtooth、三つ目はカレー好きのYellowbooth。。。嘘です。

本当は、従来からあるBluetooth Basic Rate/Enhanced Data Rate (BR/EDR) と、IoT機器向けに省電力通信が規定された Bluetooth Low Energy (LE) 、通称BLEがあるそうです。

ESP32自体が、IoT機器等の通信用途が想定されているためか、ブログ等をしらべてもBLEの記事がほとんどだったのですが、サンプルスケッチ等を見ても難しくて自分では応用出来そうにないので、シンプルな従来のBluetoothでシリアル通信を行ってみます。

2.Bluetooth通信用のライブラリ導入

さて、Arduino IDEでESP32のBluetooth通信を行うには、ライブラリを導入しなければなりません。良いライブラリがGitHubのこちらにありますので、さくっとClone or DownloadでDownload ZIPです。

ダウンロードしたZIPファイルは、Arduino IDEを開いて[スケッチ]→[ライブラリをインクルード]→[.ZIP形式のライブラリをインストール...]を選択して、ファイルマネージャから指定しましょう。

3.サンプルスケッチ

Bluetoothのテストは、ライブラリに付属のサンプルスケッチで即実行可能でした。
サンプルスケッチの読込は、Arduino IDEから[ファイル]→[スケッチ例]→[BluetoothSerial]→[SerialtoSerialBT]を選択します。


このままマイコンボードに書き込めば、ESP32はBluetooth通信を始めます。

以下、サンプルスケッチの必要部分のみ書き出しています。


#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32");

 //デバイス名は"ESP32"としました。サンプルスケッチではESP32testとなっています。

  Serial.println("The device started, now you can pair it with bluetooth!");
}

void loop() {
  if (Serial.available()) {
    SerialBT.write(Serial.read());
  }
  if (SerialBT.available()) {
    Serial.write(SerialBT.read());
  }
  delay(20);
}

4.スマホ側の準備

今回、スマホ側のシリアル通信にはSerial Bluetooth Terminalというフリーのアプリを使いました。Google Playからさくっとインストールしましょう。※iphone持ってないのでandroid前提です。ごめんなさい。

インストール後の設定も以下の通りとてもシンプルです。
  1. スマホとESP32をペアリングする。androidの設定画面→[機器接続]→[新しい機器とペア設定する]→[ESP32(スケッチで設定したデバイス名)を選択する]
  2. Serial Bluetooth Terminalを立ち上げ、接続先としてESP32を選択する。左上のメニューアイコン→[Devices]→[ESP32(スケッチで設定したデバイス名)]
  3. 画面上部のコネクタ形状のアイコンを押し、Connectedと表示されれば接続完了

5.いよいよ通信テスト

通信テストは簡単です。Arduino IDE側でシリアルモニタを開き、入力窓から何か文字を入力してみましょう。
ここでは、"test ESP32 to Smart Phone"と入力してみました。


スマホのSerial Bluetooth画面に受信したテキストが表示されました!

次に、Serial Bluetooth Terminalの入力窓に、"test Smart Phone to ESP32"と入力して送信ボタンを押すと、Arduino IDEのシリアルモニタにテキストが表示されました。双方向通信成功です。

6.まとめ

ESP32を使ったBluetoothシリアル通信は、非常に簡単に接続できました。
BluetoothでのLチカ制御も出来ましたが、長くなったのでまた次回。

ESP32でスマホとシリアル通信 その2 BluetoothでLチカ

1.BluetoothでLチカ制御 前回、Bluetoothでの双方向通信に成功しましたので、ついでに少しスケッチを修正してスマホからESP32のLチカを制御した様子が以下の動画です。 撮影が悪くて画面が良く見えませんが、"1"を送信...