'킥스타터'에 해당되는 글 4건

  1. 2020.08.11 Software | Blynk 사용해 보기
  2. 2019.10.07 Hardware | Arduino 로 Gimbal 컨트롤 하기 2
  3. 2017.07.08 Hardware | Arduino 로 Servo 를 움직여 보자
  4. 2017.06.26 Life | 진공 청소기용 빨대 브러쉬 만들어 보자

Software | Blynk 사용해 보기

|

Arduino 나 ESP8266 을 사용하면서, sensor 로부터 받은 데이터를 표현해주는 방법이 몇 가지 있습니다.

일전에는 ThingSpeak 라는 것을 사용해 봤었죠.


* Software | ThingSpeak 등록하여 IoT 데이터 펼처보기

https://chocoball.tistory.com/entry/Software-ThingSpeak-IoT-monitoring


어느 분께서 댓글 달아 주시길, Blynk 도 좋다고 합니다. 사용해 봤습니다.





1. Blynk 란?


Data 는 있지만, 그 값들을 이해하기 쉬운 방법으로 표시해 주고 모니터링 해주는 어플리케이션 이죠.



클라우드 펀딩으로 시작한 솔루션 입니다.


* Blynk - build an app for your Arduino project in 5 minutes

- https://www.kickstarter.com/projects/167134865/blynk-build-an-app-for-your-arduino-project-in-5-m



Arduino project 를 5분만에 시작할 수 있다고 하지만, 숙련된 사람 이야기 이고, 학습하는 시간이 필요합니다.

다만, 각 프로젝트에 따른 예시나 모듈이 잘 되어 있어서, 하다 보면, 아니... 이렇게 쉽게? 라는 생각이 잠시 드는 때도 있습니다.


KickStarater 클라우드 펀딩을 성공적으로 마무리 하고, 아래 사이트에서 정식 런칭하였습니다.


* Blynk Inc

https://blynk.io/





2. Library 설치


저는 Arduino / ESP8266 에서 받은 값을 전달할 목적이므로, Arduino IDE 에서 모듈을 인스톨 합니다.


Tools > Manage Libraries > Blynk


모듈이 인스톨 되면, Arduino > libraries 에 등록 되어 있는 것을 확인 할 수 있습니다.



자동으로 설치해 주는 방법 외에도, 수동으로 파일을 받아서 설치 할 수도 있습니다.


* Blynk Arduino Library

https://github.com/blynkkk/blynk-library/releases/latest





3. App 설치


프로그래밍을 위한 환경이나 라이브러리가 설치되었으면, 실제로 그 값들을 모니터링 하고 확인할 수 있는 인터페이스가 필요합니다.

Blynk 는 모바일 환경에 최적화가 되어 있으므로, 스마트폰에 관련 어플을 설치합니다.


평점이 좋네요.





4. Project 시작하기


모바일앱에서 어플을 시작하면, 등록이 나옵니다.



Facebook 계정 연동으로 시작해도 되나, 저는 그냥 email 로 사용자 등록 하였습니다.



계정을 만들고 로그인 합니다.



New Project 를 선택합니다. My Apps 메뉴를 이용해서, 개인 전용앱 처럼 꾸밀 수도 있다고 합니다.



시작할 새로운 Project 는 주로 어떤 IoT 기기와 연결될 것 인지를 선택합니다.

저는 ESP8266 을 이용하여, WiFi 연결 뿐만 아니라, arduino 처럼 처리도 시킬 것이기 때문에, ESP8266 을 선택 했습니다.



포름알데히드 센서를 이용한 그래프 모니터링용 이니, 그에 맞게 Title / Device / Connection Type 을 선택해 줍니다.

저는 Formaldehyde / ESP8266 / WiFi 를 선택 했습니다.



Create Project 를 최종적으로 누르면, 새로 생성한 project 에 대한 전용 인증 코드가 생성됩니다.

이 코드는 project 마다 유니크 하며, 메일로도 알려 줍니다.



계정 생성시 사용 했던 email 로 관련된 정보가 왔습니다.


Auth Token





5. 소스코드 생성


누가 5분만에 가능하다 했나... 5분은 여기까지 오느라 훨씬 지났습니다.

다만, 코딩을 쉽게 도와주기 위해 "Sketch generator" 라는 메뉴가 준비되어 있어요.


* Sketch generator

https://examples.blynk.cc/


접속하면, 아래처럼 Board (Device) / Connection 방법 / Auth Token 및 예시를 선택하면 소스코드를 만들어 줍니다!



이 페이지에서 만들어준 기본 코드에, 포름알데히드 측정에 사용되었던 코드를 살짝 추가 하였습니다.


Blynk 사용하지 않은 코드


#include "ze08_ch2o.h"
#include "SoftwareSerial.h"
 
// Instantiate a serial port, whatever Stream you have
// SoftwareSerial ch2oSerial(4, SW_SERIAL_UNUSED_PIN); // RX, TX
SoftwareSerial ch2oSerial(14, 14); // RX, TX
 
// Instantiate a sensor connected to the previous port
Ze08CH2O ch2o{&ch2oSerial};
 
void setup() {
    ch2oSerial.begin(9600);
    ch2oSerial.listen();
    Serial.begin(115200); // Serial Monitor
}
 
void loop() {
    Ze08CH2O::concentration_t reading;
     
    if (ch2o.read(reading)) {
        Serial.print("New value: ");
        Serial.println(reading);
    }
}



Blynk 기능을 입힌 코드


#include "ze08_ch2o.h"
#include "SoftwareSerial.h"

SoftwareSerial ch2oSerial(14, 14); // RX, TX
Ze08CH2O ch2o{&ch2oSerial};

int sensorData;

/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial

#include "ESP8266WiFi.h"
#include "BlynkSimpleEsp8266.h"

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "XXXXXXXXXXXX";
char pass[] = "YYYYYYYYYYYYYYYYYYY";

BlynkTimer timer;

// This function sends Arduino's up time every second to Virtual Pin (5).
// In the app, Widget's reading frequency should be set to PUSH. This means
// that you define how often to send data to Blynk App.
void myTimerEvent() {
	// You can send any value at any time.
	// Please don't send more that 10 values per second.
	
	Ze08CH2O::concentration_t reading;
	if (ch2o.read(reading)) {
		Serial.print("ZE08-CH2O : ");
		Serial.println(reading);
		
		sensorData = reading;
	}
	Blynk.virtualWrite(V5, sensorData);
}

void setup() {
	// Debug console
	Serial.begin(115200);
	
	ch2oSerial.begin(9600);
	ch2oSerial.listen();
	
	Blynk.begin(auth, ssid, pass);
	// You can also specify server:
	//Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
	//Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080);
	
	// Setup a function to be called every second
	timer.setInterval(5000L, myTimerEvent);
}

void loop() {
	Blynk.run();
	timer.run(); // Initiates BlynkTimer
}


위의 Before / After 를 비교해 보면, "Sketch generator" 코드에서 자동으로 만들어준 소스에, 원래 소스를 살짝 입히기만 했습니다.

참 쉽죠?! 제가 작업한 것은 다음 세 가지 뿐 입니다.


- 기본 소스 코드 생성 (이것 마저도 인터넷에서 따옴)

- Sketch generator 이용하여 Blynk 연결 소스 만듬

- Auth Token / WiFi 접근 SSID / Password 적용


가장 눈여겨 들여다 봐야 할 부분은 아래 코드 부분입니다.


	Blynk.virtualWrite(V5, sensorData);


Blynk 는 ESP8266 / ESP32 등에서 받는 data 값 들을, 가상의 Pin 으로 보내는 기능이 있습니다.

Analog / Digital 값들이 다양한 Pin 들을 통해 들어온다 하여도, Blynk 로 보낼 때에는 하나의 가상 Pin 으로 고정해서 보낼 수 있습니다.


이렇게 되면, Device 가 변경되더라도 Blynk 앱에서는 변경을 하지 않아도 됩니다. 자세한 내용은 아래 링크를 참고해 보세요.


* What is Virtual Pins

http://help.blynk.cc/en/articles/512061-what-is-virtual-pins


* How to display ANY sensor data in Blynk app

http://help.blynk.cc/en/articles/512056-how-to-display-any-sensor-data-in-blynk-app





6. ESP8266 에서 실행


ESP8266 에 소스를 입히고 실행시키면, 다음과 같은 화면이 Serial Monitor 에 출력 됩니다.


[5220] Connected to WiFi
[5221] IP: 192.168.1.90
[5221] 
    ___  __          __
   / _ )/ /_ _____  / /__
  / _  / / // / _ \/  '_/
 /____/_/\_, /_//_/_/\_\
        /___/ v0.6.1 on ESP8266

[5227] Connecting to blynk-cloud.com:80
[5586] Ready (ping: 125ms).
ZE08-CH2O : 66
ZE08-CH2O : 112
ZE08-CH2O : 114
ZE08-CH2O : 117
ZE08-CH2O : 116
ZE08-CH2O : 114
...


ASCII code 를 이용하여 Blynk 문자를 잘 만들었네요 :-)



Library 는 Heartbeat 를 통한 연결상태 확인도 해주는 군요. 잘 만들어져 있습니다.



여기까지 진행하면 ESP8266 에서 할 것은 이제 다 했습니다.




7. Blynk 모바일앱에서 설정


Blynk 로 데이터는 들어오고 있으니, 받을 수 있도록 연동 설정하면 됩니다.

데이터를 표현해주는 방법은 여러 가지가 있으나, 대략 Gauge / SuperChart 로 해결 됩니다.


스마트 폰에서 Create Project 후에 나오는 빈 화면 아무곳을 터치하면, Widget Box 가 아래처럼 뜹니다.

건전지 아이콘에 2000 크레딧이 미리 충전 (무료) 되어 있습니다.

이걸 다 쓰면, 돈을 충전해서 사용해야 합니다. 각 메뉴 추가시 크레딧이 차감되니 신중하게 위젯을 만들어야 합니다.



처음에 멋도 모르고 "Value Display" 를 설정 했더랬습니다. 그냥 조금하게 값만 표시됩니다.



역시 데이터 값 표현은 차트죠. SuperChart 만들어 봅니다.

PIN 정보는 항상 "Virtual 5 PIN" 으로 했습니다만, 다른 Pin 들도 다이렉트로 사용할 수 있나 봅니다.



만들어진 위젯에 손가락을 잠깐 동안 올려 놓으면, 위치를 이동 시킬 수 있습니다.



이제 센서 값들의 모니터링은 일상으로 사용하는 스마트폰에서 바로바로 확인이 가능하게 됩니다.

웹페이지를 띄울 필요도 없고, 인증을 걸 필요도 없이, 하나의 앱 처럼 사용할 수 있어서 편하긴 합니다.




FIN


And

Hardware | Arduino 로 Gimbal 컨트롤 하기

|

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?

https://arduino.stackexchange.com/questions/994/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~!


And

Hardware | Arduino 로 Servo 를 움직여 보자

|

1. Servo

보통 전원만 들어오면 한쪽으로만 도는 모터도 있지만,

무선 조정 자동차 등에 들어가는 전자 제어식 모터가 있습니다.

이 모터는 각도 및 방향을 지정할 수 있습니다.


이런 모터 중 하나가 Servo 입니다.


제가 가지고 있는 것은 따로 구입한 것은 아니고,

Kickstarter 라는 클라우드 펀딩에서 Gimbal 장비로 소개된 프로젝트에 투자하여 받은 장비에 있는 것입니다.


아래는 그 Kickstarter 프로젝트 소개 입니다.


Gimbal for your Lights Camera or Action

https://www.kickstarter.com/projects/2035152529/gimbal-for-your-lights-camera-or-action?ref=user_menu


요런겁니다.



카메라나 전등을 붙이고 원격에서 그 방향을 조절할 수 있는 장치 입니다.

단, 받은 장비는 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

좀더 연구해봐야 겠습니다.

And

Life | 진공 청소기용 빨대 브러쉬 만들어 보자

|

1. Kickstarter

자주 가는 클라우드 펀딩 사이트인 Kickstarter 에서 진공 청소기 끝에 빨대를 달아 만든 브러쉬가 나온 적이 있습니다.


https://www.kickstarter.com/projects/885698542/dusty-brush-the-new-way-to-clean-0



컨셉은 아래 그림처럼, 끝단을 빨대같은 모양으로 만들어

자유 자재로 변화하게 만든 제품이었습니다.


이렇게 되면 먼지가 많이 쌓이는 구석진 공간이나 창틀 밑 등의, 먼지/쓰레기가 잘 쌓이는 곳도 쉽게 청소할 수 있습니다.


일반적으로 창틀 청소해 보면, 빨아들이는 바람이 구석까지 도달하지 못하여,

손으로 주위를 감싸 줘야만 겨우 조금 빨아들이는 상황을 연출할 수 있습니다. 



정말 좋은 아이디어가 아닐 수 없습니다.

한번 시험해 보고 싶어졌습니다.




2. Star 다방

제가 자주 가는 마음의 고향... Star 다방 에서 조금씩 넉넉하게 가져왔던 빨대를 이용하면 좋을것 같습니다.

이 자리를 빌어 감사의 마음을 밝힙니다.


보통의 빨대도 있지만,

구멍이 큰, 두꺼운 빨대도 있습니다.


작은 구멍만으로는 막힐 수도 있고, 큰 알갱이를 빨아들이기 위해서는 간간히 섞어 주는게 좋을 듯 합니다.




3. 만들어서 사용해 보기

그까이꺼 뚝딱 만들어 봅니다.

큰 빨대를 가운데에 놓아주고 주위를 작은 구멍의 빨대로 둘러 싸줬습니다.

그리고 검은 테이프로 둘둘 감아 줬습니다.


청소기에 결합 시, 조금 뻑뻑하게 들어가게 해야 바람이 옆으로 세지 않습니다.



역시 몇번 사용했더니만 뭉툭해져 버렸습니다.

각도를 줘야 협소한 공간도 들어갈 수 있으니, 45도로 잘라 줍니다.


구석진 코너나 밤문 턱 주위 등, 먼지가 살 쌓이지만 진공청소기가 접근할 수 없는 곳에 사용해 보니...


"따봉 !!!"

"언빌리버블 !!!"


딱 기대하던 효과가 나오네요. 정말 좋은 아이디어 맞습니다.


이제 이 집에 이사와서 무려 5년만에 처음으로 베란다 창틀을 청소해 봅니다.



밖에서 들어오지 못한 먼지 (흙 ?) 이 굳어서 원래 색이 보이지도 않습니다.

거기에 벌래들이 겨우내 들어와서 겨울잠을 자다 죽은 사체도 있네요.


일단 창틀에 스크레치를 내지 않는 일회용 나무 젓가락으로 가능한 긁어 냅니다.


그리고 드더이 빨아들여 봅니다.

끝단의 45도 덕에 쏙 들어가네요.



가운데 부분에 흙더미와 벌레 사체가 쌓여 있었는데,

한번의 훔침으로 싹 없어졌습니다. 효과 짱 !!!



긁어지지 않은 때는 휴지로 덮고 락스로 뿌려서 불린 다음 닦아 내면 됩니다.



다른 창틀도 작업하고 오늘은 이제 그만. 쉬어야 겠습니다.

진공 청소기로 구석을 직접 빨아들이는 효과는 짱 입니다.




FIN

좀더 견고하게 다시한번 만들어서 두루두루 쓰고 싶네요.

And
prev | 1 | next