距離センサ+モータ

距離センサを使うロボットの命題としては迷路探索などがあります。有名なものとしてはマイクロマウスがありますね。
今回は距離センサとモータを連動させてみます。使う部品は以前紹介したシャープ製IR距離センサFA130モータです。

距離センサをアナログ入力に、モータ回路をデジタル出力につなぎます。

DSC01553

近づくとゆっくりに、離れると速く動くようにプログラムします。

 // Licence CC 0 ( Public Domain )
 #include 
#include 
#include 
#include 

#define MOTORPWM 1
#define MOTOROUT1 2
#define MOTOROUT2 3

#define SPIBUFFSIZE 256

unsigned char spidata[SPIBUFFSIZE];

int MCP3008Read(int channel){
  int spireturn,data;
  spidata[0]= 1;
  spidata[1]= (0x80 | channel << 4);
  spidata[2]= 0;
  spireturn = wiringPiSPIDataRW(0, spidata, SPIBUFFSIZE);
  data = ((spidata[1]&3) << 8 ) + spidata[2];
  return(data);

int main()
{
  int distance;
  int spiresult;

  if (-1 == wiringPiSPISetup(0,1000000))
    {
      printf("SPI setup error!");
      exit(1);
    }

  wiringPiSetup();

  pinMode(MOTOROUT1,OUTPUT);
  pinMode(MOTOROUT2,OUTPUT);
  pinMode(MOTORPWM,PWM_OUTPUT);

  digitalWrite(MOTOROUT1,0);
  digitalWrite(MOTOROUT2,0);
  pwmWrite(MOTORPWM,0);
while(1){
  spiresult=MCP3008Read(7);
  digitalWrite(MOTOROUT1,1);
  if(spiresult<40){
    distance = 7;
    pwmWrite(MOTORPWM,256);
  }else if(spiresult<50){
    distance = 6;
    pwmWrite(MOTORPWM,128);
  }else if(spiresult<70){
    distance= 5;
    pwmWrite(MOTORPWM,64);
  }else if(spiresult<110){
    distance = 4;
    pwmWrite(MOTORPWM,32);
  }else if(spiresult<190){
    distance = 3;
    pwmWrite(MOTORPWM,16);
  }else if(spiresult<350){
    distance = 2;
    pwmWrite(MOTORPWM,8);
  }else if(spiresult<670){
    distance = 1;
    pwmWrite(MOTORPWM,1);
  }else{
  distance = 0;
  pwmWrite(MOTORPWM,0);
  }
  printf("readspi : %d distance : %d\n", spiresult,distance);
  sleep (1);
  pwmWrite(MOTORPWM,0);
  }
}

近い(約5cm)とゆっくり、遠い(約50cm)と速く回ります。
用途としてはいろいろありますが、モータの数とセンサの数を増やせば前出のマイクロマウスも作れますね。

ブックマーク へのパーマリンク.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>