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 제어
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
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 |