Плавное мигание светодиодом или осваиваем массивы…
Конечно же можно все реализовать при помощи
тригонометрической функции (sin).
Используя данную функцию, можно на аналоговом выходе получить сигнал
синусоидальной формы. Если к такому выходу подключить светодиод, то он будет
плавно «мигать»: то плавно разгораться, то плавно угасать…
Но данная функция будет «напрягать» непрерывным
вычислительным процессом сам микроконтроллер, ведь цикл условно говоря
бесконечный, и каждый раз микроконтроллер должен рассчитывать одни и те же
значения, что является нерациональным решением. Более практично вычислить
заранее значений синусов, и представить данные в виде массива.
Выполнить все необходимые расчёты и создать массив данных
удобно в небольшой программе Sinus Tab.
По сути вам ничего не нужно делать: просто запустите программу, и нажмите
кнопку «CALC». В окне
программы появиться массив чисел, которые мы скопируем и вставим в программу
Ардуино.
После запуска программы (скетч можно взять здесь: жми сюда...) мы увидим, как светодиод будет
плавно мигать: то плавно разгораясь, то плавно угасать. Но гораздо интереснее
подключить вместо светодиода RC
цепь, и далее на выход цепи осциллограф. Как вы думаете какой мы тогда сможем
увидеть сигнал? Наверно вы догадались: синусоиду, но нам же интересно
поэкспериментировать!
Теперь давайте разберем подробнее что из себя представляет
такая RC цепь. А это не
что иное как простейший ЦАП (цифровой аналоговый преобразователь). То есть
благодаря такой цепи мы сможем цифровой сигнал «превратить» в аналоговый.
Номиналы радиодеталей: конденсатор 1 мкФ, резистор 10кОм. Вот и все! Пробуем
все теперь на практике, и действительно очень интересно наблюдать как цифровой
сигнал прямоугольной формы превращается в синусоиду…
Но вернемся опять к нашему скетчу. Все же не очень хорошо,
когда для генерации данных используется сторонняя программа. А нельзя ли
сделать так: пусть один раз микроконтроллер все же просчитает нужное значение
(в нашем следующем примере 180 значений) и запишет их в массив. А уже потом во
втором цикле (так называемая «петля») будет брать готовые вычисленные ранее
значения. Скетч заметно стал меньше:
int
ledPin=11;
float
mas [180];
int led;
void
setup() {
pinMode
(ledPin, OUTPUT);
for (int
x=0; x<180; x++)
{
mas[x]=(255*(sin(x*3.1415/180))); // запись
расчетных значений в массив
}
}
void
loop() {
for(int y=0; y<180; y++)
{
analogWrite (ledPin, mas[y]);
delay (10);
}
}
Но заметьте, что все работает точно так же: светодиод плавно
мигает. Причем скетч в котором мы хранили массив использует 1 510 байт
(4%) памяти устройства. Всего доступно 32 256 байт. Глобальные переменные
используют 268 байт (13%) динамической памяти, оставляя 1 780 байт для
локальных переменных. Максимум: 2 048 байт.
Теперь сравним со вторым скетчем, где данные рассчитываются
и помещаются в массив. Второй скетч использует 2 632 байт (8%) памяти
устройства. Всего доступно 32 256 байт. Глобальные переменные используют
731 байт (35%) динамической памяти, оставляя 1 317 байт для локальных
переменных. Максимум: 2 048 байт.
КАК заставить плавно мигать светодиод на аналоговом пине?
ОтветитьУдалитьТак, что с масивом программа стала более громоздкой, но процесор разгружен???
ОтветитьУдалитьПочему нельзя использовать вот это?
ОтветитьУдалитьvoid setup() {
pinMode (11, OUTPUT);
}
void loop() {
for (byte i=0; i<255; i=i+1)
{
analogWrite(11, i);
delay(3);
}
for (byte i=255; i>0; i=i-1)
{
analogWrite(11, i);
delay(3);
}
}
Синусоида имеет форму волны (плавные пики и впадины) А так как ты предложил , получается форма как у пилы строгие триугольники .Для индикации пойдет, но не получится желаемая синусоида.
ОтветитьУдалить