이 블로그는 임베디드 컴퓨터를 이용한 장치(시스템) 개발과 원격제어에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Microchip 사의 ATmega128를 사용한 보드와 Arduino Mega 보드(ATmega2560), Raspberry Pi, Raspberry Pi Pico, WiFi 모듈을 사용 합니다.

atmega128-interfacing

Device interface and control
  AVR과 다른 장치의 Interfacing

    이 장에서는 Embedded Computer(Controller)에 장치를 연결(Interface) 하고, 장치를 제어 하는 프로그램(Device driver)을 작성 하는 능력을 배양 하기 위하여 자주 사용 되는 장치의 실제 예를 들어 설명 한다.



  • DC Motor 제어를 위한 구성도와 프로그램 예
  • Servo Motor 제어를 위한 구성도와 프로그램 예
  • Android Bluetooth 환경을 이용한 AVR Controller 제어
  • DC Motor Car(Two Wheel) 만들기
  • 후륜 구동 DC Motor car
  • AVR과 다른 장치(DC Motor, Servo Motor, Android Bluetooth)의 Interfacing 관련 페이지 보기


  • DC Motor 제어를 위한 구성도와 프로그램 예
    • DC Motor 제어를 위한 구성도
    • Dual Full-Bridge Driver L298 : L298.pdf
    • DC Motor 제어 보오드 회로 예: DC_Motor_controller.pdf
    • DC Motor 제어 프로그램(AvrStudio 4 개발 환경) 예: cho_DC_motor_control_basic.zip
    • 실험을 위한 회로 구성
      • PC와 AVR 사이에 UART 통신선을 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Atmega128의 TXD0(PE1)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Atmega128의 RXD0(PE0)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Atmega128의 GND를 연결한다.
        • 주: 컴퓨터에 Serial Port가 없는 경우 "USB --> UART(RS232) 변환 모듈"를 사용(USB Port를 Serial Port로 변환)하여 연결한다. 개발보드에 따라서는 "USB --> UART(RS232) 변환 모듈"을 내장하고 있는 경우가 많기 때문에 본인이 사용하는 개발보드에서 확인 하여야 한다.

          참고자료: USB - Serial 변환 모듈

      • AVR에 LCD display module의 신호를 연결한다.
        • LCD 제어 신호(RS, R/W, Enable)를 연결한다.
        • LCD Data 신호(Data0, Data1, Data2, Data3)를 연결한다.
        • Contrast adjustment 선을 연결한다.
          • GND: LCD 모듈 1번 핀
          • Vdd: LCD 모듈 2번 핀
          • Contrast adjustment: LCD 모듈 2번 핀. 5 에서 10K 가변저항을 사용하여 "LCD 모듈 4Bit Interface 예"와 같이 연결한다.
          • 주: 처음 LCD display module을 연결한 경우에는 Contrast adjustment 가변저항을 조정하여 LCD에 문자가 잘 보이도록 하여야 한다.

          참고자료: LCD Module을 사용 하여 Data Bit를 4Bit만 사용한 Interfacing 예(Port A 사용)

      • AVR에 Keypad를 연결한다.
      • 참고자료: Keypad Interfacing

      • 위 "DC Motor 제어를 위한 구성도"를 참고하여 Motor controller와 DC Motor 연결한다.
        • AVR PB5 <-> Motor controller Enable 신호를 연결한다.
        • AVR PG0 <-> Motor controller Direction 신호를 연결한다.
        • AVR 5V, GND <-> Motor controller 5V, GND 신호를 연결한다.
        • 필요한 경우 Motor controller에 모터 구동 전원를 연결한다.
        • Motor controller에 모터를 연결한다.
    • 실험 방법
      • cho_DC_motor_control_basic.zip or ms7_DC_motor_control_basic.zip 파일을 Download하여 압축을 해제하고 Project를 Build 한다.
      • cho_DC_motor_control_basic.hex or ms7_DC_motor_control_basic.hex를 개발 보드에 Upload 한다.
      • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
      • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
      • 실험:
        • 개발 보드의 Reset SW를 누르면 모니터와 LCD에 모터 제어에 필요한 명령을 설명하는 메세지와 현재 명령(Command: )과 PwmDuty(PwmDuty: )가 출력된다.
        • 명령을 입력하면 실행 결과가 모니터와 LCD에 출력된다.
        • 주: 명령 입력 장치는 모니터 프로그램 또는 Keypad를 사용(gnu_sciutil.c 에서 선택)할 수 있다. 기본은 모니터에서 명령을 입력하도록 설정되어 있다.

        • 모니터 프로그램에서 명령 입력하기: gnu_sciutil.c에 있는 SCI_InChar() 함수에서 return rx0_char(); 이 실행되도록 설정한다.
        • Keypad에서 명령 입력하기: gnu_sciutil.c에 있는 SCI_InChar() 함수에서 return get_key(); 이 실행되도록 설정한다.

  • Servo Motor 제어를 위한 구성도와 프로그램 예
    • Servo Motor 제어 구성도
    • Servo Motor SG90의 제어 신호(Timming 과 Angle)
    • 주: 0°: 1500uSec, 90 ↔ 1000uSec , Duty(uSec) = 1500uSec + (angle * 125 / 90)

    • Servo Motor 제어 프로그램(AvrStudio 4 개발 환경) 예: cho_servo_motor_control_basic.zip
    • Microchip Studio 개발 환경을 이용한 프로그램 예: ms7_servo_motor_control_basic.zip
    • Servo Motor 제어 프로그램(Studio 7을 사용한 cpp 프로그램) 예: cho_servo_motor_control_cpp.zip
    • 실험을 위한 회로 구성
      • PC와 AVR 사이에 UART 통신선을 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Atmega128의 TXD0(PE1)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Atmega128의 RXD0(PE0)를 연결한다.
        • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Atmega128의 GND를 연결한다.
        • 주: 컴퓨터에 Serial Port가 없는 경우 "USB --> UART(RS232) 변환 모듈"를 사용(USB Port를 Serial Port로 변환)하여 연결한다. 개발보드에 따라서는 "USB --> UART(RS232) 변환 모듈"을 내장하고 있는 경우가 많기 때문에 본인이 사용하는 개발보드에서 확인 하여야 한다.

          참고자료: USB - Serial 변환 모듈

      • 위 "Servo Motor 제어를 위한 구성도"를 참고하여 AVR과 Servo Motor를 연결한다.
        • AVR PB5 <-> Servo Motor 제어 신호(보통 Orange 색 선을 사용)를 연결한다.
        • AVR 5V <-> Servo Motor 5V(보통 Red 색 선을 사용)를 연결한다.
        • AVR GND <-> Servo Motor GND(보통 Brown 색 선을 사용)를 연결한다.
    • 실험 방법
      • cho_servo_motor_control_basic.zip or ms7_servo_motor_control_basic.zip 파일을 Download하여 압축을 해제하고 Project를 Build 한다.
      • cho_servo_motor_control_basic.hex or servo_motor_control_basic.hex를 개발 보드에 Upload 한다.
      • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
      • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
      • 실험:
        • 개발 보드의 Reset SW를 누르면 모니터에 Servo Motor 제어에 필요한 명령을 설명하는 메세지가 출력된다.
        • 주: 한글이 바르게 출력되도록 하기 위하여는 터미널 프로그램(예: Tera Term)의 터미널 설정에서 Coding을 UTF-8으로 설정하여야 한다.

        • 모니터 프로그램에서 명령을 입력하면 실행 결과가 모니터에 출력된다.
        • 주: 명령을 입력하는 함수(SCI_InSDec_OP_code())는 일반적인 연산에 사용하는 함수를 사용하여 약간 복잡하다. 본인이 간단한 rx0_char() 함수를 만들어 이용하여도 된다.


  • Android Bluetooth 환경을 이용한 AVR Controller 제어
  • 이 예는 Bluetooth 통신을 이용 하여 휴대폰과 AVR Controller 사이에 Serial 통신 기능을 구현 하고, 휴대폰을 이용 하여 AVR Controller를 제어 하는 예 이다.

    • Bluetooth 통신( PC <-> 휴대폰) 시스템 구성도
    • Bluetooth Module 예
    • 실험 환경 설정
      • Android Phone에 BlueTerm(Bluetooth 통신을 지원 하는 터미널 프로그램)을 설치 한다.
      • 개발 보오드에 Bluetooth 모듈 설치 하기
        • 개발 보오드(UART1 사용)와 Bluetooth 모듈 사이에 아래와 같이 전원과 UART 통신에 필요한 신호를 연결 한다.

        • 개발 보오드 VCC(5V) -> Bluetooth 모듈 VCC(5V)
        • 개발 보오드 GND -> Bluetooth 모듈 GND
        • 개발 보오드 RxD(PD2) <-> Bluetooth 모듈 TxD
        • 개발 보오드 TxD(PD3) <-> Bluetooth 모듈 RxD
      • Bluetooth 모듈 Baud rate
        • 블루투스 모듈에 따라 미리 설정된 Baud rate 가 다르기 때문에 확인 하여야 한다.
        • 블루투스 모듈과 통신에 사용 하는 개발 보오드 UART 모듈(여기서는 UART1을 사용 하였음)의 Baud rate는 블루투스 모듈에 미리 설정 되어 있는 Baud rate와 일치 하도록 설정 하여야 한다.
          • 아래 휴대폰과 개발 보오드 사이의 문자 통신 실험인 경우 예:
            • cho_uart_bluetooth_basic.zip을 다운로드 하여 cho_uart_init.c File에서 UART1(UART0는 개발 보오드에서 사용 한다.)의 Baud rate 값을 블루투스 모듈 Baud rate 값으로 설정 하여야 한다.
            • 예: HC-06 모듈: 9600, JMOD-BT-1 모듈: 115200
    • 휴대폰에 블루투스 모듈 등록 하기
      • 개발 보오드의 전원을 연결 하면 Bluetooth 모듈의 전원 LED가 점멸 한다.
      • 휴대폰에서 블루투스 -> 검색을 하면 연결 가능한 디바이스 목록에 디바이스 이름이 표시 된다.(예: HC-06 , JCNET-BT 등)
      • 연결 할 디바이스을 선택(예: HC-06 , JCNET-BT 등) 하고 Pin 번호(Default: 1234 or 0000)를 입력 한다.
    • 휴대폰에서 블루투스 모듈 연결 하기
      • 블루투스 통신에 사용할 앱(Apps)을 선택(Blue Term) 하여 실행 한다.
      • Connect device 명령을 실행 하면 연결 가능한 디이바이스가 표시 된다.
      • 연결 할 디이바이스를 선택 하고, 연결에 성공 하면 Connected: Device Name(예: HC-06) 메세지가 표시 된다.
    • 휴대폰과 개발 보오드 사이의 문자 통신 실험
      • Board를 PC의 USB Port에 접속 한다.
      • 휴대폰과 개발 보오드 사이의 문자 통신 실험 프로그램(AvrStudio 4 개발 환경) 예: cho_uart_bluetooth_basic.zip
      • cho_uart_bluetooth_basic.zip or ms7_uart_bluetooth_basic.zip 파일을 Download하여 압축을 해제하고 Project를 Build 한다.
      • cho_uart_bluetooth_basic.hex or ms7_uart_bluetooth_basic.hex를 개발 보드에 Upload 한다.
      • PC 장치관리자 -> 포트(COM & LPT) -> Silicon Labs CP210x USB to UART Bridge(장치 이름은 개발 보오드에 따라 다르게 표시 됨)의 포트 번호를 확인 한다.
      • PC에서 터미널 프로그램(Tera Term or OC Console 등)을 실행 하고, 설정 -> 시리얼 포트(E)… -> 시리얼포트 설정 창에서 포트(장치 관리자에서 확인한 번호) 번호, 속도(B): 19200, 데이터(D): 8bit, 패리티(A): none, Stop bit(S): 1 bit 로 설정 한다.
      • Android Phone에서 BlueTerm를 실행 하고, 메뉴 -> Connect device -> Device Name(예: HC-06)을 선택 한다.
      • Connected: Device Name 메시지를 확인 한다.
      • Android Phone의 BlueTerm에서 영문자를 입력 하면 PC의 터미널에 문자가 출력 된다.
      • PC의 터미널 프로그램에서 영문자를 입력 하면 Android Phone의 BlueTerm에 문자가 출력 된다.
    • 휴대폰을 이용한 개발 보오드의 LED 제어 실험
      • 휴대폰에서 LED 제어 명령(문자)을 입력 하면 개발 보오드 상의 LED 가 명령에 따라 동작 한다.
      • 실험에 필요한 설정은 윗 예와 같기 때문에 생략 한다.
      • 휴대폰을 이용한 개발 보오드의 LED 제어 실험 프로그램(AvrStudio 4 개발 환경) 예: cho_bluetooth_led_basic.zip
      • cho_bluetooth_led_basic.zip or ms7_bluetooth_led_basic.zip 파일을 Download하여 압축을 해제하고 Project를 Build 한다.
      • cho_bluetooth_led_basic.hex or ms7_bluetooth_led_basic.hex를 개발 보드에 Upload 한다.
      • LED 제어 명령(문자)
        • S: Turn Off
        • L: Shift Left
        • R: Shift Right
        • B: Blinking

  • DC Motor Car(Two Wheel) 만들기
    • Bluetooth 통신 또는 ESP WebServer(STA mode)를 이용하여 DC Motor Car(Two Wheel)를 제어하는 예 이다.

    • DC Motor car 제어를 위한 구성도

    • 전원 회로 구성 예

      Photo Interrupter 회로 예

      주: Atmega128에 USB – UART를 연결하여 프로그램을 개발 하는 경우에는 USB 5V(P)를 연결하고 USB – UART 가 분리된 상태에서는 3.3V(R) 에 연결한다.

      주: DC Motor controller 는 사용하는 Gate 에 따라 Atmega128과 같은 전원을 연결하여야 하는 경우가 있다.


      DC Motor Car 제어 Web page(ESP-01 모듈) 예

      • Bluetooth 통신 모듈: 휴대폰의 Bluetooth 통신 기능을 이용하여 DC Motor car을 제어하기 위한 모듈
      • ESP-01 모듈: ESP-01 모듈을 WebServer(STA mode)로 이용하여 Internet 환경(휴대폰 또는 노트 북을 이용)에서 DC Motor Car(Two Wheel)를 제어한다.
      • 주: ESP-01 모듈 또는 Bluetooth 통신 모듈 중 하나를 본인의 편의 따라 DC Motor car을 제어에 사용한다.

      • DC Motor 1, DC Motor 2: DC Motor car의 바퀴를 구동하기 위한 DC Motor와 DC Motor 구동 회로
        • DC Motor 속도제어는 Timer1의 Phase Correct PWM Mode를 사용 한다.

          DC Motor 제어 모듈은 "DC Motor 제어를 위한 구성도와 프로그램 예"를 참고 요.

        • DC Motor 1: Output Compare Register 1A(OCR1A Compare match 출력 단자: PB5)를 PWM Duty 제어에 사용 한다.
        • DC Motor 2: Output Compare Register 1B(OCR1B Compare match 출력 단자: PB6)를 PWM Duty 제어에 사용 한다.
      • Servo Motor: 장애물 탐지를 위한 Ultrasonic Sensor의 방향 제어를 위하여 사용한다.
        • Two wheel 제어 Car에서는 방향제어에 Servo Motor를 사용하지 않고 양 바퀴의 속도를 제어하여 방향 전환을 한다.

        • Servo Motor 제어: Output Compare Register 1C(OCR1C Compare match 출력 단자: PB7)를 Servo Motor 회전 각도 제어(PWM Duty 제어)에 사용 한다.
      • 좌,우 방향 표시 점멸등(LED) 제어
        • 좌측 방향 점멸등(LED): PORTF의 PF0를 사용 한다.
        • 우측 방향 점멸등(LED): PORTF의 PF7를 사용 한다.
    • 실험에서 기대하는 목표
      • PWM을 이용한 전력제어(이 예에서는 DC Motor의 속도 제어에 이용 함)의 이해
      • DC Motor 제어회로의 이해
      • Servo Motor 제어의 이해
      • SR04 초음파 거리 센서를 이용한 거리 측정 기술의 이해
      • Timer interrupt(일정 시간 간격으로 실행하여야 하는 측정과 제어에 이용)의 이해
      • 제어명령을 실행 하는 Command function 작성에 대한 이해
      • Bluetooth 통신 또는 ESP WebServer( ATmega128 <-> 휴대폰)을 이용한 제어에 대한 이해
    • 실험을 위한 회로 구성
      • AVR 보드와 DC motor controller 연결
        • AVR 보드 OC1A(PB5): DC Motor 1 Driver 모듈 Enable(DC Motor 1 의 회전 속도 제어) 단자
        • AVR 보드 PORTG(PG0): DC Motor 1 Driver 모듈 Dir(DC Motor 1 의 회전 방향 제어) 단자
        • AVR 보드 OC1B(PB6): DC Motor 2 Driver 모듈 Enable(DC Motor 2 의 회전 속도 제어) 단자
        • AVR 보드 PORTG(PG1): DC Motor 2 Driver 모듈 Dir(DC Motor 1 의 회전 방향 제어) 단자
        • DC Motor Driver 모듈 제어회로 VCC: AVR 보드 VCC
        • DC Motor Driver 모듈 GND 단자: AVR 보드 GND
        • Motor 구동 전원 VDD: DC Motor 구동 전원은 모터에 따라 적절한 전원(전압과 전력)을 선택하여야 한다.
        • Motor 구동 전원 GND: DC Motor Driver 모듈의 GND
      • Servo Motor 제어회로 연결
        • Servo Motor PWM 신호 단자: AVR 보드 OC1C(PB7)
        • Servo Motor 구동 전원 VDD: Servo Motor 구동 전력이 큰 경우 별도 전원이 필요 할 수도 있다.
        • Servo Motor GND: AVR 보드 GND
      • SR04 초음파 거리 센서 제어회로 연결
        • AVR 보드 PE3: SR04 초음파 거리 센서 Trigger Pulse Output Pin
        • AVR 보드 PE4: SR04 초음파 거리 센서 Echo Pulse Input Pin
        • SR04 초음파 거리 센서 VCC: AVR 보드 VCC
        • SR04 초음파 거리 센서 GND 단자: AVR 보드 GND
    • 실험 방법
      • 아래 Atmega128에 설치하는 DC Motor car control 프로그램 중 본인에게 적합한 프로그램을 다운로드하여 Atmega128에 설치한다.
      • ESP WebServer를 이용하는 경우 아래 ESP에 설치하는 WebServer(STA mode) 프로그램 중 본인에게 적합한 프로그램을 다운로드하여 ESP-01에 설치한다.
      • Bluetooth 통신 모듈을 사용하는 경우
        • 휴대폰에서 블루투스 통신 앱(Apps)(예: Blue Term, BlueTooth Srial Controller 등)을 사용하여 아래 명령을 DC Motor car에 전송하는 방식으로 제어 한다.

        • 휴대폰에서 블루투스 모듈 연결 하기: "Android Bluetooth 환경을 이용한 AVR Controller 제어"를 참고 할 것
          • 블루투스 통신에 사용할 앱(Apps)(예: Blue Term, BlueTooth Srial Controller 등)을 실행 한다.
          • Connect device 명령을 실행 하면 연결 가능한 디이바이스가 표시 된다.
          • 연결 할 디이바이스를 선택 하고, 연결에 성공 하면 Connected: Device Name(예: HC-06) 메세지가 표시 된다.
      • DC Motor car 제어 명령
        • 정지 상태에서 "U" 명령을 실행하면 Start 명령이 자동으로 실행 된다.

        • U: Speed Up
        • D: Speed Down
        • C: Go Straight
        • L: Turn Left
        • R: Turn Right
        • F: Forward
        • B: Backward
        • <: Turn Left Flashing
        • >: Turn Right Flashing
        • S: Stop
        • 정지 상태에서 "U" 명령을 실행하면 Start 명령이 자동으로 실행 된다.


  • 후륜 구동 DC Motor car
    • 후륜 구동 DC Motor car 구성도
      • Bluetooth 통신 모듈: 휴대폰의 Bluetooth 통신 기능을 이용하여 DC Motor car을 제어하기 위한 모듈
      • DC Motor 1, DC Motor 2: DC Motor car의 바퀴를 구동하기 위한 DC Motor와 DC Motor 구동 회로
        • DC Motor 속도제어는 Timer1의 Phase Correct PWM Mode를 사용 한다.

          DC Motor 제어 모듈은 "DC Motor 제어를 위한 구성도와 프로그램 예"를 참고 요.

        • DC Motor 1: Output Compare Register 1A(OCR1A Compare match 출력 단자: PB5)를 PWM Duty 제어에 사용 한다.
        • DC Motor 2: Output Compare Register 1B(OCR1B Compare match 출력 단자: PB6)를 PWM Duty 제어에 사용 한다.
      • Servo Motor: DC Motor car의 전륜(앞 바퀴) 방향 제어를 위한 Servo Motor
        • Two wheel 제어 Car에서는 방향제어에 Servo Motor를 사용하지 않고 양 바퀴의 속도를 제어하여 방향 전환을 한다.

        • Servo Motor 제어: Output Compare Register 1C(OCR1C Compare match 출력 단자: PB7)를 Servo Motor 회전 각도 제어(PWM Duty 제어)에 사용 한다.
      • 좌,우 방향 표시 점멸등(LED) 제어
        • 좌측 방향 점멸등(LED): PORTF의 PF0를 사용 한다.
        • 우측 방향 점멸등(LED): PORTF의 PF7를 사용 한다.
    • 후륜 구동 DC Motor car 제어 프로그램(Microchip Studio 개발 환경): cho_bluetooth_car_DC_motor_servo.zip
    • 제작한 후륜 구동 DC Motor car 예
    • 실험 방법은 위 Two wheel 제어 DC Motor car와 유사하기 때문에 생략함.

  • AVR과 다른 장치(DC Motor, Servo Motor, Android Bluetooth)의 Interfacing 관련 페이지 보기