micro:bit - Servo(SG-90) 모터 제어

OS/micro:bit 2018.01.28 19:10 Posted by 파란크리스마스

본 체험 제품은 element14 의 후원을 받아 아이씨뱅큐㈜ 에서 진행하는 무상 체험단 활동으로 작성한 것입니다.

출처 : lampbotics: mbed Servo Control - 0 to 180º fix - Thomas Murphy
BLENano_SimpleControls - SimpleControls works with the BLEController iOS/Android App. | Mbed
Servo - A class to control a model R/C servo, using a PwmOut | Mbed
Input/Output Pins — BBC micro:bit MicroPython 0.0.1 documentation
Visual Bastic.Net Serial 통신 - Create a basic BBC Micro:Bit Air Mouse – Hardware Hacks
micro:bit IoT In C - Pulse Width Modulation, Servos And More

micro:bit - Servo(SG-90) 모터 제어

micro:bit를 이용한 서보모터중에 가장 저렴한 SG-90을 제어하는 예제를 구현해보았습니다.

Servo.h

#ifndef _SERVO_H
#define _SERVO_H

#include "mbed.h"

class Servo
{
public:
    Servo(PinName pin);
    ~Servo(void);
    
    void write(unsigned char degree);

private:
    void convert(unsigned char degree);
    
    PwmOut _servo;
    unsigned int pulse;
};

#endif

Servo.cpp

#include "Servo.h"

Servo::Servo(PinName pin) : _servo(pin)
{
    _servo.period_ms(20);
}

Servo::~Servo(void)
{
    
}

void Servo::write(unsigned char degree)
{
    convert(degree);
    _servo.pulsewidth_us(pulse);
}

void Servo::convert(unsigned char degree)
{
    // 0~180 degree correspond to 500~2500
    pulse = degree * 11 + 500;
}

main.cpp

#include "MicroBit.h"
#include "Servo.h"

/*
PwmOut servo(P0_1);
int main() {
    servo.period(0.020);          
    while (1) {
        for(float offset=0.0003; offset<0.003; offset+=0.0001) {
            servo.pulsewidth(offset); 
            wait(0.25);
        }
    }
}
*/

#define SERVO_PIN P0_1

Serial pc(USBTX, USBRX);
Servo myservo(SERVO_PIN);

int main() 
{  
    int degree = 0;
    int direction = 1;
    
    while(1)
    {
        
        pc.printf("degree=%d \n\r",degree);
        myservo.write(degree);
            
        if(direction==1)
        {
            degree = degree + 5;
        }
            
        if (direction==2)
        {
            degree = degree - 5; 
        }
            
        if(degree>180)
        {
            degree = 180;
            direction = 2;
        }
        if(degree<0)
        {
            degree = 0;
            direction = 1;
        }
            
        wait(0.05);
    }
}

실행

setServoValue 함수를 사용하는 방법

출처 : micro:bit IoT In C - Pulse Width Modulation, Servos And More

#include "MicroBit.h"
MicroBit uBit;

int main() {
    uBit.init();
    for (;;) {
        uBit.io.P0.setServoValue(0);
        uBit.sleep(1000);
        uBit.io.P0.setServoValue(90);
        uBit.sleep(1000);
        uBit.io.P0.setServoValue(180);
        uBit.sleep(1000);
    }
    release_fiber();
    return 0;
}

아나로그 output을 이용하는 방법

출처 : micro:bit IoT In C - Pulse Width Modulation, Servos And More

#include "MicroBit.h"
MicroBit uBit;

int main() {
    uBit.init();
    uBit.io.P0.setAnalogValue(0);
    uBit.io.P0.setAnalogPeriod(20);

   for (;;) {
    uBit.io.P0.setAnalogValue(52 * 0 / 180 + 920);
    uBit.sleep(1000);
    uBit.io.P0.setAnalogValue(52 * 90 / 180 + 920);
    uBit.sleep(1000);
    uBit.io.P0.setAnalogValue(52 * 180 / 180 + 920);
    uBit.sleep(1000);
  }
  release_fiber();
  return 0;
}


마이크로비트 공식 구입처 : 아이씨뱅큐 http://www.icbanq.com/
엘리먼트14의 특장점 - 글로벌 전자부품 유통회사, 6만원 이상 무료배송, 60만가지 재고 보유, MOQ 없음, 한글 웹사이트, 국내서비스센터 운영 (http://kr.element14.com/?CMP=DSP-ODB-KR-JAN2018-BLOG-ICBanQ1-HOMEPAGE)

마이크로비트 공식 카페 : http://cafe.naver.com/bbcmicro
아이씨뱅큐 공식 블로그 : http://blog.naver.com/icbanq