DCモータ制御
GPIOライブラリヘッダファイル
/* gpio_control.h */ #ifndef __GPIO_CONTROL_H__ #define __GPIO_CONTROL_H__ typedef enum { E_GPIO_OUT, E_GPIO_IN } E_GPIO_DIRECTION; typedef enum { E_GPIO_1, E_GPIO_0 } E_GPIO_VALUE; typedef enum { E_GPIO_OK, E_GPIO_NG } E_GPIO_RESULT; E_GPIO_RESULT initGPIO(int num, E_GPIO_DIRECTION dir); E_GPIO_RESULT writeGPIO(int num, E_GPIO_VALUE value); E_GPIO_VALUE readGPIO(int num); #endif
GPIOライブラリソースファイル
/* gpio_control.c */ #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <time.h> #include <sys/time.h> #include "gpio_control.h" #define PRINTLINE printf("%s, %d\n", __FUNCTION__, __LINE__); //------------------------------ E_GPIO_RESULT initGPIO(int num, E_GPIO_DIRECTION dir) { char buff[32]; char path[64]; E_GPIO_RESULT ret; printf("%s : %d : %d\n", __FUNCTION__, num, dir); sprintf(buff, "%d", num); ret = writeValue("/sys/class/gpio/export", buff); if(dir == E_GPIO_OUT){ sprintf(buff, "out"); } else{ sprintf(buff, "in"); } sprintf(path, "/sys/class/gpio/gpio%d/direction", num); ret = writeValue(path, buff); return ret; } //------------------------------ E_GPIO_RESULT writeGPIO(int num, E_GPIO_VALUE value) { char buff[32]; char path[64]; E_GPIO_RESULT ret; printf("%s : %d : %d\n", __FUNCTION__, num, value); if(value == E_GPIO_1){ sprintf(buff, "1"); } else{ sprintf(buff, "0"); } sprintf(path, "/sys/class/gpio/gpio%d/value", num); ret = writeValue(path, buff); return ret; } //------------------------------ E_GPIO_VALUE readGPIO(int num) { char buff[32]; char path[64]; E_GPIO_VALUE ret; int n; printf("%s : %d\n", __FUNCTION__, num); sprintf(path, "/sys/class/gpio/gpio%d/value", num); ret = readValue(path, buff, 32); n = atoi(buff); if(n == 1){ ret = E_GPIO_1; } else{ ret = E_GPIO_0; } return ret; } //------------------------------ int writeValue(char *file, char *value) { int fd; int ret; printf("%s : %s : %s\n", __FUNCTION__, file, value); fd = open(file, O_WRONLY); if(fd < 0){ PRINTLINE perror("GPIO open error"); return -1; } ret = write(fd, value, strlen(value)); if(ret < 0){ PRINTLINE perror("GPIO write error"); return -1; } ret = close(fd); if(ret < 0){ PRINTLINE perror("GPIO close error"); return -1; } return 0; } //------------------------------ int readValue(char *file, char *buff, int length) { int fd; int ret; printf("%s : %s\n", __FUNCTION__, file); fd = open(file, O_RDONLY); if(fd < 0){ PRINTLINE perror("GPIO open error"); return -1; } ret = read(fd, buff, length); if(ret < 0){ PRINTLINE perror("GPIO read error"); return -1; } ret = close(fd); if(ret < 0){ PRINTLINE perror("GPIO close error"); return -1; } printf("%s : %s\n",file, buff); return 0; }
メインプログラム
モータドライバのIN1、IN2をGPIOの25、24に接続している。
キーボード上n,r,b,sで制御できるようにしている。
// exp_moterdrive.c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <time.h> #include <sys/time.h> #include "gpio_control.h" int md_init(void); int md_normal(void); int md_reverse(void); int md_stop(void); int md_brake(void); #define PRINTLINE printf("%s, %d\n", __FUNCTION__, __LINE__); //------------------------------ int main(void) { char c; PRINTLINE md_init(); md_stop(); printf("----------\n"); printf(" Enter n/r/b/s\n"); printf("----------\n"); while(1){ c = getchar(); switch(c){ case 'n': md_normal(); break; case 's': md_stop(); break; case 'r': md_reverse(); break; case 'b': md_brake(); break; default: printf("----------\n"); printf(" n : normal\n"); printf(" r : reverse\n"); printf(" b : brake\n"); printf(" s : stop\n"); printf("----------\n"); break; } } } //------------------------------ int md_init(void) { E_GPIO_RESULT ret; PRINTLINE ret = initGPIO(24, E_GPIO_OUT); ret = initGPIO(25, E_GPIO_OUT); } int md_normal(void) { E_GPIO_RESULT ret; PRINTLINE ret = writeGPIO(24, E_GPIO_0); ret = writeGPIO(25, E_GPIO_1); } int md_reverse(void) { E_GPIO_RESULT ret; PRINTLINE ret = writeGPIO(24, E_GPIO_1); ret = writeGPIO(25, E_GPIO_0); } int md_stop(void) { E_GPIO_RESULT ret; PRINTLINE ret = writeGPIO(24, E_GPIO_0); ret = writeGPIO(25, E_GPIO_0); } int md_brake(void) { E_GPIO_RESULT ret; PRINTLINE ret = writeGPIO(24, E_GPIO_1); ret = writeGPIO(25, E_GPIO_1); }