[아두이노] Relay Shield와 LCD Shield를 이용한 제어

김우경·2021년 4월 20일
0

아두이노

목록 보기
9/9

Relay 제어

Relay란?

  • 전자석의 원리를 이용해서 제어하고자 하는 외부 device의 power source가 다른 경우를 위한 switching 소자
  • 제어하려는 대상의 전압이 감당이 안되거나 AC면 relay를 사용한다.

동작 원리

  • coil에 전류를 흘리면 자석이 되는 성질을 이용
    -> 기계식 접점이 존재한다.
    <-> 기계식 접점을 없앤 SSR, 포토커플러
  • 코일이 전자석이 되었을때, 철판 당기기 -> 스위치의 접점 열거나 닫기
    -> 스위치의 debouncing 현상처럼 일종의 스파크가 다른 소자에 영향을 미칠 수 있다.

장점

  • 전기적으로 독립된 회로 제어 가능
    : 5V 저압으로 AC220V와 같은 고압 회로 ON/OFF 가능

단점

  • 동작 속도가 느림 -> 고속 switching이 불가능하다
  • 노이즈 발생
    : 접점이 닿는 순간 스파크가 발생해서 신호노이즈 발생
    -> 노이즈 억제를 위해 다이오드, 스파크킬러 사용
    -> 기계식 접점을 없앤 SSR, 포토커플러 사용

종류

  • 메커니컬 릴레이
  • 솔리드 스테이트 릴레이 (SSR)
  • 포토 MOS 릴레이

Relay Shield

  • 2개의 Relay로 구성
    -> Arduino UNO의 digital port 8번에 Relay 2, Arduino UNO의 digital port 7번에 Relay 1 연결
  • Arduino UNO의 Digital Port에 LOW 인가하면 -> ON
  • Arduino UNO의 Digital Port에 HIGH 인가하면 -> OFF

아두이노와 연결하기

Relay ON/OFF

void setup() {
  Serial.begin(9600);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  
  // 출력 초기화 
  digitalWrite(7,1);
  digitalWrite(8,1);
}

void loop() {
  delay(1000);
  // Relay ON
  digitalWrite(7,0);
  digitalWrite(8,0);
  
  delay(1000);
  // Relay OFF
  digitalWrite(7,1);
  digitalWrite(8,1);
  
}

-> 이렇게 Relay의 ON/OFF를 하면 기계식 접점이 딸깍 딸깍 하는 소리가 난다.

10초마다 껐다 켜기

int timer;
void setup() {
  Serial.begin(9600);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  
  // 출력 초기화 
  digitalWrite(7,1);
  digitalWrite(8,1);
}

void loop() {
  if (timer == 10) {
    digitalWrite(7, 0);
    Serial.println("Relay 1 is ON");
  } else if (timer == 20) {
    digitalWrite(8, 0);
    Serial.println("Relay 2 is ON");
  } else if (timer == 30) {
    digitalWrite(7,1);
    digitalWrite(8,1);
    Serial.println("Relay 1,2 are OFF");
  }
  timer += 1;
  delay(1000);
}

Text LCD 제어

Text LCD

  • 화면에 정해진 형태의 문자를 정해진 갯수만큼 표시할 수 있는 LCD 디스플레이 장치

  • LCD 표시부 + LCD 제어부

  • LCD 제어부안에는 명령/데이터 발생을 위한 2개의 레지스터, Busy Flag, Address Counter, 문자 발생 램, 문자 발생 롬, 데이터 표시 램으로 구성

  • 이미 존재하는 library를 활용한다. -> LiquidCrystal.h

표현 가능한 글자

LCD Shield

  • 2*16 character LCD
  • 4bits의 제어 -> Arduino UNO의 digital Port 5~8과 연결
  • LCD Shielddml RS는 아두이노의 10번, E는 9번 핀에 연결됨

아두이노와 연결하기


LiquidCrystal.h 헤더를 추가한다.
#include <LiquidCrystal.h>

Hello World 찍어보기

-> Arduino.cc > 예제 > liquiedCrystal을 참고한다.

#include <LiquidCrystal.h>
const int rs = 10, en = 9, d4 = 8, d5 = 7, d6 = 6, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  lcd.begin(16, 2);
  lcd.print("hello, world!");
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print("Timer: ");
  lcd.print(millis() / 1000);
}

timer 만들기

  • delay로
#include <LiquidCrystal.h>
const int rs = 10, en = 9, d4 = 8, d5 = 7, d6 = 6, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int timer;

void setup() {
  lcd.begin(16, 2);
  lcd.print("Timer: ");
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print(timer);

  timer += 1;
  delay(100);

  if (timer >= 999) {
    timer = 0;
  }
}
  • millis로
#include <LiquidCrystal.h>
const int rs = 10, en = 9, d4 = 8, d5 = 7, d6 = 6, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
unsigned long H, M, S, m;

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("Timer: ");
}

void loop() {
  lcd.setCursor(0, 1);
  unsigned long current = millis();
  unsigned long readTime = current/1000;

  m = current%1000;
  S = readTime%60;
  M = (readTime/60)%60;
  H = (readTime/(60*60))%24; 
  
  Serial.print(H);
  Serial.print(":");
  Serial.print(M);
  Serial.print(":");
  Serial.print(S);
  Serial.print(".");
  Serial.println(m);
  
  lcd.print(H);
  lcd.print(":");
  lcd.print(M);
  lcd.print(":");
  lcd.print(S);
  lcd.print(".");
  lcd.print(m);
  
}
profile
Hongik CE

0개의 댓글