Led Сердце на сдвиговых регистрах 7HC595N

05.09.2016 19:22

jazon



Сердце на светодиодах с применением регистра сдвига 7HC595N и Arduino Nano.

Доброго времени суток, всем тем кто зашел на наш сайт. Начну свою историю с того что было желание что то сделать - своими руками, испытать скажем так творческие муки. И вот листая интернет страницы торгового сайта AliExpress я нашел такие вот наборы типа "сделай сам", а точнее спаяй сам. Очень понравилось сердце на светодиодах, и оценив свои возможности я приступил к делу. Кстати - вот такое вот фото с сайта Ali Express именно с образцом светодиодного сердца. Из возможностей у меня было: 

  1. Светодиоды 16 штук(Очень яркие штучки)
  2. Две микросхемы - выходные сдвиговые регистры 7HC595N
  3. Резисторы номиналом 220 Ом - 16 штук(Очень даже совковые резисторы)
  4. Конденсаторы неполярные 0,1mf - 2 штуки
  5. Двухсторонняя макетная плата для пайки - 1 штука
  6. Arduino Nano(без неё конечно никак :)
  7. Желание всё это спаять и получить результат!!!
  8. ????
  9. PROFIT!!!!  

Может быть кому то мои действия покажутся непоследовательными, но начал я с того что расположил все светодиоды в виде сердца, затем расположил две микросхемы и приступил к пайке. В результате спаянное изделие приобрело вот такой жуткий вид:

Но - главное заставить всё заработать в дальнейшем!!! Подключив спаянную плату к Arduino Nano я начал разбор полётов, и написание скетча, в конечном итоге это должно быть светодиодное сердце с "бегущим огоньком". То есть я взял самую простую задачу для себя. Все детали были спаяны именно по нижеследующей схеме: 

Схема была взята с сайта Arduino.cc, именно со страницы разбора работы этих сдвиговых регистров. Скажу сразу - что не всё прошло гладко, и при включении и заливке скетча в плату ничего толком не работало. Светодиоды зажигались не в установленном порядке, а точнее в беспорядке и как попало. Я начал было думать - что то не так с пайкой, в результате оказалось что конденсатор емкостью 1mf(он единственный на схеме) мешал каким то образом корректной работе сдвиговых регистров. Когда он был исключен из схемы всё заработало так как надо.  

Скетч программы для "бегущего огонька":

const int latchPin = 8;       //Зелёный
const int dataPin  = 11;      //Желтый
const int clockPin = 12;      //Красный
                              /*
                               * Белый + 5В
                               * Фиолетовый GND
                               */

void setup() 
{
  Serial.begin(9600);
  pinMode(latchPin,  OUTPUT);  
  pinMode(dataPin,   OUTPUT); 
  pinMode(clockPin,  OUTPUT);
}

void loop() 
{
  for(int j = 0; j < 16; j ++)
  {
    double L = pow(2, j); 
    word leds = round(L); // округляем число до целого
    
    digitalWrite(latchPin, LOW);   
         
    shiftOut(dataPin, clockPin, MSBFIRST, leds);
    shiftOut(dataPin, clockPin, MSBFIRST, leds >> 8);
    
    digitalWrite(latchPin, HIGH);
    
    delay(25);
  
  }
}

 Итак, как видно из кода latchPin = 8, переменная указывающая к какому выходу платы Nano подключить ведомое устройство, в нашем случае это модуль со сдвиговыми регистрами и светодиодами. Когда программа будет подавать низкий уровень(0V) на этот контакт, то сдвиговый регистр будет принимать последовательность бит, формируемый функцией shiftOut(). Последовательность бит образует число, которое в двоичном коде передаётся  на dataPin = 11, это контакт на плате Nano. Ну и clockPin это контакт тактирования для шины SPI. Подробнее о шине SPI для этой статьи можно почитать здесь, здесь и здесь. 

Ну а теперь разбор программы пошагово:

  1. Объявляем переменную и присваиваем ей результат функции pow()
  2. Объявляем переменную leds, типа WORD, инициализируя её значением округляемой переменной L(Сдвиговый регистр может принимать только целые числа)
  3.  Функция dataWrite(latchPin, LOW) устанавливает низкий уровень на контакте 8 платы Nano, тем самым обращаясь к модулю со сдвиговыми регистрами
  4. Функция shiftOut(dataPin, clockPin, MSBFIRST, leds) записывает значение переменной leds в сдвиговые регистры начиная со старшего значащего бита
  5. Функция shiftOut(dataPin, clockPin, MSBFIRST, leds >> 8) записывает значение переменной leds в сдвиговые регистры при этом смещая значение на 8 бит
  6. Функция digitalWrite(latchPin, HIGH) устанавливает высокий уровень на контакте 8 платы Nano, тем самым заканчивая работы с модулем регистров сдвига.
  7. Задержку в 25 миллисекунд можно менять по желанию, это даёт скорость последовательного включения светодиодов(чем меньше значение, тем быстрее "бегущий огонёк")

Небольшая таблица поможет более наглядно увидеть что происходит в цикле for программы

j
L
leds(INT)
leds(WORD)
0110x0000000000000001
1220x0000000000000010
2440x0000000000000100
3880x0000000000001000
416160x0000000000010000
532320x0000000000100000
664640x0000000001000000
71281280x0000000010000000


И так далее... Пока число leds не достигнет значения 32768 что в переводе в двоичный формат числа будет равно 1000000000000000, включится последний светодиод и программа начнет цикл заново. Результат можно увидеть на видео, качество не очень, но в целом картина ясно показывает что получилось.




Расскажи о нас

Сообщение

Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.