Günümüzde elektronik sistemlerde güvenlik, en az işlevsellik kadar önem taşır. Bu yazıda, Arduino ve benzeri mikrodenetleyici kartları kullanarak sabit bir voltaj kaynağından beslenen devrelerin akımını nasıl kontrol edebileceğimizi ele alacağız. Hedefimiz, bir devrede yükün çektiği akımı sürekli izleyerek, belirlenen sınırları aşan durumlarda devreyi otomatik olarak kapatan, yazılımsal olarak denetlenen bir akım kontrol sistemi oluşturmak. Bu, geleneksel sigorta mantığının mikrodenetleyiciler aracılığıyla dijital bir versiyonu olarak düşünülebilir.
Bu tür devreler, özellikle elektrik sistemlerinde karşılaşılan aşırı akım durumlarına karşı bir tür güvenlik bariyeri sağlar. Fiziksel sigortalar aşırı akımda devreyi açarak bileşenleri korurken, bu proje ile tasarladığımız sistem, daha esnek ve yeniden programlanabilir bir çözüm sunar. Ayrıca, gerçek zamanlı ölçümler yaparak, belirlenen limitlerde çalışma imkanı verir.
Nerelerde Kullanılabilir?
- Endüstriyel Uygulamalar: Büyük makinelerin ve motorların çalıştığı endüstriyel ortamlarda, cihazların güvenli çalışmasını sağlamak amacıyla akım kontrol devreleri yaygın olarak kullanılır. Yüksek akım çeken motorlar ve cihazlar, istenmeyen akım artışlarına maruz kaldığında, bu tip bir sistem devreyi keserek büyük hasarların önüne geçer.
- Akıllı Ev Sistemleri: Akıllı ev teknolojileri, cihazların otomatik kontrolü ve güvenli çalışmasına dayanır. Evdeki cihazların aşırı akım çekmesi durumunda, bu tarz bir dijital sigorta sistemi, elektrik kesilmesini önleyerek güvenliği sağlar.
- Elektrikli Araç Şarj İstasyonları: Elektrikli araçların şarj edilmesi sırasında kullanılan güç yönetim sistemlerinde, aşırı akım durumu sıkça karşılaşılan bir sorundur. Arduino tabanlı bir akım kontrol devresi, araçların güvenli bir şekilde şarj edilmesini sağlayabilir.
- Hobi Elektroniği ve Prototip Tasarımları: Prototip projelerde, aşırı akım durumlarına karşı önlem almak önemli bir adımdır. Arduino ile bu tarz bir koruma sistemi kurarak, proje geliştiricileri elektronik bileşenlerini aşırı akıma karşı koruyabilir.
- Güneş Enerji Sistemleri: Güneş panelleri ve enerji depolama sistemlerinde, aşırı yüklenmeyi önlemek için akım kontrol devreleri kullanılabilir. Bu sistemlerde, enerji yönetimi kritik bir rol oynar ve akım kontrolü ile hem panellerin hem de akülerin güvenliği sağlanır.
Bu gibi akım kontrol devreleri, sadece aşırı akımı engellemekle kalmaz; aynı zamanda enerji verimliliği ve sistem güvenliği açısından da büyük avantajlar sunar. Böyle bir devrenin Arduino ile entegre edilmesi, geliştiricilere esnek ve özelleştirilebilir bir çözüm sunar. Yazılım ile bu sistemin davranışını sürekli değiştirebilir, farklı akım sınırları ve yük tiplerine göre devreyi uyarlayabilirsiniz.
Bu devrenin temel amacı, bir yükün çektiği akımı Arduino ve MOSFET ile kontrol etmek ve belirlenen bir sınırı aşan akım durumunda güç kaynağını devreden çıkartmaktır. Şimdi devredeki bileşenler ve işlevlerini anlatarak başlıyorum:
Devre Bileşenleri
- Arduino UNO : Akım sensöründen gelen verileri okur ve işlem yapar. Akımın belirlenen sınırı aşması durumunda MOSFET’i kontrol eder ve yükü devre dışı bırakır.
- R2 Direnci: Bu direnç, yük olarak kullanılıyor. Direnç değeri ve devreden geçen akım arasında ters bir ilişki vardır. Yani, direnç değeri azaldıkça devreden geçen akım artar. 24V sabit gerilimle, 2A çekebilmek için 12Ω, 1A çekebilmek için ise 24Ω’luk bir direnç kullanılır.
- MOSFET (IRLZ44N – Q1): Bu MOSFET, Arduino’nun sinyaliyle tetiklenir. Arduino, akımın sınır değerini aşması durumunda MOSFET’i kapalı tutarak devreden akım geçişini engeller.
- ACS712 Akım Sensörü (CSM1): Bu sensör, devrede akan akımı ölçer ve Arduino’ya veri gönderir. Arduino, bu verilerle sürekli olarak akımı izler ve yazılımdaki sınırları aşan bir akım tespit ettiğinde MOSFET’i kapatır.
- Kondansatör (C1): Bu eleman devredeki geçici gerilim dalgalanmalarını filtrelemeye yardımcı olur. Daha kararlı bir devre sağlanması açısından önemlidir.
- R1 Direnci: MOSFET’in geçiş anahtarını kontrol eden kapı direncidir. MOSFET’in hızlı ve stabil çalışmasını sağlar.
Devrede Yük Olarak Direnç Kullanımı
Bu devrede, yük olarak R2 dirençlerini kullanıyoruz. Çekilen akım, yük direncine bağlı olarak değişir. Ohm Kanunu’na göre akım hesaplaması şu şekildedir:
I=V/R
Burada, V sabit 24V gerilim ve R yükün direncidir. Örnek tablo şu şekildedir:
Direnç (R) | Akım (I) |
---|---|
24Ω | 1A |
12Ω | 2A |
6Ω | 4A |
2.4Ω | 10A |
Bu tabloya göre, direnç değerini düşürdüğünüzde devreden geçen akım artar. Devreye uygulanan 24V gerilime karşılık, 12Ω’luk bir direnç kullanıldığında devreden 2A akım geçecektir.
Çalışma Prensibi
- Akım Sensörü Okumaları: Arduino, ACS712 akım sensöründen sürekli olarak akım ölçümlerini alır. Bu sensör, devreden geçen akımı analog sinyallere çevirerek Arduino’ya iletir.
- Akım Sınırlama: Arduino programında belirlenen akım sınırları yazılımsal olarak kontrol edilir. Örneğin, sistem 4A ile sınırlandırıldığında ve devredeki yük 4A akımı aşarsa, Arduino bu durumu tespit eder ve MOSFET’i kapatarak akım geçişini durdurur. Böylece devrenin güvenliği sağlanır.
- MOSFET Kontrolü: Arduino, sensörden gelen veriye göre MOSFET’i kontrol eder. Belirlenen sınırların aşılması durumunda MOSFET’i iletimden keser. Böylece yükün çektiği fazla akım engellenmiş olur.
- Yeniden Çalıştırma: Akım sınırları normale döndüğünde (yükü değiştirdiğinizde veya bir sorun giderildiğinde), Arduino tekrar MOSFET’i iletime geçirerek devreyi çalıştırır.
Bu şekilde devrenin aşırı akımlardan korunması sağlanmış olur. Hem donanımsal bileşenler hem de yazılım birlikte çalışarak bu güvenlik mekanizmasını oluşturur.
Kodun Detaylı Açıklaması
Kodumuz iki temel işlevi yerine getiriyor: birincisi akımı sürekli izlemek, ikincisi de akım sınırını aştığında PWM sinyalini keserek devredeki güç geçişini durdurmak.
Kodun Tamamı
const int analogInPin = A0; // Analog giriş pini
const float sensitivity = 0.066; // ACS712-30 için hassasiyet faktörü (66 mV/A)
const float currentLimit = 2.0; // Akım sınırı (2A)
void setup() {
// PWM için portları ayarla
DDRB |= (1 << DDB1) | (1 << DDB2); // PB1 (OC1A) ve PB2 (OC1B) çıkış pinleri olarak ayarlanıyor
// Timer1'i Fast PWM modu, yüksek frekans için yapılandır
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11); // Fast PWM, OC1A/OC1B karşılaştırma eşleşmesinde temizle, tabanda ayarla
TCCR1B = (1 << WGM12) | (1 << WGM13) | (1 << CS10); // Fast PWM, ön ölçekleme yok (CS10 = 1), maksimum frekans
ICR1 = 1600; // PWM periyodunu ayarla, küçük değer = daha yüksek frekans
OCR1A = 1600; // %50 duty cycle ile başla (ICR1'in yarısı)
Serial.begin(9600); // Seri monitörle iletişimi başlat
}
void loop() {
int sensorValue = analogRead(analogInPin); // Akım sensörü değerini oku
// Sensörden gelen değeri voltaja ve sonra akıma çevir
float current = ((sensorValue - 512) * (5.0 / 1023.0)) / sensitivity;
// Akımı seri monitöre yazdır
Serial.print("Measured Current: ");
Serial.print(current);
Serial.println(" A");
// Eğer akım 2A'den büyükse PWM çıkışını kapat (MOSFET'i kapat)
if (current > currentLimit) {
OCR1A = 0; // PWM duty cycle'ı sıfırla, MOSFET kapalı
Serial.println("Current exceeded limit! Power cut.");
} else {
OCR1A = 1600; // Duty cycle'ı %100 olarak ayarla, MOSFET açık
Serial.println("Current is within limit.");
}
delay(500); // Akım ölçüm ve kontrol döngüsü için gecikme
}
1. Değişkenlerin Tanımlanması:
const int analogInPin = A0; // Analog giriş pini
const float sensitivity = 0.066; // ACS712-30 için hassasiyet faktörü (66 mV/A)
const float currentLimit = 2.0; // Akım sınırı (2A)
analogInPin
: ACS712 akım sensöründen gelen sinyali Arduino’nun A0 analog giriş pininden okuyacağız.sensitivity
: Bu, ACS712-30 akım sensörünün hassasiyet değeridir. Bu sensör, 66mV/A hassasiyetle çalışıyor, yani her amper başına 66mV voltaj üretiyor.currentLimit
: Akım sınırı 2A olarak belirlendi. Eğer devredeki akım bu değeri aşarsa, MOSFET’in kapatılması sağlanıyor.
2. setup()
Fonksiyonu:
void setup() {
DDRB |= (1 << DDB1) | (1 << DDB2); // PB1 (OC1A) ve PB2 (OC1B) çıkış pinleri olarak ayarlanıyor
// Timer1'i Fast PWM modu, yüksek frekans için yapılandır
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11); // Fast PWM modu
TCCR1B = (1 << WGM12) | (1 << WGM13) | (1 << CS10); // Ön ölçekleme yok
ICR1 = 1600; // PWM periyodunu ayarlamak için TOP değeri
OCR1A = 1600; // PWM duty cycle %50 başlangıç
Serial.begin(9600); // Seri haberleşmeyi başlat
}
- PWM Ayarları: Bu kısımda Timer1 kullanılarak PWM sinyali üretiliyor. Timer1, Fast PWM moduna ayarlandı ve MOSFET’e gönderilecek PWM sinyaliyle devre üzerindeki yükün kontrolü sağlanıyor.
- ICR1 ve OCR1A: Bu iki register (yazmaç), PWM sinyalinin frekansını ve duty cycle’ını kontrol ediyor.
ICR1 = 1600;
satırı PWM periyodunu ayarlarken,OCR1A = 1600;
satırı duty cycle’ı belirliyor. Bu ayarlarla PWM sinyali başlangıçta %50 duty cycle ile başlatılmıştır. - Serial.begin(9600): Arduino ile bilgisayar arasında seri haberleşme başlatılır. Bu sayede akım ölçümlerini ve diğer çıktıları seri monitörden gözlemleyebiliriz.
3. loop()
Fonksiyonu:
void loop() {
int sensorValue = analogRead(analogInPin); // Akım sensörü değerini oku
float current = ((sensorValue - 512) * (5.0 / 1023.0)) / sensitivity;
Serial.print("Measured Current: ");
Serial.print(current);
Serial.println(" A");
// Eğer akım 2A'den büyükse PWM çıkışını kapat
if (current > currentLimit) {
OCR1A = 0; // PWM duty cycle'ı sıfırla, MOSFET kapalı
Serial.println("Current exceeded limit! Power cut.");
} else {
OCR1A = 1600; // Duty cycle'ı %100 olarak ayarla, MOSFET açık
Serial.println("Current is within limit.");
}
delay(500); // Akım ölçüm ve kontrol döngüsü için gecikme
}
analogRead()
ve Akım Hesaplaması: Bu fonksiyon, ACS712 sensöründen gelen analog sinyali okur ve bu sinyali akıma dönüştürür. Dönüştürme işlemi şu formülle yapılır:
float current = ((sensorValue - 512) * (5.0 / 1023.0)) / sensitivity;
sensorValue
, Arduino’nun analog pini üzerinden okuduğu değerdir. 512, sensörün sıfır akımda verdiği referans değerdir (bu ACS712’nin kalibrasyonuna göre değişir). 5.0/1023.0, Arduino’nun analog okuma çözünürlüğüdür (5V, 10-bit ADC). Bu değer sensörün çıkardığı voltajı hesaplamak için kullanılır, ardından bu voltaj sensör hassasiyet değeri ile bölünerek akıma dönüştürülür.
- Akım Değerinin Seri Monitöre Yazdırılması: Ölçülen akım değeri her döngüde seri monitöre yazdırılır. Bu sayede ölçümleri takip edebilirsiniz.
- Akım Sınırının Kontrolü: Eğer ölçülen akım 2 amperi aşarsa:
if (current > currentLimit) {
OCR1A = 0;
Serial.println("Current exceeded limit! Power cut.");
}
Bu durumda PWM duty cycle sıfırlanır, MOSFET kapanır ve devredeki akım kesilir. Eğer akım sınırın altında ise PWM sinyali %100 duty cycle ile devam eder:
OCR1A = 1600; // Duty cycle'ı %100 olarak ayarla, MOSFET açık
- Gecikme: Döngü her 500 milisaniyede bir çalıştırılır. Bu gecikme, akım değerlerinin düzenli ve okunabilir bir şekilde gözlemlenmesini sağlar.
Proje Sonucu
Bu kod, Arduino ve ACS712 sensörü ile 2A’lik bir akım sınırını izler ve gerektiğinde devreyi korumak için MOSFET’i kapatır. Bu, özellikle elektronik projelerde aşırı akım durumlarının önlenmesi için önemli bir uygulamadır. Kod, Arduino üzerinden PWM kontrolü ve akım sınırlaması ile bir devrenin güvenli çalışmasını sağlar.
Geliştirme ve Uygulama Alanları
Bu sistem daha büyük projelerde kullanılabilir:
- Batarya koruma sistemleri: Aşırı akım çeken cihazları bataryadan ayırmak için kullanılabilir.
- Elektrik motorları: Belirli bir akımın üzerindeki motor yüklerini devreden çıkarmak için uygundur.
- Güç kaynakları: Sabit akım sınırlarına sahip güç yönetim sistemlerinde kullanılarak devrelerin zarar görmesini önleyebilir.
Bu projeyi farklı uygulamalara adapte etmek oldukça kolaydır. Örneğin, akım sınırını değiştirerek daha yüksek veya daha düşük akım sınırları belirleyebilir, farklı yükleri izleyebilir ve devrelerinizi koruyabilirsiniz.