MCU Ardiuno: библиотека PPMint

ArduinoTM Logo

Потребовалось с тренерского разъема Futaba T7C получить сигнал PPM и обработать его с помощью Arduino. Принял, обработал – за основу подсмотрел идеи из AeroQuad. В результате имею готовую библиотеку для работы с суммированным PWM – то, что я называю PPM.

Как это работает:

  • ко входу D2 Arduino Uno подключаем сигнал с аппаратуры (проверено с Futaba T7C 2.4, Futaba 8FG)
  • закачиваем файлвнизу поста ссылка)
  • распаковываем в “libraries
  • в рабочем скетче делаем #include “PPMint.h”;, инициализируем объект PPMint ppm;
  • используем по тексту программы конструкцию realRaw[номер канала]
Проще вроде некуда. Далее немного кода и ссылка на загрузку.

Same in english here…

It took a trainer connector Futaba T7C get PPM signal and process it using the Arduino. Received, processed – the basis of ideas spied AeroQuad . As a result, I have finished the library to work with the summarized PWM – what I call the PPM.

How it works:

  • to the input D2 Arduino Uno connect the signal from the equipment (tested with Futaba T7C 2.4, Futaba 8FG)
  • upload files (at the bottom of the post link)
  • unpack in “libraries
  • in working sketch do # include “PPMint.h”; , initialize the object PPMint ppm;
  • use the text of the program structure realRaw [channel number]
Simply like nowhere else. Next, some code and download link .


#ifndef PPMint_h
#define PPMint_h
#include "Arduino.h"
#define _CHA_NUM 10
#define _PPM_PIN 2
#define _PPM_INT 0
class PPMint
                int realRaw[10];
                void PPMinterrupt(void);
                void setup();
                uint8_t prevRealRaw[10];
                uint8_t currentChannel;
                unsigned long lastms,diffms;
                boolean sync;



// only one instance allowed - some hack here
static PPMint *pclass = 0;
void ppmInterrupt() {// dummy function
        if (pclass)

PPMint::PPMint() {
} //PPMint

void PPMint::setup() {
        lastms = 0;
        sync = false;

        pclass=this; //create an pointer to func
        while(!sync) {

void PPMint::PPMinterrupt() { //here real work to come ;)
        long nowms = micros();
        diffms = nowms - lastms;
        if(lastms>0) {
                if(diffms>5000) {
                        sync = true;
                        currentChannel = 0;
        else {
                if(sync) {
                                if(diffms<=2000 && diffms>=1000) {
                                        realRaw[currentChannel] = diffms;
        lastms = nowms;

Пример использования:

PPMint ppm;
void setup() {

void loop() {
  Serial.print("Channel 0: "); 

Все – в деталях 🙂 В конструкторе не получается зацепить прерывания (есть предположения – почему – блок BEGIN / END внутри конструктора не канает).

All – in detail:) In the constructor fails to catch interrupts (the assumption is – why – block BEGIN / END inside the constructor is not the channel).

Обещанная ссылка

The promised link

Спс/Tnx 😉

PS (a bit late):

Leave a Reply

Your email address will not be published. Required fields are marked *