Jetson Nano 40핀 헤더를 이용한 하드웨어 제어 예제

Jetson Nano는 40핀 GPIO 헤더를 통해 다양한 하드웨어를 제어할 수 있습니다. 이 문서에서는 GPIO, I2C, PWM을 활용하여 LED, 버튼, I2C LCD, 조도 센서, DC 모터, 온습도 센서, 서보 모터 등을 제어하는 예제를 통합하여 제공합니다.


1. 기본 GPIO 제어

1.1 LED 점멸 (Blinking LED)

  • 설정: GPIO 핀을 출력으로 설정하여 LED 점멸
  • 코드:
    import Jetson.GPIO as GPIO
    import time
    
    LED_PIN = 18
    
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(LED_PIN, GPIO.OUT)
    
    try:
        while True:
            GPIO.output(LED_PIN, GPIO.HIGH)  # LED ON
            time.sleep(1)
            GPIO.output(LED_PIN, GPIO.LOW)   # LED OFF
            time.sleep(1)
    except KeyboardInterrupt:
        GPIO.cleanup()
    

1.2 버튼 입력 처리

  • 설정: GPIO 핀을 입력으로 설정하여 버튼 눌림 감지
  • 코드:
    import Jetson.GPIO as GPIO
    
    BUTTON_PIN = 16
    
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    
    try:
        while True:
            if GPIO.input(BUTTON_PIN) == GPIO.LOW:  # 버튼이 눌림
                print("Button Pressed!")
    except KeyboardInterrupt:
        GPIO.cleanup()
    

2. I2C 기기 제어

2.1 I2C LCD 출력

  • 설정:
  • LCD의 SDA 핀 → Jetson Nano 핀 3
  • LCD의 SCL 핀 → Jetson Nano 핀 5
  • 코드:
    import smbus2
    import time
    
    I2C_ADDR = 0x27  # LCD I2C 주소
    LCD_WIDTH = 16
    
    LCD_CHR = 1
    LCD_CMD = 0
    LCD_LINE_1 = 0x80
    LCD_LINE_2 = 0xC0
    
    ENABLE = 0b00000100
    
    bus = smbus2.SMBus(1)
    
    def lcd_write(bits, mode):
        high_bits = mode | (bits & 0xF0) | 0x08
        low_bits = mode | ((bits << 4) & 0xF0) | 0x08
        bus.write_byte(I2C_ADDR, high_bits)
        lcd_toggle_enable(high_bits)
        bus.write_byte(I2C_ADDR, low_bits)
        lcd_toggle_enable(low_bits)
    
    def lcd_toggle_enable(bits):
        time.sleep(0.0005)
        bus.write_byte(I2C_ADDR, (bits | ENABLE))
        time.sleep(0.0005)
        bus.write_byte(I2C_ADDR, (bits & ~ENABLE))
        time.sleep(0.0005)
    
    def lcd_init():
        lcd_write(0x33, LCD_CMD)
        lcd_write(0x32, LCD_CMD)
        lcd_write(0x06, LCD_CMD)
        lcd_write(0x0C, LCD_CMD)
        lcd_write(0x28, LCD_CMD)
        lcd_write(0x01, LCD_CMD)
        time.sleep(0.0005)
    
    def lcd_message(message, line):
        message = message.ljust(LCD_WIDTH, " ")
        lcd_write(line, LCD_CMD)
        for char in message:
            lcd_write(ord(char), LCD_CHR)
    
    lcd_init()
    lcd_message("Hello, Jetson!", LCD_LINE_1)
    lcd_message("I2C LCD Ready!", LCD_LINE_2)
    

2.2 조도 센서 (BH1750)

  • 설정: I2C 조도 센서를 통해 주변 광량 측정
  • 코드:
    import smbus2
    import time
    
    I2C_ADDR = 0x23
    POWER_ON = 0x01
    CONTINUOUS_HRES_MODE = 0x10
    
    bus = smbus2.SMBus(1)
    
    def read_light():
        data = bus.read_i2c_block_data(I2C_ADDR, CONTINUOUS_HRES_MODE, 2)
        return (data[0] << 8 | data[1]) / 1.2
    
    bus.write_byte(I2C_ADDR, POWER_ON)
    time.sleep(0.5)
    
    while True:
        light_level = read_light()
        print(f"Light Level: {light_level:.2f} lx")
        time.sleep(1)
    

3. PWM을 이용한 하드웨어 제어

3.1 DC 모터 제어 (L298N)

  • 설정: GPIO와 L298N 모터 드라이버 연결
  • 코드:
    import Jetson.GPIO as GPIO
    import time
    
    IN1 = 18
    IN2 = 22
    ENA = 32
    
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(IN1, GPIO.OUT)
    GPIO.setup(IN2, GPIO.OUT)
    GPIO.setup(ENA, GPIO.OUT)
    
    pwm = GPIO.PWM(ENA, 100)
    pwm.start(50)
    
    try:
        while True:
            GPIO.output(IN1, GPIO.HIGH)
            GPIO.output(IN2, GPIO.LOW)
            print("Motor Forward")
            time.sleep(2)
    
            GPIO.output(IN1, GPIO.LOW)
            GPIO.output(IN2, GPIO.HIGH)
            print("Motor Backward")
            time.sleep(2)
    except KeyboardInterrupt:
        pwm.stop()
        GPIO.cleanup()
    

3.2 서보 모터 제어

  • 설정: PWM 핀을 사용하여 서보 모터 각도 조절
  • 코드:
    import Jetson.GPIO as GPIO
    import time
    
    SERVO_PIN = 33
    
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(SERVO_PIN, GPIO.OUT)
    
    pwm = GPIO.PWM(SERVO_PIN, 50)
    pwm.start(7.5)
    
    try:
        while True:
            pwm.ChangeDutyCycle(7.5)  # 90도
            time.sleep(1)
            pwm.ChangeDutyCycle(12.5)  # 180도
            time.sleep(1)
            pwm.ChangeDutyCycle(2.5)  # 0도
            time.sleep(1)
    except KeyboardInterrupt:
        pwm.stop()
        GPIO.cleanup()
    

4. 온습도 센서 (DHT22)

  • 설정: GPIO를 사용하여 DHT22에서 데이터 읽기
  • 코드:
    import Adafruit_DHT
    
    SENSOR = Adafruit_DHT.DHT22
    PIN = 4
    
    while True:
        humidity, temperature = Adafruit_DHT.read_retry(SENSOR, PIN)
        if humidity is not None and temperature is not None:
            print(f'Temp: {temperature:.1f}°C, Humidity: {humidity:.1f}%')
        else:
            print('Failed to read sensor data.')
    

이 문서는 Jetson Nano의 GPIO 및 I2C 헤더를 활용하여 다양한 하드웨어를 제어하는 방법을 설명합니다. 프로젝트의 필요에 따라 이 예제들을 조합하여 확장하여 사용합니다!