İçindekiler:

Süper Basit Raspberry Pi 433MHz Ev Otomasyonu: 7 Adım
Süper Basit Raspberry Pi 433MHz Ev Otomasyonu: 7 Adım

Video: Süper Basit Raspberry Pi 433MHz Ev Otomasyonu: 7 Adım

Video: Süper Basit Raspberry Pi 433MHz Ev Otomasyonu: 7 Adım
Video: Ultra Akıllı Ev Kontrol Paneli Yaptım! (Haftalık Vlog) 2024, Kasım
Anonim
Süper Basit Raspberry Pi 433MHz Ev Otomasyonu
Süper Basit Raspberry Pi 433MHz Ev Otomasyonu

Bu eğitim, evdeki kablosuz cihazları kontrol etmek için bir Raspberry Pi kullanmak söz konusu olduğunda pek çok örnekten biridir. Diğerleri gibi, yaygın olarak kullanılan 433MHz radyo frekans bandında çalışan cihazlarla etkileşim kurmak için Pi'nize bağlı ucuz bir verici/alıcı çiftinin nasıl kullanılacağını gösterecektir. Komutları 433MHz uzaktan kumandalı elektrik prizlerine ileterek Pi'nizi kullanarak herhangi bir elektrikli cihazı nasıl açıp kapatacağınızı size özel olarak gösterecektir.

Zaten bu kadar çok varsa neden bu öğreticiyi oluşturdum? Temelde, karşılaştığım diğer tüm öğreticilerin, özellikle yazılım tarafında, işleri aşırı karmaşık hale getirdiği için. Tüm işleri yapmak için büyük ölçüde üçüncü taraf kitaplıklarına, komut dosyalarına veya kod parçacıklarına güvendiklerini fark ettim. Pek çoğu, altta yatan kodun ne yaptığını bile açıklamaz - sizden sadece iki veya üç yazılım parçasını Pi'nize koymanızı ve bir sürü komut çalıştırmanızı isterler, soru sorulmaz. Bir dizi 433MHz uzaktan kumandalı priz kullanarak evimdeki elektrikli cihazları açıp kapatmak için Pi'mi gerçekten denemek ve kullanmak istedim, ancak sistemin anlayabileceğim kendi versiyonunu oluşturmak istedim, umarım ihtiyacı ortadan kaldırır. başka birinin kitaplıklarını veya komut dosyalarını kullanın.

Bu eğitimin konusu budur. Bu sistemin yazılım tarafı iki çok basit Python betiğinden oluşur - biri sinyalleri almak ve kaydetmek için, diğeri bu sinyalleri kablosuz güç soketlerine geri iletmek için. Sinyalin gerçek alımı/iletimi yalnızca, en azından benim için Raspbian ile önceden yüklenmiş olarak gelen, kullanımı kolay RPi. GPIO kitaplığına dayanır. Bu kitaplık doğrudan Python'a da aktarılabilir.

Bu proje için ihtiyacınız olacak:

Bir Ahududu Pi. Herhangi bir model çalışmalıdır, hepsi bir arada bir başlangıç kiti kullandım, ancak belki de yalnızca merkezi üniteye ihtiyacınız var

433MHz verici/alıcı çifti. Bu tür projelerde en yaygın olarak kullanılanlar bunlar gibi görünüyor. Bağlantılı gibi beşli bir paket satın almak, birkaç yedek parçanızın olmasını sağlar

Bir dizi 433MHz uzaktan kumandalı elektrik prizi. Şiddetle tavsiye edeceğim bunları kullandım, ancak sayısız model mevcut. Sadece bu frekansta çalıştıklarından emin olun

Bazı devre oluşturma aksesuarları. Devre oluşturma sürecini olabildiğince kolaylaştırmak için bir devre tahtası ve bazı atlama kabloları kullanmanızı tavsiye ederim.

[Bu ürünlerden herhangi birini satın almaya karar verirseniz, yukarıdaki bağlantıları kullanarak listelere ulaşırsanız çok memnun olurum - bu şekilde, size hiçbir ek ücret ödemeden kardan küçük bir pay alıyorum!]

Adım 1: Alıcı Birimi Ayarlama

Alıcı Birimi Ayarlama
Alıcı Birimi Ayarlama

Uzaktan kumandalı soketlere komut göndermek için Pi'nizi kullanmadan önce, hangi özel sinyallere yanıt verdiklerini bilmeniz gerekir. Çoğu uzaktan kumandalı priz, belirli birimleri açıp kapatmak için kullanılabilen bir ahize ile birlikte gönderilir. Satın aldıklarımda, ahizenin her biri belirli bir soket birimine bir AÇMA veya KAPATMA sinyali gönderen dört sıra eşleştirilmiş AÇMA/KAPAMA düğmesi vardır.

Bu bir soruyu gündeme getiriyor - hangi düğmelerin hangi sokete karşılık geldiğini nasıl bileceğiz? Bu aslında sahip olduğunuz modele bağlıdır. Kendi soket tarzımı seçmemin ana nedenlerinden biri (girişte bağlantılıdır), ünitelerin, belirli bir soketin ahizedeki belirli bir AÇMA/KAPAMA düğmesine yanıt vermesini sağlamak için fiziksel bir anahtarla yapılandırılabilmesidir. Bu aynı zamanda, her birimin her zaman aynı AÇMA/KAPAMA sinyallerine yanıt vereceğini bilerek prizleri fişten çekip evin etrafında hareket ettirebileceğiniz anlamına gelir.

Soketlerinizin ahize ile nasıl etkileşime girdiğini anladıktan sonra, ahize tarafından gönderilen kodları 'koklamak' için 433MHz alıcı biriminizi (yukarıda resmedilmiştir) kullanmanız gerekecektir. Bu kodların dalga biçimlerini kaydettikten sonra, bunları Python kullanarak çoğaltabilir ve verici birimi kullanarak gönderebilirsiniz.

Burada yapılacak ilk şey, alıcınızdaki pinleri Pi'deki doğru GPIO pinlerine bağlamaktır. Alıcı biriminin dört pimi vardır, ancak bunlardan yalnızca üçüne ihtiyaç vardır. Her iki merkezi pinin de aynı çıkışı verdiğini düşünüyorum, bu yüzden bunlardan yalnızca birine bağlanmanız gerekiyor (alınan sinyalleri iki ayrı GPIO pinine aktarmak istemiyorsanız).

Yukarıdaki resim kablolamayı hemen hemen özetliyor. Alıcı üzerindeki her bir pim, doğrudan Pi üzerindeki karşılık gelen pime bağlanabilir. Süreci biraz daha zarif hale getirmek için bir devre tahtası ve atlama kabloları kullanıyorum. Merkezi alıcı pinlerinden birine bağlanmak için herhangi bir GPIO veri pinini seçebileceğinizi unutmayın. Pi başlığımda '23' olarak işaretlenmiş pini kullandım.

ÖNEMLİ: Yukarıdaki resimde '3v3' olarak işaretlenmiş pini Pi üzerindeki daha yüksek bir voltaj pinine (örneğin 5v) bağlarsanız, GPIO pinleri 3v3'ün üzerindeki voltajları tolere edemediğinden muhtemelen Pi'ye zarar verirsiniz. Alternatif olarak, 5v ile güç verebilir ve DATA pinine güvenli bir voltaj göndermek için bir voltaj bölücü kurabilirsiniz.

Bu voltajda, özellikle bir anten bağlı değilse, alıcının menzili çok geniş olmayacaktır. Ancak burada uzun bir menzile ihtiyacınız yok - alıcı yan yana tutulduğunda ahizeden gelen sinyalleri alabildiği sürece, ihtiyacımız olan tek şey bu.

Adım 2: Ahize Kodlarını Koklama

Ahize Kodlarını Koklama
Ahize Kodlarını Koklama

Artık alıcınız Pi'ye bağlı olduğuna göre, bu projenin ilk heyecan verici aşamasına başlayabilirsiniz - koklama. Bu, her bir düğmeye basıldığında ahize tarafından iletilen sinyali kaydetmek için ekli Python betiğinin kullanılmasını içerir. Senaryo çok basittir ve çalıştırmadan önce bir göz atmanızı şiddetle tavsiye ederim - sonuçta, bu projenin amacı, başka birinin kodunu körü körüne çalıştırmayacağınızdır!

Bu işleme başlamadan önce, sniffer komut dosyasını çalıştırmak için gereken Python kitaplıklarına sahip olduğunuzdan emin olmanız gerekir. Komut dosyasının en üstünde listelenirler:

tarih saatinden içe aktarma tarih saatinden

matplotlib.pyplot'u pyplot olarak içe aktarın RPi. GPIO'yu GPIO olarak içe aktarın

Raspbian dağıtımıma RPi. GPIO ve datetime kitaplıkları dahil edildi, ancak matplotlib kitaplığını aşağıdaki gibi kurmam gerekiyordu:

sudo apt-get install python-matplotlib

Bu kütüphane, bu projenin dışında bile çok faydalı olan, yaygın olarak kullanılan bir grafik çizim kütüphanesidir, bu yüzden onu kurmak kesinlikle zarar veremez! Kitaplıklarınız güncel olduğunda, verileri kaydetmeye başlamaya hazırsınız. Komut dosyası şu şekilde çalışır:

Çalıştırıldığında ('python ReceiveRF.py' komutunu kullanarak), tanımlanan GPIO pinini bir veri girişi olarak yapılandıracaktır (varsayılan olarak pin 23). Ardından sürekli olarak pini örnekleyecek ve dijital 1 mi yoksa 0 mı aldığını günlüğe kaydedecektir. Bu, belirli bir süre boyunca (varsayılan olarak 5 saniye) devam eder. Bu zaman sınırına ulaşıldığında, komut dosyası veri kaydetmeyi durduracak ve GPIO girişini kapatacaktır. Daha sonra küçük bir son işlem gerçekleştirir ve alınan girdi değerini zamana karşı çizer. Yine, betiğin ne yaptığı hakkında sorularınız varsa, muhtemelen nasıl çalıştığına baktıktan sonra bunları kendiniz cevaplayabilirsiniz. Kodu olabildiğince okunabilir ve basit hale getirmeye çalıştım.

Yapmanız gereken, komut dosyasının **Kayıt başladı** olduğunu belirttiğinde dikkat etmektir. Bu mesaj göründüğünde, ahizedeki düğmelerden birini yaklaşık bir saniye basılı tutmalısınız. Alıcıya yakın tuttuğunuzdan emin olun. Komut dosyası kaydı bitirdiğinde, kayıt aralığı sırasında aldığı sinyalin grafiksel bir dalga biçimini çizmek için matplotlib'i kullanır. Lütfen, Pi'nize PuTTY gibi bir SSH istemcisi kullanarak bağlıysanız, dalga formunun görüntülenmesine izin vermek için bir X11 uygulaması açmanız gerekeceğini unutmayın. Bunun için xMing kullanıyorum (ve Pi'me uzaktan masaüstü yerleştirme gibi diğer şeyler için). Grafiğin görüntülenmesine izin vermek için, betiği çalıştırmadan önce xMing'i başlatmanız ve sonuçların görünmesini beklemeniz yeterlidir.

Matplotlib pencereniz göründüğünde, arsa içindeki ilgi alanı oldukça açık olmalıdır. Düğme basılı tutulurken ahize tarafından iletilen sinyalin iniş çıkışlarını seçebilene kadar yakınlaştırmak için pencerenin altındaki kontrolleri kullanabilirsiniz. Tam bir kod örneği için yukarıdaki resme bakın. Sinyal muhtemelen, hiçbir sinyalin alınmadığı benzer zaman periyotlarıyla ayrılmış çok kısa darbelerden oluşacaktır. Bu kısa darbe bloğunu muhtemelen hiçbir şeyin alınmadığı daha uzun bir süre takip edecek ve ardından model tekrar edecektir. Kodun tek bir örneğine ait kalıbı tanımladıktan sonra, bu sayfanın üst kısmındaki gibi bir ekran görüntüsü alın ve yorumlamak için bir sonraki adıma geçin.

Adım 3: Ortaya Çıkan Sinyalin Transkripsiyonu

Ortaya Çıkan Sinyalin Transkripsiyonu
Ortaya Çıkan Sinyalin Transkripsiyonu

Artık belirli bir düğmenin sinyaline karşılık gelen periyodik yüksek ve alçak blokları tanımladığınıza göre, onu saklamanın ve yorumlamanın bir yoluna ihtiyacınız olacak. Yukarıdaki sinyal örneğinde, tüm sinyal bloğunu oluşturan yalnızca iki benzersiz model olduğunu fark edeceksiniz. Bazen kısa bir yükseliş ve ardından uzun bir dip görürsünüz ve bazen bunun tam tersi olur - uzun bir yüksek ve ardından kısa bir dip. Sinyallerimi kopyalarken, aşağıdaki adlandırma kuralını kullanmaya karar verdim:

1 = short_on + long_off0 = long_on + short_off

Etiketli dalga biçimine tekrar bakın, ne demek istediğimi anlayacaksınız. Sinyalinizdeki eşdeğer kalıpları belirledikten sonra, diziyi oluşturmak için tek yapmanız gereken 1'leri ve 0'ları saymaktır. Yazıya döküldüğünde, yukarıdaki sinyal aşağıdaki gibi yazılabilir:

1111111111111010101011101

Şimdi, el cihazınızdaki diğer düğmelere karşılık gelen sinyalleri kaydetmek ve kopyalamak için bu işlemi tekrarlamanız gerekiyor ve işlemin ilk bölümünü tamamladınız!

Vericiyi kullanarak sinyalleri yeniden göndermeden önce yapılacak biraz daha iş var. 1 veya 0'a karşılık gelen yüksekler ve düşükler arasındaki zamanlama çok önemlidir ve bir 'short_on' veya 'long_off' gerçekte ne kadar sürdüğünü bildiğinizden emin olmanız gerekir. Kodlarım için, sinyalleri çoğaltmak için çıkarmam gereken üç adet zamanlama bilgisi vardı:

  • 'Kısa' bir aralığın süresi, yani 1'in başlangıcı veya 0'ın sonu.
  • 'Uzun' bir aralığın süresi, yani 1'in sonu veya 0'ın başlangıcı.
  • 'Uzatılmış' bir aralığın süresi. Ahizedeki bir düğmeyi basılı tuttuğumda, sinyal bloğunun her tekrarlanan örneği arasında bir 'extended_off' süresi olduğunu fark ettim. Bu gecikme, senkronizasyon için kullanılır ve sabit bir süresi vardır.

Bu zamanlama değerlerini belirlemek için matplotlib penceresindeki yakınlaştırma işlevini kullanarak tamamen yakınlaştırabilir ve imleci sinyalin ilgili bölümlerinin üzerine yerleştirebilirsiniz. Pencerenin altındaki imleç konumu okuması, sinyalin her bir bölümünün uzun, kısa veya genişletilmiş bir aralığa karşılık gelen ne kadar geniş olduğunu belirlemenize izin vermelidir. Çizimin x ekseninin zamanı temsil ettiğini ve imleç okumasının x bileşeninin saniye cinsinden olduğunu unutmayın. Benim için genişlikler şu şekildeydi (saniye cinsinden):

  • kısa_gecikme = 0.00045
  • long_delay = 0.00090 ('kısa'nın iki katı)
  • genişletilmiş_gecikme = 0.0096

Adım 4: Verici Biriminin Kurulması

Verici Birimi Ayarlama
Verici Birimi Ayarlama

Kodlarınızı ve zamanlama verilerinizi topladıktan sonra, artık ihtiyacınız olmayacağı için alıcı ünitenizin bağlantısını kesebilirsiniz. Ardından vericiyi yukarıdaki resimde gösterildiği gibi doğrudan ilgili Pi GPIO pinlerine bağlayabilirsiniz. Verici ünitelerindeki pinlerin etiketli olduğunu gördüm, bu da işlemi kolaylaştırıyor.

Bu durumda, DATA pini Pi'ye sinyal göndermeyeceğinden, sadece onları alacağından üniteye Pi'den 5v beslemeyi kullanarak güç vermek uygundur. Ayrıca, 5v güç kaynağı, 3v3 kaynağı kullanmaktan daha fazla iletim aralığı sağlayacaktır. Yine, DATA pinini Pi üzerindeki herhangi bir uygun pine bağlayabilirsiniz. Pim 23'ü kullandım (alıcı için olduğu gibi).

Yapmanızı tavsiye edeceğim bir diğer şey ise vericinin sağ üst köşesindeki küçük deliğe bir anten eklemek. 17 cm uzunluğunda düz bir tel parçası kullandım. Bazı kaynaklar, benzer uzunlukta bir sarmal tel önerir. Hangisinin daha iyi olduğundan emin değilim, ancak düz kablo, küçük dairemdeki herhangi bir yerden prizleri açıp kapamama yetecek kadar menzil sağlıyor. Anteni lehimlemek en iyisidir, ancak telden plastiğin bir kısmını çıkardım ve bakırı delikten sardım.

Verici bağlandıktan sonra, tüm donanım kurulumu bu kadar! Artık yapılacak tek şey prizlerinizi evin etrafına kurmak ve verici programına bir göz atmak.

Adım 5: Pi Kullanarak Sinyalleri İletmek

İkinci Python betiğinin devreye girdiği yer burasıdır. Daha fazla olmasa da, ilki kadar basit olacak şekilde tasarlanmıştır. Tekrar, lütfen indirin ve kodu inceleyin. 3. adımda kaydettiğiniz verilere göre doğru sinyalleri iletmek için komut dosyasını düzenlemeniz gerekecek, bu yüzden şimdi ona hızlı bir şekilde bakmanın tam zamanı.

Bu betiği çalıştırmak için gereken kitaplıkların tümü Pi'me önceden kurulmuştu, bu nedenle başka bir kuruluma gerek yoktu. Komut dosyasının en üstünde listelenirler:

ithalat zamanı

sys'yi içe aktar RPi. GPIO'yu GPIO olarak içe aktar

Kitaplığın içe aktarımının altında, düzenlemeniz gereken bilgiler bulunur. Varsayılan olarak nasıl göründüğü aşağıda açıklanmıştır (bu, adım 3 kullanılarak belirlendiği üzere soketlerime karşılık gelen bilgidir):

a_on = '1111111111111010101011101'

a_off = '1111111111111010101010111' b_on = '111111111101110101011101' b_off = '11111111111101110101010111' c_on = '1111111111101011101011101' c_off = '11111111111010111010101111' d_on = '111111111101110101011101'

Burada sekiz kod dizimiz var (el cihazımdaki her bir açma/kapama düğmesi için iki tane - daha fazla veya daha az kodunuz olabilir) ve ardından yine 3. adımda belirlenen üç adet zamanlama bilgisi var. bu bilgileri doğru girdi.

Komut dosyasına girdiğiniz kodlardan/gecikmelerden memnun olduğunuzda (isterseniz kod dizisi değişkenlerini yeniden adlandırabilirsiniz), sistemi denemeye hemen hemen hazırsınız! Bunu yapmadan önce, komut dosyasındaki iletim_kodu() işlevine bir göz atın. Verici ile gerçek etkileşimin gerçekleştiği yer burasıdır. Bu işlev, kod dizelerinden birinin bağımsız değişken olarak gönderilmesini bekler. Daha sonra tanımlanan pini bir GPIO çıkışı olarak açar ve kod dizisindeki her karakter arasında döngü yapar. Ardından, kod dizisiyle eşleşen bir dalga formu oluşturmak için girdiğiniz zamanlama bilgisine göre vericiyi açar veya kapatır. Kaçırılma olasılığını azaltmak için her bir kodu birden çok kez (varsayılan olarak 10) gönderir ve tıpkı ahize gibi her kod bloğu arasında bir extension_delay bırakır.

Komut dosyasını çalıştırmak için aşağıdaki komut sözdizimini kullanabilirsiniz:

python TransmitRF.py code_1 code_2 …

Komut dosyasının tek bir çalışmasıyla birden çok kod dizesini iletebilirsiniz. Örneğin, (a) ve (b) soketlerini açmak ve (c) soketlerini kapatmak için aşağıdaki komutla betiği çalıştırın:

python TransmitRF.py a_on b_on c_off

Adım 6: Zamanlama Doğruluğu Üzerine Bir Not

Belirtildiği gibi, iletilen açma/kapama darbeleri arasındaki zamanlama oldukça önemlidir. TransmitRF.py betiği, dalga biçimlerini doğru darbe aralıklarıyla oluşturmak için python'un time.sleep() işlevini kullanır, ancak bu işlevin tamamen doğru olmadığına dikkat edilmelidir. Komut dosyasının bir sonraki işlemi gerçekleştirmeden önce beklemesine neden olduğu uzunluk, o andaki işlemci yüküne bağlı olabilir. Bu, TransmitRF.py'nin her kodu birden çok kez göndermesinin bir başka nedenidir - time.sleep() işlevinin belirli bir kod örneğini düzgün şekilde oluşturamaması durumunda.

Kodları gönderme konusunda kişisel olarak time.sleep() ile hiç sorun yaşamadım. Ancak time.sleep() dosyamın yaklaşık 0.1 ms'lik bir hataya sahip olma eğiliminde olduğunu biliyorum. Bunu, Pi'nizin time.sleep() işlevinin ne kadar doğru olduğuna dair bir tahminde bulunmak için kullanılabilecek ekli SleepTest.py betiğini kullanarak belirledim. Özel uzaktan kumandalı soketlerim için uygulamam gereken en kısa gecikme 0,45ms idi. Dediğim gibi, yanıt vermeyen soketlerle ilgili bir sorunum olmadı, bu yüzden 0,45 ± 0,1ms yeterince iyi gibi görünüyor.

Gecikmenin daha doğru olmasını sağlamak için başka yöntemler de vardır; örneğin, kodları oluşturmak için özel bir PIC yongası kullanabilirsiniz, ancak bunun gibi şeyler bu öğreticinin kapsamı dışındadır.

7. Adım: Sonuç

Çözüm
Çözüm

Bu proje, Raspberry Pi ve 433MHz uzaktan kumandalı prizler kullanarak herhangi bir elektrikli cihazı basitlik ve şeffaflığa odaklanarak kontrol etmek için bir yöntem sunmuştur. Bu, Pi'mi kullandığım en heyecan verici ve esnek proje ve bunun için sınırsız uygulama var. Pi'm sayesinde şimdi yapabileceğim bazı şeyler:

  • Alarmım çalmadan yarım saat önce yatağımın yanındaki elektrikli ısıtıcıyı aç.
  • Ben uyuduktan bir saat sonra ısıtıcıyı kapat.
  • Alarmım çaldığında başucu ışığımı aç ki tekrar uyumayayım.
  • ve daha fazlası…

Bu görevlerin çoğu için Linux'ta crontab işlevini kullanıyorum. Bu, TransmitRF.py komut dosyasını belirli zamanlarda çalıştırmak için otomatik zamanlanmış görevler ayarlamanıza olanak tanır. Tek seferlik görevleri çalıştırmak için Linux at komutunu da kullanabilirsiniz (bunun benim için 'sudo apt-get install at' kullanılarak ayrıca yüklenmesi gerekiyordu). Örneğin, ertesi sabah alarmım çalmadan yarım saat önce ısıtıcımı açmak için tek yapmam gereken şunu yazmak:

05:30'da

python TransmitRF.py c_on

Bu projeyi, cihazları internet üzerinden kontrol etmek için Dropbox ev izleme sistemim ile birlikte de kullanabilirsiniz! Okuduğunuz için teşekkürler ve bir şeyi açıklığa kavuşturmak veya görüşünüzü paylaşmak isterseniz, lütfen bir yorum gönderin!

Önerilen: