Знакомьтесь с Петей, шестиногом о трёх сервоприводах
Продолжаю публикацию статей из серии "ардуино головного мозга". Петя — это очень дешёвый (примерно десять баксов) гексапод. Он может быть прекрасным проектом на один ненастный выходной, который развлечёт как и взрослых, так и детей. Раз уж мы про развлечения, вот вам видеоролик с Петей, танцующим под фанк-музыку:
Разумеется, никакого анализа звука я не делал, просто запрограммировал Петю на танец в определённом ритме. Вот ещё один ролик, в котором Петя выказывает своё презрение к мячикам для жонглирования:
В его текущем виде Петя умеет только ходить, но при этом он может видеть (измерять расстояние до) близлежащие препятствия. Его мозги, однако, достаточно производительны для того, чтобы суметь переварить данные с множества других датчиков, присылайте ваши предложения!
Как клонировать Петю
Список покупок
Если у вас есть доступ к 3д принтеру, то распечатать непосредственно тело/ноги робота не будет стоить практически ничего. Вот список основных деталей, необходимых для клонирования Пети:
- Материнская плата. Её вполне можно сделать дома лазерным утюгом, ну или заказать в Китае. Без каких-либо скидок это будет стоить примерно 10€ / 10 шт (включая пересылку), со скидками может спуститься до 2€ / 10 шт. Поскольку платка микромизерная, то я её добавил к другому заказу, и она мне оказалась вообще бесплатной. Если изготовить плату на заказ — не вариант, то можно найти альтернативу типа cheapduino или чего-то подобного, поскольку схема крайне примитивная.
- SG90 9G сервоприводы, 3 * 1.47€ / шт
- 4x AAA держалка для батареек, 1.34€ / шт
- ATMega8A-AU (QFP-32), 1€ / шт
- IR LED + IR фототранзистор, 0.20€ / шт
- Электролитический конденсатор 1000uF 16V, 0.17€ / шт
- 2n3904 транзисторы, 3 * 0.01€ / шт
- А также вам понадобятся провода, термоусадка, винты, гребёнки и несколько 0805 резисторов и конденсаторов. Полный список компонентов для материнки приведён тут: hardware/motherboard/BOM.html.
Покупать конденсаторы штучно, конечно, никто не будет. Лично я конкретно под этот проект заказывал платы (бесплатно, поскольку в нагрузку к другому проекту), три сервопривода и держалку для батареек. Вся остальная мелочёвка у меня лежит в куче всякого другого хлама. Итого десять баксов — это ещё с запасом. Кстати, самой дорогой вещью в этом роботе могут оказаться батарейки ;)
NB: При заказе 9g сервоприводов не забудьте, что они бывают разных размеров. Петя предполагает использование низкопрофильных серв с пластиковыми редукторами. Конечно, он будет работать и с другими сервами, но в этом случае не исключено, что придётся внести косметические изменения в SketchUp файлы. Ну и вообще металлический редуктор в данном случае не только оверкилл, но и зло в виде излишнего жужжания, трения, энергопотребления и выламывания деталей в случае форсмажора.
Тело
Тут сюрпризов нет, если у вас есть доступ к 3д принтеру, просто напечатайте содержимое каталога hardware/body/. Распечатанные детали выглядят как-то так::
У меня на принтере стоит сопло диаметром 1мм, так что все детали распечатались за пару часов в сумме. После сборки оно должно выглядеть как-то так:
М3 нейлоновые винты идеально подходят для сборки. Используйте нейлоновые шайбочки между движущимися частями, и затормозите гайку на резьбе любым удобным вам способом. Лично я просто нежно ткнул паяльником:
Материнка
Мозги
Сама по себе материнка крайне примитивная. Исходники и гербер лежат в папке hardware/motherboard/. Вот рендер гербера:
Материнка несёт на себе микроконтроллер ATMega8 и схему датчика препятствий, и ничего кроме этого. Вот так выглядит схема подключения мозга:
Я рекомендую сначала запаять строгий минимум, необходимый для запуска процессора, чисто чтобы убедиться, что деликатная пайка в полном порядке. На этом этапе материнка выглядит вот так:
N.B. Обратите внимание, что даташит ATMega8A предписывает рабочее напряжение в диапазоне 2.7-5.5В, и абсолютный максимум напряжения 6В. Безопасный вариант питания Пети — это четыре NiMH 1.2V аккумулятора. Чисто из духа противоречия я перекрестился и засунул в батарейный отсек четыре стандартные щелочные батарейки (6.4В в сумме), и это не сожгло Пете мозги, он вполне нормально бегает. Если вы пойдёте этой дорогой, я вас предупреждал, вы это делаете на свой страх и риск!
Вот фотография полностью распаянной материнской платы (за исключением ИК светодиодов и фототранзисторов):
Датчик препятствий
У Пети два глаза, каждый из них состоит из инфракрасного светодиода и соответствующего фототранзистора. Светодиод излучает инфракрасный свет; этот свет распространяется через воздух и отражается от препятствий назад к фотоприёмнику. Если препятствие близко, отражённый свет будет сильнее, нежели если препятствие находится далеко. Обратите внимание, что хоть инфракрасный свет и не виден невооружённым глазом, некоторые камеры его регистрируют и могут показать на записи, что весьма удобно для отладки:
Схема датчика препятствий крайне примитивна:
Мы запитываем два светодиода; когда фототранзисторы не освещены, коллекторы Q3 и Q4 "привязаны" к Vcc, а когда фототранзисторы улавливают достаточное количество ИК излучения, напряжение на коллекторах падает. На следующем примере я тестирую эту схему перед установкой светодиодов и фототранзисторов в глазницы Пети:
Обратите внимание, что в зависимости от того, какие у вас светодиоды, вам может быть нужно подобрать значение резистора R6. 47 Ом дают 55мА через светодиоды, но некоторые светодиоды могут хотеть больше (или меньше). Например, я выпаял безызвестные ИК светодиоды из поломанной детской игрушки, и они прекрасно работают на трёх миллиамперах (910 Ом)!
Я рекомендую сначала собрать схему приёмника на макетке (без светодиодов). Затем возьмите ИК светодиод, запитайте его напрямую от таблетки типа CR2032, и направьте в фототранзистор. (Я ничего не знаю про внутреннее сопротивление таблеток, но в моём [небогатом] опыте я никогда не видел изжаренных светодиодов от подобных манипуляций, поправьте меня, если я ошибаюсь)
Осветив ИК излучением фототранзисторы, убедитесь, что напряжение на коллекторах Q3 и Q4 падает согласно ожиданиям. Убедившись, что фотоприёмник работает корректно, подберите необходимый резистор для пары светодиодов, для того, чтобы получить поведение похожее на то, что я привёл в моём видео.
Обратите внимание, что лучше надеть на светодиоды и на фотоприёмники термоусадку для отсекания паразитных засветок. Ну и кроме того, с термоусадкой они прекрасно садятся в глазницы. При запаивании 2n3904, я бы посоветовал сначала запаивать центральный вывод, и только потом боковые, а то очень легко посадить трудноубираемую соплю припоя между ногами. Лично я нахожу пайку этих транзисторов более трудной, нежели пайку самого микропроцессора, но я плохой монтажник.
Да, если у вас нет осциллографа, это не беда, вполне можно обойтись парой светодиодов, обратите внимание на синие светодиоды на этом видео:
Для более далёких препятствий светодиоды будут тусклее.
Если у вас не получается заставить работать датчик препятствий, ну или если вам просто не понравилась предложенная схема, то существует множество других вариантов:
- Можно использовать isf471 вместо фототранзисторов и всей их обвязки типа резисторов и 2n3904.
- Можно купить измеритель расстояния Sharp GP2Y0A21YK0F:
- Ну или крайне примитивный готовый китайский сенсор на базе компаратора LM393:
Как работает прошивка
В принципе, Петю можно программировать через среду ардуино, но я её нахожу слишком громоздкой и непонятной для такого простого микроконтроллера, как ATMega8. Давайте разобьём объяснение работы прошивки на четыре части:
- как работает ШИМ-генератор
- как Петя двигает конечностями
- последовательности шагов
- обход препятствий
Шим-сигнал
Хоббийные сервоприводы принимают на вход 50 Гц ШИМ сигнал; 1 мс минимальная длительность импульса (0 градусов положения вала), 2 мс максимальная длительность импульса (90 градусов положения вала). У Пети на борту три сервопривода, два из них заведены на 16 битный таймер (timer1), а третий на восьмибитный таймер (timer2). Если я не ошибаюсь, ардуиновская библиотека Servo.h управляет сервами в режиме софтверного ШИМ, что на мой взгляд расточительно, так что у меня оба таймера тикают в режиме fast PWM.
Сам микроконтроллер тикает на 8 МГц, при этом timer1 работает на частоте 1 МГц (делитель 8).
Регистр ICR1 задаёт значение TOP (20000), таким образом, таймер перезапускается каждые 20 мс, выдавая корректный 50 Гц сигнал. Регистры OCR1A и OCR1B контролируют длительность (в микросекундах) импульсов для левой и правой серв.
А вот с центральной сервой проблема. Она заведена на восьмибитный таймер timer2, а он, к сожалению, не имеет аналога столь удобного ICR1, то есть, частота переполнения счётчика контролируется только через делитель. В таблице делителей нет такого, который позволил бы приблизить 50 Гц с приемлемой точностью, так что вот дикая идея, которая лежит где-то посередине между софтверным и хардверным ШИМ генераторами:
- Мы инициализируем таймер timer2 тикать с делителем 128, таким образом, он переполняется через 4.096 ms = 256 * 128/(8 * 10^6).
- Сразу после переполнения мы выключаем timer2, то есть, это он нам выдаёт только один импульс.
- В момент срабатывания capture interrupt таймера timer1 мы перезаряжаем таймер timer2 (и он сработает только на один импульс).
4 мс это больше 2 мс максимальной длительности импульса, которая нам нужна, и сильно меньше перезаряжающего ритма в 20 мс. Подводя итог, если мы хотим поставить все три сервы в среднее положение (1.5 мс длительность импульса), то мы должны сделать следующее:
OCR1A = 1500; // left servo
OCR1B = 1500; // right servo
OCR2 = 1500/16; // center servo
Планировщик движений
Перво-наперво, в коде есть шесть важных констант:
const uint8_t zero[3] = {45, 50, 40}; // zero position of the servo (degrees)
const uint8_t range[3] = {25, 25, 20}; // the servos are allowed to move in the zero[i] +- range[i] interval
Массив zero[3]
хранит значения углов для всех трёх сервоприводов, соответствующих нейтральной позиции (см. левую фотографию чуть ниже). В идеале, эти углы должны были бы быть 45° (середина диапазона серв), но на практике дискретность установки ног на зубчатые валы требует отклонения от идеала 45° для того, чтобы добиться симметричности нейтральной позиции. Затем, range[3]
предписывает максимальный разрешённый диапазон движения сервоприводов. Это означает, что сервоприводу с индексом i
разрешается двигаться только в диапазоне от zero[i]-range[i]
до zero[i]+range[i]
.
Текущее задание положения сервоприводов (в градусах, 0°-90°) хранится в массиве uint8_t pos[3]
. Вызов функции update_servo_timers()
обновляет значения регистров ШИМ-генератора согласно заданию. Правая фотография из картинки выше соответствует заданию pos[i]=zero[i]+range[i]
для всех трёх индексов i=0,1,2
.
В текущей реализации все движения планируются как движения с постоянной скоростью. Для этого у меня заведено четыре вспомогательных массива pos_beg[3], pos_end[3], time_start[3]
и duration[3]
. Давайте предположим, что я хочу двинуть только левой сервой. Для этого нужно выполнить следующие операции:
- скопировать
pos[0]
вpos_beg[0]
, это положение, соответствующее началу движения; - установить
pos_end[0]
в желаемое положение (по-прежнему в градусах); - записать в
time_start[0]
текущую метку времени (миллисекунды, прошедшие с момента загрузки); - и, наконец, записать желаемое время движения в
duration[0]
(в секундах). Таким образом, скорость будет(pos_end[0]-pos_beg[0])/duration[0]
градусов/сек.
Затем в бесконечном цикле я вызываю функцию movement_planner()
, которая обновляет массив текущего задания положения сервоприводов pos[]
согласно плану движения, а затем функцию update_servo_timers()
, которая обновляет регистры ШИМ-генератора согласно заданию положения pos[]
.
Походки
Обратите внимание, что планировщик движений хранит свои значения в трёхэлементных массивах, таким образом, все движения (включая скорости) могут быть независимы друг от друга. Несмотря на это, в моей текущей реализации все походки используют синхронные движения всех трёх сервоприводов. Давайте посмотрим, как Петя идёт вперёд. Для этого он циклически повторяет следующие четыре шага, вот их целевые позиции:
- шаг 1:
{zero[0]-range[0], zero[1]-range[1], zero[2]+range[2]}
- шаг 2:
{zero[0]-range[0], zero[1]-range[1], zero[2]-range[2]}
- шаг 3:
{zero[0]+range[0], zero[1]+range[1], zero[2]-range[2]}
- шаг 4:
{zero[0]+range[0], zero[1]+range[1], zero[2]+range[2]}
Мы можем записать эту последовательность как 2д массив (четыре тройки целевых позиций):
const int8_t advance_sequence[4][3] = {{-1, -1, 1}, {-1, -1, -1}, { 1, 1, -1}, { 1, 1, 1}};
Этот массив говорит нам, что конечное положение сервопривода i
на шаге step
равно zero[i] + range[i]*advance_sequence[step][i]
.
Ну а следующий код позволяет Пете идти вперёд неопределённое время:
uint8_t step = steps_per_sequence-1; // at the initialization stage the (previous) movement is considered to be complete, thus the next movement will be planned starting from the step 0
while (1) {
if (is_movement_finished()) {
step = (step + 1) % 4; // if previous movement is complete, then perform the next step; this variable loops as 0,1,2,3.
plan_next_movement(step, advance_sequence); // execute next movement
}
movement_planner(); // update the servos position according to the planning
_delay_ms(1);
}
Обход препятствий
Давайте вспомним, что наш датчик препятствий выдаёт напряжения, заведённые на каналы 4 и 5 АЦП микропроцессора. Для того, чтобы отсечь высокочастотный шум в измерениях (особенно учитывая количество шума, создаваемого сервами), на каждой итерации главного цикла я обновляю переменные adc_left_eye
и adc_right_eye
по следующему закону, что даёт мне фильтр низких частот:
adc_left_eye = adc_left_eye *.99 + adc_read(5)*.01; // low-pass filter on the ADC readings
adc_right_eye = adc_right_eye*.99 + adc_read(4)*.01;
Частота отсечки может настраиваться или через задержку _delay_ms()
внутри главного цикла, или же через коэффициент взвешенной суммы .99
и 1-.99
в вышеприведённом коде.
Наличие препятствия определяется как простое пороговое сравнение:
uint8_t lobst = adc_left_eye < distance_threshold; // obstacle on the left?
uint8_t robst = adc_right_eye < distance_threshold; // obstacle on the right?
Затем в конце каждого шага (напоминаю, четыре шага на каждую последовательность) я проверяю наличие препятствий слева и справа и соответственно меняю последовательности:
if (is_movement_finished()) {
if (!lobst && !robst) {
sequence = advance_sequence; // no obstacles => go forward
} else if (lobst && robst) {
sequence = retreat_sequence; // obstacles left and right => go backwards
} else if (lobst && !robst) {
sequence = turn_right_sequence; // obstacle on the left => turn right
} else if (!lobst && robst) {
sequence = turn_left_sequence; // obstacle on the right => turn left
}
step = (step + 1) % steps_per_sequence; // if previous movement is complete, then perform the next step
plan_next_movement(step, sequence); // execute next movement
}
Это просто, но работает!
Письмо Деду Морозу
Любой вклад приветствуется! Присылайте ваши идеи, а пока я приведу спиок вещей, которые мне хотелось бы увидеть улучшенными:
Софт:
- Предложите мне элегантный способ получить более "живые", гладкие движения. На данный момент Петя передвигается при помощи линейной интерполяции между ключевыми позами, и было бы хорошо сделать так, чтобы походка стала менее дёрганной. Возможно, нелинейная интерполяция с заранее записанными ускорениями поможет?
- Предложите новые стратегии обхода препятствий (и их реализации!) Текущая реализация крайне проста, в ней читаемость кода имеет высший приоритет, а ВАУ эффект от поведения робота уже идёт на втором плане.
- Я думаю, что может быть недурно портировать код под среду ардуино для тех людей, кто не может или не хочет вызывать avr-gcc напрямую или ковыряться в регистрах конкретного камня. Если вы можете это сделать, присылайте пулл-реквест или просто форкните проект.
Железо:
Если вы добрая душа, желающая помочь с созданием версии V2 материнки, то не стесняйтесь это сделать! Вот список вещей, которые я хотел бы добавить/изменить/поправить в текущей материнке:
- Главная вещь — это добавить рубильник, чтобы отключать питание сервприводов в момент прошивки процессора;
- Убрать кварц, внутренней RC-цепочки вполне должно хватить;
- Заменить все транзисторы на версии с поверхностным монтажом;
- Заменить резистор R6 на подстроечник для более лёгкой настройки датчика препятствий;
- Предложите хорошие (маленькие и с защитой от дураков) коннекторы вместо гребёнки и предложите лучшее их месторасположение;
- Подключение ИК светодиодов под центральным сервоприводом — плохая идея. На данный момент единственно хороший вариант — это их намертво припаять, что не очень удобно;
- Чуть-чуть подвинуть электролит. Мне пришлось его наклонить, т.к. иначе центральная левая нога за него задевает;
- Добавить тестовых площадок с лёгким к ним доступом осциллографом;
- Добавить пару отладочных светодиодов для отладки без осциллографа;
- Добавить площадок для пайки для всех неиспользуемых ног микропроцессора для отладки и дальнейшего расширения робота.
Заключение
Петя — это страшное веселье!
Revertis
Интересно, а существует ли способ сделать что-то бегающее или катающееся, но чтобы было бесшумным? Просто любое жужжание двигателей пугает кота, а хочется сделать ему какую-нибудь игрушку.
haqreu Автор
Мне кажется, что коту нормально пойдёт бантик на верёвочке :)
Revertis
Да, но бантик сам не бегает.
haqreu Автор
Ну жужжание — это быстро крутящиеся моторы и редукторы. Медленно крутящиеся моторы можно делать, но обычно это сложнее. В принципе, медленно крутящиеся шаговики вполне могут быть тихими. А для кота можно сделать что-то чисто механическое — натянуть верёвку через комнату, и пусть энергия, запасённая в каком-нибудь грузе, гоняет по этой верёвке туда-сюда каретку. Ну а с каретки висит бантик на верёвочке ;)
Wesha
Берём старый LCD-телевизор, вешаем на него Chromecast, запускаем одну из 100500
extempl
Зоопсихологи (ага, есть такие) считают, что коты должны иметь возможность словить то, за чем охотятся, ибо в противном случае у них может развиться что-то вроде комплекса неполноценности. Не знаю, насколько это правда, думаю сильно зависит от конкретных индивидов и времени воздействия (условно говоря, если он будет бегать 8 часов за чем-то, что не сможет словить, может и разовьётся).
Revertis
Да, у меня есть плюшевая небольшая канарейка на резинке, так если быстро ей мотать из стороны в сторону кот на неё нападает. Но если не может поймать в течение 10 секунд, то теряет к ней интерес. А если давать поймать, вгрызться в неё, потом подёргать слегка и высвободить, потом опять имитировать активность, то кот может так очень долго играть.
Wizard_of_light
По моему опыту, лазерная указка им таки не надоедает никогда, хотя зайчик они поймать и не могут.
iago
а есть что-то такое для собак?
extempl
Есть целый ряд мячиков-самокатов, но пока те, что я видел слишком большие для кота и слишком тяжёлые. Когда оно разгоняется и врезается в лапы — коту не очень хочется потом с этим играть.
Valtigra
В теории можно использовать бесколлекторные двигатели в редакции для стедикамов, но управление будет в разы сложнее
A6xa3
Спасибо, за отличный гайд и идею! Мой друг как раз погружает сына в азы программирования, более того хочет чтобы он именно с нуля начал собирать подобные штуки, так что отправлю ему ссылку, они точно оценят. Видимо придется ему 3Д принтер на день рождения подарить.
haqreu Автор
Тут весь смысл в том, что меньше сервоприводов сделать уже совсем трудно. Урезаем по-максимуму. Больше приводов — больше проблем. И в электронике, и в механике.
ProLimit
С двумя моторами колесные тележки обладают отличной маневренностью, что согласуется с числом измерений на плоскости. Неужели нет шагающей кинематики с двумя степенями свободы?
haqreu Автор
найдёте — поделитесь!
ProLimit
Вспомнил, у Lego mindstorm был условно шагающий робот с двумя моторчиками. Есть совсем простые, а вот посложнее: https://youtu.be/v6O-cvE7aDM
haqreu Автор
Красивый. Но уже нужны шестерни :(
gbg
tmin10
В книге "От идеи до модели" Заваротова В.А. есть несколько примеров шагоходов с одним движком и одной с степенью свободы, а где-то в другой книге видел следующую схему: П-образная рама с обоих сторон корпуса позволяет модели шагать, а снизу расположены ножки на поворотном механизме, что позволяет развернуться. Если интересно, могу нарисовать схему.
Finesse
Шагающая кинематика с одной степенью свободы: https://youtu.be/fXXJ1LOqHEk
Если добавить ещё одну, то механизм сможет поворачивать.
haqreu Автор
Да, забыл сказать. Если погружать в азы программирования, то мой код может испугать, у меня нативный код с прямыми доступами к битам регистров и проч. Рекомендую портировать код под ардуино, прежде чем давать его подростку. Это уберёт всякий ужасный ужас ШИМ-модуляции, доступа к АЦП и всяких прерываний.
kanvas
Спасибо за описание разработки! Всё достаточно наглядно.
Насчет «сделать за выходные», полагаю это осуществимо при скиллах, полученных заранее гораздо больше, чем «одни выходные»: Покупка, настройка и использование 3Д-принтера, программирование Ардуино.
Вопрос, как Вам пришла в голову текущая кинематическая схема Пети? Чем-то может быть вдохновились или как пришли к ней? Получилось достаточно экономно по количеству двигателей и при этом функционально
haqreu Автор
Не Васи, а Пети! На самом деле,
1) кинематическая схема очень известна. Например, всего за $72 :) вы можете купить вот такое.
2) более того, идея конкретно этого робота не моя. Оригинальный робот был опубликован семь лет назад, но от него не осталось ничего, кроме фотографий. Даже схема подключения к cheapduino канула в Лету. Мне он настолько понравился, что я решил детально описать все этапы постройки, и дать готовые к производству файлы.
3) про одни выходные — это конечно, не включает в себя процесс обучения. Более того, у меня процесс занял несколько больше, покуда я отлаживал то, да сё, да код писал. Но теперь, следуя моему тексту, вполне реально воспроизвести этого робота за несколько часов.
vortupin
А вот если бы вы смогли такой robotic kit баксов эдак за $50 выкатить (в виде самосборки), это уже было-бы весьма любопытно. Кстати, при небольшом рефакторинге (в качестве микроконтроллера использовать RPi Zero — их сейчас чуть-ли не даром раздают), можно было-бы серьезно повысить функциональность и «развлекабельность»: добавить камеру, управление голосом, танцы под музыку — не заранее запрограммированные, а с распознаванием ритма, подключить к Google Home через OpenHab, короче — возможности очень широкие.
Продавать можно на Amazon-е, Walmart-e через их программы для продавцов (как FBA), и этим снять с себя логистику. Только для этого нужно себестоимость сделать баксов $10-15 (это если продавать за $50), ну, и еще потратиться разово на регистрацию торговой марки etc.
Как правило, в основном для папы, и только на этапе разработки и отладки :) Детям же надоедает практически сразу (это если играть, а не программировать — но мои так и «не повелись» :( ).
haqreu Автор
Не, ну если мы возьмём условного танцора балета, который паяльник в руках не держал, то он совсем долго возиться будет. Про сто баксов это вы загнули. В любом фаблабе вам местные гики бесплатно распечатают эту мелочёвку. А, да, это же с людьми надо будет разговаривать ;)
Десять плат у китайцев стоят десятку с доставкой. Да, я предполагаю, что программатор и компьютер уже есть и покупать их не надо!
Я не бизнес сюда делать пришёл. Если кто хочет продавать наборы, флаг ему в руки.
SignallerK
А как вообще ведут себя ИК датчики в плане надежности?
Я вот китайские как-то взял (те что в статье на усилителе LM393), короче шумят они от чего угодно то лампочка посветила, то солнце моргнуло и все, настройка уже сбита.
Как по мне, лучше уж зажигать ИК диоды на частоте 38кГц (как в пультах тв), а в качестве приемников взять какой нибудь TSOP4838.
P.S. Не очень понятно почему в тэгах ардуина, если писалось все на avr-gcc :)
haqreu Автор
А что значит — настройка сбита? Да, могут поймать засветку, да, на улице работать вряд ли будет, по крайней мере, в солнечный день. Но стоит засветку убрать, так они опять возвращаются к предыдущим показаниям?
А в тегах не «ардуино», а «ардуино головного мозга»! Не как среда разработки, а как философия «тяп-ляп, сойдёт». Термин не мой, есть некоторые умные дяденьки, которые презрительно отзываются о не-специалистах в электронике. А мне термин нравится, меня описывает довольно точно :)
SignallerK
Ну имеено то и значит, настроил например на сработку при 5 сантиметрах до препятсвия. Но тут в окно посветило солнышко, и все уже не работает, так-как на входе и так уже максимум от засветки.
По ардуине понял, тогда норм :)
haqreu Автор
Никакой датчик не даст вам идеала. Такой датчик на ИК не видит прозрачные и чёрные объекты, и засвечивается солнцем. Ок. давайте ультразвук, он солнцем не засвечивается. Зато он не видит ткани и вообще стену видит только если прямо на неё смотрит, стоит под углом посмотреть и всё, эхо уходит мимо датчика… Надо искать компромисс между кучей параметров.
SignallerK
Да это понятно, я и не ожидаю идеальной работы в любых условиях и любых средах.
Но вы когда-нибудь испытывали проблему с засветкой на пульте тв (исключая улицу)?
Я нет, из чего для себя сделал вывод, что лучше добавить модуляцию и фильтр.
haqreu Автор
Я, если честно, в прмещении не видел проблем с засветками и с обычным ИК. Но у нас солнца мало :)
kenny5660
Есть довольно дешевые ИК дальномеры sharp серии GP2XX, где XX это тип датчика, в зависмости от типа меняются физические размеры и максимальное и минимальное измеряемое расстояние. Выходной сигнал подключается к АЦП, в даташиде есть график зависимости от расстояния, единственный минус он не линейный и придется делать аппроксимацию. На практике на этот датчик внешние условия влияют сильно меньше, чем у связки светодиод+фотодиод.
haqreu Автор
И он даже упомянут в статье ;)
RiCnRoM
мне нужен такой же) надо делать
WildLynxDev
Вот как это должно выглядеть в конечном итоге:
youtu.be/Zuc62lLk6kQ?t=402
:)
haqreu Автор
Четырёхного я тоже делал, правда, не такого большого :)
SGSko
Напомнило шикарных пауков из скрепок Мегабизона. Они там хоть, в основном, и без мозгов, но красавцы! :)
madcatdev
Забавный таракашка получился.
Что можно улучшить:
gorbln
1. Нельзя! Нельзя избавляться от кварца.
Сервы генерят немеряное количество шума, процессор будет работать нестабильно или зависать при питании от встроенного RC генератора. Это уже проходили в регуляторах оборотов (esc) — регули без кварцев значительно хуже по стабильности, чем регули с кварцем. Кварц стоит копейки, смысл понижать надёжность?
С остальными вашими замечаниями, в целом, согласен.
madcatdev
Возможно, стоит уделить больше внимания разводке питания и земли мк? С сервами не работал, но делал платы с GSM-модулями, где мк питался от RC, проблем при этом не наблюдалось.
haqreu Автор
У серв искрит коллектор, и очень сильно мешает жить МК, у меня не зря там конский электролит стоит. В принципе, без кварца работает должно, но насчёт надёжности не думал.
dragonnur
Может, LC/RC снабберы имело бы смысл навесить на серв?
haqreu Автор
Я и слов-то таких не знаю :)
GambitOZ
Судя по названию видео там не Петя, а Пенни)). Перевод немного корявый получился в некоторых местах. Но по сути все понятно. И использование программируемого процессора для такой простой задачки по-моему слишком жирновато, можно сделать проще)
haqreu Автор
Дядь, а дядь, я автор и английского текста, и русского. Не надо мне рассказывать про корявый перевод ;)