Merhaba arkadaşlar ben stajyer Bilgisayar Mühendisi Sevginur. Bu yazımda sizle adım adım projemizi gerçekleştireceğiz. Umarım hiçbir bilginiz dahi yoksa da öğrenerek ve eğlenerek proje sürecini beraber yönetebiliriz. Eğer aklınız da soru işareti kalırsa yorumlardan veya paylaştığım hesaplarımdan bana ulaşabilirsiniz. Haydi başlayalım.
Projenin Amacı
Bu projede amacımız güneş pilini iki Servo motor ve Pan-Tilt kullanarak güneş ışınlarının geldiği yöne döndürmek ve bu sayede sabit olan güneş piline kıyasla daha fazla ışına maruz kalmasını sağlayarak verimi artırmaktır.
Malzemeler
- Arduino UNO R3 – SMD Klon (CH340 Çipli) – USB Kablo Hediyeli
- 4 adet LDR – 5mm – Işığa Duyarlı Direnç
- 2 adet Tower Pro SG90 Mini Servo Motor
- Pan-Tilt Seti – 2 Eksen Servo Tutucu
- 4 adet 10K Direnç
- Elektronik Breadboard
- Erkek/Erkek Jumper Kablo
Kendi Eklentilerim
Güneş pilini ve LDR sensörleri sabitlemek için benimde kullandığım 3D yazıcıdan çıktı alabileceğiniz modellerimi de kullanabilirsiniz.
Pan-tilt ve Servo Motorların Kurulmuş Hali
Devre Şeması
Pin 9’a bağlı servo motor Pan-Tilt’in alt kısmında ,pin 10’a bağlı olan servo motor ise Pan-Tilt’in üst kısmında kullanılmıştır.
Projenin Kodlanması
Kütüphane Kurulumu
Öncelikle Arduino 0016 ve daha eski sürümlerde, Servo kütüphanesi sadece 9 ve 10 numaralı pinleri desteklemektedir. Eğer Arduino 0016 veya daha eski bir sürüm kullanmıyorsak Servo motorumuzu herhangi bir PWM pinine bağlayarak kullanabiliriz. Kütüphanenin kurulumuna geçelim.Sırasıyla Sketch(Taslak)-Include Library(Kitaplığı dahil et)-Manage Libraries(Kitaplıkları yönet ) seçeneklerini tıklıyoruz.Karşımıza çıkan ekranda arama kısmına Servo yazarak karşımıza çıkan kütüphanelerden tercih ettiğimizi indir (install) seçeneğine tıklayarak indiriyoruz.
Servo Motor Testi
#include<Servo.h> //kütüphane
Servo servo1;
int aciDegeri=90;
void setup() {
servo1.attach(9); //pwm pini
}
void loop() {
servo1.write(aciDegeri);
LDR Testi
void setup() {
Serial.begin(9600); //seri haberleşme başlatıyoruz
}
void loop() {
int ldr = analogRead(A1); //Işık değişkenini A1 pinindeki LDR ile okuyoruz
Serial.println(ldr); //Okunan değeri seri iletişim ekranına yansıtıyoruz
delay(50);
}
Son Aşama Projenin Asıl Kodu
#include <Servo.h>// servo kütüphanesi
Servo horizontal; // yatay servo
int servoh = 180;
int servohLimitHigh = 175;
int servohLimitLow = 5;
Servo vertical; // dikey servo
int servov = 45;
int servovLimitHigh = 100;
int servovLimitLow = 1;
// LDR pinleri
int ldrlt = A2; //LDR sol üst
int ldrrt = A3; //LDR sağ üst
int ldrld = A0; //LDR sol alt
int ldrrd = A1; //LDR sağ alt
void setup(){
horizontal.attach(9);
vertical.attach(10);
horizontal.write(180);
vertical.write(45);
delay(2500);
}
void loop() {
int lt = analogRead(ldrlt); // sol üst
int rt = analogRead(ldrrt); // sağ üst
int ld = analogRead(ldrld); // sol alt
int rd = analogRead(ldrrd); // sağ alt
int dtime = 10;
int tol = 90;
int avt = (lt + rt) / 2; // Ortalama üst değer
int avd = (ld + rd) / 2; // Ortalama alt değer
int avl = (lt + ld) / 2; // Ortalama sol değer
int avr = (rt + rd) / 2; // Ortalama sağ değer
int dvert = avt - avd; // üst ile altın farkı
int dhoriz = avl - avr;// sağ ile solun farkı
Serial.print(avt);
Serial.print(" ");
Serial.print(avd);
Serial.print(" ");
Serial.print(avl);
Serial.print(" ");
Serial.print(avr);
Serial.print(" ");
Serial.print(dtime);
Serial.print(" ");
Serial.print(tol);
Serial.println(" ");
if (-1*tol > dvert || dvert > tol)
{
if (avt < avd)
{
servov = ++servov;
if (servov > servovLimitHigh)
{servov = servovLimitHigh;}
}
else if (avt > avd)
{servov= --servov;
if (servov < servovLimitLow)
{ servov = servovLimitLow;}
}
vertical.write(servov);
}
if (-1*tol > dhoriz || dhoriz > tol)
{
if (avl > avr)
{
servoh = --servoh;
if (servoh < servohLimitLow)
{
servoh = servohLimitLow;
}
}
else if (avl < avr)
{
servoh = ++servoh;
if (servoh > servohLimitHigh)
{
servoh = servohLimitHigh;
}
}
else if (avl = avr)
{
delay(5000);
}
horizontal.write(servoh);
}
delay(dtime);
}