Два светодиода и два потенциометра.

bumrik
Offline
Зарегистрирован: 13.01.2016

Добрый день!

Я новичок  в этом деле, собрал самую простейшую схему, два светодиода и два потенциометра.

При вращении первого все отлично работает, когда начитаю вращать второй, второй светодиод не работает а работает первый, где ошибка?

Схема

Видео

https://yadi.sk/i/rzQDcEsmqccyr

Скейтч

int sensorPin=A0;
int sensorPin2=A1;
int ledPin = 2;
int ledPin2 = 3;

 
void setup() {
   pinMode(ledPin, OUTPUT);
   pinMode(ledPin2, OUTPUT);
}

void loop(){
    readSensor(sensorPin);
    readSensor2(sensorPin2);
}

  void readSensor(int sensorPin){
int analogueValue = analogRead(sensorPin); // читаем аналоговый пин A0
analogueValue = map(analogueValue, 0, 1023, 0, 9); //преобразуем диапазон с А0 (0-1023) в нужный нам (0-9)
analogWrite(ledPin, analogRead(analogueValue)/9);
}

 void readSensor2(int sensorPin2){
int analogueValue2 = analogRead(sensorPin2); // читаем аналоговый пин A1
analogueValue2 = map(analogueValue2, 0, 1023, 0, 9); //преобразуем диапазон с А1 (0-1023) в нужный нам (0-9)
analogWrite(ledPin2, analogRead(analogueValue2)/9);
}

Спасибо!

okta
Offline
Зарегистрирован: 10.01.2015

Читаем

"На большинстве плат Arduino (на базе микроконтроллера ATmega168 или ATmega328) ШИМ поддерживают порты 3, 5, 6, 9, 10 и 11"

И, честно говоря, конструкция analogWrite(ledPin, analogRead(analogueValue)/9); поставила меня в тупик. По какой такой случайности оно у вас работает - я не понимаю...

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

okta пишет:

И, честно говоря, конструкция analogWrite(ledPin, analogRead(analogueValue)/9); поставила меня в тупик. По какой такой случайности оно у вас работает - я не понимаю...

Есть многое на свете, брат Горацио ... :)))

bumrik
Offline
Зарегистрирован: 13.01.2016

pin 2 заменил на pin 5 светодиод 2 начал работать синхронно с светодиодом 1. При вращении потенциометра 2, работает светодиод 1 в среднем положении он гаснет.

analogWrite(ledPin, analogRead(analogueValue)/9); без этого светодиоды работать не будут

у меня ATmega328

Какие еще есть варианты?

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

bumrik пишет:

analogWrite(ledPin, analogRead(analogueValue)/9); без этого светодиоды работать не будут

Эт точно!

Тока уж просветите нас тёмных, что эта строка делает. Подробненько так, пожалуйста.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Цитата:
Какие еще есть варианты?

void readSensor(int sensorPin){
  analogWrite(ledPin, analogRead(sensorPin));
}

void readSensor2(int sensorPin2){
  analogWrite(ledPin2, analogRead(sensorPin2));
}

 

bumrik
Offline
Зарегистрирован: 13.01.2016

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

bumrik пишет:

analogWrite(ledPin, analogRead(analogueValue)/9); без этого светодиоды работать не будут

Эт точно!

Тока уж просветите нас тёмных, что эта строка делает. Подробненько так, пожалуйста.

Не смогу! Так как я этот код скопиравал с другого проекта но найти этот проект больше не могу :(

bumrik
Offline
Зарегистрирован: 13.01.2016

Andy пишет:

Цитата:
Какие еще есть варианты?

void readSensor(int sensorPin){
  analogWrite(ledPin, analogRead(sensorPin));
}

void readSensor2(int sensorPin2){
  analogWrite(ledPin2, analogRead(sensorPin2));
}

 

Работает! Спасибо!

bumrik
Offline
Зарегистрирован: 13.01.2016

Andy пишет:

Цитата:
Какие еще есть варианты?

void readSensor(int sensorPin){
  analogWrite(ledPin, analogRead(sensorPin));
}

void readSensor2(int sensorPin2){
  analogWrite(ledPin2, analogRead(sensorPin2));
}

 

Сразу не обратил внимания но пропала плавность включения, светодиоды загораются за первые 3 мм поворота потенциометра.

С предыдущим было более плавно. 

okta
Offline
Зарегистрирован: 10.01.2015

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

bumrik пишет:

analogWrite(ledPin, analogRead(analogueValue)/9); без этого светодиоды работать не будут

Эт точно!

Тока уж просветите нас тёмных, что эта строка делает. Подробненько так, пожалуйста.

Если вы последуете этому совету, то сами ответите почему работает неправильно.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

bumrik пишет:
пропала плавность включения, светодиоды загораются за первые 3 мм поворота потенциометра. С предыдущим было более плавно.
Что если

analogWrite(ledPin, analogRead(sensorPin)/100);

 

okta
Offline
Зарегистрирован: 10.01.2015

Andy пишет:

Цитата:
Какие еще есть варианты?

void readSensor(int sensorPin){
  analogWrite(ledPin, analogRead(sensorPin));
}

void readSensor2(int sensorPin2){
  analogWrite(ledPin2, analogRead(sensorPin2));
}

 

Вот объясните, и зачем тогда это функциями оформлять? Ради смены названия? У ТС хоть попытка масштабирования аналового значения была...

Отдельно радует, что одну переменную функции передаем, а вторую таки нафик - возьмем напрямую из глобальных)) Тогда уж либо все глобальные, либо обе передаем и объединяем две функции в одну.

Andy пишет:

bumrik пишет:
пропала плавность включения, светодиоды загораются за первые 3 мм поворота потенциометра. С предыдущим было более плавно.
Что если

analogWrite(ledPin, analogRead(sensorPin)/100);

 

Про деление на 100... А почему на 100? может лучше на 1000? Или не, лучше на 50... или на 100500...

В описании AnalogWrite все что нужно для базового управления яркостью светодиода написано. Если делать более интересно, то еще надо как минимум диапазон фактических значений потенциометров замерять и от этих значений делать массштабирование на минимум максимум ШИМа.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

okta, мне не надо ликбез проводить, а автору не имеет смысла задавать эти вопросы. Поэтому, если у тебя приступ перфекционизма, просто напиши скетч и дай автору.

okta
Offline
Зарегистрирован: 10.01.2015

Где увидели ликбез для вас? Все как раз наоборот, для ТС я дал несколько комментариев, а вам задал несколько вопросов, т.к. действительно интересно чем руководствуетесь давая такие советы...

Скетч уже написан по приведенной (уже дважды) выше ссылке. Если ТС не может раскопировать его с одного диода на два...

bumrik
Offline
Зарегистрирован: 13.01.2016

Andy пишет:

bumrik пишет:
пропала плавность включения, светодиоды загораются за первые 3 мм поворота потенциометра. С предыдущим было более плавно.
Что если

analogWrite(ledPin, analogRead(sensorPin)/100);

 

Работает отлично!

Всем спасибо!

okta
Offline
Зарегистрирован: 10.01.2015

bumrik пишет:

Работает отлично!

Всем спасибо!

Урааа!!! Мы за вас рады)))))))))  Регулировку от 0 до 4% яркости реализовали... Задача решена, можно смело штурмовать новые вешины знаний )))))

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

okta пишет:

Урааа!!! Мы за вас рады)))))))))  Регулировку от 0 до 4% яркости реализовали... Задача решена, можно смело штурмовать новые вешины знаний )))))

Да, нет, у него там просто резистор маленький стоит и уже при дохлом ШИМе получается, что горит ярко, а при увеличении дальше - на глаз ничего не меняется. А когда делит на 100 - вроде как на всё "повороте потенциометра" что-то меняться продолжает.

vk007
Offline
Зарегистрирован: 16.06.2015

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

Да, нет, у него там просто резистор маленький стоит и уже при дохлом ШИМе получается, что горит ярко, а при увеличении дальше - на глаз ничего не меняется.

Вот кстати, я тоже экспериментировал с плавным наростанием яркости светодиода. И получается, что на минимальных значениях для шима разница в яркости очень сильно ощущается. Т.е. выставив в analogWrite единицу светодиод уже "рвется в бой". Точно также заметна разница между 1 и 2 и т.д. Но потом на некотором этапе все это нивелируется и разница на глаз уже незаметна.

А как бы в начале сгладить эти скачки? Можно, конечно, сопротивление токоограничивающего резистора существенно повысить, но тогда не выйдем на полную мощность.

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

vk007 пишет:

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

Да, нет, у него там просто резистор маленький стоит и уже при дохлом ШИМе получается, что горит ярко, а при увеличении дальше - на глаз ничего не меняется.

Вот кстати, я тоже экспериментировал с плавным наростанием яркости светодиода. И получается, что на минимальных значениях для шима разница в яркости очень сильно ощущается. Т.е. выставив в analogWrite единицу светодиод уже "рвется в бой". Точно также заметна разница между 1 и 2 и т.д. Но потом на некотором этапе все это нивелируется и разница на глаз уже незаметна.

А как бы в начале сгладить эти скачки? Можно, конечно, сопротивление токоограничивающего резистора существенно повысить, но тогда не выйдем на полную мощность.

Тут два аспекта.

1. Полная мощность.

Это легко, достаточно подобрать резистор так, чтобы при полном шиме ток был 20мА. Но это не поможет, т.к. визуально Вы не отличите свечение диода при 20мА и при 10мА, поэтом визуально будет казаться, что сначала что-то меняется, а потом не менгяется ничего.

2. Визуализация

Чтобы визально было всё в порядке нужно брать переменный резистор (потенциометр) с нелинейной функциональной характеристикой (с логарифмической). Если русский потенциометр, то это характеристика В, если импортный, то А. Этот резистор сначала будет очень медленно увеличивать своё сопротивление, а потом (ближе к концу поворат движка) наоборот резко.

Таки переменные резисторы используют для регулирования горомкости (если оно не цифорове). При линейном резисторе там такие же проблемы - сначал растёт, а потом перестаёт

vk007
Offline
Зарегистрирован: 16.06.2015

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

поэтом визуально будет казаться, что сначала что-то меняется, а потом не менгяется ничего.

Так вот и я о том. И вначале это не только кажется, а очень даже заметно.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

vk007 пишет:
заметна разница между 1 и 2 и т.д. Но потом на некотором этапе все это нивелируется и разница на глаз уже незаметна.
Между 1 и 2 разница 100%, между 9 и 10 - 10%, между 999 и 1000 - 0.1%

okta
Offline
Зарегистрирован: 10.01.2015

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

okta пишет:

Урааа!!! Мы за вас рады)))))))))  Регулировку от 0 до 4% яркости реализовали... Задача решена, можно смело штурмовать новые вешины знаний )))))

Да, нет, у него там просто резистор маленький стоит и уже при дохлом ШИМе получается, что горит ярко, а при увеличении дальше - на глаз ничего не меняется. А когда делит на 100 - вроде как на всё "повороте потенциометра" что-то меняться продолжает.

Да, я тогда начал было писать про скважность ШИМ, но решил сказать попроще, и быстренько заменил на яркость :) Согласен, очень неудачно :)

Andy пишет:

vk007 пишет:
заметна разница между 1 и 2 и т.д. Но потом на некотором этапе все это нивелируется и разница на глаз уже незаметна.
Между 1 и 2 разница 100%, между 9 и 10 - 10%, между 999 и 1000 - 0.1%

Что-то вы смешали в кучу понятия разницы, и соотношения разницы. Скважность ШИМа меняетя линейно (в рамках погрешности таймера). Обычный потенциометр тоже почти линейно меняет напряжение на выходе (да - со значительно большей погрешностью линейности).  Так что разница между шагами (без учета погрешности) всегда = 1  хоть между 1 и 2, хоть 999 и 1000. Арифметически, конечно, разница между числами соотносится к самим числам в разных долях. Но в любом случае - ни к скважности ШИМ, ни к данным полученным с потенциометра, ни к яркости светодиода приведенные вами проценты ни какого отношения не имеют. Другой вопрос, что восприятие яркости нелинейно. Почитайте посты Евгения. Практически к любому светодиоду можно подобрать резистор так, что изменение его яркости заметно на всем диапазоне ШИМ (ну уж точно большем чем на 4% диапазоне).

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

okta пишет:
Почитайте посты Евгения. Практически к любому светодиоду можно подобрать резистор так, что изменение его яркости заметно на всем диапазоне ШИМ (ну уж точно большем чем на 4% диапазоне).
okta, почитай что такое PCM и с какой целью оно делается, а так же задумайся почему на черном небе можно увидеть звезду, а на солнце нельзя увидеть такое же черное пятнышко.

okta
Offline
Зарегистрирован: 10.01.2015

ИКМ то тут причем (или вы что-то другое имели в виду)? Пятно на солнце мы не видим исключительно из-за особенности нашего зрения. Но ни как не из-за того, что разница между черным небом и звездой грубо говоря 100%, а между солнцем и черным пятнышком 0.1%. Приведите уровень яркости в различимый глазу диапазон, и наблюдайте пятнышко на солнце (темное стеклышко возьмите).

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

okta пишет:
ИКМ то тут причем
При том, что сжатие в нем нелинейное. И почему-то малые значения сигнала не сжимают, а только большие значения. Почему так?

okta пишет:
Приведите уровень яркости в различимый глазу диапазон, и наблюдайте пятнышко на солнце (темное стеклышко возьмите).
Беру темное стеклышко - делитель на 100. Теперь 999 и 1000 это 9,99 и 10. Типа теперь ты отличишь изменение яркости?

kulon
Offline
Зарегистрирован: 02.03.2016

как-то купил такой как на фото потенциометр, поставил - все вроде заработало.

потом отлаживал скетч, а у меня перестало нормально работать, сначала думал что-то в коде, оказалось что это реостат перестал норм работать, толи флюс попал, толи еще какой налет (там прорезь возле контактов).

увидел глючность стандартным скетчем из образцов 1. Basic -> ReadAnalogVoltage

kulon
Offline
Зарегистрирован: 02.03.2016

вопрос: если задать аналоговому входу pullup (или внеш подтягивающий резитор к плюс 5в) и соединить с потенциометром двумя проводами(ноль и средний ползунок) будет плавно работать?

okta
Offline
Зарегистрирован: 10.01.2015

Andy пишет:

okta пишет:
ИКМ то тут причем
При том, что сжатие в нем нелинейное. И почему-то малые значения сигнала не сжимают, а только большие значения. Почему так?

okta пишет:
Приведите уровень яркости в различимый глазу диапазон, и наблюдайте пятнышко на солнце (темное стеклышко возьмите).
Беру темное стеклышко - делитель на 100. Теперь 999 и 1000 это 9,99 и 10. Типа теперь ты отличишь изменение яркости?

Давайте на пальцах. В идеале потенциометр после АЦП должен давать с выхода линейно от 0 до 1023. Допустим так оно и есть.  Не совсем линейно, но здесь это большой роли не играет. Также как и погрешность АЦП при ИКМ про которую упоминаете. На ШИМ мы можем давать значения от 0 до 255. При этом сила тока протекающая через диод линейно меняется в зависимости от скважности ШИМ. Яркость светодиода также практически линейно зависит от силы тока. Известно, что визуально изменение яркости диода мы видим только при ШИМ = от 0 до 9. И тут у нас появляется два пути:

1. То что делаете вы - разделить выход АЦП на 100 - оставив таким образом по сути 10 градаций уровня яркости (разве это похоже на действие затемненного стеклышка?). Ни какого отношения это действие к ИКМ не имеет.

2. Увеличить номинал резистора у светодиода, тем самым сдвинув уровни яркости светодиода, а следовательно увеличив количество градаций яркости, которые мы видим (вот это уже больше похоже на затемненное стеклышко). Значение на выходе АЦП делить все равно придется.

И то и другое правильно, но ни какого отношения к "Между 1 и 2 разница 100%, между 9 и 10 - 10%, между 999 и 1000 - 0.1%" не имеет.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

okta пишет:
Давайте на пальцах.
На пальцах так на пальцах. Ток через светодиод пропорционален значению ШИМ, так? Изменение значения ШИМа 1->2 увеличивает ток в 2 раза. Изменение значения ШИМа 254 -> 255 увеличивает ток в 0.004 раза. Нет возражений?

В обоих случаях изменение на 1. Какое изменение более заметно?

 

okta
Offline
Зарегистрирован: 10.01.2015

Andy пишет:

 Ток через светодиод пропорционален значению ШИМ, так? Изменение значения ШИМа 1->2 увеличивает ток в 2 раза.

Изменение шим с 9 до 18 и с 18 до 36 и с 36 до 72 и т.д. тоже изменит ток в 2 раза, яркость изменится вдвое?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

okta пишет:
Изменение шим с 9 до 18 и с 18 до 36 и с 36 до 72 и т.д. тоже изменит ток в 2 раза, яркость изменится вдвое?
Вдвое. Зависимость интенсивности излучения от тока достаточно линейна.

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

kulon пишет:

вопрос: если задать аналоговому входу pullup (или внеш подтягивающий резитор к плюс 5в) и соединить с потенциометром двумя проводами(ноль и средний ползунок) будет плавно работать?

Возьмите потенциометр с логарифмической функциональной характеристикой и будет всё классно.

okta
Offline
Зарегистрирован: 10.01.2015

Andy пишет:

okta пишет:
Изменение шим с 9 до 18 и с 18 до 36 и с 36 до 72 и т.д. тоже изменит ток в 2 раза, яркость изменится вдвое?
Вдвое. Зависимость интенсивности излучения от тока достаточно линейна.

Именно так. Очень хорошо, что изменили слово яркость на интенсивность излучения. Т.к. изначально вопрос стоял, что "на глаз яркость" т.е. видимая яркость. И вот тут ваша формула перестает работать - вмешивается несовершенство нашего зрения. Так вот даже просто подбором номинала резистора к светодиоду "на глаз" видимый диапазон ШИМ можно значительно расширить, а не оставлять 10 градаций яркости. О чем я второй день, может быть не очень последовательно и доходчиво, пытаюсь сказать.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

okta пишет:
И вот тут ваша формула перестает работать - вмешивается несовершенство нашего зрения. Так вот даже просто подбором номинала резистора к светодиоду "на глаз" видимый диапазон ШИМ можно значительно расширить, а не оставлять 10 градаций яркости. О чем я второй день, может быть не очень последовательно и доходчиво, пытаюсь сказать.
О каком несовершенстве зрения ты ведешь речь? Можно подумать свечение за гранью человеческих возможностей.... Автору надо было сжать диапазон 0-1023 до 0-9 и выбрать значение ШИМа из массива {0,1,2,4,8,16,32,64,128,255}. Делением на 100 он использовал половину значений 0,1,2,4,8. Ты ноешь второй день сам не знаешь чего хочешь. Напиши автору скетч и успокойся.

okta
Offline
Зарегистрирован: 10.01.2015

ТС всем доволен, вы ему помогли (уж извините, что на вы).  Вот мне тогда и стало интересно, вы дали полурешение, без каких либо комментариев, потом еще одно, и еще и понеслось. Извиняюсь, если мой интерес показался несколько навязчивым )))

PS думаю ТС, если вернется в эту тему, из последующей переписки вынесет куда больше полезной инфы, чем от того решения, которым остался так доволен )))

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

okta пишет:
вы дали полурешение, без каких либо комментариев, потом еще одно, и еще и понеслось. Извиняюсь, если мой интерес показался несколько навязчивым )))
okta, я лишь минимально изменил скеч автора, чем пресек начавшийся стёб.

Так что у тебя там со зрением? Можешь различать яркость свечения светодиодов с ШИМом 254/255 или нет?

okta
Offline
Зарегистрирован: 10.01.2015

Andy пишет:

okta, я лишь минимально изменил скеч автора, чем пресек начавшийся стёб.

Где вы там "стёб" то нашли? Что ШИМ не на тот канал был подключен? Так прямо сразу сказали. Что с параметрами функции analogWrite() всеже надо разобраться, а не писать в нее что угодно? Таки да, показали описание функции. Я уже не раз замечал, как сыну прямое решение скажешь, так потом жди двойку. А если просто направишь его непонятки на правильные страницы учебника, и ответишь на возникшие вопросы...

Andy пишет:

Так что у тебя там со зрением? Можешь различать яркость свечения светодиодов с ШИМом 254/255 или нет?

Да уж... Раз уж вы ко мне упорно на ты, ок. Друг, ты предложил ограничить скважность ШИМ 4% от возможного диапазона, аппелируя, что в верхнем диапазоне относительная яркость приростает медленннее, чем в нижнем. На что я возразил, что видимая яркость приведенным процентам не соответствует ни разу, и ее можно значительно расширить. Про ИКМ вышло взаимное недопонимание - я со стороны АЦП смотрел (тут да, переклинило), а не на выход на светодиод (ну какие там верхние значения, если у ТС максимальная яркость при скважности чуть выше нуля).