はじめに
今日は二日でできる四足歩行ロボットの作り方を紹介します。 頑張れば、この週末(まだ夏休み中)に四足歩行ロボットを作れるかもしれません。
中野島ロボットでは、3日でできる四足歩行ロボット「よつあし」のコンテスト用モーションの作成を行っていますが、それを考えているときに、”カマキリ”が道を歩いているのを見かけました。 そういえば、昆虫は普通6本足で歩きますが、カマリは前の二本が「鎌」になっているので、四本足で歩きます。
カマキリは英語で「Mantis」とか「Praying Mantis」とか言って、直訳すると「拝み虫」となり、両手を合わせているように見えるからだそうです。
「よつあし」にカマキリモーションをさせるべく、カマキリロボットがあるかと思って、いつものサイトで「Mantis」で検索するとありました。
URL:https://www.thingiverse.com/thing:1828535 動作映像はYouTubeにも公開されています。
意外と良さそうな動きをしています。サーボモータも二つしか使っていないようです。
「よつあし」のために、このモデルをダウンロードして、3Dプリンタで印刷して早速作って見ます。
購入する部品は、SG90サーボモータが二個、Arduino Nano 、超音波センサーが一つと電池ホルダーと電池、あとはネジのみととても簡単です。
これなら、二日でできそうです。(そういって二日でできたことはないが。。。)
印刷
カマキリらしく、印刷にはPETGフィラメントの透明グリーンを使いました。このフィラメントは蛍光緑で綺麗にできあがります。 自作のデルタ型3Dプリンタ 「Rostock Nano」 を使い、印刷には1時間半程かかりました。
意外と部品が大きかったので、部品を 3D Builderで分割したり配置しなおしたりして印刷しました。
印刷した部品は、胴体が二つと足が二組になります。印刷した前の胴体を落として割ってしまったので、30分かけて再度印刷しました。 このモデルは一部非常に薄い部分があるので、取り扱いには注意が必要です。
足の付け根の部分も薄くて割れやすいので注意です。
組立
胴体をM2ネジで繋げて、SG90サーボモータを組み込んで、超音波センサー HC-SR04となんとかArduino Nanoを乗せれば出来上がります。
仮組するとこんな感じになります。
頭部には超音波センサーを乗せるのですが、ここが狭くてかなり削らないとうまく乗りませんでした。あとはArduino Nano拡張シールドと、電池フォルダを乗せてとりあえずの完成です。
要はSG90を二つ45度の角度で繋げられれば良いので、3Dプリンタが無くても5mmプラ棒でも作れると思います。
ソフトウェア 作成マニュアルのPDFや回路もダウンロードした中にあるのですが、同梱されているスケッチとは合っていないようです。
スケッチは HC-SR04のバグに対応するようになっています。なので配線も異なり、NewPingライブラリが必要になります。
またSG90サーボモータの電源をArduinoから取ろうとしているようですが、そんなことできるのか、確認途中のもののようでコメント欄には”動かない”との投稿があります。
試運転してみたら、やっぱり動きませんでした。 Arduino のピンの規定は40mAですが、SG90は100mA(起動時やロックした時は200mA)程度流れるので、個体によっては動かないと思います。また、運良く動いてもArduino Nanoの定格を超えているので、壊れてしまうかもしれません。
動作確認
スケッチを組み立てマニュアルの配線に直して、Arduinoに書き込んで動かしてみます。 足が長く、重心が高く、不安定なので、モーションをオリジナルの約半分に調整してディスクトップ上で動くようになりました。
同じ「あし」の動きをさせれば、「よつあし」も昆虫モーションができそうです。
超音波センサーだと「カマキリぽくない」ので、赤外線距離センサーの方が良いかもしれません。
「あし」の形もカマキリぽくはないし、そもそも「かま」がないので、この辺は付けた方がカマキリぽくなると思います。(今度作って見ます。)
おわりに
アマゾンでは無く、秋月電子なら部品は全て一日で揃うので、一日でも完成までたどり着くかもしれません。 夏休みの宿題に間に合うかもしれませんよ。
購入品情報
今回は正規品(保証有り)をリストしています。 (同等機能のクローンでも動作可能なのですが、最近Amazonのクローン品の質が下がっていて、外れを沢山引いているので、正規品を確認してから自己判断でクローン品を購入するようにして下さい。) SG90 正規品はAmazonなら梅本さんから購入しています。正規品は秋月電子でも購入できます。
Arduino Nano 正規品は秋月電子で購入しました。使っているのはクローンです。
HC-SR04 正規品は秋月電子で購入しました。使っているのはクローンです。
リスト オリジナルから一部修正しています。
//nano walker with ultrasonics #define BACK_LEGS_PIN 10 //back legs on Pin10 //#define BACK_LEGS_GND 8 //back legs ground connection Pin8 //#define BACK_LEGS_VCC 9 //back legs power connection Pin9 #define FRONT_LEGS_PIN 3 //front legs on Pin3 //#define FRONT_LEGS_VCC 2 //front legs power connection on Pin2 (front legs GND connection on GND already) #define US_GND 19 //Ultrasonic Ground Pin D19=A5 #define ECHO_PIN 18 //Ultrasonic Echo Pin D18 = A4 #define TRIGGER_PIN 17 //Ultrasonic Trigger Pin D17 = A3 #define US_VCC 16 //Ultrasonic VCC Pin D16 = A2 #define MAXIMUM_DISTANCE 200 //#define SERVO_BACK_DISTANCE 60 //#define SERVO_FORWARD_DISTANCE 100 #define SERVO_BACK_DISTANCE 70 #define SERVO_FORWARD_DISTANCE 90 #define SERVO_CENTRED 80 #define STEP_DELAY 160 //#define STOP_DISTANCE 10 //stop distance in cm #define STOP_DISTANCE 7//stop distance in cm #include <Servo.h> #include <NewPing.h> //format: front leg position, back leg position char walkingForward[] = {SERVO_BACK_DISTANCE, SERVO_FORWARD_DISTANCE, SERVO_FORWARD_DISTANCE, SERVO_FORWARD_DISTANCE, SERVO_FORWARD_DISTANCE, SERVO_BACK_DISTANCE, SERVO_BACK_DISTANCE, SERVO_BACK_DISTANCE }; NewPing sonarEyes(TRIGGER_PIN, ECHO_PIN, MAXIMUM_DISTANCE); Servo servoBackLegs, servoFrontLegs; void setup() { pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); //setup Pins to connect Servos To // pinMode(BACK_LEGS_GND, OUTPUT); //tie pin 8 to GND // digitalWrite(BACK_LEGS_GND, LOW); // pinMode(BACK_LEGS_VCC, OUTPUT); //tie pin 9 to VCC // digitalWrite(BACK_LEGS_VCC,HIGH); servoBackLegs.attach(BACK_LEGS_PIN); // pinMode(FRONT_LEGS_VCC, OUTPUT); //tie pin 2 to VCC // digitalWrite(FRONT_LEGS_VCC, HIGH); servoFrontLegs.attach(FRONT_LEGS_PIN); servoBackLegs.write(SERVO_CENTRED); servoFrontLegs.write(SERVO_CENTRED); //setup Pins for Ultrasonic Sensor pinMode(US_GND, OUTPUT); digitalWrite(US_GND, LOW); pinMode(US_VCC, OUTPUT); digitalWrite(US_VCC,HIGH); delay(2000); digitalWrite(LED_BUILTIN, LOW); //turn off built in LED checkForObstruction(); } void loop() { // put your main code here, to run repeatedly: while (checkForObstruction()) { //returns true if obstruction, otherwise skip this loop digitalWrite(LED_BUILTIN, HIGH); //turn on LED for visual indication of obstruction //step back and turn delay(2000); walkBackAndTurnLeft(); digitalWrite(LED_BUILTIN, LOW); //turn back off again } stepForward(); } void stepForward() { for (int n = 0; n < 4; n++) { servoFrontLegs.write(walkingForward[n * 2]); servoBackLegs.write(walkingForward[(n * 2) + 1]); delay(STEP_DELAY); } } void walkBackAndTurnLeft() { // for (int n = 0; n < 14; n++) { for (int n = 0; n < 5; n++) { servoFrontLegs.write(SERVO_CENTRED); // servoBackLegs.write(SERVO_BACK_DISTANCE - 40); servoBackLegs.write(SERVO_BACK_DISTANCE - 30); delay(200); servoFrontLegs.write(SERVO_FORWARD_DISTANCE); // servoBackLegs.write(SERVO_FORWARD_DISTANCE + 20); servoBackLegs.write(SERVO_FORWARD_DISTANCE + 15); delay(300); } servoFrontLegs.write(SERVO_CENTRED); servoBackLegs.write(SERVO_CENTRED); delay(300); } bool checkForObstruction() { int distance = sonarEyes.ping_cm(); if (distance <= STOP_DISTANCE && distance != 0) { return true; } else { return false; } }