Чтение PPM-сигнала RC-приемника с использованием Arduino
Компоненты и расходные материалы
| × | 1 |
Приложения и онлайн-сервисы
|
Об этом проекте
RC-передатчик очень хорошо подходит для проектов, требующих беспроводной связи, поскольку он имеет зашифрованные каналы с хорошим диапазоном.
Все RC-приемники предназначены для привода серводвигателей. Таким образом, для каждого канала есть 3 контакта:земля, Vcc и сигнал. здесь используется особый вид сигнала. Он отправляет импульсы с некоторым интервалом. Когда сервопривод получает импульс 1,5 мс, он устанавливается на 90 градусов и, изменяя это значение от 1-2 мс, сервопривод переходит к минимальному и максимальному значению. (На фотографии выше показан 6-канальный приемник с выводом PPM)
Самый простой способ - это измерить ширину импульса на каждом выводе и сопоставить эти данные в соответствии с требованиями. но тут проблема в том, что:
- Для каждого канала приемника нам нужно подключить провод к выводу Arduino. Это требует не только большого количества соединений, но и большого количества контактов на Arduino.
- Большая часть Arduino имеет только 2 контакта прерывания, поэтому, если мы используем более 2 каналов, прочтите его, чтобы добавить некоторую задержку в наш код, что может быть проблематичным для некоторых приложений.
Чтобы решить эту проблему, многие приемники поставляются с дополнительным контактом PPM. этот вывод PPM передает данные всех каналов в одном сигнале.
Как формируется сигнал пина PPM?
Этот сигнал состоит из пакетов данных, разделенных пробелом. Здесь пространство между пиками представляет собой значение канала. В данном случае я использовал 6-канальный приемник, поэтому есть 7 импульсов.
Итак, в нашем коде сначала нам нужно определить пространство разделения, а затем начать запись данных из импульсов для каждого канала.
Как видно на втором изображении,
все данные разделены примерно 11500 микросекундами времени. более 6 значений для каждого канала.
Использование кода:
Здесь read_me () указана как функция:
a =micros (); с =а-б; б =а; х [я] =с; я =я + 1; if (i ==15) {для (int j =0; j <15; j ++) {ch1 [j] =x [j];} i =0; }}
эта часть работает на выводе прерывания, принимает 15 значений времени и сохраняет их в массиве.
другая функция read_rc ()
эта часть ищет любое пространство, длина которого превышает 10000 микросекунд, в нашем случае она обнаруживает пространство разделения и, когда обнаруживает, что код пространства перемещается в следующий раздел.
после этого пробела следующие 6 значений для каждой позиции канала сохраняются в массиве с именем ch [номер канала], здесь ch [1], ch [2], ch [3], ch [4], ch [5] ], глава [6] представляет ценность каждого канала.
Код
- Считывание кода для канала приемника RC
Код для канала RC-приемника чтения Arduino
unsigned long int a, b, c; int x [15], ch1 [15], ch [7], i; // определение массивов и переменных для хранения значений void setup () {Serial.begin (9600); pinMode (2, INPUT_PULLUP); attachInterrupt (digitalPinToInterrupt (2), read_me, ПАДЕНИЕ); // включение прерывания на выводе 2} void loop () {read_rc (); Serial.print (ch [1]); Serial.print ("\ t"); Serial.print (ch [2]); Serial.print ("\ t"); Serial.print (ch [3]); Serial.print ("\ t"); Serial.print (ch [4]); Serial.print ("\ t"); Serial.print (ch [5]); Serial.print ("\ t"); Serial.print (ch [6]); Serial.print ("\ n"); delay (100);} void read_me () {// этот код считывает значение из RC-приемника с вывода PPM (вывод 2 или 3) // этот код дает значения канала от 0 до 1000 значений // -:ABHILASH:- // a =micros (); // сохраняем значение времени a при падении значения вывода c =a-b; // вычисление времени между двумя пиками b =a; // x [i] =c; // сохранение 15 значений в массиве i =i + 1; if (i ==15) {for (int j =0; j <15; j ++) {ch1 [j] =x [j];} i =0;}} // копируем сохраняем все значения из временного массива другого массива после 15 чтения void read_rc () {int i, j, k =0; for (k =14; k> -1; k -) {if (ch1 [k]> 10000) {j =k;}} // обнаружение пространства разделения 10000us в этом другом массиве for (i =1; i <=6; i ++) {ch [i] =(ch1 [i + j] -1000);}} // назначаем 6 значений канала после пробела разделения
Производственный процесс
- Следите за температурой в доме с помощью Raspberry Pi
- Декодер DTMF с использованием только Arduino
- Создание монитора Ambilight с помощью Arduino
- Ультразвуковой левитационный аппарат с использованием ARDUINO
- Программирование серии Atmel AT89 через Arduino
- Вольтметр своими руками с использованием Arduino и смартфона
- Монитор сердечного ритма с использованием Интернета вещей
- WebServerBlink с использованием Arduino Uno WiFi
- Счетчик автомобилей с использованием Arduino + Обработка + PHP
- Индикатор сердцебиения с использованием ЭКГ