M5GOのfirmwareをM5Stack用に書き換える(+戻し方)
M5Stack の別バージョンであるM5GOが届いたので遊んでみました。
ただ、そのままの状態だとネット上のM5Stack関連リソースがそのまま使えなかったり、 なんとなく怪しい挙動が多かったので、FirmwareをM5Stack用に切り替えたり、 M5GOの最新版のfirmwareを入れてみたのでその手順をメモ。
firmwareの書き換え方がわかると、リセットしたい時や バージョンアップにも自分で対応できるので安心です。
基本Windows10の話です。
事前準備
USBドライバのインストール
- M5GOをPCにUSB接続しただけでは正常にドライバが入らなかったので、M5StackのサイトからUSBドライバをインストールしました。
- m5stack.comのページ上部のDownloadメニューからダウンロードできます。
Espressif Flash Download Toolsのダウンロード
- firmwareの書き込みには、Espressif Flash Download Toolsを利用しました。
- ここからダウンロードできます。Espressif Flash Download Tools
- 解凍して、ESPFlashDownloadTool_v3.6.4.exeを起動し、ESP32 DownloadTool を選択します。
M5Stackのfirmwareを入れる
M5GOにM5Stackを入れる場合は、githubからM5stack用のfirmwareを入手します。
今回は、ここから、m5cloud-20180516-v0.4.0.binを入手しました。
M5Cloud/firmwares at master · m5stack/M5Cloud · GitHub
ダウンロード出来たら、Espressif Flash Download Toolsに以下のように登録します。
COMポートはCOM3になっていますが、環境によりますのでWindows のデバイスマネージャで調べて適宜変更してください。
そして、M5GOをUSBでPCに接続し、最初にERASEをして完了してから STARTを押してFirmwareを書き換えます。
これで環境。M5Cloudが使えるようになります。
M5GOのfirmwareに戻す
M5GOのfirmwareも同様に github上にあります。M5GOの場合は、イメージファイルも同時に書き込む必要がありました。
ここから、最新版の M5GO/firmware at master · m5stack/M5GO · GitHub
- firmware.bin
- spiffs_image.img
をダウンロードして それぞれ書き込み位置を@0x1000 @0x1b000としてアップロードします。
これで元の状態に戻りました。
試しにM5Cloud上からmicropythonを使ってデジタル時計を組み込んでみた。
github上のサンプルだと中国時間になってしまうので、JSTに変更しただけ
Digital Clock on M5stack JST
Lego Crazy Action Contraptions
- 作者: Doug Stillinger
- 出版社/メーカー: Klutz
- 発売日: 2008/09
- メディア: リング製本
- 購入: 1人 クリック: 2回
- この商品を含むブログを見る
gitでよく使うけど忘れるやつ
- ファイルを指定して、そのファイルを特定のcommitまで戻す
git checkout {戻したいcommmitID} {相対ファイル名}
- 直前のコミット操作を取り消す
git reset --soft HEAD^
- 最新から、<commit>までの差分をarchive zip化
git archive --format=zip --prefix=<ProjectName>/ HEAD `git diff --name-only <commit>` -o archive.zip
- remote のbranchを削除
$ git push --delete origin {branch_name}
- local に新規branch作成
#一覧を取得 git branch -a #作成元のbranchに移動 git checkout {master} #新しいbranchを作成 git checkout -b {new_branch}
- 特定のコミット間の対象フォルダを指定して変更ファイル名の一覧を取得する
git diff --stat --name-only --relative=<対象フォルダ> <commitID1> <commitID2>
.gitignoreを後から追記して、対象フォルダの中身を空っぽにする
git rm -r --cached . git add . git commit git push
- SJISファイルのdiff をサクッと見たい
git diff | iconv -f SJIS
- master の更新を hogebranchに取り込む
※ もし、作業途中のものでcommit出来るものがあればcommitしておく # masterブランチへ移動 git checkout master # git pullでmasterを最新に git pull origin master # 開発用ブランチへ移動 git checkout hogebranch # mergeコマンドでmaserの内容を取り込む git merge origin master
Submodule
- submoduleを消す
git submodule deinit path/to/submodule git rm path/to/submodule
- 強制的にsubmoduleのmaster branchを反映させる
git submodule foreach git pull origin master
UWPのTextBoxでEnterキーでVirtual keyboardを閉じる
UWPの2DビューでIPアドレスなど一行だけ入力したときにEnterで、キーボードを閉じるには自前で以下のような実装をしないといけません。
こんな感じ
hoge.xaml
- XAML側でKeyDownイベントを取得する
- この場合は自作のOnKeyDownHandlerを呼び出しています
<TextBox x:Name="hoge" KeyDown="OnKeyDownHandler" HorizontalAlignment="Left" Margin="166,112,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="189" InputScope="AlphanumericHalfWidth" />
hoge.xaml.cs
- OnKeyDownHandlerでEnterを検知してキーボードを閉じる
- using Windows.System;が必要です。
private void OnKeyDownHandler(object sender, KeyRoutedEventArgs e) { if (e.Key == VirtualKey.Enter) { Windows.UI.ViewManagement.InputPane.GetForCurrentView().TryHide(); } }
カメラキャリブレーションの用語の覚書
なんとなくやっていたカメラキャリブレーションについて 用語の定義など改めて調べてみた。
文末の「参考」にある opencvのドキュメントなどが詳しいのだが 用語がわからないと、理解が進まないので、自分が理解するためのメモ。
Distortion Coefficients (レンズ歪みパラメータ )
- 放射状歪み と 接線歪みを補正するパラメータ
[1 x 4] もしくは [1 x 5] の行列として表現される
放射状歪み(Radial Distortion) は直線が曲線になるような歪み
- 画像中心から離れれば離れるほど歪みは大きくなる。
- k1 , k2, k3として表されることが一般的。
接線歪み(Tangential Distortion)は,レンズと画像平面が完璧に平行になっていないことが原因で生じる歪み。
- ある領域が期待しているよりも近くにあるように見えてしまう。
- p1 , p2として表されることが一般的。
opencvの行列表現では
として表現される。※k3が省略の場合もあり
Intrinsic Parameters (内部パラメータ)
- カメラ固有のパラメータ。カメラ行列とも呼ばれる
- 同じカメラで同じ設定であれば常に同じ
- [3 x 3] の行列として表現される
- 焦点距離
- Focal Length = (fx , fy ) (単位はピクセル)
- 光学中心(主点)
- Principal Point = (cx , cy ) (単位はピクセル)
Extrinsic Parameters (外部パラメータ)
- ある座標系における3次元点の座標を別の座標系での座標に変換するための回転と並進のパラメータを指します.
- マーカーとカメラ間の位置関係などを設定します。
- [3 x 4] の行列として表現される
GML C++ Camera Calibration Toolbox 便利
最近は、GML C++ Camera Calibration Toolboxを使ってキャリブレーションデータを作成しています。 また、マーカーはiPadに表示すると、発光するし、歪みも発生しないし便利。
- GML C++ Camera Calibration Toolboxを使ってみる | Water
- GML C++ Camera Calibration Toolbox | Graphics and Media Lab
参考
HoloLens のDevice Portalにlocalhostで接続するには、Windows SDKが必要
HoloLens のDevice Portalにhttp://localhost:10080 もしくは、http://127.0.0.1:10080/で接続するには、Windows SDKが必要。
良く見たらドキュメントにも書いてあった。
PC に Visual Studio Update 1 と Windows 10 開発者ツールをインストールします。 これで USB 接続が有効になります。
Windows SDKは、全部入れると数ギガになるのだが、 試したところ、USB接続を利用するだけなら「Windows IP over USB」が入っていれば、DevicePortalは利用できた。 これだけなら、1M以下で済む。
知らなくて、非開発用PCを利用した場合にはまったのでメモ。
Unityで利用する c++ のDLLを作成する。(Visual Studio 2017)
基本的に、以下のページにある手順で進めればNative Plugin を作成できるのですが 解説が、VS2013ベースになっているので、Visuai Studio 2017で実施した場合に ハマッた部分を、忘れないうちにスクショ付きでまとめました。
部分的にしか解説してないので、全体は以下のページを参照してください。
- Visual Studio Community 2017
- Unity 2017.3.0f3
- Windows 10 Fall creator update
でやりました。
DLLビルド用のVSプロジェクトの準備
- 既存のソリューションに、DLL作成用のプロジェクトを追加する場合はこんな感じでスタート
2018/8/17追記 VS2017 update 3 ではこの部分がまた変更になっています。 * Visual Studio 2017 Update 3 以降で Win32 プロジェクトが作成できなくなった時の対処法 - Qiita
DLLを作るのですが、この画面では、「c++ のWin32コンソールアプリケーション」を選択。
次に表示されるこの画面で「アプリケーション設定」をクリックして、DLLを選択します。 シンボルのエクスポートも忘れないように。
Unityに出力するなら「SDLのチェック」は外さないといけないらしいです。
で、コードを書く。ここは省略します。
exe形式で実行テスト
同一ソリューション内で、テストのためのexe用プロジェクトを作成したのであれば、 「参照の追加」を行うのが、手っ取り早いです。
ただし、既存の外部DLLやlibを使う場合はこれではダメです。 そのような場合は、以下の3つを設定します。
リンカ >全般>追加のライブラリディレクトリ libフォルダを指定
リンカ >入力 >追加の依存ファイル libファイルを指定
作成したDLLをUnity上で実行する
Unityからは
[DllImport("sample-opencv-dll")] private static extern int CountUp();
Debug.Log(CountUp()); Debug.Log(CountUp()); Debug.Log(CountUp());
のような感じで呼びだすことができます。 「DllImport」にファイル名を書くときは拡張子 (.dll)を含めるとエラーになるので含めません。
libで追加ライブラリを指定した場合は、そのdllもPlugins内に配置しておかないと、
Plugins: Failed to load 'Assets/Plugins/x86_64/xxxxxxxx.dll' with error '指定されたモジュールが見つかりません。 '.
という警告や
DllNotFoundException: Failure has occurred while loading a type.
という例外エラーが発生するので、関連DLLの配置もお忘れなく。
おまけ 既存DLL ( or lib ) の中身を解析する方法
スタートメニューから[開発者コマンド プロンプト for VS2015]を起動する
- DLLのインターフェースを確認する
cd (DLLの場所) dumpbin /exports xxxxx.dll
- dllが32bitか64bitか確認する。
dumpbin /HEADERS xxxxx.dll | findstr machine
Visual Studio 2017のみでdumpbin を使う。(追記2018.12.28)
[開発者コマンド プロンプト for VS2015]は、Visual Studio 2017 のみインストールしていると、スタートメニューに表示されない。
利用するにはコマンドから起動する必要がある。
Win +R を押して
cmd /k "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\tools\VsDevCmd.bat"
で起動できる。 ちなみに、dumpbin.exe自体は
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64\dumpbin.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x86\dumpbin.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX86\x64\dumpbin.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX86\x86\dumpbin.exe
この辺りにある。
参考: If you have Visual Studio 2017 installed then you can use dumpbin to dump the PE... | Hacker News
Unity 2017.3 で TouchScreenKeyboard が使えない
Unity 2017.3を利用してHoloLensアプリを開発する際に、キーボードが使えなくて困ったのでメモ。
D3DのHoloLensアプリケーションではキー入力が使えないのですが、 Unity 2017.2までは、 Build TypeをXAMLにして、TouchScreenKeyboardを利用すれば、自動的にXAML画面が呼び出されて文字入力を行うことができました。
具体的には以下のコードをGameObjectにアタッチすると、startが呼び出された時点で、本来はキー入力画面が表示されます。
public class InputTest : MonoBehaviour { TouchScreenKeyboard keyboard; public static string keyboardText = "Input any"; // Use this for initialization void Start() { Debug.Log("start keyboard"); if (keyboard == null) keyboard = new TouchScreenKeyboard(keyboardText, TouchScreenKeyboardType.Default, false, false, false, false, "sample prompting text that goes above the textbox"); else keyboard.active = true; } }
しかし、これが、Unity 2017.3では動かない。アプリが落ちてしまいます。特に例外も発生しない。
Unity version | Result |
---|---|
Unity 2017.4.3f1 | not working new 18/05/30 |
Unity 2017.3.1p4 | not working new 18/05/30 |
Unity 2017.3.0b10 | not working |
Unity 2017.3.0b10 | not working |
Unity 2017.3.0f3 | not working |
Unity 2017.2.0b11 | working |
Unity 5.6.3f1 | working |
Unity 2017.2とUnity 2017.3でBuild出力されたC#プロジェクト内の、MainPage.xaml.csを比較してみたところ、
appCallbacks.SetKeyboardTriggerControl(this);
の記述が、Unity 2017.3では削られていました。
//Unity 2017.2.0b11で出力した、MainPage.xaml.cs抜粋 appCallbacks.RenderingStarted += () => { RemoveSplashScreen(); }; #if UNITY_UWP if (Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent("Windows.Phone.PhoneContract", 1)) isPhone = true; #endif //ここから、4行がUnity2017.3では無い。 #if !UNITY_WP_8_1 appCallbacks.SetKeyboardTriggerControl(this); #else isPhone = true; #endif //ここまで appCallbacks.SetSwapChainPanel(GetSwapChainPanel()); appCallbacks.SetCoreWindowEvents(Window.Current.CoreWindow); appCallbacks.InitializeD3DXAML();
そこで、2017.3側で SetKeyboardTriggerControlを追加しようとしたところ、そんなメソッドは無いと怒られます。
Documentには載ってるのに・・
あきらめて、自前でXAML Page作ります。
xaml切り替えは @d_yamaさんの解説記事がわかりやすいです。