読者です 読者をやめる 読者になる 読者になる

つくったブログ

ぼくがつくったもの。

RPR220(フォトリフレクタ)とArduinoでモーターを制御する。

白か黒かで動きが変わる。

 
http://instagram.com/p/iLTH--hBNr/

 今回使っているRPR-220は光を発するLEDと反射した光を受けるトランジスタが組み合わさっている部品です。これを使うと目の前が白いか黒いかを判別することができます。Fritzingではちょうどいい部品がみつからなかったので適当に組み合わせています。


使ったもの

 ※こんなやつ↓
http://instagram.com/p/dqvPiVhBJ4/

 ※今はamazonでは品切れなので秋月電子のフォトリフレクタを紹介する。
  フォトリフレクタ(反射タイプ)LBR−127HLD(10個入): 半導体 秋月電子通商 電子部品 ネット通販

  • 330Ω抵抗×二個

 ※抵抗はいろいろ必要なので以下のリンクからごそっと買うのがいいかも。
 1/4W カーボン抵抗(Ω順): 特設ページ 秋月電子通商 電子部品 ネット通販

 ※10kΩ抵抗はArduinoをはじめようキットに二個入ってます。

回路図

f:id:kyokucho1989:20131221191331j:plain
モータードライバ(TA7291P)は欠けているほうから1番、2番と数えていくと以下のように接続します。

  • TA7291P(左)
1 GND
2 モーターA(+)
3 非接続
4 Pin12
5 Pin11
6 Pin6(PWM)
7 5V
8 電池(+)
9 非接続
10 モーターA(-)
  • TA7291P(右)
1 GND
2 モーターB(+)
3 非接続
4 Pin10
5 Pin9
6 Pin5(PWM)
7 5V
8 電池(+)
9 非接続
10 モーターB(-)

フォトリフレクタはこのように接続します。トランジスタ側に10kΩ、LED側には330Ωを。
http://instagram.com/p/iM_Un5hBDZ/



スケッチ

// センサに応じて左右のモーターを回転
const int motorA = 11;
const int motorB = 10;
const int PWM_motAB = 6;
const int motorC = 9;
const int motorD = 8;
const int PWM_motCD = 5;
// led 
const int ledA = 13;
const int ledB = 2;
// フォトトランジスタ
const int sensorA = 2;
const int sensorB = 3;
// センサから読み取った値(analog)
int valA = 0;
int valB = 0;
// 閾値
int alpha = 50;

void setup(){
  pinMode(motorA,OUTPUT); 
  pinMode(motorB,OUTPUT); 
  pinMode(motorC,OUTPUT); 
  pinMode(motorD,OUTPUT); 
  pinMode(PWM_motAB,OUTPUT); 
  pinMode(PWM_motCD,OUTPUT); 
  pinMode(ledA,OUTPUT); 
  pinMode(ledB,OUTPUT); 
  Serial.begin(9600); 
}

void loop(){
  //ledは常にONにしておく
  digitalWrite(ledA,HIGH);
  digitalWrite(ledB,HIGH);
  delay(10);
  valA = analogRead(sensorA);
  valB = analogRead(sensorB);
  //シリアルポートに読み取った値を表示させる
  Serial.print(valA);
  Serial.print(" ");
  Serial.println(valB);
  
  if (valA > alpha && valB > alpha){
    //左、右ともに白なら直進
    digitalWrite(motorA,HIGH);
    digitalWrite(motorB,LOW);
    analogWrite(PWM_motAB,100); 
    digitalWrite(motorC,HIGH);
    digitalWrite(motorD,LOW);
    analogWrite(PWM_motCD,100); 
  }else if(valA <= alpha && valB > alpha){
    //左が黒、右が白ならに左へ旋回
    digitalWrite(motorA,LOW);
    digitalWrite(motorB,LOW);
    digitalWrite(motorC,HIGH);
    digitalWrite(motorD,LOW);
    analogWrite(PWM_motCD,100); 
  }else if(valA > alpha && valB <= alpha){
    //左が白、右が黒ならに右へ旋回
    digitalWrite(motorA,HIGH);
    digitalWrite(motorB,LOW);
    analogWrite(PWM_motAB,100); 
    digitalWrite(motorC,LOW);
    digitalWrite(motorD,LOW);    
  }
  //モーターの動作を0.5秒つづける
  delay(500);
}
  • digitalピンの0番か1番を使うとエラーが出ることがあります。使うのはなるべく避けましょう。

おわりに

 曲がるジャンパーワイヤが足りなくなってきた。買い足そうかな。
 次はユニバーサルプレートの組み立てをやります。

みんなのArduino入門:基本キット

みんなのArduino入門:基本キット