[아두이노] 초음파 센서, 7세그먼트

mj·2021년 10월 9일
0

아두이노

목록 보기
3/5

1. 초음파 센서로 거리 측정

초음파 센서의 원리

: 초음파가 물체에 반사되어 돌아올 때까지의 '시간'을 측정

초음파의 속력(340m/s)은 정해져있으므로 거리를 알 수 있다.
거리 (m) = 속력(m/s) X 시간(s)

트리거 : 초음파 센서에서 초음파 신호를 발생시키는 장치
에코 : 초음파 신호를 수신하는 장치


에코는 물체에 반사되어 돌아오는 초음파 신호를 수신해 초음파 신호가 발생한 시점부터 수신한 시점까지의 시간을 마이크로초 단위로

1-1. 초음파 센서로 거리 측정

//결과 : 시리얼 모니터에 물체의 거리가 출력된다.
void setup()
{
  Serial.begin(9600); //시리얼 모니터를 사용하기 위해
}

void loop()
{
  pinMode(9, OUTPUT);
  digitalWrite(9, LOW);//off된 상태
  delayMicroseconds(2);
  digitalWrite(9, HIGH);//on
  delayMicroseconds(5);
  digitalWrite(9, LOW);//off
  //초음파 센서는 송신도 가능하고 수신도 가능하다.
  //송신했다가 수신했다가 하므로 pinMode를 setup에다 쓰지 않고 loop에 쓴다.
  
  pinMode(9, INPUT);
  double duration = pulseIn(9, HIGH);//9번 핀이 high를 유지한 시간을 저장
  double cm = duration * 340 / 10000 / 2; //HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.
  
  
  Serial.println(cm);
}



1-2. 물체 사이의 거리에 반응하는 LED 만들기

void setup()
{
  Serial.begin(9600);
  pinMode(3, OUTPUT);
}

void loop()
{
  pinMode(9, OUTPUT);
  //초음파 센서는 송신도 가능하고 수신도 가능하다.
  //송신했다가 수신했다가 하므로 pinMode를 setup에다 쓰지 않고 loop에
  digitalWrite(9, LOW);//off된 상태
  delayMicroseconds(2);
  
  digitalWrite(9, HIGH);//on
  delayMicroseconds(5);
  digitalWrite(9, LOW);//off
  
  pinMode(9, INPUT);
  double duration = pulseIn(9, HIGH);//9번 핀이 high를 유지한 시간을 저장
  double cm = duration *340/10000 /2; //HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.
  
  Serial.println(cm);
  
  //--------------------------------
  if(cm<200) { //거리가 200cm 미만일때
    digitalWrite(3, HIGH); //LED ON
  }else {
    digitalWrite(3, LOW); //LED OFF
  }
    
}

초음파 센서를 이용하여 물체 사이의 거리를 출력하는 LCD

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  lcd.begin(16, 2);
  
}

void loop() {
  lcd.clear();
  
  pinMode(9, OUTPUT);
  digitalWrite(9, LOW);
  delayMicroseconds(2);
  digitalWrite(9, HIGH);
  delayMicroseconds(5);
  digitalWrite(9, LOW);
  
  pinMode(9, INPUT);
  double duration = pulseIn(9, HIGH);
  double cm = duration * 340/1000/2;
  
  //--------------
  lcd.print(cm);
  delay(500);
  //lcd.clear(), delay() 안하면 거리값이 계속 쌓여서 출력되므로
}

2. 7 세그먼트로 숫자 표시하기

7세그먼트(seven-segment)란?

숫자나 문자를 표시하는 7개의 LED와 점을 표시하는 1개의 LED로 구성

- 공통 단자가 양극이면 LOW 신호
- 공통 단자가 음극이면 HIGH 신호

공통 단자가 양극이면 전원을 공통으로 사용하므로 7세그먼트의 각 단자에 LED 신호(LOW)를 줘야 LED가 켜지지만, 공통 단자가 음극이면 접지를 공통으로 사용하므로 각 단자에 High신호를 줘야 LED가 켜짐.


2-1. 7세그먼트로 숫자 표시하기

//기호상수
#define A 4
#define B 5
#define C 12
#define D 11
#define E 10
#define F 3
#define G 2
#define DP 13

void setup()
{
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(DP, OUTPUT);
  
}

void loop()
{
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
  digitalWrite(D, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(DP, HIGH);
}

2-2. 배열을 이용하여 숫자 표시하기

//결과 : 랜덤한 숫자가 깜빡거리며 계속 출력된다.

//기호상수
#define A 4
#define B 5
#define C 12
#define D 11
#define E 10
#define F 3
#define G 2
#define DP 13

int seven[] = {A, B, C, D, E, F, G, DP};

int number[10][8] = {
  //A, B, C, D, E, F, G, DP
  0, 0, 0, 0, 0, 0, 1, 1, //0
  1, 0, 0, 1, 1, 1, 1, 1, //1
  0, 0, 1, 0, 0, 1, 0, 1, //2
  0, 0, 0, 0, 1, 1, 0, 1, //3 
  1, 0, 0, 1, 1, 0, 0, 1, //4
  0, 1, 0, 0, 1, 0, 0, 1, //5
  0, 1, 0, 0, 0, 0, 0, 1, //6
  0, 0, 0, 1, 1, 1, 1, 1, //7
  0, 0, 0, 0, 0, 0, 0, 1, //8
  0, 0, 0, 1, 1, 0, 0, 1 //9
};

void setup()
{
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(DP, OUTPUT);
    
  randomSeed(analogRead(0)); //난수생성기 초기화
  
}

void loop()
{
  int n = random(0, 10);
  
  for (int i = 0; i < 8; i++){
    digitalWrite(seven[i], number[n][i]);
  }
  delay(100);

}



3. 7세그먼트 디코더

7세그먼트 디코더

7세그먼트로 숫자를 표현할 때 필요한 제어선을 7개에서 4개로 줄일 수 있는 장치

7세그먼트 디코더를 사용하는 이유 :
디지털 핀 너무 많이 사용됨 -> 다른 거 많이 못꽂음 -> 7세그먼트 디코더 등장
아두이노 우노에서는 0번~13번까지 총 14개의 디지털 핀이 있으므로 7세그먼트를 연결하면 핀이 6개밖에 남지 않기 때문에 7세그먼트 디코더를 사용하면 여분의 핀이 생기기 때문에 다른 모듈을 추가할 때 효율적이다.


- 단자

  • AIN, BIN, CIN, DIN : 아두이노 보드에 연결할 입력 단자 4개, 이 단자를 통해 아두이노로부터 입력값을 받아 7세그먼트의 출력을 제어

  • 7세그먼트 디코더를 테스트하기 위한 단자 : LT, BI, LE



회로도


2-1. 7세그먼트 디코더와 조합하기

//기호상수
#define A 3
#define B 6
#define C 5
#define D 4

int seven[] = {D, B, C, A};

int number[4][4] = {
  //A, B, C, D, E, F, G, DP
  0, 0, 0, 0, //0
  0, 0, 0, 1, //1
  0, 0, 1, 0, //2
  0, 0, 1, 1 //3
};

void setup()
{
  for(int i=0; i<4; i++){
    pinMode(seven[i], OUTPUT);
  }
  randomSeed(analogRead(0)); //난수생성기 초기화
}

void loop()
{
  int n = random(0, 4);
  
  for (int i = 0; i < 4; i++){
    digitalWrite(seven[i], number[n][i]);
  }
  delay(1000);

}
profile
일단 할 수 있는걸 하자.

0개의 댓글

관련 채용 정보