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
これでちゃんとチカチカしてくれました\(^-^)/