Jetson & 머신러닝

jetson nano, xavier safe shutdown button 안전 종료 버튼 만들기(2)

아크리엑터 2023. 5. 1. 15:12
반응형


jetson xavier를 메인 보드로 사용하고 있는데, 사용을 자주하지 않는 놈이라서 계속 켜두지 않고 사용할 때만 켜고 끄려고 한다.

아래에 설명하는 것은 jetson nano에서도 동일하고 라즈베리파이에서도 핀번호가 조금 다를 뿐 동일하게 사용될 수 있다.

내가 사용하고 있는 jetson xavier는 LG스마트TV와 네트워크를 연결해서 jetson xavier에 저장된 파일을 공유하게 하였다.

공유 방식은 DLNA를 사용하였다. xavier에 minidlna를 설치해서 동영상 및 사진을 공유할 수 있도록 했는데, 동영상을 TV로 볼수 있게 했다.
minidlna를 설정하는 방법은 나중에 정리한다.

당연히 TV로 동영상을 보려고 할 때는 xavier의 서버만 켜고 xavier의 모니터는 켜지 않는다. 당연한 말이겠지만....
그런데, xavier를 꺼야할 땐 모니터를 켜서 우분투의 메뉴를 선택해서 종료를 시켜줘야한다. 그렇지 않으면, 파일시스템이 깨져서 부팅이 안될수 있다.

이렇게 귀찮게 쓸수 없어서 xavier를 계속 켜두어야하는 상황이었지만, 아래 방식으로 단순하게 사용하고 있다.

종료를 할 때는 우분투에서 명령을 입력하는 것이 아닌, xavier에 붙어있는 버튼을 누르면 자동으로 shutdown명령어가 실행되도록 하면 되지 않을까 하는 생각으로 해봤다.

xavier에는 버튼 3개가 있는데, 이것을 사용하지는 못하고 새로운 버튼을 하나 달아보았다.
GPIO를 사용하는 방식을 알아보았는데, xavier의 설명 내용과는 다르게 되어 있어서 좀 헤맨 상황이었지만, 포기하고 원칙대로 만들어보았다.

GPIO는 내부적으로 풀다운,풀업저항이 적용되어있다고 프로그래밍에서 설정을 해서 사용할 수 있다는 자료가 있었지만, 실제로는 프로그램에서는 지원하지 않는다고 경고를 표시한다.
그래서, 안전하게 풀다운 방식을 적용해서 연결했더니 아무런 문제없이 작동하였다.
풀다운 및 풀업 저항을 왜 사용해야하는지는 아래 링크 및 검색으로 자세히 확인할 수 있다.
https://naver.me/xY0f9qtM

 

풀업 저항, 풀다운 저항 (Pull-up, Pull-down)

풀업 저항, 풀다운 저항 (Pull-up, Pull-down) - 입력단 회로MCU나 임베디드 시스템을 구성할 때, 입력부분을 설계해야 하는 경우가 있다. 여기서 입력 부분이라 하면, 버튼이나 스위치 같은 물리적인

techlog.gurucat.net


회로는 단순해서, 쉽게 만들수 있는데 xavier에 연결하는 선은 총 3가닥으로, 3.3v, GND, 시그널을 사용한다.

풀다운 저항을 적용한 버튼의 3가닥의 선을 xavier의 17번(3.3v), 25번(GND), 23번에 연결했다. 다른 핀을 사용해도 된다.




아래 내용른 chatGPT에게 위 내용을 물어보고 프로그래밍해달라고 한 것을 그대로 붙여넣기했다

‐------------''
Jetson Xavier에서 GPIO 핀을 사용하려면 `Jetson.GPIO` 모듈을 사용할 수 있습니다. 이 모듈을 사용하여 GPIO 핀의 설정 및 제어가 가능합니다. 다음은 Jetson Xavier에서 GPIO 핀을 사용하여 버튼을 눌렀을 때 운영 체제를 안전하게 종료하는 파이썬 코드 예시입니다.

```python
import Jetson.GPIO as GPIO
import time
import os

# 버튼을 연결한 GPIO 핀 번호 설정
BUTTON_PIN = 23

# GPIO 핀 모드 설정
GPIO.setmode(GPIO.BOARD)

# GPIO 핀 입력 모드 설정
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

# 버튼을 누르면 운영 체제 종료
def shutdown(channel):
    os.system("sudo shutdown -h now")

# 인터럽트 핸들러 등록
GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callback=shutdown, bouncetime=1000)

try:
    while True:
        time.sleep(0.1)

except KeyboardInterrupt:
    print("GPIO cleanup")
    GPIO.cleanup()
```

위 코드에서는 `Jetson.GPIO` 모듈을 사용하여 GPIO 핀 번호 23에 버튼을 연결하였습니다. `GPIO.setmode` 메소드를 사용하여 GPIO 핀 모드를 `BOARD`로 설정하였으며, `GPIO.setup` 메소드를 사용하여 GPIO 핀을 입력 모드로 설정하였습니다. 또한, `GPIO.add_event_detect` 메소드를 사용하여 인터럽트 핸들러를 등록하였습니다. 이 핸들러는 버튼이 눌리면 `shutdown` 함수가 호출되어 운영 체제를 종료합니다.

이 코드를 실행하면 GPIO 핀 23에 버튼을 연결하고 버튼을 누르면 운영 체제가 안전하게 종료됩니다. 코드 실행을 마치면 `GPIO.cleanup()` 메소드를 사용하여 GPIO 핀을 초기화해주어야 합니다.


위의 chatGPT가 만들어준 코드 중에 수정 될 부분이 있다.  아래의 풀업다운 설정 부분은 작동되지 않아서 삭제한다.

변경전: GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

변경후: GPIO.setup(BUTTON_PIN, GPIO.IN)


이 프로그램이 부팅할 때 부터 실행되어 있으면서 버튼이 눌려졌으면 자동 셧다운 시키게 할 수 있다.

부팅할 때 이 프로그램이 root계정으로 자동 실행하게 하는 방법은 다음에 정리하고 아래에 링크를 걸어두겠다.

최종 만들어진 모습은 이렇다. 아래 사진에 안전한 종료 버튼을 만들어두었다.

 

이 프로그램을 자동으로 실행되게 하려면, 아래 링크를 따라 하면 된다.

https://makejarvis.tistory.com/85

 

부팅할 때, 자동으로 프로그램 실행하기

라즈베리파이에 전원을 넣었을 때, 즉, 부팅이 되었을 때 바로 프로그램이 실행되도록 해보자. 몇가지 방법이 있지만, 라즈베리파이에 설치한 kali 리눅스에 설정하는 방법을 정리한다. 먼저, /etc

makejarvis.tistory.com

 

반응형