Опубликовано: 05.09.2016 19:22
Автор: jazon
Доброго времени суток, всем тем кто зашел на наш сайт. Начну свою историю с того что было желание что то сделать - своими руками, испытать скажем так творческие муки. И вот листая интернет страницы торгового сайта AliExpress я нашел такие вот наборы типа "сделай сам", а точнее спаяй сам. Очень понравилось сердце на светодиодах, и оценив свои возможности я приступил к делу. Кстати - вот такое вот фото с сайта Ali Express именно с образцом светодиодного сердца. Из возможностей у меня было:
Может быть кому то мои действия покажутся непоследовательными, но начал я с того что расположил все светодиоды в виде сердца, затем расположил две микросхемы и приступил к пайке. В результате спаянное изделие приобрело вот такой жуткий вид:
Но - главное заставить всё заработать в дальнейшем!!! Подключив спаянную плату к 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 для этой статьи можно почитать здесь, здесь и здесь.
Ну а теперь разбор программы пошагово:
Небольшая таблица поможет более наглядно увидеть что происходит в цикле for программы
j | L | leds(INT) | leds(WORD) |
0 | 1 | 1 | 0x0000000000000001 |
1 | 2 | 2 | 0x0000000000000010 |
2 | 4 | 4 | 0x0000000000000100 |
3 | 8 | 8 | 0x0000000000001000 |
4 | 16 | 16 | 0x0000000000010000 |
5 | 32 | 32 | 0x0000000000100000 |
6 | 64 | 64 | 0x0000000001000000 |
7 | 128 | 128 | 0x0000000010000000 |
И так далее... Пока число leds не достигнет значения 32768 что в переводе в двоичный формат числа будет равно 1000000000000000, включится последний светодиод и программа начнет цикл заново. Результат можно увидеть на видео, качество не очень, но в целом картина ясно показывает что получилось.
Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.