Diy

Сделайте светодиодный сканер Knight Rider с Arduino

Сделайте светодиодный сканер Knight Rider с Arduino

Вы когда-нибудь хотели, чтобы у вас был собственный автомобиль Knight Industries Two Thousand (KITT) — вы знаете, от Knight Rider? Сделайте свою мечту на шаг ближе к реальности, создав светодиодный сканер! Вот конечный результат:

Что вам нужно

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

  • 1 х Arduino UNO или аналогичный
  • 1 х макет
  • 8 х красных светодиодов
  • 8 х 220 Ом резисторы
  • 1 х 10 кОм потенциометр
  • Мужчина к мужчине подключить провода

Если у вас есть стартовый комплект Arduino , вероятно, у вас есть все эти части ( что вы можете сделать с помощью стартового набора? )

Почти любой Arduino будет работать, если он имеет восемь доступных контактов (Никогда не использовал Arduino раньше? здесь ). Вы можете использовать программирование сдвигового регистра для управления светодиодами, хотя это не требуется для этого проекта, так как Arduino имеет достаточно выводов ,

План строительства

Arduino-Knight-Rider-Led-сканер-Complete
Это очень простой проект. Хотя это может выглядеть сложно из-за большого количества проводов, каждая отдельная часть очень проста. Каждый светодиод (LED) подключен к собственному выводу Arduino. Это означает, что каждый светодиод можно включать и выключать по отдельности. Потенциометр подключен к аналоговому Arduino в контактах, которые будут использоваться для регулировки скорости сканера.

Схема

Arduino-Knight-Rider-Circuit
Подсоедините внешний левый штырь (если смотреть спереди, штыри внизу) потенциометра к земле. Подключите противоположный внешний контакт к + 5v. Если это не работает должным образом, поменяйте местами эти контакты. Подключите средний контакт к аналогу Arduino через 2.

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

Код

Создайте новый эскиз и сохраните его как «knightRider». Вот код:

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 не делает его таким простым (он включает в себя немного больше математики). Поскольку количество элементов в массиве уже известно, это не проблема.

Arduino-Knight-Rider-LEDS

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

В начале каждого цикла значение банка считывается в переменную «время»:

 time = analogRead(2); 

Это делается дважды, один раз внутри каждого цикла. Это нужно постоянно проверять и обновлять. Если бы это было за пределами циклов, оно все равно работало бы, однако была бы небольшая задержка — он работал бы только после завершения цикла. Горшки являются аналоговыми, поэтому и используется «analogRead (pin)». Это возвращает значения от нуля (минимум) до 1023 (максимум). Arduino способен преобразовывать эти значения во что-то более полезное, однако они идеально подходят для этого варианта использования.

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

Расширенный сканер

Arduino-светодиоды-Вне-пар

Теперь, когда вы знаете основы, давайте рассмотрим что-то более сложное. Этот сканер будет зажигать светодиоды попарно, начиная снаружи и работая в нем. Затем он обратит это и пойдет изнутри наружу парами. Вот код:

 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 в комментариях.

Похожие посты
Diy

Вещи, которые вы должны иметь в виду, прежде чем брать ноутбук или смартфон в службу технической поддержки

Diy

Как использовать Arduino для съемки красивой скоростной фотографии

DiyLinux

Пять великолепных расширений Raspberry Pi, которые делают его еще более полезным

Diy

Первые шаги с Arduino: пристальный взгляд на печатную плату и структуру программы