На прошлом уроке мы научились загружать программу blink в Arduino. Следует заметить, что эта программа очень удобный тест, если возникают какие-то проблемы с загрузкой скетча - откройте Blink, и загрузите его, если скетч загрузился и светодиод на плате Ardiono начал мигать, значит все нормально и проблема в вашем скетче. Если не загрузился - проверьте, правильно ли выбраны в программе плата Arduino и последовательный порт.

Подключение светодиодов

      Моделировать схему управления светодиодами м помощью контроллера Arduino мы будем в среде Tinkercad Circuits, Если у вас есть контроллер Ардуино и желание работать с "железом", то работа такая работа приветствуется.

      Итак, начнем с одного светодиода. Подключить его напрямую к выходу контроллера нельзя, так как светодиод может сгореть, поэтому последовательно со светодиодом поставим ограничительный резистор номиналом 270 Ом. Анод светодиода подключим к 13 выводу (к этому же выводу уже подключен светодиод, который установлен на плате). Катод, через токоограничительный резистор к общему проводу GND. В Tinkercad Circuits, в контроллер по умолчанию загружен скетч Blink, поэтому после нажатия кнопки "Начать моделирование" мы увидим работу программы Blink - оба светодиода, и тот что на плате, и тот, который мы подключили - будут мигать:


Бегущие огни


Теперь подключим еще три светодиода аналогичным образом, использую пины 10, 11, 12 и изменим скетч так, чтобы светодиоды зажигались поочередно:
void setup()
{
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop()
{                       
  digitalWrite(10, HIGH); // Устанавливаем высокий уровень на выводе 10
  delay(1000); // Ждем 200 миллисекунд
  digitalWrite(10, LOW); // Устанавливаем низкий уровень на выводе 10
  delay(1000); // Ждем 200 миллисекунд

  digitalWrite(11, HIGH); // Устанавливаем высокий уровень на выводе 11
  delay(1000); // Ждем 200 миллисекунд
  digitalWrite(11, LOW); // Устанавливаем низкий уровень на выводе 11
  delay(1000); // Ждем 200 миллисекунд

  digitalWrite(12, HIGH); // Устанавливаем высокий уровень на выводе 12
  delay(1000); // Ждем 200 миллисекунд
  digitalWrite(12, LOW); // Устанавливаем низкий уровень на выводе 12
  delay(1000); // Ждем 200 миллисекунд

  digitalWrite(13, HIGH); // Устанавливаем высокий уровень на выводе 13
  delay(1000); // Ждем 200 миллисекунд
  digitalWrite(13, LOW); // Устанавливаем низкий уровень на выводе 13
  delay(1000); // Ждем 200 миллисекунд
}



Точно также мы можем увеличить количество светодиодов, например, до восьми. При этом программа у нас тоже станет больше. Но используя возможности, которые дает нам язык программирования C++, мы можем значительно уменьшить код программы:
int pin;

void setup()

{
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
}

void loop()
{
  pin = 10;

while(pin < 14)
	{
 	digitalWrite(pin, 1);
 	delay(200);
 	digitalWrite(pin, 0);
 	delay(200);
  	pin = pin + 1;
	}
}
Разберем как это работает. В нашей программе появилась переменная pin. Переменная - это место хранения данных. Она имеет имя, значение и тип. Например, данное объявление (называется декларацией):
 int pin;
создает переменную с именем pin, и типом int (от англ. integer - целое число), один их наиболее часто используемых типов данных для хранения чисел. int занимает 2 байта памяти, и может хранить числа от -32 768 до 32 767 (от -2^15 до 2^15-1).

В блоке setup() у нас все осталось по прежнему, точно также мы обозначаем что пины с 10 по 13 запрограммированы как выходы.

Серьезные изменения коснулись блока loop().

Строка
  pin = 10;
изменяет значение переменной pin, присваивая ей значение 10.

Следующая строка:
 while(pin < 14)


      while - это цикл и в данном случае все что находится после него в фигурных скобках, будет повторяться, пока условие pin < 14 истинно. Как только переменная пин примет значение больше или равное 14 программа выйдет из этого цикла и вернется к первой строке цикла loop(). В нашей программе эта конструкция работает следующим образом. Вначале бесконечного цикла loop() мы присваиваем переменной pin значение 10, и далее переходим к циклу while так как 10 < 14 выполняются команды, которые находятся в фигурных скобках внутри while.

	{
 	digitalWrite(pin, 1);
 	delay(200);
 	digitalWrite(pin, 0);
 	delay(200);
  	pin = pin + 1;
	}

      Так как текущее значение переменной pin = 10, командой digitalWrite(pin, 1); устанавливается высокий уровень на 10 выходе. Светодиод подключенный к выводу 10 загорится. Затем, уже знакомой командой delay(200); в течении 200 миллисекунд ничего не делается, светодиод продолжает светиться, после чего командой digitalWrite(pin, 0); устанавливается низкий уровень на 10 выходе, светодиод гаснет и далее опять ожидание в течении 200 миллисекунд. Затем следует команда

 	pin = pin + 1;

      это операция присвоения, переменной pin присваивается значение больше её самой на единицу. Таким образом, значение переменной pin изменяется, и теперь pin = 11. После этого, программа вернется в начало цикла while, и так как условие 11 < 14 по прежнему выполняется - снова выполнится набор команд по зажиганию светодиода, теперь уже подключенного на вывод 11, после чего переменная pin опять увеличится на единицу и примет значение 12 и так будет повторяться пока значение переменной pin не станет равным 14. Так как условие 14 < 14 является ложным, произойдет выход из цикла while, программа вернется в начало цикла loop(), где переменной pin снова будет присвоено значение 10 и дальше программа опять перейдет к циклу while.

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

delayMicroseconds()


delayMicroseconds() - это еще одна команда работы со временем, работает она точно также как команда delay(), только время задается в микросекундах (1 000 000 микросекунд в 1 секунде).

В данной версии Ардуино максимальная пауза воспроизводимая корректно - 16383. Возможно это будет изменено в следующих версиях Arduino. Для остановки выполнения программы более чем на несколько тысяч микросекунд рекомендуется использовать уже известную нам функцию delay().


Задание.

     

  1. Измените программы так, чтобы огни бегали в обратную сторону.
  2. Напишите программу "бегающая тень", которая работает точно также как "бегущие огни", только светодиоды не зажигаются друг за другом, а гаснут.
  3. Попробуйте реализовать какой-нибудь другой эффект, например пусть бежит не один светодиод, а два.
Далее...


Copyright © R9AL 2020 Все права защищены

Рейтинг@Mail.ru Яндекс цитирования