Kita mengenal bermacam-macam motor DC, motor servo adalah motor DC yang sudah dilengkapi dengan driver, gear dan potensio didalamnya, sehinga motor ini bisa digerakan beberapa derajat saja secara bolak-balik secara akurat. Servo membutuhkan signal PWM pulse width modulation, dengan lebar pulsa yang didesign secara tepat akan membuat servo bergerak sesuai keinginan kita.
Mini Servo |
Arduino UNO |
Beberapa robot humanoid, robot hexapod dan robot berkaki selalu menggunakan servo sebagai penggerak mekaniknya, dikarenakan artificial muscle saat ini masih dikembangkan dan belum cukup kuat untuk beban-beban besar. So kenapa kita ga membuat sendiri artificial muscle, toh tidak sulit membuatnya, hanya membutuhkan peralatan laboraturium dan sedikit ilmu kimia, hahaha... Jangan salah dipasaran ada servo berukuran kecil yang memiliki torsi 50Kg, pabrik-pabrik mobil menggunakan servo-servo besar yang berfungsi sebagai arm bot untuk mengelas rangka mobil secara otomatis, memang sulit mencari rongsokan yang satu ini, haha...
Humanoid robot |
Hexapod robot |
Arm Robot |
Berikut sketch nya :
#include <Servo.h> //library
Servo myservo; // objek untuk mengontrol servo
// max 8 servo
int pos = 0; // variabel posisi
void setup()
{
myservo.attach(9); // pin output servo
}
void loop()
{
for(pos = 0; pos < 60; pos += 1) // berputar dari 0 ke 60
{ // step 1 derajat
myservo.write(pos);
// komando servo ke variable 'pos'
delay(15); // delay 15ms
}
for(pos = 60; pos>=1; pos-=1) // dari 60 ke 0 derajat
{
myservo.write(pos); // komando ke variabel 'pos'
delay(15); // delay 15ms
}
}
#auto servo rotating video
Mini servo hanya dapat berputar penuh sebesar 60 derajat, jika servo bergetar artinya signal PWM atau lebar pulsa tidak tepat, angle terlalu besar atau delay terlalu dekat. Sekarang saya mencoba menggunakan potensio sebagai kontrol penuh putaran servo, potensio ini akan berfungsi sebagai joystick.
Berikut sketch nya :
#include <Servo.h> //library
Servo myservo; // servo objek
int potpin = 0; // analog pin 0, input potensio
int val; // variabel potensio
void setup()
{
myservo.attach(9); // pin 9, servo output
}
void loop()
{
val = analogRead(potpin); // membaca nilai pot (0 - 1023)
val = map(val, 0, 1023, 0, 59);
// kalkulasi nilai pot ke servo (0 - 60 derajat)
myservo.write(val); // posisi
delay(15); // delay 15ms
}
#servo dengan potensio video
Untuk mendapatkan IDE integrated development environtment Arduino yang terbaru silahkan download disini : IDE arduino
Arduino IDE |
Kemampuan servo ini sangat beragam aplikasinya, seperti kemudi, kontrol arah kamera, arm bot, trigger, pencet tombol, central lock misal kita mau membuat rumah yang terkomputerisasi dan bisa di remote dari jarak jauh, servo bisa digunakan untuk penggerak mekanik central lock, apalagi ya...sejauh apa daya imajinasi dan kebutuhan anda sejauh itu pula aplikasi yang dapat dilakukan servo ini.
Radar Arduino dengan mini servo plus sentuhan processing
Simpel amat dan singkat amat sketch nya? Ya iyalah soalnya saya ga membuat program dari awal, saya menggunakan header file atau library servo, kontrol servo sebenarnya sudah dibakukan difile library tersebut, so pas bikin sketch kita tinggal masukan pin IO, beberapa fungsi tambahan jika dibutuhkan dan memasukan nilai delay saja, pengaturan timer signal PWM diatur di file library ini, file ini bisa kita pelajari ko dan kita juga bisa membuat sendiri file library, ato kita membuat sketch tanpa file library, hanya saja sketch program akan menjadi agak panjang, kalo mau tau seperti apa file library servo, ni kaya gini isinya :
/*
Servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2
Copyright (c) 2009 Michael Margolis. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method.
The servos are pulsed in the background using the value most recently written using the write() method
Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached.
Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four.
The sequence used to sieze timers is defined in timers.h
The methods are:
Servo - Class for manipulating servo motors connected to Arduino pins.
attach(pin ) - Attaches a servo motor to an i/o pin.
attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds
default min is 544, max is 2400
write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds)
writeMicroseconds() - Sets the servo pulse width in microseconds
read() - Gets the last written servo pulse width as an angle between 0 and 180.
readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release)
attached() - Returns true if there is a servo attached.
detach() - Stops an attached servos from pulsing its i/o pin.
*/
#ifndef Servo_h
#define Servo_h
#include <inttypes.h>
/*
* Defines for 16 bit timers used with Servo library
*
* If _useTimerX is defined then TimerX is a 16 bit timer on the curent board
* timer16_Sequence_t enumerates the sequence that the timers should be allocated
* _Nbr_16timers indicates how many 16 bit timers are available.
*
*/
// Say which 16 bit timers can be used and in what order
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define _useTimer5
#define _useTimer1
#define _useTimer3
#define _useTimer4
typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ;
#elif defined(__AVR_ATmega32U4__)
#define _useTimer3
#define _useTimer1
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ;
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
#define _useTimer3
#define _useTimer1
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ;
#elif defined(__AVR_ATmega128__) ||defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__)
#define _useTimer3
#define _useTimer1
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ;
#else // everything else
#define _useTimer1
typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ;
#endif
#define Servo_VERSION 2 // software version of this library
#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo
#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached
#define REFRESH_INTERVAL 20000 // minumim time to refresh servos in microseconds
#define SERVOS_PER_TIMER 12 // the maximum number of servos controlled by one timer
#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER)
#define INVALID_SERVO 255 // flag indicating an invalid servo index
typedef struct {
uint8_t nbr :6 ; // a pin number from 0 to 63
uint8_t isActive :1 ; // true if this channel is enabled, pin not pulsed if false
} ServoPin_t ;
typedef struct {
ServoPin_t Pin;
unsigned int ticks;
} servo_t;
class Servo
{
public:
Servo();
uint8_t attach(int pin); // attach the given pin to the next free channel, sets pinMode, returns channel number or 0 if failure
uint8_t attach(int pin, int min, int max); // as above but also sets min and max values for writes.
void detach();
void write(int value); // if value is < 200 its treated as an angle, otherwise as pulse width in microseconds
void writeMicroseconds(int value); // Write pulse width in microseconds
int read(); // returns current pulse width as an angle between 0 and 180 degrees
int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release)
bool attached(); // return true if this servo is attached, otherwise false
private:
uint8_t servoIndex; // index into the channel data for this servo
int8_t min; // minimum is this value times 4 added to MIN_PULSE_WIDTH
int8_t max; // maximum is this value times 4 added to MAX_PULSE_WIDTH
};
#endif
File ini akan berwarna jika dibuka menggunakan IDE, ini saya warnain tapi ga semua cape eui...., kalo kamu menggunakan linux maka semua file program akan ditampilkan secara berwarna, manteb ga tuh? Jadi memudahkan kita untuk mengurangi kesalahan, berbeda dengan note pad bawaan Wind*ws tidak berwarna, comment promt pun tidak berwarna, padahal hidup ini akan terasa indah karena warna, karena warna itu bisa mewakili makna dan fungsi, hehe...
Ah susah pake linux?
Oh ya...pernah pake linux? Pernah liat orang pake linux? Pasti jawabannya ngga! Jadi keyakinan susah pake linux itu adalah rumor yang mendominasi, hingga diadopsi secara instan, pake linux mudah ko, mudah banget, and buanyak plus-plusnya, hahaha...it's truly...., dari tampilan aja dulu...semua teman-teman saya setelah melihat linux saya semuanya jadi murtad ko, hahaha....
Kamu bisa dual boot artinya kamu punya OS Wind*ws dan Linux dalam satu PC ato Laptop, bedanya Linux itu OPEN SOURCE kode terubuka, jadi buat anda yang suka programming dan gemar musing-musingin diri, Linux pasti cocok buat kamu, tapi Linux sekarang dah terlalu mudah, saya aja dah jarang banget maen-maen CLI comment line interface, itutu comment promt kalo diwind*ws.
Sampai ketemu di tulisan-tulisan saya selanjutnya.
No comments:
Post a Comment