Software um den RC-Empfänger auszulesen und bei L298 anzusteuern, noch nicht perfekt und auch nur geklaut und angepasst, aber läuft soweit auf dem Pi. Bei fragen dazu gerne E-Mail an mich.
/* This code is provided under the BSD license. Copyright (c) 2014, Emlid Limited. All rights reserved. Written by Mikhail Avkhimenia (mikhail(dot)avkhimenia(at)emlid(dot)com) twitter.com/emlidtech || www.emlid.com || info(at)emlid(dot)com Application: PPM to PWM decoder for Raspberry Pi with Navio. Requres pigpio library, please install it first - http://abyz.co.uk/rpi/pigpio/ To run this app navigate to the directory containing it and run following commands: make sudo ./PPM Umgebaut zu Kanaldecoder und direkter asugabe auf einem L298 (zwei, da ich die jeweils parallel geschsltet habe. */ #include <pigpio.h> #include <stdio.h> #include <unistd.h> //================================ Options ===================================== unsigned int samplingRate = 1; // 1 microsecond (can be 1,2,4,5,10) unsigned int ppmInputGpio1 = 3; // PPM input on Navio's 2.54 header unsigned int ppmInputGpio2 = 4; // PPM input on Navio's 2.54 header unsigned int ppmSyncLength = 10000; // Length of PPM sync pause unsigned int ppmChannelsNumber = 1; // Number of channels packed in PPM unsigned int servoFrequency = 50; // Servo control frequency bool verboseOutputEnabled = true; // Output channels values to console #define PWM1 25 //ENABLE Pin des ersten L298 #define INA1 23 // INA (oder IN1) des ersten L298 #define INB1 24 // INB (oder IN2) des ersten 298 #define PWM2 11 //ENABLE Pin des zweiten L298 #define INA2 9 // INA (oder IN1) des zweiten L298 #define INB2 10 // INB (oder IN2) des zweiten 298 static int RICHTUNG1 = 0; // (Drehrichtung des Motors Nr.1, 0=Vorwärts, 1=Rückwärts static int RICHTUNG2 = 0; // (Drehrichtung des Motors Nr.1, 0=Vorwärts, 1=Rückwärts //============================ Objects & data ================================== //============================== PPM decoder =================================== unsigned int previousTick1; unsigned int previousTick2; unsigned int deltaTime1; unsigned int deltaTime2; unsigned int forward = 0; unsigned int backward =0; unsigned int left = 0; unsigned int right = 0; static int servo1 = 0; static int servo2 = 0; static int channel1 = 0; static int channel2 = 0; void ppmOnEdge1(int gpio, int level, uint32_t tick) { deltaTime1 = tick - previousTick1; previousTick1 = tick; if (level == 0) if (deltaTime1 >= ppmSyncLength) { // Sync } else { channel1 = ((deltaTime1-1000)/1.8); if (channel1 > 510) { channel1 = 510; } if (channel1 <= 2) { channel1 = 2; } if (channel1 > 255){ servo1 = (channel1 - 255); RICHTUNG1 = 0; } if (channel1 < 255) { servo1 = ((channel1-255)*(-1)); RICHTUNG1 = 1; } gpioPWM(PWM1, servo1); gpioWrite(INA1, RICHTUNG1); // INA auf gewünschte Richtung stellen gpioWrite(INB1, !RICHTUNG1); // INB auf gewünschte Richtung stellen } } void ppmOnEdge2(int gpio, int level, uint32_t tick) { deltaTime2 = tick - previousTick2; previousTick2 = tick; if (level == 0) if (deltaTime2 >= ppmSyncLength) { // Sync } else { channel2 = ((deltaTime2-1000)/1.8); if (channel2 > 510) { channel2 = 510; } if (channel2 <= 2) { channel2 = 2; } if (channel2 > 255){ servo2 = (channel2 - 255); RICHTUNG2 = 0; } if (channel2 < 255) { servo2 = ((channel2-255)*(-1)); RICHTUNG2 = 1; } gpioPWM(PWM2, servo2); gpioWrite(INA2, RICHTUNG2); // INA auf gewünschte Richtung stellen gpioWrite(INB2, !RICHTUNG2); // INB auf gewünschte Richtung stellen } } //=================================Andere Funktionen ========================== /* int servo1umrechnen() { servo1 = (channel1-1000); } int servo2umrechnen() { } */ //================================== Main ====================================== int main(int argc, char *argv[]) { // GPIO setup if (gpioInitialise()<0) return 1; //gpioSetPWMfrequency(PWM1, servoFrequency); //gpioCfgClock(samplingRate, PI_DEFAULT_CLK_PERIPHERAL, PI_DEFAULT_CLK_SOURCE); gpioInitialise(); previousTick1 = gpioTick(); previousTick2 = gpioTick(); gpioSetAlertFunc(ppmInputGpio1, ppmOnEdge1); gpioSetAlertFunc(ppmInputGpio2, ppmOnEdge2); gpioSetMode(PWM1, PI_OUTPUT); gpioSetMode(INA1, PI_OUTPUT); gpioSetMode(INB1, PI_OUTPUT); //gpioPWM(PWM1, servo1); // Infinite sleep - all action is now happening in ppmOnEdge() function while(1) sleep(10); //printf("Servo1 %d, Richtung1 %d Servo2 %d Richtung2 %d, Channel1 %d, Channel2 %d\n",servo1,RICHTUNG1,servo2,RICHTUNG2,channel1,channel2); return 0; }