Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Разработка киберфизических систем на основе микроконтроллеров. Учебное пособие
.pdf
Лекция 4. Пример разработки киберфизической системы на основе микроконтроллера
81
1.2. Датчик напряжения для Arduino
1.2.1. Общие сведения
Для Arduino максимальный порог входного напряжения 5 вольт. Мо-
дуль датчика напряжения позволяет без пайки измерять большее напряжения, преобразовывая его в пониженное.
1.2.2. Сравнительный анализ датчиков напряжения
Исходя из того, что солнечная панель вырабатывает постоянный ток,
для проекта был выбран датчик напряжения на основе делителя. Сравнительный анализ датчиков напряжения представлен в табл. 9.
Таблица 9
Сравнение датчиков напряжения
Название
Характеристики
Цена, руб
Датчик напряжения
на основе делителя
Понижает входное постоянное напряжение в 4 раза,
порог 25 В
50
ZMPT101B
Преобразовывает переменное напряжение в постоянное и пониженное.
Порог входного напряжения 1 000 В. Для калибровки используется подстроечный резистор, установленный в модуле
150
Данный датчик изображен на рис. 21.
Рис. 21. Датчик напряжения на основе делителя напряжения

2. Проектирование киберфизических систем
82
На модуле реализован резистивный делитель напряжения с коэффици-
ентом 1:5, т.е. на входе модуля напряжение может изменяться от 0 до 25 В,
а на выходе оно будет пропорционально распределено от 0 до 5 В. Но при
этом немного снижается точность, ведь теперь по шкале значений 0–1024
единица результата считывания АЦП будет равна 0, 02 В.
1.2.3. Программа
Код программы для считывания сигнала с датчика напряжения
#define analog_pin A0 // Вывод, к которому подключен датчик
float adc_voltage = 0.0;
float in_voltage = 0.0;
float R1 = 30 000.0; // Номинал резистора R1
float R2 = 7 500.0; // Номинал резистора R2
float ref_voltage = 5.0; // Опорное напряжение
int adc_value = 0; // Переменная для хранения показаний
void setup()
{
Serial.begin (9 600); // Открытие последовательного порта на
скорости 9 600
Serial.println ("DC Voltage Test"); // Отправка текста
}
void loop()
{
adc_value = analogRead (analog_pin); // Считывание показа-
ния с аналогового ввода
adc_voltage = (adc_value * ref_voltage) / 1024,0; // Определение
напряжения на входе АЦП
in_voltage = adc_voltage / (R2/(R1+R2)) ; // Расчет напряжения
Serial.print ("Input Voltage = "); // Отправка текста
Serial.println (in_voltage, 2); // Отправка показаний
delay (500); // Пауза 0,5 секунды.
}
1.3. Сервопривод
1.3.1. Общие сведения
Сервопривод – это устройство, состоящее из электромотора, редуктора
и системы управления с обратной связью по углу поворота. Сервоприводы
имеют несколько составных частей. Привод – электромотор с редуктором.

Лекция 4. Пример разработки киберфизической системы на основе микроконтроллера
83
Так как скорость вращения мотора бывает слишком большой для практического использования, то для понижения скорости используется редуктор:
механизм из шестерней, передающий и преобразующий крутящий момент.
Включая и выключая электромотор, можно вращать выходной вал –
конечную шестерню сервопривода, к которой можно прикрепить рабочий
орган. Для контроля положения используется датчик обратной связи – потенциометр, который будет преобразовывать угол поворота обратно в электрический сигнал. При повороте бегунка потенциометра происходит изменение его сопротивления, пропорциональное углу поворота. Таким образом, с его помощью можно установить текущее положение механизма.
1.3.2. Сравнительный анализ сервоприводов
Сравнительный анализ сервоприводов по крутящему моменту и цене
представлен на табл. 10.
Таблица 10
Сравнение сервоприводов
Название
Крутящий момент, кг/см
Цена, руб
SG90
1,4
100
MG90S 2 200
MG996R
20
250
INJORA INJS035
35
1500
GXservo WY3240MG
40
1800
Так как солнечная панель обладает массой 10 кг, был выбран серво-
привод GXservo WY3240MG как самый оптимальный по крутящему моменту. Внешний вид сервопривода представлен на рис. 22.
Рис.22. Сервопривод GXservo WY3240MG

2. Проектирование киберфизических систем
84
1.3.3. Программа
Код программы для управления сервоприводом при помощи потен-
циометра.
#include <Servo.h> // подключение библиотеки для работы с сервоприводом
Servo servo1; // объявление переменной servo1 типа "servo"
void setup() {
servo1.attach(11); // привязка сервопривода к аналоговому выходу 11
}
void loop() {
servo1.write (0); //угол поворота 0
delay (2 000); // остановка на 2 секунды
servo1.write(90); //угол поворота 90
delay (2 000); // остановка на 2 секунды
servo1.write (180); // угол поворота180
delay (2 000); // остановка на 2 секунды
}
1.4. Трехцветная светодиодная лента
1.4.1. Общие сведения
Светодиодная лента – это набор связанных светодиодов, на которые
может одновременно подаваться напряжение питания. В адресной светодиодной ленте каждый диод может управляться отдельно и независимо от
других. Таким образом, адресные ленты можно использовать для более интеллектуального управления световым потоком на отдельных участках
ленты, включая или выключая подсветку в нужное время и в нужном месте.
Благодаря конструкции есть возможность управления цветом каждого
светодиода, что позволяет создавать оригинальные световые эффекты.
Главное отличие адресной светодиодной ленты от обычной RGB-ленты –
это наличие специальных контроллеров (конструктивно выполненных в
виде микросхем) возле каждого светодиода либо внутри, что и дает возможность индивидуальной адресации и регулирования каждого оттенка.
1.4.2. Сравнительный анализ трехцветных светодиодных лент
Сравнительный анализ светодиодных лент представлен на табл. 11.

Лекция 4. Пример разработки киберфизической системы на основе микроконтроллера
85
Таблица 11
Сравнение трехцветных светодиодных лент
Название
Характеристики
Цена, руб
WS2812B
Напряжение питания 5 В.
Адресная лента
250
WS2813
Аналогичен WS2812 B, но имеет дублирующую
адресную шину
500
Модуль WS2812
Аналогичен WS2812 B, исполнен в виде модуля
с восемью светодиодами
150
Так как в проекте светодиодная лента будет устанавливаться в корпу-
се, наиболее удобным в использовании будет модуль WS2812. Внешний
вид этой ленты представлен на рис. 23.
Рис.23. Модуль WS2812
1.4.3. Программа
Код программы для управления адресной светодиодной лентой. Каж-
дый светодиод включается каждые 500 мс и отключаются остальные.
#include "Adafruit_NeoPixel.h" // подключение библиотеки
#define PIN 10 // подключение DI ленты к 10 пину
#define NUMPIXELS 8 // количество светодиодов в ленте
// создание объекта strip с нужными характеристиками
Adafruit_NeoPixel strip (NUMPIXELS, PIN, NEO_GRB +
NEO_KHZ800);

2. Проектирование киберфизических систем
86
void setup () {
strip.begin(); // инициализация ленты
strip.setBrightness (50); // яркость светодиодов (максимум 255)
}
void loop() {
strip.setPixelColor(0, strip.Color (255, 0, 0)); // включение красного
цвета на 1 светодиоде
strip.show(); // передача сигнала на ленту
delay(500);
strip.clear(); // выключение всех светодиодов
strip.setPixelColor(1, strip.Color(0, 0, 255)); // включение синего
цвета на 2 светодиоде
strip.show(); // передача сигнала на ленту
delay(500);
strip.clear(); // выключаем все светодиоды
strip.setPixelColor(2, strip.Color(255, 255, 255)); // включение белого
цвета на 3 светодиоде
strip.show(); // передача сигнала на ленту
delay(500);
strip.clear(); // выключение всех светодиодов
}
Глава 2. Разработка структурной схемы киберфизической системы
2.1. Принцип работы
Сервопривод поворачивает солнечную панель. Для проверки того, что
солнечная панель направлена к Солнцу, к ее выходным клеммам подключен датчик напряжения, который понижает напряжение в 5 раз, чтобы оно
находилось в пределах измерения Arduino. Это значение напряжения фильтруется от помех при помощи медианного фильтра, чтобы избежать внезапные и резкие изменения напряжения вследствие влияния ЭМИ. С использованием PI-регулятора осуществляется поворот вала сервопривода
таким образом, чтобы напряжение, выдаваемое с солнечной панели, было
максимальным. Трехцветная светодиодная лента отображает текущую величину напряжения с панели яркостью и расположение Солнца включением одного из диодов. Нажатием на кнопку джойстика устройство перехо-

Лекция 4. Пример разработки киберфизической системы на основе микроконтроллера
87
дит в режим ручного управления. При отклонении стика вал сервопривода
поворачивается, тем самым направляя солнечную панель. Нажатием на
кнопку джойстика второй раз активируется автоматический режим.
2.2. Структурная схема
Структурная схема устройства представлена на рис. 24.
Рис. 24. Структурная схема киберфизической системы
Глава 3. Разработка алгоритма обработки данных для киберфизиче-
ской системы
3.1. Медианный фильтр
3.1.1. Обзор фильтров
Программные фильтры позволяют устранить шумы, образующиеся в
результате влияния внешних электромагнитных воздействий на шину, по
которой происходит передача данных. Программные фильтры реализуются
как фильтрующие функции, в которой в качестве параметра передаётся новое значение, и функция возвращает фильтрованную величину. Некоторые
функции требуют дополнительные настройки, которые вынесены как переменные.
3.1.2. Принцип работы медианного фильтра
Медианный фильтр третьего порядка отделяет второе значение из
трех. Данный фильтр характеризуется тем, что неплохо сглаживает основ-

2. Проектирование киберфизических систем
88
ную линию, не меняет форму пиков на склонах и эффективно устраняет отдельные выбросы, заменяя их на медиану.
Программная реализация медианного фильтра, приведена ниже, не
требует вычислений, а только операций сравнения, благодаря чему его
наличие не вносит дополнительных задержек в работе микроконтроллера.
#include "GyverFilters.h"
GMedian3<int> testFilter; // объявление фильтруемой переменной
void setup() {
Serial.begin(9600);
}
void loop() {
int value = analogRead(0);
value += random(2) * random(2) * random(-1, 2) * random(50, 250);
//внесение шумов
Serial.print(value);
Serial.print(',');
value = testFilter.filtered(value);
Serial.println(value);
delay(80);
}
В программе используется библиотека “GyverFilters”, реализующая
фильтрацию сигналов различными способами. В данном случае используется структура “testFilter” типа “GMedian3<int>”, обозначающая что для
целочисленной “value” будет использоваться медианный фильтр третьего
порядка.
3.2. ПИ-регулятор
3.2.1. Обзор ПИ-регулятора и принцип работы
Пропорционально-интегрирующий (ПИ) регулятор предназначен для
систем автоматического управления для формирования управляющего сигнала с целью получения высокой точности и качества переходного процесса. Он формирует управляющий сигнал, который является суммой двух
слагаемых, первое из которых пропорционально разности входного сигнала
и сигнала обратной связи (сигнал рассогласования), а второе равно инте-

Лекция 4. Пример разработки киберфизической системы на основе микроконтроллера
89
гралу сигнала рассогласования. Программная реализация ПИ-регулятора
представлена ниже.
#include "GyverPID.h"
GyverPID regulator(0.1, 0.05, 0);// коэффициенты П, И, Д, в случае
ПИ-регулятора коэффициент Д будет равен нулю
void setup() {
regulator.setDirection(NORMAL); // направление регулирования
(NORMAL/REVERSE)
regulator.setLimits(0, 255); // пределы 8 битного ШИМ
regulator.setpoint = 50; // значение, которое регулятор должен
поддерживать
}
void loop() {
int temp = analogRead(A0); // чтение температуры с датчика
regulator.input = temp; // сообщение регулятору текущей темпе-
ратуры
analogWrite(3, regulator.getResultTimer()); // отправка скорректи-
рованных данных на 3 пин
В данной программе в качестве наблюдателя выступает датчик температуры, а температура регулируется нагревающей спиралью, управляемой
через полевой транзистор, затвор которого подключен к третьему пину.
Для реализации ПИ-регулятора используется библиотека “GyverPID”, где
дифференциальный коэффициент равен нулю.
Глава 4. Разработка алгоритма работы киберфизической системы
4.1. Блок-схема алгоритма
Алгоритм управления автоматической ориентации солнечной панели
на Солнце для мобильного наземного робота, работающей на основе анализа сигналов от датчиков двух входных величин и управляющую двумя механизмами, с обработкой сигнала на основе микроконтроллера отражает
принцип работы киберфизической системы и представлен в виде блоксхемы на рис. 25.
4.2. Программная реализация алгоритма
Программная реализация алгоритма разработана в среде программирования Arduino EDI и представлена ниже.

2. Проектирование киберфизических систем
90
Рис. 25. Блок-схема алгоритма
#include "Servo.h" // подключение библиотек
#include "Adafruit_NeoPixel.h"
#include "GyverFilters.h"
#include "GyverPID.h"
#define DI 10 // подключение DI ленты к 10 пину
#define NUMPIXELS 8 // количество светодиодов в ленте
#define VoltagePin A1 // подключение датчика напряжение к 1 ана-
логовому пину
#define JoystickButton 3 // подключение кнопки джойстика к 3 пину
#define JoystickX A0// подключение оси Х джойстика к 0 анало-
говому пину
GyverPID regulator(0.1, 0.05, 0);// коэффициенты П, И, Д, в случае
ПИ-регулятора коэффициент Д будет равен нулю
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
