23 листопада 2016 р.

9. Діодне освітлення з використанням регістра зсуву

Відколи ми почали додавати до робота нові і нові пристрої, серйозною проблемою  стала обмежена кількість виводів Arduino Uno. І то наш проект ще зовсім далекий до завершення. Що ж буде далі?

Варіантів вирішення є досить багато, аж до використання кількох плат Arduino, кожна з яких має свою спеціалізацію. Але погодьтеся, ставити додаткову плату Arduino щоб просто поблимати діодами - то якось звучить зовсім неправильно.

Є прості і давно пророблені рішення, які дозволяють легко оминути такі обмеження. Найпоширенішими з них є протоколи I2C та SPI, які підтримуються Arduino зразу "з коробки".

Гарний огляд цих протоколів дає Джеремі Блум у своїх уроках Arduino (англ. або рос.). Лаконічний і дуже конкретний опис також можна почитати в статті Розширяємо порти (рос.). Глибше в деталі можна пірнути тут: Підключаємо купу пристроїв до  Arduino п'ятьма дротами (рос.).

Що потрібно щоб почати? Якщо ви маєте стартовий комплект, описаний нами раніше, то все, що треба докупити - це мікросхему-розгалужувач, яка власне і буде працювати як зв'язковий між Arduino та зовнішніми пристроями.

Для проби ми вирішили поекспериментувати із регістром зсуву 74HC595, який працює по протоколу SPI. Такий варіант здався нам найпростішим для розуміння і експериментування. Ціль експерименту - навчитися керувати вісьмома світлодіодами, використовуючи мінімально можливу кількість виводів Arduino.

http://diylab.com.ua/p134919434-zsuvnij-regstr-74hc595.html
Найшвидше 74HC595 можна купити на радіобазарі, або в DiyLab. Але в нас був час, і натхнення - тому звернулися до eBay, де менше ніж за долар і з безкоштовною доставкою замовили аж 5 мікросхем. Звісно, якщо пошукати, можна знайти і дешевші варіанти (ось типу як на Banggood) але брати 25 мікросхем маючи потребу в одній - то вже виняткове марнотратство. Меншими партіями Banggood чомусь їх не продає :-(

За основу взяли статтю SPI та Arduino: плодимо виводи (рос.). За бажанням можна зазирнути і в теоретичний вступ, та в статтю про зчитування інформації через SPI (рос.).

Насправді, все не так складно, як може здатися на перший погляд. Особливо, якщо ваша мета - керування світлодіодами.

Регістр 74HC595 вміє запам'ятовувати двійкові числа (нулі або одинички) у восьми комірках пам'яті. Нумерують ці комірки від A до H.

Для того, щоб на виходах регістра появилися високі (одинички) або низькі рівні напруги (нулі) - треба послідовно, по порядку, один за одним, передати інформацію для кожного виходу. Для цього достатньо провести три лінії від Arduino до регістра (не рахуючи живлення та землі):
  • На першій лінії (SI) ми виставлятимемо значення, яке хочемо записати в комірку пам'яті A.
  • На другій (SCK) ставимо високу напругу, потім за якийсь час низьку. Таким чином ми просимо регістр зчитати дані з лінії SI. Значення, прочитане з SI записується в комірку A. А всі решта значення зсуваюся на одну позицію далі. Те, що було в останній комірці - просто собі губиться. Десь так:   
    Схема роботи регістра зсуву
    Саме тому регістр і називається "регістром зсуву".
  • Повторивши таку операцію 8 разів ми отримаємо на виходах регістра те, що нам треба. Але не зразу. Щоби не лякати пристрої, підключені до виходів регістра, напруги на виходах міняються тільки після того, як на лінію RCK буде подано високий рівень напруги. Поки RCK буде на низькому рівні - регістр видаватиме на виходах те, що було увімкнуто минулого разу. Таким чином діоди не будуть миготіти, а зразу, одномоментно перемкнуться в новий стан.
Програма яка вмикає діоди через один могла би виглядати десь так:

bool  LED [8] = {HIGH, LOW, HIGH, LOW, HIGH, LOW, HIGH, LOW}void setup()
{// краще для надійності всі виходи обнулити на всяк випадок
 digitalWrite(PIN_SI, LOW);
 digitalWrite(PIN_SCK, LOW);
 digitalWrite(PIN_RCK, LOW);
 
 // згодовуємо регістру стан кожного із восьми діодів по черзі
 for(int i=0; i<8; i++) {
  // виставляємо світність діода на виході SI
  digitalWrite(PIN_SI, LED[i]);
  // повідомляємо регістру, що пора прийняти наступне 
  // значення на зберігання
  digitalWrite(PIN_SCK, HIGH);
  …
  digitalWrite(PIN_SCK, LOW);
 }
 
 // тепер в пам'яті регістра збережено інформацію про стан
 // всіх 8-и діодів
 // даємо команду видати вміст пам'яті на виходи регістра (QA - QH)
 digitalWrite(PIN_RCK, HIGH);
 // регістр видасть на виходах те, що ми в ньому зберегли,
 // діоди загоряться через один
}

З тим кодом ще треба поморочитися, бо регістр не може моментально реагувати на наші сигнали - всюди треба наставити затримок і т.д.

Використання бібліотеки SPI полегшує цю задачу, але з'являється ускладнення  - доведеться вивчити що таке біти та байти, і як працювати з двійковими числами. Стан діодів будемо задавати 8-бітним числом, яке через функції SPI записуватимемо в регістр.

Наша програма, перероблена для використання бібліотеки SPI, виглядатиме десь так:

#include <SPI.h>

const uint8_t LED  = 0b10101010; // бачите - працювати з бітами дуже просто
const int PIN_RCK = 8; // RCK вихід може бути довільним
// SCK та SI виходи типово вибираються як #13 та #11

void setup()
{
  // ініціалізуємо шину SPI
  SPI.begin();
  
  // готуємо регістр до прийому даних
  pinMode(PIN_RCK, OUTPUT);
  digitalWrite(PIN_RCK, LOW);
  
  // передаємо в регістр число, в якому закодовано стан діодів
  SPI.transfer(LED);
  
  // тепер в пам'яті регістра збережено інформацію про стан 
  // всіх 8-и діодів
  // даємо команду видати вміст пам'яті на виходи регістра (QA - QH).
  digitalWrite(PIN_RCK, HIGH);
  // регістр видасть на виходах те, що ми в ньому зберегли,
  // діоди загоряться через один
}

void loop() {
  
}

Складіть схемку для перевірки ідеї (як показано у статті):

Схема підключення регістра зсуву


Після запуску Arduino ви маєте побачити щось таке:

Arduino з підключеним 74HC595


Як повеселитися з цією схемою далі - вибирайте на свій смак. Можна спробувати поганяти вогник по лінійці світлодіодів, як показано у тій же ж статті. Можна спробувати підключити ще один регістр, і блимати 16-ма діодами. Або створити каскадну схему із трьох регістрів, керуючи двома з них за допомогою третього все тими ж трьома лініями. Підключаючи регістри каскадно, можна одним регістром керувати шістьма іншими, тобто через ті ж 3 лінії блимати 48-ма світлодіодами! (Якщо ви вирішили перетворити свого робота на пересувну новорічну гірлянду). Але ніхто не заважає зробити трирівневу каскадну схему і тоді…

Немає коментарів:

Дописати коментар