산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Otto DIY는 1시간 만에 로봇을 만들 수 있습니다!

구성품 및 소모품

Otto DIY 빌더 키트
× 1
Otto DIY Arduino NANO 실드 I/O
× 1
Arduino Nano Every
× 1
USB-A 대 미니 USB 케이블
× 1
SG90 마이크로 서보 모터
× 4
부저
× 1
암컷/암놈 점퍼 와이어
× 6
Otto DIY 8x8mm 마이크로 스위치 자동 잠금 켜기/끄기
× 1
4xAA 배터리 홀더
스택 2X 4AA 배터리
× 1
AA 배터리
× 1

필요한 도구 및 기계

3D 프린터(일반)
십자 드라이버

앱 및 온라인 서비스

Arduino IDE
Arduino 웹 편집기
Arduino용 Microsoft Visual Studio 코드 확장

이 프로젝트 정보

오토는 누구입니까?

누구나 만들 수 있는 인터랙티브 로봇!

Otto는 무엇을 할 수 있나요?

Otto는 걷고, 춤추고, 소리를 내며 장애물을 피합니다.

Otto가 특별한 이유는 무엇입니까?

Otto는 완전히 오픈 소스이고 Arduino와 호환되며 3D 인쇄가 가능하며 어린이를 위한 포용적인 환경을 조성하기 위한 사회적 영향 사명을 가지고 있습니다.

Otto는 BoB BiPed를 지시할 수 있는 또 다른 로봇에서 영감을 얻었고 Zowi라는 다른 오픈 소스 이족 보행 로봇의 코드를 사용하여 프로그래밍했습니다.

CC-BY-SA

Otto의 차이점은 조립된 크기(11cm x 7cm x12cm), 구성 요소 및 표현의 더 깔끔한 통합입니다. 기성품 및 3D 인쇄 부품, 간단한 전자 연결(용접이 거의 필요 없음) 및 기본 코딩 기술을 사용하면 단 1시간 만에 귀여운 Otto 친구를 만들 수 있습니다! 또는 그 이하

Otto는 Autodesk 123D Design을 사용하여 설계했으며 이제는 ThinkerCAD 소프트웨어로 사용자 정의 또는 추가 개선을 위해 수정할 수 있습니다!

이 단계에서는 Otto DIY 단순 버전을 구축하는 방법에 중점을 둡니다. 예, Otto DIY+ 또는 Tito와 같은 고급 양다리 로봇이 있습니다.

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 소재의 FDM 3D 프린터 사용을 권장합니다.
  • 지지대나 뗏목이 전혀 필요하지 않습니다.
  • 해상도:0.15mm
  • 채우기 밀도 20%
  • 머신 프리 슬라이서 소프트웨어용 g 코드 슬라이싱 및 생성용 Cura 또는 우리의 경우 사용 중인 FlashForge Finder 3D 프린터와 함께 제공되는 FlashPrint(인쇄를 아웃소싱하는 경우 걱정할 필요 없음)

    인쇄 후 모터를 고정하는 다리와 발 부분을 약간 청소해야 합니다.

    부품 확인

    2단계에서 언급했듯이 사진에 3개의 나사와 함께 제공되는 마이크로 서보 모터가 이제 포함되어 있으며 읽기 쉽도록 부품 번호를 재정렬했습니다.

    미니 스크루드라이버를 자화한 것을 기억하십시오.

    지침 설명서를 다운로드 또는 인쇄하거나 이 비디오를 따르십시오:

    풋 서보 어셈블리

    마이크로 서보를 발 안쪽에 넣은 다음 안쪽으로 밀어 넣습니다. 너무 딱딱하면 커터로 더 많은 영역을 청소해야 할 수도 있습니다.

    서보가 양쪽으로 최소 90도 회전할 수 있는지 확인하는 것이 매우 중요합니다.

    움직임을 확인한 후 작은 나사만 사용하여 고정합니다.

    반대쪽 발도 같은 과정입니다.

    본체에 서보 수정

    나머지 2개의 마이크로 서보를 3D 프린팅된 바디의 정의된 위치에 놓고 뾰족한 나사로만 고정합니다.

    다리를 몸에 고정

    다리를 마이크로 서보의 허브에 연결합니다. 발 서보와 같이 다리가 몸에 대해 양쪽으로 90도 회전할 수 있는지 확인해야 합니다.

    정렬을 확인한 후 다리 안쪽 구멍에 작은 나사를 사용하여 고정합니다.

    다리에 발 고정

    그림과 같이 케이블을 잘 관리하여 다리의 구멍을 생각하여 본체의 슬롯에 케이블을 넣어야 합니다.

    올바른 위치에 있으면 뾰족한 나사를 사용하여 뒤쪽에서 고정합니다.

    헤드 어셈블리

    초음파 센서에서 시작하여 눈을 극한까지 끌어내는 것이 중요합니다.

    Arduino nano를 실드에 넣은 후 선택적으로 배터리 홀더 양극 케이블을 보드의 Vin에 용접하고 음극을 GND에 용접할 수 있습니다.

    3D 프린트 헤드의 구멍에 USB 커넥터를 향하도록 두 보드를 함께 대각선으로 삽입한 다음 마지막 뾰족한 나사 2개를 사용하여 고정합니다.

    9단계:전기 연결

    DuPont 케이블, 마이크로 스위치 및 부저를 준비합니다.

    그런 다음 다이어그램 핀 번호를 따라 올바른 위치에 놓으십시오.

    Arduino Nano 실드가 없거나 찾으면 브레드 보드를 사용하고 이 회로도 TinkerCAD Circuits를 따르십시오.

    블록이 있는 코드

    Otto Wikifactory에서 언제든지 소스 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+ 버전은 블루투스, 더 많은 센서 및 상호 작용을 사용하여 더 많은 가능성을 가지고 있습니다.

    Wikifactory에 리믹스 및 수정 사항 게시

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • 장애물 피하기
  • 장애물 피하기Arduino
    Otto는 범위의 장애물이 보일 때까지 끝없이 걷고 놀라며 돌아서서 계속 걸어갑니다
    //-------------- ------------------------------------------//-- Zowi 기본 펌웨어 v2 Otto//-- (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 <오실레이터. h>#include #include #include #include #include  #include OttoSerialCommand SCmd; //SerialCommand 객체//-- 오토 라이브러리#include Otto Otto; //오토입니다!//--------------------------------------------------------- ---------------//-- 첫 번째 단계:서보가 부착된 핀 구성/* --------------- | 오오 | |-----------------|3년==> | | <==YL 2 --------------- || || || ||RR 5==> ----- ------ <==RL 4 |----- ------|*/ #define PIN_YL 2 //servo[0] #define PIN_YR 3 //servo[1] #define PIN_RL 4 //servo[2] #define PIN_RR 5 //servo[3]//---Otto Buttons#define PIN_SecondButton 6#define PIN_ThirdButton 7/////// ////////////////////////////////////////////////////// /////////////-- 전역 변수 ---------------------------------- ---------///////////////////////////////////////////// ////////////////////////////const char programID[]="Otto_todo"; //각 프로그램은 IDconst char name_fac='$'; //공장명const char name_fir='#'; //이름//-- 이동 매개변수int T=1000; //초기 이동시간int moveId=0; //이동 횟수int moveSize=15; //일부 움직임의 높이와 연관 //--------------------------------------- ------------------//-- Otto에는 5가지 모드가 있습니다.://-- * MODE =0:Otto가 기다리고 있습니다. //-- * MODE =1:춤 모드 ! //-- * MODE =2:장애물 감지기 모드 //-- * MODE =3:소음 감지기 모드 //-- * MODE =4:OttoPAD 또는 원격 작동 모드(SerialPort 수신). //------------------------------------------------ ---------휘발성 int MODE=0; //주 상태 머신의 Otto 상태입니다. 휘발성 bool buttonPushed=거짓; //버튼이 눌렸을 때 기억할 변수volatile bool buttonAPushed=false; //A 버튼이 눌렸을 때 기억할 변수volatile bool buttonBPushed=false; //B 버튼이 눌렸을 때 기억할 변수 unsigned long previousMillis=0;int randomDance=0;int randomSteps=0;bool barrierDetected =false;//////////////////// ////////////////////////////////////////////////////// -- 설정 ----------------------------------------------- -------////////////////////////////////////////////// /////////////////////////void setup(){ //시리얼 통신 초기화 Serial.begin(115200); 핀모드(PIN_SecondButton,INPUT); 핀모드(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(); // 마지막으로 트림을 설정할 때 한 번의 업로드에 대해서만 주석 처리를 제거합니다. //랜덤 시드 설정 randomSeed(analogRead(A6)); // 인터럽트 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("나", requestProgramId); SCmd.addDefaultHandler(receiveStop); //오토 일어나! Otto.sing(S_connection); 오토.홈(); 지연(50); // 애니메이션 Uuuuuh - 약간의 첫 놀라움 //----- for(int i=0; i<2; i++){ for (int i=0;i<8;i++){ if(buttonPushed) {break;} Otto.putAnimationMouth(littleUuh,i); 지연(150); } } //----- //행복한 오토에게 미소 짓기 :) if(!buttonPushed){ Otto.putMouth(smile); Otto.sing(S_happy); 지연(200); } //Otto의 이름이 '#'이면 Otto는 세례를 받지 않았음을 의미합니다. //이 경우 Otto는 더 긴 인사말을 합니다. //5 =이름 문자가 포함된 EEPROM 주소 if (EEPROM.read(5)==name_fir){ if(!buttonPushed){ Otto.jump(1,700); 지연(200); } if(!buttonPushed){ Otto.shakeLeg(1,T,1); } if(!buttonPushed){ Otto.putMouth(smallSurprise); 오토 스윙(2,800,20); 오토.홈(); } } if(!buttonPushed){ Otto.putMouth(happyOpen); } 이전Millis =millis();}//////////////////////////////////////////// ///////////////////////////-- 주요 루프 ------------------- --------------------------////////////////////////// /////////////////////////////////////////////// 무효 루프() { //-- MODE 2 - 장애물 감지 모드 if(obstacleDetected){ Otto.sing(S_surprise); Otto.playGesture(OttoFretful); Otto.sing(S_fart3); Otto.walk(2,1300,-1); 오토.턴(2,1000,-1); 지연(50); 장애물 감지기(); } else{ Otto.walk(1,1000,1); 장애물 감지기(); } } /////////////////////////////////////////////////// //////////////////////-- 함수 -------------------------- ------------------------///////////////////////////// ///////////////////////////////////////////////-- 다음 경우에 실행되는 함수 두 번째 버튼이 pushvoid secondButtonPushed(){ buttonAPushed=true; if(!buttonPushed){ buttonPushed=참; Otto.putMouth(작은 서프라이즈); } }//-- 세 번째 버튼을 눌렀을 때 실행되는 함수void thirdButtonPushed(){ buttonBPushed=true; if(!buttonPushed){ buttonPushed=참; Otto.putMouth(작은 서프라이즈); }}//-- 거리 센서를 읽고 장애물 감지를 구현하는 함수 variablevoid 장애물 감지기(){ int distance =Otto.getDistance(); if(distance<15){장애물감지 =참; }else{ 장애물 감지 =거짓; }}//-- 중지를 수신하는 함수 command.void receiveStop(){ sendAck(); 오토.홈(); sendFinalAck();}//-- LED 명령을 수신하는 기능void receiveLED(){ //sendAck &필요한 경우 중지 sendAck(); 오토.홈(); //receiveLED 블루투스 명령어 예시 //L 000000001000010100100011000000000 //L 0011111111111111111111111111111 (todos los LED encendidos long int matrix) unsigned; 문자 * 인수; 문자 *endstr; 인수 =SCmd.next(); //Serial.println(인수); if (arg !=NULL) { matrix=strtoul(arg,&endstr,2); // char string을 unsigned long integer로 변환 Otto.putMouth(matrix,false); }else{ Otto.putMouth(xMouth); 지연(2000); Otto.clearMouth(); } sendFinalAck();}//-- 부저 명령을 받는 함수void recieveBuzzer(){ //sendAck &필요한 경우 중지 sendAck(); 오토.홈(); 부울 오류 =거짓; 정수 주파수; 정수 기간; 문자 * 인수; 인수 =SCmd.next(); if (인수 !=NULL) { frec=atoi(인수); } // 문자열을 정수로 변환 else {error=true;} arg =SCmd.next(); if (인수 !=NULL) { 기간=atoi(인수); } // 문자열을 정수로 변환 else {error=true;} if(error==true){ Otto.putMouth(xMouth); 지연(2000); Otto.clearMouth(); }else{ Otto._tone(frec, duration, 1); } sendFinalAck();}//-- TRims 명령을 수신하는 함수void receiveTrims(){ //sendAck &필요한 경우 중지 sendAck(); 오토.홈(); int 트림_YL, 트림_YR, 트림_RL, 트림_RR; //서보 블루투스 명령어 정의 //C trim_YL trim_YR trim_RL trim_RR //receiveTrims 블루투스 명령어 예시 //C 20 0 -8 3 bool error =false; 문자 * 인수; 인수 =SCmd.next(); if (인수 !=NULL) { trim_YL=atoi(인수); } // 문자열을 정수로 변환 else {error=true;} arg =SCmd.next(); if (인수 !=NULL) { trim_YR=atoi(인수); } // 문자열을 정수로 변환 else {error=true;} arg =SCmd.next(); if (인수 !=NULL) { trim_RL=atoi(인수); } // 문자열을 정수로 변환 else {error=true;} arg =SCmd.next(); if (인수 !=NULL) { trim_RR=atoi(인수); } // 문자열을 정수로 변환 else {error=true;} if(error==true){ Otto.putMouth(xMouth); 지연(2000); Otto.clearMouth(); }else{ //EEPROM에 저장 Otto.setTrims(trim_YL, trim_YR, trim_RL, trim_RR); Otto.saveTrimsOnEEPROM(); // 마지막으로 트림을 설정할 때 한 번의 업로드에 대해서만 주석 처리를 제거합니다. } sendFinalAck();}//-- 서보 명령을 받는 함수void receiveServo(){ sendAck(); 이동 ID =30; //서보 블루투스 명령어 정의 //G 서보_YL 서보_YR 서보_RL 서보_RR //receiveServo 블루투스 명령어 예시 //G 90 85 96 78 bool error =false; 문자 * 인수; int 서보_YL, 서보_YR, 서보_RL, 서보_RR; 인수 =SCmd.next(); if (인수 !=NULL) { 서보_YL=아토이(인수); } // 문자열을 정수로 변환 else {error=true;} arg =SCmd.next(); if (인수 !=NULL) { 서보_YR=atoi(인수); } // 문자열을 정수로 변환 else {error=true;} arg =SCmd.next(); if (인수 !=NULL) { 서보_RL=atoi(인수); } // 문자열을 정수로 변환 else {error=true;} arg =SCmd.next(); if (인수 !=NULL) { 서보_RR=atoi(인수); } // 문자열을 정수로 변환 else {error=true;} if(error==true){ Otto.putMouth(xMouth); 지연(2000); Otto.clearMouth(); }else{ //서보 업데이트:int servoPos[4]={servo_YL, 서보_YR, 서보_RL, 서보_RR}; Otto._moveServos(200, 서보포스); //200ms 이동 } sendFinalAck();}//-- 이동 명령을 받는 함수void receiveMovement(){ sendAck(); if (Otto.getRestState()==true){ Otto.setRestState(false); } //이동 블루투스 명령어 정의 //M MoveID T MoveSize char *arg; 인수 =SCmd.next(); if (arg !=NULL) {moveId=atoi(arg);} else{ Otto.putMouth(xMouth); 지연(2000); Otto.clearMouth(); moveId=0; //중지 } arg =SCmd.next(); if (arg !=NULL) {T=atoi(arg);} else{ T=1000; } 인수 =SCmd.next(); if (arg !=NULL) {moveSize=atoi(arg);} else{ moveSize =15; }}//-- 이동 명령에 따라 올바른 이동을 실행하는 함수 receive.void move(int moveId){ bool manualMode =false; 스위치 (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 15 500 Otto.bend(1,T,1); 부서지다; 사례 16://M 16 500 Otto.bend(1,T,-1); 부서지다; 사례 17://M 17 500 Otto.shakeLeg(1,T,1); 부서지다; 사례 18://M 18 500 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(); } }//-- 제스처 명령을 수신하는 함수void receiveGesture(){ //sendAck 및 필요한 경우 중지 sendAck(); 오토.홈(); //제스쳐 블루투스 명령어 정의 //H GestureID int 제스처 =0; 문자 * 인수; 인수 =SCmd.next(); if (arg !=NULL) {제스처=atoi(arg);} else { Otto.putMouth(xMouth); 지연(2000); Otto.clearMouth(); } 스위치(제스처) { 경우 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();}//-- 노래 명령을 수신하는 함수void receiveSing(){ //sendAck &필요한 경우 중지 sendAck(); 오토.홈(); //Sing 블루투스 명령어 정의 //K SingID int sing =0; 문자 * 인수; 인수 =SCmd.next(); if (arg !=NULL) {sing=atoi(arg);} else { Otto.putMouth(xMouth); 지연(2000); Otto.clearMouth(); } 스위치(노래) { 경우 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(); //필요하면 중지 int distance =Otto.getDistance(); Serial.print(F("&&")); Serial.print(F("D ")); Serial.print(거리); Serial.println(F("%%")); Serial.flush();}//-- 노이즈 센서를 보내는 함수 measurevoid requestNoise(){ Otto.home(); //필요하면 중지 int 마이크=Otto.getNoise(); //analogRead(PIN_NoiseSensor); Serial.print(F("&&")); Serial.print(F("N ")); Serial.print(마이크); Serial.println(F("%%")); Serial.flush();}//-- 배터리 전압을 전송하는 기능 퍼센트 무효 requestBattery(){ Otto.home(); //필요한 경우 중지 //배터리의 첫 번째 읽기는 종종 잘못된 읽기이므로 이 값을 버립니다. 이중 배터리 레벨 =Otto.getBatteryLevel(); Serial.print(F("&&")); Serial.print(F("B")); Serial.print(배터리 레벨); Serial.println(F("%%")); Serial.flush();}//-- 프로그램을 보내는 함수 IDvoid requestProgramId(){ Otto.home(); //필요하면 중지 Serial.print(F("&&")); Serial.print(F("나는 ")); Serial.print(프로그램ID); 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();}//-- 애니매틱스가 포함된 함수//---------------------------------- ---------------------- 무효 OttoLowBatteryAlarm(){ 이중 배터리 레벨 =Otto.getBatteryLevel(); if(batteryLevel<45){ while(!buttonPushed){ Otto.putMouth(천둥); Otto.bendTones (880, 2000, 1.04, 8, 3); //A5 =880 지연(30); Otto.bendTones (2000, 880, 1.02, 8, 3); //A5 =880 Otto.clearMouth(); 지연(500); } }}무효 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); 지연(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); 지연(500); } if(!buttonPushed){ Otto.putMouth(lineMouth); Otto.sing(S_cuddly); } 오토.홈(); if(!buttonPushed){Otto.putMouth(happyOpen);} }
    Arduino 소스
    이 라이브러리를 먼저 설치하십시오https://github.com/OttoDIY/DIY

    맞춤형 부품 및 인클로저

    Thingiverse .STL 3D 인쇄 가능 파일
    thingiverse.com 의 Otto.CAD 파일 제작 과정에서 사용할 3D 프린트 부품

    회로도

    서보, 초음파 센서, 부저 및 배터리 연결은 케이블을 따릅니다. DuPont 케이블을 사용하십시오.

    제조공정

    1. DIY 써모캠 제작
    2. 레고 EV3 해킹:자신만의 물체 센서 "눈" 만들기
    3. 나만의 Google 보이스 HAT 만들기
    4. Arduino 및 Raspberry Pi로 인터넷 제어 비디오 스트리밍 로봇 구축
    5. 드론을 위한 탄도 낙하산 회수 시스템 구축
    6. 강화 학습이 언젠가 산업용 로봇 작업을 어떻게 변화시킬 수 있는지
    7. 로봇의 제왕 Sauron을 만드는 방법
    8. 자신만의 로봇 팔 만들기:위험을 감수해야 합니까?
    9. IoT 프로토타입을 구축하는 가장 좋은 방법
    10. 최고의 공기 압축기:하나를 소유해야 하는 이유