Merhabalar bugün yepyeni bir proje ile karşı karşıyayız. Sıfırdan itibaren adımlarımızı paylaşıcaz.
Öncelikle amacımız şu görmüş olduğunuz makineyi, daha kontrollü bi hale getirmek. Karşınızda vidaları düzgün bir şekilde sıraya koyan ve dizen bir titreşimli makina var.
Bu projede ise düşen vidaları sayan, saydığı vidalara göre makineyi durduran veya çalıştıran veya her bir hedef değerine ulaşıldığında durdurup tekrar çalıştıran bir makina haline getireceğiz. Bunu da arduino kullanarak yapmayı düşünüyoruz.

O zaman öncelikle kullanacağımız sensörü seçelim. Bu tarz uygulamalar için endüstride çok kullanılan kapasitif ve endüktif sensörler vardır. Kapasitif sensörler önünden geçen tüm cisimleri algılayan, endüktif sensörler ise sadece metalleri algılayarak çıkış veren sensör tipleridir. Ortalama çalışma voltajları 6-24 V veya 6-30 V arası çalışır. Ve önüne cisim geldiğinde çıkış verirler. (npn tip) Biz öncelikle kapasitif sensör kullanmayı seçmiştik ama yaptığımız uygulama sonucu önünden geçen cisimleri hızlı bir şekilde sayamadığı için endüktif sensörde karar kıldık. Ama bir problemimiz var ?
Problemimiz şu, bu sensör tipi gelen veri ile 24 V’luk bir output veriyor ama arduino girişleri 2.7-5 V arası değerleri lojik 1 değeri olarak algılayabilir. Dolayısıyla gelen sinyal değerini düşürmek için burada bir Gerilim bölücüye ihtiyacımız olucak.
Gerilim Bölücü Direnç Hesaplamaları
Projemiz bahanesiyle gerilim bölücü direnci hesaplamayı da öğreniyoruz. Öncelikle gerilim bölücü direnç nasıl bir şeydir görelim.
Aşağıda gördüğünüz Vin bizim sensörden gelen çıkışımız. Vout ise arduinonun girişine gidecek olan ucumuz. Vin için 26 V değerini referans alıyoruz. Çünkü sensör kullanıcıları 26 Volta kadar besleme yapabilirler. Vout’tan ise 5 Volta yakın 4 Volt gibi bir değer gelsin istiyoruz. Bildiğiniz gibi arduino 2.7V değeri üstü değerleri lojik 1 olarak ayarlar. Peki kaç amperlik bir değer gelicek arduino’ya .Arduino için 10mA değeri gayet uygun. O zaman toplam direncimizi bulalım. Gerilim değerim 26 V, Amper değerim 0.01 A e direnci hesaplamak çok zor değil. İşte karşınızda Ohm kanunu

V= IxR
26 = 0.01xR
R = 26/0.01
R = 2600 ohm
Direnç değerimizi bulduk. Geriye sadece son bir nokta kaldı. Hangi direnç kaç değerinde olucak.
Basit yöntem şu. Vout dediğimiz kısım, aslında Vout ile GND arasında kalan yer. Biz bu noktadan 4V elde etmek istiyoruz. Buradan 4 V elde etmek istiyorsak R1 direncinin üstüne kaç V kalıyor ?
26-4 = 22 V
Ozaman 22 = 0.01xR1 R1 = 22/0.01 R1 = 2200 ohm
R2 için ise 4= 0.01xR2 R2 = 4/0.01 R2 = 400 ohm
Devremizi kontrol etmek için şöyle bir devre kuruyoruz hemen

Güç kaynağının 26 V ayarlayarak bunları endüktif sensörü + ve – uclarına bağlıyoruz. Sensörün out ucunu ise gerilim bölücü’ye bağlıyoruz. Gerilim bölücünün Out ucunu ise Arduino ya gönderiyoruz.
Ama şunu sakın ama sakın unutmayın. Tüm GND’ler birleşmeli. Yani Sensör GND’si Gerilim Bölücü GND’si ve Arduino GND’si hepsi birleşmeli. Bu sıksık öğrencilerin yaptığı bir hata.
Sensörden, 4V değerinde çıkış aldık. Sensör işi tamam
Sıra da bu devreyi nasıl besleyeceğimiz var. Bu sırada makine kumandasının içinde 12 V’luk bir çıkış olduğunu görüyoruz ve, Sensör ve Arduino’yu bu 12 V ile beslemeye karar veriyoruz. Dolayısıyla Gerilim Bölücümüzdeki dirençleri de bu sefer 12 V için ayarlamamız gerekiyor. Ve yine basit hesapla gerilim bölücümüzü 800 ohm, 400 ohm şeklinde ayarlıyoruz.
Peki makinamız nasıl çalışacak
Öncelikle Makina açıldığında ona I2C modülü üzerinden hedef vida adeti sayısı tanımlayacağız. Ve bunu eprom hafızasına kaydedeceğiz. Bu bilgiyi elektirikler gidip gelse bile hatırlayacak. Makine çalıştığında bu hedef adeti kadar vida sayacak ve otomatik olarak duracak. Ta ki, haznenin boşaldığı bilgisi gelene kadar. Bu bilgiyi biz buradan butonla vereceğiz ama pratikte bunu sistemde çalışan bir sensör verecek. Bu bilgi geldikten sonra servomuz 90 derecelik hareket yapıp geri gelecek ve makine tekrar çalışmaya vidalar da düşmeye başlayacak. Hedef değerine gelindiğinde aynı işlemler tekrarlanacak
Bizler burada iki adet butonla hem hedef sayı artırıp, azaltma, hem de kaydetme işlemi yapıyoruz. Kısa süreli basışlarda artırıp azaltma yaparken, uzun süreli basışlarda o an yazılı olan sayıyı eprom hafızasına kaydediyoruz. Bunu two buttons kütüphanesine borcluyuz.
Bu arada makineyi çalıştırıp durdurması için, kumanda içine bir role ekledik. Arduino’dan gelen bilgiye göre çalıştırıp, durduruyor.
Arduino Programımız aşağıdaki gibidir. Buradan nereden baksanız 5-6 konuluk bilgi var arkadaşlar. I2C modülü kullanımı , Two Buttons kütüphanesinin nasıl bir hazine olduğu, EPROM’a veri yazdırarak kalıcı hafızalı çalışma ve bunun gibi birçok konu…
#include<Servo.h>
#include "OneButton.h"
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#include <EEPROM.h>
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//#define NUMFLAKES 10 // Number of snowflakes in the animation example
const int sensor = 7; /* Butonun bağlı olduğu pin */
int sayac = 0; /* butona basılma sayısını tutacak değişken */
int sensorDurumu = 0; /* Butonun durumu */
#define led 11
boolean ledstate;
int adet = 0;
int role = 12;
Servo motor;
//int pozisyon = 4;
//int say = 5;
int bosalt = 6;
int bayrak = 13;
int bosaltdurum;
int addr = 100;//epromdakihafizayeri
OneButton button1(4, true);
OneButton button2(5, true);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
adet = EEPROM.read(addr);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.setTextSize(4);display.clearDisplay();
display.setCursor(80, 0);display.print(adet);
display.setTextSize(2);
display.setCursor(0, 0);display.print("Sayi");
display.setCursor(14, 16);display.print(sayac);
display.display();
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println("Starting TwoButtons...");
button1.attachClick(click1);
button1.attachLongPressStart(longPressStart1);
button1.attachLongPressStop(longPressStop1);
button1.attachDuringLongPress(longPress1);
button2.attachClick(click2);
pinMode(sensor, INPUT);
pinMode(bosalt, INPUT);
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(role, OUTPUT);
pinMode(bayrak, OUTPUT);
motor.attach(9);
}
void loop() {
adetbelirle();
display.display();
motor.write(1);
sensorDurumu = digitalRead(sensor);
bosaltdurum = digitalRead(bosalt);
digitalWrite(led, 0);
if (sensorDurumu == HIGH && sayac<adet) {
delay(10); /* dalgalanmalar için biraz bekleyelim */
sayac ++; /* sayaç = sayaç + 1 yani sayaç değeri bir arttırıldı */
Serial.print("sensor "); digitalWrite(led, 1); delay(50);
Serial.print(sayac); /* sayaç değerimizi ekrana yazdırıyoruz */
Serial.println(" defa saydi.");
display.setTextSize(4);display.clearDisplay();
display.setCursor(80, 0);display.print(adet);
display.setTextSize(2);
display.setCursor(0, 0);display.print("Sayi");
display.setCursor(14, 16);display.print(sayac);
while (sensorDurumu == HIGH) { /* Butona basili olduÄŸu surece bekle */
sensorDurumu = digitalRead(sensor); /* Butonun durumunu kontrol et */
}
if (sayac == adet)
{
digitalWrite(role, 0);
Serial.println("max deger ulasildi");
digitalWrite(bayrak, 1);
}
}
if (bosaltdurum == HIGH)
{
motor.write(100);
sayac=0;
display.setTextSize(4);display.clearDisplay();
display.setCursor(80, 0);display.print(adet);
display.setTextSize(2);
display.setCursor(0, 0);display.print("Sayi");
display.setCursor(14, 16);display.print(sayac);
Serial.println("motor kapaklari açildi");
delay(2000);
motor.write(1);
delay(100);
digitalWrite(role, 1);
}
}
void adetbelirle() //adet sayisinin belirlendigi fonksiyondur
{
button1.tick();
button2.tick();
}
void click1() {
adet ++;
display.setTextSize(4);display.clearDisplay();
display.setCursor(80, 0);display.print(adet);
display.setTextSize(2);
display.setCursor(0, 0);display.print("Sayi");
display.setCursor(14, 16);display.print(sayac);
Serial.print("adet sayimiz: ");
Serial.println(adet);
Serial.println("adet degiskeni artirildi.");
}
void click2() {
if(adet>1)
{
adet --;
display.setTextSize(4);display.clearDisplay();
display.setCursor(80, 0);display.print(adet);
display.setTextSize(2);
display.setCursor(0, 0);display.print("Sayi");
display.setCursor(14, 16);display.print(sayac);
Serial.print("adet sayimiz: ");
Serial.println(adet);
Serial.println("adet degiskeni azaltildi.");
}
}
void longPressStart1() {
Serial.println("adet sayisi kaydedildi");
}
// This function will be called often, while the button1 is pressed for a long time.
void longPress1() {
display.setTextSize(4);display.clearDisplay();
display.setCursor(0, 0);display.print("SAVED");
Serial.println("Button 1 longPress...");
} // longPress1
// This function will be called once, when the button1 is released after beeing pressed for a long time.
void longPressStop1() {
EEPROM.write(addr, adet);
display.setTextSize(4);display.clearDisplay();
display.setCursor(80, 0);display.print(adet);
display.setTextSize(2);
display.setCursor(0, 0);display.print("Sayi");
display.setCursor(14, 16);display.print(sayac);
Serial.println("Button 1 longPress stop");
} // longPressStop1
Bağlantı şemamız ise kabaca şöyle

Devremiz son hali


Çalışma Videosu