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

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

  • 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"

Windows-Remote-Arduinoをデバッグする

nugetにある、Windows-Remote-Arduinoのソースは、githubで公開されている。

github.com

github.com

githubから取得したソースがなかなかビルドできなかったので、手順をメモします。

  1. git clone remote-wiring … recursiveは不要
  2. git clone serial-wiring
  3. Visual Studio 2017でUWPアプリを新規作成
  4. ソリューションに、remote-wiringのMicrosoft.Maker.FirmataとMicrosoft.Maker.RemoteWiringを追加
  5. ソリューションに、serial-wiringのMicrosoft.Maker.Serialを追加
  6. UWPアプリから、Serial, Firmata, RemoteWiringを参照設定

remote-wiringからserial-wiringを参照しているパスがsubmoduleのパスではない。 Visual Studio 2017を使わないといけない。ところがポイント。

Visual Studio Codeでmbed OSプログラムをデバッグする方法

Debugging mbed OS applications with Visual Studio Codeをやってみた備忘録です。 github.com

基本的には、この手順通りですが、(現在は)いくつかハマりポイントがあったので、書いておきます。

環境は、

です。

Nucleo-L476RGをデバッグしたかったのですがpyOCDが対応していない、mbed LPC1768はGCC (ARM Embedded)向けのエクスポートが無い、ことから、FRDM-K64Fを使いました。Nucleoやmbed LPC1768については、機会があれば書きたいと思います。

ソフトウェアのインストール

Toolchain

C/C++コンパイラ

GNU ARM Embedded Toolchainをインストールします。

わたしの環境は、既に4.9 2015q3をインストールしていたので、特に何もしませんでした。

4.9-2015-q3-update : Series 4.9 : GNU ARM Embedded Toolchain

インストール先はC:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2015q3で、環境変数PATHにC:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2015q3\binを追加しています。 f:id:matsujirushix:20170430144048p:plain

makeコマンド

mbedからMakefileが提供されていますが、GNU ARM Embedded Toolchainにmakeコマンドが含まれていないので、追加でインストールします。

GnuWin32に含まれている下記ファイルを、C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2015q3\binにコピーします。

sourceforge.net

コピーするファイル名 含まれているzipファイル名
make.exe make-3.81-bin.zip
libiconv2.dll make-3.81-dep.zip
libintl3.dll make-3.81-dep.zip

Debug toolchain

OCD(On-Chip Debugger)

ボードに合わせて、pyOCDもしくはOpenOCDをインストールします。(OpenOCDは、ビルド作業が必要だったり、設定ファイルを書かなければいけないようです。)

今回のFRDM-K64FはpyOCDが対応していますので、pyOCDをインストールします。

pyOCD

pyOCDは、Python 2.7系をインストールしてから、pipコマンドでインストールします。

www.python.org

> C:\Python27\Scripts\pip install pyocd

f:id:matsujirushix:20170430172233p:plain

Visual Studio Code

Visual Studio Codeをインストールします。

code.visualstudio.com

なお、PATHへの追加は不要なので、チェックを外しました。

f:id:matsujirushix:20170430173501p:plain

次に、拡張機能C/C++をインストールします。

f:id:matsujirushix:20170430173515p:plain

ソフトウェアの確認

mbed OSプログラム

動かしてみるプログラムを用意します。

mbedオンラインコンパイラでmbed OS Blinky LED HelloWorldを作成して、GCC (ARM Embedded)向けにエクスポート、適当なフォルダに解凍します。

f:id:matsujirushix:20170430145933p:plain f:id:matsujirushix:20170430150104p:plain f:id:matsujirushix:20170430151656p:plain

Toolchain

mbed OSプログラムのフォルダでmakeコマンドを実行して、コンパイルできるか確認します。

> make
C:/Users/takashi/Desktop/mbed-os-example-blinky/makefile:615: warning: overriding commands for target `.s.o'
C:/Users/takashi/Desktop/mbed-os-example-blinky/makefile:610: warning: ignoring old commands for target `.s.o'
"Compile: main.cpp"
"Compile: AnalogIn.cpp"
...
"Compile: rtc_api.c"
"Compile: sleep.c"
../mbed-os/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/api/sleep.c: In function 'hal_deepsleep':
../mbed-os/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/api/sleep.c:31:16: warning: unused variable 'mode' [-Wunused-variable]
     mcg_mode_t mode = CLOCK_GetMode();
                ^
"link: mbed-os-example-blinky.elf"
'arm-none-eabi-objcopy' -O binary mbed-os-example-blinky.elf mbed-os-example-blinky.bin
"===== bin file ready to flash: BUILD/mbed-os-example-blinky.bin ====="
'arm-none-eabi-objcopy' -O ihex mbed-os-example-blinky.elf mbed-os-example-blinky.hex

>

mbed-os-example-blinky.elfが出来上がっていればOKです。

pyOCD

FRDM-K64FをUSB接続しておき、pyocd-gdbserverを起動してGDB serverがスタートするか確認します。

> c:\Python27\Scripts\pyocd-gdbserver.exe
INFO:root:DAP SWD MODE initialised
INFO:root:K64F not in secure state
INFO:root:ROM table #0 @ 0xe00ff000 cidr=b105100d pidr=4000bb4c4
INFO:root:[0]<e000e000:SCS-M4 cidr=b105e00d, pidr=4000bb00c, class=14>
WARNING:root:Invalid coresight component, cidr=0x0
INFO:root:[1]<e0001000: cidr=0, pidr=0, component invalid>
INFO:root:[2]<e0002000:FPB cidr=b105e00d, pidr=4002bb003, class=14>
WARNING:root:Invalid coresight component, cidr=0xb1b1b1b1
INFO:root:[3]<e0000000: cidr=b1b1b1b1, pidr=b1b1b1b1b1b1b1b1, component invalid>
WARNING:root:Invalid coresight component, cidr=0x0
INFO:root:[4]<e0040000: cidr=0, pidr=0, component invalid>
INFO:root:[5]<e0041000:ETM-M4 cidr=b105900d, pidr=4000bb925, class=9, devtype=13, devid=0>
INFO:root:[6]<e0042000:ETB cidr=b105900d, pidr=4003bb907, class=9, devtype=21, devid=0>
INFO:root:[7]<e0043000:CSTF cidr=b105900d, pidr=4001bb908, class=9, devtype=12, devid=28>
INFO:root:CPU core is Cortex-M4
INFO:root:FPU present
INFO:root:6 hardware breakpoints, 4 literal comparators
INFO:root:4 hardware watchpoints
INFO:root:Telnet: server started on port 4444
INFO:root:GDB server started at port:3333

GDB server started"と表示されていればOKです。

pyOCDはVisual Studio Codeから都度起動されるので、Ctrl+Cで止めておいてください。

Visual Studio Codeでmbed OSプログラムをデバッグ

Makefileの修正

mbedで作成されたMakefileは、オプションが最適化ありになっているので、デバッグできるよう最適化を無効にします。

■変更前

CPP = ‘arm-none-eabi-g++’ ‘-std=gnu++98’ ‘-fno-rtti’ ‘-Wvla’ ‘-c’ ‘-Wall’ ‘-Wextra’ ‘-Wno-unused-parameter’ ‘-Wno-missing-field-initializers’ ‘-fmessage-length=0’ ‘-fno-exceptions’ ‘-fno-builtin’ ‘-ffunction-sections’ ‘-fdata-sections’ ‘-funsigned-char’ ‘-MMD’ ‘-fno-delete-null-pointer-checks’ ‘-fomit-frame-pointer’ ‘-Os’ ‘-mcpu=cortex-m4’ ‘-mthumb’ ‘-mfpu=fpv4-sp-d16’ ‘-mfloat-abi=softfp’

■変更後

CPP = ‘arm-none-eabi-g++’ ‘-std=gnu++98’ ‘-fno-rtti’ ‘-Wvla’ ‘-c’ ‘-Wall’ ‘-Wextra’ ‘-Wno-unused-parameter’ ‘-Wno-missing-field-initializers’ ‘-fmessage-length=0’ ‘-fno-exceptions’ ‘-fno-builtin’ ‘-ffunction-sections’ ‘-fdata-sections’ ‘-funsigned-char’ ‘-MMD’ ‘-fno-delete-null-pointer-checks’ ‘-fomit-frame-pointer’ ‘-O0’ ‘-ggdb’ ‘-mcpu=cortex-m4’ ‘-mthumb’ ‘-mfpu=fpv4-sp-d16’ ‘-mfloat-abi=softfp’

オプション変更は十分吟味されていません。お気づきの点があればコメントください。

Makefileを修正したので、再度、全てをビルドし直す必要があります。BUILDフォルダを削除しておきましょう。

Visual Studio Codeの構成を設定

mbed OSプログラムのフォルダに、vscode.zipを展開します。

Visual Studio Codeの構成は、.vscode/settings.json, .vscode/tasks.json, .vscode/launch.json ファイル。

1drv.ms

mbed handbookには、Visual Studio Code向けにエクスポートすると、構成が正しく設定されているっぽいのですが、現在はVisual Studio Code向けの選択肢が表示されませんでした。

ググったところ、github(参考)に構成ファイルがありましたので、これを修正してvscode.zipを作りました。

デバッグの開始

Visual Studio Codeで、デバッグの開始を実行します。

f:id:matsujirushix:20170430182048p:plain

プログラムに問題なくても、わりと高い確率でmakeがエラーになります。焦らず、何度もデバッグの開始を実行しましょう。(汗

気分良くビルドしたい場合は、コマンドプロンプトからmakeを実行してください。

最後に

Visual Studio Codeにインクルードパスを指定していないため、せっかくVisual Studio Codeを使っているのにIntelliSenseがきちんと動作していない。Visual Studio Codeに何か設定が必要なのだろう。

mbed handbookに手順書があったのでVisual Studio Codeを使ったが、Mac/Linux使っておらず、普段はVisual Studio Proを使っているので、Visual Studioでコレをできるようにしたい。

参考

qiita.com

github.com

Arduino Pro Mini互換機とUSBシリアル変換モジュールの結線

Arduino Pro Mini互換機USBシリアル変換モジュールの結線に迷ったのでメモします。

Arduino Pro Mini互換機

AliExpressのこちらf:id:matsujirushix:20170408132159j:plain

現物写真。 f:id:matsujirushix:20170408133002j:plain

プログラム書き込み用の端子は、左から、

ピン番号 名称
1 GND
2 GND
3 VCC
4 RXI
5 TXD
6 DTR

となっています。

USBシリアル変換モジュール

AliExpressのこちらf:id:matsujirushix:20170408134417j:plain

現物写真。 f:id:matsujirushix:20170408133313j:plain

端子は、左から、

ピン番号 名称
1 GND
2 CTS
3 VCC
4 TXD
5 RXI
6 DTR

となっています。

結線

単純に、順番に結線すればOKでした。 f:id:matsujirushix:20170408134222j:plain

変換ピン番号 変換名称 配線色 Arduino互換ピン番号 Arduino互換名称
1 GND 1 GND
2 CTS (不要) 2 CTS
3 VCC 3 VCC
4 TXD 4 TXD
5 RXI 5 RXI
6 DTR 6 DTR

おまけ①

ピン番号 Arduino名称 ATmega328名称 Arduino互換名称
1 BLK GND GND
2 GND GND CTS
3 VCC VCC VCC
4 RXI RXD TXD
5 TXD TXD RXI
6 GRN -> RESET# DTR

また、公式と互換機は、ピンの並び順が逆なので注意が必要!

おまけ②

Arduino Pro Mini互換機を付け替えしやすいよう、テストプローブを検討していましたが、良さそうなものが手に入らなかったのでスルーホール用テストワイヤを使いました。 f:id:matsujirushix:20170408135015j:plain

f:id:matsujirushix:20170408135128j:plain

どれくらい耐久性あるんだろう。ちょっと心配。

EAGLEにInkscapeの図形を入れる

Inkscapeで描いた図形(ベクターデータ)を、できるだけ劣化が無いようにEAGLEへ入れる方法です。

InkscapeはPOLYLINEやLWPOLYLINE,SPLINE、EAGLEはPOLYGON。 Inkscapeで曲線をどうやってPOLYLINEにするのか?EAGLEでどうやって(WIREではなく)POLYGONに取り込むのか、がポイント。

環境

概要

  • Inkscape
    • SVGファイルに保存
    • パスに変換、グループを解除
    • 図形を拡大
    • 中抜け部分を分割
    • 曲線を直線に変換
    • 図形を縮小
    • DXFファイルに保存
  • EAGLE
    • DXFファイルを読み込み

題材

Inkscapeのテキストツールで「まつじるし」を作成。 フォントはHGMaruGothicMPRO。文字間隔を-10に。大きさは適当。

f:id:matsujirushix:20170319120932p:plain

ベクターデータを確認するために、フィルをグレー、ストロークを青にすると、こんな感じ。

f:id:matsujirushix:20170319121042p:plain

Inkscapeの操作

SVGファイルに保存

以降の操作でやり直しするかもしれません(する場合のが多いかも?)ので、最初にSVGファイルで保存しておきます。

f:id:matsujirushix:20170319130354p:plain

パスに変換、グループを解除

オブジェクトは、全てパスに変換して、グループを解除します。 選択ツール(F1)にして、編集 > すべて選択(Ctrl+A)で全オブジェクトを選択した後に、パス > オブジェクトをパスへオブジェクト > グループ解除を実行します。

ノードツール(F2)の編集 > すべて選択(Ctrl+A)で、このように全てのノードが表示できればOKです。

f:id:matsujirushix:20170319131044p:plain

図形を拡大

次項で変換する際に、できるだけ多くの直線に変換されるよう、図形を大きくしておきます。

選択ツール(F1)にして、編集 > すべて選択(Ctrl+A)で全オブジェクトを選択した後に、マウスで角をドラッグしてサイズを大きくします。ドラッグするときにCtrlを押すと、縦横比が維持されるので便利です。

f:id:matsujirushix:20170319132114p:plain

中抜け部分を分割

EAGLEのポリゴンのネストは中抜けになりません。

「ま」「る」が中抜けしているので、分割します。

矩形ツール(F4)で、中抜け部分が割れるように矩形を追加します。(下図は、見やすいようにフィル無し、ストローク赤にしています。)

f:id:matsujirushix:20170319133924p:plain

「ま」と矩形の順に、Shiftを押しながら複数選択して、パス > 分割を実行します。すると、左側と右側に分割されます。

f:id:matsujirushix:20170319134115p:plain

f:id:matsujirushix:20170319134125p:plain

「ま」「る」を分割した結果はこちら。

f:id:matsujirushix:20170319134212p:plain

曲線を直線に変換

EAGLEのポリゴンに曲線を含めることができないので、曲線を複数の短い直線に変換しておく必要があります。

選択ツール(F1)にして、編集 > すべて選択(Ctrl+A)で全オブジェクトを選択した後に、エクステンション > パスの変形 > ベジエ曲線の平坦化…を実行します。

表示されたダイアログで、平坦度0.1を入力して、適用をクリックします。

f:id:matsujirushix:20170319132525p:plain

ノードツール(F2)の編集 > すべて選択(Ctrl+A)で、このように曲線部分にノードが増えていればOKです。

f:id:matsujirushix:20170319132924p:plain

図形を縮小

上記「図形を拡大」を参考に、図形を実際のサイズに縮小します。

f:id:matsujirushix:20170319134517p:plain

DXFファイルに保存

DXFファイルで保存します。

f:id:matsujirushix:20170319134805p:plain

表示されたダイアログで、線出力のLWPOLYLINEタイプを使用するをチェックして、OKをクリックします。

f:id:matsujirushix:20170319135025p:plain

EAGLEの操作

DXFファイルを読み込み

EAGLEのBoard Editorで、File > Run ULP…を選択し、import-dxf.ulpを開きます。

import-dxf.ulpは、下記からダウンロードしてください。

github.com

f:id:matsujirushix:20170319135504p:plain

表示されたダイアログで、File nameを指定、Scaleを3.779527559055118、Prefer polygon outputをチェックして、OKをクリックします。

Scale = 96 / 25.4

f:id:matsujirushix:20170319183531p:plain

で、Run

f:id:matsujirushix:20170319140228p:plain

結果

でたぁ~。

f:id:matsujirushix:20170319183549p:plain