Menggunakan GPIO untuk input biner
Pin I/O tujuan umum (GPIO) dapat dikonfigurasi untuk menerima sinyal listrik sebagai input. Pada tingkat yang paling mendasar, ini berguna untuk skenario yang mendeteksi pembukaan/penutupan sirkuit. Sirkuit tersebut mungkin mencakup tombol tekan, sakelar pengalih, sakelar reed, sakelar tekanan, dan perangkat lain yang mewakili nilai biner (on/off) 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 (SBC) berbasis ARM (ARMv7 atau lebih besar)
- Kabel jumper
- Papan roti (opsional)
- Papan breakout Raspberry Pi GPIO (opsional)
- .NET SDK 7 atau yang lebih baru
Catatan
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 Server SSH 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.
Tip
Diagram ini menggambarkan breadboard dan GPIO breakout untuk tujuan ilustrasi, tetapi jangan ragu untuk hanya menghubungkan pin tanah dan pin 21 dengan kawat jumper di Raspberry Pi.
Lihat diagram pinout berikut sesuai kebutuhan:
Gambar oleh 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 2.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 dibuang dan sumber daya perangkat keras dirilis 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 terlibat. 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 terlibat. Dalam mode ini, ketika pin terhubung ke tanah, pin akan mengembalikan
- Status awal ditulis ke konsol menggunakan ekspresi ternary. Status pin saat ini dibaca dengan
Read()
. Jika ,PinValue.High
ia menulis string ke konsolAlert
. Jika tidak, ia menulisReady
string. -
RegisterCallbackForPinValueChangedEvent()
mendaftarkan fungsi panggilan balik untukPinEventTypes.Rising
peristiwa 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 string atauReady
yang sesuaiAlert
. - Utas utama tidur tanpa batas waktu sambil menunggu peristiwa 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 yang dapat dieksekusi menggunakan
chmod +x
.Jalankan aplikasi pada Raspberry Pi dengan beralih ke direktori penyebaran dan menjalankan 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 reed 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 dua arah. Membangun tripwire laser memerlukan komponen tambahan berikut:
- Modul pemancar laser KY-008
- Modul sensor penerima laser (lihat catatan di bawah)
- 2 10K Ω resistor
Catatan
Modul sensor penerima laser adalah nama umum yang diterapkan pada modul umum yang ditemukan di banyak peritel internet. Perangkat dapat bervariasi dalam nama atau produsen, tetapi harus menyerupai gambar ini.
Menyambungkan perangkat keras tripwire laser
Sambungkan komponen sebagaimana dirinci dalam diagram berikut.
Perhatikan dengan baik resistor 10K Ω. Ini menerapkan 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. Sebaliknya, kita ingin pin bertindak sebagai sink untuk saat ini 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 bekerja tanpanya, tetapi menggunakan mode input yang salah berisiko merusak Raspberry Pi Anda!
Dapatkan kode sumber
Sumber untuk tutorial ini tersedia di GitHub.