공작소굴

 아두이노 프로젝트를 진행하다보면 '분명히 좀 전까지는 잘 됐는데 왜 갑자기 안되지?'라고 할 때가 100이면 100 발생합니다. 제 경우에는 처음에는 Undo (Ctrl + Z)를 하듯 살짝씩 건드려 보면서 해결해 보다가 안되면 결국 처음 부터 한 단계씩 모듈별로 테스트를 하고 통합하는 과정을 거치며 해결합니다.

 

개발 중에 잘 되던 동작이 안될 때, 전 이렇게 해결합니다. (농반진반)

 

개발 중에 잘 되던 동작이 안될 때 어떻게 하시나요?

 프로젝트를 진행하다 보면 별로 건드린 것도 없는데 잘 동작하던 녀석이 엉뚱하게 동작하거나, 아예 동작을 안하는 경우가 있습니다. 안 그런 적이 없죠. 개발자라면 누구나 한 번쯤은 겪어봤

mechacave.tistory.com

 

 이렇게 소프트웨어나 하드웨어 모듈을 점검할 때 유용하게 사용하는 것 중 하나가 바로 해당 모듈의 라이브러리에 딸린 기본 예제입니다.

 

 사족을 달자면, 초보 개발자도 아두이노를 쉽게 사용할 수 있는 이유 중 하나는 다양한 라이브러리가 있기 때문입니다. 저 또한 개발중에 필요한 기능을 구현하려다가 '혹시 누가 만들어 놓지 않았을까?' 하는 마음에 구글링을 해 보면 정말로 관련 라이브러리가 있는 경우가 많습니다.

 당연히 하드웨어 모듈(모터, LED, 음향, 센서 등)을 사용할 때에도 이미 개발업체에서 제공하는 아두이노 라이브러리를 사용하고 있구요. 개발자로서는 정말 감사한 일이죠.

 호의가 계속되면 권리인 줄 안다고, 아두이노 라이브러리가 없는 하드웨어 모듈을 보면 화가 나기도 합니다.

 

라이브러리의 예제 파일

 

 라이브러리에 포함된 예제 파일은 라이브러리 개발자들이 만든 설명서입니다.

 라이브러리의 활용방법에 대해 설명을 해 놓은 블로그 포스트들도 대부부분이 기본 예제들을 해석해 주고, 실제 구현한 결과를 보여주는 글들이지요.

 

 예제는 말씀드렸듯이 제품의 사용설명서와 같은데요, 여러분들은 제품 사용설명서를 어떻게 취급 하시나요? 처음 접하는 제품이라면 한 번은 꼼꼼히 읽어보게 되고, 비슷한 제품을 사용해 본 적이 있다면 대충 훑어보고 던져 버리겠죠? 물론 아예 처음부터 보지도 않는 사람들도 있습니다.

 라이브러리를 사용할 때도 마찬가지입니다. 만약 여러분이 사용법을 모르신다면 예제를 꼼꼼히 잘 살펴봐야겠죠?

 

예제 파일을 살펴보면 무엇을 알 수 있을까요?

 대표적으로 많이 사용되는 LCD 디스플레이 라이브러리를 함께 살펴보면서 예제 파일의 어느 부분에서 어떤 것들을 알아낼 수 있는지 알아보도록 하겠습니다.

 

 우선 가장 기본이 되는 예제를 고르는 것이 좋겠죠? 여러 개의 예제 파일 중에 'HelloWorld' 가 눈에 띄네요. 프로그래밍 언어를 배울 때, 화면에 'HelloWorld'라는 문구를 출력하는 것이 기초중의 기초이므로 예제들 중에서도 기초에 해당할 것 같네요.

 'Display' 도 화면에 무언가를 표시한다는 LCD의 기본에 충실한 제목이므로 충분히 선택 가능합니다.

 

 

주석 부분에서 알 수 있는 것

 예제 파일의 주석을 살펴보겠습니다. ( 영어지만 중요한 단어만 콕콕 짚어보면 되고, 번역기를 돌려도 좋습니다. ) 만약, 다른 사람들의 프로젝트에서는 잘 동작하는 것 같은데, 내 하드웨어 구성에서 안되는 것 같다면, 이 부분을 잘 살펴보는 것이 좋습니다.

 

▶ 주석 부분에서는

정상적인 동작이 가능한 실행 환경 (컨트롤러보드 타입, 신호레벨, 사용가능한 모듈 등) 과

컨트롤러(기본적으로는 아두이노 우노)와의 연결 방법

추가적으로 필요한 저항이나 커패시터 사양 등 주변 회로 등을 알 수 있습니다.

 

▶ 1. 이 예제가 정상적으로 동작하기 위한 실행환경 설명
// LiquidCrystal Library - Hello World
LCD 모듈 라이브러리 - Hello World 예제

// Demonstrates the use a 16x2 LCD display.
16x2 LCD (16칸 2줄짜리 LCD)에 시연함
// The LiquidCrystal library works with all LCD displays that are compatible with the Hitachi HD44780 driver.
히타치 HD44780 드라이버와 호환되는 LCD에서 동작한다.
// There are many of them out there, and you can usually tell them by the 16-pin interface.
여러종류가 있지만 보통 16개의 핀으로 제어되는 것들이다.

▶ 2. 예제의 실행 결과
// This sketch prints "Hello World!" to the LCD and shows the time.
"Hello World!"시간을 표시한다.

▶ 3. 하드웨어 연결 방법
// The circuit:
// * LCD RS pin to digital pin 12
// * LCD Enable pin to digital pin 11
// * LCD D4 pin to digital pin 5
// * LCD D5 pin to digital pin 4
// * LCD D6 pin to digital pin 3
// * LCD D7 pin to digital pin 2
// * LCD R/W pin to ground
// * LCD VSS pin to ground
// * LCD VCC pin to 5V * 10K resistor:   ▶ 주변 회로
// * ends to +5V and ground
// * wiper to LCD VO pin (pin 3)

▶ 4. 개발 연혁
// Library originally added 18 Apr 2008 by David A.
// Mellis library modified 5 Jul 2009 by Limor Fried (http://www.ladyada.net) example
// added 9 Jul 2009 by Tom Igoe
// modified 22 Nov 2010 by Tom Igoe
// modified 7 Nov 2016 by Arturo Guadalupi

// This example code is in the public domain.
// http://www.arduino.cc/en/Tutorial/LiquidCrystalHelloWorld

 

 모든 예제들이 위의 예와 같이 자세하게 설명되어 있지는 않습니다. 하지만 특이사항이나 주의사항 같은 경우는 주석으로 만들어 놓기 때문에 한 번 쯤은 훑어보시길 추천드립니다.

 

전처리와 setup() 에서 알 수 있는 것

▶ 전처리 과정과 setup() 함수에서는

라이브러리를 포함하는 방법이나

모듈의 객체를 생성하는 방법

모듈을 초기화 하는 방법 등을 알 수 있습니다.

 

// include the library code: 
▶ 라이브러리 코드를 삽입합니다. : 어떤 파일을 삽입해야 하는지 알 수 있습니다.    
#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
▶ LCD 객체를 생성하기 위해 연결해야 하는 아두이노 핀을 정의하고, 객체를 생성합니다.
객체 생성 방법을 알 수 있습니다.
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
     // set up the LCD's number of columns and rows:
     ▶ LCD를 사용하기 전에 행과 열의 개수를 인자로 사용하여 초기화 해 주어야 한다는 것을 알 수 있습니다.
     lcd.begin(16, 2);
     
     // Print a message to the LCD.
     ▶ LCD에 메시지를 출력할 때는 'lcd.print'라는 함수를 사용하고,
     ▶ 인자값으로 '문자열'이 와야 한다는 것을 알 수 있습니다.
     lcd.print("hello, world!");
}

 

 잘 찾아 보고 계시나요?

 

loop() 함수에서 알 수 있는 것

 전처리와 setup()으로 LCD를 사용할 준비를 마쳤다면, 실제로 하드웨어를 동작시키는 loop() 함수를 살펴볼까요?

 

 loop() 함수 에서는,

라이브러리에서 제공하는 기능(함수)들

함수 사용하는 방법을 알 수 있습니다.

번 외로 라이브러리 개발자가 그 기능을 구현하기 위해 사용한 알고리즘을 엿볼 수도 있습니다.

 

void loop() {
     // set the cursor to column 0, line 1
     // (note: line 1 is the second row, since counting begins with 0):
     ▶ LCD에서 커서의 위치를 0번째 열(column), 1번째 줄(line, row) 에 위치시키는 방법입니다.
     ▶ 주의사항으로, 1번째 라인이란 2번째 줄을 의미한다고 알려주고 있습니다. 0번 라인이 1번째 줄이죠.
     lcd.setCursor(0, 1);

     // print the number of seconds since reset:
     ▶ millis()라는 함수를 사용하여 프로그램이 리셋된 시점부터 지나온 시간을 출력하는 내용입니다.
     ▶ 'lcd.print' 라는 함수는 '문자열' 뿐만 아니라 '숫자'도 변환 없이 표시할 수 있다는 것을 알 수 있습니다.
     lcd.print(millis() / 1000);
}

 

 loop()를 살펴본 결과 커서의 위치를 정해주는 함수 setCursor()와 원하는 문자를 출력하게 해 주는 print() 함수가 있다는 것 알아냈습니다.

 만약 다른 함수들을 더 알고싶다면? 다른 예제들을 살펴보면 됩니다. 이미 기본적인 예제를 살펴봤기 때문에 다른 예제는 더 수월하게 살펴볼 수 있습빈다.

 

예제 실습하기

 자, 이제 막 예제를 살펴 본 여러분들은 무엇을 해야할까요?

 바로 실습입니다.

 

 실제로 구현을 해 보고, 되는지 안되는지를 파악해 봐야겠죠?

 아두이노와 빵판 LCD 모듈을 준비하고 점퍼선으로 예제에 적힌 대로 핀과 핀을 이어 줍니다.

 

LCD 회로 연결 (출처:arduino.cc)

 

 원하는 결과가 잘 나왔나요? 이 단계에서부터 안될 수도 있습니다.

 

핀을 잘못 연결했다거나

핀이 빠져 있었다거나

안 나오는 줄 알았더니 LCD의 밝기가 너무 어두워 안보였던 것일 수도 있고,

혹은 결과가 나왔는데 이게 제대로 나온건지 알 수 없을 수도 있습니다.

 

 문제는 3군데 중 한 군데 입니다.

 

1. 하드웨어 모듈 자체 : 다른 모듈이 있다면 교체해서 테스트 해 보면 됩니다.

2. 프로그램 코딩 : 예제이므로 틀릴 확률이 매우매우매우 낮습니다.(예제로 테스트를 하는 이유입니다.)

3. 하드웨어 연결 또는 세팅 : 핀연결이나 밝기조절, 저항용량 등 하드웨어적인 요소를 살펴봐야 합니다.

 

helloWorld 예제의 정상적인 결과 (출처:arduino.cc)

 

 여차 저차 다행히 문제가 해결되고 정상적인 결과가 나왔다면, 한 시름 내려 놓으셔도 됩니다. 일단 하드웨어 쪽은 정상적이라는 것은 확인했으니까요.

 

예제 수정하기

 이제 남은 것은 프로그램 코딩 부분입니다.

 지금부터는 내가 원하는 결과를 얻기위해 인자값들을 변경해 보는 시도가 필요합니다. 주의해야 할 점예제파일 원본을 수정해서는 안됩니다. 기준이 되는 원본은 놔 두고 복사본을 만들어 마음껏 수정해 보시길 바랍니다.

 

▶ lcd.print() 함수의 경우 인자값으로 문자열 외에 어떤 데이터형을 넣을 수 있는지 확인합니다.
▶ 다른 블로그나 전문자료를 찾아볼 수도 있지만, 실제 가능한지 확인하는 과정입니다.
▶ 내가 원하는 값을 표현할 수 없다면 다른 방법을 찾아야겠죠.

lcd.print("한글도되나요");   // 한글
lcd.print("!@#$%");     // 특수문자
lcd.print(3.9234);   // 소숫점
lcd.print("1234567890ABCDEFGHIJKLMN");   // 16칸이 넘는 문자열

▶ lcd.setCursor() 함수도 마찬가지로 인자값들을 알맞게 또는 넘치거나 모자라게 변경하면서 결과를 확인합니다.
▶ lcd.setCursor() 를 쓰지 않고 lcd.print() 를 하면 어떻게 되는지도 테스트 해 봅니다.

lcd.setCursor(1,1);
lcd.setCursor(1,2);
lcd.setCursor(10,0);

 

 이렇게 다양한 시도들을 내가 작성중인 프로그램에서 하는 것이 아니라 예제를 기반으로 테스트 한 뒤, 원하는 결과값이 나왔을 때 내 프로그램에 이식하는 방식으로 활용하시면 됩니다.

 

마무리

 라이브러리를 활용한 아두이노 개발은 마치 계산기를 이용해서 수학문제를 푸는 것과 같습니다.

 

 수학적인 지식(C언어, 납땜, 기본 입출력장치 제어)을 가지고 주어진 문제(프로젝트)를 풀 수 있는 방법(알고리즘)을 잘 생각해 내면, 실제로 문제를 풀이할 때는 계산기(라이브러리)를 가지고 풀어내면 되는 것입니다.

 우리는 매우 뛰어난 계산기를 가지고 있습니다. 구글링을 하면 언제든지 찾을 수 있죠. 이 계산기를 언제 어떻게 사용하는지를 잘 아는 것 개발자로서 꼭 필요한 능력이라고 생각합니다.

 

 계산기 사용법을 모를 때는 설명서(예제 파일)를 잘 읽어보세요~

 

 멋진 개발자가 되기를 꿈꾸며 포스팅을 마치도록 하겠습니다. 감사합니다.

 

 끝.

 

공유하기

facebook twitter kakaoTalk kakaostory naver band