macOS 에서 리산테크 AVR FLASHER 10 사용하기

![img_1](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh_UQMMViB7Of1FnJHfsB5xeHz97bHSsjJk1JtteJCBYDswq109E_WFqRIsOuYLcGFQ2UXLdkERQHWFspN9JUUzCywiamd4JVcXVp3fPrjd0kMElJ2wlAC6fZlICVxuw6JV3bSRDRQBpITNEQgEWaCBStmQwkSV9yVxjOcZUX_XTVnxlxohNqYlUvRKls/s4000/KakaoTalk_Photo_2025-01-04-00-14-17.jpeg) AVR 프로그래밍에 주로 사용하는 리산테크의 AVR FLASHER 10 제품이다. 총 10개의 서로다른 펌웨어를 저장하여 PC 없이도 타겟 장치의 전원으로 펌웨어 다운로드가 가능하다. 펌웨어 다운로드가 고속으로 이루어지기 때문에 아주 편하다. 최근 윈도우 데스크탑 보다 맥북으로 작업을 하는 상황이 많아지면서 이 장비를 사용하는데에 소프트웨어 지원이 윈도우만 되기때문에 불편함을 격고 있었다. 이것때문에 윈도우 노트북을 장만하는건 말이 안되는거 같고 그렇다고 매번 데스크탑을 켜는것도 불편하고 고민만 하고 있었다. 예전에는 부트캠프를 사용해 윈도우 용 프로그램을 쉽게 사용할수 있었지만 맥북이 애플실리콘을 사용하면서 이런점은 살짝 불편해 졌다고 볼수도있다. 호환성이 많이 좋아졌다고 하지만 예전에 Whisky로 시도했다가 실패한 경험이 있었기 때문에 큰 기대는 하지 않으려고했다. 아직 가상화는 시도해보지 않았는데 UTM 은 좀 쓰기가 불편했고 Parallels 는 과금방식이 전부터 마음에 들지 않았다. 사실 개인 사용 목적으로는 VMWare가 무료이기 때문에 다른 선택지가 없다. ![img_2](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl6Piz058YvIQ1Wv-lqH-lgM7cpMD1KP4Qps0jIAQ2KPVy8mK51ecO-iCA4eH3teAte-Kk...

[Raspberry Pi] - rc카 만들기 #3 ESC 제어






#3 ESC 제어




E042A 40A ESC

  • 전자변속기(ESC)
RC기기들의 브러시리스(Brushless) 모터 혹은 브러시(Brushed) 모터를 작동 시키는 것에 있어 핵심적인 부품이다.
여기서 ESC는 키보드 위의 그 esc가 아니라 Electronic Speed Controller의 이니셜이다.




RC카를 접해본 사람들이라면 ESC와 트렌스미터 간 캘리브레이션(Calibration)이 필요하다는 것을 알것이다. 전자변속기는 모터에 PWM(pulse width modulation)신호에 따라 출력을 하는데 동일한 시간축에서 펄스폭이 넓을수록 모터는 더 큰 출력을 얻게된다.
여기서 필요한 작업이 캘리브레이션이다.

캘리브레이션이란 쉽게 말해 ESC가 Raspberry Pi로 부터 받은 값에서 얼마 만큼의 출력을 내야할지 알려주는 것으로 ESC통해 모터를 제어하기 위해 필수적인 작업이다.

ESC에는 기본적으로 모터에 연결되는 2선(브러시드) 혹은 3선(브러시리스), 전원 단자(사진 deans), 스위치, 컨트롤러 선을 포함한 BEC단자가 있다.
위 사진속 제품 가장 오른쪽에 검정(Ground), 적색(6V), 흰색(Signal) 단자가있다. BEC출력이 6V로 Raspberry Pi의 전원으로 사용하기에 안전하지 않다.



SERVO가 4pin(적색) 6pin(갈색) 7pin(황색)을 사용중이다.
ESC는 9pin(검정색) 11pin(흰색)을 사용할 것이다.
저번에는 lxterminal을 열서서 스크립트를 실행전에 pigpio daemon을 따로 실행해야했다. 
아래 처럼 프로그램 상단에 추가해주면 따로 실행 할 필요가 없다.
사전에 실행하고 싶은 다른 데몬이나 스크립트가 있다면, 
call("실행할 프로그램",shell=True) 이런식으로 추가해주면 된다.
경우에 따라선 프로그램의 경로까지 명시해주어야 할 수도 있다.

  • 캘리브레이션(Calibration)
매번 연결을 할때 Dual Shock로 캘리브레이션(Calibration)을 하는 것은 상당히 번거롭기 때문에 루프에 들어가기전에 프로그램상에서 진행되도록 할 것이다.

1) 우선 ESC에 전원을 넣는다.
2) 짧은 비프음이 종류에 따라서 한번에서 세번 정도 울린다.
3) 파이썬 스크립트를 실행 시킨다.
4) 캘리브레이션(Calibration)에 성공하면 긴 비프음이 울린다.




본인이 사용한 ESC에 따라서 다를 수 있지만 여기서 사용한 ESC는 이렇게 최소값 최대값을 두번 정도 신호를 주어야 완료가 되었다.


  • 브러시 모터 제어
브러시 모터라 하면 어릴적에 가지고 놀던 일반적인 DC모터이다.
여기까지 왔다면 모터의 제어는 어렵지 않다. 서보모터를 제어했던 것처럼 하면된다.

<SERVO>
if   최소값보다 작을때 최소값으로 고정
elif 최대값보다 클때 최대값으로 고정
if   Dual Shock로부터 받은 값만큼 움직인다

<ESC_MOTOR>
-0.1 ~ 0.1 의 Dual Shock 입력값에서는 작동하지 않도록 하였다.
원치않는 움직임을 막기위한 방법이다.
마지막으로 else: 에서 ESC_POWER에 0을 주지 않고 PWM의 최대 최소의 중간 값을 준다거나 초기화 하지 않는다면 급정지로 인한 장비손상이나 원치 않는 움직임을 감상 할 수 있다.

스크립트에 pygame.time.Clock() 함수를 이용해 fps를 20으로 제한 했는데 만일 이 작업을 해주지 않으면 CPU가 매우 뜨거워지는 것을 느낄 수 있다.
CPU 온도는 lxterminal 에 vcgencmd measure_temp 로 확인 할 수 있다




#테스트 영상




  • 전체 소스코드
"""
01/24/2017 code by Heejoong
"""
#!/usr/bin/env python3
from subprocess import call
call("sudo pigpiod", shell=True)
import time
import pigpio
import pygame
import RPi.GPIO as GPIO
import math
pi = pigpio.pi()
GPIO.setmode(GPIO.BOARD)
SERVO = 4
ESC_GPIO = 17
BLACK    = (   0,   0,   0)
WHITE    = ( 255255255)
pygame.init()
#Loop until the user clicks the close button.
done = False
# Initialize the joysticks
pygame.joystick.init()
print("PiCar Online")
# -------- Main Program Loop -----------
while done==False:
    
    # EVENT PROCESSING STEP
    for event in pygame.event.get(): # User did something
        if event.type == pygame.QUIT: # If user clicked close
            done=True # Flag that we are done so we exit this loop
        # Possible joystick actions: JOYAXISMOTION JOYBALLMOTION JOYBUTTONDOWN JOYBUTTONUP JOYHATMOTION
        if event.type == pygame.JOYBUTTONDOWN:
            if joystick.get_button(0):
                print("square pressed")
            elif joystick.get_button(1):
                print("cross pressed")
            elif joystick.get_button(2):
                print("circle pressed")
            elif joystick.get_button(3):
                print("triangle pressed")
            elif joystick.get_button(4):
                print("L1 pressed")
            elif joystick.get_button(5):
                print("R1 pressed")
            elif joystick.get_button(6):
                print("L2 pressed")
            elif joystick.get_button(7):
                print("R2 pressed")
            elif joystick.get_button(8):
                print("SHARE pressed")
            elif joystick.get_button(9):
                print("OPTIONS pressed")
            elif joystick.get_button(10):
                print("left Axis pressed")
            elif joystick.get_button(11):
                print("right Axis pressed")
            elif joystick.get_button(12):
                print("PS pressed")
            elif joystick.get_button(13):
                print("Touch pad pressed")
        
    # Get count of joysticks
    joystick_count = pygame.joystick.get_count()
    # For each joystick:
    for i in range(joystick_count):
        joystick = pygame.joystick.Joystick(i)
        joystick.init()
        # SERVO MOTOR
        MAX = 1725
        MID = 1425
        MIN = 1125
        #print(joystick.get_axis(2))
        position = ((-joystick.get_axis(2))*300+MID)
        if position < MIN:
            position = MIN
        elif position > MAX:
            position = MAX
        if MIN <= position <= MAX:
            #print(position)
             pi.set_servo_pulsewidth(SERVO, position)
            #call("echo 1="+str(position)+" > /dev/servoblaster", shell=True)
        # SERVO MOTOR END
        # MOTOR Control
        power = (-joystick.get_axis(1))*50
        
        if joystick.get_axis(1)< -0.1:
            ESC_POWER  = 1520+power
            pi.set_servo_pulsewidth(ESC_GPIO, ESC_POWER)
        elif joystick.get_axis(1)> 0.1:
            ESC_POWER = 1340+power
            pi.set_servo_pulsewidth(ESC_GPIO, ESC_POWER)
        else:
            pi.set_servo_pulsewidth(ESC_GPIO, 0)
        #MOTOR End
# Close the window and quit.
# If you forget this line, the program will 'hang'
# on exit if running from IDLE.
pygame.quit ()
GPIO.cleanup()
cs



Thx.

Comments

  1. 안녕하세요. 포스팅을 읽다가.. 혹시 여기서 답을 얻을 수 있을까 해서 질문을 드리고 싶어서 연락드립니다.

    저는 지금 라즈베리 파이를 활용해서 완제품 RC 보트를 가지고 학습을 시켜서 자율운항선을 만들고자 합니다. 그런데, 여기 달려있는 모터가 브러시리스 모터인데,, , 일반적인 라즈베리파이 키트에 들어있는 모터드라이버실드로는 제어가 불가능한 것 같더라구요. RC 보트에 들어있는 esc를 라즈베리파이에 연결해서 속도 제어가 가능한건지.. 궁금합니다. 제가 아직 지식이 많지 않아서... 질문이 이상할 수도 있는데. ㅠ ㅇ ㅠ 부탁드립니다. :WLtoys WL912-A 현재 이 모델을 가지고 변형시켜 라즈베리파이와 연결하려 하고 있습니다. ... 시간이 되신다면 js5466@naver.com으로 메일 부탁드리겠습니다.!! 감사합니다.

    ReplyDelete
    Replies
    1. 결론부터 말씀 드리자면 WLtoys WL912-A 제품에 내장된 ESC 모듈의 PWM 제어핀을 라즈베리 파이에 연결해서 브러시리스 모터제어는 이론적으로 가능합니다.

      다만 안전한 설계를 위해서 통신 전압 레벨 관련해서 보완해야 할 점이 있을 수 있습니다.

      그리고 제품의 PCB ESC 설계가 분석하기 어려운 수준으로 되어있다면 별도의 ESC 모듈을 구매하여 적용하는 것이 안전한 프로젝트 진행에 더 도움이 될 수 있을거 같네요.

      제어 코드는 위 포스트에 있는것 처럼 pigpio 라이브러리를 사용하시면 쉽게 제어하실 수 있습니다.

      Delete

Post a Comment

좋은하루되세요. ^^

Popular posts from this blog

[POE] - 패스 오브 엑자일 획득키 F 의 사용법 (Path of Exile)

[Arduino] - HC-06를 이용해 PC 와 Arduino 블루투스 연결

[Python] - 블루투스 모듈 HC-06의 MAC 주소를 이용하여 통신 포트 찾기