"Seperti apel mata ..." atau buat sistem keamanan sederhana berdasarkan mikrokontroler (Canny atau Arduino) dan Raspberry PI

Selama persiapan artikel tentang pengakuan mikrokontroler menggunakan TensorFlow dan OpenCV, Craftduino, Canny 3 tiny dan Raspberry PI menarik perhatian saya pada saat yang sama, setelah itu saya memutuskan akan bagus untuk menggabungkannya lagi dalam satu artikel. Saya berpikir lama tentang apa yang harus ditulis, dan kemudian saya malu mengakui, saya ingat bahwa saya adalah seorang paman yang sehat, dan saya belum pernah menghubungkan apa pun melalui UART. “Segala sesuatu perlu dicoba dalam hidup,” pikir saya. Tetapi menulis hanya tentang menghubungkan ke UART itu membosankan, jadi segala macam "mainan" segera dipesan, di antaranya adalah Arduino baru, dan beberapa sensor.

Jadi, hari ini kita akan membuat sistem keamanan untuk pena favorit saya. Apakah Anda terkejut mengapa pena? Rahasianya sederhana, saya sangat tidak berpengalaman dalam semua jenis masalah elektronik, dan karena itu, ketika saya memesan sensor tekanan, saya pikir itu akan bekerja di seluruh area, tetapi ternyata itu hanya berfungsi untuk area kontak tertentu. Anehnya, tetapi di seluruh rumah tidak ada yang cukup berbobot, stabil dan ukurannya cocok, kecuali pena ini. Ya, kecuali jari saya, tetapi saya belum siap untuk bereksperimen dengannya .

Dalam artikel ini, saya akan membagikan pengalaman saya menghubungkan sensor tekanan dan sensor gerak Doppler ke mikrokontroler. Kami akan menghubungkan pengontrol melalui antarmuka UART kabel ke GPIO Raspberry PI 3. Kemudian kami akan menulis program sederhana untuk Python untuk menampilkan status sistem keamanan, dan pada akhirnya kami akan menghubungkan smartphone ke raspberry menggunakan VNC untuk memantau sistem keamanan pada jarak dari komputer.

Ingin meninggalkan Indiana Jones dari pekerjaan? Maka Anda dipersilakan di bawah kucing.



Seperti biasa, pada awalnya, saya akan menjelaskan bahwa saya sendiri baru mengenal masalah elektronik DIY dan secara perlahan belajar dari artikel ke artikel. Karena itu, jangan anggap apa yang akan saya tulis sebagai kebenaran tertinggi. Tentunya semuanya bisa dilakukan dengan lebih baik.

Inilah yang akan kita bicarakan hari ini:

Bagian I: Pendahuluan
Bagian II: Menghubungkan sirkuit dan program untuk Canny 3 mungil
Bagian III: Menghubungkan sirkuit dan program untuk Arduino Uno
Bagian IV: Raspberry PI dan program pemantauan dengan Python
Bagian V: Kesimpulan

Bagian I: Pendahuluan


Pembaca yang penuh perhatian mungkin bertanya, "Mengapa Anda membeli Arduino jika Anda menyebutkan CraftDuino sebelumnya?", Semuanya sangat biasa. CraftDuino pecah lagi. SekaliDrzugrikSaya memperbaikinya, dan sekarang "isolasi diri", dan saya tidak ingin mengganggu seseorang dengan sia-sia.

Jadi, kami mendekati basis material dengan lancar. Untuk artikel ini, saya menggunakan:

  1. Resistor tekanan FSR402:


  2. Sensor gerak Doppler RCWL-0516:


    Di toko tempat saya membeli kedua sensor dalam deskripsi di situs itu tertulis bahwa itu untuk Arduino, tetapi dalam praktiknya ternyata tidak ada perpustakaan khusus yang diperlukan dan semuanya dimulai tanpa masalah pada Canny.
  3. Mikrokontroler Arduino Uno:


  4. Canny 3 Tiny mikrokontroler - versi dengan blok terminal dan kabel harness:


  5. Raspberry PI 3 Model B Papan Tunggal Komputer:

  6. Lainnya: papan tempat memotong roti papan tulis, kabel dan klip buaya, adaptor daya Raspberry

Mari kita mulai bisnis.

Bagian II: Menghubungkan sirkuit dan program untuk Canny 3 mungil


Ada banyak contoh di internet bagaimana menghubungkan Arduino melalui UART, ada banyak contoh yang lebih sedikit tentang Canny, jadi mari kita mulai dengan itu.
Agar tidak mengembang panjang artikel dan tidak mengulangi diri saya sendiri, saya mengingatkan Anda bahwa saya mempertimbangkan masalah paling mendasar tentang cara bekerja dengan Canny dan lingkungan pengembangan CannyLab dalam artikel ini , dan contoh menghubungkan sensor ke konverter analog-ke-digital (ADC) dan mengirimkan pesan melalui Virtual COM port, saya buat di artikel ini .

Bagi yang belum membaca ini, tetapi segera coba sambungkan sensor ke ADC, ada poin penting. Jangan ulangi kesalahan saya, agar output controller No. 5 dan No. 6 berfungsi dalam mode ADC, jumper harus diatur, seperti pada gambar di bawah ini. Itu tidak sulit, bahkan saya melakukannya.


Dan poin penting lainnya pada output pengontrol adalah tegangan suplai, yaitu, jika Anda terhubung dari catu daya eksternal dan bukan USB, pastikan tegangan output tidak melebihi tegangan yang diijinkan untuk sensor dan UART.

Untuk artikel ini, satu pelompat sudah cukup bagi kita, tetapi jika kita punya besi solder, mengapa kita harus membuang waktu untuk hal-hal sepele?

Perhatikan blok terminal, kabel harness asli datang standar untuk versi pengontrol ini, itu sulit dan mungkin nyaman jika digunakan di dalam mobil, tetapi tidak untuk eksperimen di meja. Saya datang dengan pengetahuan, menggantikan harness asli dengan harness yang sering dibundel dengan peralatan komputer, baik, atau dijual di toko-toko yang menjual elektronik DIY dan ternyata sangat nyaman. Mereka tidak duduk dengan buruk di blok, lunak dan pada saat yang sama memberikan perpanjangan tambahan.

Mari kita beralih ke diagram koneksi:


Semuanya cukup sederhana dan tidak memerlukan keahlian khusus, saya pikir hampir semua orang bisa mengatasinya.

Pertama, mari kita berurusan dengan kekuatan dewan. Kami akan mengambil "ground" dari "-" output controller, tetapi dengan plus, semuanya tidak begitu jelas. Pada pandangan pertama, tampaknya logis untuk terhubung ke terminal "+", tetapi dalam praktiknya tampaknya terminal untuk +5V INPUT. Oleh karena itu, alih-alih, kita akan mengonfigurasi salah satu output sebagai output + 5V, memasok unit logis untuk itu dan menariknya ke "plus". Saya memutuskan untuk mengambil nomor keluar 3.

Sensor tekanan terhubung dengan sangat sederhana. Sebenarnya, ini adalah sebuah resistor. Kami membawa daya ke salah satu "kakinya", dan dari "kaki" kedua kami melilitkan kabel ke input pengontrol yang terhubung ke ADC (baik No. 5 atau No. 6). Saya memilih No. 6.

Omong-omong, saya kehilangan sensor tekanan dua kali. Kesalahan kedua saya adalah menghubungkan sensor. Itu tidak masuk ke papan tempat memotong roti, ternyata harus terhubung ke blok terminal sekrup atau yang serupa. Saya harus keluar dengan "buaya".

Sensor gerak tidak terhubung jauh lebih rumit, kami menempatkan + 5V dari papan ke jack Vin, menghubungkannya ke jack GND di papan tempat memotong roti, dan menghubungkan jack OUT ke input digital controller, saya menghubungkannya ke output No. 5 (kami kami tidak akan mengubahnya ke mode ADC).

Masih menghubungkan controller ke "Raspberry" melalui UART. Untuk melakukan ini, output pengontrol No. 2, yang dalam mode UART kami menjadi output "TX", harus terhubung ke input Raspberry GPIO RX, dan ground di papan dan Raspberry PI GPIO GND juga harus terhubung.

Banyak orang menyarankan mengoordinasikan level tegangan ke 3.3 V, dan saya bahkan mencoba menghubungkan Canny melalui pembagi tegangan, tetapi bekerja lebih buruk dengan itu daripada tanpa itu (atau tidak berfungsi sama sekali), jadi dalam hal ini saya terhubung langsung ke Raspberry UART. Tampaknya tidak ada yang terbakar. Semuanya berfungsi.


Mungkin Anda pernah berpikir: "Mengapa terhubung" dengan kabel ke UART, jika memungkinkan melalui Bluetooth? " Memang, ada banyak contoh menghubungkan Arduino melalui UART ke modul HC-06 di jaringan. Jika Anda percaya forum , maka Canny juga terhubung tanpa masalah. Tapi saya belum mencobanya sendiri. Saya ingin terhubung menggunakan kabel, dan saya memutuskan untuk menunda koneksi Bluetooth sampai waktu berikutnya.

Seperti apa rangkaiannya:


Mari kita beralih ke program untuk controller (diagram):


Dalam blok "Pengaturan Parameter" , kita menyalakan mode ADC untuk saluran (input) No. 6, mentransfer saluran No. 3 untuk memisahkan mode keluaran dan memasukkan dalam unit logis (+ 5V dalam kasus kami), hampir semuanya dianalisis dalam artikel ini .

Hanya pengaturan UART yang asing bagi kami. Untungnya, semuanya sederhana. Canny 3 tiny hanya memiliki 1 antarmuka UART (misalnya, Canny 7 memiliki dua antarmuka). Ketika mode UART diaktifkan, output No. 1 menjadi RX, output No. 2 TX. Kami akan memilih baud rate 9600 yang biasa, tetapi mode transfer data terbatas. Jumlah bit data yang tersedia hanya 8 byte dan 1 stop bit (untuk model controller "lama" ada lebih banyak pilihan). Untuk mengaktifkan UART, perlu memasukkan register konfigurasi UART1 dalam register yang sesuai tulis konstanta yang telah ditentukan:


Bahkan, dalam kasus kami adalah mungkin untuk memilih konstanta yang hanya menyertakan mode transmisi UART, karena kami tidak berencana untuk mengambil apa pun kembali. Tetapi saya memutuskan untuk menunjukkan contoh yang lebih umum.

Jika Anda memilih pengontrol yang benar saat membuat diagram, maka CannyLab tidak akan mengizinkan Anda untuk memilih konstanta yang tidak cocok untuknya. Karenanya, memilih mode yang sengaja berbahaya tidak akan berhasil. Kebenaran selalu merupakan kesempatan untuk memasukkan konstanta secara manual, tetapi lebih baik tidak melakukan ini.

Kami akan mengirim 10 karakter dalam pesan (termasuk 2 masalah), jadi kami akan menulis konstanta sama dengan 10 di register pesan.

Saya tidak yakin tentang 1 TX lift ke satu, tapi kalau-kalau saya mengaktifkan item ini, seperti yang saya mengerti, saya membutuhkannya Jangan kencangkan dengan resistor.

Di blok“Pengiriman berkala melalui UART dan VCP”
Kami menggunakan generator PWM untuk mengirim 1 kali dalam 2 detik sehingga pengontrol tidak menyumbat saluran selama sedetik dengan terus-menerus mengirim pesan, kami menggunakan “Trailing Edge Detector”. Yang akan bekerja hanya sekali pada saat peralihan dari satu ke nol, jika pengontrol siap pada saat itu untuk mengirim pesan melalui UART, maka dua unit akan datang ke input dari blok perkalian logis, masing-masing, juga “1”, yang akan memerintahkan pengontrol untuk mengirim pesan melalui UART , dan juga berjaga-jaga untuk debugging di port USB-COM (saya menulis tentang ini secara rinci dalam artikel sebelumnya ).

Di blok "Tampilan"semuanya cukup sederhana, jika nilai-nilai dari sensor tekanan kurang dari ambang tertentu dan pada saat yang sama sensor gerak telah dipicu (itu akan memberikan "1" ke output), maka kita akan menyalakan LED hijau controller sebagai sinyal alarm.

Akan keren jika sistem bekerja seperti dalam film:



Tapi kita akan membatasi diri untuk menyalakan LED.

Berikut ini adalah demonstrasi visual:


Ada blok terakhir "Formasi Pesan" yang tersisa .

Kami menerima data dari ADC, resolusi ADC adalah 0 hingga 1023. Kami mengirim karakter ke UART, yang berarti pembacaan dari sensor tekanan harus dikonversi ke string. Karena jumlah maksimumnya adalah 1023 (4 digit), maka kita memerlukan 4 byte. "Number to String Converter" menampilkan beberapa karakter pada output, kami akan memiliki 2 pasang karakter, masing-masing akan kami kirim pesan UART dan VCP ke register instalasi. Selanjutnya, kita perlu menulis pemisah agar bacaan tidak bergabung, karena CannyLab menggunakan beberapa karakter, maka kita mengambil dua karakter "spasi" sebagai pemisah. Demikian pula, kami mengonversi pembacaan sensor gerak, itu memberikan diskrit baik 00 atau 01, yang berarti kita hanya perlu satu pasang karakter. Di akhir pesan, tulis carriage return dan karakter baris baru.

Seperti yang sudah saya tulis dalam artikel tentang photoresistor, Canny tidak memiliki monitor port COM sendiri, tetapi Anda dapat menggunakan salah satu pihak ketiga, dan karena kita akan menggunakan IDE Arduino sedikit kemudian, kita akan menggunakan monitor port COM bawaan.

Jadi, saya meletakkan jari di sensor tekanan dan bergerak di sepanjang jalan:



Diagram, seperti seluruh kode di bawah ini, dapat diunduh dari GitHub .

Sekarang mari kita beralih ke Arduino.


Bagian III: Diagram Kabel dan Program untuk Arduino Uno


Saya tidak akan berbicara tentang Arduino dengan detail seperti itu, karena semuanya cukup sepele.

Diagram pengkabelan:



Catatan! Karena keluaran Arduino RX / TX beroperasi pada tegangan 5 V, dan Raspberry PI memiliki 3,3 V, orang menyarankan untuk menghubungkan Arduino ke Raspberry UART menggunakan modul khusus atau setidaknya menggunakan pembagi tegangan. Saya tidak punya modul khusus, tetapi pembagi tegangan selalu diterima. Saya mengambil 3 resistor dengan nilai nominal 1000 ohm. Dan dia membuat tap setelah resistor kedua, di mana 2/3 dari tegangan akan turun. Jika Anda mematikan daya melalui USB ke 5 V, maka ternyata saja 5*0.66=3.3 .

Meskipun saya juga menghubungkan Arduino langsung ke UART Raspberry PI dan semuanya tampak berfungsi.

Kami menghubungkan sensor tekanan ke "+" dan ke input analog "A1". Sensor gerak untuk daya dan input digital No. 5.

Beginilah tampilan sirkuit saat dirakit:



Berikut ini adalah kode sketsa untuk Ardino: Kode sederhana, satu-satunya hal yang layak dijelaskan adalah variabel "penyesuaian". Faktanya adalah bahwa ketika terhubung ke Arduino, sensor tekanan kadang-kadang menunjukkan nilai bukan nol bahkan tanpa beban, dan saya tidak memikirkan yang lebih baik daripada mengurangi nilai rata-rata "noise" untuk menyatukan pembacaan dengan Canny. Juga, seperti pada kasus sebelumnya, kami mengimplementasikan layar dengan LED bawaan, jika sensor bekerja:

byte photoPin = A0;

void setup() {
Serial.begin(9600);
pinMode(photoPin, INPUT);
pinMode(5, INPUT);
pinMode(13, OUTPUT);
}

void loop() {
int adjustment = 250;
int pressure_sensor = analogRead(A1) - adjustment;
int motion_sensor = digitalRead(5);

Serial.print(pressure_sensor);
Serial.print(" ");
Serial.println(motion_sensor);
if ((pressure_sensor<380) && (motion_sensor==1))
{
digitalWrite(LED_BUILTIN, HIGH);
}
else {
digitalWrite(LED_BUILTIN, LOW);
}
delay(1000);
}









Bagian IV: Raspberry PI dan program pemantauan dengan Python


Pertama, Anda perlu mengaktifkan UART, serta SSH dan VNC, kemudian sambungkan ke Raspberry menggunakan smartphone.

Buka pengaturan Raspberry PI dan aktifkan SSH, VNC, UART, seperti pada gambar:



Untuk jaga-jaga, saya mematikan Bluetooth.

Kami akan menulis program Python sederhana, saya menggunakan IDE bawaan dan tidak menginstal modul Python tambahan. Saya memiliki Raspbian dengan gambar desktop, berukuran sedang, yang membutuhkan sekitar 1,1 GB.

Dalam program pemantauan kami, kami akan menggunakan konsol dan antarmuka grafis untuk menampilkan informasi. Untuk mengimplementasikan GUI, saya memutuskan untuk menggunakan Tkinter. Saya benar-benar menggunakannya untuk kedua kalinya dalam hidup saya, tetapi saya hanya membutuhkan beberapa bidang teks dan kotak dialog.

Ini kode programnya:

import serial
import time
from tkinter import *
from tkinter import ttk
from tkinter import messagebox

serialport = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1.0) 

window = Tk()  
window.title("Security system for my pen")  
window.geometry('400x170')
#Presure sensor label
lbl_ps = ttk.Label(window, text="Pressure sensor", font=("Arial Bold", 20))
lbl_ps.grid(column=0, row=0)
lbl_ps_status = ttk.Label(window, text=" ",  font=("Arial Bold", 20))
lbl_ps_status.grid(column=1, row=0)
#Motion sensor label
lbl_ms = ttk.Label(window, text="Motion sensor", font=("Arial Bold", 20))
lbl_ms.grid(column=0, row=1)
lbl_ms_status = ttk.Label(window, text=" ", font=("Arial Bold", 20))
lbl_ms_status.grid(column=1, row=1)

while True:
   counter = 0
   rcv = serialport.readline().decode('utf-8').replace("\r\n","").split('  ')
   if (len(rcv)==2):
       ps=rcv[0]
       ms=rcv[1]
       print (ps+ " " +ms)
       if (int(ps)<380):
           lbl_ps_status.config(text = " Warning!")
           counter += 1
       else:
           lbl_ps_status.config(text = " Ok")

       if (int(ms)>0):
           lbl_ms_status['text']=" Warning!"
           counter += 1
       else:
           lbl_ms_status['text']=" Ok"  
       window.update_idletasks()  
       window.update()
       if (counter == 2):
            messagebox.showinfo("Alarm!", "heck your pen!")     
       time.sleep(1)


Saya mungkin akan melewatkan impor perpustakaan.

Setelah impor, kami mengatur pengaturan untuk UART, port itu sendiri, kecepatan dan batas waktu.

serialport = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1.0) 


Selanjutnya, kita menempatkan bidang teks (Label) pada tata letak tabel (pada kisi)
Kita akan memiliki 4 bidang yang 2 tidak berubah, dan status sensor akan ditampilkan dalam dua lainnya.

window.title("Security system for my pen")  
window.geometry('400x170')
#Presure sensor label
lbl_ps = ttk.Label(window, text="Pressure sensor", font=("Arial Bold", 20))
lbl_ps.grid(column=0, row=0)
lbl_ps_status = ttk.Label(window, text=" ",  font=("Arial Bold", 20))
lbl_ps_status.grid(column=1, row=0)
#Motion sensor label
lbl_ms = ttk.Label(window, text="Motion sensor", font=("Arial Bold", 20))
lbl_ms.grid(column=0, row=1)
lbl_ms_status = ttk.Label(window, text=" ", font=("Arial Bold", 20))
lbl_ms_status.grid(column=1, row=1)


Selanjutnya, buat loop tanpa akhir.
Di awal siklus, kami akan mengatur ulang label alarm counter .
Kemudian baca data dari port serial.
Agar tidak melihat semua entri seperti "\ x00", kami menyandikan ulang pesan ke UTF-8.
Lalu kami menghapus awal dan akhir garis sehingga hanya angka yang tersisa.
Selanjutnya, kita membagi garis, memperhatikan pemisah 2 spasi, bukan 1.
Agar program tidak macet ketika pesan salah, kode selanjutnya yang terkait dengan menerima pesan dijejalkan ke struktur bersyarat yang hanya akan berfungsi jika pesan dapat dibagi menjadi 2 bagian.
Nah, tampilkan sensor tekanan dan sensor gerak di konsol.

while True:
   counter = 0
   rcv = serialport.readline().decode('utf-8').replace("\r\n","").split('  ')
   if (len(rcv)==2):
       ps=rcv[0]
       ms=rcv[1]
       print (ps+ " " +ms)


Kami memeriksa sensor bekerja, jika semuanya baik-baik saja, sistem menulis "OK", jika salah satu sensor bekerja, penghitung meningkat sebesar 1 dan peringatan dikeluarkan.


       if (int(ps)<380):
           lbl_ps_status.config(text = " Warning!")
           counter += 1
       else:
           lbl_ps_status.config(text = " Ok")

       if (int(ms)>0):
           lbl_ms_status['text']=" Warning!"
           counter += 1
       else:
           lbl_ms_status['text']=" Ok"  


Di blok terakhir, kami memperbarui elemen bentuk Tkinter, setelah itu kami memeriksa berapa banyak sensor yang bekerja. Jika kedua sensor telah bekerja dalam siklus, jendela modal muncul dengan pesan alarm.


       window.update_idletasks()  
       window.update()
       if (counter == 2):
            messagebox.showinfo("Alarm!", "heck your pen!")     
       time.sleep(1)


Penting untuk dicatat di sini bahwa sensor gerak menjaga output "1" selama dua detik sejak gerakan terdeteksi. Jadi, sebagai suatu peraturan, sistem berhasil bekerja.

Di bawah ini adalah tangkapan layar yang menunjukkan pengoperasian program:

Semua sensor tenang:



Satu dari dua hal berhasil:



Keduanya bekerja, sistem menunggu operator untuk mengakui:



Tampaknya semuanya seperti yang direncanakan.


Kesimpulan


Sebagai kesimpulan, pertimbangkan menghubungkan ke Raspberry PI dari smartphone. Pada prinsipnya, tidak ada yang rumit, jika Anda dapat terhubung dari komputer, maka Anda dapat dari telepon. Yang perlu Anda ketahui adalah Raspberry IP, nama pengguna, dan kata sandi. Saya memasang VNC Viewer di ponsel pintar Android saya, tetapi Anda pasti dapat memiliki klien lain.

Ini tidak terlalu nyaman untuk digunakan, tetapi berfungsi:


Biarkan saya mengingatkan Anda sekali lagi bahwa semua kode dapat diunduh dari GitHub .

Setiap kali saya berjanji pada diri sendiri bahwa saya tidak akan menulis artikel yang panjang, tetapi di sini sekali lagi rancangannya telah melebihi 10 halaman yang dicetak. Artikel ini menunjukkan contoh yang mudah diimplementasikan dari sistem keamanan buatan rumah, ruang lingkup untuk imajinasi sangat besar.

Jika saya mengerti bahwa artikel itu menarik bagi Anda, maka saya akan menguraikan satu lagi nanti tentang menghubungkan melalui adaptor Bluetooth.

UPD:
Tampaknya saya mendapat serangkaian artikel kecil, jadi untuk kenyamanan Anda, saya akan meninggalkan tautan ke artikel terkait lainnya:


  1. "Satu, dua, tiga - bakar pohon Natal!" atau tampilan pertama saya di controller CANNY 3 mungil .
  2. "Tujuan memiliki banyak samaran ..." atau kami mengotomatiskan kontrol autolamp menggunakan CANNY 3 mungil dan photoresistor .
  3. "Marina apa?" atau kami mengontrol pengontrol via bluetooth menggunakan aplikasi seluler di Xamarin (Android) .

All Articles