Isi kandungan:

Automatik Rumah Raspberry Pi 433MHz Super Mudah: 7 Langkah
Automatik Rumah Raspberry Pi 433MHz Super Mudah: 7 Langkah

Video: Automatik Rumah Raspberry Pi 433MHz Super Mudah: 7 Langkah

Video: Automatik Rumah Raspberry Pi 433MHz Super Mudah: 7 Langkah
Video: Akses pintu dan kontrol lampu dengan Raspberry PI dengan backup daya solar cell 2024, November
Anonim
Automasi Rumah Raspberry Pi 433MHz Super Sederhana
Automasi Rumah Raspberry Pi 433MHz Super Sederhana

Tutorial ini adalah salah satu di antara banyak yang berkaitan dengan penggunaan Raspberry Pi untuk mengawal peranti tanpa wayar di sekitar rumah. Seperti banyak yang lain, ini akan menunjukkan kepada anda bagaimana menggunakan pasangan pemancar / penerima murah yang disambungkan ke Pi anda untuk berinteraksi dengan peranti yang beroperasi pada jalur frekuensi radio 433MHz yang biasa digunakan. Secara khusus ia akan menunjukkan kepada anda cara menghidupkan atau mematikan sebarang alat elektrik menggunakan Pi anda dengan menghantar perintah ke satu set soket kuasa terkawal jarak jauh 433MHz.

Mengapa saya membuat tutorial ini jika sudah banyak yang ada? Terutama kerana hampir semua tutorial lain yang saya temui nampaknya terlalu banyak perkara, terutama di bahagian perisian. Saya perhatikan bahawa mereka sangat bergantung pada perpustakaan pihak ketiga, skrip atau coretan kod untuk melakukan semua kerja. Ramai yang tidak akan menjelaskan apa yang dilakukan oleh kod yang mendasari - mereka hanya akan meminta anda mengeluarkan dua atau tiga perisian pada Pi anda dan melaksanakan banyak perintah, tidak ada soalan yang diajukan. Saya benar-benar ingin mencuba dan menggunakan Pi saya untuk menghidupkan dan mematikan peranti elektrik di sekitar rumah saya menggunakan satu set soket kawalan jauh 433MHz, tetapi saya ingin membuat versi sistem saya sendiri yang dapat saya fahami, semoga dapat menghilangkan keperluan untuk gunakan perpustakaan atau skrip orang lain.

Itulah maksud tutorial ini. Bahagian perisian sistem ini terdiri daripada dua skrip Python yang sangat mudah - satu untuk penerimaan dan rakaman isyarat, dan satu untuk menghantar isyarat ini kembali ke soket kuasa tanpa wayar. Penerimaan / penghantaran isyarat yang sebenarnya hanya bergantung pada perpustakaan RPi. GPIO yang mudah digunakan yang, sekurang-kurangnya bagi saya, telah dipasang dengan Raspbian. Perpustakaan ini juga boleh diimport terus ke Python.

Untuk projek ini, anda memerlukan:

Pi Raspberry. Mana-mana model mesti berfungsi, saya menggunakan starter kit semua-dalam-satu, tetapi mungkin anda memerlukan unit pusat sahaja

Sepasang pemancar / penerima 433MHz. Yang paling biasa digunakan dalam projek jenis ini adalah seperti ini. Membeli sebungkus lima seperti yang dipautkan memastikan bahawa anda mempunyai beberapa alat ganti

Satu set soket kuasa kawalan jauh 433MHz. Saya menggunakan ini yang sangat saya sarankan, tetapi terdapat banyak model yang tersedia. Pastikan mereka beroperasi mengikut frekuensi ini

Beberapa aksesori bangunan litar. Saya akan mengesyorkan menggunakan papan roti dan kabel pelompat untuk membuat proses pembinaan litar semudah mungkin.

[Sekiranya anda memutuskan untuk membeli mana-mana produk ini, saya akan sangat menghargainya jika anda mengakses senarai menggunakan pautan di atas - dengan cara itu, saya akan mendapat sedikit keuntungan tanpa kos tambahan kepada anda!]

Langkah 1: Menyiapkan Unit Penerima

Menetapkan Unit Penerima
Menetapkan Unit Penerima

Sebelum anda dapat menggunakan Pi untuk menghantar arahan ke soket yang dikendalikan dari jauh, anda perlu mengetahui isyarat khusus yang mereka balas. Sebilangan besar soket kawalan jauh dihantar dengan telefon bimbit yang boleh digunakan untuk menghidupkan atau mematikan unit tertentu. Bagi telefon bimbit yang saya beli, telefon bimbit mempunyai empat baris butang ON / OFF berpasangan, masing-masing menghantar isyarat ON atau OFF ke unit soket tertentu.

Ini menimbulkan persoalan - bagaimana kita tahu butang mana yang sesuai dengan soket mana? Ini sebenarnya bergantung pada model yang anda ada. Salah satu sebab utama saya memilih gaya soket tertentu (dihubungkan dalam pendahuluan) ialah unit dapat dikonfigurasi dengan suis fizikal untuk membuat soket tertentu bertindak balas terhadap set butang ON / OFF tertentu pada telefon bimbit. Ini juga bermaksud bahawa anda boleh mencabut dan menggerakkan soket di sekitar rumah dengan mengetahui bahawa setiap unit akan sentiasa memberi respons kepada isyarat ON / OFF yang sama.

Setelah anda mengetahui bagaimana soket anda berinteraksi dengan telefon bimbit, anda perlu menggunakan unit penerima 433MHz anda (gambar di atas) untuk 'mengendus' kod yang dihantar oleh telefon bimbit. Setelah anda merakam bentuk gelombang kod ini, anda boleh menirunya menggunakan Python dan menghantarnya menggunakan unit pemancar.

Perkara pertama yang perlu dilakukan di sini ialah pasangkan pin pada penerima anda ke pin GPIO yang betul pada Pi. Unit penerima mempunyai empat pin, tetapi hanya tiga daripadanya diperlukan. Saya rasa kedua-dua pin pusat memberikan output yang sama, jadi anda hanya perlu menyambung ke salah satu dari mereka (kecuali jika anda ingin mengalirkan isyarat yang diterima ke dua pin GPIO yang berasingan).

Gambar di atas merangkumi pendawaian. Setiap pin pada penerima boleh disambungkan terus ke pin yang sesuai pada Pi. Saya menggunakan papan roti dan kabel jumper untuk menjadikan prosesnya lebih elegan. Perhatikan bahawa anda boleh memilih mana-mana pin data GPIO untuk disambungkan ke salah satu pin penerima pusat. Saya menggunakan pin yang bertanda '23' pada header Pi saya.

PENTING: Sekiranya anda menyambungkan pin bertanda '3v3' pada gambar di atas ke pin voltan yang lebih tinggi pada Pi (mis. 5v), anda mungkin akan merosakkan Pi kerana pin GPIO tidak dapat menahan voltan di atas 3v3. Sebagai alternatif, anda boleh menghidupkannya dengan 5v dan menyediakan pembahagi voltan untuk menghantar voltan selamat ke pin DATA.

Julat penerima tidak akan terlalu besar pada voltan ini, terutamanya jika antena tidak disambungkan. Walau bagaimanapun, anda tidak memerlukan jarak jauh di sini - selagi penerima dapat mengambil isyarat dari telefon bimbit ketika mereka berada tepat di sebelah satu sama lain, itulah yang kami perlukan.

Langkah 2: Mengendus Kod Handset

Menghidu Kod Handset
Menghidu Kod Handset

Setelah penerima anda disambungkan ke Pi, anda boleh memulakan peringkat pertama projek ini yang menarik - menghidu. Ini melibatkan penggunaan skrip Python yang dilampirkan untuk merakam isyarat yang dihantar oleh telefon bimbit apabila setiap butang ditekan. Skripnya sangat mudah, dan saya sangat mengesyorkan anda melihatnya sebelum anda menjalankannya - bagaimanapun, intinya dari projek ini adalah bahawa anda tidak hanya akan menjalankan kod orang lain secara membuta tuli!

Sebelum anda memulakan proses ini, anda perlu memastikan bahawa anda mempunyai perpustakaan Python yang diperlukan untuk menjalankan skrip sniffer. Mereka disenaraikan di bahagian atas skrip:

dari datetime import datetime

import matplotlib.pyplot sebagai pyplot import RPi. GPIO sebagai GPIO

Perpustakaan RPi. GPIO dan datetime disertakan dengan pengedaran Raspbian saya, tetapi saya harus memasang perpustakaan matplotlib seperti berikut:

sudo apt-get install python-matplotlib

Perpustakaan ini adalah perpustakaan grafik yang biasa digunakan yang sangat berguna walaupun di luar projek ini, jadi memasangnya pasti tidak akan menyakitkan! Setelah perpustakaan anda dikemas kini, anda sudah bersedia untuk memulakan rakaman data. Inilah cara skrip berfungsi:

Ketika dijalankan (menggunakan perintah 'python ReceiveRF.py'), ia akan mengkonfigurasi pin GPIO yang ditentukan sebagai input data (pin 23 secara lalai). Ia kemudian akan terus mencuba pin dan log sama ada ia menerima digital 1 atau 0. Ini berterusan untuk jangka masa yang ditetapkan (5 saat secara lalai). Apabila had masa ini tercapai, skrip akan berhenti merakam data dan akan menutup input GPIO. Ia kemudian melakukan sedikit pemprosesan pasca dan memetakan nilai input yang diterima terhadap masa. Sekali lagi, jika anda mempunyai pertanyaan mengenai skrip itu, anda mungkin boleh menjawabnya sendiri setelah melihat bagaimana ia berfungsi. Saya telah berusaha menjadikan kod itu boleh dibaca dan semudah mungkin.

Apa yang perlu anda lakukan ialah memerhatikan apabila skrip menunjukkan bahawa ia telah ** Memulakan rakaman **. Sebaik sahaja mesej ini muncul, anda harus menekan dan menahan salah satu butang pada telefon bimbit selama lebih kurang satu saat. Pastikan anda berada dekat dengan penerima. Setelah skrip selesai merakam, ia akan menggunakan matplotlib untuk memplot bentuk gelombang grafik dari isyarat yang diterimanya selama selang rakaman. Harap maklum, jika anda tersambung ke Pi menggunakan klien SSH seperti PuTTY, anda juga perlu membuka aplikasi X11 untuk membolehkan bentuk gelombang ditampilkan. Saya menggunakan xMing untuk ini (dan untuk perkara lain seperti desktop jauh ke dalam Pi saya). Untuk membolehkan plot ditunjukkan, cukup mulakan xMing sebelum anda menjalankan skrip dan tunggu hasilnya muncul.

Sebaik sahaja tetingkap matplotlib anda muncul, kawasan yang menarik di dalam plot pasti cukup jelas. Anda boleh menggunakan kawalan di bahagian bawah tetingkap untuk memperbesar sehingga anda dapat memilih tinggi dan rendahnya isyarat yang dihantar oleh telefon bimbit semasa butang ditahan. Lihat gambar di atas untuk contoh kod lengkap. Isyarat mungkin terdiri daripada denyutan yang sangat pendek yang dipisahkan oleh jangka masa yang sama di mana tidak ada isyarat yang diterima. Blok denyutan pendek ini mungkin akan diikuti oleh jangka masa yang lebih lama di mana tidak ada yang diterima, selepas itu corak akan berulang. Setelah anda mengenal pasti corak kepunyaan satu kod, ambil tangkapan skrin seperti itu di bahagian atas halaman ini, dan teruskan ke langkah seterusnya untuk menafsirkannya.

Langkah 3: Menyalin Isyarat yang Berakibat

Menyalin Isyarat yang Berakibat
Menyalin Isyarat yang Berakibat

Setelah anda mengenal pasti blok tinggi dan rendah berkala yang sesuai dengan isyarat butang tertentu, anda memerlukan kaedah menyimpan dan menafsirkannya. Dalam contoh isyarat di atas, anda akan melihat bahawa hanya ada dua corak unik yang membentuk keseluruhan blok isyarat. Kadang-kadang anda melihat tinggi pendek diikuti rendah rendah, dan kadang-kadang sebaliknya - tinggi panjang diikuti rendah rendah. Semasa saya menyalin isyarat saya, saya memutuskan untuk menggunakan konvensyen penamaan berikut:

1 = short_on + long_off0 = long_on + short_off

Lihat lagi bentuk gelombang berlabel, dan anda akan melihat maksud saya. Setelah anda mengenal pasti corak setara dalam isyarat anda, yang perlu anda lakukan ialah mengira 1 dan 0 untuk membina urutan. Apabila ditranskrip, isyarat di atas boleh ditulis seperti berikut:

1111111111111010101011101

Sekarang anda hanya perlu mengulangi proses ini untuk merakam dan menyalin isyarat yang sesuai dengan butang lain di telefon bimbit anda, dan anda telah menyelesaikan bahagian pertama proses itu!

Sebelum anda dapat menghantar semula isyarat menggunakan pemancar, ada sedikit lagi yang perlu dilakukan. Masa antara tinggi dan rendah yang sepadan dengan 1 atau 0 sangat penting, dan anda perlu memastikan bahawa anda tahu berapa lama 'short_on' atau 'long_off' sebenarnya berlangsung. Untuk kod saya, terdapat tiga bahagian maklumat masa yang perlu saya ambil untuk meniru isyarat:

  • Tempoh selang 'pendek', iaitu permulaan 1 atau akhir 0.
  • Tempoh selang 'panjang', iaitu akhir 1 atau permulaan 0.
  • Tempoh selang 'diperpanjang'. Saya perhatikan bahawa ketika saya menekan butang pada telefon bimbit, terdapat jangka masa 'exted_off' antara setiap contoh blok isyarat yang berulang. Kelewatan ini digunakan untuk penyegerakan dan mempunyai jangka masa yang tetap.

Untuk menentukan nilai masa ini, anda boleh menggunakan fungsi zoom pada tetingkap matplotlib untuk memperbesar dan meletakkan kursor di bahagian-bahagian isyarat yang relevan. Pembacaan lokasi kursor di bahagian bawah tetingkap membolehkan anda menentukan seberapa luas setiap bahagian isyarat yang sesuai dengan selang panjang, pendek atau panjang. Perhatikan bahawa paksi-x plot mewakili masa, dan komponen x pembacaan kursor adalah dalam satuan detik. Bagi saya, lebarnya adalah seperti berikut (dalam beberapa saat):

  • short_delay = 0.00045
  • long_delay = 0.00090 (dua kali lebih lama sebagai 'pendek')
  • dilanjutkan_delay = 0.0096

Langkah 4: Menyiapkan Unit Pemancar

Menetapkan Unit Pemancar
Menetapkan Unit Pemancar

Setelah anda mengumpulkan kod dan data masa anda, anda boleh memutuskan unit penerima anda kerana anda tidak lagi memerlukannya. Anda kemudian boleh memasang pemancar terus ke pin Pi GPIO yang berkaitan seperti yang ditunjukkan pada gambar di atas. Saya mendapati bahawa pin pada unit pemancar dilabel, yang menjadikan prosesnya lebih mudah.

Dalam kes ini, adalah baik untuk menghidupkan unit menggunakan bekalan 5v dari Pi kerana pin DATA tidak akan menghantar isyarat ke Pi, hanya menerimanya. Juga, bekalan kuasa 5v akan memberikan jarak transmisi lebih banyak daripada menggunakan bekalan 3v3. Sekali lagi, anda boleh menyambungkan pin DATA ke pin yang sesuai pada Pi. Saya menggunakan pin 23 (sama dengan penerima).

Perkara lain yang saya cadangkan lakukan ialah menambahkan antena ke lubang kecil di kanan atas pemancar. Saya menggunakan sekeping dawai lurus sepanjang 17cm. Beberapa sumber mengesyorkan kawat bergelung dengan panjang yang serupa. Saya tidak pasti mana yang lebih baik, tetapi wayar lurus memberikan jarak yang cukup untuk saya menghidupkan / mematikan soket dari mana-mana lokasi di flat kecil saya. Adalah lebih baik untuk menyolder antena, tetapi saya baru mengeluarkan sebahagian plastik dari wayar dan membungkus tembaga melalui lubang.

Setelah pemancar disambung, semua persediaan perkakasan selesai! Satu-satunya perkara yang perlu dilakukan sekarang ialah memasang soket anda di sekitar rumah dan melihat program pemancar.

Langkah 5: Menghantar Isyarat Menggunakan Pi

Di sinilah skrip Python kedua masuk. Ia direka untuk menjadi semudah yang pertama, jika tidak lebih. Sekali lagi, sila muat turun dan lihat kodnya. Anda perlu mengedit skrip untuk menghantar isyarat yang betul sesuai dengan data yang anda rakam pada langkah 3, jadi sekarang adalah masa yang tepat untuk melihatnya dengan cepat.

Perpustakaan yang diperlukan untuk menjalankan skrip ini semuanya telah diprapasang pada Pi saya, jadi tidak perlu lagi pemasangan. Mereka disenaraikan di bahagian atas skrip:

masa import

import sys import RPi. GPIO sebagai GPIO

Di bawah import perpustakaan adalah maklumat yang perlu anda edit. Berikut adalah penampilannya secara lalai (ini adalah maklumat yang sesuai dengan soket saya seperti yang ditentukan menggunakan langkah 3):

a_on = '1111111111111010101011101'

a_off = '1111111111111010101010111' b_on = '1111111111101110101011101' b_off = '1111111111101110101010111' c_on = '1111111111101011101011101' c_off = '1111111111101011101010111' d_on = '1111111111101010111011101' d_off = '1111111111101010111010111' short_delay = 0,00045 long_delay = 0,00090 extended_delay = 0.0096

Di sini kita mempunyai lapan rentetan kod (dua untuk setiap pasang butang hidup / mati pada telefon bimbit saya - anda mungkin mempunyai lebih banyak atau lebih sedikit kod) diikuti oleh tiga bahagian maklumat masa yang ditentukan juga pada langkah 3. Luangkan masa untuk memastikan anda mempunyai memasukkan maklumat ini dengan betul.

Setelah anda berpuas hati dengan kod / kelewatan yang anda masukkan ke dalam skrip (anda boleh menamakan semula pemboleh ubah rentetan kod jika anda mahu), anda sudah cukup bersedia untuk mencuba sistem! Sebelum anda melakukannya, lihat fungsi transmit_code () dalam skrip. Di sinilah berlaku interaksi sebenar dengan pemancar. Fungsi ini mengharapkan salah satu rentetan kod dihantar sebagai argumen. Ia kemudian membuka pin yang ditentukan sebagai output GPIO dan mengulangi setiap watak dalam rentetan kod. Ia kemudian menghidupkan atau mematikan pemancar sesuai dengan maklumat masa yang anda masukkan untuk membina bentuk gelombang yang sepadan dengan rentetan kod. Ini menghantar setiap kod beberapa kali (10 secara lalai) untuk mengurangkan kemungkinan terlepas, dan meninggalkan lanjutan_panjangan antara setiap blok kod, seperti telefon bimbit.

Untuk menjalankan skrip, anda boleh menggunakan sintaks arahan berikut:

python TransmitRF.py code_1 code_2…

Anda boleh menghantar beberapa rentetan kod dengan satu skrip yang dijalankan. Contohnya, untuk mematikan soket (a) dan (b) dan mematikan soket (c), jalankan skrip dengan arahan berikut:

python TransmitRF.py a_on b_on c_off

Langkah 6: Catatan mengenai Ketepatan Masa

Seperti yang disebutkan, waktu antara denyut hidup / mati yang dihantar adalah sangat penting. Skrip TransmitRF.py menggunakan fungsi time.sleep () python untuk membina bentuk gelombang dengan selang nadi yang betul, tetapi harus diperhatikan bahawa fungsi ini tidak sepenuhnya tepat. Tempoh yang menyebabkan skrip menunggu sebelum menjalankan operasi seterusnya boleh bergantung pada beban pemproses pada saat yang diberikan. Itulah sebab lain mengapa TransmitRF.py menghantar setiap kod beberapa kali - sekiranya fungsi time.sleep () tidak dapat membina contoh kod yang diberikan dengan betul.

Saya secara peribadi tidak pernah mempunyai masalah dengan waktu. Tidur () ketika menghantar kod. Namun saya tahu bahawa masa saya.sleep () cenderung mempunyai ralat sekitar 0.1ms. Saya menentukannya dengan menggunakan skrip SleepTest.py yang dilampirkan yang dapat digunakan untuk memberi anggaran seberapa tepat fungsi waktu Pi.sleep () anda. Untuk soket kawalan jauh saya, kelewatan terpendek yang perlu saya laksanakan ialah 0.45ms. Seperti yang saya katakan, saya tidak menghadapi masalah dengan soket yang tidak responsif, jadi sepertinya 0.45 ± 0.1ms cukup baik.

Terdapat kaedah lain untuk memastikan bahawa kelewatan lebih tepat; sebagai contoh, anda boleh menggunakan cip PIC khusus untuk menghasilkan kod, tetapi perkara seperti itu berada di luar ruang lingkup tutorial ini.

Langkah 7: Kesimpulannya

Kesimpulannya
Kesimpulannya

Projek ini telah menyajikan kaedah untuk mengendalikan sebarang alat elektrik menggunakan Raspberry Pi dan satu set soket kawalan jauh 433MHz, dengan fokus pada kesederhanaan dan ketelusan. Ini adalah projek yang paling menarik dan fleksibel yang saya gunakan untuk Pi saya, dan ada aplikasi tanpa had untuknya. Berikut adalah beberapa perkara yang dapat saya lakukan sekarang berkat Pi saya:

  • Hidupkan pemanas elektrik di sebelah katil saya setengah jam sebelum penggera saya berbunyi.
  • Matikan pemanas sejam selepas saya tidur.
  • Nyalakan lampu di sebelah katil saya semasa penggera saya berbunyi sehingga saya tidak dapat tidur lena.
  • dan banyak lagi…

Untuk kebanyakan tugas ini, saya menggunakan fungsi crontab dalam Linux. Ini membolehkan anda mengatur tugas berjadual automatik untuk menjalankan skrip TransmitRF.py pada waktu-waktu tertentu. Anda juga dapat menggunakan perintah Linux at untuk menjalankan tugas sekali (yang, bagi saya, perlu dipasang secara berasingan menggunakan 'sudo apt-get install at'). Contohnya, untuk menghidupkan pemanas saya setengah jam sebelum penggera saya padam keesokan harinya, yang perlu saya lakukan ialah menaip:

pada pukul 05:30

python TransmitRF.py c_on

Anda juga boleh menggunakan projek ini bersama dengan sistem pemantauan rumah Dropbox saya untuk mengawal peralatan melalui internet! Terima kasih kerana membaca, dan jika anda ingin menjelaskan sesuatu atau berkongsi pendapat anda, sila hantar komen!

Disyorkan: