-
-
Save euronay/87e63e44c7f180f94280cab66d4ac3fb to your computer and use it in GitHub Desktop.
| <Project Sdk="Microsoft.NET.Sdk"> | |
| <PropertyGroup> | |
| <OutputType>Exe</OutputType> | |
| <TargetFramework>netcoreapp2.2</TargetFramework> | |
| <RootNamespace>hello_ws2812</RootNamespace> | |
| </PropertyGroup> | |
| <ItemGroup> | |
| <PackageReference Include="System.Device.Gpio" Version="0.1.0-prerelease*" /> | |
| <PackageReference Include="Iot.Device.Bindings" Version="0.1.0-prerelease*" /> | |
| </ItemGroup> | |
| </Project> |
| using System; | |
| using System.Device.Spi; | |
| using System.Device.Spi.Drivers; | |
| using System.Drawing; | |
| using Iot.Device.Graphics; | |
| using Iot.Device.Ws28xx; | |
| namespace hello_ws2812 | |
| { | |
| class Program | |
| { | |
| private const int count = 30; | |
| static void Main() | |
| { | |
| var settings = new SpiConnectionSettings(0, 0) { | |
| ClockFrequency = 2_400_000, | |
| Mode = SpiMode.Mode0, | |
| DataBitLength = 8 | |
| }; | |
| var spi = new UnixSpiDevice(settings); | |
| var device = new Ws2812b(spi, count); | |
| // Display basic colors for 5 sec | |
| BitmapImage image = device.Image; | |
| image.Clear(); | |
| image.SetPixel(0, 0, Color.Orange); | |
| image.SetPixel(1, 0, Color.Red); | |
| image.SetPixel(2, 0, Color.Green); | |
| image.SetPixel(3, 0, Color.Blue); | |
| image.SetPixel(4, 0, Color.Yellow); | |
| image.SetPixel(5, 0, Color.Cyan); | |
| image.SetPixel(6, 0, Color.Magenta); | |
| image.SetPixel(7, 0, Color.FromArgb(unchecked((int)0xffff8000))); | |
| device.Update(); | |
| System.Threading.Thread.Sleep(5000); | |
| // Chase some blue leds | |
| for(int i=0; i<10; i++) | |
| { | |
| image.Clear(); | |
| for(int j=0; j<count; j++) | |
| { | |
| image.SetPixel(j, 0, Color.LightBlue); | |
| device.Update(); | |
| System.Threading.Thread.Sleep(10); | |
| image.SetPixel(j, 0, Color.Blue); | |
| device.Update(); | |
| System.Threading.Thread.Sleep(25); | |
| } | |
| } | |
| // Color Fade | |
| int r=255; | |
| int g=0; | |
| int b=0; | |
| while (! Console.KeyAvailable) { | |
| if(r > 0 && b == 0){ | |
| r--; | |
| g++; | |
| } | |
| if(g > 0 && r == 0){ | |
| g--; | |
| b++; | |
| } | |
| if(b > 0 && g == 0){ | |
| r++; | |
| b--; | |
| } | |
| image.Clear(Color.FromArgb(r,g,b)); | |
| device.Update(); | |
| System.Threading.Thread.Sleep(10); | |
| } | |
| image.Clear(); | |
| device.Update(); | |
| Console.WriteLine("Hello Pi!"); | |
| } | |
| } | |
| } |
Where in the code does it bind to a specific GPIO pin?
I believe the iot library handles it based on given SpiConnectionSettings, so the code is:
var settings = new SpiConnectionSettings(0, 0) { ClockFrequency = 2_400_000, Mode = SpiMode.Mode0, DataBitLength = 8 };
Author's post with some more details on this scenario: https://jamesnaylor.dev/Posts/Read?id=pi-ws2812-with-net-core
I keep getting this error: 'UnixSpiDevice' is inaccessible due to its protection level
Hi @mindsgn. You might need to enable it in the boot configuration on your RaspberryPi. Add the following lines to /boot/config.txt on your device:
dtparam=spi=on
core_freq=250
core_freq_min=250
Also bear in mind that this code is hideously outdated and I think the GPIO support in .NET 5 is significantly different. When I get the time, I'll update this.
Hi @mindsgn, I ran into this same issue. To create a UnixSpiDevice, try
var spi = SpiDevice.Create(settings);
That should do it.
Can you dim them?
Can you dim them?
Yes, you just send darker colours. Black turns LEDs off.
Where in the code does it bind to a specific GPIO pin?