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);
}