Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК ОБЕЩАЛОСЬ

Тема в разделе "Arduino & Shields", создана пользователем Natvorila, 13 фев 2013.

  1. Natvorila

    Natvorila Нуб

    проблем несколько:
    1. Собрала схему по инструкции с официального сайта http://arduino.cc/en/Tutorial/ShiftOut. Проверила уже не раз. При подключении второго shift регистра и с ним второго набора из 8ми диодов мигание получается синхронным, т.е. при загрузке приведенных там примеров мигают два первых диода на обоих регистрах, потом два вторых диода и т.п. Т.е. не получается сделать так, чтобы диоды зажигались последовательно: сначала пройдя ряд на первом регистре, а потом на втором.
    2. По проекту мне нужно сделать так, чтобы после того, как пройдет программа с набором света (вот эта: http://learn.adafruit.com/adafruit-arduino-lesson-9-sensing-light/arduino-code) в конце, тогда, когда загорается последний диод в линейке, должен подаваться звуковой сигнал (можно даже типовой из примеров в самом ардуино). после того, как он закончит играть мелодию, он должен замолчать.

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

    ПОМОГИТЕ ПОЖАЛУЙСТА
     
  2. roggedhorse

    roggedhorse Гик

    а какова цель проекта ?
    можно ли отказаться от сдвигового регистра ?
     
  3. Citrus

    Citrus Нерд

    Хотелось бы увидеть ваш код и схему вашу... где-то касяк
    Порылся в гугле попробуйте вот это...
    Код (Text):
    /*
    Программа поочередно включается все светодиоды, подключенные к двум
    сдвиговым регистрам 74HC595 .Created 22 May 2009
    Modified 23 Mar 2010
    by Tom Igoe
    */
     
    //Пин подключен к ST_CP входу 74HC595
    const int latchPin = 8;
    //Пин подключен к SH_CP входу 74HC595
    const int clockPin = 12;
    //Пин подключен к DS входу 74HC595
    const int dataPin = 11;
     
    char inputString[2];
     
    void setup() {
      //устанавливаем режим OUTPUT
      pinMode(latchPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      Serial.begin(9600);
      Serial.println("reset");
    }
     
    void loop() {
      // проходим циклом по всем 16 выходам двух регистров
      for (int thisLed = 0; thisLed < 16; thisLed++) {
        // записываем сигнал в регистр для очередного светодиода
        registerWrite(thisLed, HIGH);
        // если это не первый светодиод, то отключаем предыдущий
        if (thisLed > 0) {
          registerWrite(thisLed - 1, LOW);
        }
        // если это первый светодиод, то отключаем последний
        else {
          registerWrite(15, LOW);
        }
        // делаем паузу перед следующией итерацией
        delay(250);
      }
     
    }
     
    // этот метод отсылает бит на сдвиговый регистр
     
    void registerWrite(int whichPin, int whichState) {
      // для хранения 16 битов используем unsigned int
      unsigned int bitsToSend = 0;
     
      // выключаем светодиоды на время передачи битов
      digitalWrite(latchPin, LOW);
     
      // устанавливаем HIGH в соответствующий бит
      bitWrite(bitsToSend, whichPin, whichState);
     
      // разбиваем наши 16 бит на два байта
      // для записи в первый и второй регистр
      byte registerOne = highByte(bitsToSend);
      byte registerTwo = lowByte(bitsToSend);
     
      // "проталкиваем" байты в регистры
      shiftOut(dataPin, clockPin, MSBFIRST, registerTwo);
      shiftOut(dataPin, clockPin, MSBFIRST, registerOne);
     
      // "защелкиваем" регистр, чтобы биты появились на выходах регистра
      digitalWrite(latchPin, HIGH);
    }
     
    nailxx нравится это.
  4. Natvorila

    Natvorila Нуб

    Ой. Действительно забыла написать для чего это все. Это учебный проект. Должна быть сделана лампа, которая бы постепенно зажигалась в зависимости от того, как темнеет за окном. В конце, когда зажжется последний диод, должен прозвучать звуковой сигнал, что-то типа напоминания, что уже слишком поздно и юзеру пора идти спать.
    8ми диодов для лампы мало и когда их всего 8, то действие не совсем очевидно. Поэтому нужно больше диодов, а значит, что они должны быть подключены через регистры.
     
  5. roggedhorse

    roggedhorse Гик

    если речь о лампе, то может вам рассмотреть вариант PWM и какого-нибудь сверхъяркого светодиода ?

    P.S. как вы подаете питание на светодиоды (регистры) ? Если от ардуины, не исключено, что ей не хватает силенок.
     
  6. Natvorila

    Natvorila Нуб

    дело не только в яркости. в проекте должно быть отражено, что работает ардуино. если бы вопрос был просто в создании лампы, то можно было бы использовать лампу накаливания и провод и не трогать ардуино
     
  7. Megakoteyka

    Megakoteyka Оракул Модератор

    Можно зажигать сразу цепочку светодиодов (или светодиодную ленту), регулируя напряжение при помощи транзистора. Тогда понадобится одна ножка для управления яркостью и одна ножка для звукового сигнала - и никаких сдвиговых регистров.
     
  8. roggedhorse

    roggedhorse Гик

    ну вот и отлично: выход PWM Ардуино на сверхъяркий светодиод позволит показать, что ваше устройство умеет управлять яркостью лампы.
     
  9. Megakoteyka

    Megakoteyka Оракул Модератор

    А уровень освещенности будете с датчика брать или просто по часам? В любом случае тут тоже без контроллера сложно обойтись. Лампа накаливания с проводом не будет плавно загораться, а тем более пищать мелодию в конце)
     
  10. Natvorila

    Natvorila Нуб


    да нет, она же зажигает их все. во всяком случае 2 регистра с 16 диодами. они просто синхронно зажигаются. не последовательно от регистра к регистру.
     
  11. Natvorila

    Natvorila Нуб

    у нас по заданию должен быть использован сенсор и у меня в проекте используется датчик освещенности
     
  12. Megakoteyka

    Megakoteyka Оракул Модератор

    А зажигать по очереди - это принципиально? Или принципиально добиться плавного увеличения освещенности?
     
  13. Natvorila

    Natvorila Нуб

    желательно зажигать по очереди
     
  14. Unixon

    Unixon Оракул Модератор

    Можете показать фото вашей сборки и конкретный скетч из первого сообщения?
     
  15. Natvorila

    Natvorila Нуб

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

    int lightPin = 0;
    int latchPin = 8;
    int clockPin = 12;
    int dataPin = 11;

    int leds = 0;

    void setup()
    {
    pinMode(latchPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    }

    void loop()
    {
    int reading = analogRead(lightPin);
    int numLEDSLit = reading / 57; //1023 / 9 / 2
    if (numLEDSLit > 16) numLEDSLit = 16;
    leds = 0;
    for (int i = 0; i < numLEDSLit; i++)
    {
    bitSet(leds, i);
    }
    updateShiftRegister();
    }

    void updateShiftRegister()
    {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, (leds>>8));
    shiftOut(dataPin, clockPin, MSBFIRST, leds);

    digitalWrite(latchPin, HIGH);
    delay(50);
    }