Regenerating PPM signal based on distances from ultrasonic sensors, ESP8266 for connectin via wifi. Autonomous quadcopter behaviour, autonomou height holding. Flying direction based on front and back ultrasonic sensors.

Dependencies:   ConfigFile HCSR04 PID PPM2 mbed-rtos mbed

distanceRegulation.h

Committer:
edy05
Date:
2017-10-27
Revision:
13:33024b5880b3
Parent:
3:6c9f80f5e865
Child:
16:9490bb68e1fb

File content as of revision 13:33024b5880b3:

#include "mbed.h"
#include "rtos.h"
#include "hardware.h"
#include "definitions.h"

void distanceRegulationThread(){
    uint16_t channels[CHANNELS];
    int distance=0;
    float groundDistancePidValue;
    int newThrottleValue;
    
    //setup PID
    _groundDistance->setInputLimits(0, 500);
    _groundDistance->setOutputLimits(-100, 100);
    _groundDistance->setMode(AUTO_MODE);
    _groundDistance->setSetPoint(0.0);
    _groundDistance->setBias(0);
    _groundDistance->setTunings(_P, _I, _D);
    
    while(1){
        
        _ppmRegen->getAllChannels(channels);
        distance = _sonic->getDistan();
        
        //calculate PID for given channel
        if(pidChanged){
            pidChanged = false;
            pc.printf("PID tunings changed \n\r");    
            _groundDistance->setTunings(_P, _I, _D);
        }
        _groundDistance->setProcessValue(distance);
        _groundDistance->setSetPoint(30);
        groundDistancePidValue = _groundDistance->compute();
        
        //Update PWM values
        newThrottleValue = channels[THROTTLE] + groundDistancePidValue;
        
        pc.printf("Sonic distance: %d \n\r", distance);
        pc.printf("channel throttle pid value: %f \n\r", groundDistancePidValue); 
        pc.printf("channel throttle original value: %d \n\r", channels[THROTTLE]);
        pc.printf("channel throttle final value: %d \n\r", newThrottleValue);
        
        // Generate PWM
        _roll->pulsewidth_us(    channels[ROLL]);
        _pitch->pulsewidth_us(   channels[PITCH]);
        _yaw->pulsewidth_us(     channels[YAW]);
        _throttle->pulsewidth_us(channels[THROTTLE]);
        _aux1->pulsewidth_us(    channels[AUX1]);
        _aux2->pulsewidth_us(    channels[AUX2]);
        
        Thread::wait(500);
            
        
    }
    
}