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

Робот-паук Arduino (четвероногий)

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

Arduino Nano R3
× 1
Модуль Bluetooth с низким энергопотреблением (BLE) (общий)
× 1
Расширение OLED компании Onion Corporation
× 1
Общий катод, рассеянный RGB
× 1
Специальная плата JLCPCB
× 1

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

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

Поскольку все заметили стремительную эволюцию робототехники, мы решили поднять вас, ребята, на более высокий уровень робототехники и создания роботов. Некоторое время назад мы начали с создания некоторых базовых электронных проектов и базового робота, такого как PICTO92, робота-следящего за линией, чтобы вы немного познакомились с электроникой и научились изобретать свои собственные проекты.

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

Этот проект очень удобно делать специально после того, как мы получили заказную печатную плату, которую мы заказали у JLCPCB, чтобы улучшить внешний вид нашего робота, а также в этом руководстве достаточно документов и кодов, чтобы вы могли легко создать свой сканер.

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

Что вы узнаете:

  • Выбор правильных компонентов в зависимости от функциональности вашего проекта.
  • Создание схемы для соединения всех выбранных компонентов
  • Соберите все части проекта.
  • Масштабирование баланса робота
  • С помощью приложения для Android. подключиться через Bluetooth и начать манипулировать системой

Шаг 1. Что такое «робот-паук»?

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

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

Роботы с ножками лучше справляются с рельефом, чем их колесные собратья, и передвигаются разнообразными и анималистичными способами. Однако это делает роботов на ножках более сложными и менее доступными для многих производителей. а также стоимость изготовления и большие затраты, которые производитель должен потратить, чтобы создать полностью четвероногое тело, поскольку оно основано на серводвигателях или шаговых двигателях, и оба они более дороги, чем двигатели постоянного тока, которые можно было бы использовать в колесных роботах. P>

Преимущества

Вы найдете четвероногих в природе в изобилии, потому что четыре ноги обеспечивают пассивную устойчивость или способность стоять без активной регулировки положения. То же самое и с роботами. Четвероногий робот дешевле и проще, чем робот с большим количеством ног, но все же он может достичь устойчивости.

Шаг 2. Серводвигатели - главные исполнительные механизмы

Серводвигатель, как определено в Википедии, представляет собой поворотный или линейный привод, который позволяет точно контролировать угловое или линейное положение, скорость и ускорение. [1] Он состоит из подходящего двигателя, соединенного с датчиком для обратной связи по положению. Также требуется относительно сложный контроллер, часто специальный модуль, разработанный специально для использования с серводвигателями.

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

Вообще говоря, управляющий сигнал представляет собой последовательность прямоугольных импульсов. Общие частоты для управляющих сигналов - 44 Гц, 50 Гц и 400 Гц. Положительная ширина импульса определяет положение сервопривода. Положительная длительность импульса около 0,5 мс заставит рупор сервопривода отклониться влево настолько, насколько это возможно (обычно от 45 до 90 градусов в зависимости от рассматриваемого сервопривода). Положительная длительность импульса от 2,5 мс до 3,0 мс заставит сервопривод отклоняться вправо, насколько это возможно. Ширина импульса около 1,5 мс заставит сервопривод удерживать нейтральное положение при 0 градусах. Выходное высокое напряжение обычно составляет от 2,5 до 10 вольт (обычно 3 В). Выходное низкое напряжение колеблется от -40 мВ до 0 В.

Шаг 3:Изготовление печатной платы (Изготовлено JLCPCB)

О JLCPCB

JLCPCB (Shenzhen JIALICHUANG Electronic Technology Development Co., Ltd.) - крупнейшее предприятие по производству прототипов печатных плат в Китае и высокотехнологичный производитель, специализирующийся на производстве быстрых прототипов печатных плат и мелкосерийном производстве печатных плат.

Обладая более чем 10-летним опытом производства печатных плат, JLCPCB имеет более 200 000 клиентов в стране и за рубежом, с более чем 8 000 онлайн-заказов на изготовление прототипов печатных плат и производство небольших партий печатных плат в день. Годовая производственная мощность составляет 200 000 кв.м. для различных 1-слойных, 2-слойных или многослойных печатных плат. JLC - профессиональный производитель печатных плат, отличающийся крупномасштабным, скважинным оборудованием, строгим управлением и превосходным качеством.

Вернуться к нашему проекту

Чтобы произвести печатную плату, я сравнил цены у многих производителей печатных плат, и я выбрал JLCPCB, лучших поставщиков печатных плат и самых дешевых поставщиков печатных плат, чтобы заказать эту схему. Все, что мне нужно сделать, это несколько простых щелчков мышью, чтобы загрузить файл gerber и установить некоторые параметры, такие как цвет и количество толщины печатной платы, а затем я заплатил всего 2 доллара, чтобы получить свою печатную плату всего через пять дней.

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

Вы можете получить файл схемы (PDF) здесь. Как вы можете видеть на изображениях выше, печатная плата изготовлена ​​очень хорошо, и у меня есть та же форма паука на печатной плате, которую мы разработали, а также все этикетки и логотипы, чтобы направлять меня на этапах пайки.

Вы также можете скачать файл Gerber для этой схемы отсюда, если хотите разместить заказ на такую ​​же схему.

Шаг 4. Ингредиенты

Теперь давайте рассмотрим компоненты, необходимые нам для этого проекта. Как я уже сказал, я использую Arduino Nano для запуска всех 12 серводвигателей четырехногого робота. Проект также включает OLED-дисплей для отображения лиц Cozmo и модуль Bluetooth для управления роботом через приложение для Android.

Для создания подобных проектов нам потребуются:

  • - Плата, которую мы заказали у JLCPCB
  • - 12 серводвигателей, как вы помните, по 3 сервопривода на каждую ногу:https://amzn.to/2B25XbG
  • - Один Arduino Nano:https://amzn.to/2MmZsVg
  • - Bluetooth-модуль HC-06:https://amzn.to/2B1Z3CY
  • - Один экран OLED-дисплея:https://amzn.to/2OySnyn
  • - светодиоды RGB 5 мм:https://amzn.to/2B56hq3
  • - Некоторые заголовочные соединения:https://amzn.to/2nyZg7i
  • - И тело робота успокаивается, что вам нужно распечатать их на 3D-принтере.

Шаг 5. Сборка робота

Теперь у нас есть готовая печатная плата и все компоненты спаяны очень хорошо, после этого нам нужно собрать корпус робота, процедура настолько проста, поэтому просто следуйте инструкциям, которые я показываю, нам нужно сначала подготовить каждую ножку стороной и сделать с одним светодиодом нам понадобятся два серводвигателя для суставов и детали, напечатанные на Coxa, Femur и Tibia, с этой небольшой прикрепляемой частью.

Что касается частей тела робота, вы можете скачать его файлы в формате STL отсюда.

Начиная с первого сервопривода, поместите его в гнездо и удерживайте его винтами, после этого поверните ось сервопривода на 180 °, не вставляя винт для крепления, и перейдите к следующей части, которая является бедренной костью, чтобы соединить ее с большеберцовой костью. используя первый топор серво шарнира и прикрепляемую деталь. Последним шагом для завершения ноги является размещение второго сустава, я имею в виду второго сервопривода, чтобы удерживать третью часть ноги, которая является частью Coxa.

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

Шаг 6. Приложение для Android

Говоря об Android, он позволяет

подключайтесь к своему роботу через Bluetooth и совершайте движения вперед и назад, а также повороты влево и вправо, это также позволяет вам управлять цветом света робота в режиме реального времени, выбирая желаемый цвет на этом цветовом круге.

Вы можете бесплатно скачать приложение для Android по этой ссылке:здесь

Шаг 7. Код Arduino и проверка тестирования

Теперь у нас есть робот, почти готовый к работе, но нам нужно сначала настроить углы суставов, поэтому загрузите код настройки, который позволяет вам установить каждый сервопривод в правильное положение, прикрепив сервоприводы под углом 90 градусов, не забудьте подключить 7V Аккумулятор постоянного тока для работы робота.

Далее нам нужно загрузить основную программу для управления роботом с помощью приложения для Android. Обе программы вы можете скачать по этим ссылкам:

- Сервокод масштабирования:ссылка для скачивания - Основная программа робота-паука:ссылка для скачивания

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

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

Код

  • Основной код робота-паука
Основной код робота-паука Arduino
 / ********************************************* ************************************************* ************************************************* ********************** * - Автор:БЕЛХИР Мохамед * * - Профессия:(Инженер-электрик) Владелец MEGA DAS * * - Основное назначение:Промышленное применение * * - Правообладатель (c):Все права защищены * * - Лицензия:Лицензия BSD с двумя пунктами * * - Дата:20.04.2017 * * ****************** ************************************************* ************************************************* ************************************************ / /*********************************** ПРИМЕЧАНИЕ ************* ************************ /// Распространение и использование в исходной и двоичной формах, с // модификациями или без них, разрешены при условии, что следующие выполнены условия:// * При повторном распространении исходного кода должно сохраняться указанное выше уведомление об авторских правах, // этот список условий и следующий отказ от ответственности. // * При повторном распространении в двоичной форме необходимо воспроизводить Приведенное выше уведомление об авторских правах, // этот список условий и следующий отказ от ответственности в документации // и / или других материалах, поставляемых с распространением. ЛЮБЫЕ ЯВНЫЕ ИЛИ ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НЕ ОГРАНИЧИВАясь, // ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ / * * / # include  // для определения и управления сервоприводами # include  // установить таймер для управления всеми сервоприводами # include  #include  #include  // OLED-дисплей TWI-адрес # define OLED_ADDR 0x3CAdafruit_SSD1306 display (-1); / * Сервоприводы ----------------------------------------------- --------------------- * /// определяем 12 сервоприводов для 4 ног Servo servo [4] [3]; // определяем порты сервоприводовconst int servo_pin [4] [3] ={{11, 12, 13}, {2, 4, 7}, {14, 15, 16}, {8, 9, 10}}; / * Размер робота ------ -------------------------------------------------- - * / const float l ength_a =50; const float length_b =77.1; const float length_c =27,5; const float length_side =71; const float z_absolute =-28; / * Константы для движения ---------------- ------------------------------------ * / const float z_default =-50, z_up =-30, z_boot =z_absolute; const float x_default =62, x_offset =0; const float y_start =0, y_step =40; const float y_default =x_default; / * переменные для движения --------------- ------------------------------------- * / volatile float site_now [4] [3]; // текущие координаты конца каждого legvolatile float site_expect [4] [3]; // ожидаемые координаты конца каждого плавучего хода temp_speed [4] [3]; // скорость каждой оси необходимо пересчитывать перед каждым движением. float move_speed; // скорость движения на плаву speed_multiple =1; // скорость движения multiconst float spot_turn_speed =4; const float leg_move_speed =8; const float body_move_speed =3; const float stand_seat_speed =1; volatile int rest_counter; //+1/0.02с, для автоматического // функции остановки параметрconst float KEEP =255; // определяем PI для вычисленияconst float pi =3.1415926; / * Константы для поворота ------------- ------------------------------------------- * /// temp lengthconst float temp_a =sqrt (pow (2 * x_default + length_side, 2) + pow (y_step, 2)); const float temp_b =2 * (y_start + y_step) + length_side; const float temp_c =sqrt (pow (2 * x_default + length_side , 2) + pow (2 * y_start + y_step + length_side, 2)); const float temp_alpha =acos ((pow (temp_a, 2) + pow (temp_b, 2) - pow (temp_c, 2)) / 2 / temp_a / temp_b); // сайт для Turnconst float turn_x1 =(temp_a - length_side) / 2; const float turn_y1 =y_start + y_step / 2; const float turn_x0 =turn_x1 - temp_b * cos (temp_alpha); const float turn_y0 =temp_b * sin (temp_alpha) - turn_y1 - length_side; const int lightR =3; const int lightG =5; const int lightB =6; int LedR =0; int LedG =0; int LedB =0; char SerialData; // Используйте эту переменную для чтения каждого признака, полученного через последовательный портString data =""; void setup () {Serial.begin (9600); display.begin (SSD1306_SWITCHCAPVCC, OLED_ADDR); display.clearDisplay (); display.display (); задержка (10000); set_site (0, x_default - x_offset, y_start + y_step, z_boot); set_site (1, x_default - x_offset, y_start + y_step, z_boot); set_site (2, x_default + x_offset, y_start, z_boot); set_site (3, x_default + x_offset, y_start, z_boot); для (int я =0; я <4; я ++) {для (int j =0; j <3; j ++) {site_now [я] [j] =site_expect [я] [j]; }} // запускаем сервосервис FlexiTimer2 ::set (20, servo_service); FlexiTimer2 ::start (); // инициализируем сервоприводы servo_attach (); stand (); // delay (3000); // sit (); // delay (3000); // stand (); // delay (3000); счастливый(); задержка (случайная (500, 1000)); cierra (); задержка (150); энфадо (); задержка (случайная (1000, 3000)); cierra (); задержка (150); entorna (); задержка (случайная (1000, 3000)); cierra (); задержка (150); enfado1 (); задержка (случайная (1000, 3000)); cierra (); задержка (150); triste (); задержка (случайная (1000, 3000)); cierra (); задержка (150); abre (); задержка (случайная (500, 3000)); cierra (); задержка (150); счастливый(); delay (random (500, 1000));} void loop () {while (Serial.available ()) // Пока доступны последовательные данные, мы их сохраняем {delay (10); SerialData =Serial.read (); если (SerialData =='b') LedR =Serial.parseInt (); иначе, если (SerialData =='g') LedG =Serial.parseInt (); иначе, если (SerialData =='r') LedB =Serial.parseInt (); иначе данные + =SerialData; } if (data =="f") // Если сохраненные данные - это движение вперед {cierra (); задержка (150); счастливый(); step_forward (1); } if (data =="p") // Если сохраненные данные - это движение назад {cierra (); задержка (150); triste (); step_back (1); } if (data =="l") // Если сохраненные данные должны повернуть налево автомобиль {cierra (); задержка (150); enfado1 (); Turn_left (1); } if (data =="m") // Если сохраненные данные должны повернуть направо автомобиль {cierra (); задержка (150); энфадо (); Turn_right (5); } data =""; analogWrite (lightR, LedR); analogWrite (lightG, LedG); analogWrite (lightB, LedB);} void servo_attach (void) {for (int i =0; i <4; i ++) {for (int j =0; j <3; j ++) {servo [i] [j]. прикрепить (servo_pin [i] [j]); задержка (100); }}} void servo_detach (void) {для (int i =0; i <4; i ++) {для (int j =0; j <3; j ++) {servo [i] [j] .detach (); задержка (100); }}} недействительно сидеть (недействительно) {move_speed =stand_seat_speed; для (int leg =0; leg <4; leg ++) {set_site (leg, KEEP, KEEP, z_boot); } wait_all_reach ();} / * - стенд - функция блокировки ------------------------------------- -------------------------------------- * / void stand (void) {move_speed =stand_seat_speed; для (int leg =0; leg <4; leg ++) {set_site (leg, KEEP, KEEP, z_default); } wait_all_reach ();} / * - поворот точки налево - функция блокировки - шаги шага параметра хотели повернуть --------------------------- ------------------------------------------------ * / void turn_left (unsigned int step) {move_speed =spot_turn_speed; while (step--> 0) {if (site_now [3] [1] ==y_start) {// перемещение 3 и 1 отрезка set_site (3, x_default + x_offset, y_start, z_up); wait_all_reach (); set_site (0, turn_x1 - x_offset, turn_y1, z_default); set_site (1, turn_x0 - x_offset, turn_y0, z_default); set_site (2, turn_x1 + x_offset, turn_y1, z_default); set_site (3, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach (); set_site (3, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach (); set_site (0, turn_x1 + x_offset, turn_y1, z_default); set_site (1, turn_x0 + x_offset, turn_y0, z_default); set_site (2, turn_x1 - x_offset, turn_y1, z_default); set_site (3, turn_x0 - x_offset, turn_y0, z_default); wait_all_reach (); set_site (1, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach (); set_site (0, x_default + x_offset, y_start, z_default); set_site (1, x_default + x_offset, y_start, z_up); set_site (2, x_default - x_offset, y_start + y_step, z_default); set_site (3, x_default - x_offset, y_start + y_step, z_default); wait_all_reach (); set_site (1, x_default + x_offset, y_start, z_default); wait_all_reach (); } else {// ноги 0 и 2 перемещаем set_site (0, x_default + x_offset, y_start, z_up); wait_all_reach (); set_site (0, turn_x0 + x_offset, turn_y0, z_up); set_site (1, turn_x1 + x_offset, turn_y1, z_default); set_site (2, turn_x0 - x_offset, turn_y0, z_default); set_site (3, turn_x1 - x_offset, turn_y1, z_default); wait_all_reach (); set_site (0, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach (); set_site (0, turn_x0 - x_offset, turn_y0, z_default); set_site (1, turn_x1 - x_offset, turn_y1, z_default); set_site (2, turn_x0 + x_offset, turn_y0, z_default); set_site (3, turn_x1 + x_offset, turn_y1, z_default); wait_all_reach (); set_site (2, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach (); set_site (0, x_default - x_offset, y_start + y_step, z_default); set_site (1, x_default - x_offset, y_start + y_step, z_default); set_site (2, x_default + x_offset, y_start, z_up); set_site (3, x_default + x_offset, y_start, z_default); wait_all_reach (); set_site (2, x_default + x_offset, y_start, z_default); wait_all_reach (); }}} / * - точечный поворот направо - функция блокировки - параметр шага шагов хотел повернуть ------------------------------ --------------------------------------------- * / void turn_right ( unsigned int step) {move_speed =spot_turn_speed; while (step-> 0) {if (site_now [2] [1] ==y_start) {// нога 2 &0 перемещаем set_site (2, x_default + x_offset, y_start, z_up); wait_all_reach (); set_site (0, turn_x0 - x_offset, turn_y0, z_default); set_site (1, turn_x1 - x_offset, turn_y1, z_default); set_site (2, turn_x0 + x_offset, turn_y0, z_up); set_site (3, turn_x1 + x_offset, turn_y1, z_default); wait_all_reach (); set_site (2, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach (); set_site (0, turn_x0 + x_offset, turn_y0, z_default); set_site (1, turn_x1 + x_offset, turn_y1, z_default); set_site (2, turn_x0 - x_offset, turn_y0, z_default); set_site (3, turn_x1 - x_offset, turn_y1, z_default); wait_all_reach (); set_site (0, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach (); set_site (0, x_default + x_offset, y_start, z_up); set_site (1, x_default + x_offset, y_start, z_default); set_site (2, x_default - x_offset, y_start + y_step, z_default); set_site (3, x_default - x_offset, y_start + y_step, z_default); wait_all_reach (); set_site (0, x_default + x_offset, y_start, z_default); wait_all_reach (); } else {// ноги 1 и 3 перемещаем set_site (1, x_default + x_offset, y_start, z_up); wait_all_reach (); set_site (0, turn_x1 + x_offset, turn_y1, z_default); set_site (1, turn_x0 + x_offset, turn_y0, z_up); set_site (2, turn_x1 - x_offset, turn_y1, z_default); set_site (3, turn_x0 - x_offset, turn_y0, z_default); wait_all_reach (); set_site (1, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach (); set_site (0, turn_x1 - x_offset, turn_y1, z_default); set_site (1, turn_x0 - x_offset, turn_y0, z_default); set_site (2, turn_x1 + x_offset, turn_y1, z_default); set_site (3, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach (); set_site (3, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach (); set_site (0, x_default - x_offset, y_start + y_step, z_default); set_site (1, x_default - x_offset, y_start + y_step, z_default); set_site (2, x_default + x_offset, y_start, z_default); set_site (3, x_default + x_offset, y_start, z_up); wait_all_reach (); set_site (3, x_default + x_offset, y_start, z_default); wait_all_reach (); }}} / * - вперед - функция блокировки - требуется выполнить шаги шага параметра -------------------------------- ------------------------------------------- * / void step_forward (unsigned int шаг) {move_speed =leg_move_speed; while (step--> 0) {if (site_now [2] [1] ==y_start) {// перемещение 2 и 1 отрезка set_site (2, x_default + x_offset, y_start, z_up); wait_all_reach (); set_site (2, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach (); set_site (2, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach (); move_speed =body_move_speed; set_site (0, x_default + x_offset, y_start, z_default); set_site (1, x_default + x_offset, y_start + 2 * y_step, z_default); set_site (2, x_default - x_offset, y_start + y_step, z_default); set_site (3, x_default - x_offset, y_start + y_step, z_default); wait_all_reach (); move_speed =leg_move_speed; set_site (1, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach (); set_site (1, x_default + x_offset, y_start, z_up); wait_all_reach (); set_site (1, x_default + x_offset, y_start, z_default); wait_all_reach (); } else {// ноги 0 и 3 перемещаем set_site (0, x_default + x_offset, y_start, z_up); wait_all_reach (); set_site (0, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach (); set_site (0, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach (); move_speed =body_move_speed; set_site (0, x_default - x_offset, y_start + y_step, z_default); set_site (1, x_default - x_offset, y_start + y_step, z_default); set_site (2, x_default + x_offset, y_start, z_default); set_site (3, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach (); move_speed =leg_move_speed; set_site (3, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach (); set_site (3, x_default + x_offset, y_start, z_up); wait_all_reach (); set_site (3, x_default + x_offset, y_start, z_default); wait_all_reach (); }}} / * - вернуться - функция блокировки - требуется выполнить шаги шага параметра -------------------------------- ------------------------------------------- * / void step_back (unsigned int шаг) {move_speed =leg_move_speed; while (step--> 0) {if (site_now [3] [1] ==y_start) {// перемещение 3 и 0 отрезка set_site (3, x_default + x_offset, y_start, z_up); wait_all_reach (); set_site (3, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach (); set_site (3, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach (); move_speed =body_move_speed; set_site (0, x_default + x_offset, y_start + 2 * y_step, z_default); set_site (1, x_default + x_offset, y_start, z_default); set_site (2, x_default - x_offset, y_start + y_step, z_default); set_site (3, x_default - x_offset, y_start + y_step, z_default); wait_all_reach (); move_speed =leg_move_speed; set_site (0, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach (); set_site (0, x_default + x_offset, y_start, z_up); wait_all_reach (); set_site (0, x_default + x_offset, y_start, z_default); wait_all_reach (); } else {// ноги 1 и 2 перемещаем set_site (1, x_default + x_offset, y_start, z_up); wait_all_reach (); set_site (1, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach (); set_site (1, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach (); move_speed =body_move_speed; set_site (0, x_default - x_offset, y_start + y_step, z_default); set_site (1, x_default - x_offset, y_start + y_step, z_default); set_site (2, x_default + x_offset, y_start + 2 * y_step, z_default); set_site (3, x_default + x_offset, y_start, z_default); wait_all_reach (); move_speed =leg_move_speed; set_site (2, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach (); set_site (2, x_default + x_offset, y_start, z_up); wait_all_reach (); set_site (2, x_default + x_offset, y_start, z_default); wait_all_reach (); }}} // добавляем RegisHsuvoid body_left (int i) {set_site (0, site_now [0] [0] + i, KEEP, KEEP); set_site (1, site_now [1] [0] + я, СОХРАНИТЬ, СОХРАНИТЬ); set_site (2, site_now [2] [0] - я, СОХРАНИТЬ, СОХРАНИТЬ); set_site (3, site_now [3] [0] - я, СОХРАНИТЬ, СОХРАНИТЬ); wait_all_reach ();} void body_right (int i) {set_site (0, site_now [0] [0] - я, KEEP, KEEP); set_site (1, site_now [1] [0] - я, СОХРАНИТЬ, СОХРАНИТЬ); set_site (2, site_now [2] [0] + я, СОХРАНИТЬ, СОХРАНИТЬ); set_site (3, site_now [3] [0] + я, СОХРАНИТЬ, СОХРАНИТЬ); wait_all_reach ();} void hand_wave (int i) {float x_tmp; float y_tmp; float z_tmp; move_speed =1; если (site_now [3] [1] ==y_start) {body_right (15); x_tmp =site_now [2] [0]; y_tmp =site_now [2] [1]; z_tmp =site_now [2] [2]; move_speed =body_move_speed; для (int j =0; j  i / 4) // move_speed =body_dance_speed * 2; // if (j> i / 2) // move_speed =body_dance_speed * 3; / / set_site (0, KEEP, y_default - 20, KEEP); // set_site (1, KEEP, y_default + 20, KEEP); // set_site (2, KEEP, y_default - 20, KEEP); // set_site (3, KEEP, y_default + 20, KEEP); // wait_all_reach (); // set_site (0, KEEP, y_default + 2 0, KEEP); // set_site (1, KEEP, y_default - 20, KEEP); // set_site (2, KEEP, y_default + 20, KEEP); // set_site (3, KEEP, y_default - 20, KEEP); // wait_all_reach (); //} // move_speed =body_dance_speed; // head_down (30); //} / * - функция прерывания службы микросервисов / таймера / 50 Гц - при установке ожидаемого сайта эта функция перемещает на него конечную точку по прямой - temp_speed [4] [3] должен быть установлен перед установкой ожидаемого места, это гарантирует, что конечная точка движется по прямой линии, и определяет скорость движения. -------------------------------------------------- ------------------------- * / void servo_service (void) {sei (); статический плавающий альфа, бета, гамма; for (int i =0; i <4; i ++) {for (int j =0; j <3; j ++) {if (abs (site_now [i] [j] - site_expect [i] [j])> =abs (temp_speed [i] [j])) site_now [i] [j] + =temp_speed [i] [j]; иначе site_now [я] [j] =site_expect [я] [j]; } cartesian_to_polar (альфа, бета, гамма, site_now [i] [0], site_now [i] [1], site_now [i] [2]); polar_to_servo (я, альфа, бета, гамма); } rest_counter ++;} / * - установить одну из конечных точек ожидаемого сайта - эта функция одновременно установит temp_speed [4] [3] - неблокирующая функция --------------- -------------------------------------------------- ---------- * / void set_site (int leg, float x, float y, float z) {float length_x =0, length_y =0, length_z =0; if (x! =KEEP) length_x =x - site_now [leg] [0]; if (y! =KEEP) length_y =y - site_now [leg] [1]; if (z! =KEEP) length_z =z - site_now [leg] [2]; длина с плавающей запятой =sqrt (pow (length_x, 2) + pow (length_y, 2) + pow (length_z, 2)); temp_speed [leg] [0] =length_x / length * move_speed * speed_multiple; temp_speed [leg] [1] =length_y / length * move_speed * speed_multiple; temp_speed [leg] [2] =length_z / length * move_speed * speed_multiple; если (x! =KEEP) site_expect [нога] [0] =x; если (y! =KEEP) site_expect [leg] [1] =y; if (z! =KEEP) site_expect [leg] [2] =z;} / * - ждать, когда одна из конечных точек переместится, чтобы ожидать сайт - функция блокировки ----------------- -------------------------------------------------- -------- * / void wait_reach (int leg) {while (1) if (site_now [leg] [0] ==site_expect [leg] [0]) if (site_now [leg] [1] ==site_expect [leg] [1]) if (site_now [leg] [2] ==site_expect [leg] [2]) break;} / * - ждать, когда все конечные точки переместятся, чтобы ожидать сайт - функция блокировки ---- -------------------------------------------------- --------------------- * / void wait_all_reach (void) {for (int i =0; i <4; i ++) wait_reach (i);} / * - переход от декартовой системы координат к полярной - математическая модель 2/2 ------------------------------------- -------------------------------------- * / void cartesian_to_polar (изменчивое число с плавающей запятой и альфа, изменчивое число с плавающей точкой и бета , volatile float &gamma, volatile float x, volatile float y, volatile float z) {// вычислить wz степень float v, w; w =(x> =0? 1:-1) * (sqrt (pow (x, 2) + pow (y, 2))); v =w - длина_c; alpha =atan2(z, v) + acos((pow(length_a, 2) - pow(length_b, 2) + pow(v, 2) + pow(z, 2)) / 2 / length_a / sqrt(pow(v, 2) + pow(z, 2))); beta =acos((pow(length_a, 2) + pow(length_b, 2) - pow(v, 2) - pow(z, 2)) / 2 / length_a / length_b); //calculate x-y-z degree gamma =(w>=0) ? atan2(y, x) :atan2(-y, -x); //trans degree pi->180 alpha =alpha / pi * 180; beta =beta / pi * 180; gamma =gamma / pi * 180;}/* - trans site from polar to microservos - mathematical model map to fact - the errors saved in eeprom will be add ---------------------------------------------------------------------------*/void polar_to_servo(int leg, float alpha, float beta, float gamma){ if (leg ==0) { alpha =90 - alpha; beta =beta; gamma +=90; } else if (leg ==1) { alpha +=90; beta =180 - beta; gamma =90 - gamma; } else if (leg ==2) { alpha +=90; beta =180 - beta; gamma =90 - gamma; } else if (leg ==3) { alpha =90 - alpha; beta =beta; gamma +=90; } servo[leg][0].write(alpha); servo[leg][1].write(beta); servo[leg][2].write(gamma);}void abre() { display.clearDisplay(); display.fillCircle (50, 15, 12, WHITE); //ojo izquierdo grande display.fillCircle (82, 20, 7, WHITE); //ojo derecho pequeo display.display();}void cierra() { display.clearDisplay(); display.drawFastHLine(40, 15, 20, WHITE); display.drawFastHLine(72, 20, 15, WHITE); display.display();}void entorna() { display.clearDisplay(); display.fillCircle (42, 10, 20, WHITE); //ojo izquierdo grande display.fillCircle (82, 10, 15, WHITE); //ojo derecho pequeo display.fillRect (0, 0, 128, 15, BLACK); //ceja superior display.fillRect (0, 40, 128, 15, BLACK); //ceja inferior display.display();}void triste() { display.clearDisplay(); display.fillCircle (42, 10, 17, WHITE); //ojo izquierdo grande display.fillCircle (82, 10, 17, WHITE); //ojo derecho pequeo display.fillTriangle (0, 0, 0, 35, 78, 0, BLACK); //ceja superior display.fillTriangle (50, 0, 128, 35, 128, 0, BLACK); //ceja superior display.display();}void happy() { display.clearDisplay(); display.fillCircle (42, 25, 15, WHITE); //ojo izquierdo grande display.fillCircle (82, 25, 15, WHITE); //ojo derecho pequeo display.fillCircle (42, 33, 20, BLACK); //ojo izquierdo grande display.fillCircle (82, 33, 20, BLACK); //ojo derecho pequeo display.display();}void enfado() { display.clearDisplay(); display.fillCircle (42, 10, 18, WHITE); //ojo izquierdo grande display.fillCircle (82, 10, 12, WHITE); //ojo derecho pequeo display.fillTriangle (0, 0, 54, 26, 118, 0, BLACK); //ceja superior display.display();}void enfado1() { display.clearDisplay(); display.fillCircle (42, 10, 18, WHITE); //ojo izquierdo grande display.fillCircle (82, 10, 12, WHITE); //ojo derecho pequeo display.fillTriangle (0, 0, 65, 15, 120, 0, BLACK); //ceja superior display.display();}

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

Схема


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

  1. Внедрение персональных помощников роботов
  2. Робот Raspberry Pi, управляемый через Bluetooth
  3. Четвероногий автономный робот JQR
  4. Робот с сервомотором избегает препятствий
  5. Робот-последователь линии
  6. Робот, управляемый речью
  7. Четвероногий Arduino
  8. Робот-пианино, управляемый Arduino:PiBot
  9. Littlearm 2C:создание напечатанной на 3D-принтере руки робота Arduino
  10. Робот для супер-крутой навигации внутри помещений