Raspberry Pi 2 と WebIOPi を使って A/D コンバーター経由でアナログ値を取得してみた - しばやん雑記 では WebIOPi を使って A/D コンバーターの MCP3002 を使いましたが、Raspberry# IO から同じように扱う方法がやっと分かったので書きます。
結論から書くと MCP3004/3008 と MCP3002 は仕様が微妙に異なるため、Raspberry# IO に用意されていたクラスでは対応出来ないという話でした。データシートを引っ張ってきました。
微妙に Channel Selection の指定が異なっていることが分かります。そして MCP3008 は D2 ビットを使うようになるだけといった違いになります。だから共通化出来るんですね。
どうしようもないので、フォークして MCP3002 向けのクラスを追加して解決することにしました。
一応、本家にも Pull Request を投げているので、運が良ければマージされるかもしれません。
今回の MCP3002 用クラスを追加した Raspberry# IO を使えば、以下のように書けます。
using System; using System.Threading; using Raspberry.IO.Components.Converters.Mcp3002; using Raspberry.IO.GeneralPurpose; namespace ConsoleApplication1 { class Program { static void Main() { var adcClock = ProcessorPin.Pin11; var adcMiso = ProcessorPin.Pin09; var adcMosi = ProcessorPin.Pin10; var adcCs = ProcessorPin.Pin08; var driver = new GpioConnectionDriver(); using (var adcConnection = new Mcp3002SpiConnection(driver.Out(adcClock), driver.Out(adcCs), driver.In(adcMiso), driver.Out(adcMosi))) { var ch0 = adcConnection.In(Mcp3002Channel.Channel0); var ch1 = adcConnection.In(Mcp3002Channel.Channel1); while (!Console.KeyAvailable) { Console.WriteLine("ch0: {0}", (int)ch0.Read().Value); Console.WriteLine("ch1: {0}", (int)ch1.Read().Value); Thread.Sleep(1000); } } } } }
ちなみにコンパイルするには以下のように mcs を叩くだけです。当然ながらソースからコンパイルした Raspberry.IO.dll などは Raspberry Pi 自体にコピーしておく必要があります。
mcs -r:Raspberry.IO.dll -r:Raspberry.IO.GeneralPurpose.dll -r:Raspberry.IO.Components.dll mcp3002.cs
コンパイルした後に実行すると 1 秒ごとに Channel 0 / 1 の値を出力していきます。
この時には Channel 0 に照度センサーを、Channel 1 に温度センサーを付けてあったので、明るさによって Channel 0 の方だけ値が大きく変わってます。
SPI 周りに関しては Raspberry Pi 2 との互換性の問題は発生していないようでした。
追記
Raspberry# IO に Pull Request を投げていた分がマージされました。NuGet が更新されるのを待ちます。
少しずつですが、開発自体も進んでいるようなので、今後も注目していきたいですね。