«Бегущий огонёк» средствами Arduino UNO.

Тема статьи: 
Электронные поделки и механизмы

https://youtu.be/uO6xPk3e2gc

В этой статье мы предлагаем ознакомиться с основами программирования платы Arduino UNO, предназначенной для создания простых систем робототехники и автоматики. Мы соберём схему из семи светодиодов, которые будут последовательно загораться и гаснуть.
Для этого нам понадобится сама плата Arduino UNO, макетная плата, USB кабель для подключения платы и её и питания от ноутбука, семь разноцветных светодиодов и столько же резисторов на 220 Ом и восемь небольших проводочков.

ArduinoDiodi01.jpg

Также нам потребуется программное обеспечение, скачанное с официального сайта разработчика — www.arduino.cc
Запускаем установщик, следуем всем инструкциям установки и у нас на десктопе появляется ярлык среды разработки программ для Arduino.
Но прежде чем писать программный код, нужно собрать схему.
Наша программа записывается в микроконтроллер на плате через USB кабель.

ArduinoDiodi02.jpg

На плате есть 14 цифровых контактов для ввода/вывода, к которым мы можем присоединить проводами диоды.

ArduinoDiodi03.jpg

Диоды помещаем на макетную плату. К аноду каждого из них присоединяем один конец резистора на 220 Ом. К другому концу резистора присоединяем проводок, который втыкается в один из портов ввода-вывода платы. Мы воткнули во второй.

ArduinoDiodi04.jpg

ArduinoDiodi05.jpg

Все катоды выводим на один провод, который подключаем к контакту платы GND — земля.

ArduinoDiodi06.jpg

ArduinoDiodi07.jpg

Далее запускаем среду разработки и приступаем к написанию кода программы.

ArduinoDiodi08.jpg

По-умолчанию у нас в программе есть 2 функции:

void setup()
{
}

В ней задаются начальные параметры и настройки.

void loop()
{
}

Функция, в которой будут циклически повторяться указанные нами действия.

Для начала напишем простую программу, мигающую одной лампочкой.

/*Программа для схемы с одним мигающим диодом*/
//целочисленная константа, которой присваивается значение 2го контакта

const int LED = 2;

void setup() {
//2 порт задаём как вывод, т.е он подаёт напряжение в схему
  pinMode(LED, OUTPUT);
//диод в выключенном состоянии LOW = 0 В (вольт)
  digitalWrite(LED, LOW);
}

void loop() {
// включаем диод HIGH = 5 В (вольт)
  digitalWrite(LED, HIGH);
// задержка на 100 мс (миллисекунд)
  delay(100);
// выключаем диод
  digitalWrite(LED, LOW);
// задержка
  delay(100);
}

Подключаем плату Arduino к компьютеру через USB кабель. Если это первое подключение — ждем, когда установятся драйвера.

Затем нужно указать в разделе «Инструменты» тип платы: Arduino — UNO.

ArduinoDiodi09.jpg

А также, порт, через который будут передаваться данные.

ArduinoDiodi10.jpg

После выбора порта жмём кнопочку со стрелкой «Загрузка» и наша программа загружается в микроконтроллер.

ArduinoDiodi11.jpg

Если нет никаких ошибок в коде, то начинается выполнение программы. Лампочка начинает мигать.
По такому же принципу в цепь можно включить несколько светодиодов, каждый из которых подключим к своему порту на плате.

ArduinoDiodi12.jpg

Чтобы эти диоды попеременно включались и выключались произведем соответствующие изменения в коде программы.

/*Программа для схемы с 7ю мигающии диодами. Сначала все последовательно включаются, потом последовательно выключаются*/
/*целочисленная переменная, которой присваивается начальное значение 2 контакта*/

int LED = 2;

void setup() {
/*цикл, перебирающий порты от 2 до 8 и присваивающий начальные значения как порт вывода и выключен*/
  for(int i = 2; i <= 8; i++)
  {
    LED = i;
    pinMode(LED, OUTPUT);
    digitalWrite(LED, LOW);
  }
}

void loop() {
/*2 цикла, перебирают порты от 2 до 8, сначала попеременно включают диоды, с задержкой 100 мс, затем попеременно выключают*/
  for(int i = 2; i <= 8; i++)
  {
    LED = i;
    digitalWrite(LED, HIGH);
    delay(100);
 }
  delay(100);
  for(int i = 2; i <= 8; i ++)
  {
    LED = i;
    digitalWrite(LED, LOW);
    delay(100);
 }
  delay(100);
}

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

/*Программа для схемы с 7ю мигающии диодами, в которой один диод загорается, а предыдущий гаснет*/
/*целочисленная переменная, которой присваивается начальное значение 2 контакта*/

int LED = 2;

void setup() {
/*цикл, перебирающий порты от 2 до 8 и присваивающий начальные значения как порт вывода и выключен*/
  for(int i = 2; i <= 8; i++)
  {
    LED = i;
    pinMode(LED, OUTPUT);
    digitalWrite(LED, LOW);
  }
}

void loop() {
/*цикл, перебирает порты от 2 до 8*/
  for(int i = 2; i <= 8; i++)
  {
//включаем очередной диод
    LED = i;
    digitalWrite(LED, HIGH);
/*если включаем 2 порт, то отключать нужно 8й, в ином случае предыдущий*/
    if(i == 2)
      LED = 8;
    else
      LED --;
    digitalWrite(LED, LOW);
//задержка 100 мс
    delay(100);
  }
  delay(100);
}

А можно сделать и реальную «змейку» из нескольких огоньков, например 3, добавив функций в код.

/*Программа для схемы с 7ю мигающии диодами, в которой за раз светятся только 3 диода, и этот огонёк пробегает змейкой по всем 7ми*/
/*целочисленная переменная, которой присваивается начальное значение 2 контакта*/

int LED = 2;
//длина «змейки» - 3 диода светятся за раз
int snake_length = 3;

void setup() {
/*цикл, перебирающий порты от 2 до 8 и присваивающий начальные значения как порт вывода и выключен*/
  for(int i = 2; i <= 8; i++)
  {
    LED = i;
    pinMode(LED, OUTPUT);
    digitalWrite(LED, LOW);
  }
}

void loop() {
/*перебираем в цикле порты от 2 до 8 и передаём функции snake номера диодов, которые нужно зажечь: текущий по циклу и 2 перед ним*/
  for(int i = 2; i <= 8; i++)
  {
    snake(i, i+snake_length-1);
//задержка 500 мс.
    delay(500);
 }
}

int snake_check(int param)
{
  if(param < 2)
    return (8 - (2 - param - 1));
  else if (param > 8)
    return (2 + (param - 8 - 1));
  else
    return param;
}

void snake(int init, int finite)
{
/*гасим предыдущий диод, если передаваемый номер меньше 2 или больше 8, его нужно изменить в функции snake_check*/
  LED = snake_check(init-1);
  digitalWrite(LED, LOW);

  for(int i = init; i <= finite; i++)
  {
/*включаем нужные диоды, проверяя номер порта в функции snake_check*/
    LED = snake_check(i);
    digitalWrite(LED, HIGH);
  }
}

А еще можно сделать увеличивающуюся в размере змейку.

/*Программа для схемы с 7ю мигающии диодами, в которой огонёк пробегает змейкой по всем 7ми, но длина этого огонька постепенно увеличивается*/
/*целочисленная переменная, которой присваивается начальное значение 2 контакта*/

int LED = 2;
//длина «змейки» - сколько диодов светятся за раз
int snake_length = 1;
//максимальная длина «змейки»
int max_snake_length = 6;

void setup() {
/*цикл, перебирающий порты от 2 до 8 и присваивающий начальные значения как порт вывода и выключен*/
  for(int i = 2; i <= 8; i++)
  {
    LED = i;
    pinMode(LED, OUTPUT);
    digitalWrite(LED, LOW);
  }
}

void loop() {
/*перебираем в цикле порты от 2 до 8 и передаём функции snake номера диодов, которые нужно зажечь: текущий по циклу и 2 перед ним*/
  for(int i = 2; i <= 8; i++)
  {
    snake(i, i+snake_length-1);
//задержка 500 мс.
    delay(500);
  }
/*после того, как огонёк пробежал по всем диодам, его длина увеличивается на 1, пока не достигнет заданого максимального значения*/
  snake_length++;
  if(snake_length >= max_snake_length)
    snake_length = 1;
}

int snake_check(int param)
{
  if(param < 2)
    return (8 - (2 - param - 1));
  else if (param > 8)
    return (2 + (param - 8 - 1));
  else
    return param;
}

void snake(int init, int finite)
{
/*гасим предыдущий диод, если передаваемый номер меньше 2 или больше 8, его нужно изменить в функции snake_check*/
  LED = snake_check(init-1);
  digitalWrite(LED, LOW);

  for(int i = init; i <= finite; i++)
  {
/*включаем нужные диоды, проверяя номер порта в функции snake_check*/
    LED = snake_check(i);
    digitalWrite(LED, HIGH);
  }
}