c# Raspberry-GPIO
from https://github.com/AlexSartori/Raspberry-GPIO-Manager/blob/master/GpioPin.cs
from https://www.raspberrypi.org/forums/viewtopic.php?t=65043
I use the C library WiringPi and call it with pinvoke . I found a Wraper class https://github.com/danriches/WiringPi.N ... erClass.cs .
If you add this file to your project it's very easy to use the raspberry pi IO's
I don't know why but i have to change the entry points from xxxGpio to xxx
[DllImport("libwiringPi.so", EntryPoint = "pinModeGpio")]
[DllImport("libwiringPi.so", EntryPoint = "pinMode")]
To Use set a GPIO it's simple
// init and set mode
Init.WiringPiSetup();
GPIO.pinMode(2, (int)GPIO.GPIOpinmode.Output);
GPIO.pinMode(3, (int)GPIO.GPIOpinmode.Input);
// write
GPIO.digitalWrite(2, 1);
// read
var curState = GPIO.digitalRead(3);
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Threading.Tasks; | |
namespace RaspberryGPIOManager | |
{ | |
public class GPIOPinDriver : IDisposable | |
{ | |
private const string GPIO_ROOT_DIR = "/sys/class/gpio/"; | |
private static List<Pin> _exported_pins = new List<Pin>(); | |
private bool _disposed; | |
/// <summary> | |
/// P1 GPIO pins | |
/// </summary> | |
public enum Pin | |
{ | |
GPIO2, | |
GPIO3, | |
GPIO4, | |
GPIO7, | |
GPIO8, | |
GPIO9, | |
GPIO10, | |
GPIO11, | |
GPIO14, | |
GPIO15, | |
GPIO17, | |
GPIO18, | |
GPIO22, | |
GPIO23, | |
GPIO24, | |
GPIO25, | |
GPIO27 | |
}; | |
/// <summary> | |
/// Direction of the GPIO Pin | |
/// </summary> | |
public enum GPIODirection | |
{ | |
In, | |
Out | |
}; | |
/// <summary> | |
/// The value (High or Low) of a GPIO pin. | |
/// </summary> | |
public enum GPIOState | |
{ | |
Low = 0, | |
High = 1 | |
}; | |
private Pin _gpioPin; | |
/// <summary> | |
/// Gets the GPIO pin number. | |
/// </summary> | |
public Pin GPIOPin | |
{ | |
get { return _gpioPin; } | |
private set | |
{ | |
lock (_exported_pins) | |
{ | |
if (_disposed) | |
throw new ObjectDisposedException("Selected pin has been disposed."); | |
else if (_exported_pins.IndexOf(value) != -1) | |
throw new PinAlreadyExportedException("Requested pin is already exported."); | |
else | |
{ // 0 1 2 3 4 5 | |
File.WriteAllText(GPIO_ROOT_DIR + "export", value.ToString().Substring(4)); // G P I O 8 | |
_exported_pins.Add(value); | |
_gpioPin = value; | |
} | |
} | |
} | |
} | |
private GPIODirection _gpioDirection; | |
/// <summary> | |
/// Gets or sets the direction of of an output GPIO pin. | |
/// </summary> | |
public GPIODirection Direction | |
{ | |
get { return _gpioDirection; } | |
set | |
{ | |
if (_disposed) | |
throw new ObjectDisposedException("Selected pin has been disposed."); | |
else | |
{ | |
File.WriteAllText(String.Format("{0}gpio{1}/direction", GPIO_ROOT_DIR, GPIOPin.ToString().Substring(4)), (value == GPIODirection.In ? "in" : "out")); | |
_gpioDirection = value; | |
} | |
} | |
} | |
/// <summary> | |
/// The current value of a GPIO pin. | |
/// </summary> | |
public GPIOState State | |
{ | |
get | |
{ | |
if (_disposed) | |
throw new ObjectDisposedException("Selected pin has been disposed."); | |
else | |
{ | |
string state = File.ReadAllText(String.Format("{0}gpio{1}/value", GPIO_ROOT_DIR, GPIOPin.ToString().Substring(4))); | |
return (state[0] == '1' ? GPIOState.High : GPIOState.Low); | |
} | |
} | |
set | |
{ | |
if (_disposed) | |
throw new ObjectDisposedException("Selected pin has been disposed."); | |
else if (this.Direction == GPIODirection.In) | |
throw new InvalidOperationException("State of an input pin can only be read."); | |
else | |
{ | |
File.WriteAllText(String.Format("{0}gpio{1}/value", GPIO_ROOT_DIR, GPIOPin.ToString().Substring(4)), (value == GPIOState.High ? "1" : "0")); | |
} | |
} | |
} | |
/// <summary> | |
/// Sets up an interface for accessing the specified GPIO pin with direction set to OUT and initial value to LOW. | |
/// </summary> | |
/// <param name="gpioPin">The GPIO pin to be accessed</param> | |
public GPIOPinDriver(Pin gpioPin) | |
: this(gpioPin, GPIODirection.Out, GPIOState.Low) { } | |
/// <summary> | |
/// Sets up an interface for accessing the specified GPIO pin with the given direction and initial value set to LOW. | |
/// </summary> | |
/// <param name="gpioPin">The GPIO pin to be accessed.</param> | |
/// <param name="direction">The direction the GPIO pin should have.</param> | |
public GPIOPinDriver(Pin gpioPin, GPIODirection direction) | |
: this(gpioPin, direction, GPIOState.Low) { } | |
/// <summary> | |
/// Sets up an interface for accessing the specified GPIO pin with the given direction and given initial value. | |
/// </summary> | |
/// <param name="gpioPin">The GPIO pin to be accessed.</param> | |
/// <param name="direction">The direction the GPIO pin should have.</param> | |
/// <param name="initialValue">The initial value the GPIO pin should have.</param> | |
public GPIOPinDriver(Pin gpioPin, GPIODirection direction, GPIOState initialValue) | |
{ | |
this._disposed = false; | |
this.GPIOPin = gpioPin; | |
this.Direction = direction; | |
if (this.Direction == GPIODirection.Out) { | |
this.State = initialValue; | |
} | |
} | |
/// <summary> | |
/// Unexports the GPIO interface. | |
/// </summary> | |
public void Unexport() | |
{ | |
if (!_disposed) | |
Dispose(); | |
} | |
public void Dispose() | |
{ | |
if (_disposed) | |
throw new ObjectDisposedException("Selected pin has already been disposed."); | |
File.WriteAllText(GPIO_ROOT_DIR + "unexport", GPIOPin.ToString().Substring(4)); | |
_exported_pins.Remove(this.GPIOPin); | |
_disposed = true; | |
} | |
~GPIOPinDriver() | |
{ | |
if (!_disposed) | |
Dispose(); | |
} | |
} | |
} |
from https://www.raspberrypi.org/forums/viewtopic.php?t=65043
I use the C library WiringPi and call it with pinvoke . I found a Wraper class https://github.com/danriches/WiringPi.N ... erClass.cs .
If you add this file to your project it's very easy to use the raspberry pi IO's
I don't know why but i have to change the entry points from xxxGpio to xxx
[DllImport("libwiringPi.so", EntryPoint = "pinModeGpio")]
[DllImport("libwiringPi.so", EntryPoint = "pinMode")]
To Use set a GPIO it's simple
// init and set mode
Init.WiringPiSetup();
GPIO.pinMode(2, (int)GPIO.GPIOpinmode.Output);
GPIO.pinMode(3, (int)GPIO.GPIOpinmode.Input);
// write
GPIO.digitalWrite(2, 1);
// read
var curState = GPIO.digitalRead(3);
留言
張貼留言