9

Arayüz Üzerinden Python ile Arduino Haberleştirme

Bu yazıda Python ile yazdığım basit bir arayüz üzerinden Arduinoya(veya herhangi bir mikrodenetleyiciye) veri göndererek 4 adet ledi yakıp söndürme işleminden bahsedeceğim. Basit bir uygulama olsun diye sadece led yakıp söndürme işlemi yaptım. Ama farklı uygulamalarda yapılabilir. Örneğin arayüzden  gönderilen yazının 2×16 lcd ekrana yazdırılması. Belki bunu da başka bir zaman yaparım.

Öncelikle Python tarafı daha  zor olduğu için anlatmaya oradan başlıyorum. Arayüz için Pythonda Pyqt5 modülünü kullanarak aşağıdaki basit bir arayüz yapmaya çalıştım. Bu arayüz üzerine COM port ve Baudrate hızını seçebilmek için iki adet “combobox” yerleştirilmiştir. Ayrıca seriport üzerinden bağlantı sağlayabilmek  ve gerektiğinde bağlantıyı kesebilmek için ve ledleri yakıp söndürebilmek için “pushbutton” lar eklenmiştir.

Arduino-Python Haberleşmesi

Arayüz ile seri port üzerinden veri göndermek veri almaya göre daha basit. Programın veri alma işlemini yapabilmesi için sürekli olarak seriportu dinlemesi gerekir. Bu dinlemeyi ise sonsuz bir döngü oluşturarak yapamıyoruz maalesef. Çünkü arayüz sınıfının içerisinde bir yerde sonsuz döngü kullanıldığı zaman arayüzde hiç bir şey görünmüyor. Peki seriporttan gelen verileri nasıl arayüze dahil edeceğiz. Bunun için yine Pyqt5 modülünün sınıflarından biri olan Qthread kullanılmıştır. Qthread basitçe belirlenen bir kaynaktan bir sinyal geldiğinde bunu programın algılaması işlemini yapıyor. Bir nevi RTOS daki task oluşturma işlemi diyebiliriz. Arayüz çalışırken aynı anda arkaplanda seriport dinlenmektedir. Qthread işlemi için ayrı bir “SerialThreadClass” isminde bir sınıf tanımlanmıştır.

Bu class içersinde sürekli olarak seriport dinlenmekte ve bir mesaj geldiğinde arayüz sınıfının içerisinde başka bir fonksiyona program dallanmaktadır. Bu fonksiyon içerisinde de gelen mesaj arayüzdeki “gelen mesaj” kısmında ekrana yazdırılmaktadır.

Arduinoya veri göndermek için arayüz sınıfının içerisinde “leds” isimli bir fonksiyon oluşturulmuştur. Led butonlarından hangisine tıklanırsa tıklansın program bu fonksiyonun içine girer daha sonra hangi butona tıklandığı belirlenir ve arduinoya karakter olarak bir sayı gönderilir.

Arduino Kodları

Arduino tarafında 8,9,10,11 nolu pinlere ledler bağlanmıştır. Serial.begin(9600) ile baudrate ayarı seçilmiştir. Arayüz tarafında da baudrate ayarının aynı olması gerekmektedir. Arayüzden 1 ile 8 arası karakterlerler gelmektedir. Bu karakterlere göre ledler yakılıp söndürülmüştür.

Python Kodlarının Tamamı

Yazının başında da dediğim gibi bu projede sadece led yakıp söndürdüm. Siz istediğiniz bir uygulamayı yapabilirsiniz. Eğer sormak istediğiniz sorular var ise yorumlarda sormaktan çekinmeyin. Vakit buldukça yorumlarınızı cevaplayacağım. Ayrıca bu uygulamanın acemice çekilmiş videosunu aşağıda bulabilirsiniz. Başka bir yazıda görüşmek üzere.

Herkese iyi çalışmalar..

Mehmet Topuz

Mehmet Topuz

9 Comments

  1. Merhabalar Mehmet Bey,
    Öncelikle proje örneklerinizi paylaştığınız için teşekkür ederim. PyQt kütüphanesi ile arayüz yapıyorum. Yaptığım basit bir devrenin akım ve voltajını sensörler yardımıyla ölçüp Arduino aracılığıyla Python’a aktarıyorum. İki ayrı messageBox’a voltaj ve akım olarak volt ve amper değerlerini yazdırma konusunda sıkıntı yaşıyorum. Yardımcı olabilir misiniz?

    • Merhaba
      Bu sorun birçok sebepten kaynaklanabilir.
      1. Serialden veri okuyabilmeniz için Qthread kullanmanız gerek. Yukarıdaki kodlarda “serialThreadClass” isimli sınıfı inceleyebilirsiniz.
      2. Baud rate ayarları tutmuyor olabilir. Arduino ile Python baudrate ayarı aynı olmalı.Yoksa arduino bilgisayara veri göndermez.
      Bu saydıklarımda hata yok ise kodlarınızı https://paste.ubuntu.com/
      Sitesine kopyalayın sonra linkini tekrar bu yoruma yazın kodları bir inceleyeyim.

  2. https://paste.ubuntu.com/p/DYb47MsZNB/

    Aslında sizin arayüzünüzde değişikler yapıp ek olarak diğer messageBox’lar oluşturup onlara veri çekme işlemini yaptım. Bu kod bilgisayarımda sorunsuz şekilde verileri çekip yazdırıyor fakat raspberry pi üzerinde çalıştırdığımda ise veri çekme esnasında hata veriyor. Hata da def run(): fonksiyonunda gösteriyor. Araştırma yapmama rağmen açıkçası pek kaynak bulamadım bu hata ile ilgili.

    Yorumuma geri döndüğünüz için çok teşekkür ederim 😀

    • Rica ederim. Bir faydam dokunduysa ne mutlu bana.
      Öncelikle run() fonksiyonunun içindeki print(“HATA\n”) satırını silip pass yazıp bir daha deneyin. Raspberry pi da konsola yazı yazdırmada hata veriyor olabilir. Ayrıca hata mesajını görebiliyorsanız yoruma yazarsanız sevinirim.

      • Raspberry’de python kodlarını çalıştırabileceğim 3 yer bulunuyor.
        -Python3 IDLE’da çalıştırdığımda arayüz ekranı geldi ama veri alamadım.
        -CMD’den yaptığıms no module named PyQt5 hatası verdi
        -Thonny Python’dan denediğimde ise yine arayüz ekranı geldi fakat bağlan butonuna tıkladığımda;
        Fatal Python error:Aborted
        Current thread 0x69d9a470(most recent call first):
        Thread 0x76efe010 (most recent call first):
        File “/home/pi/Desktop/urban yeni/pyqt.py”, line 179 in

        File “/usr/lib/python3/dist-packages/thonny/shared/thonny/backend.py”, line 588 in execute_source

        File “/usr/lib/python3/dist-packages/thonny/shared/thonny/backend.py”, line 427 in _execute_source_ex

        File “/usr/lib/python3/dist-packages/thonny/shared/thonny/backend.py”, line 374 in _execute_file

        File “/usr/lib/python3/dist-packages/thonny/shared/thonny/backend.py”, line 155 in _cmd_Run

        File “/usr/lib/python3/dist-packages/thonny/shared/thonny/backend.py”, line 119 in handle_command

        File “/usr/lib/python3/dist-packages/thonny/shared/thonny/backend.py”, line 97 in mainloop

        File “/usr/lib/python3/dist-packages/thonny/shared/backend_launcher.py”, line 41 in

        Hatasını aldım

        • Hata Qthread’ tan kaynaklı gibi görünüyor ama çözümü nedir bilmiyorum. Eğer aynı kod bilgisayarda çalışıyorsa sorun raspberry tarafında olmalı diye düşünüyorum. Python dosyaları eksik yüklenmiş olabilir.

          • Kütüphaneleri yeniden yüklemeyi deneyeceğim. Vakit ayırdığınız için teşekkür ederim. İyi günler dilerim.

  3. Hocam öncelikle emeğinize sağlık çok güzel bir çalışma olmuş. Benim bir sorum olacak. Bu python ekranında butona tıklama yerine klavye tuşlarıyla aynı işlemi nasıl yapabiliriz? Mesela birtanede başlat butonu ekleyip, Bağlan dedikten sonra Başlat butonuna tıkladıktan sonra 1′ e bastığımızda led1 yansın, 2′ ye bastığımızda led1 sönsün. Klavyeden değer gönderme işini fonksiyon altında bir türlü yapamadım. Program kilitlenip kalıyor. Yardımcı olabilirseniz sevinirim iyi günler iyi çalışmalar

    • Yanlış anlamadıysam klavyeden hangi tuşa basıldığını algılayabiliyorsun. Başlat butonuna bastıktan sonra arayüz kodlarında sonsuz döngü kullanıyorsan programı kitler. Böyle döngüleri thread’ler içine kullanman gerek. Eğer kodları paylaşmanda sakınca yok ise bana https://paste.ubuntu.com/ sitesine kodları yazıp linki gönderebilirsin.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir