Найти тему
Робототехника

Подчиняем Ардуино. 2 урок. Заставляем светодиод выключаться когда надо разными способами.

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

Программирование контроллеров и написание компьютерных программ сильно отличается друг от друга. Но теперь переходим к следующему.

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

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

Самое простое, что мы можем делать - это просто давать команды контроллеру и наблюдать как он их выполняет.

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

Итак, первая программа выглядит так.

int led1=13;
void setup() {
pinMode(led1, OUTPUT);
}
void loop() {
digitalWrite(led1, HIGH); // включаем светодиод
delay(200); // ждем 0.1 секунду
digitalWrite(led1, LOW); // выключаем светодиод
delay(500); // ждем 0.1 секунду
}

Код команды рабочий, добавлять комментарии в него не буду. Да и вы найдете подобную программу на многих ресурсах. (в видеоматериале будут пояснения)

Когда у вас получить мигать светодиодом, то это на самом маленький шажок на пути к большим задачам.

Для начала попробуйте изменять частоту мерцания, скважность сигнала (когда светодиод включен дольше по времени чем выключен или наоборот),

пример эпюры.
пример эпюры.

В нашем случае время периода -2 секунды, значит частота 0.5 Гц. Скважность при этом 2. Вот пара небольших заданий:

1. Сделать частоту 5 Гц, скважность 2.

2. Сделать частоту 2 Гц, скважность 5

3. Сделать частоту 10 Гц, скважность 10.(это мы сейчас и выполним)

int led1=13;
void setup() {
pinMode(led1, OUTPUT);
}
void loop() {
digitalWrite(led1, HIGH); // включаем светодиод
delay(10); // ждем 0.1 секунду
digitalWrite(led1, LOW); // выключаем светодиод
delay(90); // ждем 0.9 секунды
}

Итак, немного поигрались, замечательно.

Как я уже говорил в видеоматериале это будет, использование команды delay() крайне нежелательно, так ведет к массе нехороших последствий в случае изменений кода или перехода на другой процессор. Поэтому рассмотрим второй способ написания этой же программы без использования команды delay();

int led1=13;
unsigned long time;
unsigned long timeUp;
unsigned long timeDown;
void setup() {
pinMode(led1, OUTPUT);
timeUp=millis()+1000;
timeDown=millis()+2000;
Serial.begin(9600);
}
void loop()
{
time = millis();
if (time>timeUp){
timeUp=timeUp+2000;
digitalWrite(led1, HIGH); // включаем светодиод
Serial.print(timeUp);
Serial.print(" ");
Serial.print(timeDown);
Serial.print(" ");
Serial.println(time);
}
if (time>timeDown){
timeDown=timeDown+2000;
digitalWrite(led1, LOW); // выключаем светодиод
}
}

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

Упрощенная программа выглядит так:

int led1=13;
unsigned long time;
unsigned long timeUp;
unsigned long timeDown;
void setup() {
pinMode(led1, OUTPUT);
timeUp=millis()+1000;
timeDown=millis()+2000;
}
void loop()
{
time = millis();
if (time>timeUp){
timeUp=timeUp+2000;
digitalWrite(led1, HIGH); // включаем светодиод
}
if (time>timeDown){
timeDown=timeDown+2000;
digitalWrite(led1, LOW); // выключаем светодиод
}
}

Основная идея в том, что мы ввели три переменные

time в эту переменную мы каждый цикл будем записывать с помощью команды milles() значения времени со старта программы, будет оно в миллисекундах.

timeUp - эта переменная хранит время, когда в следующий раз включится светодиод. Именно поэтому в начале программы записываем значение на 1000 больше, чем текущее время.

timeDown - эта переменная хранит время, когда в следующий раз выключится светодиод. Именно поэтому в начале программы записываем значение на 2000 больше, чем текущее время.

То есть мы начали в 0, затем в то время, когда таймер перескочил за 1000 (time>timeUp)мс включили диод и установили новое время через 2000 мс и переходим дальше

if (time>timeUp){ //сравниваем текущее время и метку вкл.
timeUp=timeUp+2000; //увеличили отметку включения
digitalWrite(led1, HIGH); // включаем светодиод
}

Затем проверяем на отключение аналогичным образом. Для данного кода не имеет значения, что мы будем вперед проверять

(time>timeUp) или

(time>timeDown), так как у нас идет привязка к внутреннему таймеру и времени включения. Можете поэкспериментировать.

Итак, мы с вами рассмотрели 2 способа включения светодиода, один совсем простой, но непрактичный, второй уже похож на код, но он тоже имеет свои недостатки.

Вам задачи

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

2. Придумать еще один вариант, хотя бы алгоритмически как еще можно управлять светодиодом.

Хорошо бы в голове держать 5 разных способов. Если Вы способны сделать 10 или найдёте как это сделать, разными способами, то у Вас наверняка есть талант к программированию железа (это на полном серьёзе).

Во второй программе за основу взята команда millis(), у неё есть особенность, через 50 дней, счетчик сбросится на ноль и пойдет снова, поэтому через этот период диод погаснет и необходимо будет что-то придумывать. Хотя может и не погаснет, но произойдет переполнение, это важно помнить.