2022-05-27 Arduino_13

2022. 5. 27. 21:08학부 강의/Arduino

LCD

 

 

LCD : Liquid Crystal Display

 

소자가 자체 발광하는 OLED와는 다르게 LCD는 화면 후면에 백라이트가 필요하다.

 

액정 디스플레이 - 위키백과, 우리 모두의 백과사전

 

액정 디스플레이 - 위키백과, 우리 모두의 백과사전

엘시디는 여기로 연결됩니다. 다른 뜻에 대해서는 LCD 문서를 참고하십시오. 반사형 TN(twisted nematic) LCD의 구조 빛을 편광으로 만들기 위한 수직 편광 필름 ITO 전극을 삽입한 유리 기판. 이 전극의

ko.wikipedia.org

 

액정이 전기 신호에 따라 빛을 차단하거나 통과시키는 방식

 


LCD 16X2

 

 

아두이노에서 16개 pin을 모두 제어하기가 힘들다.

 

그래서 I2C를 거쳐서 LCD를 제어할 수 있다.

 

I2C는 두 개의 신호선(SDA, SCL)으로 다수의 I2C 통신을 지원하는 디바이스와 데이터를 송/수신할 수 있는 직렬 통신 프로토콜이다.

  • SDA : Serial Data. 데이터를 주고받기 위한 선
  • SCL : Serail Clock. 타이밍을 동기화하기 위한 클럭 선

출처 : https://mickael-k.tistory.com/184

출처 : https://www.appskit.co.kr/single-post/2018/05/09/기술노트-통신i2c-통신이란

 

 

아두이노에서 I2C 통신을 위해서 연결하는 방식.

 

I2C LCD1602 GND VCC SDA SCL
아두이노 우노 GND 5V A4 A5

 

LiquidCrystal_I2C 라이브러리 사용해서 16x2 LCD를 제어할 수 있다.

 

  • I2C LCD 모듈의 제어 함수

 


아두이노 I2C LCD 제어

 

600

 

1. “Welcome to ARDUINO world!” 문자 출력

#include <LiquidCrystal_I2C.h>
// 16x2 size의 I2C LCD 객체 생성, 주소는 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
    lcd.init(); // initialize the LCD
    lcd.backlight(); // turn on the backlight
}

void loop()
{
    lcd.setCursor(0, 0); // position the cursor in row 0 and column 0
    lcd.print("Welcome to");
    lcd.setCursor(1,1);
    lcd.print("ARDUINO world !");
}

2. 커서 깜박임 제어

 

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{
    lcd.init();
    lcd.backlight();
}

void loop()
{
    lcd.print("Cursor Blick");
    lcd.cursor(); // 커서 보이기
    lcd.blink(); // 깜빡이기
    delay(3000);
    lcd.clear();
    lcd.print("Cursor Out");
    lcd.noBlink(); // 깜박임 정지
    delay(3000);
    lcd.clear();
    lcd.noCursor(); // 커서 감추기
    delay(3000);
    lcd.clear();
}

3. 문자열 깜박이기

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
    lcd.init();
    lcd.backlight();
}

void loop()
{
    lcd.print("Hello!");
    lcd.noDisplay();
    delay(1000);
    lcd.display();
    delay(1000);
    lcd.clear();
}

4. 문자열의 이동

 

#include <LiquidCrystal_I2C.h>
char array1[]="Hello, world!                        ";
char array2[]="Nice to meet you                     ";
int delayTime=500;
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{
    lcd.init();
    lcd.backlight();
}

void loop()
{
    lcd.setCursor(15,0);
    for (int posCnt1 = 0; posCnt1 < 29; posCnt1++)
    {
        lcd.scrollDisplayLeft();
        lcd.print(array1[posCnt1]);
        delay(delayTime);
    }
    lcd.clear();

    lcd.setCursor(15, 1);
    for (int posCnt2 = 0; posCnt2 < 33; posCnt2++)
    {
        lcd.scrollDisplayLeft();
        lcd.print(array2[posCnt2]);
        delay(delayTime);
    }
    lcd.clear();
}

 

5. 사용자 정의 문자 출력

  • 사용자 정의 문자를 생성하는 방법
    1. byte 이름[8] = { … }; ← 마지막 5 bit만 사용하는데 이를 16진수로 표현(4bit, 4bit)
    2. LiquidCrystal_I2C.createChar(n, 이름);

  • LCD 표시장치에 출력
    1. LiquidCrystal_I2C.write(byte(n));
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
byte char_00[8] = {0x00, 0x0E, 0x1B, 0x11, 0x11, 0x1B, 0x0E, 0x00}; // ᄋ 
byte char_01[8] = {0x08, 0x08, 0x08, 0x0E, 0x08, 0x08, 0x08, 0x08}; // ᅡ 
byte char_02[8] = {0x1F, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00}; // ᄃ 
byte char_12[8] = {0x1F, 0x04, 0x04, 0x04, 0x04, 0X00, 0X00, 0X00}; // ᅮ 
byte char_05[8] = {0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}; // ᅵ 
byte char_06[8] = {0x00, 0x10, 0x10, 0x10, 0x1E, 0x00, 0x00, 0x00}; // ᄂ 
byte char_16[8] = {0x04, 0x04, 0x04, 0x04, 0x1F, 0x00, 0x00, 0x00}; // ᅩ 
byte heart[8] = {0x00, 0x0A, 0x1F, 0x1F, 0x1F, 0x0E, 0x04, 0x00}; // 하트

void setup() 
{
lcd.init(); 
lcd.backlight(); 

// LCD 출력 문자는 8개까지만 생성 가능
// 정의된 문자 char_00(‘ᄋ’)을 0번 배열에 저장 
lcd.createChar(0, char_00); 
lcd.createChar(1, char_01);
lcd.createChar(2, char_02);
lcd.createChar(3, char_05);
lcd.createChar(4, char_06);
lcd.createChar(5, char_12);
lcd.createChar(6, char_16);
lcd.createChar(7, heart);
lcd.clear();
}

void loop() {
lcd.setCursor(0, 0); // 첫 번째 줄 첫 번째 칸으로 이동 
lcd.write(byte(7)); // 7번 배열에 저장된 heart 문자 출력 

lcd.setCursor(2, 0);
lcd.write(byte(0)); // ᄋ
lcd.setCursor(3, 0);
lcd.write(byte(1)); // ᅡ

lcd.setCursor(4, 0);
lcd.write(byte(2)); // ᄃ
lcd.setCursor(4, 1);
lcd.write(byte(5)); // ᅮ

lcd.setCursor(6, 0);
lcd.write(byte(0)); // ᄋ
lcd.setCursor(7, 0);
lcd.write(byte(3)); // ᅵ

lcd.setCursor(8, 0);
lcd.write(byte(4)); // ᄂ
lcd.setCursor(8, 1);
lcd.write(byte(6)); // ᅩ
}

6_1

 

#include <LiquidCrystal.h> 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() 
{
    lcd.begin(16, 2);
    lcd.print("Hello, Arduino!!"); 
}

void loop()
{ 
    lcd.setCursor(0, 1); 
    lcd.print("1234567890");
}

 


6_2

 

#include <LiquidCrystal.h> 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() 
{
lcd.begin(16, 2); 
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); 
    Serial.println(tempStr);

    delay(500); 
    lcd.clear();
}

모터

 

  • 플레밍의 왼손법칙에 따라 전기적 에너지를 운동에너지로 변환
  • 발전기(generator): 기계 에너지를 전기에너지로 변환 (같은 원리, 반대 동작)

참고 : http://www.hcmfa.com/customer/customer08.php?ptype=view&code=data_2&idx=5275


AC(Alternative Current) 모터

 

 

교류 전원을 사용하는 모터

 

고정자의 자계(자기장)와 회전자가 모두 회전

 

동기모터와 비동기 모터로 구분

 

그런가 보다…

 

  •  장점
    • 소음과 진동이 적음
    • 수명이 반영구적
    • 안정적인 성능
  • 단점
    • 속도와 방향 제어가 힘듦

DC(Direct Current) 모터

 

 

직류전원 사용

 

고정자(Stator)로 영구자석을 사용

 

전기자(회전자, Rotor)로 코일을 사용

 

전기자에 흐르는 전류의 방향을 전환시키면서 자력의 밀어내는 힘이나 끌어당기는 힘으로 회전력을 생성

 

  •  장점
    • 적당한 전력만 공급해주면 회전하므로 RC 자동차, 무선 조종용 장난감 등 여러 용도로 많이 사용
  • 단점
    • 전기를 끊으면 멈추게 되는데, 이때 관성에 의하여 정확한 정지 위치를 지정하기 어려움

스테퍼(스텝, Step) 모터

  • 회전각도를 입력 펄스의 수에 대응하여 만든 모터
  • 아날로그시계의 초침처럼 고유의 분할 각도가 있고 이 각도에 따라 단계적으로(step-by-step) 움직이는 모터
  • 스탭 모터는 360도 회전이 가능하며, 회전수, 정확한 각도, 방향 등을 제어해줄 수 있다.

서보(Servo) 모터

  • 정확한 위치 제어가 어려운 DC 모터의 단점을 극복하기 위하여 DC 모터에 귀환 회로를 추가하여 0° ~ 180°의 각도를 정밀하게 제어할 수 있는 모터

 

  • 주로 로봇 분야에서 관절이나 손과 같은 정밀함이 필요한 쪽으로 많은 사용

2022.05.02 - [학부 강의/Arduino] - 2022-05-02 Arduino_6

 

2022-05-02 Arduino_6

아날로그 온도센서 1초마다 아날로그 값을 가지는 온도 값을 받아와 섭씨온도로 출력하는 프로그램 int Pin=A0; //입력 핀 int reading; float tempC; void setup(){ Serial.begin(9600); } void loop(){ reading..

ramen4598.tistory.com


'학부 강의 > Arduino' 카테고리의 다른 글

2022-06-22 팀프로젝트_리듬스타  (0) 2022.06.22
2022-05-23 Arduino_12  (0) 2022.05.23
2022-05-21 Arduino_11  (0) 2022.05.21
2022-05-17 Arduino_10  (0) 2022.05.17
2022-05-12 Arduino_9  (0) 2022.05.12