Download presentation
Presentation is loading. Please wait.
Published byShonda Harrison Modified 6년 전
1
컴퓨터정보공학과 권춘우 최신인터넷기술 - Buzzer, Serial 통신, 7 Segment LED - Analog 입력/출력 > LED 밝기 조절, 저항/전압 읽기
2
목차 부저(Buzzer) 울리기 : 부저, 멜로디 등 시리얼(RS-232C) 통신 가변 저항으로 LED밝기 조절하기 7 세그먼트(Seven Segmnet) LED 구동디지털
3
부저(Buzzer) 울리기 □ 일상생활에서 부저는 굉장히 광범위하게 사용되고 있다.
□ TV, 세탁기, 에어컨 등에서 Alarm음으로 사용되기도 하고 도난 경보기, 디지털 도어 록 등
4
부저(Buzzer) 울리기(p.69) □ 디지털 출력으로 부저 울리기
□ 1초에 한번씩 부저를 켰다(ON), 껐다(OFF)를 반복 한다.
5
부저(Buzzer) 울리기 - 배선도 D8
6
부저(Buzzer) 울리기 - 회로도
7
Tone : 음(音) 발생 tone(pin, frequency, duration)
(Syntax) tone(pin, frequency) tone(pin, frequency, duration) pin : tone을 발생하는 핀번호 frequency : tone 주파수(hertz) unsigned int duration : tone 폭(milliseconds)(optional)-unsigned long 지정 주파수 크기의 Square wave 발생 (50% duty cycle) Tone 폭 지정 가능 : 지정 않을 경우 noTone() 때 까지 파형은 계속 발생 핀은 Piezo buzzer 또는 Speaker에 연결되어 tone을 연주 한번에 한 개의 tone만 발생 가능 – 다른 핀에 tone이 연주되고 있을 경우 새로운 tone()은 영향을 주지 않음. 동일 핀에 tone이 연주될 경우 주파수를 설정함 31Hz 미만 tone은 생성 불가 여러 개 핀에 다른 높이(pitch)의 음을 연주하기 위해서는 다음 핀에 tone()을 연주하기 전에 notone()를 실행할 필요 있음 (Syntax) noTone(pin) pin : tone()에 의해 생성되는 square wave의 발생을 정지할 핀
8
부저(buzzer) 울리기(1) : p.71 int buzzer = 8; int freq = 440; 부저 음 주파수(Hz)
int duration = 1000; 부저 음 지속 시간(msec) void setup() { pinMode(buzzer, OUTPUT); } void loop() tone(buzzer, freq, duration); digitalWrite(buzzer, HIGH); // Buzzer on delay(1000); digitalWrite(buzzer, LOW); // Buzzer off
9
부저(buzzer) 울리기(2) : Melody()
int speakerPin = 8; int length = 15; // the number of notes char notes[] = "ccggaagffeeddc "; // a space represents a rest int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 }; int tempo = 300; void playTone(int tone, int duration) { for (long i = 0; i < duration * 1000L; i += tone * 2) { digitalWrite(speakerPin, HIGH); delayMicroseconds(tone); digitalWrite(speakerPin, LOW); } void playNote(char note, int duration) { char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; // play the tone corresponding to the note name for (int i = 0; i < 8; i++) { if (names[i] == note) { playTone(tones[i], duration); void setup() { pinMode(speakerPin, OUTPUT); } void loop() { for (int i = 0; i < length; i++) { if (notes[i] == ' ') { delay(beats[i] * tempo); // rest } else { playNote(notes[i], beats[i] * tempo); // pause between notes delay(tempo / 2);
10
부저(buzzer) 울리기(3) : Melody(도레미..)
int speakerPin = 8; int length = 18; // the number of notes char notes[] = "cdefgabC Cbagfedc "; // a space represents a rest int beats[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4 }; int tempo = 400; void playTone(int tone, int duration) { for (long i = 0; i < duration * 1000L; i += tone * 2) { digitalWrite(speakerPin, HIGH); delayMicroseconds(tone); digitalWrite(speakerPin, LOW); } void playNote(char note, int duration) { char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; // play the tone corresponding to the note name for (int i = 0; i < 8; i++) { if (names[i] == note) { playTone(tones[i], duration); void setup() { pinMode(speakerPin, OUTPUT); } void loop() { for (int i = 0; i < length; i++) { if (notes[i] == ' ') { delay(beats[i] * tempo); // rest } else { playNote(notes[i], beats[i] * tempo); // pause between notes delay(tempo / 2);
11
시리얼(RS-232C) 통신(p73)
12
시리얼(RS232) 통신 소개 □ RS232 통신은 주로 IBM 호환 PC에서 쓰이는 시리얼 통신방법
□ 아두이노는 보드에서 기본으로 제공하는 USB포트를 이용해서 RS232 통신 가능
13
아두이노 시리얼(RS232) 통신 포트 □ 아두이노 UNO R3의 가상 COM 포트 기능
14
아두이노 시리얼(RS232) 통신 포트 □ 아두이노 UNO R3와 PC의 USB 연결
15
아두이노 시리얼(RS232) 통신 포트 □ 아두이노는 보드에서 기본으로 제공하는 USB포트를 이용해서 RS232 통신 가능
16
PC와 시리얼(RS232) 통신하기 □ 아두이노에서는 RS232통신으로 데이터가 오기를 기다리고
재전송하는 실험 □ 아두이노 입장에서 생각해 보면 PC에서 데이터가 도착하는 것을 RX데이터 □ 아두이노 보드에서 PC로 데이터를 전송하는 것을 TX 데이터라고 한다.
17
PC와 시리얼(RS232) 통신하기 - 스케치 void setup() { Serial.begin(9600);
Serial.println(“Hellow Arduino”); } void loop() char read_data; if (Serial.available()) read_data = Serial.read(); Serial.print(read_data); delay(10);
18
PC와 시리얼(RS232) 통신하기 - 실행결과 아두이노 시리얼 모니터 실행
19
시리얼(RS232) 통신으로 LED 제어하기 □ RS232 통신을 이용해서 아두이노에 연결된 2개의 LED를 제어해 보자.
□ 아두이노 시리얼 모니터에서 “1” or “2” 를 입력 □ “1” 을 입력하면 파란색 LED를 토글 한다. □ “2” 을 입력하면 붉은색 LED를 토글 한다.
20
시리얼(RS232) 통신으로 LED 제어하기 - 배선도
21
시리얼(RS232) 통신으로 LED 제어하기 - 회로도
22
시리얼(RS232) 통신으로 LED 제어하기 - 스케치
int led1 = 7; int led2 = 6; int led1_status = LOW; // LED1 상태 int led2_status = LOW; // LED2 상태 void setup() { pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); digitalWrite(led1, LOW); digitalWrite(led2, LOW); Serial.begin(9600); }
23
시리얼(RS232) 통신으로 LED 제어하기 - 스케치
void loop() { char read_data; if (Serial.available()) read_data = Serial.read(); if( read_data == '1' && led1_status == LOW) digitalWrite(led1, HIGH); led1_status = HIGH; Serial.println("LED1 ON"); } else if( read_data == '1' && led1_status == HIGH ) digitalWrite(led1, LOW); led1_status = LOW; Serial.println("LED1 OFF");
24
시리얼(RS232) 통신으로 LED 제어하기 - 스케치
if( read_data == '2' && led2_status == LOW) { digitalWrite(led2, HIGH); led2_status = HIGH; Serial.println("LED2 ON"); } else if( read_data == '2' && led2_status == HIGH ) digitalWrite(led2, LOW); led2_status = LOW; Serial.println("LED1 OFF"); delay(10);
25
시리얼(RS232) 통신으로 LED 제어하기 - 실행결과
26
아날로그 입력과 출력(p.85)
27
아날로그 입력 □ ADC(Analog Digital Converter)라는 기능을 이용
신호로 변환하는 장치 □ ADC는 온도, 압력, 음성, 영상신호, 전압 등을 실생활에서 연 속적인 아날로그 신호를 측정하여 그 신호를 컴퓨터로 입력하고 디지털로 변환
28
가변 저항으로 LED밝기 조절하기(p.97) □ 가변 저항의 값을 읽어서 LED 의 밝기 조절하기 □ 가변저항이란 ?
□ 저항의 값이 고정되어 있지 않고 회전 스위치 등을 이용해서 임의의 저항값으로 변경 가능한 저항
29
가변 저항으로 LED밝기 조절하기 - 배선도 A0 D9
30
가변 저항으로 LED밝기 조절하기 - 배선도
31
가변 저항으로 LED밝기 조절하기 - 스케치 int sensorPin = A0; // select the input pin for the potentiometer int led = 9; // the pin that the LED is attached to void setup() { pinMode(led, OUTPUT); Serial.begin(9600); } void loop() int sensorValue = 0; sensorValue = analogRead(sensorPin); analogWrite(led, sensorValue); Serial.println(sensorValue); delay(10);
32
가변 저항으로 LED밝기 조절하기 - 실행결과
33
아날로그 입력으로 전압값 읽기(p.102) □ 아누이노의 아날로그 입력 기능을 이용
□ 아날로그 데이터를 Voltage 값으로 변환
34
아날로그 입력으로 전압값 읽기 - 배선도 A0 D9 3.3V
35
아날로그 입력으로 전압값 읽기 - 스케치 int sensorPin = A0; // select the input pin for the potentiometer int led = 9; // the pin that the LED is attached to void setup() { pinMode(led, OUTPUT); Serial.begin(9600); } void loop() int sensorValue = 0; float voltage = 0.0; sensorValue = analogRead(sensorPin); voltage = ((float)sensorValue/1023.0)*5.0; Serial.print(sensorValue); Serial.print(", "); Serial.println(voltage); analogWrite(led, sensorValue); delay(10);
36
아날로그 입력으로 전압값 읽기 - 실행결과
37
7 세그먼트(Seven Segmnet) LED 구동 (p.53)
7 Segment Common Anode FND (flexible numeric display)
38
7 세그먼트(Seven Segmnet) LED 구동
7 Segment Common Anode FND (flexible numeric display)
39
7 세그먼트(Seven Segmnet) LED 구동
#define SEG_START 11 // 시작 글자 모양 (11번) // 7 Segment FND의 각 Segment 지정 : led 불이 켜지는 숫자 지정 #define SEG_A // Segment a ******* #define SEG_B // Segment b f * * b #define SEG_C // Segment c * g * #define SEG_D // Segment d ******* #define SEG_E // Segment e e * * c #define SEG_F // Segment f * * #define SEG_G // Segment g ******* * h #define SEG_H // Segment h d void fnd(unsigned char n) { //display_number 함수를 지정 : 숫자모양 생성 switch (n) { case 0: // Number 0 digitalWrite(SEG_A, LOW); digitalWrite(SEG_B, LOW); digitalWrite(SEG_C, LOW); digitalWrite(SEG_D, LOW); digitalWrite(SEG_E, LOW); digitalWrite(SEG_F, LOW); digitalWrite(SEG_G, HIGH); digitalWrite(SEG_H, HIGH); break; case 1: // Number 1 digitalWrite(SEG_A, HIGH); digitalWrite(SEG_D, HIGH); digitalWrite(SEG_E, HIGH); digitalWrite(SEG_F, HIGH); case 2: // Number 2 digitalWrite(SEG_A, LOW); digitalWrite(SEG_B, LOW); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_D, LOW); digitalWrite(SEG_E, LOW); digitalWrite(SEG_F, HIGH); digitalWrite(SEG_G, LOW); digitalWrite(SEG_H, HIGH); break; case 3: // Number 3 digitalWrite(SEG_C, LOW); digitalWrite(SEG_E, HIGH); digitalWrite(SEG_F, HIGH ); case 4: // Number 4 digitalWrite(SEG_A, HIGH); digitalWrite(SEG_D, HIGH); digitalWrite(SEG_F, LOW );
40
7 세그먼트(Seven Segmnet) LED 구동
case 5: // Number 5 digitalWrite(SEG_A, LOW); digitalWrite(SEG_B, HIGH); digitalWrite(SEG_C, LOW); digitalWrite(SEG_D, LOW); digitalWrite(SEG_E, HIGH); digitalWrite(SEG_F, LOW); digitalWrite(SEG_G, LOW); digitalWrite(SEG_H, HIGH); break; case 6: // Number 6 digitalWrite(SEG_A, HIGH); digitalWrite(SEG_E, LOW); case 7: // Number 7 digitalWrite(SEG_B, LOW); digitalWrite(SEG_D, HIGH); digitalWrite(SEG_F, HIGH); digitalWrite(SEG_G, HIGH); case 8: // Number 8 digitalWrite(SEG_A, LOW); digitalWrite(SEG_B, LOW); digitalWrite(SEG_C, LOW); digitalWrite(SEG_D, LOW); digitalWrite(SEG_E, LOW); digitalWrite(SEG_F, LOW); digitalWrite(SEG_G, LOW); digitalWrite(SEG_H, HIGH); break; case 9: // Number 9 digitalWrite(SEG_D, HIGH); digitalWrite(SEG_E, HIGH); case 10: // POINT digitalWrite(SEG_A, HIGH); digitalWrite(SEG_B, HIGH); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_F, HIGH); digitalWrite(SEG_G, HIGH); digitalWrite(SEG_H, LOW);
41
7 세그먼트(Seven Segmnet) LED 구동
case 11: // MINUS digitalWrite(SEG_A, HIGH); digitalWrite(SEG_B, HIGH); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_D, HIGH); digitalWrite(SEG_E, HIGH); digitalWrite(SEG_F, HIGH); digitalWrite(SEG_G, LOW); digitalWrite(SEG_H, HIGH); break; case 12: // BLANK digitalWrite(SEG_G, HIGH); } void setup() { pinMode(SEG_A, OUTPUT); pinMode(SEG_B, OUTPUT); pinMode(SEG_C, OUTPUT); pinMode(SEG_D, OUTPUT); pinMode(SEG_E, OUTPUT); pinMode(SEG_F, OUTPUT); pinMode(SEG_G, OUTPUT); pinMode(SEG_H, OUTPUT); } void loop() { int i; fnd(SEG_START); //처음 시작은 가운데에만 빨간불을 켜 준다(11로 시작) delay(2000); for(i = 0; i<11; i++) fnd(i); delay(1000);
42
7 세그먼트(Seven Segmnet) LED 구동 (p.53)
7 Segment Common Anode FND (flexible numeric display)
43
감사합니다. Thank You !
Similar presentations