#11/12 아두이노 로봇 HowTo

2022. 11. 4. 00:32IT

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