'SERVO'에 해당되는 글 3건
- 2019.10.07 Hardware | Arduino 로 Gimbal 컨트롤 하기 2
- 2017.07.09 Hardware | Arduino 의 Sensor Shield 사용해 보기
- 2017.07.08 Hardware | Arduino 로 Servo 를 움직여 보자
1. 길고 긴 시작
때는 2015년, 한창 Kickstarter 에 열을 올려, 이것 저것에 투자(?) 하고 있을 때,
당시 저에게는 너무 생소한 Gimbal 이라는 것을 접하게 됩니다.
지금이야 드론이나 스포츠 경기 촬영, 또는 일반인이 손으로 가지고 다니면서 흔들림 방지 해주는 분야에까지 널리 사용되지만,
이 때까지만 해도 이런 종류의 기기는 전문가 집단만 사용하고 있었죠.
다 제껴두고 아래 소개 동양상 보고 홀딱 반해서 투자하게 됩니다. 75 USD...
* Gimbal for your Lights Camera or Action
- https://www.kickstarter.com/projects/2035152529/gimbal-for-your-lights-camera-or-action/description
일단 동영상을 함 봐보세요. 2015년 감각으로... 사고싶어 지죠?!
당시에는, 아무 생각 없이 투자한 것이라, 어떻게 활용할지, 어떻게 컨트롤 할지 상상도 못하고 있었습니다.
제품이 도착 후, servo 로 움직인다는 것을 알고 (도착해서야!) arduino 를 활용해 기본적인 동작만 확인하고 쳐박에 두었습니다.
왜냐 하면, arduino 에 대한 지식이 얕았기에 뭘 더 할 수가 없었거든요.
아래는 지금까지 gimbal 과 관련된 포스트 들 입니다.
* Hardware | Arduino 로 Servo 를 움직여 보자
- https://chocoball.tistory.com/entry/Hardware-Arduino-Servo
* Hardware | Arduino 의 Sensor Shield 사용해 보기
- https://chocoball.tistory.com/entry/Hardware-Arduino-Sensor-Shield
* Hardware | Dual-axis XY Joystick Module
- https://chocoball.tistory.com/entry/Hardware-dual-axis-XY-Joystick-Module
마지막으로 Joystick 모듈을 사용해 보고서, 드디어! gimbal 활용의 완성판을 작성할 수 있을것 같아, 이 글을 쓰기 시작했습니다.
2. 연결
최종 목적은 Joystick 을 가지고, Gimbal 을 상하좌우 움직이는 것 입니다.
이게 단순하지만, Joystick 의 운동 한계성으로 그리 쉽게는 되지 않더군요.
일단, Arduino > Joystick > Gimbal (servo) 를 아래와 같이 연결합니다.
Joystick | Arduino Nano -------------------------- GND | GND 5V | 5V VRX | A0 VRY | A1 SW | D2 -------------------------- Servo 1 | -------------------------- RED | 5V BLACK | GND SIGNAL | D9 -------------------------- Servo 2 | -------------------------- RED | 5V BLACK | GND SIGNAL | D8 --------------------------
실제 diagram 은 다음과 같습니다.
실제 코드에서는 Joystick 의 SW_pin 이 D2 에 연결되는 등, 위의 그림과 조금 다릅니다만, 대략적인 연결 구조만 보시면 되겠습니다.
3. 간단 구동
일단 Joystick 이 유효한 방법인지 알아볼 수 있는 간단한 코드 입니다.
인터넷 어디에선가 참조했는데 링크를 까먹었습니다. 간단한 연결법이라 검색해서 쉽게 찾을 수 있습니다.
#include "Servo.h" Servo myservo1; // create servo object to control a servo Servo myservo2; int potpin1 = A0; // analog pin used to connect the potentiometer int potpin2 = A1; int val; // variable to read the value from the analog pin void setup() { myservo1.attach(9); myservo2.attach(10); // attaches the servo on pin 9 to the servo object } void loop() { val = analogRead(float(potpin1)); // reads the value of the potentiometer (value between 0 and 1023) val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180) myservo1.write(val); // sets the servo position according to the scaled value delay(15); // waits for the servo to get there val = analogRead(float(potpin2)); // reads the value of the potentiometer (value between 0 and 1023) val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180) myservo2.write(val); // sets the servo position according to the scaled value delay(15); }
아래는 연결하고 실제 구동 영상입니다.
잘 돌아가쥬?
단, 여기서 문제점들이 몇가지 있습니다.
- ripple value
회로적인 문제로 ripple 값이 발생하여, 조이스틱을 움직이지 않았지만 덜덜 떨거나 깔끔한 움직임이 나오지 않습니다.
ripple 를 제거 해야 합니다.
- speed
돌아가는 속도가 너무 빨라, 원하는 방향으로 위치하기가 힘듭니다.
- available range
X 축의 경우, 90 돌아가지만, gimbal 은 360 가 돌아가게끔 되어 있습니다.
CCTV 등 에 사용된다고 가정하면, 필요 없는 각도나 회전은 발생하지 않게끔 해야 합니다.
- last position
Joystick 의 성질 상, 움직힘 후 가운데로 되돌아 옵니다.
특정 위치를 잡게 하려면 동작시키지 않을 때에는 마지막 위치를 기억하고 있어야 합니다.
- centering
어떤 위치에서든 다시 초기 위치로 되돌아 오는 기능이 있으면 편할 것 같습니다.
이 글의 나머지 부분은, 결국 위의 문제를 해결하는 내용으로 진행됩니다.
4. Ripple Value
Joystick 을 가만히 놔둬도 계속 떨거나, 움직일 때 자연스럽지 못합니다.
Serial Monitor 로 값의 변화를 찍어 봤죠.
아무것도 안했는데도 값이 출렁 거립니다.
전후값을 비교해 보니, 가만히 있어도 최대 11 정도 값이 변하는 것을 알 수 있습니다.
그래프로 도식화 해보면, 그 현상을 충분히 알 수 있습니다.
이는 전기적인 ripple 일 수도 있습니다.
* How can I filter out noise from ADC lines without delay or signal change?
+5V +5V | | (sensor)---resistor---+---(Arduino) | | | | capacitor | | | | GND----------------GND-----GND
이 경우 RC 필터를 넣으면 됩니다. 캐패시터 값으로 0.1uF capacitor 를 사용하면 적절하다고 하네요.
So if you are sampling at around 1000 Samples/second (i.e., a sampling interval of 1 millisecond), then 100 Ohms of resistance and (roughly) 100 uF ceramic capacitor may be adequate. (The RC time constant here is RC == 100 Ohms x 100 uF = 10 milliseconds).
다만, 저항이 들어가면서 값의 외곡이 생기니 software 적으로 처리하기로 합니다.
0 512 1023 <---------------|---------------> 497 | | 527
그럼 어떻게 하느냐.
Joystick 에서 arduino 로 보내지는 전체 analog 신호 0~1023 에서,
정 가운데 앞뒤로 15씩 잘라, 이 구간의 ripple 이나 작은 움직임을 무시하기로 합니다.
... if ( (0 <= val) && (val < 497) ) { myservo1.write(angle1--); } else if ((527 <= val) && (val < 1024)) { myservo1.write(angle1++); ...
위의 코드에서 보면, 중간값을 잘라 낸 앞뒤 값에서 val 을 읽어 들이는 것으로 했습니다.
5. Speed & Last Poision
원래 소스에서는 최종 위치로 바로 움직이도록 값을 넣어 주지만, 수정된 소스에서는 각도를 1도씩 움직이게 했습니다.
그러면서, delay 값을 낮춘 채로 유지했습니다.
... if ( (0 <= val) && (val < 497) ) { myservo1.write(angle1--); } else if ((527 <= val) && (val < 1024)) { myservo1.write(angle1++); } else { // do nothing } ... delay(10); ... if ( (0 <= val) && (val < 497) ) { myservo2.write(angle2--); } else if ((527 <= val) && (val < 1024)) { myservo2.write(angle2++); } else { // do nothing } ... delay(10); }
속도에 변화를 더 주고 싶으면, angle 은 1도씩 움직이는 것은 놔두고, delay 를 조정 합니다.
저는 delay(10) 이 가장 적절했습니다.
또한, 최종 각도를 입력하는 것이 아닌, 한쪽 방향으로 움직임만 있으면 (exist) 1도씩 움직이게 한 결과,
자연스럽게 마지막 위치에서 멈춰있게 되었습니다.
6. Available Range
180도로 움직이는 Servo 를 풀로 사용하면, 카메라를 달았을 때, 촬영 범위를 벗어나거나 회전하게 됩니다.
일단 Y 축 servo 를 생각하면,
천장과 땅바닥을 촬영 각도에서 빼게 된다면, 전체 180 도에서 140도로 좁히면 됩니다.
그렇다면, 20 > 160 도 사이를 움직이게 코딩해 줍니다.
X 축은 180 회전이 720도 회전, 90 회전이 360도, 45 회전이 180도, 22.5 회전이 되어야 비로서 90도가 됩니다.
즉, 좌우로 22.5 를 먹여야 원하는 좌우 180도로 움직이는 결과가 되지요.
... if ( (67 < angle1) && ( angle1 < 112) ) { // making available range ... } else if ( angle1 == 67) { angle1++; } else if ( angle1 == 112) { angle1--; } ... if ( (20 < angle2) && ( angle2 < 160) ) { // making available range ... } else if ( angle2 == 20) { angle2++; } else if ( angle2 == 160) { angle2--; } ...
코딩에서는 90도가 center 이므로, 이 중간을 기준으로 좌우 +/- 한 값으로 범위를 정의했습니다.
위의 소스 마지막 부분에서, 각도의 끝에 있는 값에서 +1 / -1 씩 해준 이유는, 계속 범위 안에 들기 하기 위함입니다.
이게 없으면, 1도씩 움직이던 angle 값이, 범위 밖으로 나가면서 예외상황에 빠지게 됩니다.
코딩 해보신 분이라면, 예외사항 처리가 얼마나 중요한지 아실꺼예요.
7. Centering
Joystick 에서 SW_pin 이 존재합니다.
유일하게 digital 입력이며, 조이스틱을 누르면 딸깍 하는 소래를 내는 그 부분 입니다.
마침 잘 된 거죠. Centering 을 이 SW_pin 을 사용하면 됩니다.
#include "Servo.h" const int SW_pin = 2; // digital pin for centering ... void setup() { pinMode(SW_pin, INPUT); digitalWrite(SW_pin, HIGH); ... } void loop() { if (!digitalRead(SW_pin)) { angle1 = 90; angle2 = 90; myservo1.write(angle1); myservo2.write(angle2 ); } ... }
SW_pin 에 입력이 있으면, 중앙이 되는 90 도를 강제적으로 input 하게 하면 됩니다.
8. 정리
지금까지 해결했던 문제들을 한데 모아 소스코드로 만들면 아래와 같이 됩니다.
#include "Servo.h" const int SW_pin = 2; // digital pin for centering Servo myservo1; // create servo object to control a servo Servo myservo2; int potpin1 = A0; // analog pin used to connect the potentiometer int potpin2 = A1; int val; // variable to read the value from the analog pin int angle1 = 90; int angle2 = 90; void setup() { pinMode(SW_pin, INPUT); digitalWrite(SW_pin, HIGH); myservo1.attach(9); myservo2.attach(10); // attaches the servo on pin 9 to the servo object myservo1.write(angle1); myservo2.write(angle2); delay (1000); // initalizing } void loop() { if (!digitalRead(SW_pin)) { angle1 = 90; angle2 = 90; myservo1.write(angle1); myservo2.write(angle2 ); } val = analogRead(float(potpin1)); // reads the value of the potentiometer (value between 0 and 1023) if ( (67 < angle1) && ( angle1 < 112) ) { // making available range if ( (0 <= val) && (val < 497) ) { myservo1.write(angle1--); } else if ((527 <= val) && (val < 1024)) { myservo1.write(angle1++); } else { // do nothing } } else if ( angle1 == 67) { angle1++; } else if ( angle1 == 112) { angle1--; } delay(10); val = analogRead(float(potpin2)); // reads the value of the potentiometer (value between 0 and 1023) if ( (20 < angle2) && ( angle2 < 160) ) { // making available range if ( (0 <= val) && (val < 497) ) { myservo2.write(angle2--); } else if ((527 <= val) && (val < 1024)) { myservo2.write(angle2++); } else { // do nothing } } else if ( angle2 == 20) { angle2++; } else if ( angle2 == 160) { angle2--; } delay(10); }
코드의 최적화는 생각하지 않고, 오로지 구현에만 신경쓴 소스입니다.
모든 구현이 들어간 코드를 입힌 동영상 입니다.
원하는 수준까지 동작 구현이 되어서 기분이 좋네요.
향후, ESP8266 을 이용하여 원격 조정이나 Web UI 를 통한 컨트롤도 가능하겠습니다.
모두 happy arudino~!
'Hardware' 카테고리의 다른 글
Hardware | 공기질 측정용 MiCS-6814 센서를 사용해 보자 - 1 (26) | 2019.10.12 |
---|---|
Hardware | LCD2004 를 arduino 로 컨트롤 해보기 - 1 (0) | 2019.10.08 |
Hardware | 재생토너 chip 교환기 - 2 (0) | 2019.10.04 |
Hardware | SMD 부품 납땜용 오븐 취득기 (0) | 2019.10.02 |
Hardware | ebook 크레마 사운드업 액정 수리기 (28) | 2019.10.01 |
1. 가위손
Arduino 를 하면서 빵판에 선을 꼽고 있으면 스파게티가 됩니다.
이를태면 이런거거죠.
- 출처 : http://anycpu.org/forum/viewtopic.php?t=143
2. Sensor Shield
하나의 Arduino nano 에 여러 센서들을 연결하게 되면, GND / 5V 를 여러 센서들이 공유해서 사용해야 해서
다음과 같은 문제가 발생할 수 있습니다.
- 선이 복잡해 진다
- 전원의 전압 강하될 가능성이 있다
- Arduino 의 전력부에 부하를 준다
등의 문제가 될 수 있겠습니다.
이를 해결하기 위한 쉴드가 다음 사진 입니다.
Arduino nano 전용 sheild 입니다.
eBay 에서는 약 3~9 USD 정도 합니다.
그럼 Aliexpress 에서도 찾아 봅니다.
1.12 USD 에 무료 배송... 갓알리 입니다.
메뉴얼은 없고 단순히 보드 하나만 있습니다.
뒷면입니다.
Deek-Robot / DK-NANO-003 V3.0 이라고 적혀 있습니다.
5. 체결
결합전 샷 입니다.
합체 ~~!!!
전원 인가 모습.
잘 동작되는 것 같습니다.
6. 사양
Aliexpress 에서는 clone 제품을 많이 팔지만, 메뉴얼이나 자세한 설명은 없습니다.
어떤 전원을 꼽아야 하는지 알지 못하여 Googling 하였습니다.
완전히 같은 제품은 아니지만, 구성품이 거의 동일하여 동일한 사양일 듯 합니다.
Keyes - Funduino Uno and Nano Multi Purpose Shield V3.pdf
입력은 7~12V 사이가 적정하네요.
7. 연결해 보기
Servo 모터 두개를 달고 있는 Gimbal 미조립품이 있습니다.
이는 Kickstarter 에서 펀딩하고 받은 prototype 입니다.
- Servo 소개 글 : http://chocoball.tistory.com/entry/Hardware-Arduino-Servo
이 Gimbal 에는 두개의 Servo 모터가 들어갑니다.
각 Servo 모터는 5V / GND 와 digital pin 하나가 필요합니다.
이번에 구입한 Sensor Shield를 이용하여 간단하게 연결해 볼까요?
사진에서 보이듯, 각 signal pin 에 GND / 5V 핀이 바로 옆에 있어
배선이 깔끔해 집니다.
두개의 Servo 를 연결했을 때의 사진 입니다.
깔끔하죠?!!!
전원을 넣으면 각 pin 을 통해 5V 전원도 인가되고 GND 도 동작합니다.
그래서 각 센서에서 Arduino 의 5V / GND 에 따로 연결할 필요가 없습니다.
전원 인가하니 잘 동작 합니다.
동시에 두개의 Servo 를 구동시킨 동영상 입니다.
좋네요 !!!
FIN
OLDE / 여러 Sensor / Motor 등을 하나의 Arduino 로 제어하고 싶을 때, 배선이 깔끔해 지겠습니다.
다른것도 해봐야지.
'Hardware' 카테고리의 다른 글
Hardware | Arduino Micro 구입기 (0) | 2017.07.23 |
---|---|
Hardware | AM2322 Temperature & Humidity Sensor (0) | 2017.07.12 |
Hardware | Arduino 로 Servo 를 움직여 보자 (0) | 2017.07.08 |
Hardware | 삼성 USB 마우스 분해해 보기 (0) | 2017.07.07 |
Hardware | 마이크로소프트 무선 마우스 4000 분해해보기 (0) | 2017.07.04 |
1. Servo
보통 전원만 들어오면 한쪽으로만 도는 모터도 있지만,
무선 조정 자동차 등에 들어가는 전자 제어식 모터가 있습니다.
이 모터는 각도 및 방향을 지정할 수 있습니다.
이런 모터 중 하나가 Servo 입니다.
제가 가지고 있는 것은 따로 구입한 것은 아니고,
Kickstarter 라는 클라우드 펀딩에서 Gimbal 장비로 소개된 프로젝트에 투자하여 받은 장비에 있는 것입니다.
아래는 그 Kickstarter 프로젝트 소개 입니다.
Gimbal for your Lights Camera or Action
요런겁니다.
카메라나 전등을 붙이고 원격에서 그 방향을 조절할 수 있는 장치 입니다.
단, 받은 장비는 Hardware 만 있고 Software 는 자기가 만들어야 하는 제품입니다.
2. 부품
Gimbal 에 들어가는 부품은 Futaba 의 다음 두개 입니다.
- S3010
- S3114
이제 이런 부품의 생산도 중국이네요.
3. Layout
Pin 배열입니다.
Servo | Arduino Nano ------------------------- Black | GND Red | 5V White | D9 -------------------------
아래와 같이 연결하면 됩니다.
4. Source
Arduino IDE 에서는 "<Servo.h>" 라는 라이브러리를 제공해 주고 있습니다.
그래서 control pin 정보와 움직이고 싶은 각도만 입력하면 그대로 동작해요.
참 편하죠?
#include "Servo.h" Servo myservo; // create servo object to control a servo void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop(){ myservo.write(0); // sets the servo at 0 degree position delay(1000); // waits for the servo to get there myservo.write(90); // sets the servo at 90 degree position delay(1000); // waits for the servo to get there myservo.write(180); // sets the servo at 180 degree position delay(1000); // waits for the servo to get there myservo.write(90); // sets the servo at 90 degree position delay(1000); // waits for the servo to get there }
5. 결과
소스를 올리고 전원을 넣으면 다음과 같이 움직입니다.
감시 카메라를 올리고 사용하려면 좀더 디테일한 움직임을 보여야 하는데,
일단 동작만 확인합니다.
Servo도 step motor 의 일종일 터인데,
지원 라이브러리로 편하게 동작시킬 수 있는게 좋네요.
FIN
좀더 연구해봐야 겠습니다.
'Hardware' 카테고리의 다른 글
Hardware | AM2322 Temperature & Humidity Sensor (0) | 2017.07.12 |
---|---|
Hardware | Arduino 의 Sensor Shield 사용해 보기 (0) | 2017.07.09 |
Hardware | 삼성 USB 마우스 분해해 보기 (0) | 2017.07.07 |
Hardware | 마이크로소프트 무선 마우스 4000 분해해보기 (0) | 2017.07.04 |
Hardware | 금속탐지기를 조립해 보자 (0) | 2017.07.03 |