Controlling Raspberry Pi GPIO with .NET using System.Device.Gpio
How ToRaspberry PiTutorials/DIY

Controlling Raspberry Pi GPIO with .NET using System.Device.Gpio

Introduction

Raspberry Pi is a powerful and affordable single-board computer widely used for IoT, automation, and robotics projects. With .NET and the System.Device.Gpio package, you can interact with GPIO (General-Purpose Input/Output) pins programmatically, making it easy to control LEDs, sensors, motors, and other electronic components.

This guide provides a deep dive into using System.Device.Gpio in .NET to control Raspberry Pi’s GPIO pins. We’ll cover installation, setting up a project, writing code, and troubleshooting.

Prerequisites

Before getting started, ensure you have the following:

Hardware Requirements:

  • A Raspberry Pi (recommended: Raspberry Pi 4 or 3)
  • A microSD card with Raspberry Pi OS installed
  • An LED, a resistor (220Ω), and jumper wires
  • A breadboard
  • A push button (for input demonstration)

Software Requirements:

  • .NET SDK installed on Raspberry Pi
  • System.Device.Gpio NuGet package
  • A text editor or IDE (e.g., Visual Studio Code)

Step 1: Install .NET and Set Up Your Project

1.1 Install .NET on Raspberry Pi

If you haven’t installed .NET yet, follow these steps:

wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh
chmod +x dotnet-install.sh
./dotnet-install.sh --channel LTS

Verify the installation:

~/.dotnet/dotnet --version

1.2 Create a New .NET Console Application

dotnet new console -o GpioApp
cd GpioApp

1.3 Install System.Device.Gpio

dotnet add package System.Device.Gpio

This package provides the necessary APIs to interact with GPIO pins.


Step 2: Wiring the Components

2.1 Connect the LED to GPIO

Use the following wiring:

  • GPIO Pin 17Resistor (220Ω)LED Anode (+)
  • LED Cathode (-)GND (Ground)

2.2 Connect a Push Button to GPIO

  • One side of buttonGPIO Pin 18
  • Other sideGround (GND)

Step 3: Writing the Code

3.1 Control an LED with .NET

Create Program.cs and add the following code:

using System;
using System.Device.Gpio;
using System.Threading;

class Program
{
    static void Main()
    {
        int ledPin = 17; // GPIO17
        using GpioController controller = new GpioController();
        controller.OpenPin(ledPin, PinMode.Output);

        Console.WriteLine("Blinking LED. Press Ctrl+C to exit.");
        while (true)
        {
            controller.Write(ledPin, PinValue.High);
            Thread.Sleep(1000);
            controller.Write(ledPin, PinValue.Low);
            Thread.Sleep(1000);
        }
    }
}

Run the application:

dotnet run

This will blink the LED every second.


3.2 Read Input from a Button

Modify Program.cs to read button input:

using System;
using System.Device.Gpio;
using System.Threading;

class Program
{
    static void Main()
    {
        int buttonPin = 18; // GPIO18
        int ledPin = 17; // GPIO17

        using GpioController controller = new GpioController();
        controller.OpenPin(buttonPin, PinMode.InputPullDown);
        controller.OpenPin(ledPin, PinMode.Output);

        Console.WriteLine("Press the button to toggle the LED.");
        bool ledState = false;

        while (true)
        {
            if (controller.Read(buttonPin) == PinValue.High)
            {
                ledState = !ledState;
                controller.Write(ledPin, ledState ? PinValue.High : PinValue.Low);
                Console.WriteLine("Button Pressed! LED " + (ledState ? "ON" : "OFF"));
                Thread.Sleep(500);
            }
        }
    }
}

This program reads the button state and toggles the LED accordingly.


Step 4: Deploying the Application

If developing on another machine, you can transfer the compiled application to the Raspberry Pi:

dotnet publish -r linux-arm -c Release --self-contained true -o publish
scp -r publish pi@raspberrypi:/home/pi/GpioApp

On the Raspberry Pi:

cd GpioApp
./GpioApp

Step 5: Handling Interrupts with Event-Driven Programming

Instead of continuously polling the button state, we can use an event-driven approach:

using System;
using System.Device.Gpio;

class Program
{
    static void Main()
    {
        int buttonPin = 18;
        int ledPin = 17;
        using GpioController controller = new GpioController();
        controller.OpenPin(buttonPin, PinMode.InputPullDown);
        controller.OpenPin(ledPin, PinMode.Output);
        
        controller.RegisterCallbackForPinValueChangedEvent(
            buttonPin, PinEventTypes.Rising, (sender, args) =>
            {
                bool isOn = controller.Read(ledPin) == PinValue.Low;
                controller.Write(ledPin, isOn ? PinValue.High : PinValue.Low);
                Console.WriteLine("Button Pressed! LED " + (isOn ? "ON" : "OFF"));
            });
        
        Console.WriteLine("Press Ctrl+C to exit.");
        while (true) ;
    }
}

This method improves performance by using interrupts instead of a loop.


Step 6: Troubleshooting

6.1 Permission Issues

If you encounter permission errors, add your user to the GPIO group:

sudo usermod -aG gpio $USER

6.2 Verify GPIO Pin Functionality

Check pin modes using:

gpio readall

6.3 Run as Root (if needed)

Some systems require running as root:

sudo dotnet run

Conclusion

With System.Device.Gpio, .NET developers can easily interact with Raspberry Pi’s GPIO pins. This guide covered:

  • Installing .NET and System.Device.Gpio
  • Wiring components and controlling LEDs
  • Reading input from buttons
  • Deploying and running applications
  • Using interrupts for efficiency

Next steps:

  • Try integrating other sensors like temperature or motion sensors.
  • Explore PWM for motor control.
  • Build a real-time monitoring dashboard with .NET IoT.

Have fun coding with .NET on Raspberry Pi! 🚀

Harshvardhan Mishra

Hi, I'm Harshvardhan Mishra. Tech enthusiast and IT professional with a B.Tech in IT, PG Diploma in IoT from CDAC, and 6 years of industry experience. Founder of HVM Smart Solutions, blending technology for real-world solutions. As a passionate technical author, I simplify complex concepts for diverse audiences. Let's connect and explore the tech world together! If you want to help support me on my journey, consider sharing my articles, or Buy me a Coffee! Thank you for reading my blog! Happy learning! Linkedin

Leave a Reply

Your email address will not be published. Required fields are marked *