10 Aralık 2016 Cumartesi

HC-SR04 ile mesafe ölçümü (Linux + Python)

Amaç: Raspberry Pi2 ile HC-SR04 ultrasonik sensör kullanarak mesafe ölçümü yapmak.

Elektronik malzemelerimi karıştırırken HC-SR04 ultrasonik sensöre rast geldim. Bu sensörü geçen yıl almıştım, o zamanlar su deposunda su seviyesini hassas olarak nasıl ölçebilirim diye arayış içindeydim. Fakat nedense bu sensör ile ilgili hiç çalışma yapmamışım. Bu nedenle basit bir mesafe ölçüm uygulaması yapmaya karar verdim. Bunu da breadbord üzerinde devreyi kurup python script kullanarak yapabilirim diye düşündüm. Yalnız dikkat edilmesi gereken bir nokta var o da Raspberry i/o pinleri 3,3V ile çalışmakta, Sensör ise 5V ile çalışmakta. Dolayısıyla sensörden Raspberry'e giren pine gerilim bölücü dirençler eklememiz gerekmektedir.



HC SR04 Ultranic mesafe sensörü


Vcc: +5V
Trig: Tetikleme pinidir. Bu pinden 10 us (mikro saniye)  lojik 1 seviyesinde tutulması gerekmektedir.
Echo: Mesafe bilgisi alınan pin.
Gnd: 0V

Modülün çalışması;

Modüle Vcc ve Gnd pinlerinin irtibatı yapıldığında çalışma için hazır hale gelmektedir. Modül üzerinde görüldüğü üzere bir adet ultrasonic ses yayıcı (solda) bir adette ses alıcı (sağda) hoparlör-mikrofon bulunmaktadır. Modül ile ölçüm yapabilmek için Trig pinini 10 us boyunca lojik 1 seviyesinde tutmak ardından lojik 0 seviyesine çekmek gerekmektedir. Lojik 0 seviyesine çekilince modül ortama  40 kHz frekansında  8 adet ses dalgası yaymaktadır. Gönderilen ses dalgaları herhangi bir engele çarpıp geri döndüğünde modül bu ses dalgalarının havada kalma süresini hesaplayıp Echo pininden bize bildirir.
Ses dalgalarının havada kalma süresi ne kadar ise o kadar sürede Echo pini lojik 1 durumunda kalır ardından tekrar lojik 0 konumuna döner.

Burada dikkat edilmesi gereken konu gönderilen ses dalgalarının geriye döndüğünde 2 kat yol katettiğidir. Dolayısıyla hesaplanacak mesafe değerinin yarısının alınması gerektiğidir.

Havada ses dalgaları 343,2m/sn hızla yolalır.
Sensör ölçüm aralığı 2cm ile 4mt arasındadır.

Sonar.py adında dosya oluşturup kodları yazmaya başlıyoruz.


  • import RPi.GPIO as GPIO
  • import time
Gpio ve zaman kütüphaneleri python scripte dahil ediliyor. 




  • GPIO.setmode(GPIO.BCM)
 Kullandığımız kartın üzerinde 40 adet pin (bağlantı noktası - DIL20 Header) bulunmaktadır. Bu bağlantı noktalarının herbirine ait 2 farklı ismi vardır. Burada kullanılan kart üzerindeki i/o çiplerine göre isimlendirme yapılacağı belirtilmiştir.




  •  TRIG = 23
  •  ECHO = 24
 Trig pini olarak 23, Echo pini olarak 24 numaralı pinler kullanılacaktır. Script içerisinde Trig yazan yer 23 numaralı pin anlamı taşımaktadır.





  • GPIO.setup(TRIG,GPIO.OUT)
Trig pininin bağlı olduğu pin çıkış olarak ayarlanıyor. Bu ayarlama yapılmazsa ilgili pinden çıkış alamayız.




  • GPIO.setup(ECHO,GPIO.IN)
Echo pini giriş olarak ayarlanıyor.






  • GPIO.output(TRIG, False)
 Çıkış olarak ayarlanan pinlere ilk değer olarak lojik 1 yada lojik 0 olarak değer vermezsek kararsızlaşır ve rastgele değerler alır. Burada Trig pini ilk değer olarak lojik 0 yani Gnd seviyesine çekilmiştir. True lojik 1 False lojik 0 ile aynı anlama gelmektedir. İstenildiğinde 
GPIO.output(TRIG, 0) şeklinde de  yazılabilir.




  • time.sleep(2)
Ölçüme başlamak için gecikme veriliyor. 





  •  GPIO.output(TRIG, True)
  •  time.sleep(0.00001)
  •  GPIO.output(TRIG, False)
Trig pini lojik 1 yapılıyor, Ardından 10 us bekleniyor ve lojik sıfır yapılıyor. Bu sayede sensör ölçüme başlıyor.




  • while GPIO.input(ECHO)==0:
  •     start_palsi = time.time()
Burada echo pini lojik sıfır olduğu sürece programın bu kısımda bekletilmesi için while döngüsü kullanılmıştır. Bu esnada sensör ortama 8 adet ses dalgası göndermiştir. Bu ses dalgaları engele çarpıp sensör tarafından alındığında Echo pini lojik 1 seviyesine çıkacaktır. Bu nedenle burada biz , Echo pini lojik 1 olduğu andaki zaman bilgisini start_palsi değişkenine aktarıyoruz.





  • while GPIO.input(ECHO)==1:
  •    stop_palsi= time.time()
Echo pini lojik 1 konumunda kaldığı süre boyunca while dögüsü işleyecektir. Ne zaman lojik 0 olduysa döngüden çıkılacak dolayısıyla son döngü işleminde zaman bilgisi stop_palsi değişkenine aktarılmış olacaktır.





  • zaman = stop_palsi - start_palsi
Şimdi gelelim en kolay kısma. Echo pininin lojik 1 de kalma süresi bizim ses dalgalarımızın engele çarpıp geri dönme süresiydi. O zaman stop_palsi değişkeninde saklanan saat(zaman) bilgisinden start_palsi değişkeninde saklanan zaman değerini çıkarttığımızda geçen zamanı buluruz.

Şimdi biraz matematik çalışalım. Hız = Uzunluk(m) / zaman(sn) yani bir cismin, nesnenin hızını bulabilmek için birim zamanda katettiği mesafeyi bilmemiz yeterli. Fakat ses dalgaları engele gidip geri geliyordu bu nedenle zaman değerini 2'ye bölmek gerekiyor.

Ses dalgaları havada 343,2m/s hızda yol alıyordu.Bu da 34320 cm yapıyor.  Bunu da
mesafe=17160 x zaman şeklinde yazabiliriz. Zaman bilgisini de ölçümden alıyoruz. Geriye sadece hesaplamak kalıyor.






  • mesafe = zaman * 17160
  • mesafe = round(mesafe, 2)
Yukarıdaki bilgiler dahilinde        mesafe = zaman * 17160    formülü ile mesafe değeri hesaplanmış 2. komutta ise ölçülen mesafe değerinde ondalık hane sayısı ayarlanmıştır. Örneğin ölçüm değeri virgülden sonra 4 hane olmasını isteseydik     mesafe = round(mesafe, 4)      komutunu yazmak gerekecekti.






  • print "Olculen Mesafe:",mesafe,"cm"
  • GPIO.cleanup()
Son olarak print komutu ile ölçülen değer ekrana yazdırılıyor ve devamında gpio'lar (pinler) sıfırlanıyor.











Gerilim Bölücü devre



Sonar.py dosyasını python ile çalıştırıyoruz.


HC-SR04 Görüntüsü




Devreyi Bread-Board üzerine kurdum.
Sensör önüne karton kutu koyup teste başlıyoruz.
Mesafeyi 12,3 cm olarak ölçüyoruz.
Karton kutuyu biraz uzaklaştıyoruz.
Mesafenin 30,6 cm olduğunu görüyoruz.





4 Aralık 2016 Pazar

Web Tabanlı Otomasyon (Raspberry_Pi + Linux + PHP + Python)




Amaç : Ev, Ofis, Tarla vs. yerlerdeki uzaktan kontrol etme ihtiyacı olan  klima, kombi, aydınlatmalar, doğalgaz, bahçe sulaması gibi cihazları kontrol etmek.
Kontrol işlemi internet üzerinden web arayüzü kullanılarak yapılacak. Local kısımda kontrol ise Kart üzerinde bulunan Dokunmatik Lcd ekran, Monitör üzerinden yapılacaktır. Local ve web üzerinden verilen komutlar birbiri ile senkronize çalışacak. yani web üzerinden verilen komut local ekrandan, Local ekran üzerinden verilen komut ise web üzerinden aynı anda okunabilecek.


Şimdi kullanacağımız sistemi inceleyelim.

Raspberry Pi2: Üzerinde ARM Cortex A7   4 çekirdekli 900MHz işlemci, 1GB SDRam, Hdmi, Ses, Ethernet Portu 10/100, MicroSD kart yuvası, 4 adet USB portu bulunan 86mm x 56mm ölçülerinde karttır. Kartın Türkiye dağıtıcısı Samm Teknoloji'dir.
Kart alındığında tek başına herhangi bir işe yaramamaktadır. Yanında 1 adet Class10(Tavsiyem) SDCard ve adaptör gereksinimi olmaktadır. Sd kart içerisinde yüklü olarak Linux Debian sürümünün Raspberry için uyarlanmış versiyonu olan raspbian sürümü bulunmaktadır. Eğer elinizde Class10 Sd kart var ise buradan raspbian sürümünü indirebilirsiniz. İndirilen dosyayı SD karta yazmadan önce Sd Card Formatter Programını kullanarak kartı formatlamak gerekiyor. Ardından disk imager kullanarak karta yükleyebilirsiniz.


Eğer Raspberry'e takacağınız LCD ekran yada Hdmi çıkışına bağlayacağınız Tv yada monitörden bunun gibi görüntü alıyorsanız buraya kadar anlatılanları sorunsuz yaptınız demektir




.








Sıra geldi gerekli ayarları yapmaya. Eğer elinizde Lcd ekran/Tv yada Monitör var ise kart üzerindeki usb portlarına fare/klavye takıp kullanabilirsiniz. Ethernet portuna da modemden gelen kabloyu bağlamalısınız.
Eğer elinizde Lcd ekran, Monitör/Tv yok ise SSH bağlantısı kurarak bilgisayar monitörü üzerinden gerekli ayarlamaları yapabilirsiniz. Bunun için Putty gibi programa ihtiyacımız var. Öncelikle Raspberry'nin ethernet portuna modemden gelen kabloyu bağlayınız ve ardından modemden almış olduğu local ip'yi öğreniniz. 192.168.*.*** şeklindedir. Putty ekranında Hostname yazan yere bu ip'yi yazın. Port kısmına 22 giriniz. SSH işaretli olduğunuza emin olun. Sol tarafta Connection->SSH->X11 altında Enable X11 Forwarding işaretleyip Open yazan yere tıklayınız.

Open tıkladıktan sonra Putty ekranı resimde göründüğü gibi olması gerekiyor.  Burada kullanıcı adı kısmına Pi yazıp entere basıyoruz.








 Ardından bize parola soruyor buraya da raspberry girip enter diyoruz.