LED通信事業プロジェクト エンジニアブログ

F#でラズパイを動かす(6)

F#で「Lチカ」 Part.3(最終回)

記事更新日 2022年11月29日


はじめに

小さくて安い教育用コンピューターであるRaspberry Pi通称ラズパイですが、このラズパイがここまで広まることとなった最大の理由はプログラムによって電圧を制御することができる物理ピンを装備していることです。この物理ピンによって高度な「電子工作」が可能になります。 今回は前回から引き続き、F#でLチカする方法を説明していきます。今回はLチカシリーズの最終回、物理的な接続や動かし方です。

説明の前に

この記事がでる少し前の2022年11月8日(米国時間)にマイクロソフトから「.NET 7」がリリースされました。F#も"F# 7"というバージョンになりました。F# 7における最も影響の大きな変更点はARM64への対応だと思います。これは、Windows ARM版におけるパフォーマンス改善が主目的と思われますが、Apple MacもintelからARM64ベース(Mxシリーズ)となりましたし、Raspberry OSも64bit版が徐々に広まり始めていますから、.NETとしては「必然の進化」なのでしょう。

今回含めこれまでこのブログで取り上げた内容は32bitも64bitもない、極めて簡単なコードだけですが、.NET 7リリースにより一つだけ注意しなければいけない点があります。それは連載第二回で出てきたラズパイへの.NETインストールです。

以前、ラズパイに.NETをインストールするには、マイクロソフトの公式サイトにも載っているこのコマンドを打てば最新版がインストールされると書きました(パスを通すコマンドは省略)。

curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel Current

このブログへ掲載されたコードはすべて.NET 6をターゲットとして書かれていますが、これを書いている2022年11月末現在は.NET 7が最新のため、上のインストールコマンドを打つと.NET 7がインストールされてしまいます。残念ながらラズパイの.NETには後方互換性がありません。.NET 7をインストールしても、.NET 6向けに書かれたコード(正確に言えば.NET 6でビルドされたコード)は動きません。そのため、.NET 6で書いたアプリを動かすには、ラズパイへ.NET 6※1をインストールしておく必要があります。

さて、現段階での.NET 6のインストール方法ですが、.NET 6はLTS、つまりはLong term Support(長期サポート)バージョンのため、インストールコマンドの最後のバージョン指定スイッチをchannel Currentからchannel LTSと変更することでNET 6の最新版がインストールされるようです。

curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel LTS

ちなみに、.NET 7の場合をインストールしたい場合でも、現在はchannel Currentというスイッチを推奨していないらしく、channel STS※2と書くのが正しい、といった警告がでます(けどインストールはしてくれる)。

さて、長くなりましたがこのブログでは引き続き.NET 6前提で書いていきますので、よろしくお願いいたします。

Lチカのためのハードウエアの準備

Lチカ、つまりはLEDを点灯させるためにはLEDを含めた配線を行わなければいけません。Lチカ用の配線に関しては、ここで書かずともマイクロソフトの公式サイト含めありとあらゆるサイトで記載されていますので、配線的な話は最低限の情報のみ記載しておきます。

必要なものは ・LED(砲弾型が便利) ・ジャンパー線 ・抵抗(おおよそ300~1000Ω程度) ・ブレッドボード

ジャンパー線は、ラズパイ(オス)とブレッドボード(メス)を結ぶためのオス-メスケーブルと、ブレッドボード上で繋ぐメス-メスケーブルの両方が必要となります。

回路図的には以下の通り。

fig.1
図1:Lチカ回路図

電源プラス側のとなるのがGPIOピンです。前回はコード上でGPIO14番を指定していましたので、今回の例ではGPIO14に繋ぎます。皆さんの方でコードの方をいじって好きなGPIOピンに設定して構いません※3。そこからLED、抵抗を介してラズパイのマイナス側、すなわちGNDに落ちるという極単純な回路になっています。

fig.1
図2:ラズパイ接続写真

ピンのレイアウトは、前述の公式サイトにも記載がありますので、それを参照してください。ちなみに、GPIO 14は物理ピン番号の8番なので、右の上から4番目、GNDは何カ所かありますが、今回はわかりやすいためGPIO 14の一つ上の物理ピン6番を使用しています。

ビルドとラズパイへのコピー

ラズパイで動かすために、コードからアプリケーションファイルを作る「ビルド」という作業を行います。コードは前回のものをそのまま使います。

Visual Studio(VS)を開いて、LEDOnOffプロジェクトが含まれるソリューションを開いてください。標準ツールバーには図3の赤点線枠のような項目があります。これを左をDebug、真ん中をAny CPU、右をLEDOnOff(プロジェクト名)となるように設定してください。

fig.3
図3:ビルド構成

左のビルド構成はDebugReleaseから選べるようになっています。文字通り、デバッグ用とリリース用を選択することができ、デバッグ用を選ぶとエラーが出たときに、どこのファイルの何行目にエラーが出たかなどを表示できるようになりますが、その代わり遅く、ファイルサイズも大きくなります。リリースはその逆で、ファイルは最適化されサイズは小さく、処理も高速化されますが、デバッグ機能が無くなります。今回のようなテストアプリを作っている場合は、常にデバッグにしておいた方が便利です。

さて、動かすのがWindowsアプリであれば、図3の赤枠横にある三角形(再生ボタンのようなやつ)を押せば、ビルドしつつ実行してくれます。本来.NET 6はWindowsもラズパイも同じコードで動くので、Hello World!の様なアプリなら三角形を押すことでラズパイで動くアプリ”も”ビルド(そしてデバッグ)できるのですが、今回作っているアプリはGPIOというPCが持っていない機能を使うため、三角形を押してビルドしようとすると、実行段階で即エラーになります。

ですから、画面右のソリューションエクスプローラーから、LEDOnOffプロジェクトを右クリックして、ビルドだけを行います(図4)。

fig.4
図4:ビルドの選択

これにより、アプリを実行することなくビルドが行われます。コードにエラーが無ければ通常下に配置されている「出力ウインドウ」に、

========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

といった「ビルドが正常に完了した」旨のメッセージが表示されます。

ビルドされた、実行ファイル群は[<プロジェクトのあるフォルダ>]-[bin]-[Debug]-[net6.0]に作成されます。プロジェクトがどこに保存されているか分からない方は、Visual Studioから直接開くこともできます。上の図4と同じようにプロジェクトを選んで右クリックをすると、下の方にエクスプローラーでファイルを開く(X)という選択肢があります。これを選べば、プロジェクトがあるフォルダのエクスプローラーが開きます。[net6.0]フォルダ内に実行に必要なアプリが全て含まれています。要らないものもかなり含まれていますが、それを選別するのも面倒なのでここではフォルダごと全てコピーしてしまします。

ラズパイへのコピーは第二回で説明したWinSCPというアプリを使うと便利でしょう。ログインできればドラッグアンドドロップでファイルをコピーすることができます。最初に作った試験アプリは、[home]-[pi]-[Downloads]配下に置きましたので、今回もここに置きます。フォルダ名が[net6.0]では分かりにくいので、[LEDONOFF]に変更します。

fig.5
図5:WinSCP

実行

さて、いよいよ実行です。 ラズパイにSSHで接続します。そして、フォルダを先ほどビルドしたファイルをコピーした先に変更します。そして、dotnet <プロジェクト名>.dllというコマンドを打てばアプリは実行されます。

正常に動けば次のようなの表示になります。

pi@raspberrypi:~ $ cd Documents/LEDONOFF pi@raspberrypi:~/Documents/LEDONOFF $ dotnet LEDOnOff.dll 点灯「1」, 消灯「0」, 終了「e」

この状態で"1"を押せば、Port xx Openのメッセージと共にLEDが点灯するはずです。実際に、どんな感じで動くかはGIFアニメにしましたので、こちらをご覧下さい。

fig.4
図6:LED On/Offの様子

さて・・・ 皆様は正常に動いたでしょうか?

もし、点灯「1」, 消灯「0」, 終了「e」のメッセージがでて、それでいてLEDが点灯しない場合。GPIO含めた接続の確認が必要です。ラズパイはGPIOの先が繋がっているかまでは判断してくれません。例えば、もともとLEDは「発光ダイオード」と呼ばれていた通りにダイオード(一方向しか電流を流さない素子)の一種ですから、プラスとマイナスが逆でも動きません。砲弾型LEDなら足の長い方がプラス(アノード)です。

もし、何をやってもLEDが光らない場合、GPIO 14に挿しているプラス側のピンを、常時3.3Vを出しているピン(物理ピン1、左一番上)へ差し替えてみてください。もしそこに挿してLEDが光るのであればLEDや抵抗の配線は正常ですから、GPIOのピン番号や、コードそのものを確認してください。

まとめ

さて、ちょっと長くなりましたが3回にわたりましてLチカをやってきました。基本的にLチカさえできれば、GPIOのアウトプットに関しては何でもできるということになります。しかし、LEDを光らせているだけでは何も面白くない・・・ というわけで、次回以降は、「ラズパイでモーターを動かす」編というのをやりたいと思います。


※1; .NET6と.NET7を両方インストールしておいても良い。

※2; Short Term Supportの略。.NETは偶数バージョンが長期サポート、奇数バージョンが短期サポートと(今のところ)決められている。

※3; 尚、Raspberry Pi公式ホームページには ”GPIO pins 0 and 1 are present on the board (physical pins 27 and 28) but are reserved for advanced use”とあり、一般的にGPIO 0とGPIO 1は使わないことになっている。