Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Отто Сделай сам собери своего робота за один час!

Компоненты и расходные материалы

Комплект для самостоятельного строительства Otto
× 1
Otto DIY Arduino NANO Shield I / O
× 1
Arduino Nano Every
× 1
Кабель USB-A - Mini-USB
× 1
Микро-серводвигатель SG90
× 4
Зуммер
× 1
Провода перемычки "мама" / "мама"
× 6
Самоблокирующийся микропереключатель Otto DIY 8x8 мм, вкл. / выкл.
× 1
Держатель батареи 4xAA
Стек 2X 4AA Батарея
× 1
Батарейки AA
× 1

Необходимые инструменты и машины

3D-принтер (общий)
крестовая отвертка Phillips

Приложения и онлайн-сервисы

IDE Arduino
Веб-редактор Arduino
Расширение кода Microsoft Visual Studio для Arduino

Об этом проекте

Кто такой Отто?

Интерактивный робот, который может сделать каждый!

Что умеет Отто?

Отто ходит, танцует, издает звуки и избегает препятствий.

Почему Отто особенный?

Otto имеет полностью открытый исходный код, совместим с Arduino, поддерживает 3D-печать и имеет социальную миссию по созданию инклюзивной среды для детей.

Отто был вдохновлен другим управляемым роботом, Бобом BiPed, и он был запрограммирован с использованием кода другого двуногого робота с открытым исходным кодом по имени Zowi.

CC-BY-SA

Отличия Отто заключаются в собранном размере (11 см x 7 см x 12 см), более четкой интеграции компонентов и выражений. Используя готовые и напечатанные на 3D-принтере детали, простые соединения электроники (почти не требующие сварки) и базовые навыки программирования, вы сможете собрать своего собственного симпатичного друга Отто всего за час! или даже меньше

Отто проектировал с использованием Autodesk 123D Design, теперь программное обеспечение ThinkerCAD можно изменять для настройки или дальнейших улучшений!

Этот шаг за шагом посвящен созданию простой версии Otto DIY; да, есть и более продвинутые двуручные роботы, такие как Otto DIY + или Tito

Шаг 1. Сначала соберите все детали и инструменты

Соберите все готовые детали оборудования, которые вам понадобятся для этой сборки.

мини-макетная плата является альтернативой для экрана, но требуется больше проводов и времени

Тогда вам нужно всего лишь напечатать на 3D-принтере 6 деталей:

11. 3D печатная голова.

12. Корпус, напечатанный на 3D-принтере.

13. Напечатанная на 3D-принтере ножка x2.

14. 3D-печатная лапка x2

Дополнительно:резак для последующей очистки 3D-деталей (если качество 3D-печати достаточно хорошее, нет необходимости) и паяльник (если вам нужен аккумулятор, в противном случае можно подключить его через USB для подачи питания)

Все просто !; скачать все файлы .stl , Если у вас нет 3D-принтера, вы всегда можете обратиться к местному производителю.

Если у вас нет детали или ее сложно получить, вы можете просто купить наши полные комплекты посетить www.ottodiy.com

Настройки 3D-печати

Otto очень хорошо спроектирован для 3D-печати, файлы, которые вы загрузили, ориентированы на свойства и центрированы, поэтому у вас не возникнет проблем, если вы будете следовать этим общим параметрам:

  • Рекомендуется использовать 3D-принтер FDM с материалом PLA.
  • Никаких опор или плотов.
  • Разрешение:0,15 мм
  • Плотность заполнения 20%.

Для нарезки и генерации кода g для бесплатного программного обеспечения слайсера например, Cura или в нашем случае FlashPrint, который поставляется с используемым нами 3D-принтером FlashForge Finder (если вы отдаете печать на аутсорсинг, не беспокойтесь об этом)

После печати вам нужно будет немного очистить ноги и ступни, на которых крепятся моторы.

Проверьте свои детали

Как упоминалось в шаге 2, серводвигатели Micro поставляются с 3 винтами на картинке, теперь включены и переставлены номера деталей для удобства чтения.

Не забудьте намагнитить свою мини-отвертку.

Загрузите или распечатайте инструкции по эксплуатации или просто просмотрите это видео:

Сборка ножных сервоприводов

Поместите микро-сервопривод внутрь ножек, а затем вставьте его внутрь, если это слишком сложно, возможно, потребуется больше очистить поверхность резаком.

Очень важно убедиться, что сервопривод может поворачиваться как минимум на 90 градусов в каждую сторону.

После проверки движения используйте только маленький винт, чтобы зафиксировать его.

То же самое для другой ноги.

Исправить сервоприводы к телу

Возьмите два других микро сервопривода, поместите их в определенные места на корпусе, напечатанном на 3D-принтере, и закрепите их только острыми винтами.

Прикрепить ноги к телу

Подсоедините ножки к ступице сервопривода. Важно, как и сервоприводы для ног, вы должны проверить, могут ли ножки поворачиваться на 90 градусов с каждой стороны относительно тела.

После проверки совмещения закрепите их маленькими винтами в отверстии внутри ножки.

Прикрепите ступню к ногам

Уход за кабелями, как показано на рисунке, вы должны поместить кабели в прорези на корпусе, проходя через отверстия в ножках.

Когда они будут в правильном положении, закрепите их с задней стороны острыми винтами.

Головка в сборе

Начать с ультразвукового датчика важно, чтобы глаза вытянули до предела.

Вставив Arduino nano в экран, при желании можно приварить положительный кабель держателя батареи к Vin на плате, а отрицательный - к любому заземлению.

Вставьте по диагонали обе платы вместе, лицом к разъему USB, в отверстие в 3D-печатной головке, затем закрепите двумя последними винтами с острым концом.

Шаг 9. Электрическое подключение

Подготовьте кабели DuPont, микровыключатель и зуммер.

Затем следуйте номерам контактов на схеме и убедитесь, что они правильно расположены.

Если у вас нет или вы найдете щит Arduino Nano, используйте макетную плату и следуйте этой принципиальной схеме TinkerCAD Circuits

Код с блоками

Вы всегда можете попробовать исходные коды Arduino из Otto Wikifactory.

Здесь вы можете найти несколько бесплатных руководств для начинающих, чтобы быстро начать работу с 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, больше датчиков и взаимодействий.

разместите свой ремикс и модификации в Викифабрике

Код

  • Избегайте препятствий
Избегайте препятствий Arduino
Отто будет идти бесконечно, пока не увидит препятствие в пределах дистанции, удивится, вернется назад и продолжит идти
 // ---------------------- ------------------------------------------ // - Базовая прошивка Zowi v2 адаптировано к Отто // - (c) BQ. Выпущено под лицензией GPL // - 4 декабря 2015 г. // - Авторы:Анита де Прадо:[email protected]//-- Хосе Альберка:[email protected]//-- Хавьер Изабель:[email protected]//-- Хуан Гонсалес (обиджуан):[email protected]//-- Ирэн Санс:[email protected]//---------- -------------------------------------------------- ----- // - Поэкспериментируйте со всеми функциями, которые есть у Отто благодаря Zowi! // --------------------------- -------------------------------------- # include  #include  #include  #include  #include  #include  #include  #include  OttoSerialCommand SCmd; // Объект SerialCommand // - Библиотека Отто # include  Otto Otto; // Это Отто! // ------------------------------------------ --------------- // - Первый шаг:сконфигурируйте контакты, к которым прикреплены сервоприводы / * --------------- | O O | | --------------- | 3 года ==> | | <==YL 2 --------------- || || || || RR 5 ==> ----- ------ <==RL 4 | ----- ------ | * / #define PIN_YL 2 // servo [0] #define PIN_YR 3 // серво [1] #define PIN_RL 4 // servo [2] #define PIN_RR 5 // servo [3] // --- кнопки Отто # определить PIN_SecondButton 6 # определить 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; // Связано с высотой некоторых движений // --------------------------------------- ------------------ // - У Отто 5 режимов:// - * MODE =0:Отто ожидает // - * MODE =1:Режим танцев ! // - * MODE =2:режим детектора препятствий // - * MODE =3:режим детектора шума // - * MODE =4:OttoPAD или любой дистанционный режим (прослушивание SerialPort). // ------------------------------------------------ --------- volatile int MODE =0; // Состояние Отто в главной машине состояний. volatile bool buttonPasted =false; // Переменная, которую нужно запомнить, когда была нажата кнопкаvolatile bool buttonAP Push =false; // Переменная для запоминания, когда кнопка была нажата volatile bool buttonBPushing =false; // Переменная, которую нужно запомнить при нажатии кнопки Bunsigned long previousMillis =0; int randomDance =0; int randomSteps =0; bool preventleDetected =false; /////////////////// ////////////////////////////////////////////////// -- Настраивать ----------------------------------------------- ------- /////////////////////////////////////////// ////////////////////////// void setup () {// Инициализация последовательной связи Serial.begin (115200); pinMode (PIN_SecondButton, ВХОД); pinMode (PIN_ThirdButton, ВХОД); // Устанавливаем серво выводы 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, secondButtonPushing, RISING); enableInterrupt (PIN_ThirdButton, thirdButtonPushing, 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); // Отто просыпайся! Отто.синг (S_connection); Otto.home (); задержка (50); // Анимация Uuuuuh - Небольшой момент первоначального удивления // ----- for (int i =0; i <2; i ++) {for (int i =0; i <8; i ++) {if (buttonPasted) {break;} Otto.putAnimationMouth (littleUuh, я); задержка (150); }} // ----- // Улыбнись счастливому Отто :) if (! ButtonPasted) {Otto.putMouth (smile); Отто.синг (S_happy); задержка (200); } // Если имя Отто - '#' означает, что Отто не был крещен // В этом случае Отто произносит более длинное приветствие // 5 =адрес EEPROM, содержащий символ имени if (EEPROM.read (5) ==имя_фир) {если (! кнопка нажата) {Otto.jump (1,700); задержка (200); } если (! buttonPressed) {Otto.shakeLeg (1, T, 1); } если (! buttonPasted) {Otto.putMouth (smallSurprise); Otto.swing (2,800,20); Otto.home (); }} если (! buttonPushing) {Otto.putMouth (happyOpen); } previousMillis =millis ();} ////////////////////////////////////////// /////////////////////////// - Главный цикл ------------------- -------------------------- //////////////////////// ///////////////////////////////////////////// void loop () { // - РЕЖИМ 2 - Режим обнаружения препятствий if (damageDetected) {Otto.sing (S_surprise); Otto.playGesture (OttoFretful); Отто.синг (S_fart3); Отто. Прогулка (2,1300, -1); Otto.turn (2,1000, -1); задержка (50); ПрепятствиеДетектор (); } else {Otto.walk (1,1000,1); ПрепятствиеДетектор (); }} //////////////////////////////////////////////// ///////////////////// - Функции -------------------------- ------------------------ ////////////////////////// ///////////////////////////////////////////// - Функция выполняется, когда вторая кнопка нажатаvoid secondButtonPushing () {buttonAP Push =true; если (! buttonPushing) {buttonPushing =истина; Otto.putMouth (smallSurprise); }} // - Функция выполняется при нажатии третьей кнопкиvoid thirdButtonPushing () {buttonBPushing =true; если (! buttonPushing) {buttonPushing =истина; Otto.putMouth (smallSurprise); }} // - Функция для считывания датчика расстояния и для актуализации переменной «Обнаружено препятствие »voidruptleDetector () {int distance =Otto.getDistance (); если (расстояние <15) {препятствиеDetected =true; } еще {препятствиеDetected =ложь; }} // - Функция для приема команды Stop .void receiveStop () {sendAck (); Otto.home (); sendFinalAck ();} // - Функция для приема светодиодных командvoid receiveLED () {// sendAck и при необходимости остановить sendAck (); Otto.home (); // Примеры команд receiveLED Bluetooth // L 000000001000010100100011000000000 // L 0011111111111111111111111111111 (todos los LED encendidos) unsigned long int matrix; char * arg; char * endstr; arg =SCmd.next (); //Serial.println (arg); если (аргумент! =NULL) {матрица =strtoul (аргумент, &endstr, 2); // Преобразует строку char в длинное целое число без знака Otto.putMouth (matrix, false); } else {Otto.putMouth (xMouth); задержка (2000); Otto.clearMouth (); } sendFinalAck ();} // - Функция для приема команд зуммераvoid recieveBuzzer () {// sendAck и при необходимости остановить sendAck (); Otto.home (); логическая ошибка =ложь; int frec; int duration; char * arg; arg =SCmd.next (); если (аргумент! =ПУСТО) {frec =atoi (аргумент); } // Преобразует строку char в целое число else {error =true;} arg =SCmd.next (); если (аргумент! =NULL) {продолжительность =atoi (аргумент); } // Преобразует строку char в целое число else {error =true;} if (error ==true) {Otto.putMouth (xMouth); задержка (2000); Otto.clearMouth (); } else {Otto._tone (frec, duration, 1); } sendFinalAck ();} // - Функция для приема команд TRimsvoid receiveTrims () {// sendAck и при необходимости остановить sendAck (); Otto.home (); int trim_YL, trim_YR, trim_RL, trim_RR; // Определение команды Servo Bluetooth // C trim_YL trim_YR trim_RL trim_RR // Примеры команд Bluetooth для приемаTrims // C 20 0 -8 3 bool error =false; char * arg; arg =SCmd.next (); если (аргумент! =NULL) {trim_YL =atoi (аргумент); } // Преобразует строку char в целое число else {error =true;} arg =SCmd.next (); если (аргумент! =NULL) {trim_YR =atoi (аргумент); } // Преобразует строку char в целое число else {error =true;} arg =SCmd.next (); если (аргумент! =NULL) {trim_RL =atoi (аргумент); } // Преобразует строку char в целое число else {error =true;} arg =SCmd.next (); если (аргумент! =NULL) {trim_RR =atoi (аргумент); } // Преобразует строку char в целое число 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 (); moveId =30; // Определение команды Servo Bluetooth // G servo_YL servo_YR servo_RL servo_RR // Пример команд receiveServo Bluetooth // G 90 85 96 78 bool error =false; char * arg; int servo_YL, servo_YR, servo_RL, servo_RR; arg =SCmd.next (); если (аргумент! =ПУСТО) {servo_YL =atoi (аргумент); } // Преобразует строку char в целое число else {error =true;} arg =SCmd.next (); если (аргумент! =NULL) {servo_YR =atoi (аргумент); } // Преобразует строку char в целое число else {error =true;} arg =SCmd.next (); если (аргумент! =ПУСТО) {servo_RL =atoi (аргумент); } // Преобразует строку char в целое число else {error =true;} arg =SCmd.next (); если (аргумент! =ПУСТО) {servo_RR =atoi (аргумент); } // Преобразует строку char в целое число else {error =true;} if (error ==true) {Otto.putMouth (xMouth); задержка (2000); Otto.clearMouth (); } else {// Обновить серво:int servoPos [4] ={servo_YL, servo_YR, servo_RL, servo_RR}; Otto._moveServos (200, servoPos); // Перемещение на 200 мс} sendFinalAck ();} // - Функция для приема команд перемещенияvoid receiveMovement () {sendAck (); если (Otto.getRestState () ==true) {Otto.setRestState (ложь); } // Определение команд Bluetooth для перемещения // M MoveID T MoveSize char * arg; 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; } arg =SCmd.next (); if (arg! =NULL) {moveSize =atoi (arg);} else {moveSize =15; }} // - Функция для выполнения правильного движения в соответствии с полученной командой движения .void move (int moveId) {bool manualMode =false; переключатель (moveId) {case 0:Otto.home (); ломать; case 1:// M 1 1000 Otto.walk (1, T, 1); ломать; case 2:// M 2 1000 Otto.walk (1, T, -1); ломать; case 3:// M 3 1000 Otto.turn (1, T, 1); ломать; case 4:// M 4 1000 Otto.turn (1, T, -1); ломать; case 5:// M 5 1000 30 Otto.updown (1, T, moveSize); ломать; case 6:// M 6 1000 30 Otto.moonwalker (1, T, moveSize, 1); ломать; case 7:// M 7 1000 30 Otto.moonwalker (1, T, moveSize, -1); ломать; case 8:// M 8 1000 30 Otto.swing (1, T, moveSize); ломать; case 9:// M 9 1000 30 Otto.crusaito (1, T, moveSize, 1); ломать; case 10:// M 10 1000 30 Otto.crusaito (1, T, moveSize, -1); ломать; case 11:// M 11 1000 Otto.jump (1, T); ломать; case 12:// M 12 1000 30 Otto.flapping (1, T, moveSize, 1); ломать; case 13:// M 13 1000 30 Otto.flapping (1, T, moveSize, -1); ломать; case 14:// M 14 1000 20 Otto.tiptoeSwing (1, T, moveSize); ломать; case 15:// M 15 500 Otto.bend (1, T, 1); ломать; case 16:// M 16 500 Otto.bend (1, T, -1); ломать; case 17:// M 17 500 Otto.shakeLeg (1, T, 1); ломать; case 18:// M 18 500 Otto.shakeLeg (1, T, -1); ломать; case 19:// M 19 500 20 Otto.jitter (1, T, moveSize); ломать; case 20:// M 20 500 15 Otto.ascendingTurn (1, T, moveSize); ломать; по умолчанию:manualMode =true; ломать; } если (! manualMode) {sendFinalAck (); }} // - Функция для приема команд жестовvoid receiveGesture () {// sendAck и при необходимости остановить sendAck (); Otto.home (); // Определение жестов Bluetooth-команд // H GestureID int gesture =0; char * arg; arg =SCmd.next (); если (аргумент! =NULL) {жест =atoi (аргумент);} еще {Otto.putMouth (xMouth); задержка (2000); Otto.clearMouth (); } переключатель (жест) {case 1:// H 1 Otto.playGesture (OttoHappy); ломать; case 2:// H 2 Otto.playGesture (OttoSuperHappy); ломать; case 3:// H 3 Otto.playGesture (OttoSad); ломать; case 4:// H 4 Otto.playGesture (OttoSleeping); ломать; case 5:// H 5 Otto.playGesture (OttoFart); ломать; case 6:// H 6 Otto.playGesture (OttoConfused); ломать; case 7:// H 7 Otto.playGesture (OttoLove); ломать; case 8:// H 8 Otto.playGesture (OttoAngry); ломать; case 9:// H 9 Otto.playGesture (OttoFretful); ломать; case 10:// H 10 Otto.playGesture (OttoMagic); ломать; case 11:// H 11 Otto.playGesture (OttoWave); ломать; case 12:// H 12 Otto.playGesture (OttoVictory); ломать; case 13:// H 13 Otto.playGesture (OttoFail); ломать; по умолчанию:перерыв; } sendFinalAck ();} // - Функция для приема команд singvoid receiveSing () {// sendAck и при необходимости остановить sendAck (); Otto.home (); // Определение команд Sing Bluetooth // K SingID int sing =0; char * arg; arg =SCmd.next (); if (arg! =NULL) {sing =atoi (arg);} else {Otto.putMouth (xMouth); задержка (2000); Otto.clearMouth (); } переключатель (петь) {case 1:// K 1 Otto.sing (S_connection); ломать; case 2:// K 2 Otto.sing (S_disconnection); ломать; case 3:// K 3 Otto.sing (S_surprise); ломать; case 4:// K 4 Otto.sing (S_OhOoh); ломать; case 5:// K 5 Otto.sing (S_OhOoh2); ломать; case 6:// K 6 Otto.sing (S_cuddly); ломать; case 7:// K 7 Otto.sing (S_sleeping); ломать; case 8:// K 8 Otto.sing (S_happy); ломать; case 9:// K 9 Otto.sing (S_superHappy); ломать; case 10:// K 10 Otto.sing (S_happy_short); ломать; case 11:// K 11 Otto.sing (S_sad); ломать; case 12:// K 12 Otto.sing (S_confused); ломать; case 13:// K 13 Otto.sing (S_fart1); ломать; case 14:// K 14 Otto.sing (S_fart2); ломать; case 15:// K 15 Otto.sing (S_fart3); ломать; case 16:// K 16 Otto.sing (S_mode1); ломать; case 17:// K 17 Otto.sing (S_mode2); ломать; case 18:// K 18 Otto.sing (S_mode3); ломать; case 19:// K 19 Otto.sing (S_buttonPushing); ломать; по умолчанию:перерыв; } sendFinalAck ();} // - Функция отправки измерения ультразвукового датчика (расстояние в "см") void requestDistance () {Otto.home (); // при необходимости остановимся int distance =Otto.getDistance (); Serial.print (F ("&&")); Serial.print (F ("D")); Serial.print (расстояние); Serial.println (F ("%%")); Serial.flush ();} // - Функция отправки измерения датчика шумаvoid 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 (); // остановка при необходимости // Первое чтение батареи часто является неправильным, поэтому мы отбрасываем это значение. двойной batteryLevel =Otto.getBatteryLevel (); Serial.print (F ("&&")); Serial.print (F ("B")); Serial.print (batteryLevel); Serial.println (F ("%%")); Serial.flush ();} // - Функция отправки ID программыvoid requestProgramId () {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 ();} // - Функции с аниматикой // ---------------------------------- ---------------------- void OttoLowBatteryAlarm () {double batteryLevel =Otto.getBatteryLevel (); if (batteryLevel <45) {в то время как (! кнопка нажата) {Otto.putMouth (гром); Otto.bendTones (880, 2000, 1.04, 8, 3); // A5 =880 delay (30); Отто. BendTones (2000, 880, 1.02, 8, 3); // A5 =880 Otto.clearMouth (); задержка (500); }}} void OttoSleeping_withInterrupts () {int bedPos_0 [4] ={100, 80, 60, 120}; если (! кнопка нажата) {Otto._moveServos (700, bedPos_0); } for (int i =0; i <4; i ++) {if (buttonPressed) {перерыв;} Otto.putAnimationMouth (dreamMouth, 0); Otto.bendTones (100, 200, 1.04, 10, 10); если (кнопка нажата) {перерыв;} Otto.putAnimationMouth (dreamMouth, 1); Otto.bendTones (200, 300, 1.04, 10, 10); если (кнопка нажата) {перерыв;} Otto.putAnimationMouth (dreamMouth, 2); Otto.bendTones (300, 500, 1.04, 10, 10); задержка (500); если (кнопка нажата) {перерыв;} Otto.putAnimationMouth (dreamMouth, 1); Otto.bendTones (400, 250, 1.04, 10, 1); если (кнопка нажата) {перерыв;} Otto.putAnimationMouth (dreamMouth, 0); Otto.bendTones (250, 100, 1.04, 10, 1); задержка (500); } если (! buttonPasted) {Otto.putMouth (lineMouth); Отто синг (S_cuddly); } Otto.home (); если (! кнопка нажата) {Otto.putMouth (happyOpen);}} 
Исходный код Arduino
Сначала установите эти библиотеки https://github.com/OttoDIY/DIY

Изготовленные на заказ детали и корпуса

Файлы для 3D-печати Thingiverse .STL
Детали для 3D-печати для использования в процессе создания файла Otto.CAD на сайте thingiverse.com

Схема

Подключения сервоприводов, ультразвукового датчика, зуммера и аккумулятора следуйте кабелям. используйте кабели DuPont.

Производственный процесс

  1. Сделайте самодельную термокамеру
  2. Взлом Lego EV3:создайте свой собственный объектный датчик «глаза»
  3. Создайте свой собственный Google Voice HAT
  4. Создайте своего робота для видеостриминга, управляемого через Интернет, с помощью Arduino и Raspberry Pi
  5. Создайте систему восстановления баллистического парашюта для вашего дрона
  6. Как обучение с подкреплением может однажды изменить работу промышленного робота
  7. Как построить Саурона, повелителя роботов
  8. Создание собственной руки-робота:стоит ли рисковать?
  9. Лучший способ создать свой прототип IoT
  10. Лучшие воздушные компрессоры:причины приобрести один из них