Как ПЕРЕКЛЮЧИТЬ 4 светодиода с 0 на полную яркость с помощью двухосевого резистивного джойстика?

led pwm joystick
  • Я пытаюсь использовать функцию Arduino MAP, чтобы позволить мне управлять 4 светодиодами в диапазоне от 0 до полной яркости. Я предполагаю, что сложность заключается в том, что нейтральное положение джойстика находится на пределе диапазона потенциометров, поэтому аналоговое напряжение на входах составляет + 2,5 В, когда джойстик находится в нейтральном положении). В идеале я хочу, чтобы красный светодиод, связанный с осью Y, переходил от 0 к полному, когда джойстик отодвигается. Аналогично, я хочу, чтобы синий светодиод, связанный с осью Y, горел от 0 до полного, когда джойстик тянут ко мне. Я хочу продублировать это действие для оси X с помощью зеленых и желтых светодиодов, но, похоже, я не могу понять, как компенсировать смещение 2,5 В* Я надеялся, что смогу просто использовать сопоставление значений.

, 👍1

Обсуждение

Да, просто сопоставьте 2,5-5 с 0-255 и проанализируйте это значение, @Sim Son

int x=analogRead(A0);если (x >=512) red=(x-512)/2; и т.д., @DataFiddler

Спасибо всем, кто откликнулся. Я пробовал подход Симсона и так же безуспешно. Мне нужно будет протестировать другие методы.Я доложу о прогрессе., @Tokthebloke


1 ответ


2

Есть несколько шагов, которые вам нужно пройти:

  1. Считайте АЦП, чтобы узнать положение джойстика
  2. Вычтите 50% от полного диапазона (512), чтобы получить значение ± 512
  3. Обратите внимание на знак, чтобы узнать направление
  4. Возьмите абсолютное значение, чтобы получить расстояние
  5. Вычтите небольшое количество, чтобы создать "мертвую зону" в центре джойстика.
  6. Сопоставьте результат с 0-255 для ШИМ.

Код может выглядеть следующим образом (примечание: непроверенный):

int y = analogRead(0);    // Получаем текущее значение
y -= 512;                 // Вычесть 512

int pin = 2;              // Если не указано иное, используйте контакт 2
if (y < 0) {              // Если он отрицательный...
    pin = 3;              // тогда вместо этого мы будем использовать pin 3
}

y = abs(y);               // Берем абсолютное значение (отбрасываем знак)
y -= 20;                  // вычтите 20 для мертвой зоны
If (y < 0) y = 0;         // обнуление любого отрицательного
y = map(0, 492, 0, 255);  // сопоставьте новый полный диапазон от 0-492 до 0-255
analogWrite(pin, y);      // зажгите светодиод на выводе, который мы выбрали выше.

И сделайте то же самое для X с разными выводами.

,

Если вы вычтете 20 из y перед отображением, не приведет ли это к некоторым отрицательным значениям y? (Диапазон будет от -20 до 492 вместо 0-512.) Что делает map со значениями, выходящими за пределы диапазона?, @Duncan C

Я бы предложил вместо этого изменить y -= 20; на if y <= 20 y = 0;., @Duncan C

Хороший вопрос. Вы должны сделать это в 0., @Majenko