I would like to send a PPM with M5 stack Fire



  • HI,
    after to consult many web page I don't find a solution
    I would like to dialog with VESC to control the speed motor via PPN signal (NO PWM)
    Somebody have an idea ? or know how to do this ?
    thx
    Alain



  • you could try search some keywords esp32 ppm `Arduino in Github. maybe some lib could do that.

    https://github.com/search?q=arduino+ppm



  • thx, found this https://github.com/schinken/PPMEncoder
    try later



  • Hi
    no find yet a correct solution
    somebody have exemple ?
    other this need for me to return to my arduino board.
    Thx





  • Hi
    already test these program, no compatble with ESP32 or M5 stack seem a problem of timer.
    turn on the loop.

    type of error:
    error: 'TCCR1A' was not declared in this scope



  • @amn said in I would like to send a PPM with M5 stack Fire:

    'TCCR1A' was not declared in this scope

    'TCCR1A' was not declared in this scope

    that looks like is a grammar error..... you just need define the function before you use it,



  • @m5stack said in I would like to send a PPM with M5 stack Fire:
    read on the web the timer is different between Arduino and ESP32
    could be nice to find sample of code.
    other this I'll continue my investigation
    thx



  • @amn
    HI found this code: (how to adapt with potentiometre for the lenght of pulse , ?)

    //////////////////////CONFIGURATION///////////////////////////////
    #define chanel_number 1 //set the number of chanels
    #define default_servo_value 1500 //set the default servo value
    #define PPM_FrLen 22500 //set the PPM frame length in microseconds (1ms = 1000µs)
    #define PPM_PulseLen 300 //set the pulse length
    #define onState 1 //set polarity: 1 is positive, 0 is negative
    #define sigPin 36 //set 10 PPM signal pin on the arduino

    /this array holds the servo values for the ppm signal
    change theese values in your code (usually servo values are between 1000 and 2000)
    /
    int ppm[chanel_number];

    void setup(){
    // Initialize the M5Stack object
    M5.begin();
    /*
    Power chip connected to gpio21, gpio22, I2C device
    Set battery charging voltage and current
    If used battery, please call this function in your project
    */
    M5.Power.begin();

    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setTextColor(GREEN , BLACK);
    M5.Lcd.setTextSize(2);

    //initiallize default ppm values
    for(int i=0; i<chanel_number; i++){
    ppm[i]= default_servo_value;
    }

    pinMode(sigPin, OUTPUT);
    digitalWrite(sigPin, !onState); //set the PPM signal pin to the default state (off)
    }

    void loop(){
    //put main code here
    ppmWrite();

    }

    void ppmWrite(){ //generate PPM signal
    static unsigned long lastFrLen;
    static unsigned long lastServo;
    static unsigned long lastPulse;
    static boolean PPM_run;
    static boolean pulse;
    static boolean pulseStart = true;
    static byte counter;
    static byte part = true;

    if(micros() - lastFrLen >= PPM_FrLen){ //start PPM signal after PPM_FrLen has passed
    lastFrLen = micros();
    PPM_run = true;
    }

    if(counter >= chanel_number){
    PPM_run = false;
    counter = 0;
    pulse = true; //put out the last pulse
    }

    if(PPM_run){
    if (part){ //put out the pulse
    pulse = true;
    part = false;
    lastServo = micros();
    }
    else{ //wait till servo signal time (values from the ppm array) has passed
    if(micros() - lastServo >= ppm[counter]){
    counter++; //do the next channel
    part = true;
    }
    }
    }

    if(pulse){
    if(pulseStart == true){ //start the pulse
    digitalWrite(sigPin, onState);
    pulseStart = false;
    lastPulse = micros();
    }
    else{ //will wait till PPM_PulseLen has passed and finish the pulse
    if(micros() - lastPulse >= PPM_PulseLen){
    digitalWrite(sigPin, !onState);
    pulse = false;
    pulseStart = true;
    }
    }
    }
    }