Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Курс Arduino - Прерывания, создание функций, советы

Функции и точность показаний

Помнишь свой первый эксперимент? А помнишь, как я учил делать его компактнее с помощью for? К чему я это. В этом уроке я покажу, как можно проще выполнять однотипные действия. Сильно доставляет, когда в коде нужно много раз выполнять одно и то же действие. Чтобы облегчить жизнь, я познакомлю тебя с созданием функций.

Еще мы рассмотрим такую полезную штуку, как прерывания. Чем она полезна, рассмотрим ниже.

Что понадобится?

  • Светодиоды
  • Резисторы на 220 Ом и на 10 кОм
  • Соединительные провода «ПАПА- ПАПА»
  • Фоторезистор
  • Тактовая кнопка

Функции

Соберем светофор из первого эксперимента.

Код

// Основная часть
#define RED 13
#define YELLOW 12
#define GREEN 11

void setup() 
{
  // Объявление пинов.
   for (int i = 0; i < 3; ++i)
   pinMode(i + GREEN, OUTPUT);
}

void loop() 
 {
  //Вызов функций.
  riy_light(); 
  green();
  yellow();
 }
 
// Началось описание функций.

void riy_light() 
 {
  int main_delay = 5000;  
  int mini_delay = 1000;   

   digitalWrite(RED, HIGH);  
   delay(main_delay);             
                   
   digitalWrite(YELLOW, HIGH);  
   delay(mini_delay);   
 }    
        
 void green()
 { 
  int main_delay = 5000; 
  int blink_delay = 800;
  
  digitalWrite(RED, LOW);   
  digitalWrite(YELLOW, LOW);
  digitalWrite(GREEN, HIGH);  
  delay(main_delay);         
  digitalWrite(GREEN, LOW);
  
  for(int i = 0; i < 3; i = i+1)
  {  
    delay(blink_delay);
    digitalWrite(GREEN, HIGH);
    delay(blink_delay);
    digitalWrite(GREEN, LOW);
  }
 } 
 
 void yellow()
 {
  int mini_delay = 1000;
  
  digitalWrite(YELLOW, HIGH);
  delay(mini_delay);
  digitalWrite(YELLOW, LOW); 
  delay(mini_delay);
 }

Пояснения

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

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

После этих действий, описываем, что будет выполнять функция.

А чтобы вызвать функцию, мы должны написать ее имя с круглыми скобками вот так: function();

Внимательный товарищ заметит, что самодельные функции вызываются так же, как и стандартные функции среды Arduino IDE и функции из подключенных библиотек. Отсюда можно судить, что и библиотека, и стандартные функции – это набор сделанных кем-то функций. Логично, да?

«А могу ли я сделать собственную библиотеку из созданных мною функций?» - спросишь ты. Конечно. Эту задачу мы будем пробовать выполнить в третьей части курса. Сейчас нам это не пригодится. Есть еще много более нужной сейчас информации, не стоит забивать голову.

Прерывания

Чем полезны прерывания? Они позволяют приостановить выполнение основного кода для выполнения какого-нибудь действия. Это бывает полезно в считывании показаний с датчиков. Так как показания считываются только один раз за проход loopa. А если в нем есть паузы, то показания становятся неточными. Это важно в подсчете оборотов колеса, например.

Сейчас я докажу важность прерываний простым экспериментом.

 

Код

#define FOT A2
#define BUT 2

// Для работы с прерываниями нужно создать переменную volatile 

volatile int val;

void setup()
{
 pinMode(BUT, INPUT_PULLUP);
 pinMode(FOT, INPUT);
 
// Когда значение изменяется с HIGH на LOW
// Обращаемся к функции out
 attachInterrupt(0, out, FALLING);

 Serial.begin(9600);
}

void loop() 
{
  Serial.println("Value");
  Serial.println(analogRead(FOT));
  
  // Вместо задержки могут выполняться разные действия
  // Она создает имитацию большого кода 
  delay(5000);
}
// Функция, вызываемая прерываниями
void out()
{
  val = analogRead(FOT);
  Serial.println("Extra value");
  Serial.println(val);
}

Пояснения

Volatile – для работы с прерываниями мы должны создать переменную с квалификатором. Этот квалификатор объявляется, когда переменная будет изменяться за пределами того участка, где она была объявлена.

attachInterrupt(№, Function, Mode); - Объявляем о создании прерывания.

№ - определяет номер прерывания. На Arduino Uno могут обрабатываться всего два прерывания. Прерывание 0 считывается со 2 пина, прерывание 1 – с 3.

Ко второму мы и подключили кнопку.

Function – Это функция, которая будет выполняться, когда произошло прерывание.

Она не должна иметь параметров и не должна возвращать значение. Кроме того, в функции, вызываемой прерываниями не работает delay(), значение millis() не изменяется и может быть потеря данных с Serial Monitor. А переменные, используемые в функции, должны быть volatile.

Mode – Это условие, при котором будет выполняться прерывание. Всего таких условий четыре:

LOW – когда на порту LOW.

CHANGE – когда значение меняется с LOW на HIGH и наоборот.

RISING – когда значение изменяется с LOW на HIGH.

FALLING – когда значение изменяется с HIGH на LOW.

Конец?

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

Советы

У тебя есть интернет, если ты читаешь эту статью. А интернет – это кладезь полезной информации. Нужно только знать, как ее оттуда извлечь.

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

Главное – захотеть. А дальше разберешься.

Подготовка

Решил собрать свою схему? Похвально! С чего начать? Начни с бумаги! Сначала определись с тем, что ты хочешь от своего устройства. После этого, придумай алгоритм выполнения поставленной задачи и запиши, а лучше – зарисуй его. Когда все продумано, определись с компонентами, необходимыми для сборки. После этого, приступай к написанию кода и сборке схемы.

Ошибки

А что делать, если код не работает?

Первым делом – проверь, подключена ли плата, выбрана ли нужная плата в IDE, выбран ли порт, к которому подключена плата.

Еще нужно перестать бояться выскакивающих ошибок.

Рассмотрим пример ошибки.

Это ошибка выскакивает, когда пропущена точка с запятой, о чем и говорит «expected ‘;’ before ‘}’ token»

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

А эта, когда ты не объявил переменную.

Если перевести текст ошибки, будет « ‘Val’ не был объявлен в этой области видимости. Еще хорошо, что не объявленная переменная подсвечивается, и нет надобности ее искать.

А такая ошибка возникает, если пропущена фигурная скобка.

Дальше я рассматривать не буду. Если ты не разобрался сам, можешь загуглить ошибку или написать о ней на форуме.

Вгрузил. Не работает

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

В таких случаях нужно определить, где код выполняется как надо, а где что-то уже не так. Для этого можно воспользоваться индикаторами. Например, пищалкой или Serial monitor. Для этого, вставляем tone куда-либо в программу. Если звук произошел, то эта часть программы работает как надо. А если его не было, нужно вставить звук раньше или определить, что не так. Serial может передавать мини- отчеты о выполнении тех или иных частей программы.

Стоит уделять внимание изучению значений, получаемых с пинов, отправляемых на пины, а так же правильность объявления классов переменных. Не стоит забывать о том, что переменные объявленные в одной функции, не будут определены в другой, пока их не передать или не сделать глобальными.

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

Отдыхай!

Хватит на сегодня, пожалуй. Можешь быть горд, что познал основы Arduino. До скорого!

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
Плата Arduino
Arduino Uno
1 Поиск в магазине ОтронВ блокнот
Светодиод
АЛ307В
1 Поиск в магазине ОтронВ блокнот
Светодиод
АЛ102Б
1 Поиск в магазине ОтронВ блокнот
Светодиод
АЛ307Д
1 Поиск в магазине ОтронВ блокнот
Резистор
10 кОм
1 Поиск в магазине ОтронВ блокнот
Резистор
220 Ом
3 Поиск в магазине ОтронВ блокнот
Переменный резисторФоторезистор VT90N21 Поиск в магазине ОтронВ блокнот
Макетная платаBreadboard-half1 Поиск в магазине ОтронВ блокнот
Соединительные провода"Папа-Папа"1 Поиск в магазине ОтронВ блокнот
Кнопка тактоваяБез фиксатора1 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: 0 2
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 1 чел.

Комментарии (3) | Я собрал (0) | Подписаться

0
Роман #
Собранная мной схема примитивного спидометра (ардуино нано, сервопривод, датчик Холла), работает не стабильно а именно при повышении стабилизированной частоты (более 20 Гц) стрелка на серве сильно дергается, при уменьшении ( меньше 15 Гц) стабильно реагирует на скорость. Вместо датчика Холла подключал генератор так же плохо. Питание для сервы отдельное без просадок по напряжению. Если не сложно подскажите. Я в программировании новичок.
Прикрепленный файл: sketch_original_spid.ino
Ответить
0

[Автор]
Симилячник #
Не совсем понятно, как именно работает ваше устройство. Можно чуть подробнее про физическое исполнение?

Общие предложения:
Проверить датчик, которым измеряются обороты. Думаю, что датчик не успевает за оборотами колеса при 20 Гц и получается, что сервопривод дергается.

Код посмотрел.
servo.write(0);
нужно поставить после
servo.attach(9);
так как сначала нужно прикрепить сервомотор, а уже потом отсылать команды.
Ответить
0
Алекс #
Долгое время писал на асемблере, позже перешёл на микробасик. Сейчас перехожу на С++ и сталкнулся с простейшей проблемой аналога операторов gosub или ,call. В С++ это вызов функции. Пролетал кучу уроков и доступней чем здесь не нашел. Спасибо! В преподаватели автору надо, много пользы будет.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
Автомобильный GPS-трекер с GSM/GPRS и дистанционным управлением 200 Вт усилитель класса D на IRS2092
вверх