Прошу помощи связи millis () и analogWrite ()
- Войдите на сайт для отправки комментариев
Все доброго времени суток.
Постораюсь кратко: недавно стал интересоваться платформой ардуино. Собрал себе адаптивную подсветку монитора, скажем так, по инструкции. И полезли идеи... Мне интересен моддинг, и применение ардуино тут прям шикарно и безгранично. Но я почти 00 в программировании, хотя азы конечно знаю и имеется аналитическое мышление.
Я разобрал и опробовал несколько вариаций использование ардуинки для светодиодных лент, но все сводилось к однозадачности через delay ().
Подскажите пожалуйста в примере, как связать управление ШИМ на нескольких выходах (допустим 2) одновременно через millis () или есть иные способы. Пример в реализации заставить два светодиода плавно менять яркость в противофазе, т.е. один разгорается, а второй затухает одновременно, или второй начинает разгораться когда первый разгорелся на половину ну и т.д.
Микроконтроллер atmega328p, ардуино нано. Не могу найти пример такой работы, уже сложилось впечатление, что это нереально.
Тут и без миллис можно. Заряжаете делай(шаг изменения яракости) и изменяете яркость одного и другого канала. Не?
Вот что пробовал, в таком случае светодиоды загораются и тухнут по очереди. Сначала 1 затухает/разгорается, потом второй.
И чо? "Аналитическое мышление" выражайте.
Что конкретно выразить? Из моей логики программа снижает скважность на выводе 10 до 0 и повышает на выводе 5 до 255, затем должна сделать обратную операцию, а вместо этого снижает до 0 на выводе 10 и повышает ее до 255, а затем делает тоже самое на выводе 5.
Объясните, где мое понимание не верно?
Вариант кода с delay () приложил выше. С millis () код не писал, так как не понимаю, как связать его с analogWrite () и просил пример.
Как бы, на вывод нужно бы настроить сначала.
Что конкретно выразить? Из моей логики программа снижает скважность на выводе 10 до 0 и повышает на выводе 5 до 255, затем должна сделать обратную операцию, а вместо этого снижает до 0 на выводе 10 и повышает ее до 255, а затем делает тоже самое на выводе 5.
Объясните, где мое понимание не верно?
А где же ваше аналитическое мышление? посмотрите на свой код, у вас так и сделано - сначала пргоняете один от 0 до 255, и только потом второй от 255 до нуля.
Чтобы работало одновременно - надо и менять отдновременно. Прибавили шаг на первом, потом отняли шаг от второго, потом еще прибавили и отняли от второго...
А где же ваше аналитическое мышление? посмотрите на свой код, у вас так и сделано - сначала пргоняете один от 0 до 255, и только потом второй от 255 до нуля.
Чтобы работало одновременно - надо и менять отдновременно. Прибавили шаг на первом, потом отняли шаг от второго, потом еще прибавили и отняли от второго...
А вроде у него так и написано? В 8 строке значение для первого светодиода растёт, в 9 для второго уменьшается. Всё это в одном цикле. Или я сам уж чего торможу?
Так вот и я не понимаю, почему порядок выполнения строк 8, 14, 9, 15.
Как заставить выполнять одиночные операции изменения яркости? У меня есть вариант запоминать текущее значение яркости, выполнять приращение или вычитание, сравнивать с предыдущем, если оно изменилось, то перезаписывать и переходить к следующей строке, но чет мне кажется должно быть проще.
Я еще раз повторяю, я не программист от слова совсем. Школьный уровень паскаля. Я так понимаю есть специфика работы определенных функций, в особенности analogWrite ()
Немного напрягает манера общения "ты идиот - иди учи матчасть".
А вроде у него так и написано? В 8 строке значение для первого светодиода растёт, в 9 для второго уменьшается. Всё это в одном цикле. Или я сам уж чего торможу?
да. точно - это я слепой
Тогда совет Green правильный, нужно сначала пины на выход обьявить.
Автор, добавьте в сетап pinMode(10,OUTPUT); и так же для второго пина
Это делал, просто когда копировал видимо стер случайно.
Вот код, с которым работаю я сейчас, для меня немного нагляднее, но суть та же. сначала тухнет и разгорается 1, затем тухнет и разгорается другой. Я могу сделать, чтобы они синхронно это делали) но вот чтобы синхронно в противофазе я не пойму как.
Архангел, а то, что 255 на 3 не делится - вас не смущает? У вас условие brightness1 == 255 не выполнится никогда
УПС... таки делится.
Тогда не знаю, на мой взгляд, ошибок в коде нет. Проверить не могу - на работе нет ардуины.
Тогда совет Green правильный, нужно сначала пины на выход обьявить.
Автор, добавьте в сетап pinMode(10,OUTPUT); и так же для второго пина
Да по инструкции analogWrite() вроде и это не обязательно, хотя в примерах везде есть. :)
Архангел, а то, что 255 на 3 не делится - вас не смущает? У вас условие brightness1 == 255 не выполнится никогда
Принимается! Только установка шага приращения =5 ничего не изменило кроме скорости.
По поводу 255/3 тоже немного призадумался, раньше было выражение ">="
Да по инструкции analogWrite() вроде и это не обязательно, хотя в примерах везде есть. :)
Это, возможно, был мой старый скетч, который и работал без назначения выходов. Я и не монял изначально как это повлияет, но исправил.
Архангел, есть одна мысль :)
Добавьте в ЛУП куда-нить типа на 17 строку - вывод brightness1 и 2 в Сериал
Архангел - я так и думал.
Похоже, что код работает как надо. А то. что вы видите - обьясняется тем, что малые значения яркости для диодов слишком слабые - они не горят.
Попробуйте менять яркость не от нуля. а. скажем, от 150 до 255
а мосфеты какие стоят?
N типа. Китайские IRF520. Ленты сейчас маленький кусочек по 3 светодиода 5050 для тестов. Загораются уже при значении скважности отличной от 0, т.е. даже при 1 - свечение есть. Больше 175 почти не различимо увеличение. Вариации с максимальным и минимальным значением ничего не дает пока. Пробую.
N типа. Китайские IRF520. Ленты сейчас маленький кусочек по 3 светодиода 5050 для тестов. Загораются уже при значении скважности отличной от 0, т.е. даже при 1 - свечение есть. Больше 175 почти не различимо увеличение. Вариации с максимальным и минимальным значением ничего не дает пока. Пробую.
ну если в сериал выдает правильно - значит с кодом все в порядке.
Причины проблемы может быть две
- аппаратная
- психологическое (на фоне изменения одних диодов вы не видите изменения друкгих) - не прикалываюсь
Архангел - я так и думал.
Похоже, что код работает как надо. А то. что вы видите - обьясняется тем, что малые значения яркости для диодов слишком слабые - они не горят.
Попробуйте менять яркость не от нуля. а. скажем, от 150 до 255
Все, спасибо, 777-й. Мои глаза обманывали меня) приемлемого эффекта достиг с порогами скважности 1 - 50. Все что выше почти не различимо!
Мои глаза обманывали меня)
ну значит я угадал - см сообщение №21 - последняя строка :)
N типа. Китайские IRF520.
IRL540 пошибчее будут открываца.
Еще на будущее вопрос не по теме немного.
Насколько я понял ардуино от ПК может получать 8-битную команду. Суть конечного решения - управления и переключение нескольких режимов работы, программы. Можно ли разбить эту команду так, чтобы каждый определенный бит изменял значение определенной переменной?
К примеру
0000 0000 - все выключено
0000 0001 - вентилятор со скоростью "1"
0000 0010 - вентилятор со скоростью "2"
0000 0011 - вентилятор со скоростью "3" (
0000 1000 - включение подсветки 1-й зоны
0001 1000 - включение подсветки 1-й и 2-й зоны
Ну и так далее. Т.е. оперировать только 8ю символами. Или есть возможность передавать несколько байт последовательно?
Например 0000 0001 - инструкция о том, что сейчас будет передан режим работы вентилятора.
и далее к примеру 0100 0110 - 70 % скорости.
Или есть возможность передавать несколько байт последовательно?
все то, что вы передаете командой Serial.print на ПК, можно передавать и обратно. Что это будет - байты, строки или даже сложные структуры - решаете вы сами. Вопрос только в коде на Ардуино, который будет обрабатывать полученные данные.
Т.е. для начала я собираю схему и пишу код, в котором все параметры, которые мне нужны я выношу в переменные и присваиваю им начальные значения для работы без ПК. Если все меня устроило - уже потом ищу решение, как изменять эти переменные с помощью команды с ПК. Для реализации мне достаточно будет 2х байтов для передачи всех возможных команд. Первый бы отвечал за выбор устройства-выхода ардуины (группы переменных, которые отвечают за его работу), а второй байт изменял значения переменных в этой группе. Верное решение?
Советую использовать код маркера для вашей последовательности. Иначе возможна "галиматня".
Советую использовать код маркера для вашей последовательности. Иначе возможна "галиматня".
Совершенно не знаю о чем вы, но разберусь позднее тогда. Спасибо за совет
Код маркера начала пакета и контрольную сумму. Для начала можно простую, по XOR - чтобы при помехах унитаз сам не начинал крышку закрывать вместе с сидящим человеком
Код маркера начала пакета и контрольную сумму. Для начала можно простую, по XOR - чтобы при помехах унитаз сам не начинал крышку закрывать вместе с сидящим человеком
Инструкцию бы или описание с примерами.
Инструкцию бы или описание с примерами.
Архангел, учитесь пользоваться гуглом, а то так и будете до старости на форуме спрашивать :)
По запросу "обмен по сериал контрольная сумма" - выдало куча ссылок
Спасибо! А форум на то и нужен, чтобы спрашивать) Гугл - помойка, если не знаешь, что ищещь. Мусора и, не дай Бог, неверной инфы - вагоны.
Ошибаетесь, чтобы спрашивать как раз придуман Гугл. А форум придуман для общения по интересам. Это не справочное бюро.
Перед тем, как что-то спросить на форуме - обязательно сначала поищи в гугле. И если не найдёшь, только потом спрашивай на форуме. А не наоборот.
А форум на то и нужен, чтобы спрашивать)
Это Вам! А sadman41 и b707 он, наверное, нужен для того, чтобы Вам отвечать. Они ведь для этого сюда пришли, правда?
Ошибаетесь, чтобы спрашивать как раз придуман Гугл. А форум придуман для общения по интересам. Это не справочное бюро.
Перед тем, как что-то спросить на форуме - обязательно сначала поищи в гугле. И если не найдёшь, только потом спрашивай на форуме. А не наоборот.
Это Вам! А sadman41 и b707 он, наверное, нужен для того, чтобы Вам отвечать. Они ведь для этого сюда пришли, правда?
Ребят, я вроде поблагодарил за понимание и ответы. Форум - это общественная платформа для общения в целом, где в частности ищут ответы. Растолкую мои слова: когда не знаешь, что ищешь - это как в сказках, принеси то, не знаю что. Ну не понял я то, что sadman41 написал, вот и уточнил, попросил конкретики.
Если Вам не хочется просто дать совет, зачем Вы вообще заходите в подобные темы? Включить врача? =)
Еще раз спасибо всем, кто помог советом, отдельное 707-му!
P.S.
так, Гугл - помойка или твоя голова - помойка? О_О
А вот Вам бы я посоветовал следить за языком.
Форум нужен для того, что бы проводить таких индивидов через говнотерапию. Тогда у них мозги начинают работать и Гугл окажется не такой уж свалкой. А то вы как Дартаньян чистенький, а форумчане за вас должны ручки пачкать.
Так не отвечайте просто. В чем проблема? Индивиды, говнотерапия. Второй пост - хамство.