ПредишенСледващото

Типично радиооборудване работи нещо подобно. Налице е предавател (в действителност, тя APPA) и приемника. Приемник на предавателя да общуват по някакъв протокол към нея, често е затворен. Приемникът декодира протокола, и предава на позицията на ръкохватките за оборудването на, например, контролер полет (PC) quadrocopter. PC и приемник комуникация по своя протокол, който трябва да се разбере и двете. В този момент, много популярен и PWM PPM. Има и други възможности, по-специално, SBUS и DSX DSM2, но в тази статия ще разгледаме само PWM и части на милион.

PPM (Pulse Позиция Modulation) - това е опит да се тъпча много PWM сигнали в един единствен кабел, добре, или, най-малкото, аз лично обичам да мисля за това, тъй като. PPM винаги предава кратки импулси. Пауза между краищата на импулси съответства на продължителността на един PWM сигнал. Сигналите се предават последователно, първо на първата стойност канал, след втората, и така нататък. Съответствието между PPM и PWM сигнал се улавя с форма на сигнала, записан на Rigol DS1054Z:

Инструкция декодиране части на милион и PWM бележки сигнал програмист

Осцилограмата отстранява от приемника радио връзка R8EF, с режим, в който двата щифта това служи сигнали PPM и SBUS, а останалите щифтове - PWM сигнал за каналите 3 до 8. Следователно, PWM сигнали за канали 1 и 2 не са показани. Тук можете да видите няколко интересни функции. Първо, този приемник използва логическа единица 3.3, въпреки че захранва от 5 V. Второ, PPM сигнал е обърнат в сравнение с начина, по който обикновено се изготвя в снимките (например, в тази тема). Странното е, че всичко за фронтовете на импулса, написани по-горе по същото време остава вярна. По-специално, в изображението са подчертани стрелки фронта съответните PWM сигнал на канал 3. В тази PPM сигнал е изместен спрямо PWM сигнал, но като цяло приемник и не е бил длъжен да някак си синхронизирани.

PPM работи добре, стига да не се опитвайте да го набутам над 8 канала. Ако повече канали, или обновяват сигнали започват със закъснение от повече от 20 мс (както е в случая с PWM), или трябва да се "вмъкне" сигналите губят точност или използването на допълнителни кабели. Лично аз не съм виждал, че на PPM преминали повече от 8 канала.

Добре, сега нека да кажа, че аз искам да контролирам робот с помощта на радио. Ето съответния код за PWM:

#include
#include

# определят NCHANNELS 8
# определят CH1_PIN 5 // CH2_PIN = CH1_PIN + 1, и т.н.

летлив вътр pwm_value # 91; NCHANNELS # 93; = # 123; 0 # 125; ;
летлив вътр prev_time # 91; NCHANNELS # 93; = # 123; 0 # 125; ;

нищожен въстание # 40; # 41; ;

нищожен падане # 40; # 41; # 123;
uint8_t щифт = PCintPort. arduinoPin;
PCintPort. attachInterrupt # 40; игла, нараства, RISING # 41; ;
pwm_value # 91; ПИН - CH1_PIN # 93; = хилядни # 40; # 41; - prev_time # 91; ПИН - CH1_PIN # 93; ;
# 125;

нищожен въстание # 40; # 41;
# 123;
uint8_t щифт = PCintPort. arduinoPin;
PCintPort. attachInterrupt # 40; игла, падане, попадащи # 41; ;
prev_time # 91; ПИН - CH1_PIN # 93; = хилядни # 40; # 41; ;
# 125;

невалидни настройка # 40; # 41; # 123;
за # 40; uint8_t и = 0; аз pinMode # 40; CH1_PIN + I, INPUT_PULLUP # 41; ;
PCintPort. attachInterrupt # 40; CH1_PIN + I, нараства, RISING # 41; ;
# 125;

Сериен. започвам # 40; 9600 # 41; ;
# 125;

нищожен контур # 40; # 41; # 123;
за # 40; uint8_t и = 0; аз Сериен. println # 40; "Ch" + String # 40; I + 1 # 41; + "=" + String # 40; pwm_value # 91; аз # 93; # 41; # 41; ;
Сериен. println # 40; "----------------" # 41; ;
закъснение # 40; 1000 # 41; ;
# 125;

И това - кода за PPM:

#include
#include

# определят PPM_PIN 6
# определят MAX_CHANNELS 12

летлив вътр pwm_value # 91; MAX_CHANNELS # 93; = # 123; 0 # 125; ;
летливи Int prev_time = 0;
летливи Int curr_channel = 0;

летливи BOOL преливане = фалшива;

нищожен въстание # 40; # 41;
# 123;
Int tstamp = хилядни # 40; # 41; ;

/ * Overflow никога не трябва да acutally се случи, но кой знае. * /
ако # 40; curr_channel pwm_value # 91; curr_channel # 93; = Tstamp - prev_time;
ако # 40; pwm_value # 91; curr_channel # 93;> 2100 # 41; # 123; / * Това всъщност е синхронизация * /
pwm_value # 91; curr_channel # 93; = 0;
curr_channel = 0;
# 125; още
curr_channel ++;
# 125; още
преливане = вярно;

prev_time = tstamp;
# 125;

невалидни настройка # 40; # 41; # 123;
pinMode # 40; PPM_PIN, INPUT_PULLUP # 41; ;
PCintPort. attachInterrupt # 40; PPM_PIN, нараства, RISING # 41; ;

Сериен. започвам # 40; 9600 # 41; ;
# 125;

нищожен контур # 40; # 41; # 123;
за # 40; uint8_t и = 0; аз Сериен. println # 40; "Ch" + String # 40; I + 1 # 41; + "=" + String # 40; pwm_value # 91; аз # 93; # 41; # 41; ;
ако # 40; преливник # 41;
Сериен. println # 40; "OVERFLOW!" # 41; ;
Сериен. println # 40; "----------------" # 41; ;
закъснение # 40; 1000 # 41; ;
# 125;

Кодът е тествана на радиосъоръжения и приемник радио връзка T8FB й R8EF. В следващата снимка приемника, се превръща в режим PPM, свързан с фърмуер Arduino Nano облян в него за PPM:

Инструкция декодиране части на милион и PWM бележки сигнал програмист

Пример за отстраняване на грешки изход от UART:

Назначаване PinChangeInt библиотека се използва по-горе, ще бъде разбран от кода. Тя може да се мотае капаните на водещите и прилежащите краища (възход и падение) на сигнал по предварително определен pinah. За подробности относно тази библиотека може да намерите тук и тук. Пълната версия на фърмуера код за декодиране на PWM и PPM сигнали е достъпно на GitHub.

Въоръжени с придобитите знания тук, ние не само може да контролира Ардуино с помощта на радиото, но също така, например, спойка Decoders PWM / от PPM (ако не искате да плащате за готови за AliExpress) или дори сами да произвеждат радио оборудване въз основа на NRF24L01 или друго радио. Това е само първото нещо, което аз лично дойде на ум.

Какви налудничави идеи за творчество имате?

Подобно на този пост? Споделете с другите:

(Трябва да включите JS)

Свързани статии

Подкрепете проекта - споделете линка, благодаря!