Bagikan melalui


Menggunakan GPIO untuk input biner

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:

Diagram memperlihatkan sirkuit yang menyambungkan pin tanah ke pin 21.

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.

Diagram yang menampilkan pinout header GPIO pada Raspberry Pi. Gambar milik Raspberry Pi Foundation.
Gambar atas izin 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 3.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 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 mengembalikan PinValue.High.
    • Status awal ditulis ke konsol menggunakan ekspresi terner. Status pin saat ini dibaca dengan Read(). Jika PinValue.High tersedia, maka ia menulis string Alert ke konsol. Jika tidak, akan menulis string Ready.
    • RegisterCallbackForPinValueChangedEvent() mendaftarkan fungsi panggilan balik untuk kedua peristiwa PinEventTypes.Rising 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 Alert atau Ready yang sesuai.
    • Utas utama tidur tanpa batas waktu sambil menunggu peristiwa terkait 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 menggunakan chmod +x.

  6. 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 ✅
    
  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 alang-alang 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 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.

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

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!

GIF animasi 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 selanjutnya