Датчики DHT11/DHT22 (рис. S1.1) предназначены для измерения температуры и влажности воздуха.
Внешний вид, назначение контактов
Рис. S1.1. Датчик DHT11
Основные характеристики
Наименование
Значение
DHT11
DHT22
Диапазон измерения температуры/точность измерения
0 ÷ 50°С /±2°C
–40 ÷ 125°С /±0,5°C
Диапазон измерения относительной влажности
20 ÷ 80% /±5°C
0 ÷ 100% /±2 ÷ 5°C
Частота опроса датчиков, Гц
1 (один раз в секунду)
0,5 (1 раз в две секунды)
Размеры, мм
15,5×12,0×5,5
15,1×25,0×7,7
Напряжение питания, В
3 ÷ 5
3 ÷ 5
Максимальный ток, мА
2,5
2,5
Схема подключения
Рис. S1.2. Подключение датчика DHT11
Внимание!
Если расстояние от датчика до Arduino небольшое, рекомендуемый номинал резистора R1 10 кОм (рис. S1.2), а для расстояния больше 20 метров, рекомендуется резистор номиналом 5,1 кОм. Если же датчик имеет только три контакта (5V, OUT и GND), то резистор R1 вообще не нужен.
Программный код
Загрузите библиотеку DHT-sensor-library для работы Arduino с датчиками DHT11 и DHT22. Для этого откройте Менеджер библиотек, выполнив команду Инструменты | Управлять библиотеками. Справа вверху в строке поиска введите DHT. В открывшемся списке выберите DHT sensor library by Adafruit версии 1.2.3 (в версиях 1.3.0 и новее возможна ошибка при компиляции). Нажмите кнопку Установка.
Датчик уровня жидкости предназначен для определения уровня жидкости в различных емкостях. На датчике расположен резисторы, транзистор и чередующиеся оголенные проводящие контакты (рис. S6.1). Чем глубже датчик погружен в воду (большая часть длины контактов находится в воде), тем меньше сопротивление между проводящими контактами.
Внешний вид, назначение контактов
Рис. S6.1. Датчик уровня воды (глубины)
Основные характеристики
Наименование
Значение
Зона обнаружения, мм
16 ÷ 40
Напряжение питания, В
3,3 ÷ 5
Ток потребления, мА
20
Размеры, мм
62×20×8
Рабочая температура, °С
10 ÷ 30
Схема подключения
Рис. S6.2. Схема подключения датчика уровня жидкости
#define aPin A0 // пин для подключения аналогового выхода датчикаint avalue=0;//переменнаяint levels[3]={600,500,400};// значение уровнейvoid setup(){
pinMode(aPin, INPUT);// настройка аналогового пина на вход
Serial.begin(9600);// инициализация последовательного порта}void loop(){// получение значения с аналогового вывода датчика
avalue=analogRead(aPin);// вывод значения в монитор последовательного порта Arduino
Serial.print("avalue=");
Serial.print(avalue);if(avalue>=levels[0]) Serial.println("->MAX");if((avalue>levels[2])&&(avalue<levels[0])) Serial.println("->NORM");if(avalue<=levels[2]) Serial.println("->MIN");// пауза перед следующим получением значения 1000 мс
delay(1000);}
#define aPin A0 // пин для подключения аналогового выхода датчика
int avalue=0; //переменная
int levels[3]={600,500,400}; // значение уровней
void setup(){
pinMode(aPin, INPUT); // настройка аналогового пина на вход
Serial.begin(9600); // инициализация последовательного порта
}
void loop(){
// получение значения с аналогового вывода датчика
avalue=analogRead(aPin);
// вывод значения в монитор последовательного порта Arduino
Serial.print("avalue=");
Serial.print(avalue);
if (avalue>=levels[0]) Serial.println("->MAX");
if ((avalue>levels[2])&&(avalue<levels[0])) Serial.println("->NORM");
if (avalue<=levels[2]) Serial.println("->MIN");
// пауза перед следующим получением значения 1000 мс
delay(1000);
}
Результаты измерений
Значение аналоговых сигналов на аналоговом входе Arduino вы можете определить экспериментальным путем. Они могут оказаться такими, как показано на рис. S6.3.
Рис. S6.3. Экспериментальные значения аналоговых сигналов для разных уровней погружения
Датчик пламени позволяет фиксировать наличие инфракрасного излучения (открытого пламени) в диапазоне волн 760 ÷ 1100 нм в прямой видимости на расстоянии до 1 м (рис. S4.1).
Рис. S4.1. Принцип действия ИК-датчика пламени YG1006
Основные характеристики
Наименование
Значение
Дальность обнаружения пламени, см
20 ÷ 100
Угол обнаружения пламени, град
60
Длина волны, нм
760 ÷ 1100
Пиковая длина волны, нм
940
Напряжение питания, В
3 ÷ 5,5
Потребляемый ток не более, мА
15
Размеры (длина × ширина), мм
36×16
Схема подключения
При подключении датчика только к цифровому выходу (D0) фиксируется лишь факт наличия пламени. А при подключении к аналоговому выходу (A0) можно оценить и яркость пламени.
Датчик звука, как следует из названия, предназначен для обнаружения звука (фиксирует появление громкого звука). На рис. S8.1 показаны наиболее широко применяемые в проектах Arduino датчики звука.
Внешний вид, назначение контактов
Рис. S8.1. Применяемые в проектах Arduino датчики звука
Схема подключения
Работая с датчиком звука, можно использовать как цифровой, так и аналоговый его выходы (рис. S8.2). Аналоговый выход выдает значение сигнала микрофона, а цифровой выход передает 1, если сигнал превысит пороговое значение, и 0 в противном случае. Пороговое значение можно настроить с помощью потенциометра, расположенного на плате датчика. Можно подключить одновременно и два выхода (например, для настройки порогового значения).
Рис. S8.2. Схема подключения датчика звука
Программный код
Листинг S1.8. Измерение громкости с помощью датчика звука
#define soundAnalogPin A0 // пин, к которому аналоговый выход#define soundDigitalPin 4 // пин, к которому цифровой выходint analogVal=0;// Объявляем переменные для хранения значенийint digitalVal=0;//с датчика и задаем ее начальное значение 0void setup(){
Serial.begin(9600);// Открываем монитор порта
pinMode(soundAnalogPin, INPUT);//Настройка аналогового пина на вход
pinMode(soundDigitalPin, INPUT);// Настройка цифрового пина на вход}void loop(){//присваиваем переменной аналоговое значение
analogVal =analogRead(soundAnalogPin);//присваиваем переменной цифровое значение
digitalVal=digitalRead(soundDigitalPin);//Выводим полученныес датчика значения
Serial.print("Sound value A0: ");//
Serial.print(analogVal,DEC);
Serial.print(" D0: ");
Serial.println(digitalVal,DEC);
delay(100);//задаем паузу}
#define soundAnalogPin A0 // пин, к которому аналоговый выход
#define soundDigitalPin 4 // пин, к которому цифровой выход
int analogVal=0; // Объявляем переменные для хранения значений
int digitalVal=0; //с датчика и задаем ее начальное значение 0
void setup()
{
Serial.begin(9600); // Открываем монитор порта
pinMode(soundAnalogPin, INPUT);//Настройка аналогового пина на вход
pinMode(soundDigitalPin, INPUT);// Настройка цифрового пина на вход
}
void loop()
{
//присваиваем переменной аналоговое значение
analogVal =analogRead(soundAnalogPin);
//присваиваем переменной цифровое значение
digitalVal=digitalRead(soundDigitalPin);
//Выводим полученныес датчика значения
Serial.print("Sound value A0: "); //
Serial.print(analogVal,DEC);
Serial.print(" D0: ");
Serial.println(digitalVal,DEC);
delay(100); //задаем паузу
}
Результат
Рис. S8.3. Фиксация хлопка в ладоши на мониторе последовательного порта
Датчик газа MQ-135 предназначен для измерения наличия в окружающем воздухе вредных примесей газа. В качестве чувствительного элемента в датчике служит пластина диоксида олова (Sn02), который имеет низкую проводимость в чистом воздухе. Когда датчик оказывается в среде с парами токсичных газов, его проводимость возрастает. Датчик MQ-135 очень чувствителен к аммиаку, сульфидам, парам бензола и алкоголя, СО2 и идеально подходит для мониторинга дыма и других вредных примесей в воздухе. На рис. S7.1 показано изменение сопротивления датчика в зависимости от концентрации различных газов в окружающем воздухе в миллионных долях (от общего объема газа).
Внешний вид, назначение контактов
Рис. S7.1. Изменение сопротивления датчика в зависимости от концентрации различных газов в окружающем воздухе
Основные характеристики
Наименование
Значение
Напряжение питания, В
5
Потребляемый ток, мА
160
Рабочая температура, °С
10 ÷ 45
Относительная влажность, %
менее 95
Концентрация кислорода в воздухе (стандартная), %
21
Стандартная температура измерения, °С
20
Влажность, %
65
Диапазон измерений
аммиак: 10 ppm ÷ 300 ppm
бензин: 10 ppm ÷ 1000 ppm
этиловый спирт: 10 ppm ÷ 300 ppm
Схема подключения
Рис. S7.2. Подключение датчика газа
Программный код
Листинг S7.1. Измерение концентрации газов с помощью датчика MQ-135
#define MQPin A0 //пин, к которому подключен датчик газа#define ledPin 13 //пин встроенного светодиодаint sensorValue =0;//переменная для хранения значенийvoid setup(){
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
Serial.println("MQ135 Test");//Посылаем текст в монитор порта}void loop(){// Считываем значения с датчика
sensorValue = analogRead(MQPin);if(sensorValue >=400)// и, если превышен заданный порог,{
digitalWrite(ledPin, HIGH);// то включаем светодиод,}else// а если нет…{
digitalWrite(ledPin, LOW);// то выключаем}
Serial.print("MQ135 value= ");// Для отслеживания данных с датчиков// транслируем их в монитор порта
Serial.println(sensorValue);
delay(1000);}
#define MQPin A0 //пин, к которому подключен датчик газа
#define ledPin 13 //пин встроенного светодиода
int sensorValue = 0; //переменная для хранения значений
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
Serial.println("MQ135 Test" ); //Посылаем текст в монитор порта
}
void loop() {
// Считываем значения с датчика
sensorValue = analogRead(MQPin);
if (sensorValue >= 400)
// и, если превышен заданный порог,
{
digitalWrite(ledPin, HIGH); // то включаем светодиод,
}
else // а если нет…
{
digitalWrite(ledPin, LOW); // то выключаем
}
Serial.print("MQ135 value= " );
// Для отслеживания данных с датчиков
// транслируем их в монитор порта
Serial.println(sensorValue);
delay(1000);
}
Модуль датчика состоит из двух частей: контактного щупа и датчика YL-38 (рис. S5.1), в комплекте также идут провода для подключения. Между двумя электродами щупа создается небольшое напряжение. Если почва сухая, то сопротивление большое, а ток небольшой. Если земля увлажняется (например, поливом), то сопротивление уменьшается, а ток немного увеличивается (рис. S5.2).
Внешний вид, назначение контактов
Рис. S5.1. Датчик влажности почвы YL-38
Рис. S5.2. Принцип работы датчика влажности почвы
В качестве датчика влажности почвы можно использовать два оцинкованных гвоздя и проволоку, как показано на рис. S5.3. Когда почва увлажнится сопротивление между гвоздями уменьшится.
Рис. S5.3. Использование гвоздей в качестве датчика влажности почвы
Основные характеристики
Наименование
Значение
Рабочее напряжение, В
3 ÷ 5
Ток потребления, мА
15
Напряжение цифрового выхода, В
3 ÷ 5
Напряжение аналогового выхода, В
0 ÷ 5
Схема подключения
Рис. S5.4. Подключение датчика измерения влажности почвы
В процессе эксплуатации контактный щуп окисляется, и это происходит достаточно быстро. Чтобы окисление проходило медленнее, можно подключить питание датчика на цифровой вход Arduino и подавать напряжение только на время измерения (см. https://mxjournal.ru/blog/1319). В нашем примере контакт питания от модуля влажности (VCC) следует соединить на плате Arduino Uno не с пином 5V, а с цифровым пином — например, D8 (на рис. S5.4 показано пунктиром). В этом случае код может быть переписан следующим образом (листинг S5.2) — мы вводим переменную timing, в которой будет храниться количество миллисекунд. По умолчанию значение переменной равно 0. В основной части программы проверяем условие: если количество миллисекунд с запуска микроконтроллера минус число, записанное в переменную timing, больше, чем записано в переменную interval (в минутах), то выполняется функция get_sensor().
Листинг S5.2. Измерение влажности почвы с интервалом
Графопостроитель FlexiPlot находится в процессе разработки, но уже сейчас обладает большим количеством настроек и функций. Скачайте архив файлов программы по адресу https://github.com/xcoder123/FlexiPlot/releases. Программа не требует установки. Распакуйте архив в удобное место.
FlexiPlot позволяет открыть несколько рабочих окон графопостроителя (Chart), и в каждом окне можно независимо и одновременно строить до 256-ти графиков. Каждому окну присвоено уникальное имя (индекс окна). Этот индекс необходимо указать в пакете данных, чтобы программа поняла, в какое окно направить пакет.
FlexiPlot может рисовать не только обычные графики в ортогональной системе координат — предусмотрены функции рисования столбчатых диаграмм различного вида и свободный графопостроитель по заданным точкам.
Пакет данных для рисования графика заключен в фигурные скобки, данные разделяются символом вертикальной черты |. Формат пакета имеет следующий вид:
Colour_1 — цвет первой кривой графика в формате R,G,B (например, 255,0,0);
Value_1 — текущее значение для первой кривой графика;
Name_2 — подпись второй кривой в легенде графика;
Colour_2 — цвет второй кривой графика в формате R,G,B;
Value_2 — текущее значение для второй кривой графика,
и так далее — для каждой величины, которая должна быть прорисована в окне с соответствующим индексом.
Пакет должен завершаться символом перевода строки.
Такой объемный пакет данных позволяет очень гибко настраивать отображение графиков. Например, можно на ходу менять цвет линии графика в зависимости от величины отображаемого параметра. Но большая длина пакета вынуждает использовать высокую скорость передачи данных в порт (115200 бод) и выдерживать паузу не менее 5 мс между пакетами, чтобы избежать переполнения буфера порта и потерю данных.
Загрузите в плату Arduino демонстрационный скетч из листинга 5.3. Этот скетч отправляет текущее значение аргумента angle в окно P0, а значения тригонометрических функций sin() и cos() — в окно P1.
Листинг 5.3. Пример работы с графопостроителем FlexiPlot
#define DEG_TO_RAD 0.01745329void setup(){
Serial.begin(115200);}void loop(){for(float angle =0; angle <360; angle++){// Пакет данных для окна P0
Serial.print("{P0|Angle|0,0,255|");
Serial.print(angle);
Serial.println("}"); // Пакет данных для окна P1
Serial.print("{P1|Sin|255,0,0|");
Serial.print(sin(DEG_TO_RAD * angle)*10);
Serial.print("|Cos|0,255,0|");
Serial.print(cos(DEG_TO_RAD * angle));
Serial.println("}");}}
#define DEG_TO_RAD 0.01745329
void setup() {
Serial.begin(115200);
}
void loop() {
for (float angle = 0; angle < 360; angle++)
{
// Пакет данных для окна P0
Serial.print("{P0|Angle|0,0,255|");
Serial.print(angle);
Serial.println("}");
// Пакет данных для окна P1
Serial.print("{P1|Sin|255,0,0|");
Serial.print(sin(DEG_TO_RAD * angle)*10);
Serial.print("|Cos|0,255,0|");
Serial.print(cos(DEG_TO_RAD * angle));
Serial.println("}");
}
}
Запустите программу FlexiPlot. Настройте номер последовательного порта (опция Port) и установите скорость обмена 115200 бод (опция Baudrate).
Выберите пункт меню Graph | Add Line Chart или нажмите кнопку графического меню с изображением графика — на экране появится рабочее окно графопостроителя, которое надо настроить. Растяните это окно на всю ширину окна программы и на половину его высоты.
Перейдите на вкладку Settings и введите в поле Title название окна — например, Аргумент функций.
В поле Buffer введите значение 1000 — это размер буфера. С такой настройкой буфер будет хранить 1000 выборок. Вновь поступающие значения вытесняют устаревшие данные.
В поле Refresh Rate введите значение 10 — это интервал между обновлениями изображения в миллисекундах. Чем меньше его значение, тем плавнее движется график, но выше нагрузка на процессор компьютера.
Уберите флажок Auto Scaling Y (автомасштабирование по оси Y). В нашем случае мы заранее знаем, что отображаемое значение изменяется в диапазоне от 0 до 360, поэтому можем настроить масштаб вручную. Для этого в поле Min Y введите 0, а в поле Max Y — 400.
Добавьте еще одно рабочее окно и расположите его под предыдущим окном. Введите заголовок окна — например, Значения функций. Значения Buffer и RefreshRate скопируйте из настроек первого окна, чтобы графики прорисовывались синхронно.
Уберите флажок Auto Scaling Y. В поле Min Y введите -10, в поле Max Y — 10.
Для сохранения всех настроек и расположения рабочих окон нажмите кнопку с изображением дискеты или выберите пункт меню File | Save.
Вернитесь к вкладкам Chart. Выберите пункт меню Serial | Connect. Плата Arduino перезагрузится и начнется прорисовка графиков (рис. 5.3). Если этого не произошло, проверьте настройку номера и скорости порта, а также настройки рабочих окон.
Рис. 5.3. Рабочее окно программы FlexiPlot с демонстрационными графиками
При большой нагрузке на процессор компьютера может искажаться прорисовка графиков. В ответственных случаях лучше не запускать на компьютере одновременно с FlexiPlot какие-либо ресурсоемкие программы.
Дополнительные настройки рабочего окна графика
Вы можете также задать следующие дополнительные настройки:
Date Format — формат меток реального времени по оси X (часы:минуты:секунды). Можно оставить только нужную метку или полностью убрать метки времени;
Auto Filling — автоматическая заливка цветом областей под кривой графика;
Auto Fill Opacity — интенсивность цвета заливки. По умолчанию — 20%.
Встроенный терминал
В программе имеется встроенный терминал последовательного порта, доступный в меню Serial | Terminal. Это обычный терминал, который позволяет отправлять символы и шестнадцатеричные числа в плату Arduino и отображать поступающие данные. Опция Filter Plotting Packets отсекает пакеты данных и пропускает только символы, не входящие в пакеты. Эта опция позволяет отправлять в графопостроитель отладочные сообщения в интервале между пакетами данных.
Рисование столбчатых диаграмм
FlexiPlot может в режиме реального времени рисовать наглядные столбчатые диаграммы по данным, поступающим от платы контроллера Arduino. Каждый новый пакет полностью обновляет диаграмму.
Формат пакетов данных для диаграммы представлен в двух вариантах: с автоматическим выбором цвета столбцов и с явным указанием цвета.
Пример пакета данных с автоматическим выбором цвета имеет следующий вид:
Сначала, как обычно идет индекс (имя) рабочего окна. Далее через точку с запятой задаются имена групп столбцов. Их может быть сколь угодно много. В нашем примере это четыре группы: ночь, утро, день и вечер. Допустим, мы измеряем температуру внутри помещения (Inside) и снаружи (Outside) четыре раза в сутки (то есть получаем по четыре группы значений для каждого типа замеров). Соответственно, после названия величины типа замера в пакете следуют четыре значения, разделенные пробелами. Затем идет название следующей величины и ее значения. Этот шаблон повторяется нужное количество раз.
В строке пакета нельзя использовать кириллицу и специальные символы.
Воспользуемся встроенным инструментом отладки FlexiPlot — Packet Injector — который позволяет имитировать получение пакетов через последовательный порт. Благодаря этому инструменту мы можем экспериментировать с содержимым пакетов и вариантами прорисовки диаграммы без программирования контроллера Arduino.
Выберите пункт меню Graph | Add Bar Graph — чтобы открыть новое окно рисования столбчатых диаграмм.
Выберите пункт меню Tools | Debug Tools — чтобы запустить инструмент отладки. Введите в поле Packet пример пакета данных c автоматическим выбором цвета и нажмите клавишу <Enter>. В рабочем окне должна появиться диаграмма (рис. 5.4). Если ничего не произошло, проверьте правильность ввода пакета данных. Чтобы повторить отправку пакета, выделите нужную строку в поле History.
Перейдите на вкладку Settings в рабочем окне. В вашем распоряжении богатый выбор настроек внешнего вида диаграммы:
Name of X Axis и Name Of Y Axis — подписи осей координат. Можно использовать кириллицу;
Bar Chart Type — выбор типа диаграммы: обычная (Normal), с наложением столбцов (Stacked), с наложением в процентах (Percent), горизонтальная (Horizontal), горизонтальная с наложением (Horizontal Stacked), горизонтальная в процентах (Horizontal Percent);
Animation — анимация при прорисовке диаграммы: без анимации (No Animation), анимация осевой разметки (Grid/Axis Animation), анимация столбцов (Series Animation), анимация всех элементов (All Animations);
Theme — выбор темы оформления диаграммы;
Anti-Aliasing — сглаживание изображения;
Legend — настройка отображения, расположения и шрифта текста легенды диаграммы;
Labels — настройка отображения и расположения текстовых меток на диаграмме. По умолчанию числовое значение величины (@value) отображается в середине столбца;
Scaling — управление автоматическим масштабированием. Если диапазон значений известен заранее, можно задать минимальное и максимальное значение в полях Min и Max.
Рис. 5.4. Пример построения столбчатой диаграммы из четырех групп с автовыбором цвета
Попробуйте менять параметры настроек и наблюдайте за изменениями на вкладке Chart. Выберите вариант настройки, который вам больше нравится.
Цвет столбцов в формате R,G,B можно указать непосредственно в пакете. Для этого после названия величины надо вставить в пакет значение цвета:
В этом примере параметр Inside будет отображен красными столбцами, а параметр Outside — зелеными.
Динамические диаграммы
Программа FlexiPlot не очень хорошо справляется с прорисовкой быстро меняющихся диаграмм. Плавность прорисовки столбцов зависит от быстродействия и загруженности процессора компьютера. Тем не менее, мы можем успешно отображать плавно меняющиеся параметры, изменять цвет столбцов в зависимости от величины параметра, изменять подписи столбцов и групп. Для этого достаточно сформировать нужный пакет данных в скетче Arduino.
Загрузите в плату Arduino скетч примера из листинга 5.4.
Листинг 5.4. Пример отображения динамической диаграммы в FlexiPlot
int i, j;void setup(){
Serial.begin(115200);}void loop(){for(i =0; i <255; i = i +5){
j =255- i;
Serial.println((String)"{P0|S|d1|"+ i +",0,"+ j +"|"+ i +"|d2|0,255,0|"+ j +"}");
delay(100);}for(int i =255; i >0; i = i -5){
j =255- i;
Serial.println((String)"{P0|S|d1|"+ i +",0,"+ j +"|"+ i +"|d2|0,255,0|"+ j +"}");
delay(100);}}
int i, j;
void setup() {
Serial.begin(115200);
}
void loop() {
for (i = 0; i < 255; i = i + 5)
{
j = 255 - i;
Serial.println((String)"{P0|S|d1|" + i + ",0," + j +"|" + i + "|d2|0,255,0|" + j + "}");
delay(100);
}
for (int i = 255; i > 0; i = i - 5)
{
j = 255 - i;
Serial.println((String)"{P0|S|d1|" + i + ",0," + j +"|" + i + "|d2|0,255,0|" + j + "}");
delay(100);
}
}
В этом скетче мы рисуем диаграмму из двух столбцов, высота которых плавно изменяется в противоположных направлениях от 0 до 255 и обратно. При этом цвет первого столбца плавно меняется в зависимости от текущего значения параметра. Эффект достигается подстановкой переменных значений в компонент цвета в пакете данных.
В настройках графика отключите анимацию, отображение легенды и автомасштабирование. Задайте диапазон значений Min/Max от 0 до 300. Попробуйте менять тип диаграммы Bar Chart Type и выберите наиболее подходящий для ваших задач.
Программа Serial Port Plotter не требует установки. Исполняемый файл для операционных систем Windows и Linux можно скачать по адресу https://github.com/CieNTi/serial_port_plotter/releases. На момент подготовки книги была доступна версия 1.3.0 от 8 сентября 2018 г. Извлеките каталог с файлами из архива и сохраните в любом удобном месте. Автоматическая проверка обновлений в программе пока не предусмотрена, поэтому я рекомендую регулярно проверять наличие новых версий.
Формат пакета данных немного отличается от формата встроенного плоттера Arduino: пакет обязательно должен начинаться с символа $ и заканчиваться символом ;, значения внутри пакета разделяются пробелами, символ перевода строки не нужен.
Каждому значению соответствует свой канал данных, к которому привязан график. Причем новый канал может появиться в пакете данных в любой момент — программа это распознает и начнет рисовать еще один график. Программа не ограничивает количество каналов, но для окраски линий графика доступен только циклически повторяющийся набор из 14-ти цветов.
Загрузите в плату Arduino скетч из листинга 5.2 (это слегка доработанный скетч из листинга 5.1).
Листинг 5.2. Пример работы с графопостроителем Serial Port Plotter
Запустите программу. В меню PORT CONTROLS (слева от панели графопостроителя) выберите номер порта, к которому подключена плата и задайте скорость 115200. Нажмите кнопку с изображением треугольника ► в верхней строке меню, чтобы подключиться к порту и запустить отрисовку графика (рис. 5.2).
Рис. 5.2. Окно программы Serial Port Plotter (из-за ограничений типографской технологии рисунок дан в негативе)
Если линии графика не умещаются в панели, или, наоборот, график отображается слишком мелко, нажмите кнопку Autoscale Yaxis (автоматический масштаб по оси Y) — график будет автоматически отмасштабирован к размерам окна. Масштаб по оси X можно изменять вращением колесика мыши.
Если параметры сигнала известны заранее, или требуется ручная корректировка масштаба, воспользуйтесь панелью настройки PLOT CONTROLS.
Видимость линий графика можно выключать и включать двойным щелчком на имени канала в левой панели. Если вы забыли, какие каналы выключены, можно вернуть их все на экран нажатием кнопки Reset All Visible.
Под панелью графопостроителя расположено окно текстового терминала, в котором отображается поток входных данных. Терминал можно скрыть кнопкой Hide TextBox.
Легенда графика (подписи к линиям) расположена в правом верхнем углу. Подписи можно редактировать двойным щелчком на имени канала в легенде. Разрешено использовать символы кириллицы.
Все поступающие данные сохраняются в буфере до тех пор, пока хватает памяти компьютера. Благодаря этому? график можно «прокрутить» обратно, просто протаскивая мышью вправо. Это очень удобная опция для детального изучения графика в определенном интервале времени. Данные из буфера можно сохранить в CSV-файл, если нажать значок с изображением листа бумаги в верхнем меню.
Изображение графика можно сохранить в графическом файле формата PNG. Все файлы пока сохраняются непосредственно в главный каталог программы, диалогового окна сохранения файла не выводится. Возможно, это окно будет добавлено в новой версии программы.
Несмотря на широкое распространение облачных технологий и развитие систем обработки данных, в научных исследованиях и на производстве до сих пор часто применяется сбор, хранение и обмен данными в виде файлов Microsoft Excel. Если контроллер Arduino или другой прибор подключен к компьютеру через последовательный порт, можно без труда организовать автоматическое заполнение таблицы Excel, причем с поддержкой различных команд со стороны контроллера: заполнение ячеек, чтение ячеек, выбор рабочего листа таблицы, прокрутка листа и многое другое.
Компания Parallax Software разработала специальное расширение (plugin) PLX-DAQ для автоматического заполнения таблиц Excel данными, которые поступают от приборов через последовательный порт. Несколько лет назад официальная поддержка этого расширения была прекращена. Но энтузиасты платформы Arduino не просто продолжили его поддержку, а выпустили в 2016 году новую версию расширения, которая совместима с последними 64-битовыми версиями MS Office и Windows 10.
На официальном форуме Arduino создана специальная тема, посвященная этому расширению. Она расположена по адресу http://forum.arduino.cc/index.php?topic=437398.0. В первое сообщение темы разработчик регулярно добавляет ссылки на самую свежую версию расширения. На момент работы над книгой была доступна версия PLX-DAQ 2.11.
Расширение не требует установки и представляет собой файл Excel с присоединенным макросом на языке VBA (Visual Basic for Applications). Пользователь открывает файл, разрешает выполнение макросов и открывает последовательный порт, через который поступают данные из контроллера Arduino.
Строка сообщения Arduino содержит команды и данные. Макрос расширения считывает строку из последовательного порта, выполняет команды и сохраняет данные в ячейки таблицы. Макрос может отправить данные из таблицы Excel в Arduino в ответ на запрос контроллера.
Установка расширения на компьютер
Скачайте архив с самой новой версией расширения. Распакуйте его в удобное место. Архив состоит из следующих файлов:
PLX-DAQ-v2.11.xlsm — исходный шаблон файла Excel с макросом. Вы можете скопировать этот файл в другой каталог и переименовать или сохранить под другим именем;
PLX-DAQ-v2-DefaultSketch.ino — демонстрационный скетч Arduino, который содержит почти все возможные команды;
Beginners Guide to PLX DAQ v2 (rev1).doc — руководство пользователя;
PLX-DAQ-v2-AutoGrapher-RandomValue.ino — демонстрационный скетч с генератором случайных чисел и рисованием графика в реальном времени;
PLX-DAQ-v2-AutoGrapher-RandomValue.xlsm — файл Excel с примером данных для демонстрационного скетча.
Запуск расширения
Откройте файл шаблона. Для запуска расширения необходимо разрешить выполнение макросов (рис. 5.5). Нажмите кнопку Параметры и в открывшемся окне настроек выберите опцию Разрешить это содержимое. Если макрос не запустился автоматически, нажмите кнопку с надписью Open PLX DAQ UI в верхней части шаблона.
По соображениям безопасности не рекомендуется глобально разрешать выполнение произвольных макросов в общих настройках Excel. Лучше потратить несколько секунд на включение макросов по запросу.
Рис. 5.5. Запрос системы безопасности на разрешение запуска макросов
Рабочее окно и органы управления
После запуска макроса нажмите на кнопку Display direct debug, чтобы открыть поле, в которое выводятся поступающие данные и команды (рис. 5.6).
Рис. 5.6. Окно макроса PLX-DAQ
Port — номер порта, к которому подключен контроллер Arduino;
Baud — скорость соединения, бод;
Connect — установить соединение с портом;
Pause logging / Resume logging — приостановить запись данных;
Reset Timer — сбросить таймер макроса. Таймер используется для подстановки меток времени в таблицу и измерения продолжительности работы макроса Excel;
Clear Columns — удаляет все данные из столбцов таблицы. Заголовки столбцов сохраняются;
Display / Hide direct debug — показывает или прячет текстовое поле в правой части окна. В текстовом поле отображаются поступающие команды;
Sheet name to post to — отображает список доступных листов текущей книги Excel. Данные будут сохраняться в лист, который выбран в списке. В документе такой лист обозначен опцией ActiveSheet. После добавления, удаления или переименования листов обязательно нажмите кнопку Load для обновления списка;
Controller Messages — отображает последнее сообщение, поступившее от контроллера. Обычно сообщения меняются очень часто, поэтому их удобнее наблюдать в окне Direct Debug Window;
Reset on Connect — обычно при подключении к порту происходит автоматический сброс контроллера. Эта опция позволяет отключить автоматический сброс, если нельзя прерывать работу контроллера;
Custom Checkbox 1/2/3 — пользовательские опции для управления работой контроллера. Arduino может задать подписи к флажкам в окне макроса, читать состояние флажков и выполнять определенные действия в зависимости от их наличия;
Log incoming data? — запись входящего потока данных от контроллера в окно отладки. Уберите этот флажок, если возникают проблемы с быстродействием макроса;
Log outgoing data? — запись исходящего потока данных из макроса в контроллер. Уберите этот флажок, если возникают проблемы с быстродействием макроса;
Log system messages? — запись системной информации Excel (например, сообщений об ошибках). Уберите этот флажок, если возникают проблемы с быстродействием макроса;
Add timestamp? — добавление метки времени к каждой записи лога. Полезно для отладки;
кнопка => — увеличивает размер окна отладки;
кнопка <= — уменьшает размер окна отладки;
Clear — удаляет все записи в окне отладки.
Не перемещайте окно макроса во время записи данных. Это может привести к сбою работы Excel и потере данных.
Формат строки данных Arduino
Строка команд выводится в порт командой Serial.println(). Для правильного обмена данными между Arduino и макросом расширения строка должна иметь строго определенный формат. Вот пример стандартной строки:
DATA — самая главная и важная команда. Служит для передачи данных из Arduino в активный лист книги Excel. Вы можете передавать произвольные данные, но должны разделить данные запятыми и обеспечить совпадение количества столбцов данных и количества заголовков.
Зарезервированные слова DATE, TIME и TIMER распознаются макросом и заменяются на соответствующие значения: слово DATE — на текущую системную дату компьютера (например, 15.09.2018), слово TIME — на текущее системное время (например, 15:32:17), слово TIMER — на продолжительность текущего сеанса работы макроса в секундах (например, 1458).
В строку можно добавить ключевое слово AUTOSCROLL_XX. Распознав это слово, макрос автоматически прокручивает текущий лист так, чтобы в нижней части таблицы всегда были пустые строки. Число XX указывает, сколько строк с данными следуют выше последней строки с данными, — например, AUTOSCROLL_20.
Специальные команды и управление
CELL,SET — вводит произвольное значение в указанную ячейку таблицы. Можно работать как с активным листом (ActiveSheet), так и с любым другим листом.
Пример для активного листа: Serial.println(“CELL,SET,C9,myValue”);
Эта команда вводит значение myValue в ячейку С9 активного листа.
Эта команда вводит значение myValue в ячейку C9 листа с названием mySheet.
Внимание!При высоких скоростях обмена могут возникнуть проблемы с обработкой команды SET — макрос не будет успевать ее выполнить. В таком случае уменьшите скорость передачи данных или введите небольшую задержку перед командой. Обычно достаточно задержки в диапазоне 3–100 мс (например, delay(10)).
CELL,GET — извлекает данные из указанной ячейки и передает их в Arduino. Например, можно заранее сохранить в таблицу последовательность значений температуры и времени, а термостат на основе Arduino будет поочередно считывать значения и выдерживать указанную температуру в течение заданного промежутка времени. Аналогичным образом можно управлять различными технологическими процессами — от координатного станка до инкубатора.
Контроллер Arduino должен не только отправить команду запроса, но и прочитать строку ответа. Тип данных ответа может быть Integer (целое число) или String (строка). Вы должны быть уверены, что макрос отправит именно строку, если Arduino ждет строку, и целое число, если Arduino ждет число.Используйте для чтения ответа одну из следующих команд:
Serial.readStringUntil(10);
Serial.readStringUntil(10).toInt();
Serial.readStringUntil(10).toFloat();
Число 10 в коде ASCII означает конец строки, поэтому следует использовать только это число.
Пример кода Arduino:
int myData;
Serial.println(“CELL,GET,C9”); // команда чтения из ячейки C9
Пример чтения содержимого ячейки C9 из произвольного листа mySheet:
Serial.println(“CELL,GET,FROMSHEET,mySheet,C,9”);
Внимание!При высоких скоростях обмена могут возникнуть проблемы с обработкой команды GET — макрос не будет успевать ее выполнить. В таком случае уменьшите скорость передачи данных или введите небольшую задержку перед командой. Обычно достаточно задержки в диапазоне 3–100 мс (например, delay(10)).
ROW — вы можете явно задать значение указателя строки, с которой будете работать. Например, когда записаны 20 строк данных, вы можете сбросить указатель до значения 2 и начать сначала заполнение строк.
Примеры команд:
Serial.println(“ROW,SET,2”);
Serial.println(“ROW,GET”);
int myRow = Serial.readStringUntil(10).toInt();
CUSTOMBOX1 / CUSTOMBOX2 / CUSTOMBOX3 — вы можете задать подпись к опции, снять или установить флажок и прочитать состояние опции (булево значение false / true).
RESETTIMER — сбрасывает счетчик продолжительности работы расширения.
Пример: Serial.println(“RESETTIMER”);
Рабочая книга Excel
PAUSELOGGING / RESUMELOGGING / STOPLOGGING — пауза записи данных / возобновление записи / прекращение записи. Разумеется, расширение продолжит «слушать» и выполнять поступающие команды, даже если запись данных в ячейки приостановлена или прекращена.
Пример: Serial.println(“PAUSELOGGING”);
SAVEWORKBOOK — сохраняет рабочую книгу Excel под текущим именем. Команда полезна, если вы записываете данные в течение длительного времени и хотите периодически сохранять файл с данными.
SAVEWORKBOOKAS — сохраняет рабочую книгу Excel под заданным именем. По умолчанию новый файл сохраняется в тот же каталог, где находился исходный файл, но вы можете задать новый каталог в строке имени файла.
FORCEEXCELQUIT — опасная команда! Немедленно прекращает работу Excel! Обязательно сохраните рабочую книгу перед отправкой этой команды.
Пример: Serial.println(“FORCEEXCELQUIT”);
Прочие команды
BEEP — всего лишь заставляет компьютер издать короткий звуковой сигнал встроенным звукоизлучателем материнской платы или корпуса. Полезно, если надо привлечь внимание пользователя, когда достигнуто определенное значение величины, которую вы измеряете.
Пример: Serial.println(“BEEP”);
MSG — помещает заданный текст в метку сообщения Controller Message в окне расширения.
Пример: Serial.println(“MSG,Put your text here”);
DONE — принудительно передает содержимое буфера последовательного порта со стороны Excel.
GETRANDOM — передает случайное число из Excel в Arduino. Это полезная команда, потому что Arduino не может самостоятельно генерировать случайные числа. Функции random() в Arduino требуется инициализация генератора случайных чисел начальным значением при помощи функции randomSeed(value). Если начальное значение будет повторяться, то и вся последовательность полученных псевдослучайных чисел тоже будет повторяться. Обычно генератор случайных чисел Arduino инициализируют случайным значением, прочитанным с «висящего в воздухе» аналогового входа. Но если все входы заняты, начальное значение можно получить из Excel.
Демонстрационный скетч, приведенный в листинге 5.5, основан на коде скетча из комплекта поставки расширения PLX-DAQ v.2.11. Скетч содержит почти все доступные команды для работы с таблицей Excel.
Загрузите скетч в плату Arduino. Откройте исходный шаблон файла Excel из комплекта поставки расширения. В поле Port введите номер последовательного порта, к которому подключена плата. Остальные настройки не меняйте. Нажмите кнопку Display direct debug в окне расширения. Затем нажмите кнопку Connect. Если все работает правильно, контроллер перезагрузится, и в окне отладки побегут строки команд и служебных сообщений, а таблица будет заполняться значениями.
Обратите внимание, что изменились подписи к флажкам. Поставьте флажок Quit at 450. Как только значение счетчика скетча достигнет 450 (или уже превысило 450 на момент установки флажка) Excel сохранит файл под новым именем и прекратит работу.
Откройте сохраненный файл и посмотрите содержимое листов. Во втором листе с именем Further list должна быть заполнена ячейка G11.
int i =0;void setup(){// последовательный порт на скорости 9600
Serial.begin(9600);//Serial.println("CLEARDATA"); // очистка листа со строки 2
Serial.println("CLEARSHEET");// очистка листа со строки 1// определяем пять столбцов с именами "Date", "Time", "Timer", "Counter" и "millis"
Serial.println("LABEL,Date,Time,Timer,Counter,millis");// задаем подписи к трем флажкам (только латинские символы)
Serial.println("CUSTOMBOX1,LABEL,Stop logging at 250?");
Serial.println("CUSTOMBOX2,LABEL,Resume log at 350?");
Serial.println("CUSTOMBOX3,LABEL,Quit at 450?");// ставим флажки в первое и второе поля
Serial.println("CUSTOMBOX1,SET,1");
Serial.println("CUSTOMBOX2,SET,1");
Serial.println("CUSTOMBOX3,SET,0");}void loop(){// выводим в таблицу данные и команду прокрутки
Serial.println((String)"DATA,DATE,TIME,TIMER,"+ i+++","+ millis()+",AUTOSCROLL_20");// альтернативный способ вывода строки по частям/* Serial.print("DATA,DATE,TIME,TIMER,");
Serial.print(i++);
Serial.print(",");
Serial.println(millis());
Serial.print(",");
Serial.println("SCROLLDATA_20"); */// стираем некоторые ячейки (прямоугольник от B10 до D20)if(i ==100)
Serial.println("ClearRange,B,10,D,20");// звуковой сигнал, если i==150if(i ==150)
Serial.println("BEEP");// читаем целое число из ячейки E4// в листе с заданным именем если i==200if(i ==200){// запрашиваем данные из листа
Serial.println("CELL,GET,FROMSHEET,Further sheet,E,4");// короткий вариант для чтения из текущего листа// Serial.println("CELL,GET,E4");// получаем ответ Excelint readvalue = Serial.readStringUntil(10).toInt();// Выводим значение в окно отладки
Serial.println((String)"Value of cell E4 is: "+ readvalue);}// проверяем значение CUSTOMBOX1// если флажок установлен, приостанавливаем записьif(i ==250){
Serial.println("CUSTOMBOX1,GET");int stoplogging = Serial.readStringUntil(10).toInt();// выводим сообщение в окно отладки
Serial.println((String)"Value of stoplogging/checkbox is: "+ stoplogging);if(stoplogging)
Serial.println("PAUSELOGGING");}// запрашиваем случайное число из компьютера если i==300if(i ==300){
Serial.println("GETRANDOM,-4321,12345");// случайное число от -4321 до 12345int rndseed = Serial.readStringUntil(10).toInt();// выводим сообщение в окно отладки
Serial.println((String)"Got random value '"+ rndseed +"' from Excel");}// теперь возвобновляем запись если i==350 и стоит флажок CUSTOMBOX2if(i ==350){
Serial.println("CUSTOMBOX2,GET");int resumelogging = Serial.readStringUntil(10).toInt();if(resumelogging)
Serial.println("RESUMELOGGING");}// запись в заданную ячейку G10 текущего листа// и ячейку G11 произвольного листаif(i ==400){// активный лист по умолчанию
Serial.println("CELL,SET,G10,400 test 1 string");// лист с именем "Further sheet"
Serial.println("CELL,SET,ONSHEET,Further sheet,G,11,400 test 2");}// если i>=450 и установлен флажок CUSTOMBOX3// сохраняем файл под другим именем и закрываем Excelif(i >=450){
Serial.println("CUSTOMBOX3,GET");if(Serial.readStringUntil(10).toInt()){
Serial.println("SAVEWORKBOOKAS,450-Lines-File");
Serial.println("FORCEEXCELQUIT");}else
Serial.println("No forced Excel quit requested!");}}
int i = 0;
void setup() {
// последовательный порт на скорости 9600
Serial.begin(9600);
//Serial.println("CLEARDATA"); // очистка листа со строки 2
Serial.println("CLEARSHEET"); // очистка листа со строки 1
// определяем пять столбцов с именами "Date", "Time", "Timer", "Counter" и "millis"
Serial.println("LABEL,Date,Time,Timer,Counter,millis");
// задаем подписи к трем флажкам (только латинские символы)
Serial.println("CUSTOMBOX1,LABEL,Stop logging at 250?");
Serial.println("CUSTOMBOX2,LABEL,Resume log at 350?");
Serial.println("CUSTOMBOX3,LABEL,Quit at 450?");
// ставим флажки в первое и второе поля
Serial.println("CUSTOMBOX1,SET,1");
Serial.println("CUSTOMBOX2,SET,1");
Serial.println("CUSTOMBOX3,SET,0");
}
void loop() {
// выводим в таблицу данные и команду прокрутки
Serial.println( (String) "DATA,DATE,TIME,TIMER," + i++ + "," + millis() + ",AUTOSCROLL_20" );
// альтернативный способ вывода строки по частям
/* Serial.print("DATA,DATE,TIME,TIMER,");
Serial.print(i++);
Serial.print(",");
Serial.println(millis());
Serial.print(",");
Serial.println("SCROLLDATA_20"); */
// стираем некоторые ячейки (прямоугольник от B10 до D20)
if (i == 100)
Serial.println("ClearRange,B,10,D,20");
// звуковой сигнал, если i==150
if (i == 150)
Serial.println("BEEP");
// читаем целое число из ячейки E4
// в листе с заданным именем если i==200
if (i == 200)
{
// запрашиваем данные из листа
Serial.println("CELL,GET,FROMSHEET,Further sheet,E,4");
// короткий вариант для чтения из текущего листа
// Serial.println("CELL,GET,E4");
// получаем ответ Excel
int readvalue = Serial.readStringUntil(10).toInt();
// Выводим значение в окно отладки
Serial.println( (String) "Value of cell E4 is: " + readvalue);
}
// проверяем значение CUSTOMBOX1
// если флажок установлен, приостанавливаем запись
if (i == 250)
{
Serial.println("CUSTOMBOX1,GET");
int stoplogging = Serial.readStringUntil(10).toInt();
// выводим сообщение в окно отладки
Serial.println( (String) "Value of stoplogging/checkbox is: " + stoplogging);
if (stoplogging)
Serial.println("PAUSELOGGING");
}
// запрашиваем случайное число из компьютера если i==300
if (i == 300)
{
Serial.println("GETRANDOM,-4321,12345");
// случайное число от -4321 до 12345
int rndseed = Serial.readStringUntil(10).toInt();
// выводим сообщение в окно отладки
Serial.println( (String) "Got random value '" + rndseed + "' from Excel" );
}
// теперь возвобновляем запись если i==350 и стоит флажок CUSTOMBOX2
if (i == 350)
{
Serial.println("CUSTOMBOX2,GET");
int resumelogging = Serial.readStringUntil(10).toInt();
if (resumelogging)
Serial.println("RESUMELOGGING");
}
// запись в заданную ячейку G10 текущего листа
// и ячейку G11 произвольного листа
if (i == 400)
{
// активный лист по умолчанию
Serial.println("CELL,SET,G10,400 test 1 string");
// лист с именем "Further sheet"
Serial.println("CELL,SET,ONSHEET,Further sheet,G,11,400 test 2");
}
// если i>=450 и установлен флажок CUSTOMBOX3
// сохраняем файл под другим именем и закрываем Excel
if (i >= 450)
{
Serial.println("CUSTOMBOX3,GET");
if (Serial.readStringUntil(10).toInt()) {
Serial.println("SAVEWORKBOOKAS,450-Lines-File");
Serial.println("FORCEEXCELQUIT");
}
else
Serial.println("No forced Excel quit requested!");
}
}
Представляем третье издание книги Михаила Момота “Мобильные роботы на базе Arduino”.
Руководство для начинающих конструкторов написано в форме практических проектов по построению мобильных роботов. Для их реализации выбрана популярная платформа Arduino и четырехколесная конструкция. Рассказано, как управлять моторами, осуществлять сборку механики и электроники, программировать основные функции и управлять роботом. Роботы смогут обходить препятствия, выбираться из запутанных лабиринтов,
В 3-м издании добавлены проекты по передаче изображения с камеры, удержанию направление движения по гироприборам, модель двухколесного балансирующего робота на моторах с энкодерами. Все сложные алгоритмы вынесены в отдельную библиотеку.
Электронный архив на сайте издательства содержит детали робота для печати на 3d-принтере, векторные рисунки для резки лазером, листинги, дополнительные библиотеки и программы.
Для читателей, интересующихся электроникой и робототехникой
Эта книга написана для начинающих Конструкторов, людей, которым нравится конструировать мобильных роботов на популярной платформе Arduino .
В новом издании сделан упор на практическую реализацию описанных конструкций, а также на расширение функциональных возможностей роботов с помощью современных датчиков (гироприбора, видеокамеры, энкодеров и др.) и продвинутого программирования. Но в книге нет пространных листингов: большинство сложных участков программного кода перенесено в библиотеку, которая предлагается с книгой. Потому процесс конструирования остается по-прежнему доступным и увлекательным.
Глава 1. Основные составные части робота………………………………………. 13
Информационно-измерительная система………………………………………………………. 13
Датчик касания…………………………………………………………………………………….. 14
Датчик температуры……………………………………………………………………………… 14
Датчик освещенности……………………………………………………………………………. 15
Датчик препятствия………………………………………………………………………………. 15
Ультразвуковой датчик расстояния………………………………………………………… 16
Оптический рефлекторный датчик расстояния………………………………………….. 16
Детектор шума…………………………………………………………………………………….. 17
Энкодер……………………………………………………………………………………………… 17
Датчик движения………………………………………………………………………………….. 18
Датчик газа………………………………………………………………………………………….. 18
Датчик влажности………………………………………………………………………………… 18
Видеокамера……………………………………………………………………………………….. 19
Система принятия решений………………………………………………………………………….. 20
Контроллер Arduino……………………………………………………………………………… 20
Система связи…………………………………………………………………………………………… 22
Инфракрасный приемник……………………………………………………………………….. 22
Канал Bluetooth……………………………………………………………………………………. 23
Канал Wi-Fi………………………………………………………………………………………….. 23
Устройства отображения информации (дисплеи)………………………………………. 24
Исполнительная система…………………………………………………………………………….. 24
Электрический двигатель постоянного тока……………………………………………… 25
Сервомотор………………………………………………………………………………………… 26
Шаговый двигатель………………………………………………………………………………. 26
Система энергоснабжения…………………………………………………………………………… 27
Механика робота……………………………………………………………………………………….. 27
Элементы электрической схемы…………………………………………………………………… 27
Резистор…………………………………………………………………………………………….. 27
Светодиод………………………………………………………………………………………….. 28
Выключатель………………………………………………………………………………………. 28
Сервисные платы……………………………………………………………………………………….. 28
Arduino Sensor Shield v5.0……………………………………………………………………… 28
Макетная плата……………………………………………………………………………………. 29
Выводы……………………………………………………………………………………………………. 30
Глава 2. Провода и их соединения………………………………………………………. 31
Виды проводов…………………………………………………………………………………………. 31
Одножильные………………………………………………………………………………………. 31
Многожильные…………………………………………………………………………………….. 31
Тип изоляции……………………………………………………………………………………….. 32
Способы соединений проводов……………………………………………………………………. 32
Скрутка………………………………………………………………………………………………. 32
Разъемные соединения…………………………………………………………………………. 33
Пайка и ее основы………………………………………………………………………………… 35
Оборудование и материалы……………………………………………………………. 35
Этапы пайки………………………………………………………………………………….. 36
Выбор паяльника………………………………………………………………………….. 37
Уход за паяльником………………………………………………………………………. 38
Припои………………………………………………………………………………………… 38
Флюсы…………………………………………………………………………………………. 39
Выводы……………………………………………………………………………………………………. 39
Глава 3. Электропитание……………………………………………………………………… 40
Закон Ома………………………………………………………………………………………………… 40
Электрическая мощность……………………………………………………………………………. 40
Характеристики элементов питания………………………………………………………………. 40
Номинальное напряжение……………………………………………………………………… 40
Номинальный ток…………………………………………………………………………………. 41
Внутреннее сопротивление источника питания…………………………………………. 41
Емкость батареи или аккумулятора………………………………………………………… 41
Форм-фактор………………………………………………………………………………………. 41
Типы элементов электрического питания……………………………………………………….. 41
Солевые батареи…………………………………………………………………………………. 42
Алкалиновые батареи…………………………………………………………………………… 42
Никель-металлогидридные аккумуляторы………………………………………………… 42
Литий-ионные и литий-полимерные аккумуляторы…………………………………….. 42
Стабилизация электропитания……………………………………………………………………… 43
Стабилизация напряжения……………………………………………………………………… 44
Стабилизация электрического тока…………………………………………………………. 46
Измерение электрического тока, напряжения и сопротивления…………………………. 46
Защита от короткого замыкания по питанию………………………………………………….. 48
Защита от неверной установки элементов питания (переполюсовки)…………………. 50
Зарядка аккумуляторов на примере Li-ion и Li-pol…………………………………………… 51
Выводы……………………………………………………………………………………………………. 52
Глава 4. Основы программирования Arduino…………………………………….. 53
Компьютерная программа…………………………………………………………………………… 53
Алгоритм………………………………………………………………………………………………….. 54
Среда разработки Arduino IDE…………………………………………………………………….. 55
Установка Arduino IDE…………………………………………………………………………… 55
Начало работы с Arduino IDE…………………………………………………………………. 56
Подключение контроллера Arduino к ПК………………………………………………….. 56
Мигаем светодиодом………………………………………………………………………………….. 60
Мониторинг работы программы…………………………………………………………………… 61
Переменные………………………………………………………………………………………………. 62
Условные операторы………………………………………………………………………………….. 64
Оператор if … else……………………………………………………………………………….. 64
Оператор switch … case………………………………………………………………………… 67
Операторы циклов while и for……………………………………………………………………….. 68
Функции……………………………………………………………………………………………………. 70
Элементы объектно-ориентированного программирования……………………………… 71
Разделение программы (внутренние библиотеки)……………………………………………. 72
Выводы……………………………………………………………………………………………………. 73
Глава 5. Ходовая часть………………………………………………………………………… 74
Типы ходовых частей………………………………………………………………………………….. 74
Гусеницы…………………………………………………………………………………………….. 74
Колеса с дифференциалом…………………………………………………………………… 75
Колеса на моторах………………………………………………………………………………. 75
Летающие роботы………………………………………………………………………………… 76
Выбор двигателей……………………………………………………………………………………… 76
Драйверы двигателей…………………………………………………………………………………. 78
Сборка макета…………………………………………………………………………………………… 80
Управляем двигателем без Arduino…………………………………………………………. 80
Широтно-импульсная модуляция……………………………………………………………. 82
Подключаем контроллер Arduino……………………………………………………………. 83
Подключаем библиотеку mobrob3.zip и пишем тестовую программу…………….. 86
Добавляем регулирование на основе ШИМ……………………………………………… 87
Тестовая программа управления двигателями
с регуляцией на основе ШИМ…………………………………………………………………. 87
Выводы……………………………………………………………………………………………………. 89
Глава 6. Сборка базовой модели…………………………………………………………. 90
Минимальный комплект………………………………………………………………………………. 90
Двигатели…………………………………………………………………………………………………. 92
Система электропитания…………………………………………………………………………….. 93
Подбираем компоненты………………………………………………………………………………. 96
Схемы………………………………………………………………………………………………………. 98
Проверка правильности подключения платы драйвера и двигателей……………….. 102
Пример использования платы Arduino Sensor Shield……………………………………… 103
Установка устройств обратной связи………………………………………………………….. 104
Укладка проводов……………………………………………………………………………………. 107
Выводы…………………………………………………………………………………………………… 107
Глава 7. Схема управления движением…………………………………………….. 108
Переменные и функции управления моторами………………………………………………. 108
Подключение управления моторами……………………………………………………… 108
Управление мощностью………………………………………………………………………. 108
Движение в нужном направлении………………………………………………………….. 109
Первая поездка………………………………………………………………………………………… 109
Алгоритм…………………………………………………………………………………………… 109
Программа………………………………………………………………………………………… 110
Сигнал светодиодом…………………………………………………………………………………. 111
Выводы…………………………………………………………………………………………………… 112
Глава 8. Дистанционное управление роботом………………………………….. 113
Способы дистанционного управления…………………………………………………………. 113
Управление роботом по каналу инфракрасной связи…………………………………….. 114
Схема подключения……………………………………………………………………………. 114
Рекомендации по установке…………………………………………………………………. 116
Установка библиотеки IRremote…………………………………………………………….. 117
Получение кодов кнопок для используемого пульта……………………………….. 117
Программа………………………………………………………………………………………… 120
Управление роботом по каналу Bluetooth…………………………………………………….. 123
Подбор элементной базы…………………………………………………………………….. 124
Подключение к Arduino………………………………………………………………………… 125
Смена имени контроллера Bluetooth и робота………………………………………… 126
Настройка смартфона…………………………………………………………………………. 127
Устранение радиопомех………………………………………………………………………. 129
Программа………………………………………………………………………………………… 129
Управляем роботом по Wi-Fi (ESP-01)…………………………………………………………. 133
Выводы…………………………………………………………………………………………………… 138
Глава 9. Робот, держащий направление по электронному гироскопу-акселерометру……………………………………… 139
Гироскоп…………………………………………………………………………………………………. 139
Акселерометр………………………………………………………………………………………….. 141
Электронный гироскоп………………………………………………………………………………. 142
Подключение гироскопа-акселерометра MPU-6050……………………………………….. 143
Получение данных с MPU-6050…………………………………………………………………… 145
Шкала значений MPU-6050…………………………………………………………………………. 148
Модернизация робота………………………………………………………………………………. 148
Монтаж устройства…………………………………………………………………………….. 148
Программирование…………………………………………………………………………….. 148
Основные функции для получения углов…………………………………………. 148
Стабилизация поворотов: ПИД-регулятор……………………………………….. 150
Добавляем функцию движения………………………………………………………. 153
Выводы…………………………………………………………………………………………………… 157
Глава 10. Движение по черной линии………………………………………………… 158
Обнаружение черной линии……………………………………………………………………….. 159
Фотодиод………………………………………………………………………………………….. 159
Фоторезистор……………………………………………………………………………………. 160
Фототранзистор…………………………………………………………………………………. 161
Инфракрасный датчик отражения TCRT 5000…………………………………………… 161
Подготовка робота: установка датчиков……………………………………………………… 163
Упрощенная программа движения………………………………………………………………. 166
Используем аналоговые данные «на всю катушку»………………………………………… 169
Выводы…………………………………………………………………………………………………… 173
Глава 11. Измерение расстояния и поворотная голова……………………. 174
Измеряем расстояние……………………………………………………………………………….. 174
Инфракрасный датчик расстояния GP2Y0A021YK0F………………………………………. 175
Лазерный датчик расстояния VL53L1X…………………………………………………………. 176
Ультразвуковые дальномеры HC-SR04 и US-026/25……………………………………….. 177
Поиск препятствия……………………………………………………………………………………. 179
Поворотная голова…………………………………………………………………………………… 184
Схемы подключения……………………………………………………………………………. 185
Управление сервомашинкой…………………………………………………………………. 187
Монтаж головы………………………………………………………………………………….. 189
Тестовая программа «Ведение цели»…………………………………………………….. 190
Если что-то пошло не так………………………………………………………………………….. 191
Выводы…………………………………………………………………………………………………… 192
Глава 12. Ходовые испытания: обход препятствий…………………………. 193
Программа проверки и настройки основных функций робота…………………………. 193
Выводы…………………………………………………………………………………………………… 200
Глава 13. Робот, находящий выход из лабиринта…………………………….. 201
Способ обхода лабиринта…………………………………………………………………………. 202
Обход лабиринта без модернизации робота………………………………………………… 203
Программа………………………………………………………………………………………… 207
Выводы…………………………………………………………………………………………………… 213
Глава 14. Робот с видеокамерой………………………………………………………… 214
Аналоговое видео с робота………………………………………………………………………. 214
Цифровое видео для робота: ESP32-CAM…………………………………………………… 216
Робот с камерой ESP32-CAM…………………………………………………………………….. 218
Добавление контроллеров ESP в среду ArduinoIDE………………………………… 219
Прошивка ESP32-CAM…………………………………………………………………………. 221
Настройка программного обеспечения робота……………………………………………… 222
Сборка электроники…………………………………………………………………………………. 224
Сборка механики……………………………………………………………………………………… 224
Выводы…………………………………………………………………………………………………… 226
Глава 15. Робот и пройденное расстояние………………………………………… 227
Моторы с инкрементальным энкодером………………………………………………………. 227
Как работает инкрементальный энкодер?………………………………………………. 228
Получение информации о вращении с инкрементальных энкодеров…………… 229
Следим за энкодерами в приложении……………………………………………………. 236
Выводы…………………………………………………………………………………………………… 243
Глава 16. Балансирующий робот……………………………………………………….. 244
Теория……………………………………………………………………………………………………. 244
Как найти угол наклона робота?…………………………………………………………… 246
Регулятор балансировки робота………………………………………………………….. 247
Программирование…………………………………………………………………………………… 248
Порядок подбора коэффициентов пропорциональности регулятора…………. 254
Выводы…………………………………………………………………………………………………… 260
Приложение. Описание электронного архива…………………………………… 261
Предметный указатель………………………………………………………………………. 265
Момот Михаил Викторович, сотрудник Томского политехнического университета, основатель и директор фирмы «Юрга-Технологии-Инновации», занимающейся разработкой роботов. Увлекается робототехникой, поклонник и пропагандист проекта Arduino с 2014 года. Основатель неформального клуба робототехников «Лига роботов ЮТИ ТПУ», объединяющего школьников студентов, преподавателей и энтузиастов. Автор популярных книг “Мобильные роботы на базе Arduino“, “Мобильные роботы на базе ESP32 в среде Arduino IDE“.