1. 서보 모터(Servo Motor)
: DC 모터와 달리 속도와 각도를 모두 제어하는 모터,
RC카의 방향제어, 로봇의 관절 제어, 잠금잠치 열고 닫을때 등에 활용
2. 서보 모터를 사용하기 위해서는 라이브러리 사용 필요하다.
3. 09_03 서브모터
#include <Servo.h>
Servo myServo;
void setup()
{
// 아두이노의 디지털 9번 핀을 서보 모터 제어에 사용.
myServo.attach(9);
}
void loop()
{
// 서보 모터의 각도를 0 ~ 180도 까지 바꿈
for(int angle = 0; angle <= 180; angle++){
myServo.write(angle);
delay(100); // 0.1 초씩 지연.
}
}
4. 09_04 자동문
#include <Servo.h>
Servo myServo;
void setup()
{
// 아두이노의 디지털 9번 핀을 서보모터 제어에 사용
myServo.attach(9);
// PIR 센서의 값을 디지털 7번 핀에서 읽음
pinMode(7, INPUT);
}
void loop()
{
int detect = digitalRead(7);
if(detect == HIGH) {
myServo.write(90); // 모터각도 조절
delay(100);
} else {
myServo.write(0);
delay(100);
}
}
5. LCD (Liquid crystal display, 액정표시장치)
: LCD는 뒷면에 빛을 내는 백라이트(backlight)를 배치하고 앞면에 액정을 두어
전기 신호에 따라 빛을 차단하거나 통과하는 방식으로 문자나 숫자등을 표시하는 장치
6. LCD 배선 16개
1, 2) LED
: LCD에서 백라이트 사용하기 위한 단자,
음극(오른쪽 K, cathode), 양극(왼쪽 A, anode),
220Ω 저항 연결 필요
3, 4, 5, 6, 7, 8, 9, 10) DB0 ~ DB7
: 데이터나 명령어를 전송하는 단자
11) E(enable)
: 명령어를 실행하는 시점을 결정
LOW에서 HIGH로 변경되는 시점에 LCD를 초기화하거나 문자의 출력위치를 결정하는 커서(cursor)를 변경하는 등
스케치 코드로 작성한 명령을 LCD로 전송한 후 실행시키는 시점 결정
12) RW
: LCD의 값을 읽을지(read), 쓸지(write) 결정하는 단자,
HIGH 값으로 설정하면 LCD에 현재 출력된 값을 읽어올 수 있다,
LOW값으로 설정하면 LCD에 문자로 출력할 수 있다
13) RS(resistor select)
: LCD 에 명령어를 전달할지, 데이터를 전달할지 선택하는 스위치
LOW값을 쓰면 LCD의 환경설정을 바꿀수 있는 명령어 전송
HIGH값을 쓰면 LCD 에 출력할 데이터를 전송(디지털 값)
14) V0
: LCD 에 표시되는 문자의 밝기 제어,
V0에 입력할 값을 정하기 위해 가변저항의 와이퍼 단자에 연결
15) VCC : 전원 (5V)
16) GND : 접지
7. 10_01 LCD 문자열
** 저항 : 220Ω
#include <LiquidCrystal.h>
// LCD모듈 초기화
// 연결된 아두이노 핀 번호 초기화
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// RS, E, DB4 ~ DB7
void setup()
{
lcd.begin(16, 2); // 1602 LCD 모듈 설정
lcd.print("Hello, Arduion!!"); // 문자 출력12
}
void loop()
{
lcd.setCursor(0, 1); // 커서 위치 변경
lcd.print("1234567890"); // 출력
}
8. 10_02 LCD 온도값 LCD 출력
** 저항 : 220Ω
#include <LiquidCrystal.h>
// LCD모듈 초기화
// 연결된 아두이노 핀 번호 초기화
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// RS, E, DB4 ~ DB7
void setup()
{
lcd.begin(16, 2); // 1602 LCD 모듈 설정
Serial.begin(9600);
}
void loop()
{
int readValue = analogRead(A0); // 온도센서값 측정
float voltage = readValue * 5.0 / 1024.0; // 전압값 변환
float temperature = voltage * 100 - 50; // 온도값 변환
String tempStr = String(temperature); // 온도값 -> 문자열 변환
lcd.print("TEMP : " + tempStr); // LCD에 문자열 출력
Serial.println(tempStr); // 직렬 모니터에 문자열 출력
delay(500);
lcd.clear(); // lcd 초기화
}
9. 10_03 문자이동효과
** 저항 : 220Ω
#include <LiquidCrystal.h>
// LCD모듈 초기화
// 연결된 아두이노 핀 번호 초기화
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// RS, E, DB4 ~ DB7
void setup()
{
lcd.begin(16, 2); // 1602 LCD 모듈 설정
lcd.print("Hello, Arduion!!"); // 문자 출력12
}
void loop()
{
// 출력된 문자를 왼쪽으로 16칸 (문자열 길이)이동
for(int position = 0; position < 16; position++) {
lcd.scrollDisplayLeft();
delay(150);
}
// 출력된 문자를 오른쪽으로 32칸 이동 (문자열 길이 + LCD 가로 길이)
for(int position = 0; position < 32; position++) {
lcd.scrollDisplayRight();
delay(150);
}
// 출력된 문자를 왼쪽으로 16칸
for(int position = 0; position < 16; position++) {
lcd.scrollDisplayLeft();
delay(150);
}
}
10. 7 세그먼트(7 segment)
: 숫자나 문자를 표시하는 일곱 개의 LED와 점을 표시하는 한 개의 LED로 구성,
공통단자는 양극인 유형과 음극인 유형으로 나뉜다.
[공통단자가 양극(common - cathode type)]
: 전원을 공통으로 사용하므로 7 세그먼트의 각 단자에 LOW신호를 줘야 LED가 켜진다.
[공통단자가 음극(common - anode type)]
: 접지를 공통으로 사용하므로 각 단자에 HIGH 신호를 줘야 LED가 켜진다.
11. 11_01 7 세그먼트
** 7 세그먼트 : 음극
** 저항 : 220Ω
// 아두이노의 디지털 핀 - 7 세그먼트 연결
#define A 3
#define B 2
#define C 11
#define D 12
#define E 13
#define F 5
#define G 4
#define DP 10
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()
{
number0(); delay(1000);
number1(); delay(1000);
}
// 숫자 0 출력, LOW 출력, HIGH 꺼짐
void number0() {
digitalWrite(A,HIGH);
digitalWrite(B,HIGH);
digitalWrite(C,HIGH);
digitalWrite(D,HIGH);
digitalWrite(E,LOW);
digitalWrite(F,HIGH);
digitalWrite(G,LOW);
digitalWrite(DP,HIGH);
}
void number1() {
digitalWrite(A,LOW);
digitalWrite(B,LOW);
digitalWrite(C,LOW);
digitalWrite(D,LOW);
digitalWrite(E,LOW);
digitalWrite(F,HIGH);
digitalWrite(G,LOW);
digitalWrite(DP,HIGH);
}
12. 11_02 7 세그먼트(rev.)
** 7 세그먼트 : 양극
** 저항 : 220Ω
// 아두이노의 디지털 핀 - 7 세그먼트 연결
#define A 3
#define B 2
#define C 11
#define D 12
#define E 13
#define F 5
#define G 4
#define DP 10
int digit[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);
}
void loop()
{
for(int i = 0; i <= 9; i++) {
displayDigit(digit[i]); delay(1000);
}
}
// 7 세그먼트 숫자 표시 함수
void displayDigit(int* digit) {
digitalWrite(A, digit[0]);
digitalWrite(B, digit[1]);
digitalWrite(C, digit[2]);
digitalWrite(D, digit[3]);
digitalWrite(E, digit[4]);
digitalWrite(F, digit[5]);
digitalWrite(G, digit[6]);
digitalWrite(DP, digit[7]);
}
13. 11_03 7세그먼트 디코더
** 7 세그먼트 : 음극
** 저항 : 220Ω
// 아두이노 디지털 핀과 7 세그먼트 디코더 연결
// DIN CIN BIN AIN
int dataPin[4] = {7, 6, 5, 4};
int digit[10][4] = {
//DIN, CIN, BIN, AIN
0, 0, 0, 0, // 숫자 0을 표현
0, 0, 0, 1, // 숫자 1을 표현
0, 0, 1, 0, // 숫자 2를 표현
0, 0, 1, 1, // 숫자 3을 표현
0, 1, 0, 0, // 숫자 4를 표현
0, 1, 0, 1, // 숫자 5를 표현
0, 1, 1, 0, // 숫자 6을 표현
0, 1, 1, 1, // 숫자 7을 표현
1, 0, 0, 0, // 숫자 8을 표현
1, 0, 0, 1, // 숫자 9를 표현
};
void setup()
{
// 디코더와 연결된 디지털 핀을 출력모드로 설정
for(int i = 0; i < 4; i++) {
pinMode(dataPin[i], OUTPUT);
}
}
void loop()
{
// 0 ~ 9 까지 숫자 출력
for(int i = 0; i < 10; i++) {
displayDigit(dataPin, digit[i]);
delay(1000);
}
}
// 7 세그먼트 디코더로 숫자를 표시하는 함수
void displayDigit(int* dataPin, int* digit) {
for(int i = 0; i < 4; i++) {
digitalWrite(dataPin[i], digit[i]);
}
}
14. 적외선(IR, Infrared Ray)
: 붉은색 가시광성보다 파장이 길며, 가시광선 외 영역이기 때문에 사람의 눈으로는 볼 수 없다.
[어디에 주로 사용?] TV나 에어컨 등 가전 제품을 원격제어할때 주로 사용한다.
15. 리모컨은 적외선 신호를 전송하고 적외선 센서는 적외선 신호를 수신한다.
16. 적외선 리모컨에서 보내는 값
17. 12_01 리모컨 LDE 켜기
** 저항 : 220Ω
#include <IRremote.h>
IRrecv irrecv(8); // 8번 핀에 연결된 적외선 센서
decode_results results; // 수신된 적외선 신호를 저장할 변수
void setup()
{
irrecv.enableIRIn(); // 적외선 센서 활성화
pinMode(9, OUTPUT); // LED
Serial.begin(9600);
}
void loop()
{
// decode()
// 적외선 신호에 수신된 내용이 result에 담고
// '참' 리턴
if(irrecv.decode(&results)) {
// 적외선 신호 수신
Serial.println(results.value, HEX);
if(results.value == 0xFD30CF) { // '0'이 눌렸으면
digitalWrite(9, HIGH); // LED 켜기
} else {
digitalWrite(9, LOW); // LED 끄기
}
delay(30);
irrecv.resume(); // 다음 신호를 받을 수 있도록 센서를 다시 준비
}
}
18. 12_02 적외선제어 무드등
** 저항 : 220Ω
#include <IRremote.h>
const int RED_FIN = 11;
const int GREEN_FIN = 9;
const int BLUE_FIN = 10;
unsigned long lastValue = 0; // 적외선 센서가 마지막으로 수신한 신호값 저장
IRrecv irrecv(8); // 8번 핀에 연결된 적외선 센서
decode_results results; // 수신된 적외선 신호를 저장할 변수
void setup()
{
irrecv.enableIRIn(); // 적외선 센서 활성화
pinMode(RED_FIN, OUTPUT);
pinMode(GREEN_FIN, OUTPUT);
pinMode(BLUE_FIN, OUTPUT);
}
void loop()
{
// decode()
// 적외선 신호에 수신된 내용이 result에 담고
// '참' 리턴
if(irrecv.decode(&results)) {
// 적외선 신호 수신
Serial.println(results.value, HEX);
if(results.value == 0xFFFFFF) { // 적외선 센서가 반복 신호를 받았을때
// 마지막 신호가 담긴 lastValue 사용
results.value = lastValue;
}
if(results.value == 0xFD08F7) { // 숫자 1 눌렀을때
// HOTPINK 색 출력
printRGB(255, 105, 180);
} else if(results.value == 0xFD8877) { // 숫자 2 눌렀을때
// AQUA 색 출력
printRGB(0, 255, 255);
} else if(results.value == 0xFD48B7) { // 숫자 3 눌렀을때
// GREEN 색 출력
printRGB(0, 255, 0);
} else {
// LED 끄기
printRGB(0, 0, 0);
}
delay(30);
lastValue = results.value;
irrecv.resume(); // 다음 신호를 받을 수 있도록 센서를 다시 준비
}
}
void printRGB(int red, int green, int blue) {
analogWrite(RED_FIN, red);
analogWrite(GREEN_FIN, green);
analogWrite(BLUE_FIN, blue);
}
'웹_프론트_백엔드 > JAVA프레임윅기반_풀스택' 카테고리의 다른 글
Spring Team Project(2020.07.15 ~ 2020.08.05) (0) | 2020.08.05 |
---|---|
디바이스_애플리케이션_구현 시험(아두이노 프로젝트) (0) | 2020.07.14 |
2020.07.10 (0) | 2020.07.10 |
2020.07.09 (0) | 2020.07.09 |
2020.07.08 (0) | 2020.07.08 |