Sekali lagi sekitar 433 MHz pemancar dan penerima

Perangkat penerima dan pemancar ISM 433 MHz yang paling sederhana telah mendapatkan popularitas yang layak di kalangan pecinta elektronik. Kitnya murah (bahkan di Chip-Deep Anda bisa membelinya seharga 300 rubel, dan pada Ali, kata mereka, umumnya seharga lima puluh dolar), mereka sederhana dan dapat diandalkan. Selain itu (yang mungkin Anda tidak curigai), ini adalah metode pertukaran data nirkabel jarak-jauh dan penembus - sinyal pada frekuensi 433 MHz melewati jauh lebih baik melalui rintangan dan beroperasi pada jarak yang lebih jauh daripada di band 2,4 GHz populer (433) MHz benar - benar tertunda oleh dinding beton setinggi setengah meter, dan Wi-Fi sudah sekarat 10 sentimeter). Saya akui bahwa baru-baru ini muncul modul MBee-868Dilengkapi dengan antena (directional) yang sesuai, mereka "menembak" lebih jauh, tetapi mereka setidaknya merupakan urutan besarnya lebih mahal, lebih sulit untuk terhubung, memerlukan manajemen hemat energi dan pra-konfigurasi. Dan di samping itu, frekuensi 868 MHz melewati rintangan dua kali lebih buruk (walaupun, tentu saja, itu jauh lebih baik daripada frekuensi 2,4 GHz).



Sudah banyak yang ditulis tentang 433 MHz pemancar dan penerima (termasuk di hub) , tentu saja. Namun, tampaknya tidak ada yang tahu cara memasukkan kit ini dengan benar di sirkuit karena alasan yang aneh. Ketika saya sekali lagi membaca di sini bahwa kit โ€œ mengambil 8 meter dalam garis pandang, meter ke-9 tidak dapat dikuasai", Kesabaran saya membentak. Apa lagi 8 meter ?! Pada 40-50 saya akan percaya, meskipun dalam kenyataannya, mungkin, jangkauannya bahkan lebih besar.

Perlu dicatat bahwa saya lebih lanjut memecahkan masalah membuat garis untuk mentransfer data sewenang-wenang, dan tidak hanya mengendalikan soket pintar atau perahu model motor. Tugas saya lebih rumit, tetapi jarak operasi yang dapat diandalkan masih jauh lebih besar. Selain itu, dalam tugas seperti itu, penting bukan hanya dan tidak terlalu jauh dalam garis pandang (dapat berfungsi hanya sebagai perbandingan), tetapi kemampuan untuk menembus berbagai hambatan.

Kit saya bekerja di luar kota pada jarak sekitar 25-30 meter pada sudut tajam ke dinding kayu, sehingga sekitar satu meter (total) dinding dan partisi, sebagian terlindung oleh isolasi foil, berada di jalur sinyal. Pada jarak yang jauh lebih pendek, hampir tepat di belakang dinding, WiFi sudah sepenuhnya kehilangan sinyal. Di kota, sinyal selesai dari satu ujung apartemen kota tiga kamar ke yang lain melalui dua partisi interior, serta dari balkon, di mana dalam garis lurus antara pemancar dan penerima setidaknya 80 sentimeter dari tembok dan partisi plester. Saya tidak menggunakan opsi kit yang lebih mahal yang disebutkan dalam ulasan di atas.

Kelebihan tambahan kit adalah bahwa dalam jeda pemancar tidak mengkonsumsi apa pun, dan tanpa mode Tidur khusus, hanya dengan prinsip perangkatnya (arus konsumsi saat ini sebanding dengan arus kebocoran kolektor dari transistor yang terkunci, yaitu sekitar 100 nA).

Mari kita lihat apa jebakan itu.

Koneksi Pemancar


Pemancar (disebut FS1000A), seperti yang kita lihat dari diagram di bawah, adalah generator paling sederhana yang didasarkan pada resonator SAW 433 MHz. Generator dirakit pada transistor Q1, dan transistor Q2, berdasarkan data digital yang disediakan, hanyalah kunci yang menghubungkan generator ke daya (ke bus GND) di hadapan tingkat tinggi (unit logis) pada input. Daya dapat dari 5 hingga 12 volt, dan, menurut pabrikan, semakin tinggi daya, semakin jauh koneksi berfungsi.



Saya belum memperhatikan manfaat mendasar dari peningkatan nutrisi sebagai bagian dari tugas saya. Namun demikian, orang tidak boleh mengabaikan fakta bahwa tidak ada persyaratan daya khusus di sini, dan dengan meningkatnya voltase perangkat hanya akan bekerja lebih baik. Lebih mudah untuk menghubungkan pemancar langsung ke tegangan dari adaptor 9-12 volt, baterai atau satu set 6 baterai (pin Vin Arduino). Dengan catu daya yang tidak stabil, yang dapat melebihi 12 volt (seperti, misalnya, dengan baterai), saya biasanya memisahkan pemancar dari sirkuit utama dengan stabilizer 9-volt yang terpisah (yang paling sederhana adalah 78L09), dan saya tidak melihat perbedaan operasi antara catu daya 9 dan 12 volt. Dengan Uno atau Nano, Anda dapat menggunakan stabilizer 5-volt bawaan untuk memberi daya pada pengontrol itu sendiri dan sirkuit lain (misalnya, sensor)dan untuk Mini (terutama klon murahnya), saya akan menyarankan Anda untuk meletakkan stabilizer 5-volt terpisah, menghubungkannya ke pin 5V.

Perlu dicatat bahwa pemancar baru-baru ini telah muncul yang terlihat agak tidak standar (lihat Gambar di bawah). Ternyata tidak adanya throttle L1 (tiga putaran), dari yang hanya lubang - fiksi, itu hanya digantikan oleh komponen SMD yang sesuai. Lebih buruk dalam opsi ini berbeda: pencetakan ceroboh dapat menyesatkan mengenai koneksi pin data dan daya. Koneksi yang benar ditunjukkan pada gambar, itu sama untuk semua opsi:



Hal yang paling mencolok dalam hal ini adalah ketika data dan daya bercampur, pemancar terus bekerja dalam jarak pendek! Jika Anda melihat rangkaian, Anda akan mengerti apa itu: basis Q2 melalui resistor terhubung ke catu daya, transistor selalu terbuka, dan tidak mempengaruhi operasi rangkaian. Tingkat logis yang tinggi pada bus daya hanya memberi daya pada generator pada waktu yang tepat. Absurditas dimulai pada jarak tertentu - jelas bahwa dari kesimpulan logis, sumber daya buruk.

Koneksi penerima


Saat membeli receiver (mungkin disebut MX-RM-5V atau XD-RF-5V), perhatikan panjang terminal - entah bagaimana saya menemukan seluruh batch dengan pin yang diperpendek, yang menyebabkan receiver jatuh dari konektor PBS standar dengan sedikit distorsi dan Saya harus secara khusus melampirkan ke papan tulis.

Sirkuit penerima jauh lebih rumit (saya tidak akan memutarnya, tetapi Anda dapat menemukannya, misalnya, di sini ). Ini harus menerima dan memperkuat sinyal frekuensi tinggi, menyaring frekuensi 433 MHz, mengisolasi semburan dan mengubahnya menjadi tingkat logis. Penerima memiliki choke penyetelan (di tengah papan), tetapi tanpa instrumen yang akurat untuk mengukur karakteristik frekuensi amplitudo, saya tidak merekomendasikan memuntirnya - kemungkinan besar, Anda tidak akan meningkatkan apa pun, tetapi hanya merusaknya.

Karena pada jarak yang kecil sinyalnya akan jauh lebih sedikit gangguan, jelaslah bahwa kita harus berurusan dengan gangguan di semua lini: dan metode sirkuit dan perangkat lunak. Perpustakaan melakukan hal terakhir untuk kita, tetapi tidak peduli apa matematika yang digunakan dalam pemrosesan perangkat lunak, disarankan untuk melakukan semuanya terlebih dahulu sehingga unit logis pada output hanya muncul ketika sinyal yang berguna meledak dan tidak muncul di hadapan gangguan. Dengan kata lain, alangkah baiknya untuk mendengarkan secara maksimal terlebih dahulu dari gangguan selama penerimaan.

Metode standar pengurangan noise, yang dikenal di zaman saya kepada setiap siswa yang telah mengumpulkan setidaknya satu radio atau amplifier, adalah bahwa untuk node yang peka terhadap gangguan, perlu membuat catu daya yang terpisah, diisolasi secara maksimal dari sirkuit lain. Anda dapat melakukannya dengan cara yang berbeda: begitu Anda menginstal dioda zener terpisah, sekarang mereka sering mengisolasi kekuatan simpul masalah dengan filter LC (ini disarankan, misalnya, untuk ADC, lihat lembar data untuk pengontrol AVR). Tetapi dalam kondisi kami, ketika komponen modern kecil dan murah, lebih mudah untuk hanya meletakkan stabilizer terpisah dari yang lain pada receiver.



Stabilizer, misalnya, dari tipe LP2950-5.0 ditambah dua kapasitor yang diperlukan untuk itu dalam opsi termurah (ketika kedua kapasitor keramik, dalam kisaran 1-3 mikrofarad) akan menambah maksimal enam puluh untuk biaya sirkuit Anda. Tapi saya lebih suka tidak menyimpan: pada output saya meletakkan keramik biasa, dan pada input saya meletakkan elektrolit (10-100 mikrofarad), apalagi, solid-state (polimer) atau tantalum. Kapasitor keramik dapat disalurkan baik di sana maupun di sana, jika tegangan input 7-12 volt berasal dari baterai-baterai atau dari stabilizer analog lainnya. Sumber berdenyut yang distabilkan dan penyearah tidak stabil yang paling sederhana membutuhkan penyaringan tambahan. Anda dapat menggunakan elektrolit aluminium murah jika Anda meletakkan keramik 0,1 mikrofarad sejajar dengannya,bahkan lebih baik untuk menempatkan serangkaian induktansi pada input dari beberapa fraksi atau unit milligenri.

Stabilizer harus dipasang langsung di dekat penerima, panjang konduktor harus minimal. Alih-alih LP2950, โ€‹โ€‹Anda dapat mengambil LM2931 atau serupa dengan tegangan pass-through kecil (ini sangat penting jika rangkaian ini ditenagai oleh baterai - untuk LM78L05 biasa, tegangan input harus minimal 7,5, dan lebih disukai 8-9 volt).

Dibandingkan dengan kasus powering receiver langsung dari Arduino, seperti yang direkomendasikan dalam semua publikasi (saya belum melihat pengecualian), Anda akan kagum dengan efek yang diperoleh - jangkauan dan kemampuan untuk menembus dinding segera meningkat secara signifikan. Penerima, bersama dengan stabilizer, dapat dilakukan dalam kotak kecil terpisah untuk kenyamanan. Anda dapat menghubungkan outputnya ke pengontrol di badan utama dengan kabel tiga kawat apa saja (dua catu daya dan konduktor sinyal) hingga 3 meter, dan mungkin lebih. Ini lebih nyaman karena antena masih diperlukan, dan menurut aturan akan lebih baik jika mereka sejajar satu sama lain dalam ruang, dan kasing besar tidak selalu dapat ditempatkan sehingga antena menonjol dalam orientasi yang benar.

Dalam versi paling sederhana, sebagai antena, Anda dapat melakukannya dengan memo kawat inti tunggal dengan penampang setidaknya 0,5 mm dan panjang 17 cm ยฑ 1-3 mm. Jangan gunakan kawat pemasangan yang terdampar! Antena spiral kompak lebih banyak dijual, tetapi saya pribadi belum menguji keefektifannya. Ujung antena pemancar dan penerima disegel ke dalam lubang yang sesuai di sudut papan (jangan salah dalam versi pemancar yang ditingkatkan - kata ANT juga tidak pada tempatnya, lihat gambar Di atas).

Pembuatan dan pemrosesan data yang dikirimkan


Ini adalah kelemahan utama kedua dari sebagian besar ulasan pada topik kami: penulis membatasi diri pada beberapa masalah lokal, tanpa merumuskannya secara umum, seperti mentransfer data sewenang-wenang dalam satu paket. Seperti yang Anda pahami dari uraian di atas, hanya urutan bit sederhana yang dapat dikirimkan oleh perangkat kami. Pustaka VirtualWire standar mengkodekannya dengan cara khusus (setiap tetrad dikodekan dengan 6 bit, header sinkronisasi ditambahkan di depan, dan checksum untuk seluruh paket ditambahkan) dan mengubah output menjadi urutan byte yang lebih akrab. Tetapi programmer sudah harus menghadapinya sendiri.

Lebih lanjut, kami berasumsi bahwa pemancar dan penerima terhubung ke Arduino. Selain VirtualWire, sehubungan dengan booming "rumah pintar", ada banyak hal lain seperti RC-Switch atau RemoteSwitch, tetapi mereka berfokus pada tugas-tugas lain, dan jelas tidak layak menggunakan mereka untuk mentransfer data sewenang-wenang.

Panjang maksimum satu pesan di VirtualWire adalah 27 byte (lihat dokumentasi ). Transmisi satu pesan lengkap (secara otomatis dilengkapi dengan tanda tangan 0xb38, nilai panjang pesan dan checksum) pada kecepatan yang saya pilih 1200 bps adalah 0,35 detik.

Semakin banyak, kecepatan transmisi yang dipilih, jangkauan transmisi akan lebih sedikit. Dari pengalaman menggunakan RS-232, diketahui bahwa dengan meningkatnya jangkauan, kecepatan transmisi yang diizinkan menurun secara eksponensial: pada kecepatan 19.200 saluran tanpa selip berjalan selama 15 meter, pada 9600 - 150 meter, dan pada kecepatan 1200 - lebih dari satu kilometer. Akan menarik untuk secara eksperimental mengetahui sifat ketergantungan ini untuk kasus kami, karena banyak di sini tergantung pada matematika yang digunakan.

Menginisialisasi pemancar di VirtualWire terlihat seperti ini:

. . . . .
#include <VirtualWire.h>
. . . . .
void setup() {
  vw_setup(1200); //   VirtualWire
  vw_set_tx_pin(10);   //   VirtualWire D10
. . . . .
}

Kami akan menganalisis prinsip-prinsip pembuatan data menggunakan contoh spesifik. Mari kita memiliki sensor suhu-kelembaban jarak jauh. Ini memberikan nilai (variabel suhu dan kelembaban) dalam bentuk bilangan real dengan tanda (float). Untuk membuatnya lebih mudah untuk dipahami pada sisi penerima, kita semua akan mengurangi menjadi bilangan bulat positif dengan jumlah tempat desimal setidaknya 4, menerjemahkan bit secara individu ke dalam karakter ASCII, mentransfer string yang dihasilkan, dan melakukan operasi terbalik di sisi penerima. Tentu saja, Anda dapat menyederhanakan tugas (misalnya, lakukan tanpa konversi ke ASCII dan mempersingkat angkanya), tetapi dalam formulir ini ternyata seragam untuk hampir semua jenis data digital, yang menyederhanakan pembongkaran selama penerimaan.

Dalam praktiknya, lebih mudah menggunakan tipe String untuk menulis pesan, kira-kira seperti ini:

. . . . .
//    
#define ledPin 13 //  (D13,  19 ATmega) 
char msg[13];
volatile int tmpr=0;
volatile int hum=0;
. . . . .
void loop() {
  delay(1000); // 1 c
float temperature;
float humidity;
. . . . .  //   temperature  humidity  
//       4 :
  tmpr = temperature*10+2731; //2731 =     
//    4 :
  hum = humidity*10+1000; 
//  :
  digitalWrite (ledPin,HIGH); //  โ€”  
  String strMsg="DAH"; // - 
  strMsg+=tmpr; //  
  strMsg+=hum; // 
  strMsg.toCharArray(msg,12); //   , 12 โ€“  
//  :
  vw_send((uint8_t *)msg, strlen(msg)); //  
  vw_wait_tx(); //   
  delay(500); // 500 
  digitalWrite (ledPin, LOW); //  โ€”  
}

Jika Anda perlu mentransfer angka yang lebih akurat dengan jumlah digit yang besar, maka Anda cukup menambah panjang array pesan. Variabel global "volatile" tmpr dan hum diperlukan jika Anda rata-rata beberapa bacaan, jika tidak mereka juga dapat dinyatakan lokal dalam fungsi loop (). Pesannya, seperti yang Anda lihat, terdiri dari nilai suhu dan kelembaban yang dikonversi, dalam string ASCII masing-masing empat byte, didahului oleh serangkaian tiga karakter "DAH" (karakter dapat berupa karakter lain dari tabel ASCII). Ini adalah tanda tangan yang memungkinkan Anda untuk membedakan pesan ini dari yang lainnya yang dikirim oleh perangkat serupa. Jangan abaikan tanda tangan, bahkan jika Anda percaya bahwa perangkat lain di dekatnya dalam kisaran ini tidak diharapkan, pada saat yang sama berfungsi sebagai jaminan tambahan untuk integritas data yang diterima.

Perhatikan juga bahwa ketika mengkonversi string ke array, Anda harus menentukan satu karakter lebih dari total panjang pesan (3 + 4 + 4 = 11), ini memperhitungkan karakter nol yang menutup string. Dan ukuran larik msg [] harus ditentukan dengan margin dan dapat berupa apa saja, dalam hal ini dari 13 hingga 27 byte. Saat mentransfer, itu masih akan dikirim persis seperti fungsi strlen (msg) akan kembali, yaitu, 11 byte + karakter nol.

Di bagian penerima, array kode ASCII yang dihasilkan harus diuraikan. Tetapi pertama-tama Anda harus menerimanya. Untuk menginisialisasi penerimaan, tindakan berikut dilakukan:

#include <VirtualWire.h>
char str[5];     ASCII  
  uint8_t buf [VW_MAX_MESSAGE_LEN];  //    
  uint8_t buflen = VW_MAX_MESSAGE_LEN;  // max   
. . . . .

void setup() {
  vw_set_rx_pin(2); //D2   VirtualWire
  vw_setup(1200); //   VirtualWire
. . . . .
} 

Sebenarnya, teknik dengan menguraikan garis adalah ini:

void loop() {
  vw_rx_start();  //  
  buflen = VW_MAX_MESSAGE_LEN; //    
 if (vw_have_message()) { // 
 if (vw_get_message(buf, &buflen)) //   
  {
    vw_rx_stop(); //   :
        for (byte i=0; i<3; i++)  //    
                str[i]= buf[i]; // 
                str[3]='\0';
      if ((str[0]=='D')&&(str[1]=='A')&&(str[2]=='H')) {
// ,  
       for (byte i=3;i<7;i++)  //    
                str[i-3]= buf[i]; //    
      int tmpr=atoi(str); //   
      tmpr=tmpr-2731; // 2731,     
. . . . .//    10    float,  
. . . . . //    -
// :
      for (byte i=7;i<11;i++)  //    
                str[i-7]= buf[i]; //    
      int hh = atoi(str); //   
      hh=(hh-1000)/10;
      if (hh>99) hh=99; //   %,  
. . . . . // -
   } //end   DAT
  } //end  
 } // 
} // end loop

Saya harap Anda sekarang memiliki lebih sedikit pertanyaan tentang penggunaan perangkat yang murah dan mudah digunakan ini.

All Articles