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

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

Что вам нужно

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

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

Если у вас есть стартовый комплект Arduino

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

).

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

). Вы можете использовать Shift Register

для управления светодиодами, хотя это не нужно для этого проекта, так как 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  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. Во втором контуре светодиоды включаются, а затем выключаются от 8 до 1. Обратите внимание, как установлен токовый контакт, а также токовый контакт плюс один. Это гарантирует, что всегда есть два светодиода одновременно, что делает сканер более реалистичным.

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

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

Ссылка на основную публикацию
Adblock
detector