라즈베리파이 서보모터 무한회전 - lajeubelipai seobomoteo muhanhoejeon

- 상품 택(tag)제거 또는 개봉으로 상품 가치 훼손 시에는 상품수령후 7일 이내라도 교환 및 반품이 불가능합니다.

- 저단가 상품, 일부 특가 상품은 고객 변심에 의한 교환, 반품은 고객께서 배송비를 부담하셔야 합니다(제품의 하자,배송오류는 제외)

- 일부 상품은 신모델 출시, 부품가격 변동 등 제조사 사정으로 가격이 변동될 수 있습니다.

- 신발의 경우, 실외에서 착화하였거나 사용흔적이 있는 경우에는 교환/반품 기간내라도 교환 및 반품이 불가능 합니다.

- 수제화 중 개별 주문제작상품(굽높이,발볼,사이즈 변경)의 경우에는 제작완료, 인수 후에는 교환/반품기간내라도 교환 및 반품이 불가능 합니다. 

- 수입,명품 제품의 경우, 제품 및 본 상품의 박스 훼손, 분실 등으로 인한 상품 가치 훼손 시 교환 및 반품이 불가능 하오니, 양해 바랍니다.

- 일부 특가 상품의 경우, 인수 후에는 제품 하자나 오배송의 경우를 제외한 고객님의 단순변심에 의한 교환, 반품이 불가능할 수 있사오니, 각 상품의 상품상세정보를 꼭 참조하십시오. 

- 상품 청약철회 가능기간은 상품 수령일로 부터 7일 이내 입니다.

- 소비자분쟁해결 기준(공정거래위원회 고시)에 따라 피해를 보상받을 수 있습니다.

- A/S는 판매자에게 문의하시기 바랍니다.

	

#include <Servo.h>

#include <SoftwareSerial.h>

Servo servo;

int Tx=2,Rx=3;

SoftwareSerial mySerial(Tx,Rx);

int rain = A0; // 빗물 감지 센서 pin번호

int motor=9,pin=8;

//

char output;

int  angle=0,RainSenReading=0;

unsigned long duration,starttime, sampletime_ms=30000,lowpulseoccupancy=0;

float ratio=0,concentration=0,ugm3=0;

String str=" ";

//

void setup() {

  pinMode(motor,OUTPUT);

  servo.attach(motor);

  Serial.begin(9600);

  mySerial.begin(9600);

  starttime=millis();

}

//

void loop(){

  duration=pulseIn(pin,LOW);

  lowpulseoccupancy=lowpulseoccupancy+duration;

  if((millis()-starttime)>sampletime_ms){

    RainSenReading = analogRead(rain); // 센서로 아날로그값 ~1023을 입력받음

    ratio=lowpulseoccupancy/(sampletime_ms*10.0);

    concentration=1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62;

    ugm3=concentration*100/13000;

    lowpulseoccupancy=0;

    if(ugm3<30){

      delay(5);

      if(RainSenReading<=500){ // 빗물 센서로 받은 아날로그 값이 500 이하이면 비가 오는것으로 간주

        while(angle>0){ angle--;servo.write(angle); delay(15); } //닫음

      }

      else{ // 500 이상이면

        while(angle<180){ angle++; servo.write(angle); delay(15); } //열림

      }

    }

    else{

      while(angle>0){ angle--; servo.write(angle); delay(15); }

    }

    mySerial.print(ugm3); mySerial.print(","); mySerial.print(angle); mySerial.print(","); mySerial.print(RainSenReading);

    if(Serial.available()){ output=Serial.read(); }

    starttime=millis();

  }

}

코드는 다음과 같이 작성을 하였습니다

이게 작동을 하기는 합니다

한두번 정도는 제대로 작동을 하는데

그 이후로는 모터가 무한히 회전을 하는 오류가 발생을 합니다

어디에서 문제가 발생하는지, 해결을 어떻게 해야하는지 알고 싶습니다

//

무한히 회전한다는 말이 무슨 뜻일까요?

360도 계속 회전하는 모터라는 말인가요?

질문 소스는 0~180도 범위로 동작하는 일반 서보모터 를 기준으로 작성한 것 같은데요?

category 라즈베리파이 2020. 5. 21. 10:41

sg90 서보모터는 다음과 같이 생겼습니다

라즈베리파이 서보모터 무한회전 - lajeubelipai seobomoteo muhanhoejeon
서보모터 sg-90

이를 제어하기 위해서는 pwm을 이용합니다

pwm 값을 주어 서보모터를 회전시킬 수 있습니다

하지만 이는 스텝모터와 다르게 5를 준다고 5만큼 도는것이 아닙니다

5의 위치로 돌게 됩니다

그리고 정밀하게 제어하기에 좋은 모터는 아닙니다

정밀한 제어가 필요하다면 스텝모터를 이용해야 합니다

그래서 저는 주로 이를 사용하기 전에 어떤 한 값으로 초기화

그 각도를 기준으로 각도를 맞춰 진행하였습니다

그리고 0~180도를 제어할 수 있다고 되어있지만

하드웨어의 한계로 보통 5~175정도 까지 회전가능하도 보면 됩니다

sg90 서보모터 특징

특징을 정리해보겠습니다

1. 가격이 저렴하다 보통 2000원이면 구매할 수 있다

2. 가볍다: 작고 가볍습니다

3. 회전을 구현하기 쉽다

4. 불량이 많다: 정말 많습니다.. 분명히 제대로 꽂은 것 같은데 안된다면 먼저 불량을 의심하세요!!

10개 중 절반 이상이 불량인 제품을 받은 친구도 있었습니다 ㅠㅠㅠ

간단하게 위의 특징이 있을 것 같습니다

softPwmCreate(핀번호, 시작 펄스 값, 주기)

주기는 1~1024 사이의 값을 가집니다

내부적으로는 *0.1ms가 됩니다

즉 위와 같이 200을 입력하면 주기는 20ms가 됩니다

sg90 서보모터 라즈베리 파이에 연결 방법

서보모터를 보시면 선이 3개가 있습니다

하나는 +, 하나는 GND, 하나는 데이터 핀입니다

뭐가 뭐일까요??

빨강은 전원선(+)

갈색은 GND(-)

오렌지색은 데이터 선 입니다

여기 중요합니다!!!

즉 빨강은 5V에 연결, 갈색은 GND에 연결, 오렌지색은 PWM이 되는 GPIO에 연결합니다

(저는 wpi 1번을 사용하겠습니다)

라즈베리파이 서보모터 무한회전 - lajeubelipai seobomoteo muhanhoejeon
서보모터 라즈베리파이 연결

서보모터 테스트 코드

라즈베리파이 서보모터 무한회전 - lajeubelipai seobomoteo muhanhoejeon

위와 같이 연결하고 위의 코드를 실행했는데도 되지 않는다면 불량입니다!!

먼저 테스트를 해보세요

역시 컴파일을 해주고 실행시켜봅니다

$ gcc -o servotest servotest.c -lwiringPi
$ ./servotest
라즈베리파이 서보모터 무한회전 - lajeubelipai seobomoteo muhanhoejeon

모터가 정상이라면 위와 같이 동작합니다

서보모터 연속 회전하기

이번에는 조금 더 응용해봅시다!!

위에서는 한 각도로 돌고 끝이었지만 이번에는 연속회전하게 해보겠습니다

라즈베리파이 서보모터 무한회전 - lajeubelipai seobomoteo muhanhoejeon

위 코드를 통해 5에서 25의 각도를 왔다갔다 하는걸 볼 수 있습니다

pos를 1씩 증가하면서 계속 값을 주어 연속적으로 움직이게 만든 것입니다

라즈베리파이 서보모터 무한회전 - lajeubelipai seobomoteo muhanhoejeon

정말 깨방정 맞게 움직이네요 ㅋㅋㅋㅋㅋㅋ

이렇게 서보모터를 다루는 방법을 알아봤습니다!!