Зробіть світлодіодний сканер Knight Rider з Arduino

Ви коли-небудь хотіли, щоб у вас був власний автомобіль Knight Industries Two Thousand (KITT) - ви знаєте, від Knight Rider? Зробіть свою мрію на крок ближче до реальності, створивши світлодіодний сканер! Ось кінцевий результат:

Що вам потрібно

Для цього проекту не потрібно багато деталей, і їх може бути багато:


  • 1 х Arduino UNO або аналогічний
  • 1 х макет
  • 8 х червоних світлодіодів
  • 8 х 220 Ом резистори
  • 1 х 10 кОм потенціометр
  • Чоловік до чоловіка підключити дроти

Якщо у вас є стартовий комплект Arduino, ймовірно, у вас є всі ці частини (що ви можете зробити за допомогою стартового набору?)

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

План будівництва

Схема

Підключіть анод (довгу ніжку) кожного світлодіоду до цифрових контактів з першого по восьмий. Під'єднайте катоди (коротка ніжка) до заземлення Arduino.

Код

Створіть новий ескіз і збережіть його як «knceRider». Ось код:

const int leds[] = {1,2,3,4,5,6,7,8}; // Led pins const int totalLeds = 8; int time = 50; // Default speed void setup() { // Initialize all outputs for(int i = 0; i <= totalLeds; ++i) { pinMode(leds[i], OUTPUT); } } void loop() { for(int i = 0; i < totalLeds - 1; ++i) { // Scan left to right time = analogRead(2); digitalWrite(leds[i], HIGH); delay(time); digitalWrite(leds[i + 1], HIGH); delay(time); digitalWrite(leds[i], LOW); } for(int i = totalLeds; i > 0; --i) { // Scan right to left time = analogRead(2); digitalWrite(leds[i], HIGH); delay(time); digitalWrite(leds[i - 1], HIGH); delay(time); digitalWrite(leds[i], LOW); } }

Давайте розберемося з цим. Кожен світлодіодний висновок зберігається в масиві:


const int leds[] = {1,2,3,4,5,6,7,8};

Масив по суті є набором пов'язаних елементів. Ці елементи визначено як постійні («const»), що означає, що їх не можна змінити пізніше. Вам не потрібно використовувати константу (код буде відмінно працювати, якщо ви вилучите «const»), хоча це рекомендується.

Доступ до елементів масиву здійснюється за допомогою квадратних дужок («[]») і цілого числа, званого індексом. Індекси починаються з нуля, тому «leds [2]» повернув би третій елемент у масиві - виведення 3. Масиви прискорюють написання коду і роблять його більш читаним, вони змушують комп'ютер виконувати важку роботу!

Цикл for використовується для налаштування кожного виводу як вихід:

for(int i = 0; i <= totalLeds; ++i) { pinMode(leds[i], OUTPUT); }

Цей код знаходиться всередині функції «setup ()», оскільки його потрібно запускати тільки один раз при запуску програми. Для петель дуже корисні. Вони дозволяють запускати один і той же код знову і знову, кожен раз з різними значеннями. Вони ідеально підходять для роботи з масивами. Оголошується ціле число «i», і тільки код всередині циклу може отримати доступ до цієї змінної (це називається «областю дії»). Значення i починається з нуля, і для кожної ітерації циклу i збільшується на одиницю. Як тільки значення i менше або дорівнює змінній «totalLeds», цикл «переривається» (зупиняється).

Значення i використовується для доступу до масиву «leds». Цей цикл звертається до кожного елемента в масиві і налаштовує його як вихідний. Ви можете вручну ввести «pinMode (pin, OUTPUT)» вісім разів, але навіщо писати вісім рядків, коли можна написати три?


У той час як деякі мови програмування можуть повідомляти вам, скільки елементів у масиві (зазвичай з синтаксисом, наприклад, array.length), Arduino не робить його таким простим (він включає в себе трохи більше математики). Оскільки кількість елементів у масиві вже відома, це не проблема.

Всередині основного циклу (void loop ()) є ще два для циклу. Перший з них встановлює світлодіоди в положення ВКЛ, а потім ВИКЛ від 1 до 8. У другому контурі світлодіоди включаються, а потім ВИКЛ. Це гарантує, що завжди є два світлодіоди одночасно, що робить сканер більш реалістичним.

На початку кожного циклу значення банку зчитується в змінну «час»:

time = analogRead(2);

Це робиться двічі, один раз всередині кожного циклу. Це потрібно постійно перевіряти і оновлювати. Якби це було за межами циклів, воно все одно працювало б, проте була б невелика затримка - він працював би тільки після завершення циклу. Горщики є аналоговими, тому і використовується «analogRead (pin)». Це повертає значення від нуля (мінімум) до 1023 (максимум). Arduino здатний перетворювати ці значення на щось більш корисне, однак вони ідеально підходять для цього варіанту використання.


Затримка між зміною світлодіодів (або швидкістю сканера) встановлюється в мілісекундах (1/1000 секунди), тому максимальний час становить трохи більше 1 секунди.

Розширений сканер

Тепер, коли ви знаєте основи, давайте розглянемо щось більш складне. Цей сканер запалюватиме світлодіоди попарно, починаючи зовні і працюючи в нім. Потім він зверне це і піде зсередини назовні парами. Ось код:

const int leds[] = {1,2,3,4,5,6,7,8}; // Led pins const int totalLeds = 8; const int halfLeds = 4; int time = 50; // Default speed void setup() { // Initialize all outputs for(int i = 0; i <= totalLeds; ++i) { pinMode(leds[i], OUTPUT); } } void loop() { for(int i = 0; i < (halfLeds - 1); ++i) { // Scan outside pairs in time = analogRead(2); digitalWrite(leds[i], HIGH); digitalWrite(leds[(totalLeds - i) - 1], HIGH); delay(time); digitalWrite(leds[i], LOW); digitalWrite(leds[(totalLeds - i) - 1], LOW); delay(time); } for(int i = (halfLeds - 1); i > 0; --i) { // Scan inside pairs out time = analogRead(2); digitalWrite(leds[i], HIGH); digitalWrite(leds[(totalLeds - i) - 1], HIGH); delay(time); digitalWrite(leds[i], LOW); digitalWrite(leds[(totalLeds - i) - 1], LOW); delay(time); } }

Цей код трохи складніший. Зверніть увагу, як обидва цикли йдуть від нуля до «halfLeds - 1» (3). Це робить сканер кращим. Якби обидва шлейфи виходили з 4 - 0 і 0 - 4, то одні і ті ж світлодіоди блимали б двічі в одній і тій же послідовності - це виглядало б не дуже добре.

Тепер ви повинні мати працюючий світлодіодний сканер Knight Rider! Було б легко змінити це, щоб використовувати більше або більше світлодіодів, або реалізувати свій власний шаблон. Цю схему дуже легко перенести на Raspberry Pi (новачок в Pi? Почніть тут) або ESP8266


Ви будуєте репліку KITT? Я хотів би бачити всі речі Knight Rider в коментарях.

COM_SPPAGEBUILDER_NO_ITEMS_FOUND