2022. 5. 27. 21:08ㆍ학부 강의/Arduino
LCD
LCD : Liquid Crystal Display
소자가 자체 발광하는 OLED와는 다르게 LCD는 화면 후면에 백라이트가 필요하다.
액정이 전기 신호에 따라 빛을 차단하거나 통과시키는 방식
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 제어
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. 사용자 정의 문자 출력
- 사용자 정의 문자를 생성하는 방법
byte 이름[8] = { … };
← 마지막 5 bit만 사용하는데 이를 16진수로 표현(4bit, 4bit)LiquidCrystal_I2C.createChar(n, 이름);
- LCD 표시장치에 출력
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) 모터
교류 전원을 사용하는 모터
고정자의 자계(자기장)와 회전자가 모두 회전
동기모터와 비동기 모터로 구분
- 동기모터 : https://cheungjae.tistory.com/3 → 회전자에 자석
- 비동기 모터 : https://cheungjae.tistory.com/4 → 회전자에 폐쇄회로
그런가 보다…
- 장점
- 소음과 진동이 적음
- 수명이 반영구적
- 안정적인 성능
- 단점
- 속도와 방향 제어가 힘듦
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
'학부 강의 > 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 |