工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

オットーDIYは1時間であなた自身のロボットを作ります!

コンポーネントと消耗品

>
Otto DIY Builder Kit
× 1
Otto DIY ArduinoNANOシールドI / O
× 1
Arduino Nano Every
× 1
USB-A-ミニUSBケーブル
× 1
SG90マイクロサーボモーター
× 4
ブザー
× 1
メス/メスのジャンパー線
× 6
>
Otto DIY8x8mmマイクロスイッチセルフロックオン/オフ
× 1
4xAAバッテリーホルダー
スタック2X4AAバッテリー
× 1
単三電池
× 1

必要なツールとマシン

>
3Dプリンター(汎用)
プラスドライバー

アプリとオンラインサービス

>
Arduino IDE
ArduinoWebエディター
Arduino用のMicrosoftVisualStudioコード拡張機能

このプロジェクトについて

オットーとは誰ですか?

誰でも作れるインタラクティブロボット!

<図>

オットーは何ができますか?

オットーは歩き、踊り、音を立て、障害物を避けます。

<図>

オットーが特別な理由

Ottoは完全にオープンソースであり、Arduinoと互換性があり、3D印刷可能であり、子供のための包括的な環境を作成するという社会的影響の使命を持っています。

<図>

Ottoは、別のロボットで指示可能なBoB the BiPedに触発され、Zowiと呼ばれる別のオープンソースのBipedロボットのコードを使用してプログラムされました。

<図>

CC-BY-SA

オットーの違いは、組み立てられたサイズ(11cm x 7cm x 12cm)、コンポーネントと表現のよりクリーンな統合にあります。既成の3D印刷部品、簡単な電子接続(ほとんど溶接は不要)、および基本的なコーディングスキルを使用して、わずか1時間でかわいいオットーの友達を作ることができます!またはそれ以下

OttoはAutodesk123D Designを使用して設計されていましたが、ThinkerCADソフトウェアを変更して、カスタマイズやさらなる改善を行うことができます。

<図> <図> <図>

このステップバイステップでは、 OttoDIYシンプルバージョンの作成方法に焦点を当てています。 はい、Otto DIY +やTitoのようなより高度なbipdealロボットがあります

ステップ1:最初にすべての部品とツールを収集します

<図>

このアセンブリに必要な既製のハードウェア部品をすべて集めます。

ミニブレッドボードはシールドの代替品ですが、より多くの配線と時間が必要です

そうすれば、合計6つのパーツを3Dプリントするだけで済みます:

11.3Dプリントヘッド。

12.3Dプリントされたボディ。

13.3Dプリントされた脚 x2。

14.3Dプリントされた足 x2

オプション:3Dパーツをポストクリーニングするためのカッター(3D印刷品質が十分に良好な場合は不要)、はんだごて(バッテリー電源が必要な場合は、USB経由で接続して通電できます)

それはすべて簡単です!; すべての.stlファイルをダウンロード 、3Dプリンターをお持ちでない場合は、いつでも地元のメーカースペースに行くことができます。

パーツを持っていない、または入手が難しい場合は、フルキットを購入するだけです 訪問 www.ottodiy.com

3Dプリント設定

<図>

Ottoは3D印刷用に非常によく設計されており、ダウンロードしたファイルはプロパティ指向で中央に配置されているため、次の一般的なパラメーターに従えば問題は発生しません。

  • PLA素材を使用したFDM3Dプリンターの使用をお勧めします。
  • サポートやいかだはまったく必要ありません。
  • 解像度:0.15mm
  • 充填密度20%

マシンフリーのスライサーソフトウェアのgコードをスライスして生成するため Curaのように、または私たちが使用しているFlashForge Finder 3Dプリンターに付属しているFlashPrintのように(印刷をアウトソーシングしている場合は、心配する必要はありません)

印刷後、モーターを固定している脚と足の部分を少し掃除する必要があります。

パーツを確認してください

手順2で説明したように、写真のマイクロサーボモーターには3本のネジが付属しており、読みやすいように部品番号が再配置されています。

ミニドライバーを磁化したことを忘れないでください。

取扱説明書をダウンロードまたは印刷するか、次のビデオに従ってください:

フットサーボアセンブリ

マイクロサーボを足の内側に置き、それを内側に押し込みます。難しい場合は、カッターでその領域をさらに掃除する必要があります。

サーボが各側に少なくとも90度回転できることを確認することは非常に重要です。

動きを確認した後、小さなネジだけを使用して固定します。

もう一方の足も同じプロセスです。

サーボをボディに固定

他の2つのマイクロサーボを取り、3D印刷されたボディの定義された場所に配置し、先の尖ったネジだけで固定します。

脚を体に固定する

脚をマイクロサーボのハブに接続します。足のサーボのように、脚が体に対して両側に90度回転できることを確認する必要があります。

位置合わせを確認したら、小さなネジを使用して脚の内側の穴に固定します。

足を脚に固定する

図に示されているようにケーブルの世話をする場合は、脚の穴を考慮して通過するボディのスロット内にケーブルを配置する必要があります。

正しい位置になったら、先のとがったネジを使用して後ろから固定します。

ヘッドアセンブリ

超音波センサーから始めることは、目を限界まで引き出すために重要です。

Arduino nanoをシールドに配置した後、オプションで、バッテリーホルダーのプラスケーブルをボードのVinに溶接し、マイナスを任意のGNDに溶接できます。

USBコネクタに面して両方のボードを斜めに3Dプリントヘッドの穴に挿入し、最後の2本の先のとがったネジを使用して固定します。

ステップ9:電気接続

<図>

DuPontケーブル、マイクロスイッチ、ブザーを準備します。

次に、図のピン番号に従い、正しい位置に配置してください。

Arduino Nanoシールドがない、または見つからない場合は、ブレッドボードを使用し、この回路図に従ってくださいTinkerCAD Circuits

ブロックを使用したコード

OttoWikifactoryのソースArduinoコードをいつでも試すことができます。

ここでは、初心者が各コンポーネントのArduinoをすぐに使い始めるための無料のチュートリアルをいくつか見つけることができます:

-サーボモーターチュートリアル:https://arduinogetstarted.com/tutorials/arduino-servo-motor
-超音波センサーチュートリアル:https://arduinogetstarted.com/tutorials/arduino-ultrasonic-sensor
-タッチセンサーチュートリアル:https://arduinogetstarted.com/tutorials/arduino-touch-sensor
-ブザーチュートリアル:https://arduinogetstarted.com/tutorials/arduino-piezo-buzzer

www.ottodiy.comにアクセス

Otto DIY +バージョンには、Bluetooth、より多くのセンサー、インタラクションを使用する可能性があります。

リミックスと変更をWikifactoryに投稿する

コード

  • 障害物を避けてください
障害物を避ける Arduino
オットーは範囲内の障害物が見えるまで無限に歩き、驚いて、曲がって戻ってから歩き続けます
 // ---------------------- ------------------------------------------ //-Zowi基本ファームウェアv2オットーに適合//-(c)BQ。 GPLライセンスの下でリリース//-2015年12月4日//-著者:Anita de Prado:[email protected] //-Jose Alberca:[email protected] //-Javier Isabel: [email protected]//-Juan Gonzalez(obijuan):[email protected] //-Irene Sanz:[email protected]// ---------- -------------------------------------------------- ----- //-ZowiのおかげでOttoが持つすべての機能を試してみてください!// --------------------------- --------------------------------------#include  #include  #include  #include  #include  #include  #include  #include  OttoSerialCommand SCmd; // SerialCommandオブジェクト//-OttoLibrary#include  Otto Otto; //これはオットーです!// ------------------------------------------ --------------- //-最初のステップ:サーボが接続されているピンを構成します/ * --------------- | O O | | --------------- | YR 3 ==> | | <==YL 2 --------------- || || || || RR 5 ==> ----- ------ <==RL 4 | ----- ------ | * / #define PIN_YL 2 //サーボ[0] #define PIN_YR 3 //サーボ[1] #define PIN_RL 4 //サーボ[2] #define PIN_RR 5 //サーボ[3] // ---オットーボタン#definePIN_SecondButton6#define PIN_ThirdButton 7 /////// ////////////////////////////////////////////////// ////////////-グローバル変数---------------------------------- --------- ///////////////////////////////////////// //////////////////////////// const char programID [] ="Otto_todo"; //各プログラムにはIDconstchar name_fac ='$';があります//ファクトリnameconstchar name_fir ='#'; //名//-移動パラメータintT =1000; //移動の初期期間intmoveId =0; //移動数intmoveSize =15; //いくつかの動きの高さに関連付けられています// --------------------------------------- ------------------ //-Ottoには5つのモードがあります://-* MODE =0:Ottoが待機しています//-* MODE =1:ダンスモード!! //-* MODE =2:障害物検出モード//-* MODE =3:ノイズ検出モード//-* MODE =4:OttoPADまたは任意のテレオペレーションモード(SerialPortをリッスン)。 // ------------------------------------------------ --------- volatile int MODE =0; //プリンシパルステートマシンのオットーの状態。 volatile bool buttonPushed =false; //ボタンがいつ押されたかを記憶する変数volatilebool buttonAPushed =false; //ボタンが押されたときに記憶する変数volatilebool buttonBPushed =false; // Bボタンが押されたときに覚えておく変数unsignedlong previousMillis =0; int randomDance =0; int randomSteps =0; bool障害物検出=false; /////////////////// ////////////////////////////////////////////////// - 設定 - - - - - - - - - - - - - - - - - - - - - - - - ------- /////////////////////////////////////////// ////////////////////////// void setup(){//シリアル通信の初期化Serial.begin(115200); pinMode(PIN_SecondButton、INPUT); pinMode(PIN_ThirdButton、INPUT); //サーボピンを設定しますOtto.init(PIN_YL、PIN_YR、PIN_RL、PIN_RR、true); //これをコメント解除してサーボトリムを手動で設定し、EEPROMに保存します//Otto.setTrims(TRIM_YL、TRIM_YR、TRIM_RL、TRIM_RR); //Otto.saveTrimsOnEEPROM(); //最終的にトリムを設定するときに、1回のアップロードに対してのみこれのコメントを解除します。 //ランダムシードを設定randomSeed(analogRead(A6)); // Interrumptions enableInterrupt(PIN_SecondButton、secondButtonPushed、RISING); enableInterrupt(PIN_ThirdButton、thirdButtonPushed、RISING); // SerialCommandコマンドのコールバックを設定しますSCmd.addCommand( "S"、receiveStop); // sendAck&sendFinalAck SCmd.addCommand( "L"、receiveLED); // sendAck&sendFinalAck SCmd.addCommand( "T"、recieveBuzzer); // sendAck&sendFinalAck SCmd.addCommand( "M"、receiveMovement); // sendAck&sendFinalAck SCmd.addCommand( "H"、receiveGesture); // sendAck&sendFinalAck SCmd.addCommand( "K"、receiveSing); // sendAck&sendFinalAck SCmd.addCommand( "C"、receiveTrims); // sendAck&sendFinalAck SCmd.addCommand( "G"、receiveServo); // sendAck&sendFinalAck SCmd.addCommand( "D"、requestDistance); SCmd.addCommand( "N"、requestNoise); SCmd.addCommand( "B"、requestBattery); SCmd.addCommand( "I"、requestProgramId); SCmd.addDefaultHandler(receiveStop); //オットーウェイクアップ! Otto.sing(S_connection); Otto.home(); delay(50); //アニメーションUuuuuh-最初の驚きの瞬間// ----- for(int i =0; i <2; i ++){for(int i =0; i <8; i ++){if(buttonPushed) {break;} Otto.putAnimationMouth(littleUuh、i); delay(150); }} // ----- //幸せなオットーに笑顔:)if(!buttonPushed){Otto.putMouth(smile); Otto.sing(S_happy); delay(200); } // Ottoの名前が「#」の場合、Ottoはバプテスマを受けていないことを意味します//この場合、Ottoはより長いあいさつを行います// 5 =名の文字を含むEEPROMアドレスif(EEPROM.read(5)==name_fir){if(!buttonPushed){Otto.jump(1,700); delay(200); } if(!buttonPushed){Otto.shakeLeg(1、T、1); } if(!buttonPushed){Otto.putMouth(smallSurprise); Otto.swing(2,800,20); Otto.home(); }} if(!buttonPushed){Otto.putMouth(happyOpen); } previousMillis =millis();} ////////////////////////////////////////// ///////////////////////////-プリンシパルループ------------------- -------------------------- //////////////////////// ///////////////////////////////////////////// void loop(){ //-モード2-障害物検出モードif(obstacleDetected){Otto.sing(S_surprise); Otto.playGesture(OttoFretful); Otto.sing(S_fart3); Otto.walk(2,1300、-1); Otto.turn(2,1000、-1); delay(50);障害物検出器(); } else {Otto.walk(1,1000,1);障害物検出器(); }} //////////////////////////////////////////////// ///////////////////// - 機能 - - - - - - - - - - - - - ------------------------ ////////////////////////// ////////////////////////////////////////////- 2番目のボタンが押されたvoidsecondButtonPushed(){buttonAPushed =true; if(!buttonPushed){buttonPushed =true; Otto.putMouth(smallSurprise); }} //-3番目のボタンが押されたときに実行される関数voidthirdButtonPushed(){buttonBPushed =true; if(!buttonPushed){buttonPushed =true; Otto.putMouth(smallSurprise); }} //-距離センサーを読み取り、obstructionDetected変数を実現する関数voidobstructionDetector(){int distance =Otto.getDistance(); if(distance <15){obstructionDetected =true; } else {障害物検出=false; }} //-停止コマンドを受信する関数。voidreceiveStop(){sendAck(); Otto.home(); sendFinalAck();} //-LEDコマンドを受信する関数voidreceiveLED(){// sendAck&必要に応じて停止sendAck(); Otto.home(); // receiveLEDBluetoothコマンドの例// L 000000001000010100100011000000000 // L 001111111111111111111111111111111(todos los LED encendidos)unsigned long int matrix; char * arg; char * endstr; arg =SCmd.next(); //Serial.println(arg); if(arg!=NULL){matrix =strtoul(arg、&endstr、2); //文字列をunsignedlong integerに変換しますOtto.putMouth(matrix、false); } else {Otto.putMouth(xMouth); delay(2000); Otto.clearMouth(); } sendFinalAck();} //-ブザーコマンドを受信する関数voidrecieveBuzzer(){// sendAck&必要に応じて停止sendAck(); Otto.home();ブールエラー=false; int frec; int期間; char * arg; arg =SCmd.next(); if(arg!=NULL){frec =atoi(arg); } // char文字列を整数に変換しますelse {error =true;} arg =SCmd.next(); if(arg!=NULL){duration =atoi(arg); } // char文字列を整数に変換しますelse {error =true;} if(error ==true){Otto.putMouth(xMouth); delay(2000); Otto.clearMouth(); } else {Otto._tone(frec、duration、1); } sendFinalAck();} //-TRimsコマンドを受信する関数voidreceiveTrims(){// sendAck&必要に応じて停止sendAck(); Otto.home(); inttrim_YL、trim_YR、trim_RL、trim_RR; //サーボBluetoothコマンドの定義// Ctrim_YLtrim_YRtrim_RLtrim_RR // receiveTrimsBluetoothコマンドの例// C 20 0 -8 3 bool error =false; char * arg; arg =SCmd.next(); if(arg!=NULL){trim_YL =atoi(arg); } // char文字列を整数に変換しますelse {error =true;} arg =SCmd.next(); if(arg!=NULL){trim_YR =atoi(arg); } // char文字列を整数に変換しますelse {error =true;} arg =SCmd.next(); if(arg!=NULL){trim_RL =atoi(arg); } // char文字列を整数に変換しますelse {error =true;} arg =SCmd.next(); if(arg!=NULL){trim_RR =atoi(arg); } // char文字列を整数に変換しますelse {error =true;} if(error ==true){Otto.putMouth(xMouth); delay(2000); Otto.clearMouth(); } else {// EEPROMに保存Otto.setTrims(trim_YL、trim_YR、trim_RL、trim_RR); Otto.saveTrimsOnEEPROM(); //最終的にトリムを設定するときに、1回のアップロードに対してのみこれのコメントを解除します。 } sendFinalAck();} //-サーボコマンドを受信する関数voidreceiveServo(){sendAck(); moveId =30; //サーボBluetoothコマンドの定義// Gservo_YLservo_YRservo_RLservo_RR // receiveServoBluetoothコマンドの例// G 90 85 96 78 bool error =false; char * arg; intservo_YL、servo_YR、servo_RL、servo_RR; arg =SCmd.next(); if(arg!=NULL){servo_YL =atoi(arg); } // char文字列を整数に変換しますelse {error =true;} arg =SCmd.next(); if(arg!=NULL){servo_YR =atoi(arg); } // char文字列を整数に変換しますelse {error =true;} arg =SCmd.next(); if(arg!=NULL){servo_RL =atoi(arg); } // char文字列を整数に変換しますelse {error =true;} arg =SCmd.next(); if(arg!=NULL){servo_RR =atoi(arg); } // char文字列を整数に変換しますelse {error =true;} if(error ==true){Otto.putMouth(xMouth); delay(2000); Otto.clearMouth(); } else {//サーボを更新:intservoPos [4] ={servo_YL、servo_YR、servo_RL、servo_RR}; Otto._moveServos(200、servoPos); // 200ms移動} sendFinalAck();} //-移動コマンドを受信する関数voidreceiveMovement(){sendAck(); if(Otto.getRestState()==true){Otto.setRestState(false); } //移動Bluetoothコマンドの定義// M MoveID T MoveSize char * arg; arg =SCmd.next(); if(arg!=NULL){moveId =atoi(arg);} else {Otto.putMouth(xMouth); delay(2000); Otto.clearMouth(); moveId =0; //停止} arg =SCmd.next(); if(arg!=NULL){T =atoi(arg);} else {T =1000; } arg =SCmd.next(); if(arg!=NULL){moveSize =atoi(arg);} else {moveSize =15; }} //-受け取った移動コマンドに従って正しい移動を実行する関数。voidmove(int moveId){bool manualMode =false; switch(moveId){ケース0:Otto.home();壊す;ケース1:// M 1 1000 Otto.walk(1、T、1);壊す;ケース2:// M 2 1000 Otto.walk(1、T、-1);壊す;ケース3:// M 3 1000 Otto.turn(1、T、1);壊す;ケース4:// M 4 1000 Otto.turn(1、T、-1);壊す;ケース5:// M 5 1000 30 Otto.updown(1、T、moveSize);壊す;ケース6:// M 6 1000 30 Otto.moonwalker(1、T、moveSize、1);壊す;ケース7:// M 7 1000 30 Otto.moonwalker(1、T、moveSize、-1);壊す;ケース8:// M 8 1000 30 Otto.swing(1、T、moveSize);壊す;ケース9:// M 9 1000 30 Otto.crusaito(1、T、moveSize、1);壊す;ケース10:// M 10 1000 30 Otto.crusaito(1、T、moveSize、-1);壊す;ケース11:// M 11 1000 Otto.jump(1、T);壊す;ケース12:// M 12 1000 30 Otto.flapping(1、T、moveSize、1);壊す;ケース13:// M 13 1000 30 Otto.flapping(1、T、moveSize、-1);壊す;ケース14:// M 14 1000 20 Otto.tiptoeSwing(1、T、moveSize);壊す;ケース15:// M 15500 Otto.bend(1、T、1);壊す;ケース16:// M 16500 Otto.bend(1、T、-1);壊す;ケース17:// M 17500 Otto.shakeLeg(1、T、1);壊す;ケース18:// M 18500 Otto.shakeLeg(1、T、-1);壊す;ケース19:// M 19 500 20 Otto.jitter(1、T、moveSize);壊す;ケース20:// M 20 500 15 Otto.ascendingTurn(1、T、moveSize);壊す;デフォルト:manualMode =true;壊す; } if(!manualMode){sendFinalAck(); }} //-ジェスチャコマンドを受信する関数voidreceiveGesture(){// sendAck&必要に応じて停止sendAck(); Otto.home(); // GestureBluetoothコマンドの定義// H GestureID intgesture =0; char * arg; arg =SCmd.next(); if(arg!=NULL){gesture =atoi(arg);} else {Otto.putMouth(xMouth); delay(2000); Otto.clearMouth(); } switch(gesture){case 1:// H 1 Otto.playGesture(OttoHappy);壊す;ケース2:// H 2 Otto.playGesture(OttoSuperHappy);壊す;ケース3:// H 3 Otto.playGesture(OttoSad);壊す;ケース4:// H 4 Otto.playGesture(OttoSleeping);壊す;ケース5:// H 5 Otto.playGesture(OttoFart);壊す;ケース6:// H 6 Otto.playGesture(OttoConfused);壊す;ケース7:// H 7 Otto.playGesture(OttoLove);壊す;ケース8:// H 8 Otto.playGesture(OttoAngry);壊す;ケース9:// H 9 Otto.playGesture(OttoFretful);壊す;ケース10:// H 10 Otto.playGesture(OttoMagic);壊す;ケース11:// H 11 Otto.playGesture(OttoWave);壊す;ケース12:// H 12 Otto.playGesture(OttoVictory);壊す;ケース13:// H 13 Otto.playGesture(OttoFail);壊す;デフォルト:ブレーク; } sendFinalAck();} //-歌うコマンドを受信する関数voidreceiveSing(){// sendAck&必要に応じて停止sendAck(); Otto.home(); // SingBluetoothコマンドの定義// K SingID int sing =0; char * arg; arg =SCmd.next(); if(arg!=NULL){sing =atoi(arg);} else {Otto.putMouth(xMouth); delay(2000); Otto.clearMouth(); } switch(sing){case 1:// K 1 Otto.sing(S_connection);壊す;ケース2:// K 2 Otto.sing(S_disconnection);壊す;ケース3:// K 3 Otto.sing(S_surprise);壊す;ケース4:// K 4 Otto.sing(S_OhOoh);壊す;ケース5:// K 5 Otto.sing(S_OhOoh2);壊す;ケース6:// K 6 Otto.sing(S_cuddly);壊す;ケース7:// K 7 Otto.sing(S_sleeping);壊す;ケース8:// K 8 Otto.sing(S_happy);壊す;ケース9:// K 9 Otto.sing(S_superHappy);壊す;ケース10:// K 10 Otto.sing(S_happy_short);壊す;ケース11:// K 11 Otto.sing(S_sad);壊す;ケース12:// K 12 Otto.sing(S_confused);壊す;ケース13:// K 13 Otto.sing(S_fart1);壊す;ケース14:// K 14 Otto.sing(S_fart2);壊す;ケース15:// K 15 Otto.sing(S_fart3);壊す;ケース16:// K 16 Otto.sing(S_mode1);壊す;ケース17:// K 17 Otto.sing(S_mode2);壊す;ケース18:// K 18 Otto.sing(S_mode3);壊す;ケース19:// K 19 Otto.sing(S_buttonPushed);壊す;デフォルト:ブレーク; } sendFinalAck();} //-超音波センサー測定値を送信する関数( "cm"単位の距離)void requestDistance(){Otto.home(); //必要に応じて停止しますintdistance =Otto.getDistance(); Serial.print(F( "&&")); Serial.print(F( "D")); Serial.print(距離); Serial.println(F( "%%")); Serial.flush();} //-ノイズセンサーの測定値を送信する関数voidrequestNoise(){Otto.home(); //必要に応じて停止しますintmicrophone =Otto.getNoise(); // analogRead(PIN_NoiseSensor); Serial.print(F( "&&")); Serial.print(F( "N")); Serial.print(マイク); Serial.println(F( "%%")); Serial.flush();} //-バッテリー電圧を送信する関数percentvoidrequestBattery(){Otto.home(); //必要に応じて停止します//バッテリーの最初の読み取りは間違った読み取りであることが多いため、この値を破棄します。 double batteryLevel =Otto.getBatteryLevel(); Serial.print(F( "&&")); Serial.print(F( "B")); Serial.print(batteryLevel); Serial.println(F( "%%")); Serial.flush();} //-プログラムIDを送信する関数voidrequestProgramId(){Otto.home(); //必要に応じて停止Serial.print(F( "&&")); Serial.print(F( "I")); Serial.print(programID); Serial.println(F( "%%")); Serial.flush();} //-Ackコマンドを送信する関数(A)void sendAck(){delay(30); Serial.print(F( "&&")); Serial.print(F( "A")); Serial.println(F( "%%")); Serial.flush();} //-最終的なAckコマンドを送信する関数(F)void sendFinalAck(){delay(30); Serial.print(F( "&&")); Serial.print(F( "F")); Serial.println(F( "%%")); Serial.flush();} //-animaticsを使用した関数// ---------------------------------- ---------------------- void OttoLowBatteryAlarm(){double batteryLevel =Otto.getBatteryLevel(); if(batteryLevel <45){while(!buttonPushed){Otto.putMouth(thunder); Otto.bendTones(880、2000、1.04、8、3); // A5 =880 delay(30); Otto.bendTones(2000、880、1.02、8、3); // A5 =880 Otto.clearMouth(); delay(500); }}} void OttoSleeping_withInterrupts(){int bedPos_0 [4] ={100、80、60、120}; if(!buttonPushed){Otto._moveServos(700、bedPos_0); } for(int i =0; i <4; i ++){if(buttonPushed){break;} Otto.putAnimationMouth(dreamMouth、0); Otto.bendTones(100、200、1.04、10、10); if(buttonPushed){break;} Otto.putAnimationMouth(dreamMouth、1); Otto.bendTones(200、300、1.04、10、10); if(buttonPushed){break;} Otto.putAnimationMouth(dreamMouth、2); Otto.bendTones(300、500、1.04、10、10); delay(500); if(buttonPushed){break;} Otto.putAnimationMouth(dreamMouth、1); Otto.bendTones(400、250、1.04、10、1); if(buttonPushed){break;} Otto.putAnimationMouth(dreamMouth、0); Otto.bendTones(250、100、1.04、10、1); delay(500); } if(!buttonPushed){Otto.putMouth(lineMouth); Otto.sing(S_cuddly); } Otto.home(); if(!buttonPushed){Otto.putMouth(happyOpen);}} 
Arduinoソース
最初にこれらのライブラリをインストールしますhttps://github.com/OttoDIY/DIY

カスタムパーツとエンクロージャー

Thingiverse .STL3D印刷可能ファイル
thingsiverse.comのOtto.CADファイルの構築プロセスで使用する3Dプリントパーツ

回路図

サーボ、超音波センサー、ブザー、バッテリー接続、ケーブルをたどります。 DuPontケーブルを使用してください。

製造プロセス

  1. DIYサーモカムを作る
  2. レゴEV3のハッキング:独自のオブジェクトセンサー「目」を作成する
  3. 独自のGoogleVoiceHATを作成する
  4. ArduinoとRaspberryPiを使用してインターネット制御のビデオストリーミングロボットを構築する
  5. ドローン用の緊急着陸用パラシュート回収システムを構築する
  6. 強化学習がいつの日か産業用ロボットの操作をどのように変えることができるか
  7. ロボットの主サウロンの作り方
  8. 独自のロボットアームの構築:リスクを冒すべきですか?
  9. MeArmロボットアーム-あなたのロボット-V1.0
  10. IoT プロトタイプを構築する最良の方法
  11. トップエアコンプレッサー:所有する理由