しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Raspberry# IO で A/D コンバーターの MCP3002 を使ってみた

Raspberry Pi 2 と WebIOPi を使って A/D コンバーター経由でアナログ値を取得してみた - しばやん雑記 では WebIOPi を使って A/D コンバーターの MCP3002 を使いましたが、Raspberry# IO から同じように扱う方法がやっと分かったので書きます。

結論から書くと MCP3004/3008 と MCP3002 は仕様が微妙に異なるため、Raspberry# IO に用意されていたクラスでは対応出来ないという話でした。データシートを引っ張ってきました。

f:id:shiba-yan:20150301150709p:plain f:id:shiba-yan:20150301150809p:plain

微妙に 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 の値を出力していきます。

f:id:shiba-yan:20150301145423p:plain

この時には Channel 0 に照度センサーを、Channel 1 に温度センサーを付けてあったので、明るさによって Channel 0 の方だけ値が大きく変わってます。

SPI 周りに関しては Raspberry Pi 2 との互換性の問題は発生していないようでした。

追記

Raspberry# IO に Pull Request を投げていた分がマージされました。NuGet が更新されるのを待ちます。

add support for MCP3002 converter by shibayan · Pull Request #30 · raspberry-sharp/raspberry-sharp-io · GitHub

少しずつですが、開発自体も進んでいるようなので、今後も注目していきたいですね。