Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

¡Otto DIY construye tu propio robot en una hora!

Componentes y suministros

Kit de construcción de bricolaje Otto
× 1
Otto DIY Arduino NANO Shield I / O
× 1
Arduino Nano Every
× 1
Cable USB-A a Mini-USB
× 1
Micro-servo motor SG90
× 4
Buzzer
× 1
Cables de puente hembra / hembra
× 6
Otto DIY 8x8mm Microinterruptor Autobloqueo encendido / apagado
× 1
portapilas 4xAA
Pila de 2 pilas 4AA
× 1
Pilas AA
× 1

Herramientas y máquinas necesarias

Impresora 3D (genérica)
Destornillador Phillips Cross

Aplicaciones y servicios en línea

Arduino IDE
Arduino Web Editor
Extensión de código de Microsoft Visual Studio para Arduino

Acerca de este proyecto

¿Quién es Otto?

¡Un robot interactivo que cualquiera puede hacer!

¿Qué puede hacer Otto?

Otto camina, baila, hace sonidos y evita obstáculos.

¿Por qué Otto es especial?

Otto es completamente de código abierto, compatible con Arduino, imprimible en 3D y con una misión de impacto social para crear un entorno inclusivo para los niños.

Otto se inspiró en otro robot instruible BoB the BiPed y se programó usando código de otro robot bípedo de código abierto llamado Zowi.

CC-BY-SA

Las diferencias de Otto están en el tamaño ensamblado (11 cm x 7 cm x 12 cm), una integración más limpia de componentes y expresiones. Usando piezas listas para usar e impresas en 3D, conexiones electrónicas simples (casi sin soldaduras) y habilidades básicas de codificación, ¡podrás construir tu propio amigo lindo de Otto en tan solo una hora! o incluso menos

Otto fue diseñado con Autodesk 123D Design, ahora el software ThinkerCAD puede modificarlo para personalizarlo o realizar mejoras adicionales.

Este paso a paso se centra en cómo construir la versión simple de Otto DIY; sí, hay robots bipdeal más avanzados como Otto DIY + o Tito

Paso 1:primero reúna todas las piezas y herramientas

Reúna todas las piezas de hardware listas para usar que necesitará para este ensamblaje.

La mini placa de pan es una alternativa para el blindaje, pero requiere más cableado y tiempo

Entonces solo necesita imprimir en 3D 6 partes en total:

11. Cabezal impreso en 3D.

12. Cuerpo impreso en 3D.

13. Pata impresa en 3D x2.

14. Pie impreso en 3D x2

Opcional:cortador para la limpieza posterior de las piezas 3D (si la calidad de impresión 3D es lo suficientemente buena, no es necesario) y un soldador (si lo desea, de lo contrario, puede conectarlo a través de USB para energizarlo)

¡Eso es todo simple !; descargar todos los archivos .stl , Si no tiene una impresora 3D, siempre puede acceder al espacio de su fabricante local.

Si no tiene la pieza o le resulta difícil conseguirla, puede comprar nuestros kits completos visita www.ottodiy.com

Configuración de impresión 3D

Otto está muy bien diseñado para la impresión 3D, los archivos que ha descargado están centrados y orientados a las propiedades, por lo que no le causará problemas si sigue estos parámetros comunes:

  • Se recomienda utilizar una impresora 3D FDM con material PLA.
  • No necesita soportes ni balsas.
  • Resolución:0,15 mm
  • Densidad de relleno 20%

Para cortar y generar el código g para el software de corte gratuito de la máquina como Cura o en nuestro caso FlashPrint que viene con la impresora 3D FlashForge Finder que estamos usando (si está subcontratando la impresión no tiene que preocuparse por eso)

Después de imprimir, deberá limpiar un poco las áreas de las piernas y los pies que fijan los motores.

Compruebe sus piezas

Como se menciona en el paso 2, los micro servomotores vienen con 3 tornillos en la imagen que ahora están incluidos y reorganizados el número de pieza para facilitar la lectura.

Recuerde haber magnetizado su mini destornillador.

Descargue o imprima los manuales de instrucciones o simplemente siga este video:

Montaje de servos de pie

Coloque el micro servo dentro de los pies y luego empújelo hacia adentro, si es demasiado duro, tal vez necesite limpiar más el área con un cortador.

Es muy importante comprobar que el servo puede girar al menos 90 grados a cada lado.

Después de comprobar el movimiento, utilice solo el tornillo pequeño para fijarlo.

Mismo proceso para el otro pie.

Fijar los servos al cuerpo

Tome los otros 2 micro servos, colóquelos en las ubicaciones definidas en el cuerpo impreso en 3D y fíjelos solo con los tornillos puntiagudos.

Fijar las piernas al cuerpo

Conecta las patas al eje del micro servo, importante como los servos de pie, debes comprobar que las patas pueden girar 90 grados a cada lado con respecto al cuerpo.

Después de verificar la alineación, fíjelas usando los tornillos pequeños en el orificio dentro de la pata.

Fijar pie a piernas

Cuidando los cables como se muestra en la ilustración debes colocar los cables dentro de las ranuras del cuerpo pasando por el orificio de las patas.

Una vez que estén en la posición correcta, use los tornillos puntiagudos para fijarlos desde la parte posterior.

Montaje del cabezal

Comenzar desde el sensor de ultrasonido es importante para sacar los ojos al límite.

Después de colocar el Arduino nano en el escudo, opcionalmente puede soldar el cable positivo del soporte de la batería a Vin en la placa y el negativo a cualquier GND.

Inserte diagonalmente ambas placas juntas de frente al conector USB en el orificio del cabezal impreso en 3D, luego use los últimos 2 tornillos puntiagudos para fijarlo.

Paso 9:Conexión eléctrica

Prepare los cables, el microinterruptor y el zumbador de DuPont.

Luego, siga los números de los pines del diagrama y asegúrese de colocarlos en la posición correcta.

Si no tiene o no encuentra el escudo Arduino Nano, use una placa de prueba y siga este diagrama de circuito TinkerCAD Circuits

Código con bloques

Siempre puede probar los códigos fuente de Arduino de Otto Wikifactory.

Aquí puede encontrar algunos tutoriales gratuitos para que los principiantes comiencen rápidamente con Arduino para cada componente:

- Tutorial de servomotor:https://arduinogetstarted.com/tutorials/arduino-servo-motor
- Tutorial de sensor ultrasónico:https://arduinogetstarted.com/tutorials/arduino-ultrasonic-sensor
- Toque Tutorial del sensor:https://arduinogetstarted.com/tutorials/arduino-touch-sensor
- Tutorial del zumbador:https://arduinogetstarted.com/tutorials/arduino-piezo-buzzer

Visite www.ottodiy.com

La versión Otto DIY + tiene más posibilidades usando Bluetooth, más sensores e interacciones.

publica tu remix y modificaciones en Wikifactory

Código

  • Evite los obstáculos
Evita obstáculos Arduino
Otto caminará interminablemente hasta ver un obstáculo en el rango, se sorprenderá, volverá a girar y luego seguirá caminando
 // ---------------------- ------------------------------------------ // - Firmware básico de Zowi v2 adaptado a Otto // - (c) BQ. Publicado bajo licencia GPL // - 04 de diciembre de 2015 // - Autores:Anita de Prado:[email protected]//-- Jose Alberca:[email protected]//-- Javier Isabel:[email protected]//-- Juan González (obijuan):[email protected]//-- Irene Sanz:[email protected]//---------- -------------------------------------------------- ----- // - ¡Experimenta con todas las funcionalidades que tiene Otto gracias a Zowi! // --------------------------- -------------------------------------- # include  #include  #include  #include  #include  #include  #include  #include  OttoSerialCommand SCmd; // El objeto SerialCommand // - Otto Library # include  Otto Otto; // ¡Este es Otto! // ------------------------------------------ --------------- // - Primer paso:Configurar los pines donde están conectados los servos / * --------------- | O O | | --------------- | AÑO 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] // --- Botones Otto # define PIN_SecondButton 6 # define PIN_ThirdButton 7 /////// //////////////////////////////////////////////////// ////////////-- Variables globales ---------------------------------- --------- /////////////////////////////////////////// //////////////////////////// const char programID [] ="Otto_todo"; // Cada programa tendrá un IDconst char name_fac ='$'; // Fábrica nameconst char name_fir ='#'; // Nombre // - Parámetros de movimientoint T =1000; // Duración inicial del movimientoint moveId =0; // Número de movimiento en moveSize =15; // Asociado con la altura de algunos movimientos // --------------------------------------- ------------------ // - Otto tiene 5 modos:// - * MODE =0:Otto está esperando // - * MODE =1:Modo de baile ! // - * MODE =2:Modo detector de obstáculos // - * MODE =3:Modo detector de ruido // - * MODE =4:OttoPAD o cualquier modo de Teleoperación (escucha SerialPort). // ------------------------------------------------ --------- volátil int MODE =0; // Estado de Otto en la máquina de estado principal. volátil bool buttonPushed =false; // Variable para recordar cuando se ha pulsado un botón volátil bool buttonAPushed =false; // Variable para recordar cuando se ha pulsado un botón volátil bool buttonBPushed =false; // Variable para recordar cuando se ha pulsado el botón B unsigned long previousMillis =0; int randomDance =0; int randomSteps =0; bool obstacleDetected =false; ///////////////////// //////////////////////////////////////////////////// -- Configuración ----------------------------------------------- ------- ///////////////////////////////////////////// ////////////////////////// void setup () {// Inicialización de la comunicación en serie Serial.begin (115200); pinMode (PIN_SecondButton, ENTRADA); pinMode (PIN_ThirdButton, ENTRADA); // Establecer los pines del servo Otto.init (PIN_YL, PIN_YR, PIN_RL, PIN_RR, true); // Descomente esto para configurar los ajustes de servo manualmente y guardar en EEPROM //Otto.setTrims(TRIM_YL, TRIM_YR, TRIM_RL, TRIM_RR); //Otto.saveTrimsOnEEPROM (); // Quita el comentario de esto solo para una carga cuando finalmente establezcas los ajustes. // Establecer una semilla aleatoria randomSeed (analogRead (A6)); // Interrumptions enableInterrupt (PIN_SecondButton, secondButtonPushed, RISING); enableInterrupt (PIN_ThirdButton, thirdButtonPushed, RISING); // Configurar devoluciones de llamada para comandos 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 despierta! Otto.sing (S_conexión); Otto.home (); retraso (50); // Animación Uuuuuh - Un pequeño momento de sorpresa inicial // ----- for (int i =0; i <2; i ++) {for (int i =0; i <8; i ++) {if (buttonPushed) {descanso;} Otto.putAnimationMouth (littleUuh, i); retraso (150); }} // ----- // Sonríe para un Otto feliz :) if (! ButtonPushed) {Otto.putMouth (smile); Otto.sing (S_happy); retraso (200); } // Si el nombre de Otto es '#' significa que Otto no ha sido bautizado // En este caso, Otto hace un saludo más largo // 5 =Dirección EEPROM que contiene el primer carácter if (EEPROM.read (5) ==name_fir) {if (! buttonPushed) {Otto.jump (1,700); retraso (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); } anteriorMillis =millis ();} //////////////////////////////////////////// /////////////////////////// - Circuito principal ------------------- -------------------------- ////////////////////////// ///////////////////////////////////////////// bucle vacío () { // - MODO 2 - Modo detector de obstáculos if (obstacleDetected) {Otto.sing (S_surprise); Otto.playGesture (OttoFretful); Otto.sing (S_fart3); Otto.walk (2,1300, -1); Otto.turn (2,1000, -1); retraso (50); obstacleDetector (); } else {Otto.walk (1,1000,1); obstacleDetector (); }} ////////////////////////////////////////////////// ///////////////////// - Funciones -------------------------- ------------------------ ////////////////////////////// /////////////////////////////////////////////// - Función ejecutada cuando se presiona el segundo botón vaciar secondButtonPushed () {buttonAPushed =true; if (! buttonPushed) {buttonPushed =true; Otto.putMouth (pequeña sorpresa); }} // - Función ejecutada cuando se presiona el tercer botónvoid thirdButtonPushed () {buttonBPushed =true; if (! buttonPushed) {buttonPushed =true; Otto.putMouth (pequeña sorpresa); }} // - Función para leer el sensor de distancia y actualizar el obstáculoDetected variablevoid obstacleDetector () {int distancia =Otto.getDistance (); if (distancia <15) {obstáculoDetectado =verdadero; } else {obstáculoDetected =falso; }} // - Función para recibir el comando Stop.void receiveStop () {sendAck (); Otto.home (); sendFinalAck ();} // - Función para recibir comandos LED void receiveLED () {// sendAck &stop si es necesario sendAck (); Otto.home (); // Ejemplos de comandos de ReceiveLED Bluetooth // 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) {matriz =strtoul (arg, &endstr, 2); // Convierte una cadena de caracteres en un entero largo sin signo Otto.putMouth (matriz, falso); } else {Otto.putMouth (xMouth); retraso (2000); Otto.clearMouth (); } sendFinalAck ();} // - Función para recibir los comandos del zumbadorvoid recieveBuzzer () {// sendAck &stop si es necesario sendAck (); Otto.home (); bool error =falso; int frec; int duración; char * arg; arg =SCmd.next (); if (arg! =NULL) {frec =atoi (arg); } // Convierte una cadena de caracteres en un entero else {error =true;} arg =SCmd.next (); if (arg! =NULL) {duración =atoi (arg); } // Convierte una cadena de caracteres en un entero else {error =true;} if (error ==true) {Otto.putMouth (xMouth); retraso (2000); Otto.clearMouth (); } else {Otto._tone (frecuencia, duración, 1); } sendFinalAck ();} // - Función para recibir comandos TRimsvoid receiveTrims () {// sendAck &stop si es necesario sendAck (); Otto.home (); int trim_YL, trim_YR, trim_RL, trim_RR; // Definición del comando Servo Bluetooth // C trim_YL trim_YR trim_RL trim_RR // Ejemplos de comandos de ReceiverTrims Bluetooth // C 20 0 -8 3 bool error =false; char * arg; arg =SCmd.next (); if (arg! =NULL) {trim_YL =atoi (arg); } // Convierte una cadena de caracteres en un entero else {error =true;} arg =SCmd.next (); if (arg! =NULL) {trim_YR =atoi (arg); } // Convierte una cadena de caracteres en un entero else {error =true;} arg =SCmd.next (); if (arg! =NULL) {trim_RL =atoi (arg); } // Convierte una cadena de caracteres en un entero else {error =true;} arg =SCmd.next (); if (arg! =NULL) {trim_RR =atoi (arg); } // Convierte una cadena de caracteres en un entero else {error =true;} if (error ==true) {Otto.putMouth (xMouth); retraso (2000); Otto.clearMouth (); } else {// Guárdelo en EEPROM Otto.setTrims (trim_YL, trim_YR, trim_RL, trim_RR); Otto.saveTrimsOnEEPROM (); // Quita el comentario de esto solo para una carga cuando finalmente establezcas los ajustes. } sendFinalAck ();} // - Función para recibir los comandos del Servovoid receiveServo () {sendAck (); moveId =30; // Definición del comando de Servo Bluetooth // G servo_YL servo_YR servo_RL servo_RR // Ejemplo de comandos de ReceiveServo Bluetooth // G 90 85 96 78 bool error =false; char * arg; int servo_YL, servo_YR, servo_RL, servo_RR; arg =SCmd.next (); if (arg! =NULL) {servo_YL =atoi (arg); } // Convierte una cadena de caracteres en un entero else {error =true;} arg =SCmd.next (); if (arg! =NULL) {servo_YR =atoi (arg); } // Convierte una cadena de caracteres en un entero else {error =true;} arg =SCmd.next (); if (arg! =NULL) {servo_RL =atoi (arg); } // Convierte una cadena de caracteres en un entero else {error =true;} arg =SCmd.next (); if (arg! =NULL) {servo_RR =atoi (arg); } // Convierte una cadena de caracteres en un entero else {error =true;} if (error ==true) {Otto.putMouth (xMouth); retraso (2000); Otto.clearMouth (); } else {// Actualizar Servo:int servoPos [4] ={servo_YL, servo_YR, servo_RL, servo_RR}; Otto._moveServos (200, servoPos); // Mover 200ms} sendFinalAck ();} // - Función para recibir comandos de movimientovoid receiveMovement () {sendAck (); if (Otto.getRestState () ==verdadero) {Otto.setRestState (falso); } // Definición de comandos de movimiento Bluetooth // M MoveID T MoveSize char * arg; arg =SCmd.next (); if (arg! =NULL) {moveId =atoi (arg);} else {Otto.putMouth (xMouth); retraso (2000); Otto.clearMouth (); moveId =0; // detener} arg =SCmd.next (); if (arg! =NULL) {T =atoi (arg);} else {T =1000; } arg =SCmd.next (); if (arg! =NULL) {moveSize =atoi (arg);} else {moveSize =15; }} // - Función para ejecutar el movimiento correcto según el comando de movimiento recibido. Void move (int moveId) {bool manualMode =false; switch (moveId) {caso 0:Otto.home (); descanso; caso 1:// M 1 1000 Otto.walk (1, T, 1); descanso; caso 2:// M 2 1000 Otto.walk (1, T, -1); descanso; caso 3:// M 3 1000 Otto.turn (1, T, 1); descanso; caso 4:// M 4 1000 Otto.turn (1, T, -1); descanso; caso 5:// M 5 1000 30 Otto.updown (1, T, moveSize); descanso; caso 6:// M 6 1000 30 Otto.moonwalker (1, T, moveSize, 1); descanso; caso 7:// M 7 1000 30 Otto.moonwalker (1, T, moveSize, -1); descanso; caso 8:// M 8 1000 30 Otto.swing (1, T, moveSize); descanso; caso 9:// M 9 1000 30 Otto.crusaito (1, T, moveSize, 1); descanso; caso 10:// M 10 1000 30 Otto.crusaito (1, T, moveSize, -1); descanso; caso 11:// M 11 1000 Otto.jump (1, T); descanso; caso 12:// M 12 1000 30 Otto.flapping (1, T, moveSize, 1); descanso; caso 13:// M 13 1000 30 Otto.flapping (1, T, moveSize, -1); descanso; caso 14:// M 14 1000 20 Otto.tiptoeSwing (1, T, moveSize); descanso; caso 15:// M 15 500 Otto.bend (1, T, 1); descanso; caso 16:// M 16 500 Otto.bend (1, T, -1); descanso; caso 17:// M 17 500 Otto.shakeLeg (1, T, 1); descanso; caso 18:// M 18 500 Otto.shakeLeg (1, T, -1); descanso; caso 19:// M 19 500 20 Otto.jitter (1, T, moveSize); descanso; caso 20:// M 20500 15 Otto.ascendingTurn (1, T, moveSize); descanso; predeterminado:manualMode =true; descanso; } if (! manualMode) {sendFinalAck (); }} // - Función para recibir comandos de gestosvoid receiveGesture () {// sendAck &stop si es necesario sendAck (); Otto.home (); // Definición de los comandos de Gesture Bluetooth // H GestureID int Gesto =0; char * arg; arg =SCmd.next (); if (arg! =NULL) {gesto =atoi (arg);} else {Otto.putMouth (xMouth); retraso (2000); Otto.clearMouth (); } cambiar (gesto) {caso 1:// H 1 Otto.playGesture (OttoHappy); descanso; caso 2:// H 2 Otto.playGesture (OttoSuperHappy); descanso; caso 3:// H 3 Otto.playGesture (OttoSad); descanso; caso 4:// H 4 Otto.playGesture (OttoSleeping); descanso; caso 5:// H 5 Otto.playGesture (OttoFart); descanso; caso 6:// H 6 Otto.playGesture (OttoConfused); descanso; caso 7:// H 7 Otto.playGesture (OttoLove); descanso; caso 8:// H 8 Otto.playGesture (OttoAngry); descanso; caso 9:// H 9 Otto.playGesture (OttoFretful); descanso; caso 10:// H 10 Otto.playGesture (OttoMagic); descanso; caso 11:// H 11 Otto.playGesture (OttoWave); descanso; caso 12:// H 12 Otto.playGesture (OttoVictory); descanso; caso 13:// H 13 Otto.playGesture (OttoFail); descanso; predeterminado:descanso; } sendFinalAck ();} // - Función para recibir comandos singvoid receiveSing () {// sendAck &stop si es necesario sendAck (); Otto.home (); // Definición de los comandos Sing Bluetooth // K SingID int sing =0; char * arg; arg =SCmd.next (); if (arg! =NULL) {sing =atoi (arg);} else {Otto.putMouth (xMouth); retraso (2000); Otto.clearMouth (); } cambiar (cantar) {caso 1:// K 1 Otto.sing (S_connection); descanso; caso 2:// K 2 Otto.sing (S_disconnection); descanso; caso 3:// K 3 Otto.sing (S_surprise); descanso; caso 4:// K 4 Otto.sing (S_OhOoh); descanso; caso 5:// K 5 Otto.sing (S_OhOoh2); descanso; caso 6:// K 6 Otto.sing (S_cuddly); descanso; caso 7:// K 7 Otto.sing (S_dormir); descanso; caso 8:// K 8 Otto.sing (S_happy); descanso; caso 9:// K 9 Otto.sing (S_superHappy); descanso; caso 10:// K 10 Otto.sing (S_happy_short); descanso; caso 11:// K 11 Otto.sing (S_sad); descanso; caso 12:// K 12 Otto.sing (S_confused); descanso; caso 13:// K 13 Otto.sing (S_fart1); descanso; caso 14:// K 14 Otto.sing (S_fart2); descanso; caso 15:// K 15 Otto.sing (S_fart3); descanso; caso 16:// K 16 Otto.sing (S_mode1); descanso; caso 17:// K 17 Otto.sing (S_mode2); descanso; caso 18:// K 18 Otto.sing (S_mode3); descanso; caso 19:// K 19 Otto.sing (S_buttonPushed); descanso; predeterminado:descanso; } sendFinalAck ();} // - Función para enviar la medida del sensor ultrasónico (distancia en "cm") void requestDistance () {Otto.home (); // detente si es necesario int distancia =Otto.getDistance (); Serial.print (F ("&&")); Serial.print (F ("D")); Serial.print (distancia); Serial.println (F ("%%")); Serial.flush ();} // - Función para enviar la medida del sensor de ruido requestNoise () {Otto.home (); // detente si es necesario int microfono =Otto.getNoise (); // analogRead (PIN_NoiseSensor); Serial.print (F ("&&")); Serial.print (F ("N")); Serial.print (micrófono); Serial.println (F ("%%")); Serial.flush ();} // - Función para enviar el voltaje de la batería porcentvoid requestBattery () {Otto.home (); // detente si es necesario // La primera lectura de la batería suele ser una lectura incorrecta, por lo que descartaremos este valor. doble nivel de batería =Otto.getBatteryLevel (); Serial.print (F ("&&")); Serial.print (F ("B")); Serial.print (batteryLevel); Serial.println (F ("%%")); Serial.flush ();} // - Función para enviar ID de programavoid requestProgramId () {Otto.home (); // detener si es necesario Serial.print (F ("&&")); Serial.print (F ("I")); Serial.print (programID); Serial.println (F ("%%")); Serial.flush ();} // - Función para enviar Ack comand (A) void sendAck () {delay (30); Serial.print (F ("&&")); Serial.print (F ("A")); Serial.println (F ("%%")); Serial.flush ();} // - Función para enviar el comando Ack final y (F) void sendFinalAck () {delay (30); Serial.print (F ("&&")); Serial.print (F ("F")); Serial.println (F ("%%")); Serial.flush ();} // - Funciones con animatics // ---------------------------------- ---------------------- void OttoLowBatteryAlarm () {doble nivel de batería =Otto.getBatteryLevel (); if (batteryLevel <45) {while (! buttonPushed) {Otto.putMouth (trueno); Otto.bendTones (880, 2000, 1.04, 8, 3); // A5 =880 retraso (30); Otto.bendTones (2000, 880, 1.02, 8, 3); // A5 =880 Otto.clearMouth (); retraso (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) {descanso;} Otto.putAnimationMouth (dreamMouth, 1); Otto.bendTones (200, 300, 1.04, 10, 10); if (buttonPushed) {descanso;} Otto.putAnimationMouth (dreamMouth, 2); Otto.bendTones (300, 500, 1.04, 10, 10); retraso (500); if (buttonPushed) {descanso;} Otto.putAnimationMouth (dreamMouth, 1); Otto.bendTones (400, 250, 1.04, 10, 1); if (buttonPushed) {descanso;} Otto.putAnimationMouth (dreamMouth, 0); Otto.bendTones (250, 100, 1.04, 10, 1); retraso (500); } if (! buttonPushed) {Otto.putMouth (lineMouth); Otto.sing (S_cuddly); } Otto.home (); if (! buttonPushed) {Otto.putMouth (happyOpen);}} 
Fuente Arduino
Instale primero estas bibliotecas https://github.com/OttoDIY/DIY

Piezas y carcasas personalizadas

Archivos imprimibles .STL 3D de Thingiverse
Piezas impresas en 3D para usar en el proceso de construcción del archivo Otto.CAD en thingiverse.com

Esquemas

Servos, sensor de ultrasonido, zumbador y conexiones de la batería, siga los cables. utilice los cables de DuPont.

Proceso de manufactura

  1. Cree una Thermocam de bricolaje
  2. Hackear el Lego EV3:construye tus propios "ojos" de sensor de objetos
  3. Crea tu propio SOMBRERO de Google Voice
  4. Cree su robot de transmisión de video controlado por Internet con Arduino y Raspberry Pi
  5. Construye un sistema de recuperación de paracaídas balístico para tu dron
  6. Cómo el aprendizaje por refuerzo podría algún día transformar la operación de su robot industrial
  7. Cómo construir a Sauron El señor de los robots
  8. Construyendo su propio brazo robótico:¿Debería tomar el riesgo?
  9. Brazo robótico MeArm - Su robot - V1.0
  10. La mejor manera de construir su prototipo de IoT
  11. Los mejores compresores de aire:razones para tener uno