Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Otto DIY bouw je eigen robot in één uur!

Componenten en benodigdheden

Otto DIY Builder Kit
× 1
Otto DIY Arduino NANO Shield I/O
× 1
Arduino Nano Elke
× 1
USB-A naar mini-USB-kabel
× 1
SG90 Micro-servomotor
× 4
Zoemer
× 1
Vrouwelijke/vrouwelijke verbindingsdraden
× 6
Otto DIY 8x8mm Micro Switch Zelfvergrendeling Aan/Uit
× 1
4xAA-batterijhouder
Stapel 2x 4AA-batterij
× 1
AA-batterijen
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)
Kruiskopschroevendraaier

Apps en online services

Arduino IDE
Arduino Web Editor
Microsoft Visual Studio Code Extension voor Arduino

Over dit project

Wie is Otto?

Een interactieve robot die iedereen kan maken!

Wat kan Otto doen?

Otto loopt, danst, maakt geluiden en ontwijkt obstakels.

Waarom is Otto speciaal?

Otto is volledig open source, Arduino-compatibel, 3D-printbaar en met een sociale impactmissie om een ​​inclusieve omgeving voor kinderen te creëren.

Otto werd geïnspireerd door een andere robot die instructiebaar is BoB de BiPed en geprogrammeerd met behulp van code van een andere open source tweebenige robot genaamd Zowi.

CC-BY-SA

Otto's verschillen zitten in het geassembleerde formaat (11cm x 7cm x12cm), schonere integratie van componenten en uitdrukkingen. Met kant-en-klare en 3D-geprinte onderdelen, eenvoudige elektronische verbindingen (bijna geen lassen vereist) en basiscoderingsvaardigheden, kun je in slechts een uur je eigen schattige Otto-vriend bouwen! of zelfs minder

Otto was aan het ontwerpen met behulp van Autodesk 123D Design, nu ThinkerCAD-software die je kunt aanpassen voor aanpassingen of verdere verbeteringen!

Deze stap voor stap richt zich op het bouwen van de Otto DIY eenvoudige versie; ja, er zijn meer geavanceerde tweedelige robots zoals Otto DIY+ of Tito

Stap 1:Verzamel eerst alle onderdelen en gereedschappen

Verzamel alle kant-en-klare hardware-onderdelen die je nodig hebt voor deze montage.

mini-broodplank is een alternatief voor het schild, maar vereist meer bedrading en tijd

Dan hoef je in totaal maar 6 delen te 3D printen:

11. 3D-geprinte kop.

12. 3D-geprint lichaam.

13. 3D-geprint been x2.

14. 3D-geprinte voet x2

Optioneel:snijplotter voor het nareinigen van de 3D-onderdelen (als de 3D-printkwaliteit goed genoeg is niet nodig) en een soldeerbout (als je wilt dat het batterijvoeding is, anders kan het nog steeds via USB worden aangesloten om te activeren)

Dat is allemaal simpel!; download alle .stl-bestanden , Als je geen 3D-printer hebt, kun je altijd naar je lokale makerruimte gaan.

Als je het onderdeel niet hebt of moeilijk kunt krijgen, kun je gewoon onze volledige sets kopen bezoek www.ottodiy.com

3D-afdrukinstellingen

Otto is zeer goed ontworpen voor 3D-printen, de bestanden die u had gedownload zijn eigendomsgericht en gecentreerd, dus u zult geen problemen ondervinden als u deze algemene parameters volgt:

  • Aanbevolen om een ​​FDM 3D-printer met PLA-materiaal te gebruiken.
  • Helemaal geen steunen of vlotten nodig.
  • Resolutie:0,15 mm
  • Vuldichtheid 20%

Voor het snijden en genereren van de g-code voor de machine gratis slicer-software zoals Cura of in ons geval FlashPrint dat wordt geleverd met de FlashForge Finder 3D-printer die we gebruiken (als u het afdrukken uitbesteedt, hoeft u zich daar geen zorgen over te maken)

Na het printen moet je de benen en voeten die de motoren bevestigen een beetje schoonmaken.

Controleer uw onderdelen

Zoals vermeld in stap 2, worden micro-servomotoren geleverd met 3 schroeven in de afbeelding zijn nu inbegrepen en hebben het onderdeelnummer opnieuw gerangschikt voor gemakkelijk lezen.

Vergeet niet je mini-schroevendraaier te magnetiseren.

Download of print de handleidingen of volg deze video:

Montage voetservo's

Plaats de microservo in de voetjes en duw hem dan naar binnen, als het te moeilijk is, moet je misschien meer van het gebied schoonmaken met een snijplotter.

Het is erg belangrijk om te controleren of de servo in staat is om ten minste 90 graden naar elke kant te draaien.

Gebruik na het controleren van het uurwerk alleen de kleine schroef om het vast te zetten.

Hetzelfde proces voor de andere voet.

Bevestig servo's aan body

Neem de andere 2 micro-servo's, plaats ze op de gedefinieerde locaties in de 3D-geprinte body en bevestig ze alleen met de puntige schroeven.

Bevestig benen aan lichaam

Sluit de poten aan op de naaf van de microservo, belangrijk, net als de voetservo's, moet u controleren of de poten 90 graden aan elke kant ten opzichte van het lichaam kunnen draaien.

Nadat u de uitlijning hebt gecontroleerd, bevestigt u ze met de kleine schroeven in het gat in de poot.

Bevestig voet aan benen

Zorg voor de kabels zoals weergegeven in de afbeelding. Plaats de kabels in de sleuven van het lichaam, langs het gat in de poten.

Zodra ze in de juiste positie zitten, gebruikt u de puntige schroeven om ze vanaf de achterkant te bevestigen.

Hoofdmontage

Starten vanaf de ultrasone sensor is belangrijk om de ogen tot het uiterste te trekken.

Nadat je de Arduino nano in het schild hebt geplaatst, kun je optioneel de positieve kabel van de batterijhouder aan Vin in het bord lassen en negatief aan elke GND.

Plaats de beide kaarten diagonaal tegen elkaar gericht naar de USB-connector in het gat in de 3D-geprinte kop en gebruik vervolgens de laatste 2 puntige schroeven om het te bevestigen.

Stap 9:Elektrische aansluiting

Bereid de DuPont-kabels, microschakelaar en zoemer voor.

Volg daarna de pinnennummers van het diagram en zorg ervoor dat u ze op de juiste plaats plaatst.

Als je het Arduino Nano-schild niet hebt of vindt, gebruik dan een breadboard en volg dit schakelschema TinkerCAD Circuits

Code met blokken

Je kunt altijd de Arduino-broncodes van de Otto Wikifactory proberen.

Hier vindt u enkele gratis tutorials voor beginners om snel aan de slag te gaan met Arduino voor elk onderdeel:

- Servomotor-tutorial:https://arduinogetstarted.com/tutorials/arduino-servo-motor
- Ultrasone sensor-tutorial:https://arduinogetstarted.com/tutorials/arduino-ultrasonic-sensor
- Touch Sensorhandleiding:https://arduinogetstarted.com/tutorials/arduino-touch-sensor
- Zoemerhandleiding:https://arduinogetstarted.com/tutorials/arduino-piezo-buzzer

Bezoek www.ottodiy.com

Otto DIY+ versie heeft meer mogelijkheden met Bluetooth, meer sensoren en interacties.

post je remix en aanpassingen in de Wikifactory

Code

  • Ontwijk obstakels
Ontwijk obstakelsArduino
Otto zal eindeloos lopen totdat hij een obstakel in het bereik ziet, zal verrast zijn, komt terug en loopt dan verder
//---------------------- ------------------------------------------//-- Zowi basisfirmware v2 aangepast aan Otto//-- (c) BQ. Uitgegeven onder een GPL-licentie//-- 04 december 2015//-- Auteurs:Anita de Prado:[email protected]//-- Jose Alberca:[email protected]//-- Javier Isabel:[email protected]//-- Juan Gonzalez (obijuan):[email protected]//-- Irene Sanz:[email protected]//---------- -------------------------------------------------- -----//-- Experimenteer met alle functies die Otto heeft dankzij Zowi!//--------------------------- --------------------------------------#include  #include #include #include #include #include #include  #include OttoSerialCommand SCmd; //Het SerialCommand-object//-- Otto Library#include Otto Otto; //Dit is Otto!//------------------------------------------ ---------------//-- Eerste stap:Configureer de pinnen waar de servo's aan zijn bevestigd/* --------------- | O O | |---------------|JR 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//////// ////////////////////////////////////////////////// ////////////-- Globale variabelen ---------------------------------- ---------///////////////////////////////////////// ////////////////////////////const char programID[]="Otto_todo"; //Elk programma heeft een IDconst char name_fac='$'; //Factory nameconst char name_fir='#'; //Voornaam//-- Bewegingsparametersint T=1000; //Initiële duur van bewegingint moveId=0; //Aantal bewegingenint moveSize=15; //Geassocieerd met de hoogte van sommige bewegingen//--------------------------------------- ------------------//-- Otto heeft 5 modi://-- * MODE =0:Otto wacht //-- * MODE =1:Dansmodus ! //-- * MODE =2:Obstakeldetectormodus //-- * MODE =3:Ruisdetectormodus //-- *MODUS =4:OttoPAD of een willekeurige telebedieningsmodus (luisteren naar SerialPort). //------------------------------------------------ ---------vluchtige int MODE=0; //Staat van Otto in de belangrijkste staatsmachine. vluchtige bool buttonPushed=false; //Variabele om te onthouden wanneer een knop is ingedrukt vluchtige bool buttonAPushed=false; //Variabele om te onthouden wanneer een knop is ingedrukt vluchtige bool buttonBPushed=false; //Variabele om te onthouden wanneer B-knop unsigned lang is ingedrukt previousMillis=0;int randomDance=0;int randomSteps=0;bool obstakelDetected =false;/////////////////// ////////////////////////////////////////////////// -- Opstelling ----------------------------------------------- -------/////////////////////////////////////////// //////////////////////////void setup(){ //Seriële communicatie initialisatie Serial.begin(115200); pinMode (PIN_SecondButton, INPUT); pinMode(PIN_ThirdButton,INPUT); // Stel de servo-pinnen in Otto.init (PIN_YL,PIN_YR,PIN_RL,PIN_RR,true); // Maak dit commentaar los om de servo-trims handmatig in te stellen en op te slaan op EEPROM //Otto.setTrims (TRIM_YL, TRIM_YR, TRIM_RL, TRIM_RR); //Otto.saveTrimsOnEEPROM(); // Uncomment dit slechts voor één upload wanneer u definitief de trims instelt. //Stel een willekeurig zaad randomSeed in (analogRead (A6)); // Onderbrekingen enableInterrupt (PIN_SecondButton, secondButtonPushed, RISING); enableInterrupt(PIN_ThirdButton, thirdButtonPushed, RISING); // Setup-callbacks voor SerialCommand-opdrachten SCmd.addCommand ("S", receiverStop); // sendAck &sendFinalAck SCmd.addCommand ("L", ontvangLED); // sendAck &sendFinalAck SCmd.addCommand ("T", recieveBuzzer); // sendAck &sendFinalAck SCmd.addCommand ("M", ontvangMovement); // sendAck &sendFinalAck SCmd.addCommand ("H", ontvangGesture); // sendAck &sendFinalAck SCmd.addCommand ("K", ontvangen); // sendAck &sendFinalAck SCmd.addCommand ("C", ontvangTrims); // sendAck &sendFinalAck SCmd.addCommand ("G", ontvangServo); // sendAck &sendFinalAck SCmd.addCommand ("D", requestDistance); SCmd.addCommand("N", requestNoise); SCmd.addCommand("B", requestBattery); SCmd.addCommand("I", requestProgramId); SCmd.addDefaultHandler(receiveStop); //Otto wakker worden! Otto.sing(S_verbinding); Otto.home(); vertraging (50); // Animatie Uuuuuh - Een klein moment van eerste verrassing //----- for(int i=0; i<2; i++){ for (int i=0;i<8;i++){ if(buttonPushed) {break;} Otto.putAnimationMouth(littleUuh,i); vertraging (150); } } //----- //Glimlach voor een gelukkige Otto :) if(!buttonPushed){ Otto.putMouth(smile); Otto.sing(S_happy); vertraging (200); } //Als Otto's naam '#' is, betekent dit dat Otto niet is gedoopt //In dit geval doet Otto een langere begroeting //5 =EEPROM-adres dat het voornaamteken bevat if (EEPROM.read(5)==name_fir){ if(!buttonPushed){ Otto.jump(1.700); vertraging (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); } vorigeMillis =millis();}////////////////////////////////////////// ///////////////////////////-- Hoofdlus ------------------- --------------------------//////////////////////// /////////////////////////////////////////////ongeldige lus() { //-- MODUS 2 - Obstakeldetectormodus als (obstakel gedetecteerd) {Otto.sing (S_surprise); Otto.playGesture(OttoFretful); Otto.sing(S_fart3); Otto.lopen(2.1300,-1); Otto.turn (2.1000,-1); vertraging (50); obstakeldetector(); } else{ Otto.walk(1,1000,1); obstakeldetector(); } } //////////////////////////////////////////////// /////////////////////-- Functies -------------------------- ------------------------////////////////////////// /////////////////////////////////////////////-- Functie uitgevoerd wanneer tweede knop wordt ingedrukt ongeldig secondButtonPushed(){ buttonAPushed=true; if(!buttonPushed){ buttonPushed=true; Otto.putMouth(kleine verrassing); } }//-- Functie uitgevoerd wanneer de derde knop wordt ingedrukt ongeldig thirdButtonPushed(){ buttonBPushed=true; if(!buttonPushed){ buttonPushed=true; Otto.putMouth(kleine verrassing); }}//-- Functie om afstandssensor te lezen en om obstakel te actualiseren.Gedetecteerde variabele ongeldig obstakelDetector(){ int distance =Otto.getDistance(); if (afstand <15) {obstakel gedetecteerd =waar; }else{ obstakel gedetecteerd =false; }}//-- Functie om Stop-commando te ontvangen.void ReceiveStop(){ sendAck(); Otto.home(); sendFinalAck();}//-- Functie om LED-commando's te ontvangenvoid ReceiveLED(){ //sendAck &stop indien nodig sendAck(); Otto.home(); //Voorbeelden van bluetooth-commando's van ReceiveLED //L 000000001000010100100011000000000 //L 001111111111111111111111111111111 (todos los LED encendidos) unsigned long int matrix; teken *arg; char *endstr; arg=SCmd.volgende(); //Serial.println (arg); if (arg !=NULL) { matrix=strtoul(arg,&endstr,2); // Converteert een tekenreeks naar een niet-ondertekend lang geheel getal Otto.putMouth(matrix,false); }anders{ Otto.putMouth(xMouth); vertraging (2000); Otto.clearMouth(); } sendFinalAck();}//-- Functie om zoemercommando's te ontvangenvoid recieveBuzzer(){ //sendAck &stop indien nodig sendAck(); Otto.home(); bool-fout =onwaar; int frec; int duur; teken *arg; arg =SCmd.next(); if (arg !=NULL) { frec=atoi(arg); } // Converteert een tekenreeks naar een geheel getal else {error=true;} arg =SCmd.next(); if (arg !=NULL) {duur=atoi(arg); } // Converteert een tekenreeks naar een geheel getal else {error=true;} if(error==true){ Otto.putMouth(xMouth); vertraging (2000); Otto.clearMouth(); }else{ Otto._tone(frec, duur, 1); } sendFinalAck();}//-- Functie om TRims-commando's te ontvangenvoid ReceiveTrims(){ //sendAck &stop indien nodig sendAck(); Otto.home(); int trim_YL,trim_YR,trim_RL,trim_RR; //Definitie van Servo Bluetooth-commando //C trim_YL trim_YR trim_RL trim_RR //Voorbeelden van ReceiveTrims Bluetooth-commando's //C 20 0 -8 3 bool error =false; teken *arg; arg=SCmd.volgende(); if (arg !=NULL) { trim_YL=atoi(arg); } // Converteert een tekenreeks naar een geheel getal else {error=true;} arg =SCmd.next(); if (arg !=NULL) { trim_YR=atoi(arg); } // Converteert een tekenreeks naar een geheel getal else {error=true;} arg =SCmd.next(); if (arg !=NULL) { trim_RL=atoi(arg); } // Converteert een tekenreeks naar een geheel getal else {error=true;} arg =SCmd.next(); if (arg !=NULL) { trim_RR=atoi(arg); } // Converteert een tekenreeks naar een geheel getal else {error=true;} if(error==true){ Otto.putMouth(xMouth); vertraging (2000); Otto.clearMouth(); }else{ // Bewaar het op EEPROM Otto.setTrims (trim_YL, trim_YR, trim_RL, trim_RR); Otto.saveTrimsOnEEPROM(); // Uncomment dit slechts voor één upload wanneer u definitief de trims instelt. } sendFinalAck();}//-- Functie om Servo-commando's te ontvangenvoid ReceiveServo(){ sendAck(); verplaats-ID =30; //Definitie van Servo Bluetooth-commando //G servo_YL servo_YR servo_RL servo_RR //Voorbeeld van ReceiveServo Bluetooth-commando's //G 90 85 96 78 bool error =false; teken *arg; int servo_YL,servo_YR,servo_RL,servo_RR; arg=SCmd.volgende(); if (arg !=NULL) { servo_YL=atoi(arg); } // Converteert een tekenreeks naar een geheel getal else {error=true;} arg =SCmd.next(); if (arg !=NULL) { servo_YR=atoi(arg); } // Converteert een tekenreeks naar een geheel getal else {error=true;} arg =SCmd.next(); if (arg !=NULL) { servo_RL=atoi(arg); } // Converteert een tekenreeks naar een geheel getal else {error=true;} arg =SCmd.next(); if (arg !=NULL) { servo_RR=atoi(arg); } // Converteert een tekenreeks naar een geheel getal else {error=true;} if(error==true){ Otto.putMouth(xMouth); vertraging (2000); Otto.clearMouth(); }else{ //Update Servo:int servoPos[4]={servo_YL, servo_YR, servo_RL, servo_RR}; Otto._moveServos(200, servoPos); //Move 200ms} sendFinalAck();}//-- Functie om bewegingscommando's te ontvangenvoid ReceiveMovement(){ sendAck(); if (Otto.getRestState()==true){ Otto.setRestState(false); } //Definitie van Bluetooth-opdrachten voor beweging //M MoveID T MoveSize char *arg; arg =SCmd.next(); if (arg !=NULL) {moveId=atoi(arg);} else{ Otto.putMouth(xMouth); vertraging (2000); Otto.clearMouth(); moveId=0; //stop} arg =SCmd.next(); if (arg !=NULL) {T=atoi(arg);} else{ T=1000; } arg =SCmd.next(); if (arg !=NULL) {moveSize=atoi(arg);} else{ moveSize =15; }}//-- Functie om de juiste beweging uit te voeren volgens het bewegingscommando ontvangen.void move(int moveId){ bool manualMode =false; switch (moveId) { geval 0:Otto.home(); pauze; geval 1://M 1 1000 Otto.walk(1,T,1); pauze; geval 2://M 2 1000 Otto.walk(1,T,-1); pauze; geval 3://M 3 1000 Otto.turn(1,T,1); pauze; geval 4://M 4 1000 Otto.turn(1,T,-1); pauze; geval 5://M 5 1000 30 Otto.updown(1,T,moveSize); pauze; casus 6://M 6 1000 30 Otto.moonwalker(1,T,moveSize,1); pauze; casus 7://M 7 1000 30 Otto.moonwalker(1,T,moveSize,-1); pauze; geval 8://M 8 1000 30 Otto.swing(1,T,moveSize); pauze; geval 9://M 9 1000 30 Otto.crusaito(1,T,moveSize,1); pauze; geval 10://M 10 1000 30 Otto.crusaito(1,T,moveSize,-1); pauze; geval 11://M 11 1000 Otto.jump(1,T); pauze; geval 12://M 12 1000 30 Otto.flapping(1,T,moveSize,1); pauze; casus 13://M 13 1000 30 Otto.flapping(1,T,moveSize,-1); pauze; case 14://M 14 1000 20 Otto.tiptoeSwing(1,T,moveSize); pauze; geval 15://M 15 500 Otto.bend(1,T,1); pauze; zaak 16://M 16 500 Otto.bend(1,T,-1); pauze; casus 17://M 17 500 Otto.shakeLeg(1,T,1); pauze; casus 18://M 18 500 Otto.shakeLeg(1,T,-1); pauze; casus 19://M 19 500 20 Otto.jitter(1,T,moveSize); pauze; casus 20://M 20 500 15 Otto.ascendingTurn(1,T,moveSize); pauze; standaard:handmatige modus =waar; pauze; } if(!manualMode){ sendFinalAck(); } }//-- Functie om gebarencommando's te ontvangenvoid ReceiveGesture(){ //sendAck &stop indien nodig sendAck(); Otto.home(); // Definitie van Bluetooth-opdrachten voor gebaren // H GestureID int gebaar =0; teken *arg; arg =SCmd.next(); if (arg !=NULL) {gesture=atoi(arg);} else { Otto.putMouth(xMouth); vertraging (2000); Otto.clearMouth(); } switch (gebaar) { case 1://H 1 Otto.playGesture(OttoHappy); pauze; geval 2://H 2 Otto.playGesture(OttoSuperHappy); pauze; geval 3://H 3 Otto.playGesture(OttoSad); pauze; geval 4://H 4 Otto.playGesture(OttoSleeping); pauze; geval 5://H 5 Otto.playGesture(OttoFart); pauze; casus 6://H 6 Otto.playGesture(OttoConfused); pauze; geval 7://H 7 Otto.playGesture(OttoLove); pauze; geval 8://H 8 Otto.playGesture(OttoAngry); pauze; geval 9://H 9 Otto.playGesture(OttoFretful); pauze; geval 10://H 10 Otto.playGesture(OttoMagic); pauze; geval 11://H 11 Otto.playGesture(OttoWave); pauze; geval 12://H 12 Otto.playGesture(OttoVictory); pauze; casus 13://H 13 Otto.playGesture(OttoFail); pauze; standaard:pauze; } sendFinalAck();}//-- Functie om sing commandsvoid ReceiveSing() te ontvangen {//sendAck &stop indien nodig sendAck(); Otto.home(); // Definitie van Sing Bluetooth-opdrachten // K SingID int sing =0; teken *arg; arg =SCmd.next(); if (arg !=NULL) {sing=atoi(arg);} else { Otto.putMouth(xMouth); vertraging (2000); Otto.clearMouth(); } switch (zing) { case 1://K 1 Otto.sing(S_connection); pauze; geval 2://K 2 Otto.sing(S_disconnection); pauze; geval 3://K 3 Otto.sing(S_surprise); pauze; geval 4://K 4 Otto.sing(S_OhOoh); pauze; geval 5://K 5 Otto.sing(S_OhOoh2); pauze; case 6://K 6 Otto.sing(S_cuddly); pauze; geval 7://K 7 Otto.sing(S_sleeping); pauze; geval 8://K 8 Otto.sing(S_happy); pauze; geval 9://K 9 Otto.sing(S_superHappy); pauze; geval 10://K 10 Otto.sing(S_happy_short); pauze; geval 11://K 11 Otto.sing(S_sad); pauze; geval 12://K 12 Otto.sing(S_confused); pauze; geval 13://K 13 Otto.sing(S_fart1); pauze; geval 14://K 14 Otto.sing(S_fart2); pauze; geval 15://K 15 Otto.sing(S_fart3); pauze; geval 16://K 16 Otto.sing(S_mode1); pauze; geval 17://K 17 Otto.sing(S_mode2); pauze; geval 18://K 18 Otto.sing(S_mode3); pauze; casus 19://K 19 Otto.sing(S_buttonPushed); pauze; standaard:pauze; } sendFinalAck();}//-- Functie voor het verzenden van ultrasone sensormeting (afstand in "cm") ongeldig requestDistance(){ Otto.home(); // stop indien nodig int distance =Otto.getDistance(); Serial.print(F("&&")); Serial.print(F("D")); Serial.print(afstand); Serial.println(F("%%")); Serial.flush();}//-- Functie om meetvoid request voor ruissensor te verzendenNoise(){ Otto.home(); // stop indien nodig int microfoon =Otto.getNoise (); //analogRead (PIN_NoiseSensor); Serial.print(F("&&")); Serial.print(F("N")); Seriële.afdruk (microfoon); Serial.println(F("%%")); Serial.flush();}//-- Functie om batterijspanning procentvoid request te sturenBattery(){ Otto.home(); //stop indien nodig //De eerste lezing van de batterij is vaak een verkeerde lezing, dus we zullen deze waarde weggooien. dubbel batterijniveau =Otto.getBatteryLevel(); Serial.print(F("&&")); Serial.print(F("B")); Serial.print (batterijniveau); Serial.println(F("%%")); Serial.flush();}//-- Functie om programma IDvoid requestProgramId(){ Otto.home(); // stop indien nodig Serial.print (F ("&&")); Serial.print(F("I")); Serial.print(programma-ID); Serial.println(F("%%")); Serial.flush();}//-- Functie om Ack-commando (A)void sendAck(){ delay(30); Serial.print(F("&&")); Serial.print(F("A")); Serial.println(F("%%")); Serial.flush();}//-- Functie om het definitieve Ack-commando te verzenden (F) void sendFinalAck(){ delay (30); Serial.print(F("&&")); Serial.print(F("F")); Serial.println(F("%%")); Serial.flush();}//-- Functies met animatie//---------------------------------- ----------------------void OttoLowBatteryAlarm(){ double batteryLevel =Otto.getBatteryLevel(); if(batteryLevel<45){ while(!buttonPushed){ Otto.putMouth(thunder); Otto.bendTones (880, 2000, 1.04, 8, 3); //A5 =880 vertraging (30); Otto.bendTones (2000, 880, 1.02, 8, 3); //A5 =880 Otto.clearMouth(); vertraging (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); vertraging (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); vertraging (500); } if(!buttonPushed){ Otto.putMouth(lineMouth); Otto.sing(S_knuffel); } Otto.home(); if(!buttonPushed){Otto.putMouth(happyOpen);} }
Arduino-bron
Installeer eerst deze bibliothekenhttps://github.com/OttoDIY/DIY

Aangepaste onderdelen en behuizingen

Thingiverse .STL 3D-afdrukbare bestanden
3D-printonderdelen om te gebruiken in het bouwproces van het Otto.CAD-bestand op thingiverse.com

Schema's

Servo's, ultrasone sensor, zoemer en batterijaansluitingen, volg de kabels. gebruik de DuPont-kabels.

Productieproces

  1. Bouw een doe-het-zelf Thermocam
  2. De Lego EV3 hacken:bouw je eigen objectsensor "Ogen"
  3. Maak je eigen Google Voice HAT
  4. Bouw uw internetgestuurde videostreamingrobot met Arduino en Raspberry Pi
  5. Bouw een ballistisch parachuteherstelsysteem voor uw drone
  6. Hoe Reinforcement Learning ooit uw industriële robotwerking kan transformeren
  7. Hoe Sauron The Lord of the Robots te bouwen
  8. Je eigen robotarm bouwen:moet je het risico nemen?
  9. MeArm Robotarm - Uw robot - V1.0
  10. De beste manier om uw IoT-prototype te bouwen
  11. Top luchtcompressoren:redenen om er een te bezitten