ARDUINO для детей: "как Лего"

Насколько полезна тема и стоит ли расписывать детально далее?

  • 1. Полезно и очень, внимательно слежу за дополнениями. Аффтар! пиши исчо!

  • 2. Может кому-то и полезно, лично мне нет, я уже вырос, обучать? Есть кружки, школы..

  • 3. Может кому и полезно, но сам повторять не собираюсь, полно готовых изделий.

  • 4. Фигня и мазохизм. Проще купить готовое, тема бесполезна.

  • 5. Тема вредна, учит делать своими руками - кто покупать будет то, что я продаю?

  • 5. Мне все равно. И вообще читать не умею, а картинок мало.


Результаты будут видны только после голосования.

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
@Тоха, это ЗНАЧИТЕЛЬНО лучше EV3 :)

А самое главное, эффективно решает вопрос правильного обучения программированию, конструированию и проектированию изделий т.с. "робототехники", начиная с того самого "малого возраста" 8-9 лет.

Одна из проблем EV3 - скретчи, визуальная среда программирования. Мало того, что она глючная сама по себе, что часто не позволяет реализовать нужный алгоритм, и что мало где можно найти при подготовке к соревнованиям. Так она ещё с самого начала приучает детей к "визуальщине", и шаблонному мышлению с полным отсутствием пониманий что происходит внутри камня!
Вот это последнее - лично сам считаю открытым вредительством, а преподаватели, с кем имел удовольствие пообщаться за эти 3 года, практически в один голос плачутся за одно и тоже: "Понимаете, они потом вырастают, приходят на большое программирование и .. не хотят даже учить язык! Зачем? тут же вот раз-два и готово, собрал их кубиков. Это очень серъезная проблема визуальщины как начального этапа".

Да, тут точно также было сделано много готовых "кубиков", в т.ч. и со стороны программирования. Да и начинал наш тоже с визуальщины - Ардублок. Но! Ардублок имеет неоспоримое достоинство в том, что он сам прошивку не делает, а является только "преобразователем" в код Wiring Ардуино. Компилируется все равно программа на Си. И вот это - важный момент: ребенок ВИДИТ что получается из готовых кубиков, имеет интерес разобраться в этом и .. перейти на прямое программирование на языке и, зачастую даже БЕЗ Wiring.
Собственно поэтому для нас "робототехника" в целом - "пройденный этап" и сын уже с головой ушел в Питон и программирование игр. Уже сделал 2 полноценных игры т.с. "для себя и школы" (как часть зачета по программированию, которое у них только началось с сентября этого года - уже "сдал"). :)
 

Roman_S

★★✩✩✩✩✩
25 Сен 2019
115
52
собственно утверждение, что "визуальное программирование вредит классическому" довольно спорно )
вопрос среды разработки, как и уровня погружения в софт-железо довольно философский и определяется с одной стороны интересом, с другой стороны поставленной задачей.

давайте детей заставим в машинных кодах программировать периферию на низком уровне )
или сходу в жестком ООП заставлять ваять асинхронный обмен данными между высоконагруженными серверами ))

на начальном уровне у детей обучение определяется во многом самой программой обучения, квалификацией преподавателя, создаваемой атмосферой в процессе, то есть целой экосистемой... а уж на каких железках и как - это вопрос вторичный.
вот например какое есть из последнего запомнившегося https://microduinoinc.com/
 

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
собственно утверждение, что "визуальное программирование вредит классическому" довольно спорно )
вопрос среды разработки, как и уровня погружения в софт-железо довольно философский и определяется с одной стороны интересом, с другой стороны поставленной задачей.

давайте детей заставим в машинных кодах программировать периферию на низком уровне )
или сходу в жестком ООП заставлять ваять асинхронный обмен данными между высоконагруженными серверами ))

на начальном уровне у детей обучение определяется во многом самой программой обучения, квалификацией преподавателя, создаваемой атмосферой в процессе, то есть целой экосистемой... а уж на каких железках и как - это вопрос вторичный.
вот например какое есть из последнего запомнившегося https://microduinoinc.com/
1. Спорность утверждения .. оно не мое. За что купил за то и продал.
2. А я так и поступил. Сначала дал сыну "основы Си", и мы с ним накатали пару программок для его самобеглых тележек, попутно дал как это все раскладывается на битики и байтики, линковку, сборку, сколько чего стоит в машинных кодах, показал итог в реассемблере и только потом мы полезли в Ардублок. Не, полноценно Си с нуля он не учил. Только для "показать внутренности" процесса.

Уже после освоения Ардублока и написания им своей "призерской" программы с "торможением в режиме ABS" практически самостоятельно, он получил "блок-схемы" и ДРАКОН в полном объеме. Мне пришлось только запилить конвертер к ДРАКОН на Ардуино.
Зато сейчас, вопросов как таковых нет, хоть и Питон.

3. ООП на начальном этапе - кмк, не менее вреден чем визуальщина. Вон, на профи форумах читаешь ляпы типа "ООП - методология программирования в виде МОДЕЛИРОВАНИЯ объектов реального мира" - ИМХО, дурь несусветная. Т.к. объекты, классы ООП - это несколько иное и существенно ширее. Да, выросло из задач моделирования, но .. и только.

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

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

5. Да. Экосистема и грамотность преподавателя - это очень важно. То. что по ссылке - один из вариантов. Идея - та же что и в этом проекте - убрать лишнее, то что "не по возрасту".. спасибо, интересно.
 

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Поясню про асинхронность:
Ну вот его "призерская программа" движения по линии (6 секунд трасса Робофест-а) .. она ведь не на ПИД регуляторе практически!
Основу составляет цикл, в котором крутится:
а) опрос датчиков линии с фильтрацией и усреднением значений - конечный автомат с циклом в 2 миллисекунды;
б) опрос датчика препятствия также с усреднением и тоже КА с циклом в 8миллисекунд;
в) управление драйвером моторов - и тоже КА с циклом в 8-16миллисекунд, настраивается;
г) собственно алгоритм движения - вычисление текущей ситуации скоростей моторов по анализу снятых показаний.
Последний прост, с учетом того что все исходные данные готовятся не им и асинхронны, и его результат точно также используется асинхронно..
Едем прямо или в повороте. Прямо - выравниваем скорости и разгон до разумного состояния.
В повороте - смотрим крутизну по разнице с предыдущим состоянием алгоритма / потерей линии и либо тормозим с АБС либо поворачиваемся, беря текущие значения параметров из настроечного массива согласно ошибки движения от линии и скорости её нарастания.
5 датчиков = 11 состояний * 2 типа скорости нарастания (уход с линии / приближение) = 22 ячейки по 2 комплекта данных: П и Д коэффициенты (почти).
Всё.
:)
 

Roman_S

★★✩✩✩✩✩
25 Сен 2019
115
52
технические детали это все-таки для гиков )

основная задача при обучении детей - это инициировать интерес и потом его развить и не загубить
а уж каким образом, это и есть магия и мастерство учителя ))

у меня вон есть своя концепция на эту тему, жизнь покажет, на сколько удачная
https://community.alexgyver.ru/threads/espboy-dlja-igr-i-ehksperimentov-s-iot.1772/#post-13414

вот гайвер шарашит свои видео и обучалки, очень все бодрые и мотивирующие, ну и всю инфраструктуру попутно правильную, с исходниками, форумом и прочим!
молодчина и всякий ему респект!
 
Изменено:

Roman_S

★★✩✩✩✩✩
25 Сен 2019
115
52
@Arhat109
традиционные соревнования по типу тележек по линии навевают жуткую тоску )
собственно и как все эти PID регуляторы или альтернативная математика...

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

тут я вашего сына очень хорошо понимаю )))

мне думается, что нужно много простого, законченного, яркого и прикольного.
вот как в видео гайвера
это увлекает )
 
Изменено:

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
@Roman_S, ну мы не только в тележках по линии развлекались ..

Разные доставки грузов, лабиринты, задачи под WRO на Лего. И не только на "колесиках". Последние призовые места - шагающие роботы, начиная с совенка с фотографий. Он как раз на Ардублоке программировался им полностью. Просто это все уже в прошлом.

И по большей части по вине организаторов соревнований, кмк. Пропадает желание уступать места "особенным детям". Сейчас, так вообще ему на место практически "все равно какое". Он ещё у нас "спринтер" областного значения (3-й взрослый разряд в прошлом году) .. сегодня были соревнования по бегу .. -"Какое место хоть занял?" -"А не помню, не смотрел. Было бы 100м пришел бы первым, а так .. не моя дистанция - 500м, да ещё и кросс. Третий кажется, не помню. Все равно".

Сейчас вот его в школе блатуют на Робофинист в микроСумо .. лично я его интереса не увидел, по крайней мере такого же как в разработке игр на Питоне.
 

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Ап. Откопал таки какие-то коробки из наших поделок .. на выходных перефотаю и продолжу дополнять отдельные посты. По крайней мере нашел коробку с моторчиками. :)
 

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Перечитал крайние посты .. я бы не сказал, что "навевают скуку и жуткую тоску" .. там есть несколько уровней понимания процесса .. да и результат, что называется "на лице": детям очень азартно гонять тележки чья придет первой. А когда кончается резерв первого уровня - простейший алгоритм "что вижу, то пою" и тележка перестает держать линию (примерно с 70см/сек), и ты им даешь "подсказку друга" - трение на колесах .. надо бы как-то .. начинается полет фантазий ..
Аналогично, когда кончается вторая модель (ПИД-регулятор), опять же понимание где и почему она кончилась (около 1.5м/сек) а также понимание что на такой скорости любая тележка будет уходить в занос .. очередной полет фантазии вплоть до решений "а давайте ехать в управляемом заносе на двух колесах!"
:)
 

Roman_S

★★✩✩✩✩✩
25 Сен 2019
115
52
@Arhat109, из нашего обсуждения видно, что вам то это очень интересно, а мне не очень )
но при чем тут мы с вами, если речь идет о детях!

отсюда вывод простой:
"удерживать интерес и развивать его - это непростая задача и непростое искусство".
и это вопрос, лежащий совершенно не в плоскости железок и тележек )

еще есть следствие вывода:
"в качестве хобби люди стремятся заниматься тем, что им нравится вне зависимости от каких бы то ни было логических конструкций" ))
 

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
@Roman_S, ну .. кроме своего у меня есть очень небольшой опыт подтягивания детей из его соревновательных команд, а также небольшой опыт преподавания детям Ардуино .. правда очень небольшой.

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

Ну а насчет "хобби" .. как-то всю сознательную жизнь, любую свою деятельность старался обрастить "интересом" и превратить в хобби. К примеру, Вы в курсе сколько способов существует забрасывания штукатурного раствора обыкновенной совковой лопатой в бетономешалку?
(* мой ответ от 1982года: 23 :) *)
 

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Как и обещал добавил фотографии и описания. Пока только в пост №7 про моторы, под спойлером.

Нашел наш "универсальный мотор-редуктор с энкодером", держите:
УнимоторЭнкодер2.jpg

Габарит - 24х24х88мм (3х3х11 "лего дырок"). Имеет конструкцию Арудуредуктора (желтый), на последнюю ось одет оптический энкодер от Downsol strong motor - надо же было их как-то пристроить! :)
Крышка редуктора - съемная, что позволяет менять ему шестеренки и получать разные редукторы с передаточным отношением от 27:1 до 160:1 или около того, не помню. Есть "таблица Excel" где проводится полный расчет "автоматом" от передаточного отношения до скорости вращения и максимального момента в зависимости от примененного мотора.
Мотор тут тоже "сменный" :)
В среднем, в диапазоне 30..60:1 и применении самодельных моторчиков этот мотор-редуктор имеет около 3вт механической мощности на валу, что несколько больше классического EV3 Large motor, но имеет габариты EV3 servo motor.
Поскольку энкодер стоит на предвыходном валу, а там шестернеки не сменные, то скорость его вращения не зависит от передаточного числа и всегда примерно в 6 раз выше чем обороты выходного вала.
Точность позиционирования - около 6 градусов.
:)
 
Изменено:

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
УнимоторЭнкодер3.jpg

Ещё его фотка, извиняюсь что плохо снято, других нету..
 

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Не понимаю как пользоваться редактором постов .. пост №7 так и не смог привести в порядок. Теперь там торчат все миниатюры в конце поста, а надо, чтобы они стояли на месте картинок. Попытка "удалить" приводить к удалению как миниатюры так и самой картинки из сообщения .. одну уже так снес.
Если из модераторов кто-то может помочь - буду благодарен. Спасибо.
 

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
@Wan-Derer, так можно убрать картинку из текста. Пгобовал. :) Но, если их убирать из текста, то как-то надо втыкнуть на это месту миниатюру, которые вот внизу, скопом. А миниатюры снизу поста как-то поудалять нафик... как? :)

P.S. о.. спасибо за то что убрали миниатюры снизу поста. Тоже не понял "как" .. :)
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,132
412
Москва
wan-derer.ru
@Arhat109, Как текст. Если надо вставить картинку, ставишь курсор на то место куда надо вставить и в списке картинок жмёшь "вставить".
Если надо удалить картинку из текста, ставишь курсор перед картинкой и жмёшь DEL
 
  • Лойс +1
Реакции: Arhat109

Chaika

✩✩✩✩✩✩✩
29 Окт 2019
1
1
Проект просто супер! Постораюсь повторить в ближайшее время.
 
  • Лойс +1
Реакции: Arhat109

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Пробуйте, интересно что у Вас получится. В Сети видел несколько таких вариантов, а освновном на базе обычного Лего. Их недостаток - недостаточная прочность соединений обычных лего-кирпичиков. Техник в этом плане гораздо интересней.
Но, там есть и сильное достоинство - удобство изготовления и оформления деталек.

Как обычно, с чего начать?

1. Возьмите за прототип наши платы Arduino-NANO в оформлении лего. Это самое простое (и полезное) как оказалось из всех ардуино-плат. Расширительный шилд и его схему стабилизатора - выложу в ближайшее время, просто я её не рисовал даже, делал по даташиту на LM2593-ADJ, но сейчас у нас есть стабилизаторы и лучше и меньше - RT8289 сильно рекомендую затариться именно этими. Держат 5в с токами нагрузки до 5А очень надежно, мелкие, греются слабо и из-за высокой частоты преобразования требуют элементы меньших габаритов.

2. Драйвер двигателя. Ну куда в этом проекте без моторчиков? :) Есть его схема, разводка для домашнего изготовления, выложено в соотв. посту. Тупо повторяете и получаете "лучшее на сегодня". Мосфетные полумосты АО4606, можно ещё АО4616 (эти даже получше) стоит заказать на Али штук 50 сразу. Драйверов может понадобится не 1шт :) У нас их с десяток и без работы не лежали практически.

3. Моторчики. Самое простое - начать с Lego Power Function серии. Large мотор к сожалению у нас оказался не разборным, и его пришлось делать как на фото - резать провод. Medium моторы этой серии разобрались легко, поэтому были сделаны иначе. Сами моторчики можно точно также заказать на Алиэкспрессе - это примерно вдвое дешевле чем покупать оригиналы.
Браться за изготовление мотор-редукторов на начальном этапе - сильно не рекомендую. Там требуется точность позиционирования осей мотора менее 0.1мм, и модуль шестеренок лучше брать 0.5 - их просто полно на али, если все же возьметесь.
Могу выложить размеры деталек под редукторы, которые у нас оказались "лучшими"..
Желтые мотор-редукторы от Ардуино проектов - лучшее, что можно купить готовое. Но их прямое применение в проекте крайне неудобно из-за неудачного габарита и размеров.

4. Датчики.
4.1 ИК датчики лучше делать самим. То, что продается на Али - барахло откровенное. Они очень просты, к ним нужен только ОУ, подойдет любой, самые дешевые это LM358 по 2 ОУ в одном корпусе. ИК-свето, фото- диоды лучше брать сразу комплектом, они будут лучше соответствовать друг другу. Тоже можно сразу брать партию в 50шт (по 1руб/шт! или около того).

4.2. Узв. датчик HCSR-04 .. тут надо не ошибиться. Их продают несколько разных схем, есть откровенное барахло. Мне как-то повезло сразу, но встречал в Сети много нареканий .. тут не помогу, ибо не знаю КАК выглядят правильные и чем отличаются от "упрощенных".

4.3. Датчики цвета - лучшие, как понимаю это TCS-3200. У них кривое управление, но тут можно использовать ту библиотеку, что есть в теме. Она работает с ними "на ура". К сожалению, в габарит лего плату придется слегка "подтачивать" по краям. Благо есть небольшой запас..

4.4. Датчики касания (кнопки) .. кажется выкладывал наши на базе кнопок с разбора старых мышей. У нас зарекомендовали себя с самой лучшей стороны. Мелкие, удобные. Сделал ещё фоток, выложу в ближайшее время последний релиз датчиков касания..

4.5. Гироскопы, компасы, погодные и прочие датчики .. не описывал, поскольку ничего особенного их адаптация не представляет, модули не требуют "внешних" деталек, как например те же кнопки или ИК-датчики .. просто приклеивали лего детальку и ставили куда-то внутрь изделия..

4.6. Микрофоны. О .. были у нас "уши" робота, которые вертелись на серводвигателе и разворачивались в сторону макс. уровня приема сигнала .. было смешно даже.

5. Серво двигатели.
5.1. Ну конечно же во-первых SG-90 или им подобные! :) Их оформление приводил в соотв. посту, но .. оно недостаточно удачное. Придумать что-то лучше у нас не получилось. Ну и слабоваты они для Лего все же.

5.2. К ним очень хорошее подспорье это сервы следующего класса, типа 3003 (5-7кг*см) и ещё мощнее типа MG595 кажется (ок 12-15 кг*см). С последними надо быть крайне осторожными, соблюдать ТБ, ибо они легко ломают лего детальки, равно как и прищемляют плохо подставленные пальцы. И те и другие имеют одинаковый типоразмер - стандартный для серв..

Управление сервами простое, но .. вот тут как раз нужен хороший стабилизатор самой платы, т.к. даже мелкая SG-90 в режиме удержания легко жрет до 0.8А и в одиночку высаживает в ноль типовой стабилизатор плат Ардуино, что приводит к неконтролируемым перезагрузкам и отказам ПО.

6. Светодиоды .. тут у нас использованы мелкие 3мм светодиоды, тоже закупались набором из 300шт .. они очень хорошо вставляются в обычные лего-кирпичики вместе с гасящим резистором, что позволяет их использовать прямым подключением к Ардуино. Тоже сделал фотки, выложу в ближайшее время.
Есть комплект по 4шт: белые, красные, желтые, зеленые и синие.
Есть ещё 3-х цветные, но мы их так и не запилили в лего-детали...

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

P.S. Если хотите сделать что-то мощное на базе Мега2560 .. то сильно рекомендую мою плату (тут есть тема) с возможностью расширения ОЗУ до 512 килобайт. Но .. это уже "высший пилотаж", тут надо будет переходить в тут тему и консультировать уже там :)

Если есть вопросы - пишите, не стесняйтесь, можно тут, можно в личку.
 
  • Лойс +1
Реакции: Wan-Derer

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
По ультразвуковым датчикам, дополню:

1. Их недостаток - типовой способ измерения дальности, тиражированный везде, где только можно. Во-первых, он - кривой откровенно и измеряет очень не точно, во-вторых, он просаживает исполнение программы пока не закончит замер, что достаточно критично для практически любого применения в самобеглых тележках даже для задач "объезд препятствия".

Замер надо делать исключительно или по прерываниям или на базе таймера (режим захвата сигнала). В этом случае точность замера составляет единицы миллиметров даже на расстояниях под 5 метров. И такой способ замера НЕ тормозит программу - замер идет "фоном".

2. Ещё один недостаток - широкая диаграмма срабатывания, что намного сильнее влияет на их точность. Решается путем одевания на излучатель и приемник фетровых конусных насадок, глушаших сигнал в боковом направлении. Но, это надо делать очень аккуратно, т.к. при сильном ограничении направленности излучателя и приемника падает чувствительность и дальность.

В остальном датчик очень надежный, проблем не вызывает. п.2. можно игнорить, особого интереса не представляет. Делалось в плане экспериментов что можно улучшить в этом девайсе .. в общем-то и так хорош. :)
 
  • Лойс +1
Реакции: Wan-Derer

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Ну и ещё:

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

Применение: датчик потери опоры ногой робота. Например, когда он пытается свалиться за край стола и опуская ногу .. не находит опоры. :)
 
  • Лойс +1
Реакции: Wan-Derer

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Ну и ещё. На все эти эксперименты требуется приличный запас самих лего-деталек. Решений несколько:

1. Алиэкспресс с аналогами. Есть разного качества, лучшее что нам понравилось наборы Lepin. но, надо критически выбирать продавана, смотреть отзывы. Попадаются подделки под Лепин :) Стоимость примерно в 2 раза ниже оригинала, есть крутые наборы с электрикой серии Power Function, например такие наборы как Lepin 20006, 20007, 20085, MOC Shaman (Lepin 23011), МОС Maroder (23007) и др. с кучей электрики и р/у от Power Function.

2. Докупка поштучная того, что надо. Тут могу порекомендовать сайтик"Лего поштучно" (раздел Parts) там можно выбирать "продавец из России", чтобы не париться с разного рода "преобразованиями" и доплатами за пересылку. Есть вполне вменяемые продавцы, с которыми работал на протяжении нескольких лет.
Там, есть шанс нарваться на неоригинал, но небольшой. В основном это распродажа из Лего-магазинов по всей стране разного рода некомплектов, неликвидов и непроданных наборов "поштучно" .. если разобраться с сайтом, то можно отслеживать изменения и докупаться раза в 2-3 дешевле чем наборами лего в магазинах.
Рекомендую, но это муторно, особенно на начальном этапе. :)
 
Изменено:

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Пока вставлю как новый пост, позже возможно перенесу куда следует то что нашел и зафотал на телефон, уж как смог, не стреляйте в пианиста, он играет как умеет :)

Новые и последние датчики касания. На контактах кнопки от мыши припаян резистор, номинал не помню, что-то около 4.7кОм:
Датчик касания новый.jpg

Последняя версия ИК-датчика с регулировочным резистором и отдельным выводом под освещение ИК-светодиодом. Можно как тут, воткнуть дополнительный резистор, чтобы не так ярко светило (базовое ограничение внутри - около 50мА) и/или подключать на управляющую ногу, чтобы включать его только в момент замера:
ИК-регулировка1.jpg

Первая версия светодиодов. Гасящий резистор под термоусадкой:
Светодиод ранний.jpg

Линейка светодиодов. Изготавливалась специально под машинку для соревнований. На каждый датчик - свой светодиод:
Светодиоды блок5.jpg

Те самые 3мм светодиоды для светофоров и прочего применения. Оказались очень удобны. 3мм светодиод, чисто входит в стандартное отверстие кирпича 1х1х1 лего, а гасящий резистор SMD - во втором кирпиче. На лего кирпич одевается прозрачный круглый светофильтр все из того же лего, что придает законченный вид изделию.
Тут гасящие резисторы подбирались специально так, чтобы яркость свечения разных цветов была примерно одинаковой. Где-то лежит табличка .. найти бы. :)
Светодиоды новые.jpg

Ну вот .. в основном вроде бы всё зафотал.
 
Изменено:
  • Лойс +1
Реакции: Старик Похабыч

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Нашел ПО нашей тележки по линии. Выкладываю код управления моторами с защитой от сквозных токов и одновременным управлением группой моторов. Переделал под явное описание групп моторов. Компилируется, остальное не гонял заново после переделки на "группы":
C:
/**
* Микропаузы переключения драйвером мотора туда-обратно в микросекундах
* Первая - время отключения нижних мосфетов драйвера - более 500нсек!
* Вторая - время отключения верхних мосфетов - более 2мксек! В среднем, втрое дольше..
* Тут задано больше для надежности..
*/
#define DRV_MICROSTOP     3
#define DRV_MICRODIR      (DRV_MICROSTOP * 3)

/** Направления вращения мотора @see drvIsRun(num); */
#define DRV_ISSTOP   0
#define DRV_FORWARD  1
#define DRV_BACK    -1

/** Допустимая минимальная скорость вращения ABS(Pwm), если надо.. */
#ifndef DRV_MIN_SPEED
  #define DRV_MIN_SPEED 0
#endif

/** допустимая наибольшая скорость мотора ABS(Pwm): [-255..+255] */
#ifndef DRV_MAX_SPEED
  #define DRV_MAX_SPEED 255
#endif

/** Описание мотора и текущая скорость */
typedef struct _dvr_motors_ {
  uint8_t dir;    // пин направления
  uint8_t pwm;    // пин скорости (ШИМ)
  int     speed;  // текущая скорость
  int     old;    // "предыдущая скорость"
  bool    change;
} DrvMotors;

/** Приведение указателя к структуре и получение адреса нужного мотора */
#define ptrDrvMotor(p)     ((DrvMotors *)(p))
#define ptrDrvMotors(p,n) (((DrvMotors *)(p))+(n))

/**
* Подключено всего моторов к проекту (драйвера на 2 или 4 мотора или сколько моторов всего)
* по умолчанию - 2 мотора.
*/
#ifndef DRV_MAX_MOTORS
  #define DRV_MAX_MOTORS    2
#endif

/**
* @global - Единый массив всех моторов проекта для всех драйверов, если их больше 1
*
* По умолчанию всего 2 мотора: к 4,5 и 6,7 пинам НАНО(328)
*/
#ifndef motors
DrvMotors motors[DRV_MAX_MOTORS] =
{
  { 4, 5, 0, 0, false},
  { 7, 6, 0, 0, false}
};
#endif

/** Удобства для: */
#define drvPinDir(n)     (motors[(n)].dir)
#define drvPinPwm(n)     (motors[(n)].pwm)
#define drvSpeed(n)      (motors[(n)].speed)
#define drvOldSpeed(n)   (motors[(n)].old)
#define drvIsChange(n)   (motors[(n)].change)

// ==================================== DEBUG SECTION ========================================== //

/**
* Проверка(вывод) данных по моторам в монитор
*
* @param bool isAll -- выводить всё или только скорости?
*/
void drvPrintMotors( bool isAll)
{
  for(int8_t i=0; i<DRV_MAX_MOTORS; i++)
  {
    if( isAll ){ Serial.println(); }

    Serial.print("m="); Serial.print(i,DEC);

    if( isAll ){
      Serial.print(", chg="); Serial.print(motors[i].change, DEC);
      Serial.print(", old="); Serial.print(motors[i].old,    DEC);
    }

    Serial.print(", spd="); Serial.print(motors[i].speed, DEC);
  }
}

// ==================================== PRIVATE SECTION ========================================== //
// но вдруг кому(когда) понадобится ..

/** private: Физический останов мотора без изменения данных о нем: */
#define _drvStop(num)                \
{                                    \
  digitalWrite(drvPinPwm(num), LOW); \
  delayMicroseconds(DRV_MICROSTOP);  \
}

/**
* private: Переключение заданного мотора c защитой от сквозного тока по его текущей скорости
* .. останавливает мотор физически, и НЕ меняет скорость у мотора!
*/
void _drvSwitchStop(uint8_t num)
{
   _drvStop(num);
   if( drvSpeed(num) >= 0 ){ digitalWrite(drvPinDir(num), LOW);  }
   else                    { digitalWrite(drvPinDir(num), HIGH); }
   delayMicroseconds(DRV_MICRODIR);
}

/** private: Включает текущую скорость физически и сохраняет её как .old */
void _drvSetSpeed(uint8_t num)
{
  analogWrite( drvPinPwm(num), abs(drvSpeed(num)) );
  drvOldSpeed(num) = drvSpeed(num);
}

/** private: Проверяет надо ли переключать мотор */
#define _drvMustChange(num) ((drvSpeed(num) < 0  && drvOldSpeed(num) >= 0) || (drvSpeed(num) >= 0 && drvOldSpeed(num) < 0))

// ==================================== PUBLIC METHODS ========================================== //

/** Возращает направление вращения мотора: -1 "назад", 0 - "останов", 1 - "вперед" */
#define drvIsRun(num) (drvSpeed(num) > DRV_MIN_SPEED? DRV_FORWARD : (drvSpeed(num) < -DRV_MIN_SPEED ? DRV_BACK : DRV_ISSTOP ))

/** Контроль скорости мотора по допустимым границам при управлении */
void drvMapSpeed(uint8_t num)
{
  if( drvSpeed(num) > DRV_MAX_SPEED      ){ drvSpeed(num) = DRV_MAX_SPEED; }
  if( drvSpeed(num) < -DRV_MAX_SPEED     ){ drvSpeed(num) = -DRV_MAX_SPEED; }
#if DRV_MIN_SPEED > 0
  // только если задана минимальная скорость вращения, иначе не зачем:
  if( abs(drvSpeed(num)) < DRV_MIN_SPEED ){ drvSpeed(num) = 0; }
#endif
}

/** Прибавлялка скорости мотору с контролем превышения пределов */
#define drvAddSpeed(num, step) \
{                              \
  drvSpeed(num) += step;       \
  drvMapSpeed(num);            \
}

/** Уменьшалка скорости мотора с контролем пределов */
#define drvSubSpeed(num, step) \
{                              \
  drvSpeed(num) -= step;       \
  drvMapSpeed(num);            \
}

/**
* public: Установить заданный мотор на новую скорость с переключением направления если надо
*/
void drvRunMotor(uint8_t num, int speed)
{
  drvSpeed(num) = speed;

  if( _drvMustChange(num) ){ _drvSwitchStop(num); }

  _drvSetSpeed(num);
}

/** public: остановить заданный мотор */
#define drvStopMotor(num) (drvRunMotor(num, 0))

// ================================ Групповое управление моторами ============================== //
// Время управления группой моторов практически одинаково с затратами на один мотор, в силу однократного
// включения пауз для переключения моторов из группы, также как и в управлении одним мотором.
// Группа - это количество моторов из глобала motors[] и их индексы в нем.
// Соответственно, группа может быть не привязана к одному драйверу мотора, но такое желательно.

/**
* Группа моторов, для единовременного управления @see grpMoveMotors(group);
* по умолчанию в системе 1 драйвер с 2-я моторами, которые и входят в группу по умолчанию
*/
typedef struct _grp_motors_ {
  uint8_t count;
  uint8_t *motors;
} GrpMotors;
/** Приведение указателя к заданной группе моторов */
#define ptrGrpMotors(p, num) ((GrpMotors *)(p) + num)

/** по умолчанию определяем 1 группу моторов с 2-я моторами по умолчанию 0 и 1 из глобала motors[] */
#ifndef motorGroups

uint8_t _grpWheels[2] = {0,1}; // определяем номера моторов "ведущие колеса" как 0 и 1 из глобала motors[]

GrpMotors motorGroups[1] = {
  {2, _grpWheels}
};

/** .. и совместимость с кодом тележки по линии */
#define drvMoveMotors() grpRunMotors( &motorGroups[0] )
#define drvStopMotors() grpStopMotors( &motorGroups[0] )
#define drvAbsStop(num) grpAbsStop( &motorGroups[0], num )
#endif

/**
* public: Одновременное(!) управление всеми моторами группы через MOSFET-драйвер(а)
*
* Самостоятельно контролирует переключение моторов вперед/назад и выдерживает все паузы переключений ОДНОВРЕМЕННО.
* Помнит предыдущую установленную скорость моторов.
*
* Назначение: максимально синхронное управление группой моторов.
*/
void grpRunMotors( GrpMotors * group )
{
  bool isStop = false;
  uint8_t num;
  uint8_t * motor;

  // 1. Надо ли переключать какой-либо мотор группы? и выключаем сразу тут
  num   = group->count;
  motor = group->motors;
  do{
    if( (drvIsChange(*motor) = _drvMustChange(*motor)) ){ // проверяем результат присваивания! не ошибка..
      isStop = true;
      digitalWrite(drvPinPwm(*motor), LOW);
    }
    motor++;
  }while(--num);

  // 2. Если останавливали мотор(ы) - держим паузу один раз
  if( isStop ){
    delayMicroseconds( DRV_MICROSTOP );

    // 2.1. .. меняем направление. Какому-то было точно надо..
    num   = group->count;
    motor = group->motors;
    do{
      if( drvIsChange(*motor) ){
        if( drvSpeed(*motor) >= 0 ){ digitalWrite( drvPinDir(*motor) , LOW );  }
        else                       { digitalWrite( drvPinDir(*motor) , HIGH ); }
      }
      motor++;
    }while(--num);
    // 2.2. .. держим паузу один раз для всех
    delayMicroseconds( DRV_MICRODIR );
  }

  // 5. И только теперь задаем скорость моторов и сохраняем предыдущую
  num   = group->count;
  motor = group->motors;
  do{
    _drvSetSpeed(*motor++);
  }while(--num);
}

/** public: останов всех моторов какие есть */
void grpStopMotors(GrpMotors *group)
{
  uint8_t num     = group->count;
  uint8_t * motor = group->motors;

  do{
    drvSpeed(*motor++) = 0;
  }while(--num);
  grpRunMotors(group);
}

/** public: Установка единой скорости моторам группы без управления драйвером! */
void grpSetSpeed(GrpMotors *group, int newSpeed)
{
  uint8_t num = group->count;
  uint8_t *motor = group->motors;

  do{
    drvSpeed(*motor++) = newSpeed;
  }while(--num);
}

/**
* public: ABS торможение всеми моторами группы, "жрет" по 30мсек на цикл торможения!
*
* @TODO Переработать под конечные автоматы из ka.h
*/
void grpAbsStop(GrpMotors * group, uint8_t absNum)
{
  do{
    grpStopMotors(group); // останов "на выбег"
    delay(15);
    grpSetSpeed(group, -160);
    grpRunMotors(group); // крутим назад
    delay(15);
  }while( --absNum );
  grpStopMotors(group); // моторы группы остаются "на выбег"
}

/**
* в Setup(): останавливаем моторы и выставляем их "вперед" с 0 скоростью
* .. перенесено из кода тележки для общности ..
*/
void setupMotors()
{
  uint8_t num=DRV_MAX_MOTORS-1;

  do{
    pinMode(drvPinPwm(num), OUTPUT);
    digitalWrite(drvPinPwm(num), LOW);

    pinMode(drvPinDir(num), OUTPUT);
    digitalWrite(drvPinDir(num), LOW);

    drvOldSpeed(num) = 0;
    drvSpeed(num)    = 0;
    drvIsChange(num) = false;
  }while(num--);
}
P.S. Упс .. переименовал функцию, заметил, исправил .. в т.ч. подчистил setupMotors().

P.P.S. Собственно так мы работаем с драйверами моторов из поста №8
 
Изменено:

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Шапка файла (побоялся что не влезет по объему поста):
C:
/**
 * Модуль работы с моторами и драйвером к ним "Ардуино как Лего".
 *
 * Плата драйвера не имеет аппаратной защиты от сквозных токов через силовые ключи моторов.
 * Основное назначение: управление моторами с учетом задержек на переключение силовых ключей.
 * При остановке мотора по линии PWM=0 (N-канал) реальная задержка ключа драйвера менее 1мксек.
 * При изменении направления (линия DIR, P-канал) реальная задержка ключа в районе 3мксек.
 * Здесь взято с запасом для надежности: + стекание токов с индуктивности моторов.
 *
 * Если ничего не задано до включения файла - предполагается создание типовой
 * глобальной структуры motors[2] на 2 мотора и работа с ними.
 *
 * DRV_MIN_SPEED - та минимальная скорость, при которой мотор ещё вращается под вашей нагрузкой реально.
 * Добавлено, дабы зря не расходовать батарейки.
 *
 * Скорость измеряется в единицах ШИМ (0..255) как "вперед" (больше нуля, >0) так и назад (меньше нуля, <0)
 * поэтому число целое.. нулевая скорость тоже считается как "вперед" при переключении направлений.
 *
 * @author Arhat109-20171009,
 * 20191208 -- добавлены комментарии, раздельное управление моторами.
 * 20191221 -- выделена работа с группой моторов как отдельного элемента. Моторы теперь можно собирать в группы.
 *
 * Группы моторов. Как их объявлять в ПО - показано тут.
 * По умолчанию создается группа из двух моторов _grpWheels,
 * которая и указывается в глобальном списке групп motorGroups[] как единственная из двух моторов.
 *
 * Функция ABS-торможения рассчитана на нашу тележку по линии. Параметры - подобраны экспериментально.
 */