PLC'de olduğu gibi ladder diyagramı hazırlayıp bunu arduinoya yüklemek mümkün olur mu diye soranlar için örnek bir çalışma hazırladım. Bu çalışmayı baz alarak arduino programlama bilmeyenlerin de plc ile yapılan bir çok kumanda devresini, en ucuz plc fiyatının onda biri hatta arduinoyu yurt dışı alış veriş sitelerinden temin edilmesi durumunda otuzda biri fiyatta olan olan arduino ile yapabilmeleri mümkün.
Bundan sonraki açıklamaları arduino programlamayı bilmeyip ladder programlamayı bilenleri dikkate alarak aşama aşama yapacağım:
Örnek kumanda devremizde bir motor bir start butonu ile mühürlemeli olarak çalıştırılacak ve motorumuz stop butonuna basılana dek dönmeye devam edecek. Şimdi bu kumanda devresini ladder program olarak hazırlayıp arduinoumuza yükleyip devrenin çalışmasını gözlemleyeceğiz.
Ladder diyagramını hazırlamak için waltech_ladder_maker programı gerekli olacak. Bu programı download bölümünden ya da internette arama yaparak farklı kaynaklardan işletim sisteminize uygun versiyonunu indirebilirsiniz.
İstenilen özellikte çalışması istenen otomatik kumanda devresi aşağıdaki şekilde olacaktır.
Klasik kumanda devresine göre hazırlanmış olan PLC programı aşağıdaki şekilde olacaktır.
Şimdi arduino için ladder programını waltech_ladder_maker programı ile aşağıdaki gibi hazırlayalım:
Bu çizimi yaparken kullanacağımız arduino modelini hardware menüsünden seçmemiz gerekir. Bu işlemi yapmayı unutmayınız. Ben arduino uno modelini kullandığım için Arduino Unoyu seçtim.
Daha sonra Help menüsünden arduinomuzun giriş ve çıkış pinlerine bakarak programı hazırlarken uygun giriş ve çıkışları kullanmaya dikkat ediyoruz. Örneğimizde durdurma butonu için A0, başlatma butonu için A1 ve çıkış için D5 pinini kullandık.
Bu pinler waltech_ladder_maker programında şu giriş ve çıkışlara karşılık gelmektedir: in_1: A1 in_2: A0 out_1: D5 Diğer giriş ve çıkış pinlerini kullanmadığımız için yazmaya gerek görmedim.
Hazırlanan ladder programın arduinoya aktarılması: Burası tahmininizden çokdaha kolay olacaktır. Arduinoide programına ihtiyaç yoktur. Bilgisayarınıza arduinousb bağlantısını yaptıktan sonra waltech_ladder programında compile butonuna tıklamanız yeterli. 15 - 20 saniye içerisinde programınız arduinoya yüklenmiş ve arduinonuz yüklenmiş olaan programa uygun olarak çalışmaya hazır olacaktır.
Sıra geldi arduinoya diğer devre elemanlarının bağlantısını yapmaya: Devre şemasını hazırlarken dikkat edilmesi gereken bir nokta var: Örneğimizde giriş elemanlarını (başlatma ve durdurma butonları) arduino ile irtibatlandırırken arduinoya atılan programın özelliği nedeniyle girişlerin low-aktive özellikte olduğunu bilmeliyiz. Yani girişlere lojik sıfır seviyesi uygulandığında girişler aktif olmakta ve çıkış buna göre belirlenmektedir. Arduino girişleri aktif yapılmak istendiğinde hangi buton aktif olacaksa o buton üzerinden arduinonun ilgili girişine lojik 0 seviyesi uygulanmalıdır. Bu bilgiler ışığında devre şemamız aşağıdaki şekli alacaktır.
Bu dersimizde PIR sensör kontrollü çakar lamba uygulaması yaparken PIR sensör ve röle modülünün de nasıl kullanılacağını öğreneceğiz.
Soru: Sistemde hareket algılamak üzere 1 adet PIR sensör ve 2 adet lamba bulunmaktadır. PIR sensör hareket algıladığında birinci lamba 250'şer ms aralıklarla 3 defa yanıp sönerken, ikinci lambanın sönük kalması ve birinci lamba 3 kere flash çaktıktan sonra ikinci lambanın 3 kere 250 ms aralıklarla yanıp sönerken birinci lambanın sönük kalması istenmektedir. Bu senarya 6 kere tekrarlanacak ve ortaamdaki hareketlilik sona erdiyse sistem duracaktır. Hareketlilik devam ediyorsa yukarıdaki senarya tekrar uygulamaya sokulacaktır.
Çözüm: Öncelikle bizden ne istendiğinin net bir şekilde anlaşılması için söz konusu senaryoya ait akış diyagramını hazırlayalım. Daha sonra oluşturduğumuz bu akış diyagramından program yazarken faydalanacağız.
Bu akış diyagramına göre yazılması gereken program şu şekilde olacaktır:
PIR sensörünün Vcc pini arduinonun 5V pinine ve ya 3,5Volt pinine PIR sensörünün GND pini arduinonun GND pinine PIR sensörünün OUT pini arduinonun A0 pinine Röle modülünün Vcc pini arduinonun 5V pinine Röle modülünün GND pini arduinonun GND pinine Röle modülünün IN1 pini arduinonun D0 pinine Röle modülünün IN2 pini arduinonun D1 pinine bağlanmalıdır.
Ayrıca röle modülünün RL1 ve RL2 çıkışlarına birer lamba bağlanır. Nasıl bağlanacağını bilmeyenler sorabilirler.Yanlış bağlantı yapılması durumunda devrede kullanılan malzemelerin zarar görmesi muhtemeldir.
Bu dersimizde ileride yapacağımız bazı uygulamalarda da lazım olacak olan joystick ile dc motor hız ayarının yapılmasını öğreneceğiz.
Devrenin çalışma prensibi: Arduinomuzun analog 5. girişe Joystick modülünün Y çıkışı bağlanmıştır. Aslında Joystick modül 2 adet potansiyometreden ibarettir. Joysticke müdahale edilmediğinde içindeki her iki potansiyometre orta konumdadır. Potansiyometrelerin birer uçları +VCC'ye,diğer uçları da GND'ye bağlandığında orta uçlarında 5 voltun yarısı olan 2,5 volt görünür. O halde Joystick kolunu aşağıya doğru indirdiğimizde analog 5. girişe giden orta uçtaki gerilim 2,5 Volt ile 0 Volt arasında değişim gösterir. Bu değişim de arduino içindeki program tarafından değerlendirilerek dijital 5. çıkışta dc motoru sürecek olan pwm sinyalini elde etmiş oluruz. Değişken bir pwm sinyali de motoru da değişik hızlarda dönmesini sağlar.
int gaz_pedali=A5; // GAZ PEDALI ANALOG 5 PİNİNE BAĞLANACAK int motor=5; // MOTORA DİJİTAL 5 PİNİNDEN ENERJİ VERİLECEK int hiz; // HIZ TANIMLAMASI
void setup() {
}
void loop() { // MOTOR HIZI AYARI BURADA BAŞLADI hiz= analogRead(gaz_pedali); // GAZ PEDALINDAKİ VOLTAJI OKU hiz= map(hiz, 511, 0, 0, 255); // OKUNAN 5 VOLT İLE 0 VOLT ARASINDAKİ VOLTAJI HIZA DÖNÜŞTÜR analogWrite(motor, hiz); // HESAPLANAN HIZI MOTORA AKTAR delay(10); // 10 ms BEKLE // MOTOR HIZI AYARI BURADA BİTTİ } ISIS devre şeması: Devre şemasına ait dosyakonu ekinde mevcuttur.
Bu dersimizde kömür sobasını kalorifer olarak kullanmayı öğreneceğiz.
Yapacağımız sistemin özellikleri: 1. Sistemin çalışması ve güvenlik tedbirleri arduino ile kontrol edilmektedir.
2. Sistemin elektrik kesilmelerine karşı güvenlik tertibatı mevcut olup, elektrik kesintisi durumunda kesintisiz güç kaynağı ile beslenmektedir.
3. Sistemde suyun aşırı ısınması durumunda suyun buhar basıncı oluşturması önlenmiş böylece kazanın patlama riskinin önüne geçilmiştir. Alışıla gelmiş sistemlerde suyun aşırı ısınması sonucunda buhar basıncı oluşmakta ve bu basınçlı buhar bazı güvenlik tedbirleriyle dışarıya atılmaktadır. Oysa ki bu sistemde kesinlikle buhar basıncı oluşmamaktadır ve daha güvenlidir.
4. Kazan suyunun her hangi bir nedenle eksilmesi durumunda sistem bir selenoid valfi açarak şehir şebekesinden otomatik olarak su takviyesi yapmaktadır.
5. Yapılan gözlemlerde kazanda ısınan suyun 5 dakikada en son peteğe ulaştığı gözlenmiştir. Yapılan denemeler neticesinde su pompasının 5'şer dakika aralıklarla çalıştırılıp durdurulmasıyla peteklerin daha fazla ısındığı gözlendi. Bu nedenle arduino programı pompayı 5'şerdakika aralıklarla çalıştırıp durduracak şekilde hazırlanmıştır.
6. Sistem 100 metrekarelik bir dairede denenmiş ve peteklerin üzerindeki maksimum sıcaklık 70 derece olarak ölçülmüştür.
7. Sistem 1 KASIM - 20 MAYIS aralığında çalıştırılmış olup 2 ton kömür tüketmiştir.
8. Sistem; suyun eksik olması, suyun takviyesinin yapıldığı, pompanın çalıştığı ya da durduğu gibi olası periyotlar lcd ekranda görüntülenmekte olup kullanıcıyı bilgilendirmektedir.
9. Sistem deneme yanılma yoluyla bu halini almıştır. Tuğlalı soba yerine kovalı soba kullanılması durumunda sistemin daha verimli çalışacağı kanaati oluşmuş olup bu durumda üst kazan kullanmaya gerek yoktur.
10. Sistem bu haliyle 100 metrekarelik dairedeki 8 metrelik peteği besleyebilmiştir.
11. İsteğe bağlı olarak petek sıcaklığı lcd displayde görüntülenebilmektedir.
Malzeme ve araç gereç listesi:
1. 2 tabaka sac 2. Yemek kazanı (36 litre) 3. Kesintisiz güç kaynağı 4. Kömür sobası 5. Arduino uno 6. 16 x 2 lcd shild 7. BC 238 transistör 8. BC 307 transistör 9. Devirdaim pompası 10. Selenoid valf
// TASARIM: HASANA ERTURK TRABZON MESLEKI VE TEKNIK ANADOLU LISESI 2015 EYLUL
// ALT PROGRAM SU EKSİK OLDUGUNDA POMPAYI DURDUR BASLADI void su_kes() { digitalWrite(0, HIGH); } // ALT PROGRAM SU EKSİK OLDUGUNDA POMPAYI DURDUR BITTI
int sensor=1; const int sensorpini = 13; // 13 NOLU PIN SENSOR PINIDIR int sensor_durum = 0; int SicaklikPin = 5; // LM35 sensöre bağlı pin (Analog 0) int OkunanDeger; // Analog 0'dan okunacak değer (0-1023) LM35'in vereceğı en büyük okuma değeri 1V=205 olacak. int Sicaklik; //
// ANA PROGRAM BURADA BASLADI void loop() { sensor_durum = digitalRead(sensorpini); if (sensor_durum == HIGH) { sensor = digitalRead(13); // 13 NOLU PINDEKI LOJIK SEVİYEYI OKU digitalWrite(0, sensor); // 13 NOLU PINDEKI LOJIK SEVİYE NE İSE 0 NOLU PINE AKTAR digitalWrite(1, sensor); // 13 NOLU PINDEKI LOJIK SEVİYE NE İSE 1 NOLU PINE AKTAR lcd.clear(); // LCD TEMIZLE OkunanDeger = analogRead(SicaklikPin); Sicaklik = map (OkunanDeger, 0, 205, 0, 100); //ANALOG 5'INCI PINDE OKUNANA VOLTAJI DERECEYE DONUSTURUR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("PETEK: "); // ILK SATIRA PETEK: YAZILDI lcd.print(Sicaklik); // DEVAMINA HESAPLANAN SICAKLIK YAZILDI lcd.print(" DERECE"); // DEVAMINA SICAKLIK BİRİMİ YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("POMPA CALISIYOR"); // IKINCI SATIRA POMPA START YAZILDI delay(60000); // 1 DAKIKA BEKLE (BU SURE POMPANIN DEVREDE KALACAGI SUREYI BELIRLER)
lcd.clear(); // LCD TEMIZLE OkunanDeger = analogRead(SicaklikPin); Sicaklik = map (OkunanDeger, 0, 205, 0, 100); //ANALOG 5'INCI PINDE OKUNANA VOLTAJI DERECEYE DONUSTURUR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("PETEK: "); // ILK SATIRA PETEK: YAZILDI lcd.print(Sicaklik); // DEVAMINA HESAPLANAN SICAKLIK YAZILDI lcd.print(" DERECE"); // DEVAMINA SICAKLIK BİRİMİ YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("POMPA CALISIYOR"); // IKINCI SATIRA POMPA START YAZILDI delay(60000); // 1 DAKIKA BEKLE (BU SURE POMPANIN DEVREDE KALACAGI SUREYI BELIRLER)
lcd.clear(); // LCD TEMIZLE OkunanDeger = analogRead(SicaklikPin); Sicaklik = map (OkunanDeger, 0, 205, 0, 100); //ANALOG 5'INCI PINDE OKUNANA VOLTAJI DERECEYE DONUSTURUR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("PETEK: "); // ILK SATIRA PETEK: YAZILDI lcd.print(Sicaklik); // DEVAMINA HESAPLANAN SICAKLIK YAZILDI lcd.print(" DERECE"); // DEVAMINA SICAKLIK BİRİMİ YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("POMPA CALISIYOR"); // IKINCI SATIRA POMPA START YAZILDI delay(60000); // 1 DAKIKA BEKLE (BU SURE POMPANIN DEVREDE KALACAGI SUREYI BELIRLER)
lcd.clear(); // LCD TEMIZLE OkunanDeger = analogRead(SicaklikPin); Sicaklik = map (OkunanDeger, 0, 205, 0, 100); //ANALOG 5'INCI PINDE OKUNANA VOLTAJI DERECEYE DONUSTURUR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("PETEK: "); // ILK SATIRA PETEK: YAZILDI lcd.print(Sicaklik); // DEVAMINA HESAPLANAN SICAKLIK YAZILDI lcd.print(" DERECE"); // DEVAMINA SICAKLIK BİRİMİ YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("POMPA CALISIYOR"); // IKINCI SATIRA POMPA START YAZILDI delay(60000); // 1 DAKIKA BEKLE (BU SURE POMPANIN DEVREDE KALACAGI SUREYI BELIRLER)
lcd.clear(); // LCD TEMIZLE OkunanDeger = analogRead(SicaklikPin); Sicaklik = map (OkunanDeger, 0, 205, 0, 100); //ANALOG 5'INCI PINDE OKUNANA VOLTAJI DERECEYE DONUSTURUR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("PETEK: "); // ILK SATIRA PETEK: YAZILDI lcd.print(Sicaklik); // DEVAMINA HESAPLANAN SICAKLIK YAZILDI lcd.print(" DERECE"); // DEVAMINA SICAKLIK BİRİMİ YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("POMPA CALISIYOR"); // IKINCI SATIRA POMPA START YAZILDI delay(60000); // 1 DAKIKA BEKLE (BU SURE POMPANIN DEVREDE KALACAGI SUREYI BELIRLER)
lcd.clear(); // LCD TEMIZLE OkunanDeger = analogRead(SicaklikPin); Sicaklik = map (OkunanDeger, 0, 205, 0, 100); //ANALOG 5'INCI PINDE OKUNANA VOLTAJI DERECEYE DONUSTURUR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("PETEK: "); // ILK SATIRA PETEK: YAZILDI lcd.print(Sicaklik); // DEVAMINA HESAPLANAN SICAKLIK YAZILDI lcd.print(" DERECE"); // DEVAMINA SICAKLIK BİRİMİ YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("POMPA CALISIYOR"); // IKINCI SATIRA POMPA START YAZILDI delay(60000); // 1 DAKIKA BEKLE (BU SURE POMPANIN DEVREDE KALACAGI SUREYI BELIRLER)
lcd.clear(); // LCD TEMIZLE OkunanDeger = analogRead(SicaklikPin); Sicaklik = map (OkunanDeger, 0, 205, 0, 100); //ANALOG 5'INCI PINDE OKUNANA VOLTAJI DERECEYE DONUSTURUR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("PETEK: "); // ILK SATIRA PETEK: YAZILDI lcd.print(Sicaklik); // DEVAMINA HESAPLANAN SICAKLIK YAZILDI lcd.print(" DERECE"); // DEVAMINA SICAKLIK BİRİMİ YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("POMPA CALISIYOR"); // IKINCI SATIRA POMPA START YAZILDI delay(60000); // 1 DAKIKA BEKLE (BU SURE POMPANIN DEVREDE KALACAGI SUREYI BELIRLER)
lcd.clear(); // LCD TEMIZLE OkunanDeger = analogRead(SicaklikPin); Sicaklik = map (OkunanDeger, 0, 205, 0, 100); //ANALOG 5'INCI PINDE OKUNANA VOLTAJI DERECEYE DONUSTURUR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("PETEK: "); // ILK SATIRA PETEK: YAZILDI lcd.print(Sicaklik); // DEVAMINA HESAPLANAN SICAKLIK YAZILDI lcd.print(" DERECE"); // DEVAMINA SICAKLIK BİRİMİ YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("POMPA CALISIYOR"); // IKINCI SATIRA POMPA START YAZILDI delay(60000); // 1 DAKIKA BEKLE (BU SURE POMPANIN DEVREDE KALACAGI SUREYI BELIRLER)
lcd.clear(); // LCD TEMIZLE OkunanDeger = analogRead(SicaklikPin); Sicaklik = map (OkunanDeger, 0, 205, 0, 100); //ANALOG 5'INCI PINDE OKUNANA VOLTAJI DERECEYE DONUSTURUR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("PETEK: "); // ILK SATIRA PETEK: YAZILDI lcd.print(Sicaklik); // DEVAMINA HESAPLANAN SICAKLIK YAZILDI lcd.print(" DERECE"); // DEVAMINA SICAKLIK BİRİMİ YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("POMPA CALISIYOR"); // IKINCI SATIRA POMPA START YAZILDI delay(60000); // 1 DAKIKA BEKLE (BU SURE POMPANIN DEVREDE KALACAGI SUREYI BELIRLER)
digitalWrite(1, LOW); // POMPA DURDU lcd.clear(); // LCD TEMIZLE OkunanDeger = analogRead(SicaklikPin); Sicaklik = map (OkunanDeger, 0, 205, 0, 100); //ANALOG 5'INCI PINDE OKUNANA VOLTAJI DERECEYE DONUSTURUR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("PETEK: "); // ILK SATIRA PETEK: YAZILDI lcd.print(Sicaklik); // DEVAMINA HESAPLANAN SICAKLIK YAZILDI lcd.print(" DERECE"); // DEVAMINA SICAKLIK BİRİMİ YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("POMPA DURDU"); // IKINCI SATIRA POMPA STOP YAZILDI delay(300000); // 5 DAKIKA BEKLE (BU SURE SU ISINIRKEN POMPANIN DEVREDEN CIKACAGI SUREYI BELIRLER } else { delay(500); // 500 ms BEKLE lcd.clear(); // LCD TEMIZLE digitalWrite(0, LOW); // 0 NOLU CIKIS LOJIK 0 OLDU SELONOID ACTI SU ALMA ISLEMI GERCEKLESIYOR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("SU NOKSAN"); // ILK SATIRA SU NOKSAN YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("SU TAMAMLANIYOR"); // IKINCI SATIRA SU TAMAMLANIYOR YAZILDI } } // ANA PROGRAM BURADA BITTI
Devre şeması: ISIS ve hex dosyasını konu ekinden indirebilirsiniz.
Baskı devremiz: ARES dosyasını konu ekinden indirebilirsiniz.
Montaj aşamaları:
Montajı tamamlanmış kartın test edilmesi: Test işlemi sırasında 5'şer dakikalık gecikmeler 3 saniye yapılmıştır.
Buraya kadar olan işlem basamakları tamamlandığında elektronik kartımız kullanıma hazır hale gelmiş oluyor.
Displeyde SU SOGUDU ve SU ISINDI şeklinde bilgilendirmeler görüntülenmekte. Bu ifadelerin yerine isteğe bağlı olarak petek suyu sıcaklığını gösterebiliriz. Bunun için programda ve devre şemasında bazı değişiklikler yapmamız gerekmekte. Devreye LM35 ısı sönsörünü aşağıdaki şemada gösterildiği şekilde ekliyoruz ve mevcut programımızı değiştiriyoruz.
// TASARIM: HASANA ERTURK TRABZON MESLEKI VE TEKNIK ANADOLU LISESI 2015 EYLUL
// ALT PROGRAM SU EKSİK OLDUGUNDA POMPAYI DURDUR BASLADI void su_kes() { digitalWrite(0, HIGH); } // ALT PROGRAM SU EKSİK OLDUGUNDA POMPAYI DURDUR BITTI
int sensor=1; const int sensorpini = 13; // 13 NOLU PIN SENSOR PINIDIR int sensor_durum = 0; int SicaklikPin = 5; // LM35 sensöre bağlı pin (Analog 0) int OkunanDeger; // Analog 0'dan okunacak değer (0-1023) LM35'in vereceğı en büyük okuma değeri 1V=205 olacak. int Sicaklik; //
// ANA PROGRAM BURADA BASLADI void loop() { sensor_durum = digitalRead(sensorpini); if (sensor_durum == HIGH) { sensor = digitalRead(13); // 13 NOLU PINDEKI LOJIK SEVİYEYI OKU digitalWrite(0, sensor); // 13 NOLU PINDEKI LOJIK SEVİYE NE İSE 0 NOLU PINE AKTAR digitalWrite(1, sensor); // 13 NOLU PINDEKI LOJIK SEVİYE NE İSE 1 NOLU PINE AKTAR lcd.clear(); // LCD TEMIZLE OkunanDeger = analogRead(SicaklikPin); Sicaklik = map (OkunanDeger, 0, 205, 0, 100); //ANALOG 5'INCI PINDE OKUNANA VOLTAJI DERECEYE DONUSTURUR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("PETEK: "); // ILK SATIRA PETEK: YAZILDI lcd.print(Sicaklik); // DEVAMINA HESAPLANAN SICAKLIK YAZILDI lcd.print(" DERECE"); // DEVAMINA SICAKLIK BİRİMİ YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("POMPA CALISIYOR"); // IKINCI SATIRA POMPA START YAZILDI delay(3000000); // 5 DAKIKA BEKLE (BU SURE POMPANIN DEVREDE KALACAGI SUREYI BELIRLER) lcd.clear(); // LCD TEMIZLE OkunanDeger = analogRead(SicaklikPin); Sicaklik = map (OkunanDeger, 0, 205, 0, 100); //ANALOG 5'INCI PINDE OKUNANA VOLTAJI DERECEYE DONUSTURUR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("PETEK: "); // ILK SATIRA PETEK: YAZILDI lcd.print(Sicaklik); // DEVAMINA HESAPLANAN SICAKLIK YAZILDI lcd.print(" DERECE"); // DEVAMINA SICAKLIK BİRİMİ YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("POMPA DURDU"); // IKINCI SATIRA POMPA STOP YAZILDI delay(3000000); // 5 DAKIKA BEKLE (BU SURE SU ISINIRKEN POMPANIN DEVREDEN CIKACAGI SUREYI BELIRLER } else { delay(500); // 500 ms BEKLE lcd.clear(); // LCD TEMIZLE digitalWrite(0, LOW); // 0 NOLU CIKIS LOJIK 0 OLDU SELONOID ACTI SU ALMA ISLEMI GERCEKLESIYOR lcd.setCursor(0,0); // ILK SATIRA YAZ lcd.print("SU NOKSAN"); // ILK SATIRA SU NOKSAN YAZILDI lcd.setCursor(0,1); // IKINCI SATIRA YAZ lcd.print("SU TAMAMLANIYOR"); // IKINCI SATIRA SU TAMAMLANIYOR YAZILDI } } // ANA PROGRAM BURADA BITTI
Mekanik aksam ve su tesisatı
Yukarıda şeilde verilen ölçülerde kömür sobasının tuğlasının etrafına 14 litrelik bir alt kazan yaptırılır. Üst kazan 36 litredir. Yine yukarıda verilen ölçülerde bir boru yaptırılır.
Sistem üst kazandaki su eksildiğinde selenoid valfi devreye sokarak suyun şehir şebekesinden otomatik olarak tamamlanmasını sağlar.
Isınan suyun izlediği yol: 1. Isınan su şekilde 1 ile gösterilen noktadan üst kazandan devir daim pompasına 2. Devir daim pompasından peteklere 3. Petekleri dolaşan su borunun 2 ile gösterilen noktasına 4. Borunun 3 nolu noktasından alt kazanın 4 nolu girişine 5. Alt kazanın 5 nolu çıkışından üst kazanın 6 nolu girişine gider ve bu durum devir daim pompası çalıştığı sürece sonsuza dek devam eder.
Bir başka forumda ihtiyaç hasıl olmuştu. O nedenle hazırladım. Paylaşıyorum. 6 sargılı doğrusal motora ait arduino programı.
Motorda toplamda 6 sargı mevcut. Sargılar şu düzende enerji alacak: Toplamda bu 6 sargıya ait 12 çıkış ve bu çıkışlara ait 12 klemens mevcut. Klemenslere sırasıyla şu polariteleri alıyor.
Bekle .....ms (Periyot arttıkça frekans küçülür dolayısıyla da hız da azalır)
Buradan sonra başlangıca dönüyor.
Bu senaryoya göre 1. ve 7 klemensler 1. sargıya 2. ve 8. klemesler 2. sargıya 3. ve 9. klemesler 3. sargıya 4. ve 10. klemensler 4. sargıya 5. ve 11. klemensler 5. sargıya 6. ve 12. klemensler ise 6. sargıya enerji sağlar.
Yine bu senaryoya göre mikrodenetleyici (arduino) programımız şöyle olacaktır:
digitalWrite(CIKIS12, HIGH); digitalWrite(CIKIS1, HIGH); digitalWrite(CIKIS6, LOW); digitalWrite(CIKIS7, LOW); delay(1000); // 1s BEKLE digitalWrite(CIKIS12, LOW); digitalWrite(CIKIS1, LOW); } // ANA PROGRAM BURADA BITTI
Sarı ve kırmızı ledler ters paralel bağlanmıştır. Kırmızı yandığında sargı klememnslerinde doğru polarize, sarı yandığında ters polarize vardır. Sargı klemenslerine güç transistörleri ile tamponlanmalıdır. Devre bu haliyle sargıları sürmek için yeterli değildir. Konu ekinde devreye ait ilgili program dosyaları mevcuttur.
Bugünkü dersimizde arduino bir programı yürütürken yürümekte olan programı duraklatıp araya başka bir program sıkıştırmasını öğreneceğiz. Araya sıkıştırdığımız program komutları yerine getirildiğinde ana program kaldığı yerden devam edecektir.
ANA PROGRAM AKIŞ DİYAGRAMI
Bir arduino programı pic ve plc programları gibi alt alta yazılan komutlardan oluşur. Arduino çalışmaya başladığında ilk komuttan itibaren tüm komutlar yukarıdan aşağıya doğru sırayla çalıştırılır. Arduinoya bağlı sensör, buton, röle kontakları gibi çevresel birimlerden gelen verilersürekli kontrol edildiğinden program son komuta geldiğinde tekrar başa döner ve bir döngü halinde sürekli çalışır.
Örneğin bir yürüyen ışık için yandaki gibi bir akış diyagramı söz konusudur. Yandaki akış diyagramında görüldüğü gibi program tüm komutları yukarıdan aşağıya sırayla çalıştırmak ve en alttaki komutu uyguladıktan sonra tekrar başa dönüp bu işlemi sonsuz bir döngü haline getirmekten ibarettir.
Akış diyagramına ait arduino kodlarımız:
// DIJITAL CIKIS PIN TANIMLAMALARI BASLADI
int birinci_led = 1;
int ikinci_led = 2;
int ucuncu_led = 3;
// DIJITAL CIKIS PIN TANIMLAMALARI BITTI
// DIJITAL GIRIS / CIKISLARIN CIKIS MI YOKSA GIRIS MI OLDUKLARININ BELİRTİLMESİ BURADA BAŞLADI
void setup()
{
pinMode(birinci_led, OUTPUT); // DİJİTAL 1 PİNİNE 1. LED BAĞLANACAK
pinMode(ikinci_led, OUTPUT); // DİJİTAL 2 PİNİNE 2. LED BAĞLANACAK
pinMode(ucuncu_led, OUTPUT); // DİJİTAL 3 PİNİNE 3. LED BAĞLANACAK
}
// DIJITAL GIRIS / CIKISLARIN CIKIS MI YOKSA GIRIS MI OLDUKLARININ BELİRTİLMESİ BURADA BITTI
// ANA PROGRAM BURADA BASLADI
void loop() {
digitalWrite(birinci_led, HIGH); // DİJİTAL 1 PİNİNDEKİ LED YAKILDI
delay(500); // 500 ms BEKLE
digitalWrite(birinci_led, LOW); // DİJİTAL 1 PİNİNDEKİ LED SÖNDÜRÜLDÜ
digitalWrite(ikinci_led, HIGH); // DİJİTAL 2 PİNİNDEKİ LED YAKILDI
delay(500); // 500 ms BEKLE
digitalWrite(ikinci_led, LOW); // DİJİTAL 2 PİNİNDEKİ LED SÖNDÜRÜLDÜ
digitalWrite(ucuncu_led, HIGH); // DİJİTAL 3 PİNİNDEKİ LED YAKILDI
delay(500); // 500 ms BEKLE
digitalWrite(ucuncu_led, LOW); // DİJİTAL 3 PİNİNDEKİ LED SÖNDÜRÜLDÜ
}
// ANA PROGRAM BURADA BITTI
Ana programa ait montajı yapılmış devre
Ana programa ait fritzing çizimi
Ana programa ait isis çizimi
Ana programa ait çalışma videosu:
Ana programa ait isis simülasyonu videosu:
Arduinonun belli bir pinine gelen sinyalle belli bir fonksiyonun ya da önceden belirlenmiş bir alt programın çalıştırılmasını sağlamak için attachInterrupt komutu kullanılır.
Kullandığımız arduinonun sürümüne göre dijital pinlerden bazıları attachInterrupt pini olarak da işlev görür. Aşağıdaki tabloda farklı arduino modellerine göre kullanılabilir attachInterrupt pinleri listelenmiştir.
KART
INTO
INT1
INT2
INT3
INT4
INT5
Uno, Nano, Mini
PIN2
PIN3
Mega, Mega2560, MegaADK
PIN2
PIN3
PIN18
PIN19
PIN20
PIN21
Micro, Leonardo
PIN0
PIN1
PIN2
PIN3
PIN7
Zero
DİJİTAL 4 PİNİ HARİÇ TÜM DİJİTAL PİNLER
Due
TÜM DİJİTAL PİNLER
Şimdi program çalışırken programın her hangi bir aşamasında dijital 2. pine bağlı olan butona basıldığında 4., 5. ve 6. ledlerin yanmasını, dijital 3. pine bağlı olan butona basıldığında 4., 5. ve 6. ledlerin sönmesini isteyelim. Burada yapacağımız işleme interrupt (kesinti) denir.
Arduino unonun dijital2 ve dijital3 pinleri (INT0 ve INT1) kesme komutu pinleridir. Yukarıdaki programda bu pinlere led bağlamıştık. Bu pinleri kullanabilmemiz için aşağıdaki şemada görüldüğü gibi 1., 2., ve 3. pinlerdeki ledleri 4., 5. ve 6. pinlere taşıyoruz. 7., 8. ve 9. pinlere de sırasıyla 4., 5. ve 6. ledleri bağlayacağız. INT0 ve INT1 girişlerine de birer adet buton bağlayıp programımızı hazırladığımız devre şemasına uygun olarak düzenleyeceğiz.
Ana programa ek program eklenmiş devreye ait isis çizimi
Ana programa ek program eklenmiş devreye ait fritzing çizimi
Bitmiş devreye ait video:
Bitmiş devreye ait isis simülasyonu:
Bitmiş devreye ait program:
// DIJITAL CIKIS PIN TANIMLAMALARI BASLADI
int birinci_led = 4;
int ikinci_led = 5;
int ucuncu_led = 6;
int dorduncu_led = 7;
int besinci_led = 8;
int altinci_led = 9;
// DIJITAL CIKIS PIN TANIMLAMALARI BITTI
// DIJITAL GIRIS / CIKISLARIN CIKIS MI YOKSA GIRIS MI OLDUKLARININ BELİRTİLMESİ BURADA BAŞLADI
void setup()
{
pinMode(birinci_led, OUTPUT); // DİJİTAL 4 PİNİNE 1. LED BAĞLANACAK
pinMode(ikinci_led, OUTPUT); // DİJİTAL 5 PİNİNE 2. LED BAĞLANACAK
pinMode(ucuncu_led, OUTPUT); // DİJİTAL 6 PİNİNE 3. LED BAĞLANACAK
pinMode(dorduncu_led, OUTPUT); // DİJİTAL 7 PİNİNE 4. LED BAĞLANACAK
pinMode(besinci_led, OUTPUT); // DİJİTAL 8 PİNİNE 5. LED BAĞLANACAK
pinMode(altinci_led, OUTPUT); // DİJİTAL 9 PİNİNE 6. LED BAĞLANACAK
pinMode(2, INPUT); // DİJİTAL 4 PİNİNE 1. LED BAĞLANACAK
pinMode(3, INPUT); // DİJİTAL 5 PİNİNE 2. LED BAĞLANACAK
attachInterrupt(0, kesme, RISING); // INT0 pini (dijital2 pini) 1 yapılırsa program kesme isimli fonksiyonu yürütür.
attachInterrupt(1, kesme2, RISING); // INT1 pini (dijital3 pini) 1 yapılırsa program kesme2 isimli fonksiyonu yürütür.
}
// DIJITAL GIRIS / CIKISLARIN CIKIS MI YOKSA GIRIS MI OLDUKLARININ BELİRTİLMESİ BURADA BITTI
// ANA PROGRAM BURADA BASLADI
void loop() {
digitalWrite(birinci_led, HIGH); // DİJİTAL 4 PİNİNDEKİ LED YAKILDI
delay(2000); // 500 ms BEKLE
digitalWrite(birinci_led, LOW); // DİJİTAL 4 PİNİNDEKİ LED SÖNDÜRÜLDÜ
digitalWrite(ikinci_led, HIGH); // DİJİTAL 5 PİNİNDEKİ LED YAKILDI
delay(2000); // 500 ms BEKLE
digitalWrite(ikinci_led, LOW); // DİJİTAL 5 PİNİNDEKİ LED SÖNDÜRÜLDÜ
digitalWrite(ucuncu_led, HIGH); // DİJİTAL 6 PİNİNDEKİ LED YAKILDI
delay(2000); // 500 ms BEKLE
digitalWrite(ucuncu_led, LOW); // DİJİTAL 6 PİNİNDEKİ LED SÖNDÜRÜLDÜ
}
// ANA PROGRAM BURADA BITTI
void kesme()
{
digitalWrite(dorduncu_led, HIGH); // DİJİTAL 4 PİNİNDEKİ LED YAKILDI
digitalWrite(besinci_led, HIGH); // DİJİTAL 5 PİNİNDEKİ LED YAKILDI
digitalWrite(altinci_led, HIGH); // DİJİTAL 6 PİNİNDEKİ LED YAKILDI
}
void kesme2()
{
digitalWrite(dorduncu_led, LOW); // DİJİTAL 4 PİNİNDEKİ LED SÖNDÜRÜLDÜ
digitalWrite(besinci_led, LOW); // DİJİTAL 5 PİNİNDEKİ LED SÖNDÜRÜLDÜ
digitalWrite(altinci_led, LOW); // DİJİTAL 6 PİNİNDEKİ LED SÖNDÜRÜLDÜ
}
Böylece bir program yürütülürken araya başka bir programı sıkıştırıp her iki programı da yürütmüş olduk.
Bu dersimizde arduino çıkışları lojik sıfır olduğunda çıkışı aktif yapmayı öğreneceğiz. Buna neden gerek var derseniz açıklayalım. Normal şartlarda arduino çıkışları lojik 1 (5Volt) olduğunda çıkışına aaşağıdaki şekilde görüldüğü gibi bir led bağlarız. Çıkış lojik 1 olduğunda led yanar, çıkış lojik 0 olduğunda ise led sönecektir.
void setup() { pinMode(13, INPUT); // DİJİTAL 0 PİNİNE BUTON BAĞLANACAK pinMode(0, OUTPUT); // DİJİTAL 13 PİNİNE LED BAĞLANACAK } int sensor=1; void loop() { sensor = digitalRead(13); // BUTONDAKİ LOJİK SEVİYEYİ OKU digitalWrite(0, sensor); // BUTONDAKİ SEVİYEYİ ÇIKIŞA AKTAR } Buraya kadar her şey normal. Ancak dikkat ederseniz arduinoya ilk defa besleme gerilimi uygulandığında ya da arduino resetlendiğinde arduino çıkışları istem dışı 1 saniye gibi çok kısa bir sürelojik 1 seviyesini almakta ve sonra kendiliğinden normale dönmekte. Bu durum eğitim ortamlarında bir sorun olarak görünmese de özellikle ticari ve endüstriyel kullanımlarda büyük güvenlik risklerine ve hesapta olmayan donanımsal arızalara neden olabilir. Bunun önüne geçebilmek devre şemasında ve yazılımda aşağıdaki örnekte görüldüğü gibi bir değişiklik yaparak arduino çıkışları lojik 0 olduğunda çıkış almamız gerekir. Belki bu problemi çözmek için yazılımsal ya da donanımsal başka çözümler de vardır. Ancak şu an benim bilgim dahilinde değil. Eğer ki daha bir çözüm yolu öğrenirsem yine bu konu altından çözümüpaylaşırım.
const int servo1 = 3; // first servo const int servo2 = 10; // second servo const int joyH = 3; // L/R Parallax Thumbstick const int joyV = 4; // U/D Parallax Thumbstick
int servoVal; // variable to read the value from the analog pin
Servo myservo1; // create servo object to control a servo Servo myservo2; // create servo object to control a servo
void setup() {
// Servo myservo1.attach(servo1); // attaches the servo myservo2.attach(servo2); // attaches the servo
// Inizialize Serial Serial.begin(9600); }
void loop(){
// Display Joystick values using the serial monitor outputJoystick();
// Read the horizontal joystick value (value between 0 and 1023) servoVal = analogRead(joyH); servoVal = map(servoVal, 0, 1023, 0, 180); // scale it to use it with the servo (result between 0 and 180) myservo2.write(servoVal); // sets the servo position according to the scaled value
// Read the horizontal joystick value (value between 0 and 1023) servoVal = analogRead(joyV); servoVal = map(servoVal, 0, 1023, 180, 0); // scale it to use it with the servo (result between 70 and 180)
myservo1.write(servoVal); // sets the servo position according to the scaled value
Haberşme Temelleri (perşembe gününe göre) Haberleşme Cihazları (perşembe gününe göre) Alarm ve Geçiş Kontrol Sistemleri (Salı gününe göre) Mobil sistemler 4 saat cuma gününe göre Dijital elektronik 4 saatcuma gününe göre Endüstriyel Kontrol Sistemleri (Seçmeli 4 saat) Elektrik elektronik ölçme (eml) Elektrik elektronik ölçme (tl) Mikrodenetleyiciler Alıntı çalıntı değildir. Emek vardır. Konu ekinden indirebilirsiniz.
Bu dersimizde güneş panelinden mümkün olabilen maksimum seviyede enerji alabilmek için güneş panelini otomatik olarak güneşe yönlendiren platform yapmayı öğreneceğiz. Güneş konumunu değiştirdikçe platformumuz güneşin konumunu takip edecektir. Paltformun üzerine bir güneş pili yerleştirilmiştir. Güneş pili de bir bataryayı şarz etmektedir. Bu şekilde gündüzleri bataryamızı maksimum seviyede şarz edip, geceleri bataryamızdan enerji alabiliriz.
Güneşin pozisyonunu tespit edebilmek için sistemde 4 adet ldr (foto direnç) kullanmıştır. Bunlardan ikisi yatay kontrol, diğer ikisi dikey kontrol içindir. Her bir ldrye devre şemasında görüldüğü şekilde birer tane 10klık direnç seri bağlanmıştır. Bu bağlantı sayesinde arduinonun analog A0, A1, A2 ve A3 girişlerine güneşin pozisyonuna göre yaklaşık 0 volt ile yaklaşık 5 volt arasında birbirinden farklı gerilimler düşer. Hangi ldr daha fazla ışık alıyorsa o ldrye ait analog girişte diğer analog girişlere nazaran daha fazla gerilim düşümü olacaktır. Arduino programımız sayesinde analog girişlere düşen gerilimler değerlendirilerek servolara sağa ya da sola dönmeleri için sinyal yollanır. A0 ve A1 girişlerindeki gerilimler yatay kontrolü, A2 ve A3 girişlerindeki gerilimler ise dikey kontrolü sağlayacaktır. Servoların harekete geçmesiyle ldrlerin üzerine düşen ışık şiddetleri eşitlendiğinde ldrlerin üzerine düşen dolayısıyla A0 ve A1 (yatay kontrol) pinleri ile A2 ve A3 (dikey kontrol) pinlerine düşen gerilimler birbirine eşit olacaktır. Yani A0 gerilimi = A1 gerilimi ve A2 gerilimi = A3 gerilimi olana kadar servolar hareket edecek ve platformun güneşe göre uygun pozisyon alması sağlanacaktır.
Malzeme listesi: Arduino uno Pan tilt servo motor montaj kiti Bakırlı pertinaks Baskı devre malzemeleri 4 adet 10 k direnç 4 adet ldr 2 adet servo Güneş pili Batarya Bilgisayar Bağlantı iletkenleri El ve güç aletleri Muhtelif vida ve civatalar
ISIS çizimi ISIS çizimini konu ekinden indirebilirsiniz.
Arduino Shild ARES çizimi Ares dosyasını konu ekinden indirebilirsiniz.
Fritzing çizimi: Fritzing dosyasını konu ekinden indirebilirsiniz.
Arduino kodlarımız: Arduino kodlarına ait dosyayı konu ekinden indirebilirsiniz.
Bu dersimizde bir platformu mause ile 2 eksen (sağ - sol ve yukarı - aşağı) hareket ettirmeyi öğreneceğiz. Platforma ben örnek olarak bir kaç tane led bağladım. Led yerine kamera ya da projektör gibi başka metaryeller bağlayarak bu metaryalleri 2 eksen kontrol edebilirsiniz. PC arayüzü olarak processingi kullanacağız. İhtiyaç duyulması halinde konuya ait dosyaları konu ekinden indirebilirsiniz.
Malzeme listesi: Arduino uno 2 adet servo motor Pan tilt servo motor montaj kiti DC güç kaynağı (Pil ya daadaptör 6 Volt) Bağlantı kaboları Deney bordu
Servo yservo; Servo xservo; // servos for x and y //set initial values for x and y int ypos = 0; int xpos= 0;
void setup(){ xservo.attach(14); //(analog pin 0) for the x servo yservo.attach(15); //(analog pin 1) for the y server
Serial.begin(19200); // 19200 is the rate of communication Serial.println("Rolling"); // some output for debug purposes.
}
void loop() { static int v = 0; // value to be sent to the servo (0-180) if ( Serial.available()) { char ch = Serial.read(); // read in a character from the serial port and assign to ch switch(ch) { // switch based on the value of ch case '0'...'9': // if it's numeric v = v * 10 + ch - '0'; /* so if the chars sent are 45x (turn x servo to 45 degs).. v is the value we want to send to the servo and it is currently 0 The first char (ch) is 4 so 0*10 = 0 + 4 - 0 = 4; Second char is 4; 4*10 = 40 + 5 = 45 - 0 = 45; Third char is not a number(0-9) so we drop through... */ break; case 'x': // if it's x /* ....and land here where we send the value of v which is now 45 to the x servo and then reset v to 0 */ xservo.write(v); v = 0; break; case 'y': yservo.write(v); v = 0; break; } } } Processing kodlarımız:
int xpos=90; // set x servo's value to mid point (0-180); int ypos=90; // and the same here Serial port; // The serial port we will be using
void setup() { size(360, 360); frameRate(100); println(Serial.list()); // List COM-ports //select second com-port from the list (COM3 for my device) // You will want to change the [1] to select the correct device // Remember the list starts at [0] for the first option. port = new Serial(this, Serial.list()[0], 19200); }
void draw() { fill(175); rect(0,0,360,360); fill(255,0,0); //rgb value so RED rect(180, 175, mouseX-180, 10); //xpos, ypos, width, height fill(0,255,0); // and GREEN rect(175, 180, 10, mouseY-180); update(mouseX, mouseY); }
void update(int x, int y) { //Calculate servo postion from mouseX xpos= x/2; ypos = y/2; //Output the servo position ( from 0 to 180) port.write(xpos+"x"); port.write(ypos+"y"); }
Aşağıdaki resimdeki gibi bağlantıları yaptıktan sonra aşağıdaki bağlantılardan indirebileceğiniz dht11 kütüphanesini yüklüyoruz. (dht11 klasörünü Arduino>libraries klasörüne kopyalıyoruz.) Kütüphane klasörünü konu ekinden indirebilirsiniz.
void setup() { Serial.begin(9600); // Seri iletişimi başlatıyoruz. Serial.println("Arduinoturkiye.com DHT11 Test Programi"); }
void loop() { // Bir satır boşluk bırakıyoruz serial monitörde. Serial.println(); // Sensörün okunup okunmadığını konrol ediyoruz. // chk 0 ise sorunsuz okunuyor demektir. Sorun yaşarsanız // chk değerini serial monitörde yazdırıp kontrol edebilirsiniz. int chk = DHT11.read(DHT11PIN);
// Sensörden gelen verileri serial monitörde yazdırıyoruz. Serial.print("Nem (%): "); Serial.println((float)DHT11.humidity, 2);