티스토리 뷰

일전에 이런 포스트를 한 적이 있습니다.

2013/01/24 - [About RPi] - [Raspberry Pi] 버리다... Raspberry.


그때도 언급했던 내용이지만 제 라즈베리 파이는 램이 256MB만 있는 상태였기 때문에 GUI 환경에서 뭔가를 한다는 게 거의 불가능했습니다. 그래서 대부분의 작업을 콘솔창을 통해서 실습하고 있습니다. 이번에 한번 해본 내용은 Raspberry Quick Start 라는 책에 소개된 Memory Usage를 LED로 지시하는 작업입니다. 뭔가 들어보면 어려워 보일 수도 있지만, 지난 시간에 다뤘던 GPIO와 SSH 환경을 잘 조합해보면 사용량을 잘 확인할 수 있습니다. 물론 이 기회를 토대로 제가 가지고 있는 라즈베리 파이가 램이 얼마나 부족한 건지도 보여드릴 수 있겠네요.



일단 지난 포스트에선 간단히 하나의 GPIO 핀에다가 LED만 연결하고 깜빡깜빡하는 걸 했었는데 이번에는 3개를 사용해서 메모리가 30%이상 남았을 때는 녹색 LED가, 20% 이상 남았을 때는 노란색 LED, 그 이하일 경우에는 빨간 LED가 켜지게끔 할 겁니다. 



간단히 완성하면 다음과 같습니다. GPIO 핀은 순서대로 연결했습니다. 연결하는 핀 배열에 대해서는 이전 포스트를 보시면 될겁니다.그래서 앞에서 언급한 대로 연결하려면 노란색 LED를 GPIO2, 녹색은 GPIO3, 빨간 색은 GPIO4에 연결했습니다.


그런데 한가지 유의할 사항이 있습니다. 분명 그 포스트에서 사용한 WiringPi를 사용하면 첫번째 GPIO는 0번 1번 이런식으로 gpio 명령어에 붙여서 사용할 수 있다고 소개했었습니다. 그런데 4번 GPIO부터는 번호가 그 순서가 아닌 사전에 정의된 순서대로 gpio 명령어에 붙어야 조절이 가능했습니다. 이부분은 뒤에서 다시 언급하겠습니다. 


자 일단 저는 host에서 작업할 것이기 때문에 putty에서 ssh로 라즈베리파이에 접속하고, 따로 gpio라는 폴더를 만들었습니다.



만들어줘야 할 것은 memwatch라는 Shell Script 입니다. 이름이 거창하게 shell script이긴 한데 별 의미가 없습니다. 그냥 Shell에서 수행되는 명령어를 하나의 문서에 적어놓는 것입니다. 그래서 문서를 실행시키면 script안에 들은 코드들이 주르륵 실행되게 됩니다. 다만 연속적인 실행이 가능하고 조건 구문을 돌릴 수 있다는게 그냥 콘솔을 통해서 실행시키는 것과의 차이입니다. 

 참고로 지금 파일이름이 일반적인 문서색과 다르게 초록색으로 나타난 것을 볼 수 있습니다. 이 초록색으로 표현이 된건 실행이 가능한 파일이라는 의미입니다. 앞에 잠깐 파란색 파일명은 짐작하셨다시피 폴더라는 의미를 나타내고요. 


저는 vim 편집기를 사용해서 memwatch.sh 파일을 수정했습니다. 물론 초기에 라즈베리 파이에는 vi 편집기가 설치되어 있지만 저는 평소에 vim을 사용해서인지 vim을 더 쓰게 되더군요. 그렇다고 vim에 내장된 기능을 다 쓰는 건 아니지만 말입니다. 아무튼 vim이 설치되지 않은 분이라면 다음 명령어를 통해서 설치할 수 있습니다.


pi@raspberrypi ~$ sudo apt-get install vim


vim을 실행시키고 처음에 다음과 같이 적어줍니다.


일단 맨 처음에 들어간 줄은 이 Shell Script의 실행을  /bin/bash라는 경로 상에서 처리하겠다는 의미입니다. 당연한 이야기이겠지만 Script와 Text와의 차이는 컴퓨터가 이를 해석할 수 있느냐 없느냐입니다. Text는 그 문자 그대로 읽겠지만 Script는 다른 Source를 통해서 사전에 정의된 구문이 있으면 그걸 수행하는 일종의 링크가 걸려있기 때문에 다양한 작업을 할 수 있는 것이지요. 이 작업에서도 단순히 문자로써의 결과를 원하는 것이 아니기 때문에 위와 같이 작성해주게 됩니다. 궁금하신 분은 링크에서 왜 쓰는지에 대한 답을 찾을 수 있습니다.


두번째 정의되어 있는 부분이 각 LED에 연결되어 있는 핀 번호를 perdefine해 놓은 겁니다. 앞에서 잠깐 언급드렸다시피 wiringPi의 매핑이 잘 못된건지는 모르겠는데 아무튼 첫번째 와 두번째 GPIO만 0 1번으로 인식되고 그 다음부터는 GPIO 번호가 그 번호 그대로 인식됩니다.다시 정리하면 이렇다는 거지요.

 wiringPi.c 파일에 보면 다음과 같이 핀배열에 따른 번호가 언급되어 있습니다.


그래서 위 script에서도 각 번호를 위와 같이 정의했습니다. 물론 사용자가 원하는 대로 연결할 번호를 정의하셔도 됩니다. 


자 맨처음 정의해야 될 것은 gpio로 사용하기 위해서는 해당 핀에 대한 모드를 지정해줘야 하는 것데 당연히 LED로 출력하는 것이 목적이기 때문에 모든 핀들을 out으로 정의해줍니다.

 


이렇게 해놓으면 for 루프가 돌면서 해당 핀이 출력으로 설정되는 동시에 0이 들어가는 것을 확인할 수 있습니다. 앞에서 핀번호를 미리 지정한 이유도 여기에 있습니다.

이제 led를 켜기 위한 구문도 작성할 수 있겠지요. 다음과 같이 작성됩니다.



init_leds 밑에 있는 set_led가 led를 켜는 동작을 하는 함수가 됩니다. 논리도 간단합니다. 지난 포스트에서는 gpio -g read를 통해서 해당 핀에 들어있는 값을 읽어올 수 있다고 했었지요. 그래서 읽어온 뒤에 그 값이 1이 아닌 경우에는 if 조건문을 통해서 led를 초기화하고 1을 집어넣는 과정을 거친 겁니다. 

마지막으로 종료될 때의 함수도 필요하겠지요. shell을 종료시킬 때도 깔끔하게 종료되게끔 0을 return 해줘야 프로세스를 올바르게 종료시킬 수 있습니다. 



여기까지는 단순히 사용할 수 있는 함수에 대한 정의입니다. 앞에서 언급한 것처럼 이 포스트의 목적은 메모리의 사용량에 따라서 LED의 색상을 바꾸게 하는 겁니다. 그러면 이 Shell Script를 통해서 현재 사용할 수있는 메모리의 양을 알 수 있게끔 해야 정상적인 진행방향이 되겠지요. 일단 나가서 다음과 같이 콘솔창에서 확인해봅니다.



free 라는 명령어를 사용하면 total Memory / Used Memory / Free Memory 에 대한 결과를 얻어올 수 있습니다. 여기서 숫자를 잘 뽑아오면 우리가 원하는 답을 얻어올 수 있을 겁니다. 이 때 필요한 방법이 바로 Regular Expression, 우리말로 말하면 정규 표현이라는 것이고, Mem 영역에서 어떤 규칙을 파악하면 Total에 해당되는 값, free에 해당되는 값을 뽑아올 수 있게 됩니다. 이때 리눅스에서 간단히 정규 표현을 구현할 수 있는 명령어가 grep이라는 것입니다. 단어 뜻에서 나타나는 것처럼 해당 결과창에서 사용자가 원하는 단어를 잡아주는 역할을 합니다. 이 부분은 소스를 간단히 따오겠습니다.



이렇게 하면 available에는 total과 free의 비율을 백분율로 표현한 값이 들어가게 됩니다. 이 값을 조건식으로 활용하면 되겠지요.



조건식은 위와 같습니다. 맨처음 10 에 대한 le, 즉 10보다 작거나 같으면 Critical이라는 문구를 출력하고 빨간색 LED가 켜지게 합니다. 이때는 앞에서 정의한 set_led 함수를 사용할 수 있겠지요. 또 그 백분율이 30보다 작거나 같으면 Low 문구와 함께 노란색 LED가 켜지게 할 겁니다. 물론 정상이면 녹색 LED가 켜져야 하겠지요?

마지막으로 연속적으로 동작할 경우에는 사용자가 텀을 인식하지 못하므로 10ms만큼 sleep 하게 했습니다. 


이게 끝입니다. 생각보다 코드 길이도 길지 않고, 실제로 동작에 필요한 구문은 앞의 init_leds와 set_led입니다. 뭐 여러가지로 응용을 해볼 수도 있는 것이지요. 가령 온도 센서를 gpio에 연결하고 그 값에 따라서 LED의 색도 바뀌게 할 수 있는 것이고, 만약 그렇다면 그 구문에 대한 처리는 위의 while 구문에서 해주면 되겠지요. 

이렇게 하고 나가면 아마 파일 색깔이 그냥 회색으로 처리되어 있을겁니다. 이 shell script를 실행가능하게 하기 위해서는 chmod 명령어를 사용하면 됩니다.



그러면 아래와 같이 실행 명령어를 통해서 처리할 수 있게 됩니다.



자 이제 얼마나 제 라즈베리 파이가 GUI 환경에서 얼마나 힘들어 하는지를 보여드리겠습니다. 참고로 xming을 통해서 GUI도 보여집니다.



중간에 보면 아시겠지만 창이 열리는 것도 하나의 프로세스가 실행되는 동작이기 때문에 각각에 대해서 memory를 할당받습니다. 그렇게 되면 GUI를 구동시킬만한 시스템 memory가 부족해져서 전체적으로 동작이 느려지게 되는 것이지요. 그래서 제 생각에는 256MB 환경이라면 GUI는 조금 어렵겠다는 생각을 잠깐 해봅니다. 정말... 느립니다. 


아무튼 여기까지가 지난 포스트에서 다뤘던 gpio와 ssh , xming을 통해서 Memory Usage를 측정해볼 수 있는 예제였습니다.


댓글