یکی از کتابخانه ای رایگان و کامل جهت استفاده در زبان برنامه نویسی dotnet core ( برنامه نویسی به کمک #c ) برای دسترسی به سخت افزار raspberry pi کتابخانه RaspberryIO هست. برای استفاده از این کتابخانه در .net core باید نسخه دات نت کور شما ۲.۱ باشه و همچنین که دات نت کور ۲.۱ بر روی رزبری شما هم نصب باشد
(آموزش نصب net core 2.1 بر روی رزبری نسخه لینوکس رو اینجا بخونید)
در این کتابخانه به وسیله تابع های موجود میتوانید به سخت افزار های رزبری از جمله دوربین Camera ،اطلاعات و وضعیت سخت افزار و CPu ، پایه ها ورودی خروجی GPIO ، ارتباط از طریق پروتکل SPI ,پروتکل I2c و ترد ها دسترسی داشته باشید.
خوب برای نصب این کتابخونه از nuget میتونید نصب کنید
PM> Install-Package Unosquare.Raspberry.IO
خوب نصب کتابخونه که انجام دادین نوبت به استفاده از این کتابخونه میرسه.
- کنترل GPIO : در این مثال پین ۰ رو به صورت چشمک زن روشن خاموش میکنیم
public static void TestLedBlinking()
{
// Get a reference to the pin you need to use.
// All 3 methods below are exactly equivalent
//var blinkingPin = Pi.Gpio[۰];
//var blinkingPin = Pi.Gpio[WiringPiPin.Pin00];
var blinkingPin = Pi.Gpio.Pin00;
// Configure the pin as an output
blinkingPin.PinMode = GpioPinDriveMode.Output;
// perform writes to the pin by toggling the isOn variable
var isOn = false;
for (var i = ۰; i < ۲۰; i++)
{
isOn = !isOn;
blinkingPin.Write(isOn);
System.Threading.Thread.Sleep(۵۰۰);
}
}
static void TestCaptureImage()
{
var pictureBytes = Pi.Camera.CaptureImageJpeg(۶۴۰, ۴۸۰);
var targetPath = "/home/pi/picture.jpg";
if (File.Exists(targetPath))
File.Delete(targetPath);
File.WriteAllBytes(targetPath, pictureBytes);
Console.WriteLine($"Took picture -- Byte count: {pictureBytes.Length}");
}
static void TestCaptureVideo()
{
// Setup our working variables
var videoByteCount = ۰;
var videoEventCount = ۰;
var startTime = DateTime.UtcNow;
// Configure video settings
var videoSettings = new CameraVideoSettings()
{
CaptureTimeoutMilliseconds = ۰,
CaptureDisplayPreview = false,
ImageFlipVertically = true,
CaptureExposure = CameraExposureMode.Night,
CaptureWidth = ۱۹۲۰,
CaptureHeight = ۱۰۸۰
};
try
{
// Start the video recording
Pi.Camera.OpenVideoStream(videoSettings,
onDataCallback: (data) => { videoByteCount += data.Length; videoEventCount++; },
onExitCallback: null);
// Wait for user interaction
startTime = DateTime.UtcNow;
Console.WriteLine("Press any key to stop reading the video stream . . .");
Console.ReadKey(true);
}
catch (Exception ex)
{
Console.WriteLine($"{ex.GetType()}: {ex.Message}");
}
finally
{
// Always close the video stream to ensure raspivid quits
Pi.Camera.CloseVideoStream();
// Output the stats
var megaBytesReceived = (videoByteCount / (۱۰۲۴f * ۱۰۲۴f)).ToString("۰.۰۰۰");
var recordedSeconds = DateTime.UtcNow.Subtract(startTime).TotalSeconds.ToString("۰.۰۰۰");
Console.WriteLine($"Capture Stopped. Received {megaBytesReceived} Mbytes in {videoEventCount} callbacks in {recordedSeconds} seconds");
}
}
- خوندن وضعیت پایه ( پین GPIO) مورد نظر
Pi.Gpio.Pin02.PinMode = GpioPinDriveMode.Input;
// The below lines are reoughly equivalent
var isOn = Pi.Gpio.Pin02.Read(); // Reads as a boolean
var pinValue = Pi.Gpio.Pin02.ReadValue(); // Reads as a GpioPinValue
- تغییر وضعیت پایه ( پین GPIO) مورد نظر
Pi.Gpio.Pin02.PinMode = GpioPinDriveMode.Output;
// The below lines are reoughly equivalent
Pi.Gpio.Pin02.Write(true); // Writes a boolean
Pi.Gpio.Pin02.Write(GpioPinValue.High); // Writes a pin value
- ایجاد پالس در پایه ( پین GPIO) مورد نظر ( مثلا ۵۲۳ هرتز)
// Get a reference to the pin
var passiveBuzzer = Pi.Gpio[WiringPiPin.Pin01];
// Set the frequency to Alto Do (523Hz)
passiveBuzzer.SoftToneFrequency = ۵۲۳
// Wait 1 second
System.Threading.Thread.Sleep(۱۰۰۰);
// And stop
passiveBuzzer.SoftToneFrequency = ۰;
- ایجاد اینتراپت برای تغییر وضعیت پایه ( پین GPIO)
using System;
using Unosquare.RaspberryIO;
using Unosquare.RaspberryIO.Gpio;
class Program
{
// Define the implementation of the delegate;
static void ISRCallback()
{
Console.WriteLine("Pin Activated...");
}
static void Main(string[] args)
{
Console.WriteLine("Gpio Interrupts");
var pin = Pi.Gpio.Pin00;
pin.PinMode = GpioPinDriveMode.Input;
pin.RegisterInterruptCallback(EdgeDetection.FallingEdge, ISRCallback);
Console.ReadKey();
}
}
Pi.Spi.Channel0Frequency = SpiChannel.MinFrequency;
var request = System.Text.Encoding.ASCII.GetBytes("HELLO!");
var response = Pi.Spi.Channel0.SendReceive(request);
// Register a device on the bus
var myDevice = Pi.I2C.AddDevice(0x20);
// Simple Write and Read (there are algo register read and write methods)
myDevice.Write(0x44);
var response = myDevice.Read();
// List registered devices on the I2C Bus
foreach (var device in Pi.I2C.Devices)
{
Console.WriteLine($"Registered I2C Device: {device.DeviceId}");
}
با توجه که این کتابخونه نیاز به ارتباط به سخت افزار ها داره پس باید برنامه تولیدی نهایی دسترسی کامل برای کنترل سخت افزار ها رو داشته باشه ، فرض کنید اسم برنامه ما atrin.rpi.gpio باشه ، پس از طریق ssh به پوشه ای که برنامه رو در رزبری کپی کردن برین و دسترسی لازم برای اجرا برنامه رو به صورت زیر بدین به عنوان مثال برنامه ما در مسیر home/pi/publish قرار گرفته باشه
sudo -i
cd /home/pi/publish
chmod +x atrin.rpi.gpio
یا این دستور
sudo -i
cd /home/pi/publish
chmod u+x atrin.rpi.gpio
یا این که با این دستور کل پوشه publish رو دسترسی لازم بهش بدین
~/publish$ sudo chmod u+x *
به همین سادگی و خوشمزگی