Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pin I/O tujuan umum (GPIO) dapat dikonfigurasi untuk menerima sinyal listrik sebagai input. Pada tingkat yang paling dasar, ini berguna untuk skenario yang mendeteksi pembukaan/penutupan sirkuit. Sirkuit tersebut mungkin mencakup tombol tekan, sakelar pengalih, sakelar alang-alang, sakelar tekanan, dan perangkat lain yang mewakili nilai biner (hidup/mati) dengan menyelesaikan sirkuit.
Dalam tutorial ini, Anda akan menggunakan .NET dan pin GPIO Raspberry Pi Anda untuk mendeteksi pembukaan dan penutupan sirkuit.
Prasyarat
- Komputer papan tunggal berbasis ARM (ARMv7 atau lebih besar) (SBC)
- Kabel penghubung
- Papan roti (opsional)
- Papan antarmuka GPIO Raspberry Pi (opsional)
- .NET SDK 8 atau yang lebih baru
Nota
Tutorial ini ditulis dengan asumsi perangkat target adalah Raspberry Pi. Namun, tutorial ini dapat digunakan untuk SBC berbasis Linux apa pun yang mendukung .NET, seperti Orange Pi, ODROID, dan banyak lagi.
Pastikan SSH diaktifkan di perangkat Anda. Untuk Raspberry Pi, lihat Menyiapkan SSH Server dalam dokumentasi Raspberry Pi.
Menyiapkan perangkat keras
Gunakan komponen perangkat keras untuk membangun sirkuit seperti yang digambarkan dalam diagram berikut:
Gambar di atas menggambarkan koneksi langsung antara pin tanah dan pin 21.
Petunjuk / Saran
Diagram ini menggambarkan breadboard dan pemecah GPIO untuk tujuan ilustrasi, tetapi jangan ragu untuk hanya menghubungkan pin ground dan pin 21 dengan kawat jumper di Raspberry Pi.
Silakan lihat diagram pinout berikut jika diperlukan.
Gambar atas izin Raspberry Pi Foundation.
Membuat aplikasi
Selesaikan langkah-langkah berikut di lingkungan pengembangan pilihan Anda:
Buat Aplikasi Konsol .NET baru menggunakan .NET CLI atau Visual Studio. Beri nama InputTutorial.
dotnet new console -o InputTutorial cd InputTutorial
Tambahkan paket System.Device.Gpio ke proyek. Gunakan .NET CLI dari direktori proyek atau Visual Studio.
dotnet add package System.Device.Gpio --version 3.2.0-*
Ganti konten Program.cs dengan kode berikut:
using System.Device.Gpio; using System.Threading.Tasks; const int Pin = 21; const string Alert = "ALERT 🚨"; const string Ready = "READY ✅"; using var controller = new GpioController(); controller.OpenPin(Pin, PinMode.InputPullUp); Console.WriteLine( $"Initial status ({DateTime.Now}): {(controller.Read(Pin) == PinValue.High ? Alert : Ready)}"); controller.RegisterCallbackForPinValueChangedEvent( Pin, PinEventTypes.Falling | PinEventTypes.Rising, OnPinEvent); await Task.Delay(Timeout.Infinite); static void OnPinEvent(object sender, PinValueChangedEventArgs args) { Console.WriteLine( $"({DateTime.Now}) {(args.ChangeType is PinEventTypes.Rising ? Alert : Ready)}"); }
Dalam kode sebelumnya:
-
Deklarasi menggunakan membuat instans
GpioController
.using
Deklarasi memastikan objek dilepaskan dan sumber daya perangkat keras dibebaskan dengan benar.-
GpioController
dibuat tanpa parameter, menunjukkan bahwa ia harus mendeteksi platform perangkat keras mana yang dijalankannya dan menggunakan skema penomoran pin logis.
-
- Pin GPIO 21 dibuka dengan
PinMode.InputPullUp
.- Ini membuka pin dengan resistor PullUp yang terhubung. Dalam mode ini, ketika pin terhubung ke tanah, pin akan mengembalikan
PinValue.Low
. Ketika pin terputus dari tanah dan sirkuit terbuka, pin mengembalikanPinValue.High
.
- Ini membuka pin dengan resistor PullUp yang terhubung. Dalam mode ini, ketika pin terhubung ke tanah, pin akan mengembalikan
- Status awal ditulis ke konsol menggunakan ekspresi terner. Status pin saat ini dibaca dengan
Read()
. JikaPinValue.High
tersedia, maka ia menulis stringAlert
ke konsol. Jika tidak, akan menulis stringReady
. -
RegisterCallbackForPinValueChangedEvent()
mendaftarkan fungsi panggilan balik untuk kedua peristiwaPinEventTypes.Rising
danPinEventTypes.Falling
pada pin. Peristiwa ini sesuai dengan statusPinValue.High
pin danPinValue.Low
, masing-masing. - Fungsi panggilan balik menunjuk ke metode yang disebut
OnPinEvent()
.OnPinEvent()
menggunakan ekspresi ternary lain yang juga menulis stringAlert
atauReady
yang sesuai. - Utas utama tidur tanpa batas waktu sambil menunggu peristiwa terkait pin.
-
Deklarasi menggunakan membuat instans
Buat aplikasi. Jika menggunakan .NET CLI, jalankan
dotnet build
. Untuk membuat di Visual Studio, tekan Ctrl+Shift+B.Sebarkan aplikasi ke SBC sebagai aplikasi mandiri. Untuk petunjuknya, lihat Menyebarkan aplikasi .NET ke Raspberry Pi. Pastikan untuk memberikan izin eksekusi menggunakan
chmod +x
.Jalankan aplikasi pada Raspberry Pi dengan beralih ke direktori penyebaran dan jalankan executable.
./InputTutorial
Konsol menampilkan teks yang mirip dengan yang berikut ini:
Initial status (05/10/2022 15:59:25): READY ✅
Putuskan sambungan pin 21 dari tanah. Konsol menampilkan teks yang mirip dengan yang berikut ini:
(05/10/2022 15:59:59) ALERT 🚨
Sambungkan kembali pin 21 dan tanah. Konsol menampilkan teks yang mirip dengan yang berikut ini:
(05/10/2022 16:00:25) READY ✅
Hentikan program dengan menekan Ctrl+C.
Selamat! Anda telah menggunakan GPIO untuk mendeteksi input menggunakan System.Device.Gpio
paket NuGet! Ada banyak kegunaan untuk jenis input ini. Contoh ini dapat digunakan dengan skenario apa pun di mana sakelar tersambung atau merusak sirkuit. Berikut adalah contoh menggunakannya dengan sakelar alang-alang magnetik, yang sering digunakan untuk mendeteksi pintu atau jendela yang terbuka.
Laser tripwire
Memperluas konsep contoh sebelumnya sedikit lebih jauh, mari kita lihat bagaimana ini dapat diterapkan untuk membuat laser tripwire. Membangun tripwire laser memerlukan komponen tambahan berikut:
- Modul pemancar laser KY-008
- Modul sensor penerima laser (lihat catatan di bawah)
- 2 resistor 10K Ω
Nota
Modul sensor penerima laser adalah nama generik yang diterapkan ke modul umum yang ditemukan di banyak pengecer internet. Perangkat dapat bervariasi dalam nama atau produsen, tetapi harus menyerupai gambar ini.
Gambar Modul Sensor Penerima Laser
Menyambungkan perangkat keras tripwire laser
Sambungkan komponen sebagaimana dirinci dalam diagram berikut.
Perhatikan baik-baik resistor 10K Ω. Ini mengimplementasikan pembagi tegangan. Ini karena modul penerima laser menghasilkan 5V untuk menunjukkan balok rusak. Raspberry Pi hanya mendukung hingga 3,3V untuk input GPIO. Karena mengirim 5V penuh ke pin dapat merusak Raspberry Pi, arus dari modul penerima diteruskan melalui pembagi tegangan untuk menghentikan tegangan menjadi 2,5V.
Menerapkan pembaruan kode sumber
Anda hampir dapat menggunakan kode yang sama seperti sebelumnya, dengan satu pengecualian. Dalam contoh lain, kami menggunakan PinMode.InputPullUp
sehingga ketika pin terputus dari tanah dan sirkuit terbuka, pin mengembalikan PinValue.High
.
Namun, dalam kasus modul penerima laser, kami tidak mendeteksi sirkuit terbuka. Sebagai gantinya, kami ingin pin berfungsi sebagai pemuat untuk arus yang berasal dari modul penerima laser. Dalam hal ini, kita akan membuka pin dengan PinMode.InputPullDown
. Dengan cara ini, pin kembali PinValue.Low
ketika tidak mendapatkan arus, dan PinValue.High
ketika menerima arus dari modul penerima laser.
controller.OpenPin(pin, PinMode.InputPullDown);
Penting
Pastikan kode yang disebarkan pada Raspberry Pi Anda menyertakan perubahan ini sebelum menguji tripwire laser. Program ini memang berfungsi tanpanya, tetapi menggunakan mode input yang salah berisiko merusak Raspberry Pi Anda!
Dapatkan kode sumber
Sumber untuk tutorial ini tersedia di GitHub.