Обзор и тестирование различных типов датчиков, применяемых в мехатронике
Для выполнения проектов первого занятия необходимо понимать структуру представления программ, их основные элементы и особенности языка программирования, на котором они пишутся. Далее дано краткое описание всех команд, которые будут использоваться в первой лабораторной работе для работы с аналоговыми и дискретными датчиками и простым исполнительным устройством – сервоприводом.
Структура программы и базовые функции setup() и loop()
Любая программа, написанная Вами, должна включать в себя две функции и иметь следующий вид:
void setup()
{
//код программы, выполняемый один раз при включении
}
void loop()
{
//код, выполняемый постоянно, представляющий собой основную часть
}
В функции setup() обычно определяются режим работы портов и установка соединения по последовательному порту. В loop() записываются все операции чтения и записи данных с портов, математические и логические операции, вызовы других функций и прочие операции работы микроконтроллера, необходимые для выполнения поставленной задачи.
Фигурные скобки {} определяют начало и конец тела функции или блока выражений. На каждую открывающую фигурную скобку в программе должна быть закрывающая скобка.
Создание новых переменных и их типы
Переменные предназначены для хранения значений различных типов и их использования в ходе работы программы. Их типы, способы определения и границы видимости в целом аналогичны изученным на дисциплине “Основы программирования и алгоритмизации”. Стоит отметить, что номера контактов контроллера в больших программах обычно определяются глобальными переменными перед функцией setup(). В таком случае упрощается их перенастройка при замене одних контактов на другие. Пример создания и присваивания переменных:
int outPin; // объявление переменной целочисленного типа
outPin = 10; // и присваивание ей значения
float pi = 3.14; // объявление и присваивание – с плавающей точкой
В конце каждого выражения и для разделения элементов программ применяется точка с запятой – “;”. Однострочные комментарии начинаются с //.
Определение используемых входов и выходов микроконтроллера
Для того чтобы записать или считать информацию с какого-либо контакта микроконтроллера, необходимо предварительно его определить в функции setup():
void setup()
{
pinMode(12, INPUT); // 12 контакт определяется как дискретный вход
pinMode(outPin, OUTPUT); // 10 контакт определяется как выход
}
Цифровое чтение и цифровая запись сигналов
Функция digitalRead(inputPin); позволяет считать дискретный сигнал с контакта inputPin и получить значение HIGH или LOW (высокий или низкий логический уровень соответственно). Функция digitalWrite(outPin, HIGH); записывает на дискретный выход outPin логический сигнал, который может задаваться из переменной или константой. Используя эти команды можно получать состояния дискретных датчиков (например, кнопок), производить их программный анализ и выводить некоторую информацию на выходы контроллера, к которым подключены дискретные устройства (светодиоды, реле).
Аналоговое чтение и аналоговая запись сигналов
Считывание сигналов с аналоговых входов производится с помощью команды analogRead(A0). В качестве входа могут быть указаны контакты микроконтроллера с A0 до A5, причём считанный сигнал будет с 10-битовым разрешением (в соответствии с разрядностью аналого-цифрового преобразователя) и будет находиться в диапазоне от 0 до 1023.
При помощи широтно-импульсной модуляции реализуется аналоговый вывод с разрядностью в 8 бит (от 0 до 255). Контакты, которые им оборудованы, обозначены на плате символом “~”. Пример чтения сигнала с A3, его масштабирования и вывода на контакт с ШИМ:
int a = analogRead(A3) / 4;
analogWrite(9, a);
Функция задержки
Функция delay(1000); приостанавливает выполнение программы на заданное в миллисекундах время – в данном случае на одну секунду.
Конструкция if, if-else
Данные конструкции предназначены для выполнения некоторого выражения, заключённого в фигурные скобки, в том случае, если соблюдается проверяемое условие. Например:
if (a != b) // если а не равно b
{
a = b; // присвоить а значение b
}
else // иначе
{
a = 0; // присвоить а
b = 0; // и b нулю
}
Вторая часть конструкции else, выполняемая в случае не соблюдения условия в скобках после if, может быть пропущена, если нет необходимости в альтернативном действии.
В скобках после if могут быть использованы следующие операторы сравнения:
x == y // x равно y
x != y // x не равно y
x < y // x меньше y
x > y // x больше y
x <= y // x меньше или равно y
x >= y // x больше или равно y
Для записи нескольких условий, которые должны проверяться одновременно, могут быть использованы логические операторы:
&& – логическое “И” – истинно только в том случае, если оба условия выполняются, например:
if (x>0 && x<5) // если х больше нуля и меньше пяти
|| – логическое “ИЛИ” – истинно в случае, когда выполняется хотя бы одно из условий:
if (x > 0 || x < 0) // истинно, если x не равен нулю
Подключение библиотек и работа с ними
Существует множество готовых решений, реализованных как отдельные файлы, содержащие определение внутренних переменных и функций а также внешних функций, через которые осуществляется работа с ними. Их применение значительно упрощает написание программ и работу с отдельным оборудованием, сводя его к двум-трём строчкам кода. В ходе выполнения лабораторных работ вы познакомитесь с несколькими стандартными библиотеками. Подключение библиотек осуществляется при помощи записи вне функций программы следующей конструкции:
#include <название_библиотеки.h>
Конструкции для работы с конкретными библиотеками сугубо индивидуальны и должны изучаться отдельно при ознакомлении с её примерами или справочными файлами.
Соберите приведённые ниже схемы, напишите программы и проверьте их работоспособность. В качестве подсказок используйте Справочные материалы, находящиеся в конце этого пособия.
Электрическая схема с кнопкой и диодом
Рисунок 1 – Схема с одной кнопкой и одним диодом
Мигание диодом по нажатию кнопки. Текст программы:
void setup() {
pinMode(3, OUTPUT); // Третий контакт контроллера – выход (диод)
pinMode(4, INPUT); // Четвёртый контакт контроллера – вход (кнопка)
}
void loop() {
int a = digitalRead(4); // Чтение сигнала с кнопки в переменную
digitalWrite(3,a); // Подача значения переменной на диод
}
Два диода и две кнопки. Попробуйте сами собрать электрическую схему:
void setup() {
pinMode(3, OUTPUT); // Третий контакт контроллера – выход (диод 1)
pinMode(5, OUTPUT); // Пятый контакт контроллера – выход (диод 2)
pinMode(4, INPUT); // Четвёртый контакт контроллера – вход (кнопка 1)
pinMode(6, INPUT); // Шестой контакт контроллера – вход (кнопка 2)
}
void loop() {
int a = digitalRead(4); // Чтение сигнала с кнопки 1 в переменную a
digitalWrite(3,a); // Подача значения переменной на диод 1
int b = digitalRead(6); // Чтение сигнала с кнопки 2 в переменную b
digitalWrite(5,b); // Подача значения переменной на диод 2
}
Электрическая схема с фоторезистором и диодом
Рисунок 2 – Схема с фоторезистором и одним диодом
Включение диода в темноте и выключение на свету. Текст программы
void setup() {
pinMode(13, OUTPUT); // тринадцатый контакт – выход (диод)
}
void loop() {
//Если степень освещённости низкая (чтение аналогового порта А0 и
//сравнение с константой),
if (analogRead(A0) < 250)
digitalWrite(13, HIGH); //то включается светодиод
//Иначе
else
digitalWrite(13, LOW); //выключается светодиод
}
Потенциометр (переменный резистор) и диод. Электрическая схема
Рисунок 3 – Схема потенциометром и одним диодом
Управление яркостью светодиода от потенциометра. Программа
void setup() {
pinMode(9, OUTPUT); // девятый контакт – выход (диод)
}
void loop() {
//Чтение напряжения с потенциометра на порте А0 и переход от
//10-битного значения АЦП (от 0 до 1023) к 8-битному ЦАП
//(ШИМ от 0 до 255)
int x = analogRead(A0) / 4;
analogWrite(9, x); //Запись значения переменной на выход
delay(50); //Задержка в 50 миллисекунд между выполнениями loop()
}
Схема подключения сервопривода к микроконтроллеру
Рисунок 4 – Схема подключения сервопривода
Поворот сервопривода на угол 0 градусов и 180 градусов через каждые 2 секунды
#include <Servo.h> //Подключение библиотеки сервоприводов
Servo ServoA; //Создание объекта – сервопривода
void setup()
{
ServoA.attach(10); //Определение контакта подключения сервопривода
}
void loop()
{
ServoA.write(0); //Поворот сервопривода на нулевой угол
delay(2000); //Двухсекундная пауза
ServoA.write(180); //Поворот сервопривода на 180 градусов
delay(2000); //Двухсекундная пауза
}
Выполните задания и сохраните необходимые материалы для отчёта по лабораторным работам – названия схем, которые надо добавить в отчёт, написаны в Справочных материалах в конце этого пособия:
1) соберите электрическую схему и напишите программу управления светодиодом по нажатию кнопки;
2) соберите схему управления с двумя кнопками и двумя светодиодами;
3) соберите схему с фоторезистором и светодиодом – светодиод должен загораться в том случае, если фоторезистор регистрирует низкий уровень освещения;
4) соберите схему с потенциометром и светодиодом – управляйте яркостью свечения светодиода, в зависимости от угла поворота потенциометра;
5) подключите к микроконтроллеру сервопривод и напишите программу, изменяющую его угол поворота от 0 градусов до 180 и обратно каждые две секунды;
6) соберите схему мехатронного устройства с фоторезистором сервоприводом и светодиодом. Если фоторезистор регистрирует низкий уровень освещения, то должен загораться светодиод, в противном случае светодиод должен выключаться, а сервопривод – приходить в движение. Объясните, какие части полученной модели соответствуют компонентам мехатронного устройства.
Дата добавления: 2018-09-24; просмотров: 568;