В предыдущей статье, посвящённой моим попыткам погрузится в увлекательный мир программирования микроконтроллеров, я грозился сделать обзор на "обновку". К сожалению, мне сейчас не хватает навыков и времени чтобы сделать, что-то достойное полноценного обзора. Однако, я всё-таки решил подготовить забавы ради, короткую статью на тему игрушечного соревнования CANNY 3 TINY PRO и неоригинальной Arduino Nano. Соревноваться контроллеры будут в своеобразном аналоге перетягивания каната, на роль которого был выбран двухцветный светодиод марки BL-L2519EGW.
Итак в сегодняшнем материале мы подключим оба контроллера к светодиоду и будем подавать случайный сигнал на его выводы. Правила простые – кто большее сигнал подаст у того и кристалл в светодиоде загорится ярче. Попутно мы воспользуемся ЦАП на контроллере CANNY и доработаем стандартный ГСЧ с помощью составного функционального блока.
В статье не будет сложной электроники или мудрёного программирования, так что она вполне подойдет новичкам.
Оглавление:
Введение
Я намерено не буду разбирать технические характеристики нового (для меня) контроллера CANNY. Скажу только одну вещь. Несмотря на то, что оба контроллера внешне чем-то похожи сравнивать их совершенно не уместно и мы этого делать не будем.
Для того, чтобы повторить "дуэль века" вам потребуется:
Двухцветный светодиод - я использовал BL-L2519EGW, но марка не особо критична.
Контроллер CANNY 3 TINY PRO именно у этого контроллера есть ЦАП, к тому же он самый доступный по цене в линейке контроллеров CANNY.
Совместимый с Arduino контроллер - я использовал неоригинальную Nano, но можно было и UNO.
Пара резисторов 100 Ом, - я не силен в электронике, но решил их поставить (может это и неверное решение).
Соединительные провода и макетная плата.
Напомню цель. Мы хотим чтобы оба контроллера подавали на светодиод в течение короткого периода времени, случайный сигнал. В зависимости от уровня сигнала на ШИМ выходах контроллера кристаллы внутри светодиода будут светится с разной интенсивностью за период времени, или не будут вовсе, в случае ничьей.
Предвосхищая некоторую критику, сразу скажу, что само собой раз контролеры Кэнни стоят в "Дакаровских" Камазах, наверное и CANNY 3 TINY PRO явно предназначен для чего-то большего, чем просто моргать светодиодом. Собственно Arduino Nano тоже может намного больше. Просто я ничего сложнее в этот раз собрать не смог, а поделится впечатлением хотелось.
Ну и на всякий случай остальные статьи цикла размещу под спойлером.
Другие статьи цикла
Схема
Питать контроллеры мы будем через USB-порты, поскольку оба контроллера имеют USB-VCP мы при необходимости сможем еще и передавать данные. Но в принципе контроллеры можно питать и от двух USB зарядных устройств, схема всё равно будет работать.
Первым делом объединим "Землю" у двух контроллеров соединив выводы "GND".
Затем, от каждого из контроллеров "подведем" к светодиоду выводы от канала ЦАП.
У Arduino - "D5", у CANNY - "C2" (это единственный выход с ЦАП).
В нашем случае светодиод имеет два вывода и работает он примерно так: если сигнал от ШИМ CANNY (от левой ноги к правой) больше то загорается красный кристалл. Чем больше разница в скважеости ШИМ, тем ярче он загорится. И наоборот, если на Ардуино сигнал больше (от правой ноги к левой), то загорится зеленый. При примерном равенстве потенциалов светодиод вообще не будет светится.
Мы будем "перетягивать канат" 2.5 секунды, нам важно, чтобы контроллеры подали сигнал более-менее синхронно. Для этого (а также для нашей тренировки) контроллеры подадут друг другу сигналы. Выход "D7" Arduino подаст логическую единицу на вход "C6" CANNY. В свою очередь, CANNY с выхода "C4" подаст логическую единицу на вход "D3" Arduino. В программе каждого из контроллеров предусмотрим проверку наличия сигнала, при успешном прохождении которой подается напряжение на светодиод.
Для того, чтобы узнать какое напряжение подали оба контроллера, мы с помощью АЦП CANNY померим сигнал от Arduino. Для этого подсоединим выход "C10" CANNY к резистору.
Кстати лично я очень рад что у Canny 3 TINY PRO для того, чтобы включить режим АЦП канала не нужно паять перемычку, как в случае с обычным CANNY 3 TINY.
В итоге должно получится примерно вот-так:
Я правда использовал специальные резисторы из набора, но в остальном схема как на картинке.
Может получится, так, что будут заметно светится оба кристалла в светодиоде, это связано с работой ШИМ контроллеров.
Перейдем к программной части.
Программа
Обе программы можно скачать с GitHub.
Программа для Arduino очень простая, думаю нет смысле её комментировать:
/*
Synhronized Randomize DAC.
See more https://habr.com/ru/post/561148/
*/
int ADC_pin = 5;
int input_pin = 3;
int output_pin = 7;
int synch_signa = 0;
int v_min = 10;
int v_max = 2550;
int synch_signal = 0;
float rand_voltage = 0;
// the setup function runs once when you press reset or power the board
void setup() {
pinMode(ADC_pin, OUTPUT);
pinMode(output_pin, OUTPUT);
digitalWrite(output_pin,HIGH);
pinMode(input_pin, INPUT);
Serial.begin(9600);
}
// the loop function runs over and over again forever
void loop() {
synch_signal = digitalRead(input_pin); // read signal from another device
if (synch_signal) {
rand_voltage=random(v_min, v_max) / 10;
analogWrite(ADC_pin, rand_voltage);
Serial.println(rand_voltage);
delay(2500); // wait for seconds
}
else
{
delay(500); // wait for seconds
}
}
Программа для контроллера CANNY (сделана в CannyLab IDE v. 2.9):
При включении контроллер устанавливает на выходе "С4" логическую "1" для синхронизации с Arduino.
Канал "C10" в режиме АЦП измеряет напряжение от Arduinio и с помощью функции MAP переводит его в удобный для чтения вид.
ШИМ-генератор в сочетании с детектором переднего фронта раз в 2.5 секунды дают сигнал для записи случайного значения в канал "C2".
Значение при этом запишется, только если на входе "С6" есть логическая "1" от Arduino.
Значение напряжения для подачи на светодиод генерируется случайным образом. Поскольку у CANNY нет встроенного блока для сброса ГСЦ, "случайность" сигнала обеспечивается, сложением "истории" сигналов, поступивших от Arduino.
Для уменьшения количества элементов на основной диаграмме, реализация функции "Random" перенесена в одноименный составной блок (об этом чуть позже).
Значения напряжений на выводах светодиода от обоих контроллеров передается в виртуальный COM-порт ПК. Данный порт мы можем мониторить в любой программе, например в Hterm, но я для простоты решил использовать Arduino IDE.
Чтобы не "заморачиваться" с лишними символами, сигнал с ЦАП контроллеров выводится без точки, например, "c=45" значит, что если мы используем вольтметр, то. увидим условное "напряжение" на выводе ЦАП CANNY = 4.5В, соответственно "a=27" значит, что на ЦАП выводе Arduino = 2.7В.
Рассмотрим составной блок "Random (min...max)":
В данном блоге мы используем встроенный ГСЧ и функцию MAP для того чтобы выводить не просто числа от 0 до 65000, а в нужном нам диапазоне. Данный блок можно использовать, как библиотечный элемент и повторно использовать в других схемах. Более подробно о том, как работать с составными функциональными блоками, я писал в этой статье.
Примечание: когда вы загружаете программу в один из контроллеров, второй лучше отсоединять от ПК.
Заключение
Если вы все собрали верно, то получится примерно такой результат:
Слева направо:
У контроллеров ничья, напряжение примерно равно.
CANNY немножко выигрывает.
CANNY ощутимо выигрывает.
Arduino ощутимо выигрывает.
Пример вывода данных из монитора COM-порта (несвязанный с картинкой выше):
Если честно изначально, я хотел сделать крестики-нолики на светодиодах, но потом понял, что для меня это тяжело, но, если кто-то вдруг сделает поделитесь пожалуйста ссылкой в комментариях.
Ну и еще под конец хочу сказать, что чертовски любопытно иногда погрузится в другую парадигму программирования. Я получил удовольствие, когда своими руками из функциональных блоков собрал простенький аналог функции "Random". Сейчас подумываю сделать еще несколько "библиотечных" элементов реализующих распространенные функции, которых порой не хватает среди готовых блоков CANNY и набросать об этом статью.
UPD: Подправил, очевидные неточности. Рад конструктивной критике, по мере поступления замечаний вношу правки.
UPD2: я уже понял, что статья вышла "не очень", если кто-то может дать совет, как улучшить текст без кардинальных правок, буду признателен.
mmMike
Дальше можно не читать тем кто желает знать как работает…
Не подойдет.
Забавная экспериментальная магия… Вроде бы электротехника на таком уровне это не сложно.
Ну хоть честно признаться в своем невежестве и не желании вникать. За это можно и + поставить.
Но не надо такой «анти паттерн» внедрять среди «новичков».
BosonBeard Автор
Так в чем явные ошибки? вы можете вместо того, чтобы язвить конкретно их указать.
AlexanderPHP
Яркость светодиодов зависит от тока, а не от напряжения. Чем выше сопротивление, тем ниже ток, тем ниже яркость.
BosonBeard Автор
Да пожалуй, этот момент можно поправить. Понятно, что с помощью ШИМ мы на самом деле управляем током, за интервал времени, возможно я чрезмерно упростил. Спасибо Вам за совет
dvserg
На диоде, когда он открыт, всегда фиксированное напряжение. Иначе говоря наличие сопротивления обязательно. Но его нужно подобрать так, чтобы при максимально возможном напряжении ток через цепь диод-сопротивление был допустимым для диода по его «паспорту».
BosonBeard Автор
Спасибо. Меня если честно смутил случай с подключением именно двух выходов ШИМ, а поскольку я мерил напряжение вольтметром и оно изменялось, я решил что все таки дело именно в напряжении.
Получается, что у меня оба контроллера подают одинаковые 5В и светодиод не горит не изза равенства разницы потенциалов, а из-за того что скважности ШИМ совпадают и ток за единицу времени вообще не течет от одного вывода к другому?
mmMike
Явная ошибка — концептуальная.
Как выглядит классическая обучающая задача: «студент проверяет на практике свои знания того как должно работать в теории».
По Вашей же статье видно что, Вы явно не понимаете основ электротехники (хотя бы элементарно законы Кирхгофа) ни то как устроен и работает выход микропроцессора на нагрузку ни то как работает светодиод (ну не надо «квантового уровня». Хотя бы на ВАХ глянуть и общее понимание как.)
А самое главное — не особо хотите даже изучать это. Это просто сквозит из фаз типа «В любом случае думаю». Не надо гипотез и «метода тыка». Нужны просто элементарные широкодоступные знания.
И не понятно, а что вообще собираетесь поверять. Цель всей этой поделки не понятна.
BosonBeard Автор
Цель задачи указана в самом начале статьи и заучит, как "забавы ради". Если бы я собирался кого-либо хоть чему-то учить, я бы оформил, как туториал. Вторая цель сделать еще 1 пример работы с контроллером Canny, потому, что их в интернете на мой взгляд мало и может кому-то поможет, ибо я в свое время долго маялся с очевидными вещами, когда пытался вникнуть в новый подход к программированию, со всякими функциональными блоками и регистрами.
Конструктивную критику я воспринимаю и поскольку с телефона не удобно переписывать статью пока слово напряжение заменил на "сигнал".
Error1024
А ещё: пороговое напряжение, при котором начинает светиться красный и зелёный светодиод — разное, да и в целом ВАХ не симметричен выходит.
Установка токоогрничительных резисторов с какой стороны — абсурдна, при последовательном соединении ток во всех участках цепи — одинаковый.
И наконец: «Arduino + bread board вид сверху» это не схема, я так понимаю новое поколение вэлектронщиков не понимает схемы, и рисовать их тоже не умеет.
BosonBeard Автор
Я просто побоялся сжечь выходы