距離センサを使うロボットの命題としては迷路探索などがあります。有名なものとしてはマイクロマウスがありますね。
今回は距離センサとモータを連動させてみます。使う部品は以前紹介したシャープ製IR距離センサとFA130モータです。
距離センサをアナログ入力に、モータ回路をデジタル出力につなぎます。
近づくとゆっくりに、離れると速く動くようにプログラムします。
// 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)と速く回ります。
用途としてはいろいろありますが、モータの数とセンサの数を増やせば前出のマイクロマウスも作れますね。
