Официальный сайт компании Arduino по адресу arduino.cc
Робот из хлама
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 03/03/2016 - 08:55
Собрал из того что было робота для детей.
Тележка изготовлена из старого выключателя и мотор-редукторов оставшихся от покупной игрушки после того как дочь с ней "поиграла". Контроллер двигателей взят с тойже игрушки (на одноканальных Н мостах без маркировки). В качестве контроллера используеться Arduino pro mini 5V. Ик бампер выполнен из фотопар шариковой мышки. Аккумулятор от старого мобильника Li-ion. Собрано всё навесом. Местами использовал термоклей.
Планирую добавить управление по блютус, увеличить количество ИК сенсоров и в дальнейшем развести печатку под переферию.
#define sens_LF 0 // левый передний фотосенсор #define sens_RF 1 //правый передний фотосенсор #define BL_on digitalWrite(12, HIGH)//vcc BL on #define BL_off digitalWrite(12, LOW)//vcc BL off #define beeper 11//выход Спикера #define pwm_f 50//быстрая скорость #define pwm_l 125//медленная скорость #define l_motor 8,9 //пины правого мотора #define r_motor 7,6 //пины левого мотора byte state_l_motor=0;//статус левого мотора byte state_r_motor=0;//статус правого мотора long PreGetDist = 0;//врямя последнего замера дистанции #define interval_PGD 50//интервал замера дистанции в мс byte dist_LF=0; byte dist_RF=0; void setup() { Serial.begin(9600); pinMode(12,OUTPUT);//ИК подсветка pinMode(13,OUTPUT);//индикатор pinMode(8,OUTPUT);//мотор Л pinMode(7,OUTPUT);//мотор П } void loop() { if (millis() - PreGetDist > interval_PGD){//опрос датчиков препятствий PreGetDist = millis(); dist_LF = ((dist_LF*2)+IR_sens(sens_LF))/3;//отфильтрованная дистанция dist_RF = ((dist_RF*2)+IR_sens(sens_RF))/3;//отфильтрованная дистанция Serial.print("L"); Serial.print(dist_LF); Serial.print(" R"); Serial.println(dist_RF); } //левый мотор if (dist_LF > 2){ reverse(l_motor,state_l_motor); state_l_motor=2; } /* else if (dist_LF > 3){ forvard_l(l_motor,state_l_motor); state_l_motor=1; }*/ else { forvard(l_motor,state_l_motor); state_l_motor=1; } //правый мотор if (dist_RF > 2){ reverse(r_motor,state_r_motor); state_r_motor=2; } /*else if (dist_RF > 3){ forvard_l(r_motor,state_r_motor); state_r_motor=1; }*/ else { forvard(r_motor,state_r_motor); state_r_motor=1; } } void beep(){ analogWrite(beeper,125); delay (100); analogWrite(beeper,0); } byte IR_sens(byte sens){ int val=0; int val2=0; for (int i=0; i <= 9; i++){//замер с ИК подсветкой9 BL_on; // вкл ИК подсветка delay(1); val = val + analogRead(sens);// считываем значение с фототранзистора BL_off;// выкл ИК подсветка delay(1); val2 = val2 + analogRead(sens); // считываем значение с фототранзистора } val = val/10; /* Serial.print("Light"); Serial.println(val);*/ val2 = val2/10; val = val - val2; // считываем значение с фототранзистора //val = (val+dist_LF)/2; return abs(val); } void stp(byte pin_d, byte pin_s){//СТОП digitalWrite(13,1); digitalWrite( pin_d, 0 ); digitalWrite( pin_s, 0 ); delay(200); beep(); digitalWrite(13,0); } void forvard(byte pin_d, byte pin_s, byte state){//ВПЕРЕД if (state != 1){ stp(pin_d,pin_s); digitalWrite( pin_d, 1 ); // direction = forward analogWrite(pin_s,0); delay(50); } digitalWrite( pin_d, 1 ); // direction = forward analogWrite( pin_s, pwm_f); // PWM speed = slow } void forvard_l(byte pin_d, byte pin_s, byte state){//ВПЕРЕД медленно if (state != 1){ stp(pin_d,pin_s); digitalWrite( pin_d, 1 ); // direction = forward analogWrite(pin_s,0); delay(50); } digitalWrite( pin_d, 1 ); // direction = forward analogWrite( pin_s, pwm_l); // PWM speed = slow } void reverse(byte pin_d, byte pin_s, byte state){//НАЗАД if (state != 2){ stp(pin_d,pin_s); digitalWrite( pin_d, 0 ); // direction = rev analogWrite(pin_s, 255);//ускорение delay(50); } digitalWrite( pin_d, 0 ); // direction = rev analogWrite( pin_s, 255-pwm_f); // PWM speed = slow }
Ужос! Осталось привязать веревкой крышку. 8-|
Прикольно!
Сверху не хватет коробочки от детского сырочка как крышки!))
yul-i-an - посмотрел видео мне понравилось, фунциклирует по полной.
Тележка изготовлена из старого выключателя и мотор-редукторов оставшихся от покупной игрушки после того как дочь с ней "поиграла". Контроллер двигателей взят с тойже игрушки (на одноканальных Н мостах без маркировки). В качестве контроллера используеться Arduino pro mini 5V. Ик бампер выполнен из фотопар шариковой мышки. Аккумулятор от старого мобильника Li-ion. Собрано всё навесом. Местами использовал термоклей.
Планирую добавить управление по блютус, увеличить количество ИК сенсоров и в дальнейшем развести печатку под переферию.
По-моему, здорово!
"Я его слепила из того, что было..." (С)
Очень умелые ручки.
+5!
yul-i-an - посмотрел видео мне понравилось, фунциклирует по полной.
Ссылку на видео сначала не заметил. Посмотрел....прикольно :) Детишкам, наверное, тоже понравилось. Папа молодец!
Доработал алгоритм поведения, изменение "характера" можно посмотреть на видео версия 1.2.
Железо не трогал. Очень напрашиваються боковые сенсоры, для движения вдоль препятствий (чтобы бортами их не скребсти), датчик "присутствия пола". и верхний габаритный (чтобы под низкие препятствия не лез).
Простая езда с объездом препятствий конечно занятие интересное, но необходима ЦЕЛЬ идти на звук или свет обходя препятствия (для интер активности).
Код коментировал для себя, если кому интересно пишите прокоментирую, возможно ктото для себя найдет какиенибудь полезные решения.
позже подготовлю и опублекую принципиальную схему.
Возникла необходимость распозновать черные предметы ИК сенсорами.
Необходимо предумать алгоритм определения черных поверхностей не меняя железа. Задумка в следующем, т.к. ИК излучение не отражаеться от темных предметов, то пользоваться показаниями только приемников (окружающей освещенности). В функции
переменная val2.
Логика такая - если при движении замер освещенности меньше предыдущего на Х%(подбираем эксперементально) то выполняем маневр в сторону большей освещенности. Возможно появление проблеммы с заездом в темные углы (должно решиться подбором Х) и неадекватное поведение при выключении света (приведет к постоянному вращению в кромешной тьме) можно решить замером времени маневра (допустим после 10сек. вращения забить на освещенность и орентироваться по ик сенсорам).
Кто что думает?
Очень интересно, а что за датчики и мотор-редукторы у вас использованы?
Я тоже хотел робота сделать...ну так, когда свободное время будет. Начал делать так
Но пока некогда....может когда-то руки дойдут :(
Поставьте доп фары из сверхярких светодиодов, которые будут включаться в проблемных ситуациях.
Тоже планировал шасси собирать из таких машинок, но дома только одна. Если често на вторую денег лишних нет (ипотека...), так что приходиться работать с тем что есть. Проходимость конечно храмает, а так вроде всё пока работает. Над логикой работать нужно.
Вчера пробовал распозновать темные объекты, какието предпосылки появились, но нужно работать над алгоритмом их опознания (весь интернет уже перерыл). Буду работать задача больно интересная (не меняя железо получить больше информации об обстановке).
Спасибо за проявленный интерес.
Мотор редукторы
от игрушечного робота, если разобрать внутри как в машинках неваляшках, только колеса вовнутрь. На стоячем за колесо не проворачиваеться (Крутящий момент большой).
ИК сенсоры от шариковой мышки видео работы.
Результат измерения растояния очень сильно зависит от алгоритма опроса и фильтрации показаний.
Спасибо, Yul-i-an, за интересную инфу об интересном решении.
Насчет темных объектов скажу, что ваши глаза и "глаза" Ардуинки совершенно по-разному видят цвет.
Или не видят из-за разной спектральной чувствительности.
Кошки весь мир видят черно-белым, но лучше нас.
Летучие мыши "видят" ультразвук ушами в полной темноте.
Сначала определитесь, какие предметы и какие цвета вы хотите "увидеть" своей машинкой, тогда и "глаза" ей соответствующие нужно покупать.
Это очень интересно...
Прбовал следующее
На черные объекты реакция появилась, если раньше их совсем не замечали то теперь реагируем, но както не адекватно (не до конца отворачиваемся от них, блуждания во время отсутствия припятствий). Буду думать дальше.
Хочу прикрутить к роботу индикатор заряда АКБ. Для замера напряжения питания использовать конденцатор, заряжать его от напряжения питания, а затем разряжать и замерять время разряда и переводить в напряжение.
Как думаете по замеру времени разряда конденцатора как тут получиться?
Со светодиодом работает (светодиод в качестве датчика освещенности).
Сегодня попробую, о результатах напишу
А почему просто не измерять напряжение?
Хочу прикрутить к роботу индикатор заряда АКБ. Для замера напряжения питания использовать конденцатор, заряжать его от напряжения питания, а затем разряжать и замерять время разряда и переводить в напряжение.
Как думаете по замеру времени разряда конденцатора как тут получиться?
Со светодиодом работает (светодиод в качестве датчика освещенности).
Сегодня попробую, о результатах напишу
Так делали на старых контроллерах где небыло АЦП а был аналоговый компаратор!)
Вс ардуино просто analogRed.
А почему просто не измерять напряжение?
Ну потому что контроллер питаеться от тогоже напряжения.
А почему просто не измерять напряжение?
Ну потому что контроллер питаеться от тогоже напряжения.
подключайте внутренее опорное 1.1В и меряете напряжение питания.
http://arduino.ru/Reference/AnalogReference
Спасибо уже нашел (на компараторе).
Пробовал свой метод подключил конденцатор между GND и одним из цифровых выводов через резистор.
Подавал на положительный вывод конденцатора Высокий уровень, переключался на вход и щитал время до появления Низкого уровня, получл некоторые значения, но не пробовал менять напряжение источника питания чтобы проверить зависимость.
Спасибо уже нашел (на компараторе).
Пробовал свой метод подключил конденцатор между GND и одним из цифровых выводов через резистор.
Подавал на положительный вывод конденцатора Высокий уровень, переключался на вход и щитал время до появления Низкого уровня, получл некоторые значения, но не пробовал менять напряжение источника питания чтобы проверить зависимость.
Вам же написали про 1.1в. Это внутреннее опорное напряжение, которое, как говорят, довольно стабильное, и при изменении напряжения питания ардуины (конечно в разумных пределах) не изменяется, что дает Вам возможность спокойно измерять напряжение аккумулятора (естественно через делитель).
Набросок схемы
IR диоды планирую запитать через транзистор и параллельно включить конденцатор для повышения мощности излучения, питание в цепи фототранзисторов тоже следует подовать через транзистор во время замера (экономия заряда АКБ).
JR, JL выходы на Н мосты правого и левого моторов.
Схема будет примерно такая
IR диоды планирую запитать через транзистор и параллельно включить конденцатор ..........
Для мощности излучения можно лазер включить...можно детектор цвета включить....только не понимаю для чего?
Какова конечная цель?
IR диоды планирую запитать через транзистор и параллельно включить конденцатор ..........
Для мощности излучения можно лазер включить...можно детектор цвета включить....только не понимаю для чего?
Какова конечная цель?
Ну как в схемах пультов ДУ
На черные объекты реакция появилась, если раньше их совсем не замечали то теперь реагируем, но както не адекватно (не до конца отворачиваемся от них, блуждания во время отсутствия припятствий). Буду думать дальше.
Также у меня вызывает сомнения как ты определяешь Среднее значение вообще? датчик тупо прямо смотрит? лучше развёртку сделать то есть типа как кинескоп у телевизора работает ) только считывать ищи по в поиске "самодельный тепловизор" там есть такое устройство только у тебя датчик света будет
На черные объекты реакция появилась, если раньше их совсем не замечали то теперь реагируем, но както не адекватно (не до конца отворачиваемся от них, блуждания во время отсутствия припятствий). Буду думать дальше.
Также у меня вызывает сомнения как ты определяешь Среднее значение вообще? датчик тупо прямо смотрит? лучше развёртку сделать то есть типа как кинескоп у телевизора работает ) только считывать ищи по в поиске "самодельный тепловизор" там есть такое устройство только у тебя датчик света будет
Мне требуеться средняя освещенность для того чтобы знать что приблизелись к чемуто темному (не важно с какой стороны темнее). Я выше писал что хочу попробовать распозновать темные предметы без изменения железа. Сравнивать среднюю левую и правую освещенности... (у меня не стоит задача ориентироваться на свет). Задача обнаружение и объезд препятствий.
Доработаный код (доработка - если при объезде припятствия застряли то отъезжаем назад и продолжаем маневр)
Видео позже выложу
Мне требуеться средняя освещенность для того чтобы знать что приблизелись к чемуто темному (не важно с какой стороны темнее). Я выше писал что хочу попробовать распозновать темные предметы без изменения железа. Сравнивать среднюю левую и правую освещенности... (у меня не стоит задача ориентироваться на свет). Задача обнаружение и объезд препятствий.
варинт со сканированием сработает, а вот такой наврятли, да и зачем если есть ИК и звук?
Переделал схему ИК сенсоров
Выглядит она так (рисовал тут)
В программу добавил снижение скорости пропорционально расстоянию до препятствия.
Последняя версия кода
Теперь схема выглядит так
Если у кого есть опыт работы с ИК бампером подскажите как лучше расположить ИК диоды и фотосенсоры. У меня сейчас ИК диоды и фототранзисторы расположены по сторонам, тонкие препятствия в центре не замечает (ножка стула например). Еть вариант расположить ИК диоды в центе, а фототранзисторы оставить побокам или добавить ИК диод в центре к тому что есть, как думаете?
Преписал код немного
Я предпочел УЗВ сенсор (HCSR-04) на серводвигателе (SG-90). У него не очень острая диаграмма направленности +-15 градусов, но при вращении и усреднении пачки замеров дает вполне адекватные расстояния с точностью до 2-3мм. Игрался с разного рода "ушами" на приемник и излучатель .. в принципе, диаграмму можно заузить до +- 6градусов, но качественного улучшения "итого" оно не дает, зато сильно просаживает дальность определения расстояния (примерно с 5метров до 1.5м.). Отказался.
Для движение между объектами вполне достаточно по +- 15 замеров от центрального направления, что не сильно напряжно по памяти. Для повышения скорости движения можно крутить датчиком не непрерывно +-90градусов, а только в наиболее критическом диапазоне направлений.