Найти в Дзене
реМОНТИРУЮ сам

"Бегущий поворотник своими руками: сборка, код и что получилось"

Оглавление

Привет, друзья, и с Новым годом! Праздничные дни — отличное время для экспериментов. Чтобы скоротать время, я решил попробовать создать бегущий поворотник на макетной плате с использованием SMD-светодиодов и платы Arduino Leonardo. Давно хотел реализовать проект на Arduino, и этот показался идеальным: минимум компонентов, максимум возможностей для экспериментов.

Что понадобилось для проекта

Для сборки бегущего поворотника я использовал:

  • 6 светодиодов SMD на 3 вольта.
  • 6 резисторов на 150 Ом.
  • 3 кнопки.
  • Плату Arduino Leonardo.

Принцип работы

Идея проста:

  • Четыре светодиода имитируют дневные ходовые огни (ДХО).
  • Два светодиода выполняют роль тормозов.
  • Правая и левая кнопки включают соответствующие поворотники.
  • Центральная кнопка активирует тормоза.

Сборка

Собрать всё это на макетной плате оказалось проще, чем я думал. Я подключил светодиоды через резисторы, добавил кнопки и соединил всё с платой Arduino.

Настройка и программирование

Код оказался более сложной частью работы. Сначала у меня возникли проблемы:

-2

1. После срабатывания поворотников ДХО не включались обратно:

  • // Пины светодиодов
  • const int white1 = 2;
  • const int white2 = 3;
  • const int yellow1 = 4;
  • const int yellow2 = 5;
  • const int red1 = 6;
  • const int red2 = 7;
  • // Пины кнопок
  • const int leftButton = 8;
  • const int rightButton = 9;
  • const int centerButton = 10;
  • // Задержка для бегущих огней
  • const int delayTime = 200;
  • void setup() {
  • // Настраиваем пины светодиодов как выходы
  • pinMode(white1, OUTPUT);
  • pinMode(white2, OUTPUT);
  • pinMode(yellow1, OUTPUT);
  • pinMode(yellow2, OUTPUT);
  • pinMode(red1, OUTPUT);
  • pinMode(red2, OUTPUT);
  • // Настраиваем пины кнопок как входы с подтягивающими резисторами
  • pinMode(leftButton, INPUT_PULLUP);
  • pinMode(rightButton, INPUT_PULLUP);
  • pinMode(centerButton, INPUT_PULLUP);
  • // Включаем белые светодиоды при старте
  • digitalWrite(white1, HIGH);
  • digitalWrite(white2, HIGH);
  • }
  • void loop() {
  • // Считываем состояния кнопок
  • bool leftState = !digitalRead(leftButton);
  • bool rightState = !digitalRead(rightButton);
  • bool centerState = !digitalRead(centerButton);
  • if (centerState) {
  • blinkRedFast();
  • } else if (leftState) {
  • runningLightLeft();
  • } else if (rightState) {
  • runningLightRight();
  • }
  • }
  • // Бегущая дорожка влево
  • void runningLightLeft() {
  • int sequence[] = {yellow1, white1, white2, yellow2};
  • for (int i = 0; i < 4; i++) {
  • digitalWrite(sequence[i], HIGH);
  • delay(delayTime);
  • digitalWrite(sequence[i], LOW);
  • }
  • }
  • // Бегущая дорожка вправо
  • void runningLightRight() {
  • int sequence[] = {yellow2, white2, white1, yellow1};
  • for (int i = 0; i < 4; i++) {
  • digitalWrite(sequence[i], HIGH);
  • delay(delayTime);
  • digitalWrite(sequence[i], LOW);
  • }
  • }
  • // Быстрое мигание красных светодиодов
  • void blinkRedFast() {
  • for (int i = 0; i < 10; i++) {
  • digitalWrite(red1, HIGH);
  • digitalWrite(red2, HIGH);
  • delay(100);
  • digitalWrite(red1, LOW);
  • digitalWrite(red2, LOW);
  • delay(100);
  • }
  • }

2. С этим кодом режим ДХО стал автоматически включаться после завершения работы в режиме поворотника, мне не нравится что последний светодиод не тухнет:

  • // Пины светодиодов
  • const int white1 = 2;
  • const int white2 = 3;
  • const int yellow1 = 4;
  • const int yellow2 = 5;
  • const int red1 = 6;
  • const int red2 = 7;
  • // Пины кнопок
  • const int leftButton = 8;
  • const int rightButton = 9;
  • const int centerButton = 10;
  • // Задержка для бегущих огней
  • const int delayTime = 200;
  • void setup() {
  • // Настраиваем пины светодиодов как выходы
  • pinMode(white1, OUTPUT);
  • pinMode(white2, OUTPUT);
  • pinMode(yellow1, OUTPUT);
  • pinMode(yellow2, OUTPUT);
  • pinMode(red1, OUTPUT);
  • pinMode(red2, OUTPUT);
  • // Настраиваем пины кнопок как входы с подтягивающими резисторами
  • pinMode(leftButton, INPUT_PULLUP);
  • pinMode(rightButton, INPUT_PULLUP);
  • pinMode(centerButton, INPUT_PULLUP);
  • // Включаем все белые и желтые светодиоды при старте
  • resetLights();
  • }
  • void loop() {
  • // Считываем состояния кнопок
  • bool leftState = !digitalRead(leftButton);
  • bool rightState = !digitalRead(rightButton);
  • bool centerState = !digitalRead(centerButton);
  • if (centerState) {
  • blinkRedFast();
  • resetLights();
  • } else if (leftState) {
  • runningLightLeft();
  • resetLights();
  • } else if (rightState) {
  • runningLightRight();
  • resetLights();
  • }
  • }
  • // Бегущая дорожка влево
  • void runningLightLeft() {
  • int sequence[] = {yellow1, white1, white2, yellow2};
  • for (int i = 0; i < 4; i++) {
  • digitalWrite(sequence[i], HIGH);
  • delay(delayTime);
  • digitalWrite(sequence[i], LOW);
  • }
  • }
  • // Бегущая дорожка вправо
  • void runningLightRight() {
  • int sequence[] = {yellow2, white2, white1, yellow1};
  • for (int i = 0; i < 4; i++) {
  • digitalWrite(sequence[i], HIGH);
  • delay(delayTime);
  • digitalWrite(sequence[i], LOW);
  • }
  • }
  • // Быстрое мигание красных светодиодов
  • void blinkRedFast() {
  • for (int i = 0; i < 10; i++) {
  • digitalWrite(red1, HIGH);
  • digitalWrite(red2, HIGH);
  • delay(100);
  • digitalWrite(red1, LOW);
  • digitalWrite(red2, LOW);
  • delay(100);
  • }
  • }
  • // Включение всех белых и желтых светодиодов
  • void resetLights() {
  • digitalWrite(white1, HIGH);
  • digitalWrite(white2, HIGH);
  • digitalWrite(yellow1, HIGH);
  • digitalWrite(yellow2, HIGH);
  • }

3. С третьей попытки всё заработало, как надо:

  • // Пины светодиодов
  • const int white1 = 2;
  • const int white2 = 3;
  • const int yellow1 = 4;
  • const int yellow2 = 5;
  • const int red1 = 6;
  • const int red2 = 7;
  • // Пины кнопок
  • const int leftButton = 8;
  • const int rightButton = 9;
  • const int centerButton = 10;
  • // Задержка для бегущих огней (чем меньше, тем быстрее)
  • const int delayTime = 100;
  • void setup() {
  • // Настраиваем пины светодиодов как выходы
  • pinMode(white1, OUTPUT);
  • pinMode(white2, OUTPUT);
  • pinMode(yellow1, OUTPUT);
  • pinMode(yellow2, OUTPUT);
  • pinMode(red1, OUTPUT);
  • pinMode(red2, OUTPUT);
  • // Настраиваем пины кнопок как входы с подтягивающими резисторами
  • pinMode(leftButton, INPUT_PULLUP);
  • pinMode(rightButton, INPUT_PULLUP);
  • pinMode(centerButton, INPUT_PULLUP);
  • // Включаем все белые и желтые светодиоды при старте
  • resetLights();
  • }
  • void loop() {
  • // Считываем состояния кнопок
  • bool leftState = !digitalRead(leftButton);
  • bool rightState = !digitalRead(rightButton);
  • bool centerState = !digitalRead(centerButton);
  • if (centerState) {
  • blinkRedFast();
  • resetLights();
  • } else if (leftState) {
  • runningLightLeftContinuous();
  • } else if (rightState) {
  • runningLightRightContinuous();
  • }
  • }
  • // Бегущая дорожка влево (непрерывная)
  • void runningLightLeftContinuous() {
  • int sequence[] = {yellow1, white1, white2, yellow2};
  • int size = 4;
  • while (!digitalRead(leftButton)) { // Выполняем, пока кнопка удерживается
  • for (int i = 0; i < size; i++) {
  • digitalWrite(sequence[i], HIGH);
  • delay(delayTime);
  • digitalWrite(sequence[i], LOW);
  • }
  • }
  • resetLights(); // Возвращаемся к исходному состоянию
  • }
  • // Бегущая дорожка вправо (непрерывная)
  • void runningLightRightContinuous() {
  • int sequence[] = {yellow2, white2, white1, yellow1};
  • int size = 4;
  • while (!digitalRead(rightButton)) { // Выполняем, пока кнопка удерживается
  • for (int i = 0; i < size; i++) {
  • digitalWrite(sequence[i], HIGH);
  • delay(delayTime);
  • digitalWrite(sequence[i], LOW);
  • }
  • }
  • resetLights(); // Возвращаемся к исходному состоянию
  • }
  • // Быстрое мигание красных светодиодов
  • void blinkRedFast() {
  • for (int i = 0; i < 10; i++) {
  • digitalWrite(red1, HIGH);
  • digitalWrite(red2, HIGH);
  • delay(100);
  • digitalWrite(red1, LOW);
  • digitalWrite(red2, LOW);
  • delay(100);
  • }
  • }
  • // Включение всех белых и желтых светодиодов
  • void resetLights() {
  • digitalWrite(white1, HIGH);
  • digitalWrite(white2, HIGH);
  • digitalWrite(yellow1, HIGH);
  • digitalWrite(yellow2, HIGH);
  • }

Видео того как всё работает можно посмотреть здесь

Что дальше?

Теперь у меня появилась новая цель — реализовать управление поворотниками со смартфона. Это добавит больше возможностей для настройки и сделает проект ещё интереснее. Но, увы, выходные заканчиваются, и опять приходится возвращаться к работе.

Почему вам стоит попробовать?

Arduino — это отличный способ попробовать себя в программировании и создании электроники. Этот проект:

  • Подходит для новичков, так как требует минимум компонентов.
  • Даёт простор для экспериментов с кодом.
  • Позволяет визуально наблюдать результат вашей работы.

💡 Подписывайтесь на канал и ставьте лайк, если вам понравилась идея! Пишите в комментариях, хотите ли вы увидеть, как я буду добавлять управление со смартфона. Может, у вас есть интересные идеи для Arduino-проектов? Делитесь ими — буду рад попробовать что-то новое! 😊