В предыдущей статье, посвящённой моим попыткам погрузится в увлекательный мир программирования микроконтроллеров, я грозился сделать обзор на "обновку". К сожалению, мне сейчас не хватает навыков и времени чтобы сделать, что-то достойное полноценного обзора. Однако, я всё-таки решил подготовить забавы ради, короткую статью на тему игрушечного соревнования 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: я уже понял, что статья вышла "не очень", если кто-то может дать совет, как улучшить текст без кардинальных правок, буду признателен.