Maraa 와 wiringPi 라이브러리로 라즈베리 파이에서 센서 제어해 보기

2023. 3. 13. 19:27프로그래밍

728x90

 

 

Maraa 와 wiringPi 라이브러리로 라즈베리 파이에서 센서 제어해 보기

Maraa 와 wiringPi 라이브러리로 라즈베리 파이에서 센서 제어해 보기 1. Mraa 라이브러리 설치 우선 mr...

blog.naver.com

 

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를 설치하기 위해서 다음 사이트를 참고 하고 있다.

근데, 설치하면서 알게 된 일이지만, 이 프레임워크 자체가 이렇게 방대 하다는 것을 이제서야 알게 된 것 같다.

 

http://finkle.tistory.com/91

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

 

다음 사이트는 아마도 만든 사람 인듯

http://wiringpi.com/download-and-install/

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
 

 

프로그래밍은

http://wiringpi.com/

에서 참고해서 해보는 것으로…

 

다음 사이트에서 확인 된 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 환경에 접목 시키는 것을 알아보도록 해야 겠다.

728x90