에듀이노-코딩교육 전문 쇼핑몰 에듀이노-코딩교육 전문 쇼핑몰

학교, 공공기관이라면 후불결제하세요!

 
현재 위치
  1. 게시판
  2. 상품후기

상품후기

상품 게시판 상세
제목 SG-90 서보모터 180도 제대로 제어하는 방법
작성자 이**** (ip:)
  • 작성일 2021-08-05
  • 추천 추천하기
  • 조회수 1220

얼마전에 기본편 Kit와 추가로 SG90을 구매했습니다.


바로 아래에도 질문이 있는데 180도 제어가 안됩니다.!!!


사기 당한줄 알았습니다.


어디를 찾아봐도 그냥 제어하면 된다고 하는데.......


하여튼, 시작은 


딸이 서보모터 SG-90 + Entry로 작품을 만들려고 했는데 서보모터가 제대로 제어가 안되더군요.


그래서 항상 하듯이 Data-Sheet를 보니깐 50Hz를 기준으로 설명을 했더군요.


아두이노 우노 호환보드에서 나오는 PWM 주파수를 찍어보니 약, 500Hz , 1000Hz 더군요...  그래서.... DataSheet에 있듯이,


50Hz에서 잘 작동하는지에 앞서 함수 발생기와 오실로스코프를 이용하여 동작을 시켜 보았습니다. 


100~200Hz에서 제일 정확하게 동작하는 것을 확인했습니다.


 - 함수 발생기(진폭:5V, Offset:0, Square Wave ) 주파수, 펄스 폭 조절하였습니다. -


그런데 어떻게 하면 100Hz를 만들 수 있을까?


Arduino 기본 개발 Platform인 스케치를 사용하면 어느 정도 마음대로 수정할 수 있는데, 


문제는 Entry에서 해결해야 한다는 것이죠.


Entry-HW(기본 설치 Folder = C:/Entry_HW/resources/firmwares )를 보니 Hex 파일이 있더군요.


백퍼 이 파일을 Entry Interface 손대지 않는 범위내에서 PWM만 100Hz 근처로 세팅하면 되겠구나 .....


Googling 결과 Source는 https://github.com/entrylabs/entry-hw  에서 받았습니다.


그런다음 기본편 Kit에 포함된 Arduino-UNO Compatible 보드는 어떤 파일하고 관계 있을까 Searching........


우선. C:/Entry/resources/modules 에서 보드와 관련된 파일은 사진파일 보니깐 arduinoCompatible.png 이고


arduinoCompatible.json 을 열어 보니...


{

    "id": "010199",

    "name": {

        "en": "Arduino Uno Compatible",

        "ko": "아두이노 Uno 호환보드"

    },

    "category": "board",

    "platform": ["win32", "darwin"],

    "icon": "arduino.png",

    "module": "arduino.js",

    "url": "http://arduino.cc",

    "driver": {

        "win32-ia32": "arduino/dpinst-x86.exe",

        "win32-x64": "arduino/dpinst-amd64.exe"

    },

    "selectPort": true,

    "reconnect": true,

    "firmware": "board2",

    "hardware": {

        "type": "serial",

        "control": "slave",

        "duration": 32,

        "vendor": "",

        "baudRate": 9600

    }

}


firmware --> Board2  빙고!!!!!!!


Board2.hex가 Base Firmware 구나..... OK!!!!


그래서 이번에는 Board2의 source를 찾아 야지....


Git에서 받은 파일을 뒤져 보니 


D:/Aduino....entry-hw-1.9.17/entry-hw-1.9.17/app/firmwares/examples/board2


board2.ino ---> 앵!! C, CPP라 생각했는데 ino ..... 찾아보니 스케치 플랫폼 소스 파일!!   ......................... 접근 90% ....................


스케치 설치하고 소스 불러 수정하지 않고 compile해 보았는데 error 없이 compile 되었는데 Hex가 어디있는지 몰라...... --.-- 


윈도 찾기는 거지 발싸개(?) 같은 프로그램이라 File-Finder를 이용하여 C: D: 모두 검색....  심봤다.......


젠장 여기 있을 줄이야!!!


C:/Users유저이름/AppData/Local/Temp/arduino_build_52536 ; 마지막 52536은 시기나 PC에 따라 달라질 수 있음(?)  ....


그리고 Hex는 두개 눈치것 봤을 때 board2.ino.hex 가 맞을 듯.


Hex Compare로 비교하니 기존 board2.hex와 달라....


불안하게 기분이 쎄... 한데  .....


그래서 다른 파일도 시도!! 


arduino_ext.ino 컴파일 해서 비교 .... 오 예!!! 100% 동일....


그래,  못먹어도 고고고!!!!!!   소스하고 조금 다르면 어때 컴파일러 버전이 바뀌었거나 게을러 최종 Firmware에 맞는 ino 파일을 안 올렸거나.... 하여튼....


목적을 잃어 버리면 안 되지.... 목적: PWM 특정 핀을 100Hz 로 바꾼다.


처음에는 PWM 제어하는 것이  analogWrite(port, value); 함수인데 이 함수를 바꿔야지!!!


이 함수의 소스는 D:/..Aduinoarduino-1.8.15-windows/arduino-1.8.15/hardware/arduino/avr/cores/arduino 에 Writing_analog.c 


소스 열어 확인해 보니 Precompiler 옵션 #if define으로 도배를 해 놓았네... 젠장.. 언제 define 된것 다 찾아!!!! 포기할까......... 딸한테 뭐라하지.......  자존심 상하는데.....


그래서....


열심히 Googling https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=damtaja&logNo=220422199283  여기에 저와 같은 생각을 하신 분이 있었습니다.


이분은 PWM을 더 높이는것을 고려!!! 전 낮추어야 하는데... 하여튼 변경한다는 생각은 동일함!!


미안합니다. Code를 그대로 사용하겠습니다. 


Cop & Paste!! 


void setPwmFrequency(int pin, int divisor) {
  byte mode;
  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 64: mode = 0x03; break;
      case 256: mode = 0x04; break;
      case 1024: mode = 0x05; break;
      default: return;
    }
    if(pin == 5 || pin == 6) {
      TCCR0B = TCCR0B & 0b11111000 | mode;
    } else {
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
  } else if(pin == 3 || pin == 11) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 32: mode = 0x03; break;
      case 64: mode = 0x04; break;
      case 128: mode = 0x05; break;
      case 256: mode = 0x06; break;
      case 1024: mode = 0x7; break;
      default: return;
    }
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}


이 함수를 그대도 붙여 넣고!!


초기화


board2.ino에서 



void initPorts () {

  for (int pinNumber = 0; pinNumber < 14; pinNumber++) {

    pinMode(pinNumber, OUTPUT);

    digitalWrite(pinNumber, LOW);

  }


  setPwmFrequency(3,256);  // 2021.8.5 추가  : 기존 31250/64=488Hz에서 -->31250/256 = 122Hz

  setPwmFrequency(11,256);  // 2021.8.5 추가 : 기존 31250/64=488Hz에서 -->31250/256 = 122Hz

  

}


컴파일 하고 hex 파일 


C:/Entry_HW/resources/firmwares에 넣어주니 동작이 동일!!!! 앵...... 우려가 현실로.....


침착해야지...


혹시나 해서 C:/Entry/resources/firmwares 여기에도 firmware가 있네.... 여기인가.... 그래서 board2.hex를 Xboard2.hex로 이름 바꾸고 "펌웨어 설치" 시도하니 안되네.....   빙고!!!!!!!!


여기여 여기..


여기로 파일 카피하여 펌웨어 설치하여 Entry 초간단 프로그래밍!!!


오실로스코프로 확인하니 3,11번은 122Hz 출력!!!   할렐루야!! 할렐루야!!


해결했습니다.!!


다른 서보모터 사용할때는 동작할 수도 있는데 SG90은 100Hz 근방에서 동작하니 아래 datasheet 소스 Firmware 파일 사용하세요..


딸은 제대로 동작안해 3~4일 고생했습니다.

(너무 열받아 눈물까지 .....)


하여튼, 제 딸과 같은 문제가 발생하면 위와 같이 해결 하시기 바랍니다.



* Hex 파일은 board2.hex로 변경해서 사용할 것.


Pin3,11번만 122Hz 로 변경. 다른 핀은 원래 주파수로 동작!! 


* 스케치 사용하시는 분은 위 함수만 추가하고 초기화 할때 PWM 주파수 변경하면 됩니다.




평점 5점
첨부파일 sg90_datasheet.pdf , board2.ino.hex , board2.ino
비밀번호 삭제하려면 비밀번호를 입력하세요.
댓글 수정

비밀번호 :

수정 취소

/ byte

비밀번호 : 확인 취소

댓글 입력

댓글달기이름 :비밀번호 : 관리자답변보기

확인

/ byte

왼쪽의 문자를 공백없이 입력하세요.(대소문자구분)

회원에게만 댓글 작성 권한이 있습니다.

관련 글 보기

관련글 모음
no item title name date hit
26300 아두이노 SG-90 / SG90 서보모터 (180도 회전) / Arduino Servo Motor 서보모터 SG90 및 팬 틸트 브라켓 구입건 HIT파일첨부 주**** 2023-12-15 126
21411 아두이노 SG-90 / SG90 서보모터 (180도 회전) / Arduino Servo Motor SG-90 서보모터 180도 제대로 제어하는 방법 HIT파일첨부 이**** 2021-08-05 1220
21212 아두이노 SG-90 / SG90 서보모터 (180도 회전) / Arduino Servo Motor HIT 이**** 2021-07-05 327
7365 아두이노 SG-90 / SG90 서보모터 (180도 회전) / Arduino Servo Motor 서보모터 180도 맞나여? HIT 남**** 2018-11-16 882
3058 아두이노 SG-90 / SG90 서보모터 (180도 회전) / Arduino Servo Motor 저렴하고 좋아요 ㅎㅎ HIT 손**** 2017-08-26 625
«
»