2022. 11. 4. 00:32ㆍIT
LCD 모듈
LCD 모듈은 로봇의 주행 성능과는 무관하지만 차량의 상태 정보를 나타낼 수 있고 어렵지 않게 구현을 할 수 있어 택했다. 1602 Character LCD로 16개 문자를 두 줄에 표시할 수 있는 저렴한 LCD이다.
앞의 사진에서 보는 바와 같이 연결해야 할 핀들이 상당히 많다. 우리가 가진 디지털 핀들의 개수가 몇 개 안남았기 때문에 당장은 연결을 할 수 없는 상황이다. 하지만 I2C LCD Interface를 사용하면 문제를 해결할 수 있다.
라이브러리를 추가해야 한다. 이미 만들어진 라이브러리를 사용할 것이기 때문이다. 개발 환경에서 툴→ 라이브러리 관리를 선택해서 LiquidCrystal I2C를 설치한다.
I2C란?
IIC라고도 부르며 아이-스퀘어-씨로 읽는다. inter-Intergrated Circuit의 의미이며 양방향 2 와이어 직렬 버스다. 앞서 시리얼 통신과 비교해 보면 좋을 것 같다. 타이밍 동기화를 위한 선과 데이터 용 선, 이렇게 두 가닥의 선을 이용하고 최대 127개의 주변장치를 연결할 수 있다.
I2C LCD 모듈은 GND와 VCC이외에 두 개의 핀이 있다. 이 두 개의 핀을 이용해서 아두이노에서 LCD로 정보를 보내게 된다.
LCD 모듈과 I2C LCD 모듈을 잘 보고 구매를 했으면 방향만 맞춰서 꽂으면 쉬운데 둘다 핀만 나와 있는 모듈을 구매해서 만능기판을 이용해서 다음과 같이 연결을 했다.
I2C 모듈의 핀 반대쪽에 위치한 딥 스위치는 꽂아두면 LCD 백라이트를 켜는 것이고, 빼면 끄는 것이다. 그리고 켠 상태에서 핀 바로 다음에 있는 가변 저항을 이용해서 밝기를 조절할 수 있다. 처음에 너무 밝게 설정이 되어 있어서 문자가 출력이 안되는 줄 알았다. 따라서 아두이노와 L298N에 전원을 연결하고 나서 밝기를 적당하게 조절하고 시험을 하자.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
void setup(){
// 디버깅 메시지를 보기 위한 Serial 초기화
Serial.begin(9600);
//Serial.println("");
while(!Serial);
Wire.begin();
}
void loop(){
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknow error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000);
return;
// 기존의 코드
.
.
.
}
앞의 코드는 복잡해 보이지만 I2C 통신에서 필요한 I2C LCD 모듈의 주소를 파악하는 임시코드이다. 이 코드를 이용해서 주소를 파악해 보자. 주소는 시리얼 창에 나타난다.
#include <Servo.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// 0x27 I2C 주소를 가지고 있는 16x2 LCD객체를 생성합니다.(I2C 주소는 LCD에 맞게 수정해야 합니다.)
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
// 디버깅 메시지를 보기 위한 Serial 초기화
Serial.begin(9600);
//Serial.println("");
while(!Serial);
BT.begin(9600);
//Wire.begin();
// I2C LCD를 초기화 합니다..
lcd.init();
// I2C LCD의 백라이트를 켜줍니다.
lcd.backlight();
}
void loop(){
.
.
.
if(!Auto_Drive)
{
printLCD1("Manual mode");
switch(BT.read())
{
case 'a':
Serial.println("Stop Btn");
printLCD2("Stop");
Robot_Stop();
break;
.
.
.
}
기존의 loop 함수 내에 있는 코드들은 지우고 lcd를 setup에서 추가를 해 준다. 그리고 printLCD1,2 함수를 이용해서 첫 번째와 두 번째 라인에 메시지를 출력한다.
setCursor로 위치를 잡고, print 함수로 출력을 하는 것이 전부다.
void printLCD1(String str){
// 0번째 줄 0번째 셀부터 입력하게 합니다.
lcd.setCursor(0,0);
// 아래의 문장을 출력합니다.
lcd.print(str);
}
void printLCD2(String str){
// 1번째 줄 0번째 셀부터 입력하게 합니다.
lcd.setCursor(0,1);
// 아래의 문장을 출력합니다.
lcd.print(str);
}
'IT' 카테고리의 다른 글
[Python] PDF에서 정보 추출하기 (RPA) (1) | 2023.03.18 |
---|---|
#12/12 아두이노 로봇 HowTo (1) | 2022.11.04 |
#10/12 아두이노 로봇 HowTo (0) | 2022.11.04 |
#9/12 아두이노 로봇 HowTo (0) | 2022.11.04 |
#8/12 아두이노 로봇 HowTo (0) | 2022.11.04 |