Как стать автором
Обновить

«У Предназначения масса обличий...» или автоматизируем управление автолампой с помощью CANNY 3 tiny и фоторезистора

Время на прочтение12 мин
Количество просмотров3.6K
В прошлой статье на Хабре я рассказал вам о том, как получил в подарок контроллер Canny3 tiny. Мы «поморгали» светодиодом, понажимали на кнопку. На этом в принципе можно было и закончить эксперименты.

Однако, последние пару недель я слушаю аудиокниги про Ведьмака и поэтому стал намного серьёзней относиться к Предназначению. Согласно информации, указанной на сайте производителя — контроллеры семейства CANNY предназначены в первую очередь для автоматизации различных систем автомобилей и спецтехники.

Проблема в том, что меня с моими «золотыми руками» никто близко не подпустит ковыряться в настоящем автомобиле, да и вообще я автомобилей побаиваюсь. Поэтому пришлось специально для этой статьи прикупить маленькую автомобильную лампу и фоторезистор. Чего только не сделаешь чтобы не разгневать Предназначение.

Сегодня мы подключим контроллер и автомобильную лампу к источнику питания 12В, отправим сообщение в COM-порт, автоматизируем включение лампы в зависимости от освещенности и попробуем в деле высокочастотный ШИМ контроллера.

Тоже верите в силу Предназначения? Тогда милости прошу под кат.





Часть I: Введение


Часть I: Введение
Часть II: Комплектация и меры предосторожности
Часть III: Как писать данные в COM порт
Часть IV: Подключаем и программируем автолампу и фоторезистор
Часть V: Пробуем снизить яркость лампы с помощью ШИМ
Часть VI: Заключение

В самом начале статьи, напомню, что особого опыта в DIY электронике у меня нет. Много лет назад я баловался с CraftDuino — отечественным клоном Arduino. И не считая тех «поделок», что для меня делал DrZugrik этим собственно мой опыт в DIY электронике ограничивается.

Видимо, зная мою любовь к отечественным разработкам, мне решили подарить Canny 3.

Еще в процессе подготовки прошлой статьи, я удивился тому, что контроллер может питаться не только от 5В, но и от 12В, при этом напряжение на выходах будет такое же как на входе, а максимальный ток на 1 канал аж целых 100мА. Мне это показалось интересным, ибо моя старенькая CraftDuino так не могла.

Путем простых вычислений с помощью формулы $P=U*I$ я понял, что максимальная мощность на один выход контроллера будет в районе 1.2 Вт. Было принято решение подобрать лампу с запасом по мощности, на всякий случай. Выбор пал на светодиодную автолампу мощностью 0.9 Вт.

Однако, мне все равно не хотелось бесславно сжечь свой новогодний подарок и прежде чем её подключать, я решил спросить у разработчиков, правильно ли я всё понял.
К моему большому удивлению мне не только ответили, но еще и подсказали, что если объединить несколько выходов, то мощность увеличиться пропорционально. После этого было принято решение прикупить, что-то мощнее лампы и выбор пал на автомобильный вентилятор, который вставляют в прикуриватель. Однако, чтобы не сделать из статьи «винегрет», манипуляции с автомобильным вентилятором я решил отложить до следующего раза.


Часть II: Комплектация и меры предосторожности


Итак, к началу экспериментов я располагал следующим:

  • Зарядно-предпусковое устройство «Орион Вымпел-55». Оно у меня уже было в наличии и к счастью оно может не только заряжать аккумуляторы, но и быть источником питания в широком диапазоне (в том числе и 12 В);



  • Автолампа светодиодная «Skyway H3. SH3-9SMD-5050 W». Как я понимаю лампочка может использоваться в различных фарах, но мне её совать некуда, поэтому я выбирал по мощности и по удобству подключения без применения пайки;



    Кстати возвращаясь к формуле расчёта мощности, я решил измерить токи и убедиться, что укладываюсь в допустимые 100 мА. По идее ток лампочки должен бы быть $I=P/U=0.9/12=0,075A$.
    Но судя по замеру получилось чуть меньше. Хотя возможно я просто что-то не так сделал.



  • Фоторезистор ФР-765. Его я выбрал просто потому, что в магазине ничего другого не было.



Ну и само собой у меня были: контроллер, макетная плата, провода, «крокодилы» и т.п.

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

Поскольку паяльником я орудую очень плохо, мне хотелось свести его применение до жизненного необходимого минимума. Поэтому в итоге я все схемы собирал на разъёмных соединениях. Использовал специальные провода (папа-папа, мама-мама, мама-папа), макетные платы и зажимы «крокодилы».

И если в том, что в процессе зачистки кабеля я получил пару порезов разработчики контроллера не виноваты, то моменты, в которые у меня вся конструкция падала на пол из-за того, что я цеплял «деревянный» жгут, отчасти на их совести.

С одной стороны, жгут — штука хорошая. Для установки контроллера внутри автомобиля кабельный жгут думаю подойдет в самый раз. Провода в нем многожильные и если их хорошо скрутить, то они вполне влезают в разъемы «мама», моих «макетных» проводов. С другой стороны, как же с кабелем не удобно делать опыты с макетной платой, даже фотку красивую с контроллером, повернутым в анфас, было сложно сделать из-за «дубовых проводов».

Чуть выше я сказал, что не хотел пользоваться паяльником, но как минимум один раз им придется вооружиться.

Для того, чтобы измерить сигнал от фоторезистора, нам необходимо «завести» его в аналого-цифровой преобразователь (АЦП) контроллера. Но дело в том, что в отличии, например, от моей старенькой Craftduino. В случае с Canny оказалось необходимо поставить перемычку.

В начале я не внимательно прочитал документацию и думал, что 5 и 6 вывод контроллера это и есть выводы А5 и А6. Я даже написал программу и долго пытался снимать показания. Естественно у меня ничего не получалось потому, что по умолчанию без предварительной подготовки каналы № 5 и 6 работают в качестве обычного дискретного входа.

Прочитав документацию к контроллеру на «свежую голову», я понял, что всё-таки придется паять. Вы не представляете, как я боялся всё «запороть».
Последний раз, когда я что-то пытался припаять в схеме, которую для меня сделал DrZugrik, я умудрился залить припоем все конденсаторы рядом с местом пайки.
В этот раз процесс пайки был простым. Достаточно было очень аккуратно поставить капельку припоя на дорожку.

Как выглядит моя перемычка из припоя видно на фотографии ниже:



У меня подключен только 6 вывод к каналу А6, паять еще и пятый канал я не рискнул, дабы случайно не залить припоем обе перемычки.

Чисто теоретически можно было обойтись совсем без паяльника, соединив отверстие и вывод № 6 проводом. Но это было бы жутко неудобно.

На фото ниже показано соединение вывода № 5 и вывода АЦП № А5 проводом папа-папа:



Последней момент, на который стоит обратить внимание прежде, чем перейти к делу.

Внимание! Не стоит повторять один в один, то что я дальше опишу по тексту. Не поленитесь заменить разъемные соединения пайкой, подобрать более толстые провода, почитать документацию. Я не эксперт в этих вопросах, поэтому всё собрал «как смог». Также советую внимательно следить за пожаропасностью, и не оставлять без присмотра оборудование. Я пару раз умудрялся учуять запах тлеющих проводов. Хорошо еще в источнике питания была защита от короткого замыкания (его я тоже устраивал). Поэтому – пожалуйста соблюдайте осторожность.

Также не забывайте, что не смотря на то, что напряжения и токи у нас маленькие, всё-таки прикосновения к токоведущим частям под напряжением может быть болезненным (особенно если тыкаться в них пораненной частью тела).


Часть III: Как писать данные в COM порт


Для того, чтобы хоть как-то откалибровать наш датчик освещенности, нам необходимо понимать какие значения он шлет в контроллер в зависимости от уровня освещенности. Для этого, нам необходимо вывести данные с АЦП на монитор. При работе с Arduino и его клонами для решение подобных задач, я пользовался монитором COM-порта.

В случае с Canny 3 tiny процесс чтения данных из виртуального COM-порта, не сильно сложнее чем для Arduino. Но есть одно ключевое отличие. В среде разработки CannyLab нет своего собственного монитора COM-порта.
Я использовал Hterm, потому, что он кроссплатформенный, легкий и не требует установки. Но вы можете использовать любой другой.

Скажу даже больше, ничто не помешает нам использовать монитор COM-порта Arduino IDE.

У меня на системе с Windows 10 все заработало «из коробки» и мне не пришлось отдельно устанавливать драйвера для виртуального COM-порта. Но на всякий случай скажу, что похоже драйвер идет в комплекте со средой разработки CannyLab (лежит в папке drv\canny3tiny_vcp).

Чтобы в дальнейшем не объяснять, как работают блоки диаграммы, связанные с отправкой данных в USB virtual COM-port, приведу простой пример.

Сегодня в качестве тренировки мы отправим с помощью контроллера сообщение «HABR». Для начала надо будет скачать IDE CannyLab. Его легко можно найти на официальном сайте разработчика.

Да кстати я использовал CannyLab v 1.42, но думаю в предыдущих версиях проблем с работоспособностью диаграмм не возникнет.

Процесс записи ПО в новый контроллер и базовые принципы работы с Cannylab я изложил в главе № 3 прошлой статьи.

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



Если вам не хочется самостоятельно переносить блоки вы можете скачать диаграммы для данной статьи с помощью GitHub

Надо отметить, что работает передача сообщения в COM-порт слегка странно и буквы в паре символов приходится писать зеркально, но к этому можно привыкнуть.

Поясню по частям.

В блоке «Установка параметров» мы задаем настройки драйвера USB VCP. Вначале включаем режим передачи по виртуальному COM-порту, а затем задаем длину передаваемого сообщения. В нашем случае — 6 символов включая перевод строки.

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

Последний блок «Передача сообщения» Отправляет с заданной периодичностью наше сообщение в COM-порт. Для этого мы используем блок ШИМ. Не путайте его с ВЧ ШИМ, который мы будем использовать при подключении лампы. В данном случае блок генерирует половину времени «0», а вторую половину «1». Вы можете «поиграться» с величиной периода и заполнения, чтобы увеличить или уменьшить частоту отправки сообщений.

Подключение зеленого светодиода к этому блоку ШИМ нужно, чтобы проверить работоспособность контроллера. Если всё в порядке, светодиод будет мигать с частотой отправки сообщения.

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

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

Оказалось, что есть более простой способ. После того, как вы соединили контроллер с портом USB компьютера и нажали в CannyLab кнопку «Подключить» , перейдите в меню «Устройство» и выберите пункт «Запустить» .



Контроллер начнет выполнять записанную программу, получая питание от порта USB. Также после этого контроллер станет доступным в мониторе COM-порта. Правда, для того, чтобы снова перейти в режим записи программы, контроллер надо будет вынуть и заново вставить в порт USB компьютера.

А вот и наш «HABR» в мониторе COM-порта Hterm. Обратите внимание на скорость передачи данных и другие настройки.



А это — монитор COM-порта Arduino IDE:



На фото видно, как работает контроллер после записи диаграммы:



Красный светодиод сигнализирует о получении питания через USB порт компьютера, а зеленый «моргает» в такт сообщениям, передаваемым через виртуальный USB COM-порт.


Часть IV: Подключаем и программируем автолампу и фоторезистор.


Для начала мы рассмотрим самый простой вариант. Просто подключим к выводу №1 контроллера лампу, а к выводу № 6 (АЦП) фоторезистор.

Всё достаточно просто, но на всякий случай я нарисовал схему:



А вот как это выглядит живьем:



«-» и «+» источника питания мы подключаем к соответствующим выводам Canny 3 tiny, вывод № 1 соединяем с корпусом лампы, а «хвостик» лампы с плюсом на шине макетной платы.

С фоторезистором тоже все просто. Плюс подводим с шины макетной платы, а минус уходит в вывод № 6 контроллера, который мы ранее при помощи перемычки связали с АЦП.

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

Теперь «напишем» программу.



Рассмотрим новые дня нас блоки.

Начнем с блока «Получение значения из АЦП и преобразование его в люксы».
В данном блоке мы переводим значения, которые может дать нам АЦП (от 0 до 1023) в освещенность (люкс).

Нам необходимо сделать один замер освещённости, когда светло и один замер, в более темных условиях.

Соответственно в «значение от» я записал минимальное показание АЦП «0», а в «результат от» нулевое значение уровня освещенности.

В «значение до» я записал показания АЦП = 20, а соответствующую ему освещенность равную 300 люкс, я занес в «результат до».

У меня нет подробного описания параметров фоторезистора, но подозреваю, что у него не совсем линейная характеристика, однако нам сейчас и этого хватит.

Предварительно проверить, как выполняется диаграмма можно в симуляторе. Более подробно о работе в симуляторе CannyLab я писал тут.

Вот, что у меня в итоге получилось:



Представим, что фоторезистор передал на АЦП значение равное 10. Блок «Отображение (MAP)» это по сути линейное масштабирование. Десять — это ровно половина от размаха нашей шкалы, значит и на выходе будет половина диапазона 0 – 300, а именно 150. Это ниже заданного уровня в 300 лк., поэтому в регистр канала № 1 (выхода № 1) подается единица и лампочка включится. Но включится она не сразу, а только в том случае, если темно будет на протяжении как минимум одной секунды (1000 миллисекунд).

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



Рассмотрим «Регистр установки сообщения VCP D1:D0, в него приходит значение 3130. Как мы помним это пара символов, каждая часть которой представляет шестнацатиричный код символа. Получается, что 31h это код символа «1» в ASCII, 30 – код нуля в ASCII.

В «Регистре установки сообщения VCP D3:D2 у нас соответственно будут символы «0» и «5». Соберем значения пар символов в порядке от D0 к D3 получим: «0», «1», «5», «0». Вот и получились наши 0150 люкс.

Но как говорится «не симулятором единым…». Давайте посмотрим, что будет на практике.

Замер при свете от люстры и естественном свете (совмещенное освещение):



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

Замер при естественном освещении:



Сильно хуже.

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

Проверяем работоспособность схемы, закрываем датчик пальцем, а потом убираем палец.



А теперь вариант, когда в комнате просто стало темно:



Лампа светится. Все работает, как надо.


Часть V: Пробуем снизить яркость лампы с помощью ШИМ


Давайте немного усложним схему, изменив яркость свечения лампы. Для этого нам понадобится высокочастотный ШИМ (ВЧ ШИМ), в Canny 3 tiny он реализован, на выходах № 3 и № 4.
Я решил воспользоваться выходом № 4.

Схема подключения останется практически без изменений. Просто вместо выхода № 1 к лампе подключим выход № 4.



Вот так это выглядит в сборе. Все отличие в том, что вместо белого провода в кадре теперь синий.



Диаграмма, тоже не сильно изменилась.



Не буду подробно расписывать диаграмму. Основные изменения в настройке параметров выхода 4, который мы используем для ШИМ. В данном разделе мы должны задать » Регистр установки заполнения» он принимает значения от 2 до 255 микросекунд, я решил не рисковать и выбрал 254. Обратите внимание, что он устанавливается сразу для двух каналов (№3 и №4). Затем мы записываем «1» в «Регистр включения ШИМ канала № 4» тем самым включая ШИМ нашей лампочки.

В блоке «Включение лампы в режиме ШИМ (с маленькой яркостью)» новый для нас только «Регистр установки заполнения канала № 4, мкс» Мы запишем в него значение «10», при условии что уровень освещенности над фотодатчиком был меньше 250 лк, в течение 1 секунды.

На фото ниже видно, что лампа включается, но светит при этом тускло.



Если вы захотите, чтобы лампа светилась ярче вам надо будет всего лишь изменить значение константы «10» на любое большее число. Например, можно взять число 127, в нашем случае это половина времени заполнения периода ВЧ ШИМ, а значит примерно половина яркости свечения лампы.



Надо отметить, что ВЧ ШИМ с этой лампочкой работает вполне заметно. Вот три фотографии: на первой мы установили в «Регистре установки заполнения канала № 4» значение равное 10 мкс, на второй — 110 мкс, на самой правой — 210 мкс.



В принципе автолампа из нашего примера, как я понял используется в габаритных сигналах и иногда в противотуманных фарах автомобилей.
Я думаю, что если доработать схему и диаграмму, то можно было бы на старых машинах реализовать включение подсветки при низкой освещенности. Правда необходимо учесть воздействие искусственного освещение ночью. Чтобы на трассах, в тоннелях и от света фар встречных машин, лампа не гасла. Или же можно было бы управлять лампой в салоне автомобиля, чтобы, например, лампы в дверях «Жигулей» или «Нивы» не светились всегда при открытии.


Часть VI: Заключение


В процессе написания данной статьи я испытывал сильнейшее чувство ностальгии.
Во времена учебы в институте, у моего друга и одногруппника Серёги был шикарный синий седан марки «ВАЗ 2107». Что он с ним только не делал: то какой-то шланг приделает (для увеличения наддува), то установит в салон вентилятор, так чтобы он включался по отдельной кнопке, то и вовсе сделает чтобы машина заводилась по нажатию кнопки (правда только при повернутом ключе зажигания). В общем как он только не «тюнинговал» свою «ласточку». С тех пор прошло уже много лет, мой друг пересел на более солидный автомобиль, но мне страшно представить, что бы он сделал со своими «Жигулями» если бы ему лет 10 назад попался в руки этот контроллер.

Благодаря этой статье я тоже вспомнил своё Предназначение. Ведь я много лет учился на инженера по автоматизации, но так ни дня чисто по специальности не проработал.
Оказывается, это так круто погружаться в мир DIY. В процессе сборки схем не один раз «залипал» включая/выключая лампочку и светодиод кнопкой. Это приятное чувство, когда что-то работает, так как задумано. Еще поймал себя на том, что программировать контроллер с помощью диаграмм более медитативное занятие, чем писать код в Arduino IDE. Совсем другое восприятие программы.

Пока писал эту статью, заказал себе версию Canny 3 tiny без кабельного жгута. Сейчас немного отдохну и напишу статью про установку данного контроллера в макетную плату ну и само собой разберем еще несколько примеров автоматизации освещения с его помощью.

Статья получилось достаточно трудоемкой, очень надеюсь, что она вам понравится.

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


  1. «Раз, два, три – ёлочка гори!» или мой первый взгляд на контроллер CANNY 3 tiny.
  2. «Как зеницу ока...» или делаем простенькую охранную систему на базе микроконтроллера (CANNY или Arduino) и Raspberry PI.
  3. «Каких Марин?» или управляем контроллером через bluetooth с помощью мобильного приложения на Xamarin (Android).
Теги:
Хабы:
+11
Комментарии0

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн