티스토리 뷰

Arduino

[Netduino] LCD Control

생각많은 소심남 2012. 9. 4. 00:23

이전 포스트에서는 아두이노와 lcd를 결합해서 동작하는 것에 대한 내용을 다뤘습니다. 그걸 쓰고나서 문득 든 생각이 

"아! 아두이노에서도 되는데 넷두이노에서는 안될까?"

였습니다. 그래서 열심히 찾았고 어떻게 보면 정말 초보자 같고 요령을 잘 모르지만 넷두이노에서도 lcd를 사용하는 방법에 대해서 다뤄보겠습니다. 배선도는 아두이노와 같습니다. 모르시는 분은 이전 포스트를 참고하시기 바랍니다.

2012/09/02 - [About Arduino] - [Arduino] LCD Control


자 아두이노야 기본적으로 제공되는 헤더파일이 있고 넷두이노에서도 해당 기기를 사용하기 위해서는 라이브러리 라던가 해당 기기를 정의해놓은 클래스가 필요합니다. 외국에서는 누군가가 이에 대한 프로젝트를 만들어서 codeplex에 공유해놓았습니다.  그래서 그걸 그대로 받아오겠습니다. 자 홈페이지(http://microliquidcrystal.codeplex.com/)에 들어가면 다음과 같이 뜹니다.



여기서 다운로드를 누르면 압축파일이 나오는데 그것이 lcd를 정의해놓은 프로젝트입니다. 거기에 예제 파일도 들어있으니까 넷두이노로 lcd를 활용하실 분은 한번 해보시면 좋을 것 같습니다. 


자 기본적인 준비물은 다 준비가 되었고 프로젝트로 들어가겠습니다. 코드 자체는 아두이노 코드와 거의 동일한데 환경설정이 쪼금 복잡합니다. 우선 netduino 프로젝트를 생성하고 아까 압축을 푼 프로젝트를 추가시킵니다. 


정상적으로 프로젝트가 추가되었다면 Solution Explorer에는 다음과 같이 두개의 프로젝트가 생성될 겁니다.



이중에서 지금 방금 추가시킨 것이 LC 라는 프로젝트이고 lcdTest프로젝트는 사용자가 생성한 프로젝트입니다. 이제 할 작업은 LC프로젝트에 있는 폴더와 클래스 파일을 전부 복사해서 원래 프로젝트인 lcdTest로 옮기는 겁니다. 그 후에 LC 프로젝트는 제거시켜 줍니다. 그러면 Solution Explorer에는 사용자가 만든 lcdTest만 남아있겠지요. 



여기서 직접 코딩을 하는 것은 Program.cs 파일이고 나머지는 다운로드 받은 프로젝트에서 옮겨온 클래스 파일입니다. 그런데 사실 이걸 그대로 사용하고 집어넣으면 오류가 무수하게 뜰겁니다. c# 코드를 아시는 분이라면 클래스의 개념에 대해서 아실 것이고 그걸 고려하면 문득 생각나는게 있을겁니다. 바로 이거지요.



기존 프로젝트에서 그냥 옮겨온 형태이기 때문에 네임스페이스가 이전 프로젝트 이름으로 되어 있습니다. 이걸 현재의 lcdTest에서 사용하기 위해서는 당연히 그걸로 다 바꿔줘야되겠지요. 



참고로 FusionWare.SPOT에 들어있는 클래스는 이미 FusionWare로 정의되어 있기 때문에 바꿀 필요가 없습니다. 폴더안에 들어있는 것들을 제외한 모든 것의 네임스페이스를 바꿔줬다면 이제 본격적으로 Program.cs 파일을 작성해야 합니다.

참고로 저는 잘 모르겠는데 MCP23008 I2C port expander 라는 것을 사용하는 분은 반드시 FusionWare를 using 지시자로 포함시켜주시기 바랍니다. 전체적인 코드 구성은 앞에서 소개했다시피 아두이노와 거의 똑같습니다.



우선 위 코드는 기존 아두이노에선 setup에서 진행되었던 핀배열입니다. 넷두이노도 아두이노의 구조를 차용해왔기 때문에 핀배열이 똑같습니다. 역시 RS와 Enable에 신호를 주면서 Digital핀으로 데이터를 넘겨주는 형식이 되는 것이지요. 그리고 그렇게 핀 배열이 지정되면 그걸 Lcd로 정의되어 있는 메서드에 집어넣어줍니다. 이건 우리가 이전에 수정했던 Lcd.cs 파일속에 있겠지요.


역시 내부를 보면 4bit으로 데이터를 전달하겠느냐 8bit으로 전달하겠느냐에 따라서 displayfunction이 바뀌는 것을 확인할 수 있습니다. 그다음은 아두이노와 같습니다.


이전에 소개해드린대로 저는 lcd를 16x2 캐릭터lcd를 사용하기 때문에 그걸로 초기화하고 원하는 문구를 띄워놓았습니다.

while 구문은 이전의 loop에서 했던 역할과 동일합니다. 다만 loop는 매 순간 갱신이 되는거지만 지금은 그냥 루프안에 있는 것이기 때문에 순환주기가 매우 빠릅니다. 그래서 Thread에 포함되어 있는 sleep 속성을 사용해서 매초마다 쓰는게 갱신되게끔 해놓습니다. 결과는 다음과 같습니다.



물론 contrast도 가변저항을 통해서 조절할 수 있고 backlight도 켰다 클 수 있습니다. 

사실 넷두이노의 자료가 우리나라에는 거의 전무하고 외국도 아두이노 프로젝트는 정말로 많은데 비해서 넷두이노는 진짜 가뭄에 콩나듯이 하나하나 나옵니다. 그래도 찾아보면서 직접 구현해보면고 재미를 느낍니다. 시간이 닿는대로 외국에 있는 넷두이노 자료를 전달해보고자 합니다.


참. 저보다도 이걸 더 잘 쓰실 분이 계실겁니다. 저렇게 프로젝트를 옮기는거나.. 저한테 방법좀 알려주시면 감사하겠습니다.

   

댓글