Урок 22. Работа со временем в Ардуино. Проект спортивного секундомера
Рассмотрим функции работы со временем. Разработаем спортивный секундомер на базе платы Ардуино.
Предыдущий урок Список уроков Следующий урок
Для работы со временем в системе Ардуино существуют 4 стандартные функции:
- delay(time);
- delayMicroseconds(time);
- millis();
- micros().
Рассмотрим эти функции подробно.
void delay(unsigned long time)
Функция приостанавливает работу программы на время time, заданное в мс.
delay(500); // пауза на 0,5 сек
Мы уже использовали эту функцию в предыдущих уроках. Использовали в отладочных программах. В практических программах функция применяется редко.
Дело в том, что она останавливает работу программы. Программа ничего не делает в течение заданного отрезка времени. Не позволительная роскошь, допустимая только в отладочных режимах.
Кроме того, функция не позволяет создавать циклы с заданным временем. Например, время следующего цикла не будет точно равно 100 мс.
while(true) {
// код программного блока
delay(100);
}
Время цикла равно сумме: времени 100 мс, времени выполнения программного блока и времени перехода на начало цикла while(). Время программного блока может меняться в зависимости от алгоритма выполнения программы. Время перехода на начало цикла тоже не определено точно. В результате время цикла можно определить только приблизительно.
Для организации циклов с заданным временем лучше использовать прерывание по таймеру (урок 10).
Надо только понимать, что такой способ обеспечивает стабильное время цикла, но оно может несколько отличаться от заданного. Например, библиотека MsTimer2 задает время в мс.
Реальное время может отличаться на 1-2 мкс. В некоторых приложениях, например в часах, ошибка будет накапливаться и приведет к недопустимой погрешности.
void delayMicroseconds(int time)
Функция приостанавливает работу программы на время time, заданное в мкс.
delayMicroseconds(50); // пауза на 50 мкс
Аналог функции delay(), только обеспечивает более короткие остановки программы. Вполне допустима для использования в практических программах по двум причинам.
- Короткие отрезки времени сложно реализовать другими методами.
- Остановка программы даже на несколько десятков микросекунд не вызовет катастрофических последствий.
unsigned long millis(void)
Функция возвращает время в мс, с момента запуска текущей программы. Значение времени переполняется через 1193 часов, приблизительно 50 суток.
tm = millis(); // чтение времени в tm
По сути это функция чтения системного времени Ардуино. Время считается в параллельном процессе и не зависит от алгоритмов выполнения программы, остановок, в том числе и функцией delay(), и т.п. Для измерения интервалов времени необходимо считать системное время в начале и конце интервала и выполнить разность этих значений. Ниже будет пример программы для работы с временными интервалами.
Запрещение прерываний функцией noInterrupts() на длительное время может нарушить работу системных часов.
Точность работы функции millis().
Точность отсчета времени функцией millis() определяется точностью и стабильностью частоты кварцевого резонатора платы Ардуино. Даже для дешевых резонаторов погрешность частоты не превышает 30 ppm. Вместе с температурной нестабильностью, в нормальных условиях, это 50 ppm, что соответствует ± 0,00005 %. Таким образом, суммарная абсолютная ошибка системного времени Ардуино составит:
- 0,18 сек для 1 часа;
- 4,32 сек для суток;
- 129,6 сек для месяца;
- 26 минут для года.
Наверное, вполне допустимая точность для создания секундомеров и даже часов.
unsigned long micros(void)
Функция возвращает время в мкс, с момента запуска текущей программы. Значение переполняется приблизительно через 70 минут.
tm = micros(); // чтение времени в tm
На платах Ардуино с частотой тактирования 16 мГц разрешение значения функции micros() составляет 4 мкс. Для плат с частотой 8 мГц – 8 мкс.
Спортивный секундомер на базе платы Ардуино.
Реализуем достаточно простой проект – секундомер. Наверное, практическое применение такого устройства ограничено. Секундомер с питанием от сети имеет право на существование только в стационарных устройствах.
В табло для спортивных соревнований, в системах для интеллектуальных игр, и т.п. Но разобравшись в программе, Вы легко сможете подкорректировать секундомер под свои задачи или создать совершенно другое устройство.
Управление секундомером осуществляется двумя кнопками:
После нажатия на кнопку ПУСК/СТОП секундомер начинает отсчитывать время. Повторное нажатие на эту кнопку останавливает счет. Следующее нажатие продолжает отсчет времени с остановленного значения. Таким образом, секундомер может быть использован для отсчета ”чистого ” времени спортивных соревнований.
Для сброса значения времени необходимо нажать кнопку СБРОС.
Время отображается на четырех разрядном семисегментном индикаторе в следующих форматах.
Значение времени | Разряд 3 | Разряд 2 | Разряд 1 | Разряд 0 |
0 … 59 сек | секунды | сотые доли секунды | ||
1 … 10 минут | минуты | секунды | десятые доли секунды | |
10 … 99 минут | минуты | секунды | ||
Больше 99 минут | – | – | – | – |
Формат вывода данных меняется автоматически в зависимости от значения времени. Минуты, секунды и дробная часть отделяются на индикаторе децимальными точками. Нажатия на кнопки сопровождаются звуковыми сигналами.
Схема спортивного секундомера на базе платы Arduino UNO R3.
По уже хорошо известным нам схемам подключаем к плате Ардуино:
- 4х разрядный семисегментный светодиодный индикатор GNQ-3641BUE;
- две кнопки;
- звуковой пьезоизлучатель.
Все эти компоненты могут быть другими. Если Вы разрабатываете секундомер для спортивного табло, то индикаторы должны быть большими. Можете их собрать даже из отдельных светодиодов. Как подключить индикаторы к плате можно посмотреть в уроке 19.
Если кнопки управления секундомером физически расположены на значительном расстоянии от платы, то лучше их подключить по схеме из охранной сигнализации, урок 17. Или хотя бы соединить входы кнопок с питанием + 5 В через резисторы 1 кОм.
Но для отладки и проверки программы достаточно приведенной схемы. Я собрал ее на макетной плате.
Программа для спортивного секундомера на Ардуино.
Скетч программы можно загрузить по этой ссылке загрузить . Не забудьте установить библиотеки из предыдущих уроков: MsTimer2.h (урок 10), Led4Digits.h (урок 20) и Button.h (урок 9).
Скетч программы для секундомера выглядит так.
// спортивный секундомер
#include
#include
#include<\p>
#define SOUND_PIN 18 // звуковой излучатель, вывод 18 (A4)
// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);
Button buttonReset(16, 10); // кнопка СБРОС, вывод 16 (A2)
Button buttonStartStop(17, 10); // кнопка ПУСК/СТОП, вывод 17 (A3)
byte mode= 0; // режим, 0 – СТОП, 1 – ПУСК
unsigned long msTime=0; // время интервала, милисекунды
byte minTime=0; // время интервала, минуты
byte decMinTime=0; // время интервала, десятки минуты
unsigned long prevTime; // предыдущее значение времени
unsigned long curentTime; // текущее значение времени
byte soundCount=0; // счетчик времени звука
void setup() {
MsTimer2::set(2, timerInterrupt); // прерывания по таймеру 2 мс
MsTimer2::start(); // разрешение прерывания
pinMode(SOUND_PIN, OUTPUT); // вывод звукового излучателя
}
void loop() {
//———————– переключение режима СТАРТ/СТОП
if ( buttonStartStop.flagClick == true ) {
buttonStartStop.
flagClick= false; // сброс признака
// инверсия режима
if ( mode == 0) {
mode= 1; // СТАРТ
soundCount= 250; // звук на старт 250*2 мс
}
else { // СТОП
mode= 0;
soundCount= 50; // звук на стоп 50*2 мс
}
}
//———————– кнопка СБРОС
if ( buttonReset.flagClick == true ) {
buttonReset.flagClick= false; // сброс признака
msTime=0;
minTime=0;
decMinTime=0;
soundCount= 50; // звук на сброс 50*2 мс
}
//———————– отсчет времени
if ( mode == 0 ) {
// СТОП
prevTime= millis();
}
else {
// ПУСК
curentTime= millis(); // чтение текущего времени
msTime += curentTime – prevTime; // прибавление времени к милисекундам
if ( msTime > 59999 ) {
// милисекунды переполнились, больше минуты
msTime -= 60000;
minTime ++; // +1 к единицам минут
if ( minTime > 9 ) {
// единицы минут переполнились
minTime -= 10;
decMinTime ++; // +1 к десяткам минут
}
}
prevTime= curentTime; // перегрузка предыдущего времени
}
//——————— отображение времени
if ( (minTime == 0) && (decMinTime == 0)) {
// меньше минуты
disp.print(msTime / 10, 4, 0); // вывод четырех разрядов милисекунд
// точки
disp.digit[0] &= 0x7f; // погасить
disp.digit[1] &= 0x7f; // погасить
disp.digit[2] |= 0x80; // зажечь
disp.
digit[3] &= 0x7f; // погасить
}
else if ( decMinTime == 0 ) {
// меньше 10 минут
disp.print(msTime / 100, 3, 0); // вывод трех разрядов милисекунд
disp.tetradToSegCod(3, minTime); // в старший разряд вывод единиц минут
// точки
disp.digit[0] &= 0x7f; // погасить
disp.digit[1] |= 0x80; // зажечь
disp.
digit[2] &= 0x7f; // погасить
disp.digit[3] |= 0x80; // зажечь
}
else if ( decMinTime < 10 ) {
// меньше 100 минут
disp.print(msTime / 1000, 2, 0); // вывод двух разрядов милисекунд
disp.tetradToSegCod(3, decMinTime); // в старший разряд вывод десятков минут
disp.
tetradToSegCod(2, minTime); // в 3 разряд вывод единиц минут
// точки
disp.digit[0] &= 0x7f; // погасить
disp.digit[1] &= 0x7f; // погасить
disp.digit[2] |= 0x80; // зажечь
disp.digit[3] &= 0x7f; // погасить
}
else {
// больше 100 минут
// —-
disp.digit[0]= 0x40;
disp.
digit[1]= 0x40;
disp.digit[2]= 0x40;
disp.digit[3]= 0x40;
}
}
//———– обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора
buttonReset.filterAvarage(); // сканирование кнопки, метода фильтрации по среднему
buttonStartStop.filterAvarage(); // сканирование кнопки, метода фильтрации по среднему
// звук
if (soundCount != 0) {
digitalWrite(SOUND_PIN, ! digitalRead(SOUND_PIN));
soundCount–;
}
}
Большая часть программы разработана по принципам, подробно описанным в предыдущих уроках.
- Реализовано прерывание по таймеру с периодом 2 мс.
- В обработчике прерывания вызываются:
- метод регенерации индикатора;
- методы сканирования сигналов кнопок;
- блок формирования звукового сигнала.
- По признакам нажатия кнопок происходит:
- переключение режима (СТАРТ/СТОП);
- сброс показаний времени.
- В зависимости от значения времени в блоке отображения меняется формат вывода данных на индикатор.
Подробно хочется остановиться на программном блоке “отсчет времени”. Счет времени можно реализовать разными способами. Например, можно считать время в миллисекундах, а в блоке отображения делать перевод в нужный формат. Я решил, что намного проще считать время в формате:
- миллисекунды;
- минуты;
- десятки минут.
В этом случае не приходится выполнять двоично-десятичные преобразования для отображения минут. Конечно, если бы у нас была задача измерения одного интервала времени, то достаточно было бы считать время функцией millis() в начале и конце интервала, а затем вычислить разность. Но нам необходимо накопление времени, поэтому алгоритм несколько усложняется.
В программе достаточно комментариев. Думаю, Вы без труда разберетесь в ней и сможете создать устройство под свои задачи, будь это спортивный секундомер, система для интеллектуальных игр ”Что? Где? Когда?” или ”Брейн ринг” и многое другое. Мы вернемся к секундомеру и работе со временем при разработке спортивных табло на базе светодиодных модулей. Надеюсь, уже этим летом.
Предыдущий урок Список уроков Следующий урок
Источник: http://mypractic.ru/urok-22-rabota-so-vremenem-v-arduino-proekt-sportivnogo-sekundomera.html
Как сделать ультразвуковой дальномер на HC-SR04 и Arduino
Предлагается проект дальномера, основанного на ультразвуковом датчике HC-SR04 и Arduino. Показания датчика отображаются на жидкокристаллическом дисплее, а питание осуществляется от батареи на 9 вольт.
Для начала, необходимо подобрать подходящего размера корпус. Размер зависит от того, какую плату Arduino вы собираетесь использовать (UNO, Mini, Nano, или другую), а также от того, какого размера у вас ЖК-дисплей.
Можно вместо ЖК дисплея использовать миниатюрный светодиодный индикатор на 3 символа. Этого будет вполне достаточно для отображения дистанции в сантиметрах, т.к.
используемый ультразвуковой датчик имеет диапазон измерений от 3 до 400 см.
Прикинем, как будут скомпонованы внутри корпуса детали. Вырежем отверстия под ультразвуковой датчик, под дисплей и под тумблер включения.
Я буду использовать в проекте Arduino Nano, и размещу его на макетной плате. На нижней части Arduino расположен кварцевый генератор. Он довольно высокий, поэтому я для него вырежу отверстие, иначе вся плата будет выступать и занимать гораздо больше места. Тут же на макетной плате будет размещён переменный резистор на 10 кОм.
Приобрести ультразвуковой датчик по очень хорошей цене можно на этом сайте, а Arduino Nano – здесь.
2Электрическая схема ультразвукового дальномера
Теперь рассмотрим схему нашего прибора.
Схема ультразвукового дальномера с HC-SR04 и Arduino
Питание осуществляется от батареи «Крона» 9 В. Тумблер S1 – для включения и выключения прибора. Жидкокристаллический индикатор (ЖКИ, LCD) подключается по стандартной схеме с потенциометром на 10 кОм для регулировки контрастности. И ЖКИ, и ультразвуковой датчик питаются от 5 В.
3Скетч Arduino для ультразвукового дальномера
Напишем скетч для нашего дальномера:
const int trigPin = 6; // вывод триггера датчика HC-SR04 const int echoPin = 5; // вывод приёмника датчика HC-SR04 #include // подключаем стандартную библиотеку LiquidCrystal lcd(12, 11, 10, 9, 8, 7); //инициализация ЖКИ void setup() { pinMode(trigPin, OUTPUT); // триггер – выходной пин pinMode(echoPin, INPUT); // эхо – входной digitalWrite(trigPin, LOW); lcd.begin(16, 2); //задаём кол-во строк и символов в строке lcd.setCursor(10, 0); // выравниваем надпись по правому краю lcd.print(“Dist:”); lcd.setCursor(14, 1); lcd.print(“cm”); } void loop() { long distance = getDistance(); // получаем дистанцию с датчика lcd.setCursor(10, 1); lcd.print(” “); // очищаем ЖКИ от предыдущего значения lcd.setCursor(10, 1); lcd.print((String)distance); // выводим новую дистанцию delay(100); } // Определение дистанции до объекта в см long getDistance() { long distacne_cm = getEchoTiming() * 1.7 * 0.01; return distacne_cm; } // Определение времени задержки long getEchoTiming() { digitalWrite(trigPin, HIGH); // генерируем импульс запуска delayMicroseconds(10); digitalWrite(trigPin, LOW); // определение на пине echoPin длительности уровня HIGH, мкс: long duration = pulseIn(echoPin, HIGH); return duration; }
Тут всё просто. Сначала инициализируем ЖКИ на выводах 12, 11, 10, 9, 8 и 7 с помощью библиотеки LiquidCrystal из состава Arduino IDE. Далее привяжем выводы «триггер» и «эхо» дальномера к выводам 6 и 5 платы Arduino. Каждые 100 мс будем запрашивать с детектора расстояние с помощью функции getDistance() и выводить на ЖК-дисплей.
У меня на LCD дисплее имеется дефект, и его левая половина почти не работает. Поэтому я вывожу надписи выровненными по правому краю.
После того как записали скетч в память Arduino, можем собирать прибор. Предлагаемая мной компоновка внутренностей показана на рисунке. Дисплей и датчик я закрепил с помощью термоклея. Он держит достаточно прочно, но при этом даёт возможность снять соединённые детали, если понадобится.
Желательно всё разместить так, чтобы можно было подключиться к USB порту Arduino и поправить «прошивку» при необходимости. Например, изменить выводимый текст или поправить коэффициенты для расчёта дистанции.
Может понадобиться менять контрастность ЖК дисплея, так что также желательно иметь в доступности регулятор потенциометра.
Вариант готового прибора показан на фотографии. Он достаточно компактен и удобен в использовании.
Вариант компоновки ультразвукового дальномера | Внешний вид готового ультразвукового дальномера |
Но следует иметь в виду несколько важных замечаний при его использовании:
- Ультразвук лучше отражается от гладких поверхностей, чем от поглощающих (например, мягкого ковра). Поэтому следует выбирать место расположения дальномера при измерении так, чтобы напротив дальномера располагалась гладкая отражающая поверхность (например, стена).
- Показания прибора могут существенно отличаться в зависимости от угла направления на цель. Поэтому лучше всего провести несколько измерений, немного изменяя угол направления на цель, и взять среднее значение от всех измерений.
4Калибровка ультразвукового дальномера
После небольшого опыта использования данного прибора, выявилось, что измеренное расстояние отличается от действительного, причём чем больше расстояние от датчика до цели, тем больше отклонение. В связи с этим возникла необходимость в корректировке показаний дальномера.
Для этого я измерил на всём рабочем диапазоне датчика (от 0 до 400 см) расстояния и составил таблицу из двух столбцов: реальное расстояние и показания датчика. По этим данным построил график:
График отклонения показаний ультразвукового дальномера
Здесь зелёным цветом показан график для идеального дальномера, как должно быть, а красным – реального, который в моём случае занижает показания.
Зависимость получилась линейная. Прекрасно! Из курса геометрии мы помним, что уравнение прямой, проходящей через две точки: (x − x1)/(x2 − x1) = (y − y1)/(y2 − y1)
Подставив вместо x1, 2 и y1, 2 значения из таблицы и упростив выражение, я получил уравнение для графика измерений ультразвукового дальномера: y = 0,97x + 0,27
В уравнении прямой коэффициент 0,97 возле «икс» является тангенсом угла наклона прямой к оси абсцисс. Назовём его tg(α).
Можно посчитать, что угол наклона прямой равняется 44,13 градусам (арктангенс от 0,97), а в идеальном случае он должен быть равен 45 градусам (и уравнение прямой идеального дальномера очень простое: y = x, то есть каждому измеренному числу соответствует точно такое же реальное расстояние). Постоянная 0,27 – это смещение графика относительно нуля по оси ординат.
Посмотрим на следующий рисунок. Видны два прямоугольных треугольника, приподнятые над осью OX.
Один из катетов, назовём его h, треугольника с углом α равен измеренному дальномером расстоянию Rизм за вычетом константы b, равной 0,27. Катет другого треугольника равен реальному расстоянию Rреал.
У обоих треугольников катеты h равны. Зная длину катета h и тангенс угла α (равный 0,97), мы узнаем реальное расстояние Rреал, поделив, длину катета h на tg(α),
Последовательность коррекции показаний ультразвукового дальномера
Таким образом, для того чтобы скорректировать ошибку при измерениях дальномера, нужно следовать формуле: Rреал = (Rизм − b) / tg(α) = (Rизм − 0,27) / 0,97
В вашем случае коэффициент и константа, естественно, будут отличаться. Эту коррекцию следует внести в скетч для Arduino. После этого ультразвуковой дальномер на датчике HC-SR04 будет показывать расстояние более точно.
Напоследок приведу видеодемонстрацию работы готового ультразвукового дальномера.
Источник: https://soltau.ru/index.php/themes/diy/item/502-kak-sdelat-ultrazvukovoj-dalnomer-na-hc-sr04-i-arduino
Watchdog на arduino для майнига . Делаем watchdog своими руками на ардуино UNO
Предлагаю вариант устройства автоматически перезагружающее компьютер при зависании.
В основе лежит известная плата Arduino с минимальным количеством внешних электронных компонентов. Транзистор подключаем к плате согласно рисунку ниже. Коллектор транзистора подключаем вместо кнопки «Reset» компьютера на материнскую плату, на тот контакт который НЕ соединен с GND.
Вот и вся схема :
Функционирует устройство следующим образом: на компьютере запускается скрипт, который периодически шлет в порт компьютера данные. Ардуино подключается к USB и слушает этот порт.
Если в течении 30 секунд данных нет Ардуино открывает транзистор, который соединяет Reset c землей, тем самым имитируя нажатия кнопки сброса.
После сброса ардуино делает паузу в 2 минуты дожидаясь загрузки всех программ и вновь начинает слушать порт.
Скрипт и майнеры должны быть добавлены в автозагрузку, а биос настроен на автоматическое включение компьютера.
Изготвление устройства требует минимальных навыков работы с паяльником и програмирования ардуино.
Так же можно использовать любой Н канальный транзистор с похожими характеристиками . Но смотрите что бы совпадала цоколевка . Например я использовал 9013 , там перевернутое подключение
Компонентты для сборки я покупал на Алиэкспресс :
Провода для макетной сборки http://ali.pub/22k78b
Ардуино УНО (точно подходит ) http://ali.pub/22k7dd
Arduino uno с кабелем http://ali.pub/22k7go
Скетч Ардуино
Code:
int LedPin = 13;
int ResetPin = 12;
int val = 0;
int count = 0;
void setup()
{
Serial.begin(9600);
pinMode(LedPin,OUTPUT);
//пауза на запуск 2 мин
delay (120000);
}
void loop()
{
count++ ;
if (Serial.available() > 0)
{
val = Serial.read();
if (val == ‘H’)
{
digitalWrite(LedPin,LOW);
digitalWrite(ResetPin,LOW);
count = 0;
}
else
{ count++ ;
}
}
delay (1000);
if (count > 10)
{
digitalWrite(LedPin,HIGH);
digitalWrite(ResetPin,HIGH);
}
}
Скрипт отправляющий в порт данные:
(Get-Date).ToString(‘dd.MM.yyyy HH:mm’) | Out-File c:UsersminerDesktop
eboot.txt -append
while($TRUE){
Start-Sleep -s 3
$port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
$port.open()
$port.WriteLine(«H»)
$port.Close()
}
Сразу после запуска скрипт записывает в файл reboot.txt текущую дату и время. По этому файлу можно судить о количество и времени перезагрузок. Путь к файлу и номер порта необходимо отредактриовать в соответствии с вашими данными системы. Код пишется в обычном блокноте и сохраняется с расширением *ps1.
Т.к. в Windows политикой безопасности отключено выполнение скриптов по двойному клику и из автозагрузки делаем финт ушами и запускаем шелл из батника следущего содержания:
start PowerShell.exe -ExecutionPolicy ByPass -File «c:путь к вашему файлуваш файл.ps1»
Файл сохраняем с расширением *.bat и ставим его в автозагрузку.
Радуемся , теперь у нас все автоматизированно . Устройство испытано на своем ПК и польностью работает .
Источник
Подписывайтесь на Bitnovosti в telegram!
Делитесь вашим мнением об этой новости в комментариях под статьёй.
Источник: https://bitnovosti.com/2017/12/21/watchdog-na-arduino-dlya-majniga-delaem-watchdog-svoimi-rukami-na-arduino-uno/
Радиоуправление на ардуино
Используя arduino можно самостоятельно изготовить сложную систему радиоуправления не затрачивая, при этом, много усилий. Для популярной, на данный момент, платформы arduino существует огромное количество модулей расширяющих возможности данной платформы. Например модули nrf24l01 для радиосвязи.
Существует некоторое колличество разновидностей данного модуля. Есть модули для связи на расстояниях до 100м они небольшие и недорогиеРадиомодули рассчитанные на дальность до 100м можно запитать от вывода 3.3В с Arduino uno а радиомодули на дальность до 1100м от этого вывода запитать нельзя т.к.
данный вывод не способен выдать достаточный для нормальной работы модуля ток, поэтому если необходимо использовать модуль с дальностью радиосвязи до 1100м то необходимо использовать внешний стабилизатор на 3.3В для питания радиомодуля. О том как самостоятельно изготовить стабилизатор постоянного напряжения написано в статье http://electe.blogspot.
ru/2015/10/lm317.html там же есть программа для рассчёта. Этот стабилизатор просто надо сделать на 3.3В для того чтобы можно было им запитать радиомодуль. Ещё для того чтобы сделать систему радиоуправления на ардуино нужно само ардуино. Можно использовать почти любое (если не любое) ардуино.
Например (самый простой и лучше подходящий для начинающих вариант)1) Arduino UNO http://ali.pub/236t0v
Если необходима компактность то можно использовать другие ардуины например:
2) Arduino nano http://got.by/23nhej
Также можно использовать любое другое ардуино но эти два (описанных выше) проще всего. Есть например
3) Arduino pro mini http://got.by/23ni7b для программирования Arduino pro mini нужен usb-uart переходник или другое ардуино.
Теперь давайте рассмотрим схему передатчика:
Рисунок 1 – Передатчик на ардуино
У данного передатчика имеется 10 кнопок и 5 потенциометров. Допустим нам надо управлять дистанционно двумя серврмрторами, 3мя ШИМами, одним пьезодинамиком и 8ю цифровыми выходами для каких либо целей (напр.
сделать 8 фонарей на радиоуправлямый автомобиль или 1 фонарь а 7 выводов оставить для чего нибудь на будущее).
На схеме выше показна ардуино уно но аналогично можно соединить радиомодуль кнопки и потенциометры с другим ардуино для этого надо использовать надписи на плате ардуино. Давайте теперь рассмотрим приемник:
Рисунок 2 – Приемник на Ардуино
Напрямую к выводам ардуино можно подключать только маломощный пьезодинамик иначе слишком большой нагрузкой можно ардуино сломать. То же самое относится и ко всем остальным выводам на приёмнике.
К ним нельзя подключать слишком большую нагрузку для того чтобы Ардуино не испортилось. Для питания сервомоторов можно использовать отдельный источник питания. Если сервомоторы мощные то их вывод питания нельзя подключать к выводу питания ардуино.
Теперь давайте рассмотрим скетчь передатчика:
Скачать скетчь передатчика можно по ссылке https://yadi.sk/d/II58CGgc3QV8gz
В начале скетча подключаются заголовочные файлы для связи с радиомодулем потом назначаются пины для связи с радиомодулем по SPI, указывается идентификатор трубы который должен совпадать с идентификатором трубы указанном в скетче приемника (см.
ниже), создаётся массив для передачи данных на приемник. Далее идёт функция инициализации в которой инициализируется и настраивается радиомодуль после чего он устанавливается на передачу данных, инициализируются входы ардуино и делается небольшая задержка на всякий случай.
В основном цикле считываются значения с потенциометров для сервомоторов и преобразуются в градусы функцией map. Далее, в следующую ячейку массива, запихиваются состояния входов ардуино побитно. После чего считываются значения с потенциометров для управления ШИМами, делятс на 4 т.к. аппаратный ШИМ ардуино принимает 1 байт.
Оставшиеся два состояния, с кнопок, пропихиваются в оставшуюся ячейку массива и он, наконец таки, отправляется на приемник.
Теперь скетчь приемника:
Скачать скетчь приемника можно по ссылке https://yadi.sk/d/FtO9F5HZ3QV8Ct
В приемнике помимо заголовочных файлов для связи с радиомодулем есть ещё заголовочный файл для работы с сервомоторами. Радиомодуль теперь настраивается на прием. В основном цикле происходит прием и раздача информации на периферию микроконтроллера ардуины.
Посмотреть видео по данной теме с испытаниями системы радиоуправления на ардуино:
Источник: http://electe.blogspot.com/2017/12/blog-post.html