Maraa 와 wiringPi 라이브러리로 라즈베리 파이에서 센서 제어해 보기
1. Mraa 라이브러리 설치
우선 mraa 라이브러리를 받아 보자
git clone https://github.com/intel-iot-devkit/mraa.git
cd mraa
mkdir build
cd build
cmake ..
make
sudo make install
어디에 복사 되었는 지는 알아두어야 할 듯…
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/include/mraa.h
-- Installing: /usr/local/include/mraa.hpp
-- Installing: /usr/local/include/mraa
-- Installing: /usr/local/include/mraa/pwm.h
-- Installing: /usr/local/include/mraa/spi.hpp
-- Installing: /usr/local/include/mraa/spi.h
-- Installing: /usr/local/include/mraa/uart.hpp
-- Installing: /usr/local/include/mraa/gpio.h
-- Installing: /usr/local/include/mraa/aio.hpp
-- Installing: /usr/local/include/mraa/common.hpp
-- Installing: /usr/local/include/mraa/i2c.hpp
-- Installing: /usr/local/include/mraa/uart.h
-- Installing: /usr/local/include/mraa/i2c.h
-- Installing: /usr/local/include/mraa/gpio.hpp
-- Installing: /usr/local/include/mraa/pwm.hpp
-- Installing: /usr/local/include/mraa/types.h
-- Installing: /usr/local/include/mraa/common.h
-- Installing: /usr/local/include/mraa/aio.h
-- Installing: /usr/local/include/mraa/types.hpp
-- Installing: /usr/local/lib/pkgconfig/mraa.pc
-- Installing: /usr/local/lib/arm-linux-gnueabihf/libmraa.so.0.8.0
-- Installing: /usr/local/lib/arm-linux-gnueabihf/libmraa.so.0
-- Installing: /usr/local/lib/arm-linux-gnueabihf/libmraa.so
그런 다음 프로그램 실행 시에 참조하는
shared object 로딩 때문에 LD_LIBRARY_PATH를 다음과 같이 잡았다.
export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/usr/local/lib/arm-linux-gnueabihf/
빌드와 컴파일이 다 되었으면 이 모듈이 제대로 잘 구동되는 지 여부를 테스트를 해보기로 하자.
/home/pi/build/mraa/examples 로 가서 테스트 파일 중에 눈에 보이는 파일인
blink-io.c 를 컴파일하고 구동 해보자
gcc –o blink-io blink-io.c -lmraa
Provide an int arg if you want to flash on something other than 8
MRAA Version: v0.8.0-18-g338feb2
Starting Blinking on IO8
Initialised pin8
MRAA: Invalid resource.
MRAA: Invalid resource.
MRAA: Invalid resource.
MRAA: Invalid resource.
MRAA: Invalid resource.
MRAA: Invalid resource.
^C
closing IO8 nicely
MRAA: Invalid resource.
아무런 오류 없이 시스템 출력을 찍는 것을 보니 잘 잡힌 것을 확인 해 볼 수 있다.
하지만 위의 내용으로 인해서 나중에 안 일이지만, root 즉 슈퍼유저 권한이 없어서 인지 실행이 되긴 하나 제대로 기능을 하지 않아서 root 사용자로 로그인 해서 프로그램을 테스트 하였다. – 무슨 문제인지 알아보아야 할 듯…
시그윈에서 먼저 테스트 하고 싶다면 우선 오류가 나서 nodejs를 설치 하여야 하는 것으로 보여서 nodejs를 설치하기 위해서 다음 사이트를 참고 하고 있다.
근데, 설치하면서 알게 된 일이지만, 이 프레임워크 자체가 이렇게 방대 하다는 것을 이제서야 알게 된 것 같다.
https://github.com/nodejs/node-v0.x-archive/wiki/Installation#building-on-cygwin
wget http://nodejs.org/dist/node-v0.4.12.tar.gz
tar xvfz node-v0.4.12.tar.gz
cd node-v0.4.12/
./configure
make
make install
테스트 해 본 결과 cygwin에서 무슨 이유인지 설치 되지 않는다. 안 해보는 것이 정신건강에 좋은 것으로….
여하튼 내 보드는 ARPI600 이라는 라즈베리 확장 보드 인데 이거랑 GPIO 핀이랑 어떤 연관 관계에 있는 지 잘 모르겠다. 여하튼 문서를 찾다가 찾은 문서 중에서 읽어 내려 가다 보니 wiringPi 라는 라이브러리를 설치하라고 하기에 다음과 같이 해보기로 한다.
https://www.google.co.kr/?gws_rd=ssl#q=arpi600+raspberry+pi+wiringPi
다음 사이트는 아마도 만든 사람 인듯
sudo apt-get update
sudo apt-get upgrade
소스코드를 git에서 얻는다.
git clone git://git.drogon.net/wiringPi
cd wiringPi
git pull origin
./build
제대로 설치되었는 지 여부를 확인 한다.
gpio –v
gpio readall
프로그래밍은
에서 참고해서 해보는 것으로…
다음 사이트에서 확인 된 ARPI 600 확장보드에 대해서 살펴보면
http://store.cutedigi.com/raspberry-pi-b-to-arduino-adapter-hat-for-raspberry-pi-b/
각각의 번호에 대한 설명은 다음과 같다.
Headers:
1. Arduino headers
2. ICSP Headers
3. Xbee headers
4. Sensors headers
5. Headers for Raspberry Pi B+
6. USB to UART headers
Components:
7. TLC1543: ADC chipset
8. PCF8563: RTC chipset
9. CP2102
10. 32.768KHz crystal: crystal for RTC
11. Power indicator LED
12. Xbee status LED
13. Reset buttons for Xbee and Arduino headers
14. EASYLINK button for Xbee
15. Cell battery socoket for RTC: CR1220
Jumper headers:
16. Reference voltage selection for TLC1543
17. Jumper for RTC
18. UART jumpers:
If P_RX->CP_TX and P_TX->CP_RX: USB TO UART connected to serial port of Raspberry Pi B+
If XB_RX->CP_TX and XB_TX->CP_RX: USB to UART connected to serial port of Xbee
If XB_RX->P_TX and XB_TX ->P_RX: serial port of Xbee connected to serial port of Raspberry Pi B+
19. ADC jumpers:
Short headers 2 and 3: The A0-A5 of Arduino are used for ADC inputs.
Short headers 1 and 2: The A0-A5 of Arduino are used for digital inputs.
20. I2C jumpers:
When installed, A4 and A5 of Arduno are used for I2C control pins (the ADC selection jumpers for A4 and A5 need to be left floating.)
21. SPI jumpers:
Short headers 1 and 2, D11-D13 of Arduino are used for SPI pins (by default).
Short headers 2 and 3, D11-D13 of Arduino are used for digital pins.
다음은 전체 크기에 대한 부분에 대한 설명 그림이기는 하나 오히려 더 선명하게 숫자를 볼 수 있어서 더 좋다.
매핑 테이블
MRAA Number
|
Physical Pin
|
Function
|
1
|
P1-01
|
3V3 VCC
|
2
|
P1-02
|
5V VCC
|
3
|
P1-03
|
I2C SDA
|
4
|
P1-04
|
5V VCC
|
5
|
P1-05
|
I2C SCL
|
6
|
P1-06
|
GND
|
7
|
P1-07
|
GPIO(PI03)
|
8
|
P1-08
|
UART4 TX
|
9
|
P1-09
|
GND
|
10
|
P1-10
|
UART4 RX
|
11
|
P1-11
|
GPIO(PI19)
|
12
|
P1-12
|
GPIO(PH02)
|
13
|
P1-13
|
GPIO(PI18)
|
14
|
P1-14
|
GND
|
15
|
P1-15
|
GPIO(PI17)
|
16
|
P1-16
|
GPIO(PH20)
|
17
|
P1-17
|
3V3 VCC
|
18
|
P1-18
|
GPIO(PH21)
|
19
|
P1-19
|
SPI MOSI
|
20
|
P1-20
|
GND
|
21
|
P1-21
|
SPI MISO
|
22
|
P1-22
|
GPIO(PI16)
|
23
|
P1-23
|
SPI SCL
|
24
|
P1-24
|
SPI CS0
|
25
|
P1-25
|
GND
|
26
|
P1-26
|
SPI CS1
|
1. Mraa 라이브러리 프로그래밍
그럼 위의 라이브러리 중에 Mraa로 프로그래밍을 해보도록 하자
우선 mraa를 사용하는 라이브러리를 작성해 본다. 사실 자바 파이썬 등 여러 인터페이스가 존재하나 라이브러리 자체는 C로 작성되어 있으므로 이것 저것 할 필요 없이 C로 작성해서 붙이는 것으로 한다.
코드를 보기 전에 다른 곳에서 나온 매핑 테이블 표를 한번 더 살펴 보면 다음과 같다. 라즈베리 파이의 확장 핀이 자세하게 잘 나와 있는 듯 하다.
프로그램은 사용자로부터 핀 번호와 LED ON/OFF 플래그를 전달 받아서 사용하도록 한다.
소스코드 :
#include "stdio.h"
#include "unistd.h"
#include "mraa.h"
#define DEFAULT_IOPIN 8
#define LED_OFF 0
#define LED_ON 1
static int iopin;
static int flag;
int main(int argc, char** argv)
{
mraa_result_t r = MRAA_SUCCESS;
iopin = DEFAULT_IOPIN;
flag = LED_OFF;
if (argc < 3) {
printf("Provide an int arg if you want to flash on something other than %d\n", DEFAULT_IOPIN);
} else {
iopin = strtol(argv[1], NULL, 10);
flag = strtol(argv[2], NULL, 10);
}
mraa_init();
fprintf(stdout, "MRAA Version: %s\nStarting Blinking on IO%d must be %s\n", mraa_get_version(), iopin, flag ? "ON" : "OFF");
mraa_gpio_context gpio;
gpio = mraa_gpio_init(iopin);
if(flag > 0)
{
r = mraa_gpio_write(gpio, LED_ON);
if (r != MRAA_SUCCESS) {
mraa_result_print(r);
} else {
printf("on\n");
}
}
else
{
r = mraa_gpio_write(gpio, LED_OFF);
if (r != MRAA_SUCCESS) {
mraa_result_print(r);
} else {
printf("on\n");
}
}
r = mraa_gpio_close(gpio);
if (r != MRAA_SUCCESS) {
mraa_result_print(r);
}
return r;
}
/*gcc -o gpio_write gpio_write.c -lmraa
-- You must obtain super user authority to work gpio module properly in the mraa module...
./gpio_write <port num> <on/off>
off has a value under zero ( <= 0), on otherwise.
./gpio_write 7 0*/
소스코드를 컴파일 하고 다음과 같이 실행하여 LED가 on/off를 실행 해 볼 수 있다.
회로의 구성은 다음과 같다.
LED가 없어서 Color 센서를 대신 사용한다.
- Color sensor 전체 모습
LED 구동용으로 사용하고 있기 때문에 상단에 “LED”, “VCC”, “GND” 만 사용 할 것이다.
- 라즈베리 파이와 ARPI600 확장보드 전체 사진
확장보드에 매핑 된 테이블은 위에서 설명 하였음.
- 전체연결모습
전체를 구성하면 다음과 같은 모습이 된다. 아직 color 센서가 무엇을 하는
센서인지는 모르겠고, 그냥 LED 용으로만 사용 하도록 한다.
- 회로 연결 모습
접지와 5V 용 전원 및 핀 7 번에 연결 한 모습
LED On/Off 상태
빌드 한 후에
./gpio_write 7 1
./gpio_write 7 0
을 번갈아 가며 실행 시키면 위와 같이 LED를 껏다 꼈다 할 수 있다.
2. wiringPi 프로그래밍
소스 코드 – wiringPi_write.c
소스 코드를 보니까 뭐 별다른 내용이 없어서 위의 소스 코드를 좀 고쳐서 사용해 보도록 한다. 대신 인터럽트 처리가 들어가면 좀 복잡해 지는 듯 하다. 제대로 이 컬러 센서를 만들어 보려면 인터럽트 처리가 필요 해 보이며, 첨부한 zip 파일 내에 소스가 존재하고 있다.
#include <stdio.h>
#include <wiringPi.h>
#define DEFAULT_IOPIN 8
#define LED_OFF 0
#define LED_ON 1
static int iopin;
static int flag;
int main(int argc, char** argv)
{
iopin = DEFAULT_IOPIN;
flag = LED_OFF;
if (argc < 3) {
printf("Provide an int arg if you want to flash on something other than %d\n", DEFAULT_IOPIN);
} else {
iopin = strtol(argv[1], NULL, 10);
flag = strtol(argv[2], NULL, 10);
}
wiringPiSetup () ;
fprintf(stdout, "Starting Blinking on IO%d must be %s\n", iopin, flag ? "ON" : "OFF");
pinMode (iopin, OUTPUT) ;
if(flag > 0)
{
digitalWrite(iopin, LED_ON);
fprintf(stdout, "LED ON\n");
}
else
{
digitalWrite(iopin, LED_OFF);
fprintf(stdout, "LED OFF\n");
}
return 0;
}
/*
gcc -o wiringPi_write wiringPi_write.c -lwiringPi
./wiringPi_write <port num> <on/off>
off has a value under zero ( <= 0), on otherwise.
./wiringPi_write 7 0
*/
프로그램 실행은 위와 같이 하면 된다.
빌드 한 후에
./wiringPi_write 7 1
./wiringPi_write 7 0
을 번갈아 가며 실행 시키면 위와 같이 LED를 껏다 꼈다 할 수 있다.
3. 마치면서.
Mraa 라이브러리나 wiringPi 라이브러리를 사용해서 LED 장치를 ON/OFF 시켜 보는 프로그램을 작성하여 보았다. 결국 코딩의 형태가 조금 다를 뿐이지 그렇게 큰 차이를 보이지는 않아 보이며, 이 라이브러리들이 여러가지 인터페이스 즉, 자바부터 스크립트 언어인 파이썬, nodeJS 등을 사용해서 프로그래밍을 할 수도 있다고 한다.
다음에는 이런 인터페이스 중에서 자바를 사용 해서 인터페이스를 만들어 보고 만들어진 인터페이스를 IoT 환경에 접목 시키는 것을 알아보도록 해야 겠다.
'프로그래밍' 카테고리의 다른 글
[Win32]현재 디렉토리 내 모든 파일 리스트 만들기 (1) | 2023.03.16 |
---|---|
sqlite + kyotocabinet 사용 (0) | 2023.03.15 |
개발하고 있는 웹페이지의 javascript 파일이 갱신 되지 않을때 (0) | 2023.03.12 |
MICROSOFT C Run-Time Win32 1 (2) | 2023.03.11 |
[JavaScript] URL 파라메터 얻기 (1) | 2023.03.10 |