「GR-PEACH + NETMFで1行プログラミング」LT資料を公開しました (ルネサスナイト 9、2016年7月23日 (土) 開催)

30日(土) の勉強会資料の公開とは順番が逆になってしまいましたが、7月23日(土) 開催のルネサスナイト 9 に参加して LT登壇しました。

https://docs.com/d/embed/D25193197-9500-6085-1560-001018019056%7eBfe5a7bff-fc39-9c7d-d35f-86e930988702

皆さん、ガチで組込み開発をされている方ばかりで相当場違い、アウェイな感じでしたが、得るものも多く有意義な時間でした。

そういう方たちに向けて、GR-PEACH で動作する .NET Micro Framework の紹介をしました。

GR-PEACH の特徴の一つがマルチプラットフォームなのですが、NETMF on GR-PEACH は肩身が狭く、当日のイベントでも冒頭に「マルチプラットフォームで .NET Micro Framework も動く」という一言だけで片付けられる始末・・・orz
そういう場所で、.NET Micro Framework を認知してもらう程度にはお役に立てたと思っています。
裏にライブラリがあるから、C#だから、Visual Studio があるからという理由があるにしても、ボタンと LED 程度ならば本当に 1行で書けるわけで、これは他のプラットフォームや言語に対するメリットだと思います。(もちろんケースバイケースで向き不向きはあるはずですが)

LT は持ち時間 4分、そのうち 2分はライブコーディング(1行だけですが)の構成で作った資料なので、ツールやライブラリのダウンロードサイトの紹介、1行プログラミングの例を載せただけです。

これで NETMF に興味を持った方は、ぜひこのブログや MS 太田さんのブログハンズオン資料を見て、NETMF を楽しんでほしいと思います。

GR-SAKURAⅡで .NET Micro Framework を動かしてみる

先日、GR-SAKURA II が発売されました。(何故かひっそりと)
前バージョンの GR-SAKURA に対してメモリ容量が倍になっているとのこと。

38320002

ということで、.NET Micro Framework を動かしてみました。
世間ではすっかり Windows 10 IoT 一色な感じですが、

  • NETMF は軽い
  • 起動が速い
  • シャットダウンの面倒がない
  • APIセットが分かりやすい(個人的な好みも若干ありますが・・・)

と、メリットがたくさんあります。
特に今回、久しぶりに SAKURA で NETMF を動かしてみて、アプリ転送からリブート、起動までの時間の速さに驚きました。これならどんどんデバッグできます。
(あとは、GR-PEACHに比べてお手頃な価格もうれしい)

さて、GR-SAKURA II で NETMF を動かすためには、まずはファームの書き込みが必要です。これについてはマイクロソフトの太田さんのブログで詳しく解説されているので、そちらを参照してください。

まだボード上の LED とボタンしか確認できていませんが、Lチカも GrFamily ライブラリも問題なく動作しています。
「PEACH はちょっと高いんだよね」という方も、「ラズパイ以外も触ってみたい」という方も、SAKURA を試してみては。快適なマイコンボード開発、IoT が楽しめますよ。

WP_20160627_22_27_56_Pro

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

Visual Studio 2015 Update 2 に .NET Micro Framework v4.3 QFE2 をインストールした場合の不具合解消方法

長いタイトルですみません。

今から .NET Micro Framework 開発環境を作ろうと思うと、

  1. Visual Studio 2015 Update 2 をインストール
  2. .NET Micro Framework v4.3 QFE2 をインストール

の順番でインストールすると思います。VSの最新版が 2015 Update 2 なので、当然ですね。

ところが、この順番でインストールすると、いくつかおかしな事象に遭遇します。

  • 必要な using 句なのに、VS エディタ上では “Using directive is not required by the code and can be safely removed” というメッセージが表示される
  • ちゃんと解決できるはずのメンバーなのに、”Cannot resolve symble ‘xxx’ ” というメッセージが表示される
  • NETMF なのに LINQ がエラーにならない(本当ならばうれしい動きなんですが)
  • NETMF なのに 自動プロパティ初期化子がエラーにならない(本当ならばうれしい動きなんですが)
  • ビルド失敗する、または一見ビルド成功したように見えてボードに配置すると動作が怪しい

2016-04-26 21-21-342016-04-26 21-22-07

 

悔しいことに、前から使っているマシンではこの事象は発生しません。
どうも VS 2015 Update 2 前に NETMF をインストールし、あとから Update 2 に上げると問題ないようです。
だからと言って、今から環境を作るのに、無印 VS2015 → NETMF → VS2015 Update 2 の順番でインストールするのもうれしくありません。

解決方法がありました。
GHI Electronics さんのサイトに行くと、4月上旬に

GHI Electronics NETMF 2016 SDK Pre-Release 2

がリリースされています。このニュースリリースの中で触れられている

VS2015 patch instructions

パッチを当てるといいようです。ただし GHI さんは not official, Unsupported と言っているので、ご利用は自己責任で。

具体的には、パッチを解凍した中身の3ファイル

C:\Program Files (x86)\MSBuild\Microsoft\.NET Micro Framework\v4.3

上書きコピーします。(念のため、元のファイルはバックアップしておくのが安全)

これだけで OK。ちゃんと NETMF 開発できるようになります。

2016-04-27 0-07-192016-04-27 0-07-43

なお、パッチのダウンロード元 では上書き対象のフォルダーが間違っています。上記のフォルダーが正解です。

これでまた NETMF 開発できます!(世間は Windows 10 IoT ばっかりで若干悔しいですが)

 

しばらく、マシン入れ替えの際に何か起こってしまったのかと、SDK アンインストールやら VSアンインストールやら OS リカバリーやらを何度か試してみましたが状況は変わらず、ちょっと無駄な時間を過ごしてしまいました・・・。

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

「GR Family 用ライブラリの紹介」LT資料を公開しました (IoT 祭 2016 / 2016年3月12日) #algyan

IoT 祭 2016」(IoT ALGYAN 1周年記念イベント、3月12日(土) 開催) で、

GR Family 用ライブラリの紹介

というテーマで LT 登壇しました。
今回から資料は docs.com で公開しています。これまでの資料は引き続き SlideShare で公開しています。

 

以前からブログでお知らせしていた内容ではあるんですが、改めて LT で紹介しました。
「GitHub で公開してます」だけでは面白くないので、ライブラリを作り始めた経緯とか、ライブラリ利用でどんな風に便利になるのかをお伝えしました。
ぜひ活用して IoT を楽しんでください!

幸い、面白かったと言ってくださる方がいらっしゃって、実は内心薄い内容だな~と思っていたのですが、時間をいただいてよかったです。

懇親会で「DLL ってどうやって使うの?」という質問をいただきました。
このあたりは説明なしでいいのかなと思っていたんですが、やはり使い方とかリファレンスはあるほうがよさそうですね。
用意していきますので、少しだけ長い目で見てください。

 

次の週末 19日(土) の勉強会に参加してくだされば、ライブラリの使い方も紹介できます。ぜひ参加を検討してください。
現在、キャンセル待ちが出ている状態ですが、どうも増席されるんじゃないかな~と。(決めるのは私ですが /笑)

NETMF : 複数の I2C モジュールを接続(三軸加速度センサー ADXL345+キャラクターディスプレイ)

I2C の使用例として、これまで二つ紹介しました。

今回は I2C モジュールを二つ接続してみます。

WP_20160118_10_18_49_Pro

I2C のメリットは、複数のモジュールがあっても信号線 2本+電源の接続で済むこと。
I2C の概要は こちら のエントリーを参照していただければ。


I2CDevice の継承クラス / ADXL345 固有のクラス

.NET Micro Framework の I2CDevice クラスを使いやすくする拡張、および ADXL345 (三軸加速度センサー)は、こちらのコード がそのまま使えます。
特に変更する必要はありません。名前空間が気に入らなければ適当に変更してください。


キャラクターディスプレイのクラス

キャラクターディスプレイクラスは こちらのコード が使える・・・のですが、今回は 8×2行の別のモジュール、AQM0802A-RN-GBW を使ってみました。
理由は、実験用シールドに加速度センサーとキャラクターディスプレイの両方を載せるため。

キャラクターディスプレイは多くがHD44780 互換なのですが、AQM0802A は拡張機能セットを使います。
標準的な機能セットと共通の部分が多いのですが、モジュールの初期化コマンドおよびキャラクター出力コマンドが標準とは異なります。

ということで、以下のコードにします。

public class Aqm0802A : I2CDeviceEx
{
    private bool _displayOn = true;         // ディスプレイをオンにするか
    private bool _cursorOn = false;         // カーソルを表示するかどうか
    private bool _blinkOn = false;          // カーソル位置でブリンクするか

    private readonly int _commandWait = 1;  // コマンド実行後のウェイト

    public Aqm0802A(ushort aqm0802A, int defaultClockRateKhz, int timeout) :
        base(aqm0802A, defaultClockRateKhz, timeout)
    {
        Thread.Sleep(1000);

        // AQM0802A は HD44780 の拡張機能セットを使用する
        // 以下は拡張機能セットでの初期化コマンド
        // 標準機能セットを使用するモジュールについては以下を参照
        //   yseosoft.wordpress.com/2015/12/31/i2c_clcd_demo/ の記事
        //   GrFamilyLibrary のソースコード (github.com/netmf-lib-grfamily/GrFamilyLibrary)
        WriteCommand(0x38);         // 標準機能セットを指定
        WriteCommand(0x39);         // 拡張機能セットを指定
        WriteCommand(0x14);         // 内部オシレーター周波数を指定
        WriteCommand(0x70);         // コントラストを指定(下位4ビット)
        WriteCommand(0x56);         // コントラストを指定 (上位4ビット)
        WriteCommand(0x6c);         // フォロワーコントロール
        WriteCommand(0x38);         // 標準機能セットに戻す
        WriteCommand(0x0c);         // 表示オン

        WriteCommand(0x01);         // 表示クリア
        WriteCommand(0x06);         // カーソルと表示のシフト設定
        WriteCommand(0x0c);         // カーソルとブリンクの表示をオフ

        Thread.Sleep(100);
    }

    public void Print(string msg)
    {
        for (var i = 0; i < msg.Length; i++)
        {
            WriteCharactor((byte)msg[i]);
        }
    }

    // 表示クリア
    public void Clear()
    {
        WriteCommand(0x01, 5);      // Clear Displayはウェイトが必要
    }

    // カーソルを初期位置に戻す
    public void Home()
    {
        WriteCommand(0x02, 5);      // Return Homeはウェイトが必要
    }

    public void DisplayOn(bool displayOn)
    {
        ControlDisplay(displayOn, _cursorOn, _blinkOn);
        _displayOn = displayOn;
    }

    // カーソル表示オン・オフを切り替える
    public void CursorOn(bool cursorOn)
    {
        ControlDisplay(_displayOn, cursorOn, _blinkOn);
        _cursorOn = cursorOn;
    }

    // カーソル位置のブリンクのオン・オフを切り替える
    public void BlinkOn(bool blinkOn)
    {
        ControlDisplay(_displayOn, _cursorOn, blinkOn);
        _blinkOn = blinkOn;
    }

    public void SetCursor(int row, int col)
    {
        var addr = (byte)(((byte)row) << 6) + (byte)col;
        WriteCommand((byte)(0x80 | addr));
    }

    private void ControlDisplay(bool displayOn, bool cursorOn, bool blinkOn)
    {
        var cmd = (byte)0x08;
        if (displayOn)
            cmd |= 0x04;
        if (cursorOn)
            cmd |= 0x02;
        if (blinkOn)
            cmd |= 0x01;

        WriteCommand(cmd, _commandWait);
    }

    public void WriteCharactor(byte data)
    {
        // AQM0802A は拡張機能セットを使うので 0x40
        // 標準機能セットの場合は 0x80
        RegWrite((byte)0x40, data);
    }

    public void WriteCommand(byte cmd, int wait = 1)
    {
        var reg = (byte)0x00;
        RegWrite(reg, cmd);
        Thread.Sleep(wait);
    }
}

アプリケーションのコード例

アプリケーションのコード例は以下の通り。

public class Program
{
    private const ushort Adxl345Address = 0x1d;     // ADXL345のアドレス
    private const ushort Aqm0802AAddress = 0x3e;    // AQM0802A-RN-GBWのアドレス
    private const int DefaultClockRateKhz = 100;    // 転送速度 (KHz)
    private const int Timeout = 1000;               // 送受信ごとのタイムアウト

    public static void Main()
    {
        var prog = new Program();
        prog.Run();
    }

    private void Run()
    {
        var accel = new Adxl345(Adxl345Address, DefaultClockRateKhz, Timeout);
        var lcd = new Aqm0802A(Aqm0802AAddress, DefaultClockRateKhz, Timeout);

        while (true)
        {
            Int16 x;
            Int16 y;
            Int16 z;

            accel.Measure();
            accel.GetXYZ(out x, out y, out z);

            lcd.Clear();
            lcd.Print(x.ToString() + "," + y.ToString());
            lcd.SetCursor(1, 0);
            lcd.Print(z.ToString());

            Thread.Sleep(1000);
        }
    }
}

加速度センサーの使い方、キャラクターディスプレイの使い方が分かれば、(当然ですが)特に不思議なところも難しいところもないですね。


結線

結線は以下の通り。

I2C モジュールは信号線をパーティーライン状に接続するだけです。通信時にモジュールのアドレスが含まれているので(.NET Micro Framework では隠蔽されていますが)、どちらに対しても正しくデータを送受信できます。

WP_20160118_10_17_03_Pro2016-01-18 16-06-59