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

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

 
현재 위치
  1. 게시판
  2. 묻고답하기

묻고답하기

기술문의 게시판입니다.

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

얼마전에 기본편 Kit를 구매했습니다.


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


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


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


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


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


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


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


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


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


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


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


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


우선. C:Entryresourcesmodules 에서 보드와 관련된 파일은 사진파일 보니깐 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.17entry-hw-1.9.17appfirmwaresexamplesboard2


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


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


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


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


C:Users유저이름AppDataLocalTemparduino_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-windowsarduino-1.8.15hardwarearduinoavrcoresarduino 에 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_HWresourcesfirmwares에 넣어주니 동작이 동일!!!! 앵...... 우려가 현실로.....


침착해야지...


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


여기여 여기..


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


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


해결했습니다.!!


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


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

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


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



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


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



게시글 신고하기

신고사유

신고해주신 내용은 쇼핑몰 운영자의 검토 후 내부 운영 정책에 의해 처리가 진행됩니다.

평점 0점
첨부파일 sg90_datasheet.pdf , board2.ino , board2.ino.hex
비밀번호 수정 및 삭제하려면 비밀번호를 입력하세요.
  • 아두이노짱 2021-08-05 0점
    수정 삭제 댓글
    스팸글 고생하셔서 얻은 좋은 정보 공유 감사드립니다

    괜찮으시다면 커뮤니티 탭 옆에 프로젝트 탭에도 게시 가능하실까요?

    본 게시판은 기술문의가 지속적으로 올라와서 글이 금새 밀려나기 때문에, 오래 노출되는 게시판에서 공유되면 좋겠습니다!

스팸신고 스팸해제

댓글 수정

비밀번호 :

수정 취소

/ byte

비밀번호 : 확인 취소

댓글 입력

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

확인

/ byte

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

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

댓글 입력

댓글달기이름 :비밀번호 :

확인

/ byte

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

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

«
»