Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

Лекция



Привет, Вы узнаете о том , что такое arduino ide, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое arduino ide, arduino , настоятельно рекомендую прочитать все из категории Цифровые устройства. Микропроцессоры и микроконтроллеры. принципы работы ЭВМ.

Для установки программного обеспечения и подключения контроллера Arduino UNO R3 к компьютеру необходимы:

  • плата контроллера;
  • USB кабель (обычно дается в комплекте);
  • персональный компьютер с ОС Windows, подключенный к интернету.

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

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

Установка интегрированной среды разработки Arduino IDE.

Прежде всего, необходимо загрузить последнюю версию программы. Загрузить ZIP архив можно с официального сайта поддержки систем Ардуино по этой ссылке. Необходимо выбрать строку с нужной операционной системой – Windows ZIP file...

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

Создать папку, например Arduino, и распаковать в нее zip файл.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

Подключение платы Ардуино.

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

Установка драйвера.

Мне известны платы Arduino UNO R3 использующие в качестве моста USB-UART

  • микросхему ATmega16U2 (оригинальный вариант)
  • микросхему CH340G (китайский клон).

Процессы установки драйверов для этих вариантов отличаются.

Установка драйвера для ARDUINO UNO с преобразователем интерфейсов ATmega16U2.

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

Драйвер надо устанавливать вручную. Для этого переходим Пуск –> Панель управления –> Система –> Диспетчер устройств.

В разделе Порты (COM и LPT) должно быть устройство Arduino UNO с предупреждающим желтым значком.

Щелкаем правой кнопкой мыши по значку.

Выбираем Обновить драйвер.

Дальше Выполнить поиск драйверов на этом компьютере.

Вручную указать место размещения драйвера. Файл ArduinoUNO.inf находится в каталоге Drivers папки, куда распакован архив.

В разделе Порты (COM и LPT) появляется новый, виртуальный COM. Его номер надо запомнить.

Установка драйвера для ARDUINO UNO с преобразователем интерфейсов CH340G (китайский клон).

После подключения платы к компьютеру, Windows сама начнет процесс установки драйвера.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

Через некоторое время появится сообщение о неудачной попытке.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

Драйвер надо устанавливать вручную. Для этого переходим Пуск –> Панель управления –> Система –> Диспетчер устройств.

Появилось новое устройство USB2.0-Serial с желтым предупреждающим значком.

Запускаем установочный файл ch341ser.exe.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

Выбираем INSTALL.

Ждем сообщение об успешной установке.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

В диспетчере устройств появляется новое устройство USB-SERIAL CH340.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

Необходимо запомнить номер COM порта.

Запуск интегрированной среды разработки Arduino IDE.

Запускаем файл arduino.exe.

Выбираем тип платы Ардуино: Инструменты -> Плата -> Arduino UNO.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

Необходимо указать номер COM порта: Инструменты -> Порт.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

Для проверки работы системы можно запустить первый скетч – мигающий светодиод. Для этого: Файл -> Примеры -> 01.Basics -> Blink.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

Нажимаем кнопку Загрузка.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

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

В следующем уроке получим минимальные знания о языке программирования для Ардуино - языке C++.

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

  • Структура программы Ардуино
  • Первоначальные правила синтаксиса языка C
  • Переменные и типы данных
  • Арифметические операции
  • Операции отношения
  • Логические операции
  • Операции над указателями
  • Битовые операции
  • Операции смешанного присваивания
  • Выбор вариантов, управление программой
  • Массивы
  • Функции
  • Рекомендации по оформлению программ на языке C

Структура программы Ардуино.

Структура программы Ардуино достаточно проста и в минимальном варианте состоит из двух частей setup() и loop().

void setup() {

// код выполняется один раз при запуске программы

}

void loop() {

// основной код, выполняется в цикле

}

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

После завершения setup() управление переходит к функции loop(). Она в бесконечном цикле выполняет команды, записанные в ее теле (между фигурными скобками). Собственно эти команды и совершают все алгоритмические действия контроллера.

Первоначальные правила синтаксиса языка C.

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

z = x + y;
z= x
+ y ;

{ } фигурные скобки определяют блок функции или выражений. Например, в функциях setup() и loop().

/* … */ блок комментария, обязательно закрыть.

/* это блок комментария */

// однострочный комментарий, закрывать не надо, действует до конца строки.

// это одна строка комментария

Переменные и типы данных.

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

Тип данных Разрядность, бит Диапазон чисел
boolean 8 true, false
char 8 -128 … 127
unsigned char 8 0 … 255
byte 8 0 … 255
int 16 -32768 … 32767
unsigned int 16 0 … 65535
word 16 0 … 65535
long 32 -2147483648 … 2147483647
unsigned long 32 0 … 4294967295
short 16 -32768 … 32767
float 32 -3.4028235+38 … 3.4028235+38
double 32 -3.4028235+38 … 3.4028235+38

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

Объявление переменных.

Указывается тип данных, а затем имя переменной.

int x; // объявление переменной с именем x типа int
float widthBox; // объявление переменной с именем widthBox типа float

Все переменные должны быть объявлены до того как будут использоваться.

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

  • Переменные, объявленные в начале программы, до функции void setup(), считаются глобальными и доступны в любом месте программы.
  • Локальные переменные объявляются внутри функций или таких блоков, как цикл for, и могут использоваться только в объявленных блоках. Возможны несколько переменных с одним именем, но разными областями видимости.

int mode; // переменная доступна всем функциям

void setup() {
// пустой блок, начальные установки не требуются
}

void loop() {

long count; // переменная count доступна только в функции loop()

for ( int i=0; i < 10;) // переменная i доступна только внутри цикла
{
i++;
}
}

При объявлении переменной можно задать ее начальное значение (проинициализировать).

int x = 0; // объявляется переменная x с начальным значением 0
char d = ‘a’; // объявляется переменная d с начальным значением равным коду символа ”a”

При арифметических операциях с разными типами данных происходит автоматическое преобразование типов данных. Но лучше всегда использовать явное преобразование.

int x; // переменная int
char y; // переменная char
int z; // переменная int

z = x + (int) y; // переменная y явно преобразована в int

Арифметические операции.

= присваиваниее
+ сложение
- вычитание
* произведение
/ деление
% остаток от деления

Операции отношения.

== равно
!= не равно
< меньше
> больше
<= меньше или равно
>= больше или равно

Логические операции.

&& логическое И
|| логическое ИЛИ
! логическое НЕ

Операции над указателями.

* косвенная адресация
& получение адреса переменной

Битовые операции.

& И
| ИЛИ
^ ИСКЛЮЧАЮЩЕЕ ИЛИ
~ ИНВЕРСИЯ
<< СДВИГ ВЛЕВО
>> СДВИГ ВПРАВО

Операции смешанного присваивания.

++ + 1 к переменной
-- - 1 к переменной
+= сложение
-= вычитание
*= умножение
/= деление
%= остаток от деления
&= битовое И
|= битовое ИЛИ

Выбор вариантов, управление программой.

Оператор IF проверяет условие в скобках и выполняет последующее выражение или блок в фигурных скобках, если условие истинно.

if (x == 5) // если x=5, то выполняется z=0
z=0;

if (x > 5) // если x > 5, то выполняется блок z=0, y=8;
{ z=0; y=8; }

IF … ELSE позволяет сделать выбор между двух вариантов.

if (x > 5) // если x > 5, то выполняется блок z=0, y=8;
{
z=0;
y=8;
}
else // в противном случае выполняется этот блок
{
z=0;
y=0;
}

ELSE IF – позволяет сделать множественный выбор

if (x > 5) // если x > 5, то выполняется блок z=0, y=8;
{
z=0;
y=8;
}

else if (x > 20) // если x > 20, выполняется этот блок
{
}

else // в противном случае выполняется этот блок
{
z=0;
y=0;
}

SWITCH CASE - множественный выбор. Об этом говорит сайт https://intellect.icu . Позволяет сравнить переменную (в примере это x) с несколькими константами (в примере 5 и 10) и выполнить блок, в котором переменная равна константе.

switch (x) {

case 5 :
// код выполняется если x = 5
break;

case 10 :
// код выполняется если x = 10
break;

default :
// код выполняется если не совпало ни одно предыдущее значение
break;
}

Цикл FOR. Конструкция позволяет организовывать циклы с заданным количеством итераций. Синтаксис выглядит так:

for ( действие до начала цикла;
условие продолжения цикла;
действие в конце каждой итерации ) {

// код тела цикла

}

Пример цикла из 100 итераций.

for ( i=0; i < 100; i++ ) // начальное значение 0, конечное 99, шаг 1

{
sum = sum + I;
}

Цикл WHILE. Оператор позволяет организовывать циклы с конструкцией:

while ( выражение )
{
// код тела цикла
}

Цикл выполняется до тех пор, пока выражение в скобках истинно. Пример цикла на 10 итераций.

x = 0;
while ( x < 10 )
{
// код тела цикла
x++;
}

DO WHILE – цикл с условием на выходе.

do
{
// код тела цикла
} while ( выражение );

Цикл выполняется пока выражение истинно.
BREAK – оператор выхода из цикла. Используется для того, чтобы прервать выполнение циклов for, while, do while.

x = 0;
while ( x < 10 )
{
if ( z > 20 ) break; // если z > 20, то выйти из цикла
// код тела цикла
x++;
}

GOTO – оператор безусловного перехода.

goto metka1; // переход на metka1
………………
metka1:

CONTINUE - пропуск операторов до конца тела цикла.

x = 0;
while ( x < 10 )
{
// код тела цикла
if ( z > 20 ) continue; // если z > 20, то вернуться на начало тела цикла
// код тела цикла
x++;
}

Массивы.

Массив это область памяти, где последовательно хранятся несколько переменных.

Объявляется массив так.

int ages[10]; // массив из 10 переменных типа int

float weight[100]; // массив из 100 переменных типа float

При объявлении массивы можно инициализировать:

int ages[10] = { 23, 54, 34, 24, 45, 56, 23, 23, 27, 28};

Обращаются к переменным массивов так:

x = ages[5]; // x присваивается значение из 5 элемента массива.
ages[9] = 32; // 9 элементу массива задается значение 32

Нумерация элементов массивов всегда с нуля.

Функции.

Функции позволяют выполнять одни и те же действия с разными данными. У функции есть:

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

Описывается пользовательская функция вне функций setup() и loop().

void setup() {
// код выполняется один раз при запуске программы
}

void loop() {
// основной код, выполняется в цикле
}

// объявление пользовательской функции с именем functionName
type functionName( type argument1, type argument1, … , type argument)
{
// тело функции
return();
}

Пример функции, вычисляющей сумму квадратов двух аргументов.

int sumQwadr (int x, int y)
{
return( x* x + y*y);
}

Вызов функции происходит так:

d= 2; b= 3;
z= sumQwadr(d, b); // в z будет сумма квадратов переменных d и b

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

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

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

Рекомендации по оформлению программ на языке C.

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

Имена в языке C.

Имена, представляющие типы данных, должны быть написаны в смешанном регистре. Первая буква имени должна быть заглавная (верхний регистр).

Signal, TimeCount

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

signal, timeCount

Константы должны быть записаны в верхнем регистре. В качестве разделителя нижнее подчеркивание.

MAX_TEMP, RED

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

getTime, setTime

Об остальных формальностях в следующих уроках, по мере необходимости.

В следующем уроке напишем первую программу, научимся считывать данные с цифровых портов и управлять их состоянием.

Первая программа. Функции управления вводом/выводом. Кнопка, светодиод.

03.04.2016 Автор: ЭДУАРД

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

В этом уроке напишем первую программу, научимся считывать значение цифровых входов и устанавливать состояние выходов. Реализуем управление такими простыми элементами, как кнопка и светодиод.

Предыдущий урок Список уроков Cледующий урок

Первая программа должна управлять светодиодом с помощью кнопки:

  • при нажатой кнопке светодиод светится;
  • при отжатой кнопке светодиод не светится.

Подключение кнопки и светодиода к плате Ардуино.

Для связи с внешними элементами в контроллере Arduino UNO существуют 14 цифровых выводов. Каждый вывод может быть определен программой как вход или выход.

У цифрового выхода есть только два состояния высокое и низкое. Высокое состояние соответствует напряжению на выходе порядка 5 В, низкое состояние – 0 В. Выход допускает подключение нагрузки с током до 40 мА.

Когда вывод определен как вход, считав его состояние, можно определить уровень напряжения на входе. При напряжении близком к 5 В (реально более 3 В) будет считано высокое состояние, соответствующее константе HIGH. При напряжении близком к 0 (менее 1,5 В) будет считано низкое состояние, или константа LOW.

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

Светодиод подключается через резистор, ограничивающий ток. Вот типичная схема.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру
Резистор рассчитывается по формуле I = Uвыхода – Uпадения на светодиоде / R.

Uвыхода = 5 В, Uпадения на светодиоде можно принять равным 1,5 В (более точно указывается в справочнике). Получается, то в нашей схеме ток через светодиод задан на уровне 10 мА.

Можете выбрать любой вывод, но я предлагаю для простоты соединений использовать светодиод, установленный на плате. Тот самый, который мигал в первом тестовом примере. Он подключен к цифровому выводу 13. В этом случае дополнительный светодиод к плате подключать не надо.

Кнопку подключаем к любому другому выводу, например, 12. Аппаратная часть схемы подключения кнопки должна обеспечивать уровни напряжений 0 В при нажатой кнопке и 5 В при свободной. Это можно сделать простой схемой.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру
При отжатой кнопке резистор формирует на выводе 5 В, а при нажатой – вход замыкается на землю. Рекомендации по выбору резистора я напишу в заключительном уроке про кнопки. Сейчас предложу другой вариант. Все выводы платы имеют внутри контроллера резисторы, подключенные к 5 В. Их можно программно включать или отключать от выводов. Сопротивление этих резисторов порядка 20-50 кОм. Слишком много для реальных схем, но для нашей программы и кнопки, установленной вблизи контроллера, вполне допустимо.

В итоге схема подключения будет выглядеть так.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру
Кнопку можно припаять на проводах к разъему. Я установил ее на макетную плату без пайки. Купил специально для демонстрации уроков.

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

Функции управления вводом/выводом.

Для работы с цифровыми выводами в системе Ардуино есть 3 встроенные функции. Они позволяют установить режим вывода, считать или установить вывод в определенное состояние. Для определения состояния выводов в этих функциях используются константы HIGH и LOW, которые соответствуют высокому и низкому уровню сигнала.

pinMode(pin, mode)

Устанавливает режим вывода (вход или выход).

Аргументы: pin и mode.

  • pin – номер вывода;
  • mode – режим вывода.
mode = INPUT вывод определен как вход, подтягивающий резистор отключен
mode = INPUT_PULLUP вывод определен как вход, подтягивающий резистор подключен
mode = OUTPUT вывод определен как выход

Функция не возвращает ничего.

digitalWrite(pin, value)

Устанавливает состояние выхода (высокое или низкое).

Аргументы pin и value:

  • pin – номер вывода;
  • value – состояние выхода.
value = LOW устанавливает выход в низкое состояние
value = HIGH устанавливает выход в высокое состояние

Функция не возвращает ничего.

digitalRead(pin)

Считывает состояние входа.

Аргументы: pin - номер вывода.

Возвращает состояние входа:

digitalRead(pin) = LOW низкий уровень на входе
digitalRead(pin) = HIGH высокий уровень на входе

Программа управления светодиодом.

С учетом предыдущего урока теперь у нас есть вся необходимая информация для написания программы. Программа в Ардуино состоит из двух функций setup() и loop. В setup() мы устанавливаем режимы выводов, а в loop() считываем состояние кнопки в переменную buttonState и передаем его на светодиод. По пути инвертируем, т.к. при нажатой кнопке низкое состояние сигнала, а светодиод светится при высоком.

/* Программа scetch_5_1 урока 5
Зажигает светодиод (вывод 13) при нажатии кнопки (вывод 12) */

boolean buttonState; // создаем глобальную переменную buttonState

void setup() {
pinMode(13, OUTPUT); // определяем вывод 13 (светодиод) как выход
pinMode(12, INPUT_PULLUP); // определяем вывод 12 (кнопка) как вход
}

// бесконечный цикл
void loop() {
buttonState = digitalRead(12); // считываем состояние 12 входа (кнопки) и записываем в buttonState
buttonState = ! buttonState; // инверсия переменной buttonState
digitalWrite(13, buttonState); // записываем состояние из buttonState на выход 13 (светодиод)
}

Для хранения промежуточного значения состояния кнопки создаем переменную buttonState с типом boolean. Это логический тип данных. Переменная может принимать одно из двух значений: true (истинно) или false (ложно). В нашем случае - светодиод светится и не светится.

Скопируйте или перепишите код программы в окно Arduino IDE. Загрузите в контроллер и проверьте.

Для сохранения проектов Ардуино я создал папку d:\Arduino Projects\Lessons\Lesson5. В каждом уроке программы называю scetch_5_1, scetch_5_2, … Вы можете поступать также или ввести свою систему сохранения файлов.

Блок программы:

buttonState = digitalRead(12); // считываем состояние 12 входа (кнопки) и записываем в buttonState
buttonState = ! buttonState; // инверсия переменной buttonState
digitalWrite(13, buttonState); // записываем состояние из buttonState на выход 13 (светодиод)

можно записать без использования промежуточной переменной buttonState.

digitalWrite(13, ! digitalRead(12) );

В качестве аргумента для функции digitalWrite() выступает функция digitalRead(). Хороший стиль это именно такой вариант. Не требуются дополнительные переменные, меньше текст.

Т.е. функцию можно использовать как аргумент другой функции. Функции можно вызывать из функций.

Другой вариант этой же программы, использующий условный оператор if.

/* Программа scetch_5_2 урока 5
Зажигает светодиод (вывод 13) при нажатии кнопки (вывод 12) */

void setup() {
pinMode(13, OUTPUT); // определяем вывод 13 (светодиод) как выход
pinMode(12, INPUT_PULLUP); // определяем вывод 12 (кнопка) как вход
}

// бесконечный цикл
void loop() {
if ( digitalRead(12) == LOW ) digitalWrite(13, HIGH);
else digitalWrite(13, LOW);
}

В бесконечном цикле проверяется состояние вывода 12 (кнопка), и если оно низкое (LOW), то на выводе 13 (светодиод) формируется высокое состояние (HIGH). В противном случае состояние светодиода низкое (LOW).

Директива #define.

Во всех примерах для функций ввода/вывода мы указывали аргумент pin, определяющий номер вывода, в виде конкретного числа - константы. Мы помнили, что константа 12 это номер вывода кнопки, а 13 – номер вывода светодиода. Гораздо удобнее работать с символьными именами. Для этого в языке C существует директива, связывающая идентификаторы с константами, выражениями.

Директива #define определяет идентификатор и последовательность символов, которая подставляется вместо идентификатора, каждый раз, когда он встречается в тексте программы.

В общем виде она выглядит так:

#define имя последовательность_символов

Если в наших программах мы напишем:

#define LED_PIN 13 // номер вывода светодиода равен 13

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

digitalWrite(LED_PIN, HIGH);

Окончательный вариант программы с использованием #define.

/* Программа урока 5
Зажигает светодиод (вывод 13) при нажатии кнопки (вывод 12) */

#define LED_PIN 13 // номер вывода светодиода равен 13
#define BUTTON_PIN 12 // номер вывода кнопки равен 12

void setup() {
pinMode(LED_PIN, OUTPUT); // определяем вывод 13 (светодиод) как выход
pinMode(BUTTON_PIN, INPUT_PULLUP); // определяем вывод 12 (кнопка) как вход
}

// бесконечный цикл
void loop() {
digitalWrite(LED_PIN, ! digitalRead(BUTTON_PIN) );
}

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

В следующем уроке будем бороться с дребезгом кнопки, разобьем программу на блоки и создадим интерфейс связи между блоками.

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

Предыдущий урок Список уроков Следующий урок

В прошлом уроке мы написали простую программу для управления светодиодом с помощью кнопки. Нажата – светодиод светится, отжата - не светится. Наверное, вы решили, что кнопка очень простой компонент и работать с ней несложно. Считали состояние кнопки – что-то сделали. Но давайте напишем другую программу управления светодиодом.

Программа управления светодиодом.

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

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

Т.е. программа должна отлавливать фронт кнопки или перепад состояния сигнала. Есть два фронта сигнала:

  • с высокого состояния в низкое ( --_ );
  • с низкого состояния в высокое (_--).

Нажатие кнопки будет соответствовать перепаду сигнала из высокого в низкое. Это событие мы и должны выделить.

/* Программа sketch_6_1 урока 6
* На каждое нажатие кнопки инвертирует состояние светодиода
* Работает неправильно из-за дребезга контактов */

#define LED_PIN 13 // номер вывода светодиода равен 13
#define BUTTON_PIN 12 // номер вывода кнопки равен 12

boolean buttonState; // состояние кнопки
boolean buttonPrevState; // предыдущее состояние кнопки
boolean ledState; // состояние светодиода

void setup() {
pinMode(LED_PIN, OUTPUT); // определяем вывод 13 (светодиод) как выход
pinMode(BUTTON_PIN, INPUT_PULLUP); // определяем вывод 12 (кнопка) как вход
}

void loop() {

buttonState= digitalRead(BUTTON_PIN); // записываем состояние кнопки в переменную buttonState

if ( (buttonPrevState == HIGH) && (buttonState == LOW) ) {

// предыдущее состояние кнопки - отжата, а текущее - нажата
ledState= ! ledState; // инверсия состояния светодиода
digitalWrite(LED_PIN, ledState); // запись состояния светодиода из переменной нв выход
}

buttonPrevState= buttonState; // предыдущее состояние кнопки = текущему
}

Выделение события происходит в конструкции

if ( (buttonPrevState == HIGH) && (buttonState == LOW) )

&& это логическое И, производимое над условными выражениями. В результате его применения будет выработано условие истинно, если оба выражения истинны. В данном случае блок оператора if будет выполнен, если одновременно предыдущее состояние кнопки = HIGH и текущее состояние кнопки = LOW. Т.е. если кнопка была отжата в предыдущей проверке, а сейчас нажата.

По этому условию инвертируется состояние светодиода.

В принципе, несложная программа. Но загрузите ее в плату Ардуино и проверьте, как она работает.

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

Дребезг контактов кнопки.

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

Установка программного обеспечения Arduino IDE, подключение платы к компьютеру

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

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

Надежная программа должна обязательно обрабатывать сигналы с кнопок и механических датчиков.

Как бороться с дребезгом контактов?

Существует несколько способов обработки дребезга контактов. Описанный ниже – один из самых надежных. Еще один способ я опишу в следующих уроках.

Так вот. Решение достаточно очевидно. Надо не реагировать на частое переключение сигнала. Не может кнопка быть нажата на время, например, 0,0001 сек. Значит это дребезг. Надо дождаться, когда в течение определенного времени состояние кнопки будет стабильным, и только тогда принимать решение. А на частые переключения сигнала не реагировать.

Программа устранения дребезга контактов кнопки.

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

Существуют готовые функции обработки сигналов с кнопок. Вызываешь функцию с номером вывода в качестве аргумента, и она возвращает состояние вывода, “очищенное” от дребезга. Но операция устранения дребезга занимает значительное время, не меньше длительности переходного процесса, как правило, 10 мс. И все это время программа будет ждать результата работы функции. А кнопок может быть несколько. Да и программе, кроме чтения состояния кнопок, еще что-то надо делать, и не все процессы можно надолго прерывать.

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

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

Программа состоит из двух основных блоков в бесконечном цикле loop():

  • блок обработки сигнала кнопки;
  • блок управления светодиодом.

Что нам может потребоваться в результате обработки кнопки. Какие переменные создавать. Как правило, необходимы только два признака:

  • Один показывает текущее состояние кнопки (нажата или отжата).
  • Второй сообщает о том, что кнопка была нажата (был перепад сигнала с высокого уровня в низкий).

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

boolean flagPress= false; // признак кнопка в нажатом состоянии
boolean flagClick= false; // признак нажатия кнопки (фронт)

Блок обработки сигнала кнопки мы вызываем с периодом 2 мс. Для отсчета времени устойчивого состояния сигнала необходим счетчик состояния кнопки и константа, задающее это время.

byte buttonCount= 0; // счетчик подтверждений состояния кнопки
#define TIME_BUTTON 12 // время устойчивого состояния кнопки (* 2 мс)

Функции программного блока заключаются в том, что он вырабатывает признаки:

  • flagPress= true, если кнопка нажата;
  • flagPress= false, если кнопка отжата;
  • flagClick= true, если было событие – кнопка была нажата. Этот признак должен сбрасываться после обработки события. В блоке обработки он может только устанавливаться.

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

Вот скетч программы, построенной по такому принципу.

/* Программа sketch_6_2 урока 6
* На каждое нажатие кнопки инвертирует состояние светодиода */

#define LED_PIN 13 // номер вывода светодиода равен 13
#define BUTTON_PIN 12 // номер вывода кнопки равен 12

// переменные и константы для обработки сигнала кнопки
boolean flagPress= false; // признак кнопка в нажатом состоянии
boolean flagClick= false; // признак нажатия кнопки (фронт)
byte buttonCount= 0; // счетчик подтверждений состояния кнопки
#define TIME_BUTTON 12 // время устойчивого состояния кнопки (* 2 мс)

boolean ledState; // переменная состояния светодиода

void setup() {
pinMode(LED_PIN, OUTPUT); // определяем вывод 13 (светодиод) как выход
pinMode(BUTTON_PIN, INPUT_PULLUP); // определяем вывод 12 (кнопка) как вход
}

// бесконечный цикл с периодом 2 мс
void loop() {

/* блок обработки сигнала кнопки
* при нажатой кнопке flagPress= true
* при отжатой кнопке flagPress= false
* при нажатии на кнопку flagClick= true */

if ( flagPress == (! digitalRead(BUTTON_PIN)) ) {
// признак flagPress = текущему состоянию кнопки
// (инверсия т.к. активное состояние кнопки LOW)
// т.е. состояние кнопки осталось прежним
buttonCount= 0; // сброс счетчика подтверждений состояния кнопки
}
else {
// признак flagPress не = текущему состоянию кнопки
// состояние кнопки изменилось
buttonCount++; // +1 к счетчику состояния кнопки

if ( buttonCount >= TIME_BUTTON ) {
// состояние кнопки не мянялось в течение заданного времени
// состояние кнопки стало устойчивым
flagPress= ! flagPress; // инверсия признака состояния
buttonCount= 0; // сброс счетчика подтверждений состояния кнопки

if ( flagPress == true ) flagClick= true; // признак фронта кнопки на нажатие
}
}


// блок управления светодиодом
if ( flagClick == true ) {
// было нажатие кнопки
flagClick= false; // сброс признака фронта кнопки
ledState= ! ledState; // инверсия состояние светодиода
digitalWrite(LED_PIN, ledState); // вывод состояния светодиода
}

delay(2); // задержка на 2 мс
}

В блоке обработки состояния кнопки происходит следующее:

  • Если текущее состояние кнопки соответствует признаку flagPress, то ничего не делается. Только сбрасывается счетчик подтверждения состояния.
  • Если состояния кнопки и признака различны, то счетчик начинает считать время подтверждения. Любой возврат к равенству состояния кнопки и признака сбрасывает счетчик.
  • Если состояние сигнала устойчивое в течение количества циклов, определяемого константой TIME_BUTTON, то признак состояния кнопки flagPress инвертируется.
  • При этом формируется признак фронта сигнала flagClick, если кнопка стала нажатой. На отжатие кнопки этот признак не вырабатывается.

Блок управления светодиодом, думаю, пояснять не надо.

Блоки включены в бесконечный цикл с периодом 2 мс. Это утверждение не совсем корректно, но давайте пока его не обсуждать. Главное, что блок обработки сигнала кнопки вызывается регулярно с периодом примерно 2 мс.

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

В константе TIME_BUTTON задано время устойчивого состояния сигнала кнопки – 24 мс. Я рекомендую выбирать это время в пределах 20-30 мс.

Для проверки алгоритма обработки сигнала увеличьте значение константы TIME_BUTTON до 250 (время 500 мс). Увидите, что при быстром нажатии (менее 0,5 сек) светодиод не меняет своего состояния. Т.е. алгоритм подтверждения устойчивого состояния работает правильно.

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

Исследование, описанное в статье про arduino ide, подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое arduino ide, arduino и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Цифровые устройства. Микропроцессоры и микроконтроллеры. принципы работы ЭВМ

создано: 2020-04-06
обновлено: 2021-03-13
132265



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Цифровые устройства. Микропроцессоры и микроконтроллеры. принципы работы ЭВМ

Термины: Цифровые устройства. Микропроцессоры и микроконтроллеры. принципы работы ЭВМ