Tiny CLR OSが対応するボードのMPU

ボードの購入や、ポーティングの参考になればと思い、Tiny CLR OSが対応しているボードのMPUについて調べてみました。

対象はTinyCLR-PortsのDevices配下にあるもの。

FEZ

Arduinoピン互換のボードです。

カタログサイトには、"FEZ"という名前のArduinoフォームファクタが3つあり、どれを指しているのか分かりません。

f:id:matsujirushix:20170802213648p:plain

それぞれのボードの回路図を見ると、FEZ LemurはSTM32F40x、FEZ Panda IIIはSTM32F427XX、FEZ Cobra IIIはLPC1788でした。(FEZ Cobra IIIはG120モジュールが載っていて、G120モジュールのデータシートから分かりました。)

docsのmbedについて書いてあるところにNucleo-F401REと同じMPUと書いてあるので、ボードはFEZ LemurSTM32F401と思われます。

FEZCerberus

.NET Gadgeteerのボードです。

f:id:matsujirushix:20170802220035p:plain

回路図を見ると、MPUはSTM32F40X。

tinyclr.jpによるとSTM32F405らしい。

G30

チップ単体の製品。SoCというカテゴリーのようです。

f:id:matsujirushix:20170802220642p:plain

データシートによると、STM32F401

G80

G30と同様、SoC。

f:id:matsujirushix:20170802220733p:plain

データシートによると、STM32F427

Netduino 3

Arduinoピン互換でありながら、.NET Gadgeteerも接続できるボードです。

f:id:matsujirushix:20170802221727p:plain

回路図を見ると、STM32F427

Quail

mikro BUSのボードです。(これ初めて知りました。)

f:id:matsujirushix:20170803084734p:plain

mikro BUSに接続できるモジュールはClick Boardsらしく、すでに大量のモジュールが販売されています。

shop.mikroe.com

Specificationによると、STM32F427

まとめ

ボード MPU
FEZ STM32F401
FEZcerberus STM32F405
G30 STM32F401
G80 STM32F427
Netduino3 STM32F427
Quail STM32F427

TinyCLR OS ファームウェアビルド手順

環境構築して、デジタル出力の次は、デジタル入力…が普通だと思いますが、めっちゃポーティング欲が出てきているので、そっちへ向かいましょう!

kotobank.jp

やり方は、Porting TinyCLRに簡潔に書かれています。これにそってやりたいと思います。

TinyCLRをクローン

githubに挙がっているTinyCLRをローカルにcloneします。

git clone https://github.com/ghi-electronics/TinyCLR-Ports

f:id:matsujirushix:20170730215839p:plain

GCCをインストー

GNU ARM Embedded ToolchainからGCCをダウンロード、インストールします。

今回は、gcc-arm-none-eabi-6-2017-q2-update-win32.exeをダウンロードして、起動することでインストールします。

f:id:matsujirushix:20170730220529p:plain

デフォルトだと、C:\Program Files (x86)\GNU Tools ARM Embedded\6 2017-q2-update フォルダにインストールされます。

f:id:matsujirushix:20170730220850p:plain

CMSISを配置

ARM.CMSIS.4.3.0.packをダウンロードして、拡張子を.zipに変更、中身をTinyCLRのCMSIS配下に配置します。

ARM.CMSIS.4.3.0.packには、このように入っているので、 f:id:matsujirushix:20170730221311p:plain

C:\TinyCLR\TinyCLR-Ports\CMSIS に配置します。 f:id:matsujirushix:20170730221752p:plain

TinyCLR Coreライブラリを配置

TinyCLR-PortsreleasesからTinyCLR_Core.0.5.0.zipをダウンロード、中身をTinyCLRのCore配下に配置します。

f:id:matsujirushix:20170730222158p:plain

よっしゃ、ビルドするぞー

コマンドプロンプトを立ち上げて、gcc環境変数設定バッチファイルを起動します。

"C:\Program Files (x86)\GNU Tools ARM Embedded\6 2017-q2-update\bin\gccvar.bat"

f:id:matsujirushix:20170730222418p:plain

次に、カレントディレクトリをクローンしたところに変更。

cd C:\TinyCLR\TinyCLR-Ports

そして、ビルドのバッチファイルを起動!

build.bat FEZ

f:id:matsujirushix:20170730222854p:plain

引数はFEZ, G30, G80, FEZCerberus, Netduino3, Quailが指定できます。 詳しくはbuild.batの中身を見てください。

おおーー!!

f:id:matsujirushix:20170730223030p:plain

最後に

NETMFと比べて、非常に簡単。特にハマるところは無いでしょう。

それにしてもビルドが速い。Coreの部分が事前にビルドされているから当たり前といえばそうですけど。

LLILUMの何時間もビルドした結果、エラーとか体感していると幸福感ありますw

TinyCLR OS デジタル出力

TinyCLR OSでデジタル出力を試しました。

環境は下記で作ったものを使用します。

matsujirushi.hatenablog.jp

デジタル出力のやり方は、General Purpose Input Output (GPIO)に丁寧に書かれています。素晴らしい。

パッケージソースに追加

デジタル出力するには、プロジェクトにGHIElectronics.TinyCLR.Devices.Gpioのnugetパッケージをインストールする必要があります。

しかし、TinyCLR OSがアルファ版のためか、まだnuget.orgにはアップされていません。

f:id:matsujirushix:20170726212624p:plain

そのため、適当なフォルダに.nupkgを置いて、パッケージソースにそのフォルダを追加することで、インストール可能にします。

ここからダウンロードできる、TinyCLR_Libraries.0.5.0.zipを適当なフォルダに解凍して、Visual Studioのパッケージソースに追加します。

f:id:matsujirushix:20170726213030p:plain

ライブラリをインストー

そして、プロジェクトにGHIElectronics.TinyCLR.Devicesをインストールします。

f:id:matsujirushix:20170726213434p:plain

Windows IoT Coreでお馴染みの、GpioControllerやGpioPinが含まれていますね。

f:id:matsujirushix:20170726213635p:plain

コーディング

プログラムはこんな感じ。

using GHIElectronics.TinyCLR.Devices.Gpio;
using System;
using System.Threading;

namespace TinyCLRApplication1
{
    class Program
    {
        static int PinNumber(char port, byte pin)
        {
            if (port < 'A' || port > 'E') throw new ArgumentException();
            return ((port - 'A') * 16) + pin;
        }

        static void Main()
        {
            for (;;)
            {
                GpioPin led = GpioController.GetDefault().OpenPin(PinNumber('D', 15));
                led.SetDriveMode(GpioPinDriveMode.Output);

                while (true)
                {
                    led.Write(GpioPinValue.High);
                    Thread.Sleep(100);
                    led.Write(GpioPinValue.Low);
                    Thread.Sleep(100);
                }
            }
        }
    }
}

実行

青色LEDが点滅すれば成功です。

f:id:matsujirushix:20170727224540p:plain

TinyCLR OS 環境構築方法

.NET MicroFrameworkが実質開発ストップしていますが、GHI Electronicsが分岐してシンプルにして(?)TinyCLR OSとして整備しているようです。

まだアルファ版ではありますが、現在公開されているTinyCLR OSの環境構築が上手くできたので、手順を書き留めておきます。

TinyCLRは未だアルファ版なので、リンクが切れたり手順が変更になったりする可能性があります。ご了承ください。

わたしの環境

作業前の、わたしのパソコン環境は次のとおりです。

使用するデバイスはSTM32F4 Discoveryです。

  • STM32F4 Discovery(STM32F407)

また、STM32F4 Discoveryに書き込むときに使用するdfu-utilは既にセットアップされていました。

必要なファイルをダウンロード

必要なファイルは次の3つです。

VisualStudio拡張

GHIElectronics.TinyCLR.VisualStudio.0.5.0.vsixです。

Tiny CLR Release Notesの0.5.0 on 2017-07-07をクリックした先のページでここからダウンロードできます。

ファームウェア

TinyCLR_Firmware.0.5.0.zipです。

Tiny CLR Release Notesの0.5.0 on 2017-07-07をクリックした先のページでここからダウンロードできます。

Windowsデバイスドライバ

GHI_TinyCLR_Interface.zipです。

フォーラムの回答からダウンロードできます。

VisualStudio拡張をインストー

GHIElectronics.TinyCLR.VisualStudio.0.5.0.vsixをダブルクリックで起動します。あとは画面の指示に従えばOKです。

f:id:matsujirushix:20170722211953p:plain

Visual Studio 2015も入っていたのに、Visual Studio 2017しか表示されていないので、どうやらVisual Studio 2017にしか対応していないようです。

f:id:matsujirushix:20170722212012p:plain

インストール完了後、Visual Studio拡張機能と更新プログラムで確認すると、TinyCLR OS Project Systemが追加されたことがわかります。

f:id:matsujirushix:20170722212159p:plain

プロジェクトの新規作成画面には、TinyCLRが追加されています。

f:id:matsujirushix:20170722212304p:plain

バイスとの接続方法はUSB/Serial/TCPIP。このあたりはNETMFのままですね。

f:id:matsujirushix:20170722212616p:plain

ファームウェアをデバイスにインストー

ここのやり方が分からず苦労しました。

STM32F4 Discoveryは、TinyCLR_Firmware.0.5.0.zipに含まれている、GHI Bootloader(FEZ Bootloader.2.0.3.dfu)をdfu-utilなどでフラッシュメモリに書き込み、そしてTeraTermなどでGHI Bootloaderに接続してファームウェアFEZ Firmware.0.5.0.glb)を転送します。

GHI Bootloaderの書き込み

STM32F4 DiscoveryをDFUモードで立ち上げます。下図のように、ボードの裏にあるJP2のジャンパーピンを外して、BOOT0とVDDを短絡します。

f:id:matsujirushix:20170723213030p:plain

そして、パソコンとUSB接続します。

ここはちょっとコツが必要で、STM32 DiscoveryのminiUSB(CN1)とmicroUSB(CN5)をUSB-HUBに接続しておき、USB-HUBをパソコンに接続して、両方のUSBを同時に接続しないといけないようです。(都市伝説なのかも?)

バイスマネージャにSTM32 BOOTLOADERが表示されれば成功です。

f:id:matsujirushix:20170723214345p:plain

そして、dfu-utilなどを使って、FEZ Bootloader.2.0.3.dfuフラッシュメモリに書き込んでください。

C:\>dfu-util -l
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

Found DFU: [0483:df11] ver=2200, devnum=7, cfg=1, intf=0, path="1-1.4", alt=3, name="@Device Feature/0xFFFF0000/01*004 e", serial="3259375D3036"
Found DFU: [0483:df11] ver=2200, devnum=7, cfg=1, intf=0, path="1-1.4", alt=2, name="@OTP Memory /0x1FFF7800/01*512 e,01*016 e", serial="3259375D3036"
Found DFU: [0483:df11] ver=2200, devnum=7, cfg=1, intf=0, path="1-1.4", alt=1, name="@Option Bytes  /0x1FFFC000/01*016 e", serial="3259375D3036"
Found DFU: [0483:df11] ver=2200, devnum=7, cfg=1, intf=0, path="1-1.4", alt=0, name="@Internal Flash  /0x08000000/04*016Kg,01*064Kg,07*128Kg", serial="3259375D3036"

C:\>dfu-util -a 0 -D "FEZ Bootloader.2.0.3.dfu"
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

Match vendor ID from file: 0483
Match product ID from file: 0000
Opening DFU capable USB device...
ID 0483:df11
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuERROR, status = 10
dfuERROR, clearing status
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash  "
file contains 1 DFU images
parsing DFU image 1
image for alternate setting 0, (1 elements, total size = 14744)
parsing element 1, address = 0x08000000, size = 14736
Download        [=========================] 100%        14736 bytes
Download done.
done parsing DfuSe file

C:\>

書き込みが完了したら、パソコンからUSB-HUBを外してJP2のジャンパーピンを元に戻します。

ファームウェアの書き込み

再び、USB-HUBをパソコンに接続すると、COMが2つ表示されるので、下の方にTeraTermで接続します。

f:id:matsujirushix:20170726210754p:plain

COMが1つしか表示されないときは、GHI Bootloaderがすでにフラッシュメモリに存在するプログラムを起動しています。 このような場合は、PA15をGNDに繋ぎながらパソコンに接続すると、プログラム起動を抑止してCOMが2つ表示されます。

TeraTermで接続したGHI Bootloaderで、Uを入力してからFEZ Firmware.0.5.0.glbをXMODEMで送信します。送信のときに、オプションの1Kにチェックを付けてください。

HI Electronics, LLC Bootloader
-------------------------------
OK.
Are you sure (Y/N)?
Waiting...
CCCCCCCCCCCCCCCCCCCCCCCCCCCCC
OK.

f:id:matsujirushix:20170726211126p:plain

再び、USB-HUBを外して、USB-HUBをパソコンに接続すると、FEZという不明なデバイスが表示されればOKです。

f:id:matsujirushix:20170723222107p:plain

Windowsデバイスドライバをインストー

GHI_TinyCLR_Interface.zipを適当なフォルダに解凍しておき、さきほどのFEZという不明なデバイスどのドライバ更新でzip解凍先を指定します。

f:id:matsujirushix:20170723222334p:plain

f:id:matsujirushix:20170723222350p:plain

FEZのビックリマークが消えればOKです。

f:id:matsujirushix:20170723222538p:plain

Visual Studioから認識できるか確認

適当にTinyCLRプロジェクトを新規作成して、プロジェクトのプロパティにあるDeviceにFEZ_FEZと表示されれば、デバイスがきちんと認識できています。

f:id:matsujirushix:20170723222738p:plain

最後に

とりあえずデバイスをセットアップすることができました。

次は、GPIOのやり方を確認したいと思います。

TinyCLR OS触り始めました(途中で挫折編)

TinyCLR OSが良い感じになってきているようなので、動かしてみました。

TinyCLR OSをダウンロード

TinyCLR OSのReleasesにある、0.4.0 on 2017-05-10をクリックして、TinyCLR.0.4.0.zipをダウンロードします。

f:id:matsujirushix:20170722171904p:plain

中身は、デバイスに入れるブートローダー.binとVisualStudio拡張.vsix、nugetパッケージ.nupkg。.ghiというのがありますが詳細不明。

  • G120 Bootloader.2.0.2.ghi
  • G120 Firmware.0.4.0.ghi
  • G30 Firmware.0.4.0.ghi
  • G400 Bootloader.2.0.2.bin
  • G400 Firmware.0.4.0.ghi
  • G80 Firmware.0.4.0.ghi
  • GHIElectronics.TinyCLR.BrainPad.0.4.0.nupkg
  • GHIElectronics.TinyCLR.Core.0.4.0.nupkg
  • GHIElectronics.TinyCLR.Devices.0.4.0.nupkg
  • GHIElectronics.TinyCLR.Drawing.0.4.0.nupkg
  • GHIElectronics.TinyCLR.Pins.0.4.0.nupkg
  • GHIElectronics.TinyCLR.Storage.0.4.0.nupkg
  • GHIElectronics.TinyCLR.VisualStudio.0.4.0.vsix
  • License.txt

VisualStudio拡張をインストー

GHIElectronics.TinyCLR.VisualStudio.0.4.0.vsixをダブルクリックしてインストールします。

f:id:matsujirushix:20170722173427p:plain

本PCはVisual Studio 2015もインストールしてありますが、一覧に表示されていないところをみると、Visual Studio 2017専用のようです。

インストールボタンをクリックすればOK。

f:id:matsujirushix:20170722173553p:plain

VisualStudioはどう拡張されたのか

プロジェクト新規作成のテンプレートに、TinyCLRが追加されました。

f:id:matsujirushix:20170722174253p:plain

試しに、TinyCLR Applicationプロジェクトを新規作成してみると、こんな感じ。

f:id:matsujirushix:20170722174038p:plain

GHIElectronics.TinyCLR.Coreを参照しているだけ(笑)。とってもシンプル。

ビルドしてみると一瞬で完了します。そりゃそうですね。

バイスとの接続を設定できるよう、プロジェクトのプロパティにTinyCLR OSが追加されています。中身はNETMFのソレと同じで、接続方法にUSB,Serial,TCP/IPの選択が表示されました。

f:id:matsujirushix:20170722174643p:plain

で、デバイスは?

VisualStudio側がシンプルなのは十分わかりました。

では、デバイスはどうすれば良いのでしょうか。

既出のTinyCLR.0.4.0.zipに、G30,G80,G120,G400のファームウェアっぽいものが入っています。

GHI Catalogによると、これらはSTM32,LPC,SAMのようです。

f:id:matsujirushix:20170722180848p:plain

うーむ、どれも持っていない…。

STM32F4 Discoveryが対応しているっぽいので、マルツで買ってきました。(また基板が増えてしまった。)

f:id:matsujirushix:20170722183627p:plain

STM32F407なので、きっとG80 Firmware.ghiを入れるんだろうと思いながらも、拡張子.ghiなのが気がかり。 STM32 Bootloaderの手順に従って、DfuSe USB device firmware upgrade STMicroelectronics extensionをダウンロード、インストールすることに。

f:id:matsujirushix:20170722202054p:plain

f:id:matsujirushix:20170722202207p:plain

f:id:matsujirushix:20170722202224p:plain

f:id:matsujirushix:20170722202241p:plain

f:id:matsujirushix:20170722202316p:plain

と、ここまでやったところで、Tiny CLR OS 0.5.0のダウンロードを発見した。

振出しに戻る。

つづく。

Unity 3Dの.NETバージョンが謎すぎるので調査中

HoloLensの開発にUnityを使っていますが、UWPであるにもかかわらず、nugetが使えなかったり、UWP固有の呼び出しができなかったりして謎すぎるので調べています。

現時点では全てが明確に判明したわけではないです。気づいた点があればコメントいただけると嬉しいです。

使用している環境

ビルドと実行環境のタイミング

UnityのScriptのビルドと実行環境は、次のものがあります。

  • UnityからScriptの編集
  • Unityで実行
  • Visual StudioからUnityにプロセスアタッチしてデバッグ
  • UnityからBuild
  • Build出力のビルドと実行

さらに、Unityからリモート実行とか、HoloLensエミュレータで実行とかあるようですが未確認。

それぞれについて、フレームワークに何が使われているか調べてみました。

UnityからScriptの編集

UnityからScriptをOpenした状態。 プロジェクトフォルダ直下にある.sln, .csprojを開いたVisual Studio

f:id:matsujirushix:20170608175513p:plain

Unityで実行

Unityで再生マークを押して実行している状態。 f:id:matsujirushix:20170608175725p:plain

Visual StudioからUnityにプロセスアタッチしてデバッグ

UnityからScriptの編集で立ち上がったVisual Studioを実行すると、Unityにプロセスアタッチします。 なので、Visual Studioで実行してから、Unityで実行すると、Unityで実行している状態をVisual Studioデバッグすることができます。

UnityからBuild

UnityのBuild SettingsでBuildボタンをクリックしてビルドすること。

f:id:matsujirushix:20170608180055p:plain

Build出力のビルドと実行

UnityからBuild時に指定したフォルダに作成された、.slnを開いたVisual Studio。 (Unity C# Projectsをチェックしている場合は編集できたり、)ビルドしてHoloLensにデブロイ、リモート実行すること。

調べ方

(そのうち書く!m(__)m)

結果

状況 フレームワーク
UnityからScriptの編集 .NET3.5 / .NET4.6
Unityで実行 mono(.NET2系)っぽい
Visual StudioからUnityにプロセスアタッチしてデバッグ mono(.NET2系)
UnityからBuild UWP(UAP)っぽい
Build出力のビルドと実行 UWP(UAP)

【メモ】Visual Studio Code + Nucleo-L476RG

Wataraiさんが分かりやすい記事をアップしました。そちらが分かりやすいです。

VSCodeでSTM32マイコンのデバッグ環境を構築する

手順の精査は必要ですが、とりあえず動いたのでメモ。

  • OpenOCDを使う。(NucleoはST-LinkなのでpyOCDはダメ)
  • OpenOCDはコマンドラインで事前に起動しておく。(VSCodeからのlaunchだと、なぜかVSCodeからGDBサーバーへ接続しようとしない。)
  • VSCodeからのGDBサーバー起動は無し。(launch.jsonのdebugServerPathを削除)

OpenOCD起動コマンド

C:\OpenOCD\openocd.exe -s C:\OpenOCD\tcl -f board\st_nucleo_l476rg.cfg -c init -c "reset init"