Jetson Nano GPIO 사용 해보기

Jetson Nano에는 라즈베리파이와 마찬가지로 40핀의 GPIO 헤더가 존재한다. 이를 이용해 다양한 외부기기와 연결 가능한데, python의 라이브러리를 이용하면 사용자가 제어 가능하다.

먼저 필요한 패키지를 설치한다. python3는 기본 설치되어 있고, pip3는 설치해야 한다.

$ sudo apt install python3-pip

다음으로 Jetson.GPIO 패키지를 설치한다.

$ sudo pip3 install Jetson.GPIO

이제 python3를 실행하고 설치한 패키지를 import 해보면 다음과 같이 퍼미션 에러가 발생한다. 몇가지 설정이 필요하다.

>>> import Jetson.GPIO
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/dist-packages/Jetson/GPIO/__init__.py", line 1, in <module>
    from .gpio import *
  File "/usr/local/lib/python3.6/dist-packages/Jetson/GPIO/gpio.py", line 33, in <module>
    raise RuntimeError("The current user does not have permissions set to "
RuntimeError: The current user does not have permissions set to access the library functionalites. Please configure permissions or use the root user to run this

gpio 그룹을 생성하고 사용자를 gpio 그룹에 추가한다.

$ sudo groupadd -f -r gpio
$ sudo usermod -a -G gpio <user_id>

다음으로 udev 룰을 rules.d 디렉토리로 복사한다.

$ sudo cp /opt/nvidia/jetson-gpio/etc/99-gpio.rules /etc/udev/rules.d/

재부팅하거나, 다음과 같이 입력하여 udev 룰을 다시 불러온다. (재부팅해야 함.)

$ sudo udevadm control --reload-rules && sudo udevadm trigger

이제 python3를 실행한 다음, 패키지를 import 해보면, 정상적으로 사용 가능하다. 몇가지 예제 코드들이 /opt/nvidia/jetson-gpio/samples에 있으므로 참고하면 될듯하다. 사용법은 RPi.GPIO와 동일하다.

>>> import Jetson.GPIO as GPIO
>>> GPIO.setmode(GPIO.BOARD)
>>> GPIO.setup(33, GPIO.OUT)
>>> GPIO.output(33, GPIO.HIGH)
>>> GPIO.output(33, GPIO.LOW)

위와 같이 간단히 사용 가능하고, 인터럽트, 콜백함수 등 다양한 기능을 지원한다. 몇가지 주의 사항으로는,

  • GPIO의 전압은 5V가 아닌 3.3V
  • PWM 기능은 지원하지 않음
  • I2C, SPI는 각각 두개씩 지원
  • 몇가지 특수펑션들 사용하고, 전원관련 핀을 빼면 여분의 GPIO는 별로 없는듯.

상세한 핀아웃은 https://www.jetsonhacks.com/nvidia-jetson-nano-j41-header-pinout/을 참고하면 됨.

Advertisements

3 Replies to “Jetson Nano GPIO 사용 해보기”

  1. 안녕하세요. tx2를 사용중인데요 Jetson.GPIO를 import 시키는 것은 성공하였는데
    그 밑에 줄을 실행시켰더니
    ValueError Traceback (most recent call last)
    in
    1 GPIO.setmode(GPIO.BOARD)
    2
    —-> 3 GPIO.setup(396, GPIO.OUT)
    4 GPIO.set(396, 1)
    5 GPIO.output(396, 0)

    /usr/local/lib/python3.5/dist-packages/Jetson/GPIO/gpio.py in setup(channels, direction, pull_up_down, initial)
    178 _setup_single_out(channels[idx], initial[idx])
    179 else:
    –> 180 _setup_single_out(channels[idx], initial)
    181 else:
    182 for idx in range(len(channels)):

    /usr/local/lib/python3.5/dist-packages/Jetson/GPIO/gpio.py in _setup_single_out(channel, initial)
    191
    192 def _setup_single_out(channel, initial=None):
    –> 193 gpio = _get_gpio_number(channel)
    194 func = gpio_function(channel)
    195 direction = _check_pin_setup(gpio)

    /usr/local/lib/python3.5/dist-packages/Jetson/GPIO/gpio.py in _get_gpio_number(channel)
    500 if channel not in _pin_to_gpio or _pin_to_gpio[channel][0] is None:
    501 raise ValueError(“The channel sent is invalid on a {} Board”.format(
    –> 502 get_model()))
    503
    504 return _pin_to_gpio[channel][0] + _gpio_chip_base[_pin_to_gpio[channel][1]]

    ValueError: The channel sent is invalid on a JETSON_TX2 Board

    이러한 에러가 뜨네요.. RPi에서는 gpio를 쉽게 사용했었는데 tx2에서도 같은 방식으로 사용할 수 있는 건가요?

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.