Lecture | [IoT] Week04

Yoonsik·2022년 10월 4일
0

더듬이 와이어를 이용한 더듬이 로봇


다음 회로구성을 보면 디지털핀 7번은 오른쪽 더듬이와, 디지털핀 5번은 왼쪽 더듬이와 연결되어있다.
더듬이가 장애물이나 물체에 걸려 디지털 핀에 닿게 되면, 보드의 나사구멍(절연칠이 되어있지 않음)을 통해 전류가 GND로 흘러 회로가 작동한다.

더듬이의 기둥이 연결되어 있는 보드의 나사구멍 주변은 절연칠이 되어있지 않기 때문에(구리로 되어있음), 디지털 핀에 더듬이가 닿을 때 회로가 보드의 GND로 연결된다.
즉 더듬이가 스위치 역할을 하게된다.

더듬이(스위치의 작동)

  • 더듬이가 떨어지게 되면 PIN에 5V(HIGH)가 입력된다.
  • 더듬이가 연결되면 PIN에 0V(LOW)가 입력된다.

더듬이와이어 테스트 프로그램

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);
}

더듬이 와이어를 이용한 모터 제어

pro01

#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
...

profile
꾸준함의 힘

0개의 댓글