다음 회로구성을 보면 디지털핀 7번은 오른쪽 더듬이와, 디지털핀 5번은 왼쪽 더듬이와 연결되어있다.
더듬이가 장애물이나 물체에 걸려 디지털 핀에 닿게 되면, 보드의 나사구멍(절연칠이 되어있지 않음)을 통해 전류가 GND로 흘러 회로가 작동한다.
더듬이의 기둥이 연결되어 있는 보드의 나사구멍 주변은 절연칠이 되어있지 않기 때문에(구리로 되어있음), 디지털 핀에 더듬이가 닿을 때 회로가 보드의 GND로 연결된다.
즉 더듬이가 스위치 역할을 하게된다.
void setup() {
// put your setup code here, to run once:
tone(4,3000, 1000);
delay(1000);
pinMode(7, INPUT);
pinMode(5, INPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print(digitalRead(5));
Serial.println(digitalRead(7));
delay(50);
}
디지털핀7(오른쪽 더듬이)과 디지털핀5(왼쪽 더듬이)
스위치(더듬이)가 떨어져 있는 경우
저항은 무한대가 되어 전류가 통하지 않는다.
이때 전압은 저항에 비례해서 나뉘게되는데, 10k는 0V, 무한대(스위치)에 5V가 걸리게 된다. 따라서 중간지점의 전압은 5V가 된다.
따라서 HIGH값, 1이 출력된다.
스위치(더듬이)가 이어져 있는 경우
저항은 0이 되고, 전압은 저항에 비례해서 나뉘기 때문에 10k는 5V, 아래부분엔 0V가 걸리게 된다. 따라서 중간지점의 전압은 0V가 된다.
void setup() {
// put your setup code here, to run once:
pinMode(7, INPUT);
pinMode(5, INPUT);
pinMode(8, OUTPUT);
pinMode(2, OUTPUT);
tone(4, 3000, 1000);
delay(1000);
Serial.begin(9600);
}
void loop(){
byte wLeft = digitalRead(5);
byte wRight = digitalRead(7);
if(wLeft == 0)
digitalWrite(8, HIGH);
else
digitalWrite(8, LOW);
if(wRight == 0)
digitalWrite(2, HIGH);
else
digitalWrite(2, LOW);
Serial.print(wLeft);
Serial.println(wRight);
delay(50);
}
#include <Servo.h> // Include servo library
Servo servoLeft; // Declare left and right servos
Servo servoRight;
void setup() // Built-in initialization block
{
pinMode(7, INPUT); // Set right whisker pin to input
pinMode(5, INPUT); // Set left whisker pin to input
pinMode(8, OUTPUT); // Left LED indicator -> output
pinMode(2, OUTPUT); // Right LED indicator -> output
tone(4, 3000, 1000); // Play tone for 1 second
delay(1000); // Delay to finish tone
servoLeft.attach(13); // Attach left signal to pin 13
servoRight.attach(12); // Attach right signal to pin 12
Serial.begin(9600); // Set serial data rate to 9600
}
void loop()
{
byte wLeft = digitalRead(5); // Copy left result to wLeft
byte wRight = digitalRead(7); // Copy right result to wRight
if(wLeft == 0) // If left whisker contact
{ digitalWrite(8, HIGH); // Left LED on
}
else // if no left whisker contact
{ digitalWrite(8, LOW); // Left LED off
}
if(wRight == 0) // If right whisker contact
{ digitalWrite(2, HIGH); // Right LED on
}
else // If no right whisker contact
{ digitalWrite(2, LOW); // Right LED off
}
if((wLeft == 0) && (wRight == 0)) // If both whiskers contact
{ backward(1000); // Back up 1 second
turnLeft(800); // Turn left about 120 degrees
}
else if(wLeft == 0) // If only left whisker contact
{ backward(1000); // Back up 1 second
turnRight(400); // Turn right about 60 degrees
}
else if(wRight == 0) // If only right whisker contact
{ backward(1000); // Back up 1 second
turnLeft(400); // Turn left about 60 degrees
}
else // Otherwise, no whisker contact
{ forward(350); // Forward 1/50 of a second
}
}
void forward(int time) // Forward function
{ servoLeft.writeMicroseconds(1700); // Left wheel counterclockwise
servoRight.writeMicroseconds(1300); // Right wheel clockwise
delay(time); // Maneuver for time ms
}
void turnLeft(int time) // Left turn function
{ servoLeft.writeMicroseconds(1300); // Left wheel clockwise
servoRight.writeMicroseconds(1300); // Right wheel clockwise
delay(time); // Maneuver for time ms
}
void turnRight(int time) // Right turn function
{ servoLeft.writeMicroseconds(1700); // Left wheel counterclockwise
servoRight.writeMicroseconds(1700); // Right wheel counterclockwise
delay(time); // Maneuver for time ms
}
void backward(int time) // Backward function
{ servoLeft.writeMicroseconds(1300); // Left wheel clockwise
servoRight.writeMicroseconds(1700); // Right wheel counterclockwise
delay(time); // Maneuver for time ms
}
처음엔 left, right 값이 (01) 아니면 (10) 이런식으로 값이 달라야 한다.
그리고, 두번째 반복엔 left, right값이 처음 값과 반대로 나와야 모서리의 조건이 성립한다.
ex)
10
01
10
01
...
01
10
01
10
...