🦠
XIAO ESP32C3で始めるnanoFramework ~SPI~
Seeed Studio XIAO ESP32C3で.NET nanoFrameworkを動かす記事というか雑記。
今回は、SPI。A/DコンバータMCP3002で電圧を取得して表示します。
ハードウェア
MCP3002をXIAO ESP32C3に繋ぎます。
結線が多いのでブレッドボードで。
- XIAO ESP32C3 GND - MCP3002 Pin4(Vss)
- XIAO ESP32C3 3V3 - MCP3002 Pin8(Vdd)
- XIAO ESP32C3 D7 - MCP3002 Pin1(CS#)
- XIAO ESP32C3 D8(SCK) - MCP3002 Pin7(CLK)
- XIAO ESP32C3 D9(MISO) - MCP3002 Pin6(Dout)
- XIAO ESP32C3 D10(MOSI) - MCP3002 Pin5(Din)
- 可変抵抗からのアナログ電圧 - MCP3002 Pin2(CH0)
NuGetパッケージ
SPIするためのnanoFramework.System.Device.Spiを追加します。依存しているnanoFramework.Runtime.EventsとnanoFramework.System.Device.Gpioも追加されます。
また、ESP32C3のピン機能の設定が必須なので、nanoFramework.Hardware.Esp32も追加します。
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="nanoFramework.CoreLibrary" version="1.14.2" targetFramework="netnano1.0" />
<package id="nanoFramework.Hardware.Esp32" version="1.6.3" targetFramework="netnano1.0" />
<package id="nanoFramework.Runtime.Events" version="1.11.6" targetFramework="netnano1.0" />
<package id="nanoFramework.System.Device.Gpio" version="1.1.28" targetFramework="netnano1.0" />
<package id="nanoFramework.System.Device.Spi" version="1.3.37" targetFramework="netnano1.0" />
</packages>
C#コード
1秒周期にMCP3002で電圧をA/Dコンバートして取得、出力ウィンドウに表示します。
Configuration.SetPinFunction()でピンの機能を設定しておき、SpiDevice.Create()でSPIインターフェースを取得します。
試し始めは全然動かず、試行錯誤しましたが、、、バグでしたw
いまはきちんと動きます。ご安心ください。
using nanoFramework.Hardware.Esp32;
using System.Device.Spi;
using System.Diagnostics;
using System.Threading;
Configuration.SetPinFunction(8, DeviceFunction.SPI1_CLOCK); // SCK ... GPIO8
Configuration.SetPinFunction(9, DeviceFunction.SPI1_MISO); // MISO ... GPIO9
Configuration.SetPinFunction(10, DeviceFunction.SPI1_MOSI); // MOSI ... GPIO10
var settings = new SpiConnectionSettings(1, 20); // SS ... GPIO20
settings.ClockFrequency = 1_000_000;
settings.Mode = SpiMode.Mode0;
settings.DataFlow = DataFlow.MsbFirst;
settings.DataBitLength = 8;
using var device = SpiDevice.Create(settings);
while (true)
{
var readBytes = new byte[2];
device.TransferFullDuplex(new byte[] { 0b01101000, 0 }, readBytes);
var volt = ((readBytes[0] & 0x03) * 256 + readBytes[1]) * 3.3 / 1023;
Debug.WriteLine($"{volt}");
Thread.Sleep(1000);
}
device.TransferFullDuplexの波形
波形はOK。
CSのLOW期間が長いのが気になりますね。
Discussion