: 초음파가 물체에 반사되어 돌아올 때까지의 '시간'을 측정
초음파의 속력(340m/s)은 정해져있으므로 거리를 알 수 있다.
거리 (m) = 속력(m/s) X 시간(s)
트리거 : 초음파 센서에서 초음파 신호를 발생시키는 장치
에코 : 초음파 신호를 수신하는 장치
에코는 물체에 반사되어 돌아오는 초음파 신호를 수신해 초음파 신호가 발생한 시점부터 수신한 시점까지의 시간을 마이크로초 단위로
//결과 : 시리얼 모니터에 물체의 거리가 출력된다.
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);
}
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
}
}
#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() 안하면 거리값이 계속 쌓여서 출력되므로
}
7세그먼트(seven-segment)란?
숫자나 문자를 표시하는 7개의 LED와 점을 표시하는 1개의 LED로 구성
- 공통 단자가 양극이면 LOW 신호
- 공통 단자가 음극이면 HIGH 신호
공통 단자가 양극이면 전원을 공통으로 사용하므로 7세그먼트의 각 단자에 LED 신호(LOW)를 줘야 LED가 켜지지만, 공통 단자가 음극이면 접지를 공통으로 사용하므로 각 단자에 High신호를 줘야 LED가 켜짐.
//기호상수
#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);
}
//결과 : 랜덤한 숫자가 깜빡거리며 계속 출력된다.
//기호상수
#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);
}
7세그먼트 디코더
7세그먼트로 숫자를 표현할 때 필요한 제어선을 7개에서 4개로 줄일 수 있는 장치
7세그먼트 디코더를 사용하는 이유 :
디지털 핀 너무 많이 사용됨 -> 다른 거 많이 못꽂음 -> 7세그먼트 디코더 등장
아두이노 우노에서는 0번~13번까지 총 14개의 디지털 핀이 있으므로 7세그먼트를 연결하면 핀이 6개밖에 남지 않기 때문에 7세그먼트 디코더를 사용하면 여분의 핀이 생기기 때문에 다른 모듈을 추가할 때 효율적이다.
- 단자
AIN, BIN, CIN, DIN : 아두이노 보드에 연결할 입력 단자 4개, 이 단자를 통해 아두이노로부터 입력값을 받아 7세그먼트의 출력을 제어
7세그먼트 디코더를 테스트하기 위한 단자 : LT, BI, LE
회로도
//기호상수
#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);
}