GR ファミリー用ライブラリを Visual Studio 2015 Update 2 対応しました

追記)4月27日に公開した API リファレンスの構成が壊れているという連絡をいただきました。29日未明に修正版をコミットしました。すでにダウンロード済みの方はお手数ですが、再度最新版をダウンロードしてください。
なおバージョン番号は変更していません。

.NET Micro Framework v4.3 QFE2 と Visual Studio 2015 Update 2 との微妙な問題が解決し、GR-Family ライブラリの既存分の動作確認を終え、(超手抜きながら・・・)API リファレンスもなんとか作りました。

ということで、昨年秋に公開して少しずつ手を加え続けている、GR-Family ライブラリを改めて宣伝します。

https://github.com/netmf-lib-grfamily/GrFamilyLibrary

中味は全然すごくなくて、いちいち GPIO 操作する面倒を隠蔽したり I2C の低レベルの操作をラッピングしているだけなんですが、よろしければご活用ください。
GR-PEACH や PinKit をお持ちの方には便利に使えると思います。

 

そろそろ Windows 10 IoT 用のライブラリにも着手しようかな。皆さんにとっては素のままでも十分簡単なのか、ライブラリ化する人が出てこないけど、やっぱりコーディングは少しでもラクできるほうがいいですよね。

「IoT ALGYAN ハンズオンのソースコード解説します」セッション資料を公開しました(Techfair.jp 勉強会 2016年3月19日開催)

2016年3月19日(土) に、Techfair.jp 主催、IoT ALGYAN 協力の勉強会

「IoT ALGYAN ハンズオンのソースコード解説します」

を開催しました。

IoT ALGYAN のハンズオンのソースを起点に、.NET Micro Framework やマイコンボードのプログラミングについて解説するというものです。あわせて Windows 10 IoT ではどう書くのかも紹介しました。

セッション資料は docs.com で公開しています。参加した皆さんは復習のため、参加していない方はマイコンボードプログラミングの参考にお使いください。

マイコンボードプログラミングは決して難しくはないものの、未経験の方にはとっつきにくいかもしれません。
そのハードルを越えるために、資料を活用してください。

参加者は決して多くはなかったものの、今回は内容についての評価が高く、参加者の期待には答えることができたと思います。
今後の勉強会では、ハンズオン資料のクラウド側の部分の解説をしたいと思います。が、単にコード解説ではなくて知見のあるスピーカーを呼んでセッション形式のパートもあるといいかもしれませんね。役に立って楽しいイベントになるように少し企画を検討してみます。

 

PS. 今回残念だったのは、前日・当日のキャンセル、無断欠席が多かったこと。申込者の半数が会場に来てくれませんでした。・・・残念です。参加したくなる仕掛けも考えてみないといけないですね。

11月21日(土) ALGYAN公式の IoT ハンズオンを開催しました(東京週末開催)

11月21日(土) に ALGYAN 公式の IoT ハンズオンを開催しました。

久しぶりの東京週末開催でした。

当日は3連休初日にも関わらず、参加してくださった皆さん、ありがとうございました。

また長時間のハンズオン、おつかれさまでした。

前日から当日のキャンセルが多かったのはかなり残念。

最初から申し込まないでくださると他の方に技術習得のチャンスを提供できるんですけどね・・・。

参加された皆さんは、せっかく時間をかけて開発環境を構築されたことですし、PinKit も入手されたので、ぜひこれからも活用してください。

会場でもお伝えしましたが、IoT ALGYAN は Facebook のグループページを持っています。未参加の方は、これを機にぜひ Facebook の IoT ALGYAN のグループサイトに参加してください。

https://www.facebook.com/groups/ioytjp/

当日の資料は、これを書いている時点では公開されていませんが、準備中です。少し待って、

http://ms-iotkithol-jp.github.io/HowToLearn.htm

を参照してみてください。

本日時点では、上記リンク先にあるのは一つ古い版の資料です。大きな流れは変わっていませんが、Azure 管理ポータルの画面が一部差し替わっていたり、手順が一部違っていたりします。ちなみに手順の違いは、当日紹介できなかった8章のところですので、そこより前の手順は(一部のタイプミスを除いて)当日紙で配付したものと同じ内容です。

参加された皆さんには時間的に相当ハードなハンズオンだと思うので、今後は範囲を絞って、またソースや背景の説明を増やした形のイベントもやってみたいと思っています。

ALGYAN の公式イベントになるか、Techfair のイベントにするかはちょっと検討してみますね。

NETMF : .NET Micro Framework v4.4 が RTW しました。が、v4.3 開発者は Visual Studio の更新プログラムに注意

.NET Micro Framework v4.4 が RTW (=Release To Web) しました。
新バージョンのリリースです。まずはおめでたいですね。

が、v4.3 QFE2 開発者の皆さんはちょっと注意が必要です。
GR-PEACHGHI Electronics の FEZ シリーズも、現在はどちらも v4.3 対応なので要注意。

Visual Studio の [拡張機能と更新プログラム] に “.NET Micro Framework project system” がありますが、これの [この拡張機能を自動的に更新する] のチェックを外してください。

2015-10-24 20-15-49

GR-PEACH にしても FEZ にしても、現在は v4.3 QFE2 対応です。NETMF の SDK はこのバージョンをインストールしているはず。
が、VS 拡張機能の設定によっては Visual Studio のプロジェクトテンプレートが自動的に v4.4 版に更新されてしまいます。
この状態で新規プロジェクトを作ると、Microsoft SPOT の参照が見えない、NETMF のエミュレータも USB デバイスも見えない、という状態になります。
※すみません、画面キャプチャ撮っていません・・・。

上記の [この拡張機能を自動的に更新する] のチェックを外すことで、v4.3 用のプロジェクトテンプレートを継続して使えます。もうしばらく v4.3 での開発をしましょう。

もし v4.4 用のテンプレートに更新されてしまった場合は、

  1. 拡張機能をアンインストール
  2. v4.3 QFE2 SDK をアンインストール (※私の環境では、修復インストールでは正しく戻せませんでした。ということで一旦アンインストール)
  3. v4.3 QFE2 SDK を再インストール
  4. v4.3 QFE2 のnetmfvs14.vsix を再インストール
  5. Visual Studio を起動して、”.NET Micro Framework project system” の [この拡張機能を自動的に更新する] のチェックを外す

の手順で、無事 v4.3 QFE2 環境に戻せます。

いや~、最初分からずに苦労した・・・


追記 (10/25)

設定変更までのタイミングのせいか、v4.4 用のテンプレートに更新されてしまうことがあるようです。(詳しい原因は分かっていませんが)
ひとまず Visual Studio のオプション設定で、自動更新をオフにしておくのがよさそうです。
これにすると、拡張機能ダイアログでは自動更新のチェックボックスが表示されなくなります。他の拡張機能の自動更新もオフになってしまいますが、この設定で乗り切れそうです。

2015-10-25 9-51-042015-10-25 10-19-31

NETMF : PinKit センサーボードの AnalogInput

前の記事で .NET Micro Framework の AnalogInput を紹介しました。
ブレッドボードに乗せた CdS セルの値が簡単に取得できました。

今回は AnalogInput の復習を兼ねて、PinKit のセンサーボードのアナログ入力を見てみます。

最後にソースコードを載せますが、当然のことながら CdS セルからのアナログ入力と全く同じコードで入力値を取得できます。(接続するピンの指定はそれぞれで異なります)


PinKit のセンサーボードには2つのアナログ入力用のパーツが乗っています。

一つがハンズオンなどでもお馴染みの温度センサー(サーミスター)、もう一つがブロック端子台です。

WP_20150316_009

それぞれ専用の半固定抵抗を介して電圧が印加されているので、センサーボードを GR-PEACH に乗せるだけでパーツの入力値を取得できます。
ブロック端子台には電圧系センサーまたは抵抗計センサーを接続することができます。(サーミスターや CdS セルも抵抗系のセンサー)
なおブロック端子台を使う時には、JP1 のジャンバーをショートする必要があります。

サーミスター、ブロック端子台が接続されているピンはそれぞれ、

  • サーミスター・・・A5 ピン(アナログの5番ピン)
  • ブロック端子台・・・A4 ピン(アナログの4番ピン)

です。


コード例はこんな感じ。クラスライブラリを利用しているので、コードがシンプルになっています。

using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using GrFamily.MainBoard;

namespace ThermistorTrial01
{
    public class Program
    {
        public static void Main()
        {
            var input = new AnalogInput(Pins.ANALOG_5);     // センサーボード上のサーミスター(温度センサー)
            //var input = new AnalogInput(Pins.ANALOG_4);     // センサーボード上の端子台に接続した外付けセンサー

            while (true)
            {
                var val = input.ReadRaw();
                Debug.Print(val.ToString());

                Thread.Sleep(1000);
            }
        }
    }
}

前回、ブレッドボードに CdS セルを乗せたのと全く同じコードです。(くどいようですが、ピン番号は別です)

なお、せっかくなので(?)、ブロック端子台に CdS セルを接続してみました。こんな風になります。

WP_20151022_003

NETMF : GR ファミリー用のクラスライブラリを公開しました

GR ファミリー (GR-PEACH / GR-SAKURA) 用のクラスライブラリを公開しました。
GR-PEACH だけだともったいないので(?)、GR-SAKURA 用のライブラリも一緒に公開です。PinKit のセンサーボードのライブラリも入れました。

https://github.com/netmf-lib-grfamily/GrFamilyLibrary

ベースは3月の IoT ALGYAN キックオフイベント用のコンテンツとして提供したソースコード。
それをクラスライブラリ化したものの、PEACH の諸々の状況からなかなか公開に至らなかったという不遇なソースコードです。
そこから数ヶ月メンテナンスしておらずファーストリリースの勢い(ノリ)のままで整理できていないのですが、もったいないので公開することにしました。
本当の理由は、これを使ったプログラミング例を紹介したいので(こっち絡みで)、ライブラリも公開せざるを得なくなったということだったりします。(素の NETMF のコードをゴリゴリ書くのが辛い /笑)

現在の公開では、実は一点問題が残ってまして。
ライブラリ部分はVisual Studio 2013 でビルドしなければなりません。2015 でビルドすると、ライブラリを利用するアプリケーションの実行時にエラーが発生して、アプリが動作しません。
ライブラリさえ Visual Studio 2013 でビルドすれば、それを利用するアプリケーションは Visual Studio 2015 で開発しても問題ありません。
ビルドオプションの変更で解決できるのかなと思っていますが、ここの調査はこれからです。まずは As-Is で公開してしまいました。 (Visual Studio 2015 でビルドできるようになってます)


せっかく .NET / C# / Visual Studio を使った開発ができるのだから、マイコンボードでもそれっぽいコードを書きたいわけです。
展示会の説明員をしていてデモをすると一番食いつきがいいのがイベントハンドラー。それから VS のデバッグ機能です。
マイコンボードも C# っぽいコーディングができるようにとクラスライブラリを作りました。

マイコンボードのプログラミングは、比較的定型的なコードがたくさん出てきます。ソースを見ていただけると分かるとおり、超簡単なコードです。それでも、

var debugLed = new OutputPort(なんちゃら~); // ハードウェア固有の値
debugLed.Write(true);
Thread.Sleep(100);
debugLed.Write(false);

と書くよりは、

var _peach = new Peach(); // ハードウェア固有の値は Peach クラスに隠蔽
_peach.PulseDebugLed(100);

と書きたいわけです。

入力だって、Thread.Sleep しながらポーリングするコードを書くよりは、

_peach.Button.ButtonPressed += Button_ButtonPressed;

と書きたいわけです。


IoT 開発の際にはぜひこれを活用して、自分の実現したいデバイス・ガジェットに集中してください。
ハードウェアの初期化やポーリングのためのコーディングは少しでも減らして、メインの部分に注力していただけるとうれしいです。

たくさんの人がたくさんのデバイスを開発して、IoT 界隈が賑やかになればいいなと思っています。ライブラリはこれからも少しずつ整備していきます。
小さなライブラリですが、IoT 発展の一助になればうれしいです。

NETMF : InterruptPort の使い方とGR-PEACH / GR-SAKURAでのボタン操作のコード例

.NET Micro Framework の入出力ポートの紹介、第3回目。
今回は InterruptPort がテーマ、GPIO の使い方の3回目です。

第1回 ・・・ OutputPort
第2回 ・・・ InputPort
第3回 (今回) ・・・ InterruptPort


InterruptPort

InterruptPort はデバイスのデータを入力するためのポートです。

と言うと、「InputPort との違いは何?」という疑問がわくと思います。
InterruptPort の特徴は、入力値の H / L が切り替わったタイミングでイベントを発行してくれる点です。
コンストラクターの引数によって、H→L、L→H、またはその両方でイベントを投げてくれるように指定できます。
InputPort は定期的にセンサーデータを読み出したい場合に使用し、InterruptPort は必要なデータが得られるタイミングが不定期な場合に使用するといいと思います。

例えば、定期的に室温を測定したい場合は InputPort を使い、周囲の温度が何度以上になったら何かアクションが必要な場合は InterruptPort を使うなどの使い分けです。
前回、ボタンのオンオフを InputPort を使って紹介しましたが、ボタンについては実は今回の InterruptPort のほうが適することが多いです。

InterruptPort の使い方

InterruptPort は次のように使います。

var button = new InterruptPort(<ポート番号>, <グリッチフィルターの設定>, <プルアップ/ダウン抵抗>, <イベント対象の方向>);

第3引数までは InputPort と同じですね。そう言えば、前回は説明を省略したのですが、GR-PEACH ではプルアップ抵抗が実装されています(このあたりは回路図を見て確認する部分です)。よって、第3引数には “Port.ResistorMode.PullUp” を指定してもいいです。

イベントの方向ですが、HからLに変わる時か、LからHに変わる時か、または両方かを指定します。

イベント発行のタイミング
InterruptEdgeBoth  信号の立ち上がり/立ち下がりの両方
InterruptEdgeHigh  信号の立ち上がり時
InterruptEdgeLow  信号の立ち下がり時
InterruptEdgeLevelHigh  信号が High の時
InterruptEdgeLevelLow  信号が Low の時
InterruptNone  イベントを受け取らない

InterruptEdgeHigh / Low では、信号の変化のタイミングでイベントが発行されます。
それに対して、InterruptEdgeHighLevel / LowLevel では信号の値によってイベントが発行されます。これらのイベント受信後には ClearInterrupt メソッドを呼んでください。


InterruptPort のコード例 ~ GR-PEACH / GR-SAKURA のボタン操作 ~

最後に、InterruptPort のコード例として GR-PEACH のボタン操作のコードを載せます。ボタンを押すとユーザー LED が点灯します。
これまでと同様、Microsoft.SPOT.Hardware の参照を追加する必要があります。
またこれも今までと同様、GR-SAKURA ではコメントを参考に一部書き換えてください。

なお一つ注意として、GR-PEACH では OnInterrupt イベントハンドラでは、ボタンが押されていれば data2 が 0 、離されていれば data2 が 1 になります。

using System;
using System.Threading;
using Microsoft.SPOT.Hardware;

namespace PeachInterruptPortDemo
{
    public class Program
    {
        // GR-PEACH
        private const Cpu.Pin ButtonPin = (Cpu.Pin)0x60;    // ボタン
        private const Cpu.Pin UserPin = (Cpu.Pin)0x6c;      // ユーザーLED

        // GR-SAKURA
        //private const Cpu.Pin ButtonPin = (Cpu.Pin)0x57;    // ボタン
        //private const Cpu.Pin UserPin = (Cpu.Pin)0x56;      // LED4

        private static OutputPort _led;

        public static void Main()
        {
            var button = new InterruptPort(ButtonPin, true, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeBoth);
            button.OnInterrupt += button_OnInterrupt;

            _led = new OutputPort(UserPin, false);

            (new Thread(() =>
            {
                Thread.Sleep(Timeout.Infinite);
            })).Start();
        }

        static void button_OnInterrupt(uint data1, uint data2, DateTime time)
        {
            var isPressed = data2 == 0;
            _led.Write(isPressed);
        }
    }
}