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

WALTER - Насекомое Arduino Photovore

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

SparkFun Arduino Pro Mini 328 - 5 В / 16 МГц
× 1
Ультразвуковой датчик - HC-SR04 (общий)
× 3
Фотодиод
× 4
Резистор 100 кОм
× 4
Микро сервопривод MG90S с металлическим редуктором
× 5
Портативный блок питания для смартфонов (2 канала:1A и 2.1 А)
× 1

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

Паяльник (универсальный)
Пистолет для горячего клея (общий)

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

IDE Arduino

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

[Прошу прощения за мой английский]

Мне очень нравится популярная конфигурация 2 сервоприводов Arduino насекомых на ютубе. Когда я смотрел на это, я всегда вспоминал, чем занимались роботы BEAM задолго до того, как эта установка стала фаворитом. Эти люди, которые являются фанатиками аналоговых роботов, лучше справлялись с походкой из-за лучшего угла между двумя двигателями ( ходунки с микроядром / двуядерным двигателем и т. д.).

Однако, на мой взгляд, ни один из упомянутых выше не выглядит более живым, чем VBug1.5 . (также известный как Walkman), созданный основателем лучевого робота Марком Тилденом. В нем 5 моторов, поэтому маневренность выше.

Сделать простого BEAM-робота несложно, но создание чего-то столь же сложного, как VBug1.5, могло быть неприятно для такого новичка в электронике, как я. Итак, когда я решил сделать что-то вроде ошибок Тилдена, мне пришлось остановиться на платформе Arduino, самом простом выборе для не-инженеров (или, как это ни смущает меня, подражателей инженеров).

В результате я сделал Уолтера , четырехногий робот Arduino с 5 сервоприводами. Вы можете спросить, если бы я хотел создать похожего на живого робота-жука, то почему я не использовал вместо этого 8 или 12 сервоприводов. Что ж, я подумал о чем-нибудь простейшем, что я могу сделать, чтобы добиться максимальной маневренности. Я говорю об использовании большого количества клея вместо изготовления рамок.

ПОВЕДЕНИЕ

Как и многие другие роботы Arduino, Уолтер может избегать препятствий с помощью ультразвуковых датчиков HC-SR04. Чтобы добавить персонажа в качестве жучка, Уолтера тоже фотовора, значит, его привлекает свет. Фотодиоды используются для обнаружения света. В скетче Arduino генерируются случайные значения, благодаря которым Уолтер решает, когда он хочет остановиться, чтобы отдохнуть, а также случайным образом изменяет скорость своей походки (3 скорости).

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

Я планировал сделать Walter версии 2 с сервоприводами большего размера, а затем включил эти кнопки в качестве датчиков поверхности.

подробнее

Код

  • WALTER.ino
WALTER.ino Arduino
 / * УОЛТЕР - ФОТОГРАФИИ С 4 НОГАМИ Этот скетч Arduino - это моя попытка построить четвероногого (4 ноги) робота с 5 сервоприводами по имени «УОЛТЕР». Чтобы использовать этот скетч, вам может потребоваться изменить некоторые значения для вашего удобства или для настройки вашего собственного оборудования. Найдите (Ctrl + F) эти отметки, чтобы легко найти, какие значения, возможно, потребуется изменить:- ****:Эти отметки означают, что они являются центральной точкой сервоприводов и должны быть откалиброваны (ваш робот установка ног на холостом ходу). - ***:Эти отметки означают назначение контактов Arduino (подключение датчиков и сервоприводов к Arduino). Обращайтесь к этому при сборке робота. - **:Эти отметки означают, что значения можно изменить по желанию (ширина шага ног, количество поворотов при обнаружении света / препятствия и т. Д.). Просто оставьте все как есть, если вы не знаете, что делаете. Вы можете использовать этот набросок на свой страх и риск ... и он предоставляется как есть, и ... эээ ... Что это все за авторские права, которые люди используют для написать в опубликованном исходном коде ?? Дело в том, что я не хочу нести ответственность, если что-то плохое случится, когда вы использовали этот код. Удачи! Йоханес Мартеди - 2015 * / # include  // ** ** Откалибруйте центральный угол сервоприводов (в микросекундах, потому что мы будем использовать команду «xx.writeMicroseconds ();»). Начните с 1500.const int ANGLE_mid_Shaft =1520; const int ANGLE_mid_FLeft =1550; const int ANGLE_mid_FRight =1570; const int ANGLE_mid_BLeft =1450; const int ANGLE_mid_BRight =1450; const int ANGLE_sweep =1450; const int ANGLE_sweep =1570; // ** Установите это значение (в микросекундах), чтобы определить ширину поворота сервоприводов (ширину шага ног). Чем больше значение, тем больше угол развертки. Const int ANGLE_res =10; // ** Установите разрешение движения сервопривода (в микросекундах) как минимум равным минимальной ширине мертвой зоны сервопривода по умолчанию (самое высокое разрешение) или больше (меньшее разрешение). Пример:ширина зоны нечувствительности сервопривода SG90 составляет 10 микросекунд. Int sweepSPEED; // переменная для определения скорости движения сервоприводов. int sweepSPEED_Rand [3] ={4, 6, 8}; // ** Скорость сервопривода (скорость походки) будет изменяться случайным образом в 3-х режимах. Установите скорость (в миллисекундах) для каждого режима. Меньшее значение означает быстрее. Const int ANGLE_turnMAX =ANGLE_sweep * 1.5; // ** Установите это значение, чтобы определить, на сколько максимум бот повернется к свету. Чем больше значение, тем больше поворот. Const int ANGLE_turnNARROW =ANGLE_sweep * 0,25; // ** Установите это значение, чтобы определить, на сколько максимум будет поворачиваться бот, избегая предметов по бокам в узком пространстве. Чем больше значение, тем больше поворот. Const int SONAR_sum =3; // Количество используемых сонаров. Const int PHOTO_sum =4; // Количество используемых фотодиодов. Int PIN_trig [SONAR_sum] ={13, 11, 8}; // *** Устанавливаем пины Arduino, подключенные к пусковым пинам ультразвуковых датчиков; {спереди, слева, справа} .int PIN_ec [SONAR_sum] ={12, 10, 7}; // *** Устанавливаем пины Arduino, подключенные к эхо-пинам ультразвуковых датчиков; {спереди, слева, справа} .int PIN_PHOTO [PHOTO_sum] ={2, 3, 1, 0}; // *** Установить контакты аналогового входа Arduino, подключенные к фотодиодам; {передний левый, передний правый, задний левый, задний правый} .const int distRotate =25; // ** Настраиваем минимальное расстояние (в см) между роботом и препятствием, прежде чем робот сможет его избежать, повернувшись .const int distRetreat =10; // ** Настроить минимальное расстояние (в см) между роботом и препятствием, прежде чем робот уклонится от него, отступив. Const int distTurn =20; // ** Настроить минимальное расстояние (в см) между роботом и препятствием, прежде чем робот сможет его избежать, повернув .const int counter_gait_max =8; // ** Настроить, сколько шагов робот сделает, чтобы избежать препятствия (при повороте или отступлении). // ** Настроить, как долго бот отдыхает и работает (в миллисекундах) .const int RUN_time =25000; const int REST_time =3000; // идентификаторы сонаров:int SONAR_id; const int FRONT =0; const int LEFT =1; const int RIGHT =2; // идентификаторы фотодиодов:const int FRONT_LEFT =0; const int FRONT_RIGHT =1; const int BACK_LEFT =2; const int BACK_RIGHT =3; // Переменные для чтения фотодиодов:int PHOTO_Front_Left; int PHOTO_Front_Right; int PHOTO_Back_Left; int PHOTO_Back_Right; const int SONAR_TrigSig =10; // Продолжительность (в S) триггерного сигнала, необходимого датчикам для создания ультразвукового звука (уже задана продуктами, не меняйте это значение) .const unsigned long SONAR_MaxEc =50000; // Максимальная длительность (в S) эхо-сигнала, выдаваемого датчиками (уже задана продуктами, не меняйте это значение) .const float SOUND_speed =0.034; // Скорость звука в воздухе в См / см (уже указана sciene, аватар Аанг необходим для выполнения изгиба воздуха, если это значение нужно изменить) .int distance [SONAR_sum]; // Результаты расчета расстояния. // Dобъявление сервоприводов:Servo SERVO_shaft; Servo SERVO_front_left; Servo SERVO_front_right; Servo SERVO_back_left; Servo SERVO_back_right; // Переменные для каждого угла сервопривода:int ANGLE_shaft =ANGLE_mid_mid_Shaft; ANGLE_front_right =ANGLE_mid_FRight; INT ANGLE_back_left =ANGLE_mid_BLeft; INT ANGLE_back_right =ANGLE_mid_BRight; // манипуляция Угол для среднего сервоприводом (вал) .const INT ANGLE_max_Shaft =ANGLE_mid_Shaft + ANGLE_sweep; Const INT ANGLE_min_Shaft =ANGLE_mid_Shaft - ANGLE_sweep; INT ANGLE_sweep_val; // Переменные для записи тока углы каждого сервопривода:int ANGLE_shaft_record; int ANGLE_front_left_record; int ANGLE_front_right_record; int ANGLE_back_left_record; int ANGLE_back_right_record; // Переменные для коррекции углов сервоприводов в соответствии с обнаружением света servos:int LIGHT_left; int LIGHT_right int SONAR_left; int SONAR_right; // Вот что такие как флаги, счетчики, записи, которые я всегда не знаю, как объяснить. :(int ANGLE_prev; int flag_shaft_reverse; int flag_transition_rotate; int flag_transition_start =1; int flag_rest =0; int flag_RUN_time =0; int rotate_random; int counter_gait; void setup () {// Serial.begin (9600); // Serial. . вы знаете, проверка и отладка .. SERVO_shaft.attach (2); // *** Настроить сигнальный штифт горизонтального (вала) сервопривода на Arduino. SERVO_front_left.attach (4); // *** Настроить передний левый Сигнальный вывод сервопривода на Arduino. SERVO_front_right.attach (3); // *** Настроить сигнальный вывод сервопривода правого переднего колеса на Arduino. SERVO_back_left.attach (6); // *** Настроить вывод сигнала сервопривода заднего левого колеса на arduino. SERVO_back_right.attach (5); // *** Установите сигнальный штифт заднего правого сервопривода на arduino. // Подготовьте сервоприводы под их средними углами. SERVO_shaft.writeMicroseconds (ANGLE_mid_Shaft); SERVO_front_left.writeMicroseconds (ANGLeft); SERVO_front_right.writeMicroseconds (ANGLE_mid_FRight); SERVO_back_left.writeMicroseconds (ANGLE_mid_BLeft); SERVO_back_right.writeMicroseconds (ANGLE_mid_BRight); // Установка булавки s для сонаров, pinMode и value. для (SONAR_id =0; SONAR_id  distRotate) {flag_RUN_time =0; в то время как (flag_RUN_time ==0) {ВПЕРЕД (); }} while (расстояние [FRONT]> distRetreat &&distance [FRONT] <=distRotate) {while (расстояние [LEFT]> расстояние [RIGHT]) {ROTATE_LEFT_AVOID (); ломать; } while (расстояние [LEFT] <расстояние [RIGHT]) {ROTATE_RIGHT_AVOID (); ломать; } while (расстояние [LEFT] ==расстояние [RIGHT]) {ROTATE_RANDOM_AVOID (); ломать; }} в то время как (расстояние [ПЕРЕДНИЙ] <=distRetreat) {RETREAT_AVOID (); }}} / * ________________________________________________________________________________________ ###################################### GAIT # ############################################ * // * ===================================ДВИЖЕНИЕ ВАЛА ===================================* / void SHAFT () {unsigned long TIMER_servo =millis (); while ((millis () - TIMER_servo) <=sweepSPEED) {while (ANGLE_shaft ==ANGLE_mid_Shaft) {counter_gait ++; SONAR_READ_ALL (); LIGHT_COMPARE_EXECUTE (); SIDE_AVOID (); flag_RUN_time =1; ломать; }} если (ANGLE_prev  =ANGLE_max_Shaft) {ANGLE_prev =ANGLE_shaft; ANGLE_shaft - =ANGLE_res; } иначе, если (ANGLE_prev> ANGLE_shaft &&ANGLE_shaft> ANGLE_min_Shaft) {ANGLE_prev =ANGLE_shaft; ANGLE_shaft - =ANGLE_res; } иначе, если (ANGLE_shaft <=ANGLE_min_Shaft) {ANGLE_prev =ANGLE_shaft; ANGLE_shaft + =ANGLE_res; } SERVO_shaft.writeMicroseconds (ANGLE_shaft);} void SHAFT_REVERSE () {if (ANGLE_prev  ANGLE_shaft) {ANGLE_prev =ANGLE_shaft - 1; }} / * ================================КОНЕЦ ДВИЖЕНИЯ ВАЛА ================================* // * =====================================ПЕРЕХОД =====================================* / void TRANSITION_GAIT () {ANGLE_front_left_record =ANGLE_front_left; ANGLE_front_right_record =ANGLE_front_right; ANGLE_back_left_record =ANGLE_back_left; ANGLE_back_right_record =ANGLE_back_right; ANGLE_shaft_record =ANGLE_shaft; int flag =ВЫСОКИЙ; int counter =0; в то время как (флаг ==ВЫСОКИЙ) {ВАЛ (); LIGHT_left =0; LIGHT_right =0; счетчик ++; ANGLE_front_left =карта (счетчик, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_front_left_record, ANGLE_mid_FLeft); ANGLE_front_right =карта (счетчик, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_front_right_record, ANGLE_mid_FRight); ANGLE_back_left =карта (счетчик, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_back_left_record, ANGLE_mid_BLeft); ANGLE_back_right =карта (счетчик, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_back_right_record, ANGLE_mid_BRight); SERVO_shaft.writeMicroseconds (ANGLE_shaft); SERVO_front_left.writeMicroseconds (ANGLE_front_left); SERVO_front_right.writeMicroseconds (ANGLE_front_right); SERVO_back_left.writeMicroseconds (ANGLE_back_left); SERVO_back_right.writeMicroseconds (ANGLE_back_right); if (counter ==((ANGLE_sweep * 2) / ANGLE_res)) {flag =LOW; НАЧАЛО(); flag_transition_rotate =0; }}} void TRANSITION_START () {if (ANGLE_shaft ==ANGLE_mid_Shaft || (ANGLE_shaft> ANGLE_mid_Shaft &&ANGLE_shaft> ANGLE_prev) || (ANGLE_shaft  =ANGLE_mid_Shaft &&ANGLE_prev  =ANGLE_mid_Shaft &&ANGLE_prev> ANGLE_shaft) {ANGLE_front_left =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FLeft_s); (ANGLE_mid_FLeft_s) ANGLE_front_right =карта (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FRight, ((ANGLE_mid_FRight + ANGLE_sweep_val) + LIGHT_right + SONAR_right)); ANGLE_back_left =карта (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BLeft, ((ANGLE_mid_BLeft - ANGLE_sweep_val) + LIGHT_left + SONAR_left)); ANGLE_back_right =карта (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BRight, ((ANGLE_mid_BRight - ANGLE_sweep_val) - LIGHT_right - SONAR_right)); } иначе, если (ANGLE_shaft  ANGLE_shaft) {ANGLE_front_left =map (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_FLeft) ANGLE_mid_FLeft) ANGLE_mid_FLeft ANGLE_front_right =карта (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_FRight + ANGLE_sweep_val) + LIGHT_right + SONAR_right), ANGLE_mid_FRight); ANGLE_back_left =карта (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_BLeft - ANGLE_sweep_val) + LIGHT_left + SONAR_left), ANGLE_mid_BLeft); ANGLE_back_right =карта (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_BRight - ANGLE_sweep_val) - LIGHT_right - SONAR_right), ANGLE_mid_BRight); } else if (ANGLE_shaft  =ANGLE_mid_Shaft &&ANGLE_prev  =ANGLE_mid_Shaft &&ANGLE_prev> ANGLE_shaft) {ANGLE_front_left =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FLeft); ANGLE_front_right =карта (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FRight, (ANGLE_mid_FRight + ANGLE_sweep_val)); ANGLE_back_left =карта (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BLeft, (ANGLE_mid_BLeft + ANGLE_sweep_val)); ANGLE_back_right =карта (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BRight, (ANGLE_mid_BRight - ANGLE_sweep_val)); } иначе если (ANGLE_shaft  ANGLE_shaft) {ANGLE_front_left =map (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_FLeft); ANGLE_front_right =карта (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_FRight + ANGLE_sweep_val), ANGLE_mid_FRight); ANGLE_back_left =карта (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_BLeft + ANGLE_sweep_val), ANGLE_mid_BLeft); ANGLE_back_right =карта (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_BRight - ANGLE_sweep_val), ANGLE_mid_BRight); } else if (ANGLE_shaft  0,0) {SONAR_distance =SONAR_EcInterval * (SOUND_speed / 2.0); ломать; } пока (SONAR_EcInterval ==0.0) {SONAR_distance =501.0; ломать; } return SONAR_distance;} / * =============================КОНЕЦ УЛЬТРАЗВУКОВОГО ЧТЕНИЯ =============================* // * ====================================ОБНАРУЖЕНИЕ СВЕТА ====================================* / void LIGHT_COMPARE_EXECUTE () {// PHOTO_FLeft_RAW =analogRead (PIN_PHOTO [FRONT_LEFT]); // PHOTO_FRight_RAW =analogRead (PIN_PHOTO [FRONT_RIGHT]); PHOTO_Front_Left =analogRead (PIN_PHOTO [FRONT_LEFT]); PHOTO_Front_Right =аналоговое чтение (PIN_PHOTO [FRONT_RIGHT]); PHOTO_Back_Left =analogRead (PIN_PHOTO [BACK_LEFT]); PHOTO_Back_Right =analogRead (PIN_PHOTO [BACK_RIGHT]); если ((PHOTO_Front_Left + PHOTO_Front_Right)> =(PHOTO_Back_Left + PHOTO_Back_Right)) {int LIGHT_Sensitivity =50; если (LIGHT_COMPARE ()> LIGHT_Sensitivity) {LIGHT_left =LIGHT_COMPARE (); LIGHT_right =0; } иначе, если (LIGHT_COMPARE () <-LIGHT_Sensitivity) {LIGHT_left =0; LIGHT_right =LIGHT_COMPARE (); } еще {LIGHT_left =0; LIGHT_right =0; }} else {if (PHOTO_Back_Left> PHOTO_Back_Right) {LIGHT_right =0; LIGHT_left =ANGLE_turnMAX; } иначе, если (PHOTO_Back_Left  PHOTO_Front_Right) {LIGHT_rate =PHOTO_Front_Left; } иначе, если (PHOTO_Front_Right> PHOTO_Front_Left) {LIGHT_rate =PHOTO_Front_Right; } else {// выбираем использование одной и комментируем другую из этих переменных ниже // LIGHT_rate =PHOTO_Front_Left; LIGHT_rate =PHOTO_Front_Right; } int LIGHT_compareRAW =PHOTO_Front_Left - PHOTO_Front_Right; LIGHT_compareRAW =map (LIGHT_compareRAW, -LIGHT_rate, LIGHT_rate, -ANGLE_turnMAX, ANGLE_turnMAX);; return LIGHT_compareRAW;} / * ===================================КОНЕЦ ОБНАРУЖЕНИЯ СВЕТА =================================* // * ======================================ПОВЕДЕНИЕ ======================================* / void RETREAT_AVOID () {counter_gait =0; while (counter_gait <=counter_gait_max) {RETREAT (); }} void ROTATE_LEFT_AVOID () {counter_gait =0; rotate_random =2; while (counter_gait <=counter_gait_max) {ROTATE_LEFT (); }} void ROTATE_RIGHT_AVOID () {counter_gait =0; rotate_random =2; while (counter_gait <=counter_gait_max) {ROTATE_RIGHT (); }} void ROTATE_RANDOM_AVOID () {rotate_random =ROTATE_RANDOM (); пока (rotate_random ==0) {ROTATE_LEFT_AVOID (); } пока (rotate_random ==1) {ROTATE_RIGHT_AVOID (); }} void SIDE_AVOID () {if (расстояние [LEFT] <=distTurn &&distance [RIGHT]> distTurn) {LIGHT_left =0; LIGHT_right =0; SONAR_left =0; SONAR_right =- (карта (расстояние [LEFT], 0, distTurn, ANGLE_turnMAX, 0)); } else if (расстояние [RIGHT] <=distTurn &&distance [LEFT]> distTurn) {LIGHT_left =0; LIGHT_right =0; SONAR_right =0; SONAR_left =карта (расстояние [ВПРАВО], 0, distTurn, ANGLE_turnMAX, 0); } else if (расстояние [LEFT] <=distTurn &&distance [RIGHT] <=distTurn) {LIGHT_left =0; LIGHT_right =0; если (расстояние [ВЛЕВО] <расстояние [ВПРАВО]) {SONAR_left =0; SONAR_right =- (карта (расстояние [LEFT], 0, distTurn, ANGLE_turnNARROW, 0)); } else if (расстояние [RIGHT] <расстояние [LEFT]) {SONAR_right =0; SONAR_left =карта (расстояние [ВПРАВО], 0, distTurn, ANGLE_turnNARROW, 0); }} еще {SONAR_right =0; SONAR_left =0; }} / * ==================================КОНЕЦ ПОВЕДЕНИЯ ==================================* / 

Схема


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

  1. Цифровые игральные кости Arduino
  2. Железный человек
  3. Найди меня
  4. Роботизированная рука, напечатанная на 3D-принтере Arduino
  5. Как измерить массу Земли с помощью Arduino
  6. Управление увлажнителем Arduino
  7. NeoMatrix Arduino Pong
  8. Джойстик Arduino
  9. FM-радиоприемник Arduino TEA5767
  10. Health Band - умный помощник для пожилых людей