Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Чтение PPM-сигнала RC-приемника с использованием Arduino

Компоненты и расходные материалы

Arduino UNO
× 1

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

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 значений канала после пробела разделения 

Производственный процесс

  1. Следите за температурой в доме с помощью Raspberry Pi
  2. Декодер DTMF с использованием только Arduino
  3. Создание монитора Ambilight с помощью Arduino
  4. Ультразвуковой левитационный аппарат с использованием ARDUINO
  5. Программирование серии Atmel AT89 через Arduino
  6. Вольтметр своими руками с использованием Arduino и смартфона
  7. Монитор сердечного ритма с использованием Интернета вещей
  8. WebServerBlink с использованием Arduino Uno WiFi
  9. Счетчик автомобилей с использованием Arduino + Обработка + PHP
  10. Индикатор сердцебиения с использованием ЭКГ