Роботаракан Петя за десять баксов

  • Tutorial

Знакомьтесь с Петей, шестиногом о трёх сервоприводах


Продолжаю публикацию статей из серии "ардуино головного мозга". Петя — это очень дешёвый (примерно десять баксов) гексапод. Он может быть прекрасным проектом на один ненастный выходной, который развлечёт как и взрослых, так и детей. Раз уж мы про развлечения, вот вам видеоролик с Петей, танцующим под фанк-музыку:



Разумеется, никакого анализа звука я не делал, просто запрограммировал Петю на танец в определённом ритме. Вот ещё один ролик, в котором Петя выказывает своё презрение к мячикам для жонглирования:



В его текущем виде Петя умеет только ходить, но при этом он может видеть (измерять расстояние до) близлежащие препятствия. Его мозги, однако, достаточно производительны для того, чтобы суметь переварить данные с множества других датчиков, присылайте ваши предложения!


Как клонировать Петю


Список покупок


Если у вас есть доступ к 3д принтеру, то распечатать непосредственно тело/ноги робота не будет стоить практически ничего. Вот список основных деталей, необходимых для клонирования Пети:



Покупать конденсаторы штучно, конечно, никто не будет. Лично я конкретно под этот проект заказывал платы (бесплатно, поскольку в нагрузку к другому проекту), три сервопривода и держалку для батареек. Вся остальная мелочёвка у меня лежит в куче всякого другого хлама. Итого десять баксов — это ещё с запасом. Кстати, самой дорогой вещью в этом роботе могут оказаться батарейки ;)


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 на подстроечник для более лёгкой настройки датчика препятствий;
  • Предложите хорошие (маленькие и с защитой от дураков) коннекторы вместо гребёнки и предложите лучшее их месторасположение;
  • Подключение ИК светодиодов под центральным сервоприводом — плохая идея. На данный момент единственно хороший вариант — это их намертво припаять, что не очень удобно;
  • Чуть-чуть подвинуть электролит. Мне пришлось его наклонить, т.к. иначе центральная левая нога за него задевает;
  • Добавить тестовых площадок с лёгким к ним доступом осциллографом;
  • Добавить пару отладочных светодиодов для отладки без осциллографа;
  • Добавить площадок для пайки для всех неиспользуемых ног микропроцессора для отладки и дальнейшего расширения робота.

Заключение


Петя — это страшное веселье!


AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 48

    +1
    Интересно, а существует ли способ сделать что-то бегающее или катающееся, но чтобы было бесшумным? Просто любое жужжание двигателей пугает кота, а хочется сделать ему какую-нибудь игрушку.
      +4
      Мне кажется, что коту нормально пойдёт бантик на верёвочке :)
        +2
        Да, но бантик сам не бегает.
          0
          Ну жужжание — это быстро крутящиеся моторы и редукторы. Медленно крутящиеся моторы можно делать, но обычно это сложнее. В принципе, медленно крутящиеся шаговики вполне могут быть тихими. А для кота можно сделать что-то чисто механическое — натянуть верёвку через комнату, и пусть энергия, запасённая в каком-нибудь грузе, гоняет по этой верёвке туда-сюда каретку. Ну а с каретки висит бантик на верёвочке ;)
            0
            Тогда бантик на хвосте. Дешевле не бывает.
          0
          хочется сделать ему какую-нибудь игрушку

          Берём старый LCD-телевизор, вешаем на него Chromecast, запускаем одну из 100500


          игрушек

          Кошки уже который месяц лапают экран как угорелые.

            +2

            Зоопсихологи (ага, есть такие) считают, что коты должны иметь возможность словить то, за чем охотятся, ибо в противном случае у них может развиться что-то вроде комплекса неполноценности. Не знаю, насколько это правда, думаю сильно зависит от конкретных индивидов и времени воздействия (условно говоря, если он будет бегать 8 часов за чем-то, что не сможет словить, может и разовьётся).

              0
              Да, у меня есть плюшевая небольшая канарейка на резинке, так если быстро ей мотать из стороны в сторону кот на неё нападает. Но если не может поймать в течение 10 секунд, то теряет к ней интерес. А если давать поймать, вгрызться в неё, потом подёргать слегка и высвободить, потом опять имитировать активность, то кот может так очень долго играть.
                0
                По моему опыту, лазерная указка им таки не надоедает никогда, хотя зайчик они поймать и не могут.
                0
                а есть что-то такое для собак?
                0

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

                  0
                  В теории можно использовать бесколлекторные двигатели в редакции для стедикамов, но управление будет в разы сложнее
                  0

                  Спасибо, за отличный гайд и идею! Мой друг как раз погружает сына в азы программирования, более того хочет чтобы он именно с нуля начал собирать подобные штуки, так что отправлю ему ссылку, они точно оценят. Видимо придется ему 3Д принтер на день рождения подарить.


                  1. Почему решили сервоприводы делать общими? Если бы сделать что типа подвижных треугольников с одним сервоприводом на каждой ноге, была бы большая свобода движений, мне кажется.
                  2. На хабре был прикольный ходячий паук в 2012 году, но там автор аж 3-х позиционные ноги сделал (что, как мне кажется, избыточно)
                  3. У китайцев есть готовые комплекты для сборки таких, можно позаимствовать некоторые идеи.
                    +1
                    Тут весь смысл в том, что меньше сервоприводов сделать уже совсем трудно. Урезаем по-максимуму. Больше приводов — больше проблем. И в электронике, и в механике.
                      0

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

                        0
                        найдёте — поделитесь!
                          0

                          Вспомнил, у Lego mindstorm был условно шагающий робот с двумя моторчиками. Есть совсем простые, а вот посложнее: https://youtu.be/v6O-cvE7aDM

                            0
                            Красивый. Но уже нужны шестерни :(
                              0
                              Есть вот такое. Кот Коржевского.


                              Электроники (кроме одного резистора) не содержит, моторов два — один в гироскопе (можно заменить на мотор от жесткого диска и выкинуть редуктор), второй можно заменить шаговиком (но тогда потребуется контроллер)
                            +2

                            В книге "От идеи до модели" Заваротова В.А. есть несколько примеров шагоходов с одним движком и одной с степенью свободы, а где-то в другой книге видел следующую схему: П-образная рама с обоих сторон корпуса позволяет модели шагать, а снизу расположены ножки на поворотном механизме, что позволяет развернуться. Если интересно, могу нарисовать схему.

                            0

                            Шагающая кинематика с одной степенью свободы: https://youtu.be/fXXJ1LOqHEk
                            Если добавить ещё одну, то механизм сможет поворачивать.

                          +4
                          Да, забыл сказать. Если погружать в азы программирования, то мой код может испугать, у меня нативный код с прямыми доступами к битам регистров и проч. Рекомендую портировать код под ардуино, прежде чем давать его подростку. Это уберёт всякий ужасный ужас ШИМ-модуляции, доступа к АЦП и всяких прерываний.
                          0
                          Спасибо за описание разработки! Всё достаточно наглядно.
                          Насчет «сделать за выходные», полагаю это осуществимо при скиллах, полученных заранее гораздо больше, чем «одни выходные»: Покупка, настройка и использование 3Д-принтера, программирование Ардуино.

                          Вопрос, как Вам пришла в голову текущая кинематическая схема Пети? Чем-то может быть вдохновились или как пришли к ней? Получилось достаточно экономно по количеству двигателей и при этом функционально
                            0
                            Не Васи, а Пети! На самом деле,
                            1) кинематическая схема очень известна. Например, всего за $72 :) вы можете купить вот такое.
                            2) более того, идея конкретно этого робота не моя. Оригинальный робот был опубликован семь лет назад, но от него не осталось ничего, кроме фотографий. Даже схема подключения к cheapduino канула в Лету. Мне он настолько понравился, что я решил детально описать все этапы постройки, и дать готовые к производству файлы.
                            3) про одни выходные — это конечно, не включает в себя процесс обучения. Более того, у меня процесс занял несколько больше, покуда я отлаживал то, да сё, да код писал. Но теперь, следуя моему тексту, вполне реально воспроизвести этого робота за несколько часов.
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                Не, ну если мы возьмём условного танцора балета, который паяльник в руках не держал, то он совсем долго возиться будет. Про сто баксов это вы загнули. В любом фаблабе вам местные гики бесплатно распечатают эту мелочёвку. А, да, это же с людьми надо будет разговаривать ;)
                                Десять плат у китайцев стоят десятку с доставкой. Да, я предполагаю, что программатор и компьютер уже есть и покупать их не надо!

                                Я не бизнес сюда делать пришёл. Если кто хочет продавать наборы, флаг ему в руки.
                            0
                            А как вообще ведут себя ИК датчики в плане надежности?
                            Я вот китайские как-то взял (те что в статье на усилителе LM393), короче шумят они от чего угодно то лампочка посветила, то солнце моргнуло и все, настройка уже сбита.
                            Как по мне, лучше уж зажигать ИК диоды на частоте 38кГц (как в пультах тв), а в качестве приемников взять какой нибудь TSOP4838.
                            P.S. Не очень понятно почему в тэгах ардуина, если писалось все на avr-gcc :)
                              0
                              А что значит — настройка сбита? Да, могут поймать засветку, да, на улице работать вряд ли будет, по крайней мере, в солнечный день. Но стоит засветку убрать, так они опять возвращаются к предыдущим показаниям?

                              А в тегах не «ардуино», а «ардуино головного мозга»! Не как среда разработки, а как философия «тяп-ляп, сойдёт». Термин не мой, есть некоторые умные дяденьки, которые презрительно отзываются о не-специалистах в электронике. А мне термин нравится, меня описывает довольно точно :)
                                0
                                Ну имеено то и значит, настроил например на сработку при 5 сантиметрах до препятсвия. Но тут в окно посветило солнышко, и все уже не работает, так-как на входе и так уже максимум от засветки.
                                По ардуине понял, тогда норм :)
                                  0
                                  Никакой датчик не даст вам идеала. Такой датчик на ИК не видит прозрачные и чёрные объекты, и засвечивается солнцем. Ок. давайте ультразвук, он солнцем не засвечивается. Зато он не видит ткани и вообще стену видит только если прямо на неё смотрит, стоит под углом посмотреть и всё, эхо уходит мимо датчика… Надо искать компромисс между кучей параметров.
                                    0

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

                                      0
                                      Я, если честно, в прмещении не видел проблем с засветками и с обычным ИК. Но у нас солнца мало :)
                                0
                                Есть довольно дешевые ИК дальномеры sharp серии GP2XX, где XX это тип датчика, в зависмости от типа меняются физические размеры и максимальное и минимальное измеряемое расстояние. Выходной сигнал подключается к АЦП, в даташиде есть график зависимости от расстояния, единственный минус он не линейный и придется делать аппроксимацию. На практике на этот датчик внешние условия влияют сильно меньше, чем у связки светодиод+фотодиод. image
                                  +1
                                  И он даже упомянут в статье ;)
                                +1
                                мне нужен такой же) надо делать
                                  0
                                  Вот как это должно выглядеть в конечном итоге:
                                  youtu.be/Zuc62lLk6kQ?t=402
                                  :)
                                    0
                                    Четырёхного я тоже делал, правда, не такого большого :)
                                    +2
                                    Напомнило шикарных пауков из скрепок Мегабизона. Они там хоть, в основном, и без мозгов, но красавцы! :)
                                    Шалтай
                                    image
                                      +1

                                      Забавный таракашка получился.
                                      Что можно улучшить:


                                      1. От кварца действительно можно избавиться, встроенный RC генератор может работать на той же частоте в 8 МГц. Тогда еще уйдут С4, С5 и R1.
                                      2. Батарею лучше заменить на Li-on и поставить плату зарядки от USB, например TP4056.
                                      3. Поставить коннекторы типа XH2.54 (JST). Тот же шаг гребенки, но есть защита от подключения не той стороной.
                                      4. Питание сервоприводов можно коммутировать полевиком (лучше P-канальным, по питанию — например ao3401).
                                      5. В Arduino IDE можно нативно компилировать код для gcc-avr, по крайней мере это работает с Atmega328p и Attiny13. Скетч в таком случае выглядеть будет примерно так
                                        +2
                                        1. Нельзя! Нельзя избавляться от кварца.
                                        Сервы генерят немеряное количество шума, процессор будет работать нестабильно или зависать при питании от встроенного RC генератора. Это уже проходили в регуляторах оборотов (esc) — регули без кварцев значительно хуже по стабильности, чем регули с кварцем. Кварц стоит копейки, смысл понижать надёжность?

                                        С остальными вашими замечаниями, в целом, согласен.
                                          0

                                          Возможно, стоит уделить больше внимания разводке питания и земли мк? С сервами не работал, но делал платы с GSM-модулями, где мк питался от RC, проблем при этом не наблюдалось.

                                            0
                                            У серв искрит коллектор, и очень сильно мешает жить МК, у меня не зря там конский электролит стоит. В принципе, без кварца работает должно, но насчёт надёжности не думал.
                                              0
                                              Может, LC/RC снабберы имело бы смысл навесить на серв?
                                                0
                                                Я и слов-то таких не знаю :)
                                                  0
                                                  -----[==]----||--- простейший снаббер выглядит так, т.е. RC цепочка прямо на выводы электродвигателя параллельно ему, резистор 47 ом/0,5 Вт и керамический конденсатор на 0.1 мкФ/50 В
                                                  0
                                                  Оно уже есть в серве обычно — но не сильно помогает.
                                          –3

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

                                            +9
                                            Дядь, а дядь, я автор и английского текста, и русского. Не надо мне рассказывать про корявый перевод ;)

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

                                          Самое читаемое