Stepper 대신 Servo Motor로 가상시뮬레이터 실험(아두이노)

in #kr-arduino6 years ago (edited)

Stepper 대신 Servo Motor로 가상시뮬레이터 실험(아두이노)



지난시간에 Stepper Motor 원하는 각도 회전과 블루투스 원격 제어 실험을 하였습니다. 이 부분을 아두이노가 없는 분들을 위해서 어떤 느낌인지 의미를 전달하고자 가상시뮬레이터로 표현을 해보았네요. 표현한 방식은 Servo Motor를 이용하여 아두이노 두대를 연결하여 시리얼통신을 통해서 Servo Motor를 제어하는 실험입니다. 가상시뮬레이터에서 Stepper Motor가 없기 때문에 직접 실험을 할 수 없습니다. 물론 DC 모터를 가지고 Stepper 라이브러리를 적용하여 억지로 표현하는 경우는 있지만 그렇게 표현하면 오히려 혼동을 야기 할 수 있으니 정석으로 지난 시간의 실험한 Stepper Motor 코딩 로직을 기반으로 Servo Motor를 대신 사용하여 실험을 진행했으며 위에 공개회로도 링킁 가셔서 가상시뮬레이터를 실행 시켜보세요. 온라인 상에서 체험 할 수 있을 거라 생각 됩니다.

이제 본격적으로 실험 내용을 다뤄 보겠습니다.

1. Servo Motor 회로도


  • 준비물 : Servo Motor 1개, 아두이노우노
  • 내용 : 10핀을 Servo Motor 출력핀으로 연결하시오.

간단하게 선 연결을 할 수 있겠죠.

1) 코딩


내용 : servo 라이브러리를 이용하여 아두이노 IDE의 시리얼통신 입력값에 의해 회전시키자.
참조 : Stepper Motor 원하는 각도 회전(1)(아두이노)


Servo Motor

#include <Servo.h>
Servo servo : 서보모터 객체 선언
servo.attach(서보핀) : 서보 모터에 출력을 담당할 핀 선언
servo.write(회전각) : 회전각 만큰 서보모터를 회전 시킴

시리얼 통신

  • Serial.begin(9600) : 시리얼 통신 시작(9600 통신속도)
  • Serial.println(값) : 시리얼모니터 출력
  • Serial.available() : 시리얼통신으로 데이터가 들어놨는지 상태 확인
  • Serial.parseInt() : Int형으로 데이터를 읽음

지난 시간의 Stepper Motor의 소스에서 그대로 가져왔습니다.

#include <Servo.h>

Servo servo;
int angle = 0;

void setup()
{
  Serial.begin(9600);
  servo.attach(10);  
  
  servo.write(angle);
  delay(50);
}

void loop()
{
    if(Serial.available()) {
      int val=0;
      char ch=Serial.read();
      if(ch=='a')val=1;      
      else if(ch=='d')val =-1;
      else val =0;
      
      angle+=val;
      
      if(angle>180) angle=180;
      else if(angle<0) angle=0;
        
      servo.write(angle);
      Serial.println(angle);      
      delay(50);
    }
}

Stepper Motor랑 코딩은 동일합니다. 단 if문이 하나 더 추가 되었는데 0~180도 사이 각으로 회전이 제한이 됩니다. 180도 이상과 0도 이하의 각도로 회전을 할 수 없습니다. 그래서 angle각이 180도를 넘으로 180도에 수렴하게 만들고 0도 이하가 나오면 0도에 수렴하게 만들어 놓았습니다. 그외는 코딩이 동일하기 때문에 따로 변경할 부분은 없습니다.

      if(angle>180) angle=180;
      else if(angle<0) angle=0;

위 문장만 잘 이해하시면 따로 설명은 필요 없겠죠. 지난 시간에 설명 했으니깐요. 아무튼 시리얼 모니터에서 'a'와 'd'를 입력하면 알파벳 키 값에 따라서 회전을 시키게 됩니다.

2) 결과


2. 2대의 아두이노 + Servo Motor 회로도


  • 준비물 : Servo Motor 1개, 아두이노우노 2개
  • 내용 : 10핀을 Servo Motor 출력핀으로 연결하고 Serial 통신을 하기 위해서 두대의 아두이노는 2,3빈으로 교차로 연결하라.

  • Rx - 데이터 읽기 (B arduino Pin3 =>A arduino Pin2)
  • Tx - 데이터 보내기(B arduino Pin2 =>A arduino Pin3)

한대는 스마트폰이라고 생각하고 다른 한대에 Servo Motor를 제어하는 실험입니다. 소스 코딩도 동일합니다. B 아두이노가 아래쪽 Servo Motor가 연결된 A 아두이노에 명령을 내리면 그 명령에 따라서 A 아두이노가 Servo Motor를 회전 하게 됩니다. Bluetooth 통신 소스와 동일합니다. 2대의 아두이노로 Bluetooth 실험을 대신한다고 생각하시면 됩니다.

1) 코딩



시리얼 통신

  • Serial.begin(9600) : 시리얼 통신 시작(9600 통신속도)
  • Serial.println(값) : 시리얼모니터 출력
  • Serial.available() : 시리얼통신으로 데이터가 들어놨는지 상태 확인
  • Serial.parseInt() : Int형으로 데이터를 읽음

SoftwareSerial 통신

#include <SoftwareSerial.h>

SoftwareSerial mySerial (rx, tx) : 소프트시리얼 객체선언(rx(수신), tx(전송))
mySerial.begin(9600) : 시리얼 통신 시작(예로 9600 통식속도를 사용해 봤네요.)
mySerial.write(값) : 데이터 전송
mySerial.available() : 데이터 들어왔는 확인
mySerial.read() : 전송된 데이터 1byte 읽기


[A 아두이노 코딩]

#include <Servo.h>
#include <SoftwareSerial.h>

const int rxPin = 2;
const int txPin = 3;
SoftwareSerial mySerial(rxPin, txPin); // RX, TX

Servo servo;
int angle = 0;

void setup()
{
  Serial.begin(9600);
  mySerial.begin(2400);
  servo.attach(10);  
  
  servo.write(angle);
  delay(50);
}

void loop()
{
    if(mySerial.available()) {
      int val=0;
      char ch=mySerial.read();
      
      if(ch=='a')val=1;      
      else if(ch=='d')val =-1;
      else val =0;
      
      angle+=val;
      
      if(angle>180) angle=180;
      else if(angle<0) angle=0;
        
      servo.write(angle);
      Serial.println(angle);      
      delay(50);
    }
}

[B 아두이노 코딩]

#include <SoftwareSerial.h>

const int rxPin = 2;
const int txPin = 3;
SoftwareSerial mySerial(rxPin, txPin); // RX, TX

void setup()
{
   Serial.begin(9600);
   mySerial.begin(2400);
}

void loop()     
{
  if(Serial.available()) {
    mySerial.write(Serial.read());      
  } 
}

2) 결과


마무리


Stepper Motor 회전을 Bluetooth를 이용하여 스마트폰에서 제어를 하는 실험을 지난 시간에 했었습니다. 그것을 가상시뮬레이터에서 최대한 같은 표현을 하기 위해서 두 대의 아두이노를 연결하여 한쪽에서 다른쪽으로 Motor 제어 명령을 보내고 Stepper Motor가 지원이 안됨으로 그 역활을 Servo Motor로 대신하여 회전시키는 실험을 하였습니다.

가상시뮬레이터에서 최대한 같은 느낌의 표현과 코딩을 그대로 적용함으로써 지난 시간에 배운 Stepper Motor 제어를 느낄 수 있게 표현 되어 있으니 한번 공개회로도 링크로 가셔서 체험을 해보세요.

이상으로 Stepper Motor Post를 마무리 합니다.

Sort:  

한번씩 글남기러 오겠습니다.ㅎㅎ

방문해주셔서 감사합니다.

재밌게 구경하고 가용 ㅎㅅㅎ

짱짱맨 호출에 출동했습니다!!
짱짱맨 x 마나마인! 색연필과학만화
https://steemit.com/kr/@mmcartoon-kr/4cmrbc
존버앤캘리에 이은 웹툰입니다
아이들이 보기에도 좋을꺼 같아요^^ 글작가님이 무려 스탠포드 물리학박사라고......

짱짱맨 방문에 감사합니다.

볼때마다 많은 걸 배웁니다. ㅎㅎㅎ 근데 이번 아두이노 나노를 제가 대회에서 써보면서 느꼈는데요. 나노도 그렇고, 다른 기기를 사용할 때 이게 하드웨어 적으로 살았는지 죽었는지 좀 알 수 있으면 좋을 것 같습니다. 근데 그게 안 되니깐, 아두이노로 개발하면 어디서 문제가 발생하는지 정확히 알 수 없는 문제가 생기는 것 같아요.

동작 중 문제 생기면 인터럽트 쪽으로 접근 해야 할 꺼에요.
그리고 제작 과정이라면 부분 컴파일 씩으로 나눠서 동작을 테스트해서 전체 과정이 제대로 수행 하도록 테스트 해야하고요.

오오 인터럽트? !!!. 뭔가 해결책이 보일 것도 같은데요.

Coin Marketplace

STEEM 0.29
TRX 0.12
JST 0.033
BTC 62937.86
ETH 3092.40
USDT 1.00
SBD 3.87