작업/bbb

gpio

한종서 2019. 2. 18. 00:17


BBB는 출력전압이 3.3V 이고 출력 전류가 작기때문에 회로와 같이 FET를 사용하여 디바이스를 제어해야 한다.

BS270은 3.3V에서 최대 130mA로 스위칭 할 수 있다. 

P9의 23번 핀은 GPIO1_17번이다. 각 GPIO 칩당 32개의 GPIO가 있고 GPIO0~3번까지 (0~127)이므로 GPIO1_17은 32+17=49에 해당한다.


쉘 명령으로 gpio 출력하기


root@beaglebone:∼# cd /sys/class/gpio 

root@beaglebone:/sys/class/gpio# ls 

export gpiochip0 gpiochip32 gpiochip64 gpiochip96 unexport 

root@beaglebone:/sys/class/gpio# echo 49 > export 

root@beaglebone:/sys/class/gpio# ls 

export gpio49 gpiochip0 gpiochip32 gpiochip64 gpiochip96 unexport

root@beaglebone:/sys/class/gpio# cd gpio49 

root@beaglebone:/sys/class/gpio/gpio49# ls -l 

total 0 

-rw-r--r-- 1 root root 4096 May  4 19:43 active_low 

-rw-r--r-- 1 root root 4096 May  4 19:43 direction 

-rw-r--r-- 1 root root 4096 May  4 19:43 edge 

drwxr-xr-x 2 root root    0 May  4 19:43 power 

lrwxrwxrwx 1 root root    0 May  4 19:43 subsystem -> ... 

-rw-r--r-- 1 root root 4096 May  4 19:43 uevent 

-rw-r--r-- 1 root root 4096 May  4 19:43 value 

root@beaglebone:/sys/class/gpio/gpio49# cat direction 

in 

root@beaglebone:/sys/class/gpio/gpio49# echo out > direction 

root@beaglebone:/sys/class/gpio/gpio49# cat direction 

out

root@beaglebone:/sys/class/gpio/gpio49# echo 1 > value 

root@beaglebone:/sys/class/gpio/gpio49# echo 0 > value

root@beaglebone:/sys/class/gpio# echo 49 > unexport



bash 스크립트를 사용하여 딜레이없이 gpio를 온/오프 한 경우

0.45ms (2.2kHz) 사이클을 보인다. CPU로드는 98.1%이고 LED에 걸리는 전류는 12mA가 걸린다. 이 전류가 직접적으로 BBB에 소스되거나 싱크되면 BBB는 죽는다.


C++ 클래스로 GPIO를 제어하는 경우 더 높은 스위칭 주파수를 달성하지만 CPU로드는 비슷하다.  이 경우 PWM을 사용할 수 있다. CPU 부하없이 1MHz 이상의 주파수를 구현할 수 있다.

더 높은 주파수로 출력이 필요한 경우 PRU를 사용해야 한다.



BBB GPIO 입력받기


쉘 명령으로 GPIO 입력 받기

root@beaglebone:/sys/class/gpio# echo 115 > export 

root@beaglebone:/sys/class/gpio# cd gpio115 

root@beaglebone:/sys/class/gpio/gpio115# ls -l 

total 0

-rw-r--r-- 1 root root 4096 May  4 21:47 active_low 

-rw-r--r-- 1 root root 4096 May  4 21:47 direction 

-rw-r--r-- 1 root root 4096 May  4 21:47 edge 

drwxr-xr-x 2 root root    0 May  4 21:47 power 

lrwxrwxrwx 1 root root    0 May  4 21:47 subsystem -> ... 

-rw-r--r-- 1 root root 4096 May  4 21:47 uevent 

-rw-r--r-- 1 root root 4096 May  4 21:47 value

root@beaglebone:/sys/class/gpio/gpio115# echo in > direction     // 입력으로 설정

root@beaglebone:/sys/class/gpio/gpio115# cat value                   // 버튼을 누르지 않음

root@beaglebone:/sys/class/gpio/gpio115# cat value                   // 버튼을 누름

0


버튼을 누르지 않으면 내부 풀업 저항을 통해 3.3V에 연결되기 때문에 1이 등록된다.


BBB에는 내부적으로 풀업/풀다운 저항이 내장되어 있다.

P8_12에는 23.2K옴 풀다운 저항이 있고 P8_26에는 28.6K옴 풀업 저항이 있다.

내부 저항값 확인은 아래와 같이 할 수 있다.


 100k옴 저항을 3.3V에 연결했을 때 전압분배법칙에 의해 다음과 같이 계산된다.

 각 핀에는 7가지 모드가 있다. 이를 멀티플렉서 모드(mmode)라 하며 아래와 같다.

  GPIO로 작업할 때에는 mmode가 7이 되어야 한다. 따라서 가장 많이 사용되는 16진수는 아래와 같다.


P8 및 P9 헤더. 이 파일들은 GitHub 저장소 (chp06 / P8P9headers)의 PDF 형식으로 제공되므로 컴퓨터에 컬러로 표시하고 필요에 따라 인쇄 할 수 있습니다.

$ PINS 열에서 강조 표시된 핀은 이미 할당되어 있으므로 할당 된 기능 (예 : HDMI 출력 또는 eMMC)을 사용 중지하지 않으면 사용하지 않아야합니다.

Mode7은 GPIO mmode입니다. 앞에서 설명한 것처럼 GPIO 번호는 GPIO 칩 번호를 취하여 32를 곱한 다음 오프셋을 더하는 방식으로 계산됩니다. 예를 들어 GPIO1_12 = (1 × 32) + 12 = GPIO 44입니다. $ PINS 번호는 GPIO 번호가 아닙니다. 

$ PINS 번호는 각 핀에 대한 BBB 소프트웨어 참조이며이 값은 표의 두 번째 열에 제공됩니다. 

Mode6 및 Mode5 열의 강조 표시된 항목은 13 장에서 논의 된 PRU 기능과 관련이 있습니다. 

BBB P8 헤더 핀 P8_12 및 P8_26은이 표의 정보를 보여주기 위해 사용할 수 있습니다. 


molloyd@beaglebone:∼$ sudo su -s /bin/bash 

root@beaglebone:/home/molloyd# cd /sys/kernel/debug/pinctrl/

root@beaglebone:/sys/kernel/debug/pinctrl# ls 

44e10800.pinmux  pinctrl-devices  pinctrl-handles  pinctrl-maps 

root@beaglebone:/sys/kernel/debug/pinctrl# cd 44e10800.pinmux/ 

root@beaglebone:/sys/kernel/debug/pinctrl/44e10800.pinmux# ls 

gpio-ranges  pinconf-pins  pinmux-functions  pins 

inconf-groups  pingroups  pinmux-pins 

root@beaglebone:/sys/kernel/debug/pinctrl/44e10800.pinmux# more pins 

registered pins: 142

... 

pin 12 (44e10830) 00000027 pinctrl-single

... 

pin 31 (44e1087c) 00000037 pinctrl-single 

...

핀 번호는 해당 핀의 $ PINS 값입니다. 

따라서 P8_12 ($ PINS 값 12)는 풀다운 저항이 활성화 된 Mode7 (gpio1 [12])의 입력 인 모드 0x27에 있음을 알 수 있습니다. 

비슷하게 P8_26은 $ PINS 값 31이며 모드 0x37입니다. 이것은 Mode7 (gpio1 [29])의 입력이며 풀업 저항이 활성화되어 있습니다. 

핀 파일을 보면 DMM을 사용하여 100kΩ 저항에서 이전에 취해진 테스트 판독 값을 확인할 수 있습니다. 


P8_12 ($ PINS12)는 메모리 주소 44e10830 (그림 6-6의 ADDR 열 또는 앞의 pinmux-pins 파일 참조)에 매핑되기 때문에 직접 / dev / mem에 액세스하는 C 코드를 사용하여 메모리 주소 자체의 값을 실제로 쿼리 할 수 있습니다.


다음 단계를 사용하여 Jan-Derk Bakker의 devmem2 프로그램을 설치할 수 있습니다.

http://www.lartmaker.nl/lartware/port/devmem2.c