Level : WORDPRESS BOOK LINKEDIN PATENT Send Mail 동냥하기 hajunho.com


GPIO 제어를 위해 WiringPI library를 이용합니다. WiringPI는 Broadcom의 BCM2835, BCM2836, BCM2837 칩을 위한 라이브러리입니다.

http://wiringpi.com/




브로드컴의 BCM 시리즈 칩은 다음과 같은 페리(Peripheral, 주변장치)를 붙여 설계할 수 있습니다.


• Timers

• Interrupt controller

• GPIO

• USB

• PCM / I2S

• DMA controller

• I2C master

• I2C / SPI slave

• SPI0, SPI1, SPI2

• PWM

• UART0, UART1 

* 2835 datasheet 참조 https://www.raspberrypi.org/app/uploads/2012/02/BCM2835-ARM-Peripherals.pdf




Raspberry Pi Model B+ 은 Broadcom BCM2835을 쓰고, Raspberry Pi 2 Model B는 Broadcom BCM2836 칩을 씁니다. 둘 다 GPIO 개수가 40개로 ODROID-XU4 보다 10개가 많습니다. 라즈베리 파이는 PWM도 달려있어 장치 제어에 많이 쓰고 그만큼 유저도 많습니다. 현재로서는 직접 설계 없이 콘텐츠를 붙이는 장치 제어 필드(업계)에서는 사실 오드로이드 보다는 라즈베리 파이를 이용한 프로젝트가 많습니다. 다른 것 보다 가격이...

https://www.board-db.org/compare/84,4,28/




ODROID에는 듀얼코어(Samsung Exynos5422 Cortex-A15 2 Ghz and Cortex-A7 Octa core CPU) 칩이 들어 있습니다. 브로드컴 제품이던 삼성 제품이던 둘 다 ARM Architecture를 기반으로 하기 때문에 S/W도 비슷하게 갑니다. ODROID를 제작한 HardKernel에서도 wiringPI를 이용합니다. 이전에는 잘 정리된 위키 페이지가 없어서 많은 삽질(실습)을 했어야 했습니다. 지금은 아래 사이트 보고 그대로 따라 하면 만들기 쉽도록 되어 있습니다.

https://wiki.odroid.com/odroid-xu4/application_note/gpio/wiringpi




1편에서 리눅스를 설치했으니 대부분의 장치는 리눅스에서 제어하도록 매핑되어 있습니다. 펌웨어 단에서 장치에서는 MMIO(Memory Mapped I/O), IMIO(IO Mapped I/O)가 주류지만 리눅스 시스템에서는 파일/디렉토리로 모든 것을 가능하게 해 놓았죠. 이미 디바이스 드라이버란 이름이 있지만 MMIO, IMIO, PMIO(Port mapped I/O) 처럼 FMIO(File Mapped I/O)라고 하고 싶습니다.




PIN 번호 참조

https://wiki.odroid.com/odroid-xu4/hardware/expansion_connectors
odroid-xu4:hardware:expansion_connectors [ODROID Wiki]



wiki.odroid.com

0. 결과

https://youtu.be/Ifztgr99bRs


ODROID CON10 header의 핀번호는 인터넷에서 구할 수 있는 표번호와 다르다. 전에 한 학생이 다시 그려서 줬는데 구글 드라이브를 쓰기 전이라 잃어버렸다. 진작에 포스팅 할껄 하는 아쉬움이 남는다 그런데 넌(그 학생) 지식공유를 위해 블로그 하래두 안하니... 마음 편하게 확장 보드를 구매하자.



1. FMIO in shell

odroid@odroid-server:~$ echo 29 > /sys/class/gpio/export

odroid@odroid-server:~$ echo out > /sys/class/gpio/gpio29/direction

odroid@odroid-server:~$ echo 1 > /sys/class/gpio/gpio29/value



2. FMIO with source

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h> 




int main(int argc, char** argv)

{

FILE *fp;

char setValue[4];

int toggle = 0; 

if((fp = fopen(“/sys/class/gpio/export”, “ab”)) == NULL) {

printf(“Cannot open export file.\n”);

return -1;

}

rewind(fp);

strcpy(setValue, “1”);

fwrite(&setValue, sizeof(char), 1, fp);

fclose(fp);

sleep(1);

if((fp == fopen(“/sys/class/gpio/gpio25/value”, “rb+”)) == NULL) {

printf(“Cannot open value file. \n”);

return -1;



rewind(fp);

strcpy(setValue, “0”);

fwrite(&setValue, sizeof(char), 1, fp);

fclose(fp);

return 0;

}



3. FMIO using WiringPI

#include <stdio.h>

#include <wiringPi.h>

#include <sys/time.h>

int main(int argc, char **argv) {

unsigned int delay_cnt=0;

wiringPiSetup();

pinMode(06,OUTPUT);

digitalWrite(06,HIGH);

return 0;

}

https://wiki.odroid.com/odroid-xu4/application_note/gpio/wiringpi
odroid-xu4:application_note:gpio:wiringpi [ODROID Wiki]



wiki.odroid.com





ODROID에는 PWM이 없습니다. 각도 제어 서보모터의 경우 delay를 이용하여 S/W 파형을 만들어도 떨림없이 제어가 잘 되네요. 물론, 100%(모든 서보모터)는 아니고맥심칩처럼 컨버터를 넣은 보조 회로가 필요합니다.


뭐든 추상화하면 상위단 코드는 간결해집니다. 또, 알고리즘이나 다지인 패턴같이 좀 더 낫다고 생각되는 과제를 고민할 수 있게 됩니다. 임베디드 월드와 비교해 볼 때, 데스크톱에서 하는 응용 프로그램이야 정말 생각한 대로 작동한다고 할 수 있습니다. 응용프로그래머는 그렇게 추상화시킨 API를 사용할 때 정말 수많은 엔지니어가 많은 고생을 했었다는 사실을 잊지 말았으면 합니다.

'블로그 항해 일지 > Embedded' 카테고리의 다른 글

x86용 부트코드  (0) 2019.01.08
ODROID GPS 모듈 입양 完  (2) 2019.01.08
GPIO 제어 via 블루투스 on 삼성폰  (0) 2019.01.08
블루투스 연결  (0) 2019.01.08
Ubuntu Image download  (0) 2019.01.08
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기