에듀이노-아두이노 전문 교육쇼핑몰 에듀이노-코딩 교육 전문 쇼핑몰 - 아두이노 라즈베리파이 등 전자부품

기술문의

뒤로가기
제목

기본편 SG-90 서보모터 180도 제대로 제어하는 방법

작성자 1823948312@k(ip:)

작성일 2021-08-05

조회 64

평점 0점  

추천 추천하기

내용

얼마전에 기본편 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 로 변경. 다른 핀은 원래 주파수로 동작!! 



첨부파일 sg90_datasheet.pdf , board2.ino , board2.ino.hex

비밀번호
수정

비밀번호 입력후 수정 혹은 삭제해주세요.

댓글목록

  • 작성자 아두이노짱

    작성일 2021-08-05

    평점 0점  

    스팸글 고생하셔서 얻은 좋은 정보 공유 감사드립니다

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

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

이름

비밀번호

내용

/ byte

수정 취소

비밀번호 :

확인 취소

댓글 입력

이름

비밀번호

내용

/ byte

평점

왼쪽의 문자를 공백없이 입력하세요.

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

댓글 입력

이름

비밀번호

내용

/ byte

왼쪽의 문자를 공백없이 입력하세요.

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

관련 글 보기


고객센터

    1670-9626

  • 팩스.063-902-6678
  • 이메일.eduino@robodyne.co.kr
  • Kakao. 에듀이노
  • 운영시간 : AM 10:00 ~ PM 6:00
  • 점심시간 : 12:00 - 13:00 토/일/공휴일 휴무
  • 고객센터 연결하기
입금계좌
  • 예금주: (주)로보다인시스템
  • 국민. 754801-01-760296
  • 농협. 301-0234-1423-01
  • IBK기업은행. 506-080015-01-016
배송 안내
  • 배송 방법 : 택배
  • 배송 지역 : 전국지역
  • 배송 비용 : 조건부 무료 : 주문 금액 100,000원 미만일 때 배송비 2,500원을 추가합니다.
  • 배송 기간 : 1일 ~ 2일
  • 배송 안내 :
    - 제주도, 산간벽지나 도서지방은 별도의 추가금액을 지불하셔야 하는 경우가 있습니다.
    고객님께서 주문하신 상품은 입금 확인후 배송해 드립니다. 다만, 상품종류에 따라서 상품의 배송이 다소 지연될 수 있습니다.
교환/반품 안내
교환 및 반품이 가능한 경우
- 상품을 공급 받으신 날로부터 7일이내 단, 가전제품의
  경우 포장을 개봉하였거나 포장이 훼손되어 상품가치가 상실된 경우에는 교환/반품이 불가능합니다.
- 공급받으신 상품 및 용역의 내용이 표시.광고 내용과
  다르거나 다르게 이행된 경우에는 공급받은 날로부터 3월이내, 그사실을 알게 된 날로부터 30일이내

교환 및 반품이 불가능한 경우
- 고객님의 책임 있는 사유로 상품등이 멸실 또는 훼손된 경우. 단, 상품의 내용을 확인하기 위하여
  포장 등을 훼손한 경우는 제외
- 포장을 개봉하였거나 포장이 훼손되어 상품가치가 상실된 경우
  (예 : 가전제품, 식품, 음반 등, 단 액정화면이 부착된 노트북, LCD모니터, 디지털 카메라 등의 불량화소에
  따른 반품/교환은 제조사 기준에 따릅니다.)
- 고객님의 사용 또는 일부 소비에 의하여 상품의 가치가 현저히 감소한 경우 단, 화장품등의 경우 시용제품을
  제공한 경우에 한 합니다.
- 시간의 경과에 의하여 재판매가 곤란할 정도로 상품등의 가치가 현저히 감소한 경우
- 복제가 가능한 상품등의 포장을 훼손한 경우
  (자세한 내용은 고객만족센터 1:1 E-MAIL상담을 이용해 주시기 바랍니다.)

※ 고객님의 마음이 바뀌어 교환, 반품을 하실 경우 상품반송 비용은 고객님께서 부담하셔야 합니다.
  (색상 교환, 사이즈 교환 등 포함)
빠른 메뉴 바로가기