Прошу помощи связи millis () и analogWrite ()

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

Все доброго времени суток. 

Постораюсь кратко: недавно стал интересоваться платформой ардуино. Собрал себе адаптивную подсветку монитора, скажем так, по инструкции. И полезли идеи... Мне интересен моддинг, и применение ардуино тут прям шикарно и безгранично. Но я почти 00 в программировании, хотя азы конечно знаю и имеется аналитическое мышление.

Я разобрал и опробовал несколько вариаций использование ардуинки для светодиодных лент, но все сводилось к однозадачности через delay ().

Подскажите пожалуйста в примере, как связать управление ШИМ на нескольких выходах (допустим 2) одновременно через millis () или есть иные способы. Пример в реализации заставить два светодиода плавно менять яркость в противофазе, т.е. один разгорается, а второй затухает одновременно, или второй начинает разгораться когда первый разгорелся на половину ну и т.д.

Микроконтроллер atmega328p, ардуино нано. Не могу найти пример такой работы, уже сложилось впечатление, что это нереально.

Green
Offline
Зарегистрирован: 01.10.2015

Тут и без миллис можно. Заряжаете делай(шаг изменения яракости) и изменяете  яркость одного и другого канала. Не?

ArhAngeL
Offline
Зарегистрирован: 06.02.2018
int DDRright = 10;
int DDRleft = 5;

void setup(){}

void loop(){
  for(int value = 0 ; value <= 255; value +=3) { 
    analogWrite(DDRright, value);
    analogWrite(DDRleft, 255-value);
    delay(30);
   }

  for(int value = 0 ; value <= 255; value +=3) { 
    analogWrite(DDRright, 255-value);
    analogWrite(DDRleft, value);
    delay(30);
   }
}

Вот что пробовал, в таком случае светодиоды загораются и тухнут по очереди. Сначала 1 затухает/разгорается, потом второй.

Green
Offline
Зарегистрирован: 01.10.2015

И чо? "Аналитическое мышление" выражайте.

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

Что конкретно выразить? Из моей логики программа снижает скважность на выводе 10 до 0 и повышает на выводе 5 до 255, затем должна сделать обратную операцию, а вместо этого снижает до 0 на выводе 10 и повышает ее до 255, а затем делает тоже самое на выводе 5.

Объясните, где мое понимание не верно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ArhAngeL пишет:
сложилось впечатление, что это нереально.
Так и есть! Если не делать, то ничего и не сделается. А Вы же не делаете? Если делаете, показывайте  свой код.

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

Вариант кода с delay () приложил выше. С millis () код не писал, так как не понимаю, как связать его с analogWrite () и просил пример.

Green
Offline
Зарегистрирован: 01.10.2015

Как бы, на вывод нужно бы настроить сначала.

b707
Offline
Зарегистрирован: 26.05.2017

ArhAngeL пишет:

Что конкретно выразить? Из моей логики программа снижает скважность на выводе 10 до 0 и повышает на выводе 5 до 255, затем должна сделать обратную операцию, а вместо этого снижает до 0 на выводе 10 и повышает ее до 255, а затем делает тоже самое на выводе 5.

Объясните, где мое понимание не верно?

А где же ваше аналитическое мышление? посмотрите на свой код, у вас так и сделано - сначала пргоняете один от 0 до 255, и только потом второй от 255 до нуля.

Чтобы работало одновременно - надо и менять отдновременно. Прибавили шаг на первом, потом отняли шаг от второго, потом еще прибавили и отняли от второго...

kalapanga
Offline
Зарегистрирован: 23.10.2016

b707 пишет:

А где же ваше аналитическое мышление? посмотрите на свой код, у вас так и сделано - сначала пргоняете один от 0 до 255, и только потом второй от 255 до нуля.

Чтобы работало одновременно - надо и менять отдновременно. Прибавили шаг на первом, потом отняли шаг от второго, потом еще прибавили и отняли от второго...

А вроде у него так и написано? В 8 строке значение для первого светодиода растёт, в 9 для второго уменьшается. Всё это в одном цикле. Или я сам уж чего торможу?

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

Так вот и я не понимаю, почему порядок выполнения строк 8, 14, 9, 15.

Как заставить выполнять одиночные операции изменения яркости? У меня есть вариант запоминать текущее значение яркости, выполнять приращение или вычитание, сравнивать с предыдущем, если оно изменилось, то перезаписывать и переходить к следующей строке, но чет мне кажется должно быть проще.

Я еще раз повторяю, я не программист от слова совсем. Школьный уровень паскаля. Я так понимаю есть специфика работы определенных функций, в особенности analogWrite ()

Немного напрягает манера общения "ты идиот - иди учи матчасть".

b707
Offline
Зарегистрирован: 26.05.2017

kalapanga пишет:

А вроде у него так и написано? В 8 строке значение для первого светодиода растёт, в 9 для второго уменьшается. Всё это в одном цикле. Или я сам уж чего торможу?

да. точно - это я слепой

Тогда совет Green правильный, нужно сначала пины на выход обьявить.

Автор, добавьте в сетап pinMode(10,OUTPUT); и так же для второго пина

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

Это делал, просто когда копировал видимо стер случайно.

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

int brightness1 = 0;    // уставливаем начально значение яркости 1
int brightness2 = 255;    // уставливаем начально значение яркости 2
int fadeAmount = 3;    // шаг приращения/убывания яркости 

 
void setup()  {
  // устанваливаем пины 5 и 6 в режим выхода
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
}
 
void loop()  {
  // устанавливаем значение широты импульсов на выходах 5 и 6
  // задавая яркость светодиода
  analogWrite(5, brightness1);   
  analogWrite(6, brightness2);
  // измением значение в переменных для яркости
  brightness1 = brightness1 + fadeAmount;
  brightness2 = brightness2 - fadeAmount; 
  // при достижение крайних значений для яркости
  // меняем знак переменной шага приращения/убывания яркости
  if (brightness1 == 0 || brightness1 == 255) {
  fadeAmount = -fadeAmount ;
  }
  // делаем паузу для достижения плавного наращивания/убывания яркости  
  delay(10);                           
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Архангел, а то, что 255 на 3 не делится - вас не смущает?  У вас условие brightness1 == 255 не выполнится никогда

УПС... таки делится.

Тогда не знаю, на мой взгляд, ошибок в коде нет. Проверить не могу - на работе нет ардуины.

kalapanga
Offline
Зарегистрирован: 23.10.2016

b707 пишет:

Тогда совет Green правильный, нужно сначала пины на выход обьявить.

Автор, добавьте в сетап pinMode(10,OUTPUT); и так же для второго пина

Да по инструкции analogWrite() вроде и это не обязательно, хотя в примерах везде есть. :)

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

b707 пишет:

Архангел, а то, что 255 на 3 не делится - вас не смущает?  У вас условие brightness1 == 255 не выполнится никогда

Принимается! Только установка шага приращения =5 ничего не изменило кроме скорости.

По поводу 255/3 тоже немного призадумался, раньше было выражение ">="

kalapanga пишет:

Да по инструкции analogWrite() вроде и это не обязательно, хотя в примерах везде есть. :)

Это, возможно, был мой старый скетч, который и работал без назначения выходов. Я и не монял изначально как это повлияет, но исправил.

b707
Offline
Зарегистрирован: 26.05.2017

Архангел, есть одна мысль :)

Добавьте в ЛУП куда-нить типа на 17 строку - вывод brightness1 и 2 в Сериал

ArhAngeL
Offline
Зарегистрирован: 06.02.2018
int brightness1 = 0;    // уставливаем начально значение яркости 1
int brightness2 = 255;    // уставливаем начально значение яркости 2
int fadeAmount = 5;    // шаг приращения/убывания яркости 


void setup()  {
  // устанваливаем пины 5 и 6 в режим выхода
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  Serial.begin(9600);
}

void loop()  {
  // устанавливаем значение широты импульса на выходе 9
  // задавая яркость светодиода
  analogWrite(5, brightness1);   
  analogWrite(6, brightness2);
  Serial.println(brightness1, DEC);
  Serial.println(brightness2, DEC);
  // измением значение в переменной для яркости
  brightness1 = brightness1 + fadeAmount;
  brightness2 = brightness2 - fadeAmount; 
  // при достижение крайних значений для яркости
  // меняем знак переменной шага приращения/убывания яркости
  if (brightness1 == 0 || brightness1 == 255) {
  fadeAmount = -fadeAmount ;
  }
  // делаем паузу для достижения плавного наращивания/убывания яркости  
  delay(10);                           
}

 

 
0
255
5
250
10
245
15
240
20
235
25
230
30
225
35
220
... и т.д. но работает на выходе не так. У меня стоят мосфеты для питания лент, схема собрана на плате уже. Но разница между управлением нагрузкой через мосфет и простым зажиганием светодиода через резистор сути дела же не меняет. Или?

 

b707
Offline
Зарегистрирован: 26.05.2017

Архангел - я так и думал.

Похоже, что код работает как надо. А то. что вы видите - обьясняется тем, что малые значения яркости для диодов слишком слабые - они не горят.

Попробуйте менять яркость не от нуля. а. скажем, от 150 до 255

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а мосфеты какие стоят?

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

N типа. Китайские IRF520. Ленты сейчас маленький кусочек по 3 светодиода 5050 для тестов. Загораются уже при значении скважности отличной от 0, т.е. даже при 1 - свечение есть. Больше 175 почти не различимо увеличение. Вариации с максимальным и минимальным значением ничего не дает пока. Пробую.

b707
Offline
Зарегистрирован: 26.05.2017

ArhAngeL пишет:

N типа. Китайские IRF520. Ленты сейчас маленький кусочек по 3 светодиода 5050 для тестов. Загораются уже при значении скважности отличной от 0, т.е. даже при 1 - свечение есть. Больше 175 почти не различимо увеличение. Вариации с максимальным и минимальным значением ничего не дает пока. Пробую.

ну если в сериал выдает правильно - значит с кодом все в порядке.

Причины проблемы может быть две

 - аппаратная

- психологическое (на фоне изменения одних диодов вы не видите изменения друкгих) - не прикалываюсь

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

b707 пишет:

Архангел - я так и думал.

Похоже, что код работает как надо. А то. что вы видите - обьясняется тем, что малые значения яркости для диодов слишком слабые - они не горят.

Попробуйте менять яркость не от нуля. а. скажем, от 150 до 255

Все, спасибо, 777-й. Мои глаза обманывали меня) приемлемого эффекта достиг с порогами скважности 1 - 50. Все что выше почти не различимо!

b707
Offline
Зарегистрирован: 26.05.2017

ArhAngeL пишет:

Мои глаза обманывали меня)

ну значит я угадал - см сообщение №21 - последняя строка :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ArhAngeL пишет:

N типа. Китайские IRF520. 

IRL540 пошибчее будут открываца.

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

Еще на будущее вопрос не по теме немного.

Насколько я понял ардуино от ПК может получать 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 % скорости.

b707
Offline
Зарегистрирован: 26.05.2017

ArhAngeL пишет:

Или есть возможность передавать несколько байт последовательно?

все то, что вы передаете командой Serial.print на ПК, можно передавать и обратно. Что это будет - байты, строки или даже сложные структуры - решаете вы сами. Вопрос только в коде на Ардуино, который будет обрабатывать полученные данные.

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

Т.е. для начала я собираю схему и пишу код, в котором все параметры, которые мне нужны я выношу в переменные и присваиваю им начальные значения для работы без ПК. Если все меня устроило - уже потом ищу решение, как изменять эти переменные с помощью команды с ПК. Для реализации мне достаточно будет 2х байтов для передачи всех возможных команд. Первый бы отвечал за выбор устройства-выхода ардуины (группы переменных, которые отвечают за его работу), а второй байт изменял значения переменных в этой группе. Верное решение?

Green
Offline
Зарегистрирован: 01.10.2015

Советую использовать код маркера для вашей последовательности. Иначе возможна "галиматня".

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

Green пишет:

Советую использовать код маркера для вашей последовательности. Иначе возможна "галиматня".

Совершенно не знаю о чем вы, но разберусь позднее тогда. Спасибо за совет

sadman41
Offline
Зарегистрирован: 19.10.2016

Код маркера начала пакета и контрольную сумму. Для начала можно простую, по XOR - чтобы при помехах унитаз сам не начинал крышку закрывать вместе с сидящим человеком

 

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

sadman41 пишет:

Код маркера начала пакета и контрольную сумму. Для начала можно простую, по XOR - чтобы при помехах унитаз сам не начинал крышку закрывать вместе с сидящим человеком

Инструкцию бы или описание с примерами.

b707
Offline
Зарегистрирован: 26.05.2017

ArhAngeL пишет:

Инструкцию бы или описание с примерами.

Архангел, учитесь пользоваться гуглом, а то так и будете до старости на форуме спрашивать :)

По запросу "обмен по сериал контрольная сумма" - выдало куча ссылок

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

Спасибо! А форум на то и нужен, чтобы спрашивать) Гугл - помойка, если не знаешь, что ищещь. Мусора и, не дай Бог, неверной инфы - вагоны.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

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

Перед тем, как что-то спросить на форуме - обязательно сначала поищи в гугле. И если не найдёшь, только потом спрашивай на форуме. А не наоборот.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ArhAngeL пишет:

А форум на то и нужен, чтобы спрашивать)

Это Вам! А sadman41 и b707 он, наверное, нужен для того, чтобы Вам отвечать. Они ведь для этого сюда пришли, правда?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ArhAngeL пишет:
Спасибо! А форум на то и нужен, чтобы спрашивать) Гугл - помойка, если не знаешь, что ищещь. Мусора и, не дай Бог, неверной инфы - вагоны.
Форум нужен для того, что бы проводить таких индивидов через говнотерапию. Тогда у них  мозги начинают работать и Гугл окажется не такой уж свалкой. А то вы как Дартаньян чистенький, а форумчане за вас должны ручки пачкать.

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

Jeka_M пишет:

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

Перед тем, как что-то спросить на форуме - обязательно сначала поищи в гугле. И если не найдёшь, только потом спрашивай на форуме. А не наоборот.

ЕвгенийП пишет:

Это Вам! А sadman41 и b707 он, наверное, нужен для того, чтобы Вам отвечать. Они ведь для этого сюда пришли, правда?

Ребят, я вроде поблагодарил за понимание и ответы. Форум - это общественная платформа для общения в целом, где в частности ищут ответы. Растолкую мои слова: когда не знаешь, что ищешь - это как в сказках, принеси то, не знаю что. Ну не понял я то, что sadman41 написал, вот и уточнил, попросил конкретики.

Если Вам не хочется просто дать совет, зачем Вы вообще заходите в подобные темы? Включить врача? =)

Еще раз спасибо всем, кто помог советом, отдельное 707-му!

P.S.

Клапауций 178 пишет:

так, Гугл - помойка или твоя голова - помойка? О_О

А вот Вам бы я посоветовал следить за языком.

ArhAngeL
Offline
Зарегистрирован: 06.02.2018

qwone пишет:

Форум нужен для того, что бы проводить таких индивидов через говнотерапию. Тогда у них  мозги начинают работать и Гугл окажется не такой уж свалкой. А то вы как Дартаньян чистенький, а форумчане за вас должны ручки пачкать.

Так не отвечайте просто. В чем проблема? Индивиды, говнотерапия. Второй пост - хамство.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ArhAngeL пишет:
Так не отвечайте просто. В чем проблема? Индивиды, говнотерапия. Второй пост - хамство
Где на форуме болтается моя тема. Как раз для решения вашей задачи. Но вы продолжайте спрашивать. Может кто-то и сюда решение забросит. Мне это не надо.