RaspberryPi2 + Mono でLEDチカチカしてみた

時間があるうちにやっておこう、というわけで、ラズベリーパイ本来の使い方というか、電子工作にチャレンジしてみようとキットを購入。 付属のチュートリアルを少し流して雰囲気は分かった(気がする)ので、プログラムから制御してみようと思います。

と、言っても、既に先人によってキレイにまとめられているので、それらを参考にしながらやってみただけですが^^;

Raspberry Pi 2 + Mono 3.12.0 + Raspberry# IO で GPIO を使ったアプリケーションを書いてみる - しばやん雑記

ライブラリは raspberry-sharp-io - GitHub を使用し、サンプルコードは この辺 を参考にしました。

まず、おもむろにVisualStudio2013を開き、コンソールアプリケーションのプロジェクトを作成。Nugetで "Raspberry.IO.GeneralPurpose" をインストールしておきます。

コードはサンプルそのままなので、こんな感じで。

using System;
using Raspberry.IO.GeneralPurpose;

namespace Gpio.SwitchLed
{
  class Program
  {
    static void Main(string[] args)
    {
      var led1 = ConnectorPin.P1Pin07.Output();
      var connection = new GpioConnection(led1);
 
      for (int i = 0; i < 100; i++)
      {
        connection.Toggle(led1);
        System.Threading.Thread.Sleep(250);
      }
      connection.Close();
    }
  }
}

少し迷ったのが、ピンの番号とコード中で指定する ConnectorPin の対応。手元ではGPIO04に繋いでいたのですが、なぜか04番が定義されていないという・・・。ドキュメントをよくよく読んでみると、列挙子で定義されている名前は ココ の PinNumber に対応していそうです。今回だと、GPIO04=P1-07になります(多分)

コードが書けたらビルドします。今回はWindowsに依存する部分がないので、とりあえずそのままVS2013でビルドし、出来上がったバイナリ(実行ファイル+関連DLL)をラズベリーパイへ配置してもOKそう。

コピーしたらラズベリーパイのコンソールから実行してみます。

$ mono ./Gpio.SwitchLed.exe

Unhandled Exception:
Raspberry.IO.Interop.MemoryMapFailedException: Exception of type 'Raspberry.IO.Interop.MemoryMapFailedException' was thrown.
  at Raspberry.IO.Interop.MemoryMap.ThrowOnError[MemoryMapFailedException] (IntPtr result) [0x00000] in <filename unknown>:0 
 (中略)
  at Gpio.SwitchLed.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0

Oh...

c# mono raspberry pi GPIO with Raspberry# getting Operation is not valid - Stack Overflow

Execute your Mono program as root. /dev/mem is not accessible to normal users.

あー、そういうことか。。

$ sudo mono 
./Gpio.SwitchLed.exe

これでちゃんとチカチカしてくれました\(^-^)/