Arduinoライントレースロボット制作のつづきです。
今回は、ラインセンサー2個を使用したライントレースのセンサー基板を制作してライントレースができるようにします。
- Arduino NANO(互換品)
- フォトリフレクタLBR127HLD
- ユニバーサル基板
- 抵抗器
- 可変抵抗器
- XHコネクタ
フォトリフレクタ
フォトリフレクタは送信部と受信部が一体となったセンサーで、送信部から発光された光を物体が反射して、その反射した光を受信部のフォトトランジスタが受信するしくみです。「フォトセンサ」や「フォトインタラプタ」などと呼ばれることもあります。
上図「A」の場合(抵抗が電源側)、アナログピン接続点の電圧は電源電圧から抵抗の電圧を引いたものとなり、暗く電流が流れないとき(抵抗の電圧低下がない)は電源電圧となります。もっとも明るいときは、電源電圧-抵抗値x電流となります。
上図「B」の場合(抵抗がGND側)、アナログピン接続点の電圧は抵抗に発生した電圧と同じになり、暗く電流が流れないとき(抵抗の電圧低下がない)は0Vとなります。もっともあかるいときは、抵抗値x電流となります。
したがって、Aの場合は明るいほど電圧は低くなり、Bは明るいほど電圧が高くなります。Bの方が感覚的には分かりやすい気がしますが、配線などの関係もあると思いますので、違いを理解できていることが大事だと思います。
センサー基板
センサーの数は2個。フォトリフレクタは、いつもはRPR220を使ってるのですが、価格の安いLBR-127HLDとしました。抵抗値は手持ちの抵抗の中から、赤外線LEDは220Ω、フォトトランジスタは4.7KΩ + 10KΩ(可変抵抗)としました。
プログラム
#include
#define TACT1 6
#define PHASE1 2
#define ENABLE1 3
#define PHASE2 4
#define ENABLE2 5
#define LineLeft A6
#define LineRight A7
int LineLeftVal = 0;
int LineRightVal = 0;
int LeftWhite = 33;
int LeftBlack = 900;
int RightWhite = 31;
int RightBlack = 860;
int ThresholdLeft = (LeftWhite + LeftBlack) /2;
int ThresholdRight = (RightWhite + RightBlack) /2;
void setup() {
pinMode(TACT1, INPUT_PULLUP);
pinMode(PHASE1, OUTPUT);
pinMode(ENABLE1, OUTPUT);
pinMode(PHASE2, OUTPUT);
pinMode(ENABLE2, OUTPUT);
Serial.begin(9600);
while(digitalRead(TACT1) == HIGH) {
LineLeftVal = analogRead(LineLeft);
LineRightVal = analogRead(LineRight);
Serial.print("左ラインセンサー:");
Serial.println(LineLeftVal);
Serial.print("右ラインセンサー:");
Serial.println(LineRightVal);
}
}
void loop() {
LineLeftVal = analogRead(LineLeft);
LineRightVal = analogRead(LineRight);
if (LineLeftVal < ThresholdLeft) {
if (LineRightVal < ThresholdRight) {
digitalWrite(PHASE1, LOW);
analogWrite(ENABLE1, 100);
digitalWrite(PHASE2, LOW);
analogWrite(ENABLE2, 100);
}
else {
digitalWrite(PHASE1, LOW);
analogWrite(ENABLE1, 0);
digitalWrite(PHASE2, LOW);
analogWrite(ENABLE2, 100);
}
}
else {
if (LineRightVal < ThresholdRight) {
digitalWrite(PHASE1, LOW);
analogWrite(ENABLE1, 100);
digitalWrite(PHASE2, LOW);
analogWrite(ENABLE2, 0);
}
else {
digitalWrite(PHASE1, LOW);
analogWrite(ENABLE1, 0);
digitalWrite(PHASE2, LOW);
analogWrite(ENABLE2, 0);
}
}
}