Arduino ile servo motor kontrolü uygulamaları Arduino servo motor control applications

Arduino devreleri ve uygulamaları

Arduino ile servo motor kontrolü uygulamaları

360 derece hack servo ile cisim takibi uygulaması

Kod:

int sensor = 2; 
int motorPin1 = 3;
int motorPin2 = 4;
int sensor_durum = 0;

void setup() 
{

pinMode(sensor, INPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
}

void loop() 
{
sensor_durum = digitalRead(sensor);
if (sensor_durum == HIGH)
{

digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);

}
else
{
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);

}}

SoftwarePWM – Kütüphanesiz Servo kontrolü

Arduino’da servo kütüphanesi kullanıldığında kod gereğince sinyal devamlı iletilir. örneğin servo.write(150) dediğimizde servoya sürekli 150 derecede kalmasını söyleyen bir sinyal iletilir. Böylece servo konumunu korur ve elle değiştirilemez. Bu durum bazı projelerde istenen bir şey olsa da, az enerji gerektiren projelerde ve  servonun konumunun manuel olarak değiştirilmesinin gerektiği uygulamalarda kullanılamaz.

Çözüm olarak; servonun hareketini sağlayan PWM sinyalini ayrı bir fonksiyon ile üretebilir ve kontrol edebiliriz. Böylece sinyal bir kere iletilir ve servo o konuma ulaştıktan sonra sinyal kesilir. El ile değiştirilmedikçe servo konumunu korumaya devam eder. Bu fonksiyonu Software (Yazılımsal) PWM olarak adlandıracağız.

Eğer servo hareketi düzgün değilse, çarpım değerini kod içinde ki “pwm = (angle*5) + 500;” 5 rakamını değiştirebilirsiniz.

Arduino ile servo motor kontrolü
Servo motor control with Arduino

int servo = 3;
int angle;
int pwm;
void setup()
{
pinMode(servo, OUTPUT);
}
void loop ()
{
for (angle = 0; angle <= 360; angle += 5) {

servoPulse(servo,angle ); } delay(2000);

for (angle = 360; angle >= 0; angle -= 5) {
servoPulse(servo, angle); }
delay(1000);
}
void servoPulse (int servo, int angle)
{
pwm = (angle*5) + 500;
digitalWrite(servo, HIGH);
delayMicroseconds(pwm);
digitalWrite(servo, LOW);
delay(50);
}

Arduino potansiyometre ile servo motor kontrolü

Bu uygulama da kullanılan potansiyometre değişken analog sinyali takliden kullanılmıştır,uygulama yaparken potansiyometre yerine herhangi bir fiziksel tepki ile iç direnci değişen bir sensör veya analog çıktı veren sensör kartlarından herhangi biri bağlanabilir.

Burada önemli olan konu ” int deger=map(pot_deger,0,1023,0,180);” satırında ki “0” ın GND ye “1023” ün ise +5V a tekabül ettiğidir. kullanılacak sensör veya herhangi bir analog çıktı veren sensör kartı tam olarak “0” V ile “+5V” aralığında voltaj vermeyebilir veya bizim farklı analog değer aralıklarında örneğin +1.25 V ile 4,3 V aralığında servonun 4 ile 160 derece aralığında çalışmasına ihtiyacımız olabilir. bu durumda ” int deger=map(pot_deger,0,1023,0,180);” satırında belirtilen 0,1023,0,180 virgüllerle ayrılmış sıralı rakamların birincisi “0” en düşük analog giriş voltaj seviyesini,ikincisi “1023” en yüksek analog giriş voltaj seviyesini,üçüncü sırada ki “0” servonun alacağı en düşük açı değerini,dördüncüsü “180” servonun alacağı en büyük açı değerini ifade eder.

Örneğin: Bir PTC ile sıcaklık ölçeceğiz ve PTC 10 derece sıcaklık da iken servo “0” derece de duracak ve sıcaklık 90 dereceye doğru yükseldikçe servo sıcaklık yükseldikçe aynı oranda 145 dereceye kadar dönecek.

Bunun için PTC nin oda sıcaklığında ki direnç değeri ile yaklaşık değerde bir gerilim bölücü direnç ile analog girişe bağlanması gerekir ve 10 derece sıcaklıkta analog girişe kaç volt geldiğini ölçmemiz gerekir,örneğin 10 derece sıcaklıkta 1V veriyorsa 1023/5=204 bu değer bizim analog giriş alt seviyemiz.

PTC 90 derece sıcaklıkta 4V veriyorsa ve her bir volt 204 e karşılık geliyorsa 204×4=816 bu değerde bizim analog giriş üst seviyemizdir.

Servo ise bu sıcaklık aralıklarında “0” ile “145” derece arasında çalışacaksa kod içersinde çalışma aralıklarını belirlediğimiz satırın son şekli “int deger=map(pot_deger,204,816,0,145);” şeklinde olur.

Arduino potansiyometre ile servo motor kontrolü
Servo motor control with Arduino potentiometer

#include <Servo.h>

Servo motor;
const byte pot_pin=A3;
int pot_deger;
void setup() {
motor.attach(3);
Serial.begin(9600);
}
void loop() {
pot_deger=analogRead(pot_pin);
int deger=map(pot_deger,0,1023,0,180);
Serial.print(“Pot_Deger= “);
Serial.println(deger);
motor.write(deger);
}

Arduino LDR ve servo ile ışığa duyarlı güneş takip sistemi

Bu uygulamada LDR yerine çift yönlü akım ileten ve fiziksel etkilerle direnci değişken olan herhangi bir aygıt veya analog çıkış veren herhangi bir sensör de bağlanabilir.

LDR,dar bir açıdan ışık alacak şekilde yanları kapatılır ve servo başlangıç durumunda iken güneşin ilk görüleceği noktaya doğuya doğru yönlendirilir ve güneş doğarken LDR yeterli ışığı aldığında batıya doğru dönmeye başlar ve biraz döndüğünde ışık seviyesi azalacağı için tekrar geriye önceki ışık seviyesini bulana kadar doğuya doğru döner,doğuya doğru döndüğünde ışık seviyesi çoğalacağı için tekrar batıya doğru döner ve bu döngü böyle devam eder.Günün sonunda güneş batarken ışık seviyesi LDR yi uyaramayacak seviyeye geldiğinde servo tekrar ilk konumuna yani güneşin ilk doğacağı noktaya geri döner ve güneşi bekler.

NOT: Servo; güneşin çizdiği yay a uygun hareket edeceği açıyla yerleştirildikten sonra, kullanacağımız LDR nin hangi ışık seviyesinde kaç ohm direnç gösterdiğini tam olarak bilemeyeceğimiz için devreyi kalibre etmemiz gerekecek,bunun için güneş doğarken LDR yi en çok ışık alacağı şekilde manuel olarak güneşe çeviririz ve serial port dan “Pot_Deger” e bakıp ,gördüğümüz en yüksek değeri ” int deger=map(pot_deger,0,1023,0,180); ” satırındaki 1023 yerine yazmamız gerekir.

Arduino LDR ve servo ile ışığa duyarlı güneş takip sistemi
Light-sensitive solar tracking system with Arduino LDR and servo

#include <Servo.h>

Servo motor;
const byte pot_pin=A4;
int pot_deger;
void setup() {
motor.attach(3);
Serial.begin(9600);
}
void loop() {
pot_deger=analogRead(pot_pin);
int deger=map(pot_deger,0,1023,0,180);
Serial.print(“Pot_Deger=”);
Serial.println(deger);
motor.write(deger);
}

Arduino iki buton ile sağa ve sola 180 derece servo kontrolü

Solda ki 7 nolu pine bağlı butona basılı tutulduğu sürece servo yavaşça sola doğru döner ve elimizi çekince durur, servo 180 dereceye geldiğinde düğmeye bir tepki vermez,sağda ki 4 nolu pine bağlı butona basıldında da aynı durumun tersi olur.

Arduino iki buton ile sağa ve sola 180 derece servo kontrolü
180 degree servo control to the right and left with two buttons of the Arduino

#include <Servo.h>


Servo myservo;
int pos = 0;
int buton1=4; // buton1, 4 nolu pine tanımlandı
int buton2=7; // buton2, 3 nolu pine tanımlandı
void setup()
{
myservo.attach(3); // servo data ucu 3 nolu pine tanımlandı
pinMode(buton1,INPUT);
pinMode(buton2,INPUT);
}
void loop()
{
if (digitalRead(buton1)==0&&(pos<180)) // butona basıldığı sürece sağa dön

{

pos=pos+1; myservo.write(pos);

delay(15); // servo dönüş hız ayarı

} if (digitalRead(buton2)==0&&(pos>0))
{ // butona basıldığı sürece sola dön
pos=pos-1;
myservo.write(pos);
delay(15);
}
}


Şekil ve şemaların çiziminde tinkercad.com online editör programından yararlanılmıştır

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir