Arduino UnoR3 + LEDs + shift registers

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О

Сообщение Mr.Kubikus »

Тогда надо проверять по порядку:
1. Монтаж. Может где-то плохой контакт?
2. Живы ли выходы второго регистра. Поменяйте чипы местами и посмотрите, что получится.
3. Правильно ли подключены светодиоды. Проверьте полярность.
С уважением, Григорий
GitHub FB ВК
Natvorila
Сообщения: 14
Зарегистрирован: 13 фев 2013, 11:23

Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О

Сообщение Natvorila »

Григорий, уточните пожалуйста: при плохом контакте будут ли диоды включаться? Ведь они же включаются и выполняют программу (исходный скетч).
Поменяла чипы. Ситуация та же.
при неправильной полярности диоды же просто не загораются, а они загораются при выполнении исходного скетча. просто второй комплект (на втором регистре) загорается синхронно с первым.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О

Сообщение Mr.Kubikus »

Какой скетч вы называете исходным? Покажите его здесь.
С уважением, Григорий
GitHub FB ВК
Natvorila
Сообщения: 14
Зарегистрирован: 13 фев 2013, 11:23

Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О

Сообщение Natvorila »

вот этот (в нем не прописан регистр, есть только функция):

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 > 8) numLEDSLit = 8;
leds = 0;
for (int i = 0; i < numLEDSLit; i++)
{
bitSet(leds, i);
}
updateShiftRegister();
}

void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О

Сообщение Mr.Kubikus »

Хорошо. Давайте разберем этот скетч.

1. В этом скетче для управления защелкой регистра используется пин 8 Arduino, а в описании вашей схемы вы указали, что этот вывод регистра подсоединен к пину 9 arduino. Измените скетч или схему.
2. В регистры записывается одинаковое значение по причине того, что в скетче данные для записи хранятся в одной переменной - leds, и используется только один вызов функции shiftOut(). Получается что сначала значение из переменной leds попадает в первый регистр, а затем, во время следующего вызова shiftOut(), переносится во второй регистр. Таким образом в оба регистра записывается одинаковое значение.

Попробуйте следующий скетч:

Код: Выделить всё

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, LSBFIRST, leds);
  shiftOut(dataPin, clockPin, LSBFIRST, (leds>>8));
  digitalWrite(latchPin, HIGH);
  delay(50);
}
С уважением, Григорий
GitHub FB ВК
Natvorila
Сообщения: 14
Зарегистрирован: 13 фев 2013, 11:23

Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О

Сообщение Natvorila »

я меняла 9 в скетче на 8. потому что у меня в модели я использовала 8 цифровой вход.
ЗАРАБОТАЛА!!! СПАСИБО!!! ОТЛИЧНО!
пришлось правда подправить, чтобы свет шел от первого регистра ко второму и от 1го диода к 8му и далее :)
НО ВСЕ РАБОТАЕТ :))) спасибо огромное.

а куда и как вписывать звуковую историю: нужно, чтобы после того, как будет загоратся последний диод в цепочке (16й) через некоторый промежуток времени (например через 3 секунды) должен звучать звуковой сигнал. у меня получилось два варианта: либо сигнал звучит постоянно, либо он звучит только в начале при загрузке скетча. а по идее проекта эта функция тоже должна быть зациклена, т.е. каждый раз когда будет становиться темно и будут зажигаться все лампочки до последней должен звучать этот звуковой сигнал
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О

Сообщение Mr.Kubikus »

Я рад, что у вас получилось решить задачу п. 1. Теперь переходим к п. 2.

Для начала надо выяснить, к какому пину у вас подключена пищалка?
С уважением, Григорий
GitHub FB ВК
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О

Сообщение Mr.Kubikus »

Ок. Допустим, пищалка подключена к цифровому выводу 1. Тогда программа будет выглядеть следующим образом:

Код: Выделить всё

int lightPin = 0;
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
int buzzerPin = 1;
int flagAlarm = 0;

int leds = 0;

void setup()
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(buzzerPin, 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();
  
  // Пищим при первом срабатывании flagAlarm
  if ((flagAlarm == 0) && (numLEDSLit >= 16)) {
    flagAlarm == 1;
    digitalWrite(buzzerPin, HIGH);  
    delay(1000);
    digitalWrite(buzzerPin, LOW);
  }
  
  // Сбрасываем flagAlarm
  if ((flagAlarm == 1) && (numLEDSLit < 14)) {
    flagAlarm == 0;
  }
}

void updateShiftRegister()
{
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, leds);
  shiftOut(dataPin, clockPin, LSBFIRST, (leds>>8));
  digitalWrite(latchPin, HIGH);
  delay(50);
}
С уважением, Григорий
GitHub FB ВК
Natvorila
Сообщения: 14
Зарегистрирован: 13 фев 2013, 11:23

Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О

Сообщение Natvorila »

Григорий, спасибо большое :) Протестировала. Во-первых собрала схему с 4мя регистрами. Проблема в том. что при прописывании вот такой истории:

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 / 58; //1023 / 9 / 2
if (numLEDSLit > 32) numLEDSLit = 32;
leds = 0;
for (int i = 0; i < numLEDSLit; i++)
{
bitSet(leds, i);
}
updateShiftRegister();
}

void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, (leds>>32));
shiftOut(dataPin, clockPin, MSBFIRST, (leds>>24));
shiftOut(dataPin, clockPin, MSBFIRST, (leds>>16));
shiftOut(dataPin, clockPin, MSBFIRST, (leds>>8));
shiftOut(dataPin, clockPin, MSBFIRST, leds);
digitalWrite(latchPin, HIGH);
delay(50);
}


срабатывает только два регистра. 3й и 4й не реагируют. они зажигаются в момент подключения питания, но когда загружается программа. то они не работают.
причем, когда было прописано только на 8 и 16, но собрана схема из 4х регистров, четвертый синхронился с первым, а третий не работал.


с сигналом история сработала, но он все время работает, когда загорается последний диод. как сделать так, чтобы последний диод загорался, а сигнал звучал только один раз? я вижу, что прописан сброс при срабатывании. но этого не происходит.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О

Сообщение Mr.Kubikus »

Давайте по порядку. Разберемся сначала с пищалкой.

У меня в исходном коде была ошибка.

Замените:

Код: Выделить всё

  // Пищим при первом срабатывании flagAlarm
  if ((flagAlarm == 0) && (numLEDSLit >= 16)) {
    flagAlarm == 1;
    digitalWrite(buzzerPin, HIGH); 
    delay(1000);
    digitalWrite(buzzerPin, LOW);
  }

  // Сбрасываем flagAlarm
  if ((flagAlarm == 1) && (numLEDSLit < 14)) {
    flagAlarm == 0;
  }
на:

Код: Выделить всё

  // Пищим при первом срабатывании flagAlarm
  if ((flagAlarm == 0) && (numLEDSLit >= 16)) {
    flagAlarm = 1;
    digitalWrite(buzzerPin, HIGH); 
    delay(1000);
    digitalWrite(buzzerPin, LOW);
  }

  // Сбрасываем flagAlarm
  if ((flagAlarm == 1) && (numLEDSLit < 14)) {
    flagAlarm = 0;
  }
Ошибка в том месте, где я присваиваю переменной flagAlarm значение 1 и 0. После копирования я не заменил == на =.
С уважением, Григорий
GitHub FB ВК
Ответить