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:

Diagram memperlihatkan sirkuit yang menyambungkan pin tanah ke pin 21.

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:

Diagram yang menunjukkan pinout header Raspberry Pi GPIO. Gambar oleh Raspberry Pi Foundation.
Gambar oleh Raspberry Pi Foundation.

Membuat aplikasi

Selesaikan langkah-langkah berikut di lingkungan pengembangan pilihan Anda:

  1. Buat Aplikasi Konsol .NET baru menggunakan .NET CLI atau Visual Studio. Beri nama InputTutorial.

    dotnet new console -o InputTutorial
    cd InputTutorial
    
  2. 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-*
    
  3. 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 mengembalikan PinValue.High.
    • Status awal ditulis ke konsol menggunakan ekspresi ternary. Status pin saat ini dibaca dengan Read(). Jika , PinValue.Highia menulis string ke konsol Alert . Jika tidak, ia menulis Ready string.
    • RegisterCallbackForPinValueChangedEvent() mendaftarkan fungsi panggilan balik untuk PinEventTypes.Rising peristiwa dan PinEventTypes.Falling pada pin. Peristiwa ini sesuai dengan status PinValue.High pin dan PinValue.Low, masing-masing.
    • Fungsi panggilan balik menunjuk ke metode yang disebut OnPinEvent(). OnPinEvent()menggunakan ekspresi ternary lain yang juga menulis string atau Ready yang sesuaiAlert.
    • Utas utama tidur tanpa batas waktu sambil menunggu peristiwa pin.
  4. Buat aplikasi. Jika menggunakan .NET CLI, jalankan dotnet build. Untuk membuat di Visual Studio, tekan Ctrl+Shift+B.

  5. 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.

  6. 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 ✅
    
  7. Putuskan sambungan pin 21 dari tanah. Konsol menampilkan teks yang mirip dengan yang berikut ini:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Sambungkan kembali pin 21 dan tanah. Konsol menampilkan teks yang mirip dengan yang berikut ini:

    (05/10/2022 16:00:25) READY ✅
    
  9. 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.

GIF animasi yang menunjukkan pembukaan dan penutupan sakelar reed magnetik. Sakelar diekspos ke magnet, dan aplikasi menampilkan SIAP. Magnet dihapus, dan aplikasi menampilkan ALERT. Tindakan kemudian diulang.

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.

Gambar Modul Sensor Penerima Laser

Menyambungkan perangkat keras tripwire laser

Sambungkan komponen sebagaimana dirinci dalam diagram berikut.

Diagram yang menunjukkan sirkuit yang mendapatkan input dari modul sensor penerima laser.

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!

ANIMASI GIF menunjukkan demonstrasi laser tripwire. Pemancar laser menyalakan modul sensor laser, dan aplikasi menampilkan SIAP. Sinar laser rusak, dan aplikasi menampilkan ALERT. Tindakan kemudian diulang.

Dapatkan kode sumber

Sumber untuk tutorial ini tersedia di GitHub.

Langkah berikutnya