Светодиодный контроллер

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем DayGaik, 23 авг 2012.

  1. DayGaik

    DayGaik Гик

    Здравствуйте. Посоветуйте пожалуйста такую микросхему, чтобы с помощью нее и одного цифрового выхода ардуино можно было управлять большим количеством светодиодов (вкл/выкл). Большим, например, десятью или двадцатью.

    Спасибо.
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    С помощью одного выхода, наверное, что-то и можно придумать, но первое, что приходит в голову — сдвиговый регистр 74HC595. Есть в чип-и-дипе. 2 входа — 8 выходов. Их можно стэкать, чтобы каждый раз получать на 7 выходов больше.

    Если нужно управлять яркостью, т.е. нужен ШИМ, придётся где-нибудь раздобыть TLC5940, 16 выходов, SPI-интерфейс (4 пина), м-м-м… :)
     
  3. <Lame>

    <Lame> Гик

    Полезная инфа:cool: , мне тож такой пригодится:)
     
    Humiboy нравится это.
  4. DayGaik

    DayGaik Гик

  5. DayGaik

    DayGaik Гик

    Пока жду сдвиговые регистры и есть время для баловства собрал индикатор мощности. Просто воткнул светодиоды через резисторы в 3,4,5,6,7,8,9,10,11,12 выходы. А в аудио-ноль вход пустил звук (только потихонечку, чтобы случаем больше 5 вольт туда не подать). С также соединил аудио-ноль с землей 10к резистором.

    Скетч:
    Код (Text):
    int led = 13;
     
    void setup() {              
      for(int i=0; i<11; i++) pinMode(3 + i, OUTPUT);
     
      // Красивая инициализация
     
      for(int i=10; i>=0; i--) {
        digitalWrite(3 + i, true);
        delay(50);
      }
     
      for(int i=10; i>=0; i--) {
        delay(50);
        digitalWrite(3 + i, false);
      }
    }
     
     
     
    unsigned long time; // Текущее время
    unsigned int value; // Значение сигнала
     
    /*
    Максимальное значение и его задержка на 50 мс нужны для красоты, чтобы диоды не моргали как сумасшедшые.
    */
    unsigned int value_max = 0;        // Максимальное значение за 50 мс.
    unsigned int value_max_time = 0;  // Время, когда было установлено максимальное значение
     
    /*
    Примерно то же самое, но для пиков.
    */
    unsigned int peak_value;
    unsigned int peak_time;
    unsigned int peak_wait;
     
    void loop() {
      time = millis();
     
      /*
        В результате данной формулы я хотел получить значение от 1 до 10.
        Не рекомендую ставить делитель больше 90, чтобы не спалить плату.
      */
      value = analogRead(0) / 20;
     
      // Устанавливаем максимальное значение
      if (value > value_max) {
        value_max = value;
        value_max_time = time;
      }
     
      // Каждые 50 мс отбавляем от него 1.
      if (time > 50 + value_max_time) {
        if (value_max > 0) value_max --;
        value_max_time = time;
      }
     
      // Примерно то же самое с пиками, но начинаем отбавлять от пика через полсекунды.
      if (value_max > peak_value) {
        peak_value = value_max;
        peak_time = time;
        peak_wait = 500;
      }
     
      if (time > peak_wait + peak_time) {
        if (peak_value > 0) peak_value --;
        peak_wait = 50;
        peak_time = time;
      }
     
      if (peak_value > 9) peak_value = 9;
     
     
      // Устанавливаем состояние светодиодов.
      for(int i=0; i<11; i++)
        digitalWrite(3 + i, (i <= value_max) || (i == peak_value ));
    }
    Как придут регистры напишу код с их учетом и на два звуковых канала. :)