//Program enables software PWM on GPIOs //Source & info: www.HomoFaciens.de //http://www.HomoFaciens.de/technics-computer-internet-of-things_en_navion.htm //v 0.1 //compile with: gcc GPIO-pwm.c -lwiringPi -o GPIO-pwm //Program checks for a file named "gpio_number-pwm_value" in DIRECTORYNAME //with gpio_number ranging from 0 to 17 and pwm_value from 0 to 200 //Run program as root in background with: sudo ./GPIO-pwm& //Stop program with: sudo killall GPIO-pwm //Set GPIO 12 to PWM 100: >/dev/GPIO-pwm/12-100 //Turn GPIO 14 fully on with: >/dev/GPIO-pwm/14-200 //Turn GPIO 0 off with: >/dev/GPIO-pwm/0-0 #include #include #include #include #include //Mapping between GPIO numbers and P1 pins //Header pin GPIO number // P1-3 8 // P1-5 9 // P1-7 7 // P1-8 15 // P1-10 16 // P1-11 0 // P1-12 1 // P1-13 2 // P1-15 3 // P1-16 4 // P1-18 5 // P1-19 12 // P1-21 13 // P1-22 6 // P1-23 14 // P1-24 10 // P1-26 11 #define DIRECTORYNAME "/dev/GPIO-pwm" int main (int argc, char **argv){ int i; char charArray[1000]; int gpioNumber = 0; int pwm = 0; DIR *pDIR; struct dirent *pDirEnt; if (wiringPiSetup () == -1) return(-1) ; //Check if DIRECTORYNAME exists and create if not pDIR = opendir(DIRECTORYNAME); if(pDIR == NULL){ strcpy(charArray, "mkdir "); strcat(charArray, DIRECTORYNAME); system(charArray); //Grant write access to all users strcpy(charArray, "chmod a+w "); strcat(charArray, DIRECTORYNAME); system(charArray); } else{ closedir(pDIR); } while(1==1){//Infinite loop pDIR = opendir(DIRECTORYNAME); if(pDIR == NULL){ printf("opendir() failed !\n"); return(1); } pDirEnt = readdir(pDIR);//Read first directory entry while(pDirEnt != NULL){ if(strlen(pDirEnt->d_name) > 2){ //printf("%s\n", pDirEnt->d_name); strcpy(charArray, "rm -f "); strcat(charArray, DIRECTORYNAME); strcat(charArray, "/"); strcat(charArray, pDirEnt->d_name); system(charArray); int iOffset = 0; gpioNumber = -1; pwm = -1; for(i = 0; i < strlen(pDirEnt->d_name); i++){ charArray[i + 1 - iOffset] = '\0'; if(pDirEnt->d_name[i]!='-'){ charArray[i - iOffset] = pDirEnt->d_name[i]; } else{ charArray[i] = '\0'; iOffset = i + 1; //printf("charArray=%s\n", charArray); gpioNumber = atoi(charArray); } } //printf("charArray=%s\n", charArray); pwm = atoi(charArray); //printf("gpioNumber=%d, pwm=%d\n", gpioNumber, pwm); if(gpioNumber > -1 && gpioNumber < 18 && pwm > -1 && pwm < 201){ softPwmCreate(gpioNumber, pwm, 200); softPwmWrite(gpioNumber, pwm); } } pDirEnt = readdir(pDIR);//Read next directory entry } closedir(pDIR); sleep(1); }//while(1==1){//Infinite loop return 0 ; }