gpio
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 // 버튼을 누르지 않음
1
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