気ままに備忘録

電子工作・人力飛行機についてのメモ

Excelでシリアルモニタ

この記事は
WMMC Advent Calendar 2020 - Adventar
の3日目の記事です.きのうはしまじゃきさんによる
【WMMC ADC 2020】コロナ禍でハマったこと
でした.マイコン原理主義者だけでない,しまじゃきさんの素顔がうかがえる記事でしたね.半年以上お会いしていませんが平常運転で安心しました.しかし私はWMMCではジャッジーsophiaさんほど変人ではないと思うし,むしろ常識人だと思うのですが….なぜでしょう.

 さて,またまた投稿間隔があいてしまいました.どうも私にはこのブログというものは向いていないらしいです.というかほんとに何もしてなかっただけなんですけどね(-_-;).
 言い訳がてら近況報告をすると,4月に更新した後,ぼちぼち夏休みはHPA(人力飛行機)の電装をArduino系列からSTM32系への移行を目指した開発(というかお遊び)やってたり,マウス設計したりしてました.が,どれもこれもあまり進まず….もっぱら一番進んだのがミシンとか言うよくわからないことしてました.その後秋学期では研究室の見学とレポートに振り回され,今日に至ったわけです.いやあ,驚くほどの堕落っぷり….Perfumeやら某艦隊娘ゲームにハマったりしたのもあり,最近は全然ダメです().

 言い訳はこの辺までにして,本題に入りましょう.今回はここまでの記事(実質2本しかないですが)とはちょっと違うお話をしたいと思います.

0.本日のテーマ

 この記事を読んでいる人はいつも何かしらのマイコンを使っていると思います.そして,マイコンを使うときには,だいたいセンサを使って何かを測定していると思います(例外はあると思いますが).その時,「データのログがとりたい!」っていうことがないでしょうか.ところが,ちゃんとデータのログをとるのって結構大変で,シリアルモニタに出力させたはいいけどその場では何言っているかわからなかったり,それが嫌だからちゃんとしたものを作ろうとすると新たにツールを入れなきゃいけなかったりします.マウサーの方だったらそのままコマンドラインやシリアルモニタに出力させていたり,MATLABつかったりしているかもしれません.が,初心者には割と難易度高かったり,あるいは結果を整理して制御の補正係数を…なんてやろうとするときにはコマンドラインは不便だったりします.あるいは,それだけで計測機器として使いたいとき,特にほかの人(しかも素人)が見るときなんかには,もっと見やすくないときついこともあります.そうするとUI作る必要が出てきて…沼にハマるわけです.
 こんな悩みをなくしてくれる機能が実はExcelにはついています.最近実装されて,一時期Twitterでも話題になりました.今回はこれを使ってみようというのが主題になります.

1. Microsoft Data Streamer for Excelとは

今回使うのは「Microsoft Data Streamer for Excel」というアドオンです.このアドオンを使うことで,USARTで送られてくるデータの記録や確認,さらにはUSARTで信号を送ることができるようになります.いわば,Arduino IDEにおけるシリアルモニタと同じことができるわけです.ここまでは例えばArduino使いの方にはあんまり利点がないかもしれないですが,すごいのはここから先.「すでにデータがエクセルに入っている」ということです.つまり,グラフだったり,演算だったり,エクセル上でできる機能がリアルタイムにできるのです.リアルタイムでデータを監視しながらログをとりたい!っていうときにとてもおすすめです.最もマイクロマウスの界隈ではあまり需要がないかもしれませんが….
 欠点としては基本的にカンマ区切りのデータしか扱えないことがあります.これは基本的にマイコンしか扱えないことを意味しています.無線機器(Xbeeなど)から直接データを受信する場合については,基本的に想定していないようです.ただ今回検証はしていませんが,データの中にカンマを入れて送れば問題はないと考えられます(送信可能データは減ってしまいますが…).もう一つ致命的な欠点は「Windowsしか使えない」ことです.Macでは使えない(らしい,確認はできていません)ので,MacユーザーにはWindowsを買えということなのでしょうか.
 それでは実際に使ってみましょう.参考にしたのはMicrosoftの公式ページです.ここをいろいろ探しているとArduinoのサンプルコードやらサンプルのエクセルシートやら出てきます.あれ?このページいらなくね?

2.Excelの準備

 まず,Excelにアドオンを入れます.シートを開き,ファイル>オプションを選択,「Excelのオプション」ウインドウを立ち上げます.左の列から「アドイン」を選択.そこからMicrosoft Data Streamer for Excelを選択し,アクティベートします.すると,シートのタブの列にData Streamerというタブが増えます.詳しくは公式のページ->
Data Streamer アドインを有効にする - Excel
やっぱりこの記事いらない気がしてきた().

3.マイコンの準備

 Arduino使ってもいいのですが,せっかくなのでSTM32を使いましょう.今回はSTM32F303K8 Nucleoを使います.開発環境はSTM32 CubeIDEです.センサ使ってデータを実際にとろうとしたのですが,たまたま手元にデータを気軽にとれるセンサがなかったので,今回は単純にデータを送るところだけやります.
 まずはcubeMXの設定から,新しいプロジェクトを起動します.Target Project TypeはSTM32Cubeで設定します.意図的に忘れた方はこのページを閉じてマイコンとの対話を優先されることをお勧めします.画面がDevice configuration Toolになったら,左側のペリフェラルが一覧になっているリストの中から,Connectivity->USART2を選択します.すると,USART2 Mode and Configurationという画面が,リストの横に出てきます.上の段のModeの中から,Asynchronousを選択します.そのほかの設定は何もいじる必要はないですが,Configuration>Parameter Setting>Basic Parametersの数字はよく覚えておいて下さい.主にBaud RateとWord Lengthですね.今回はそれぞれ38400Bits/s, 8bitとなっています.設定が終わると,図3.1のようになるはずです.ただ,図3.1ではADC等ほかのペリフェラルも動いているので,そこは無視してください.右上のVCP_RXと左下のVCP_TXが緑ならOKです.設定ができたらProject>Geterate Codeとします.このあたり,詳しくは前回の記事を参照ください.

f:id:tomo_amber:20201213020345p:plain
図3.1 CubeMXの設定

 続いてコードを書きます.シリアル通信をprintfでできるようにしたかったので,そんなコードを書きました.書き足した部分だけ書きます.複数データを送るときには,カンマ区切りで送信し,最後のデータの後に\nを追加します.CSVと同じですね.

printfを使えるようにする部分

USER CODE BEGIN 0の後
int __io_putchar(int c) {
  if( c == '\n' ) {
    int _c = '\r';
    HAL_UART_Transmit(&huart2, &_c, 1, 1);
  }
  HAL_UART_Transmit(&huart2, &c, 1, 1);
  return 0;
}
USER CODE BEGIN 2の後
  setbuf(stdout, NULL);

データ送信部分

USER CODE BEGIN 2の後
  int i = 0;		        //送信データ1
  int j = 100;		//送信データ2
USER CODE BEGIN WHILEの後
  printf("%d, %d\n", i, j);//データ送信
  i++;
  j--;
  HAL_Delay(50);

4. 実行してみた

 実行してみます.マイコンをPCと接続し,書き込みをします.エクセルのData Streamerタブを選択,一番左のデバイスの接続を選択します.すると接続したマイコンが候補として表示されるので,これを選択します.これで接続が成立します.うまくいくと「入力データ」「出力データ」「設定」のシートが新たに発生します(図4.1参照).この時点では,まだデータの受信は開始しません.

f:id:tomo_amber:20201213023939p:plain
図4.1 通信が成功した様子

 次に通信の設定を変更します.「詳細」を選択し,詳細ウインドウ(図4.2)を開きます.設定を選択します.ここでUIについていじれますがここでは省略.重要なのはその下のCOMポートです.データビット,ボーレートを先ほど設定したように,8bit, 28400bpsに設定します.これを忘れるとほかのシリアルモニタ同様データが読めません.Excelでは読めないデータは表示されないので,何が死んでいるかわからないのでお気を付けください.適用を押して,OKで終了.そうしたら「データの開始」を選択すると受信・記録が始まります.データはこれで受信が開始でき,すると自動的に図4.1のようにデータが受信できます.「設定」シートからいろいろいじれます.詳しくは下表4.1参照.

f:id:tomo_amber:20201213024241p:plain
図4.2 詳細設定


表4.1 設定シートで変更できる定数

項目 用途 値の範囲
データの間隔 Excelの更新間隔を変更.これに関わらず受信はすべて行われる. 10~1000ms
データ行 表示される過去のデータの行数を変更.ここにある分だけタイムスタンプ込みで保存できる 1~500行
データチャンネル 受信するデータの種類. 1~100
データの並び順 過去のデータ並びを古いものを先頭にするか,新しいものを先頭にするかを選択 古い順or新しい

 「データの記録」を選択すると,押した時点から記録の終了を押すまでデータが保存され,のちにCSVファイルとして保存されます.CSVファイルに保存するとタイムスタンプは省略されてしまいます.したがって,データを時間と合わせて保存したい場合には,保存したい時間分だけ表示データ行数を増やしておく必要があります.しかし時間も含めて記録できるのは500行まで….10Hzの計測機器だと50秒しか持ちません.HPAの電装に使用する場合,TFでも運用はぎりぎりです.このため,長時間にわたり時刻も合わせて記録する場合,GPSモジュール等から得られる時刻情報も併せて送信する必要があります.あるいは,VBAを利用してデータを蓄積保存するようなシステムを用意する必要がありそうです.ここが少し欠点ですね.ある程度の時刻は周波数から逆算できますから,ザックリでいいというときによいのではないでしょうか

f:id:tomo_amber:20201213024905p:plain
図4.3 CSVファイルを出力するとき

5. 終わりに~これは使えるのか~

 工夫しないと限られた時間の間しかタイムスタンプを含めたデータロガーとしては使えない欠点はありますが,「データロガーのために今更時間をかけていられない!」という人には適しているかもしれません.また,保存は二の次として,多数のデータの様子をリアルタイムで観測したい!という人にもおすすめです.時間をそれほど気にしなければ,CSVファイルを直接得ることができ,記録したデータからグラフ化まで持ち込むことができます.今回は試していませんが,ここからマイコンにデータを送ることもでき,運用の幅が広がりますね.
 計測機器を作ったはいいけど,表示まで気にしていなかった….しかももう実戦投入まで時間がない…どうしよう…?って時がありましたらぜひともお使いください.

…ちょっとほかのものと比較してみますか?表にできるほどいろんなものを使ったわけではないのですが….
 実はここに書いた機能,ほとんどProcessingで再現可能です().グラフ化はProcessingの十八番ですし,csv出力機能も付いています.さらに言うと,ProcessingとArduinoとの連携は本にもなるほど有名で,この機能を流用すると今回と同じことがSTM32でも容易にできてしまうと思われます(未実証ですが…自明でしょう).
 さらにMATLABも同様の機能を持っています.アドインを入れることなく,標準機能からデータ列を読み込むことができ,これを整理・グラフ化・保存する機能はもともとMATLABも持っています.
 これらに対して優位な面は,はっきり言ってほとんどないかと考えられます.唯一あるのは,「MATLAB/Processingなどは使うまでに勉強が必要だが,Excelはそれが不要」というところでしょうか.ですので,他のツールを十分使いこなせているという人は,あまり必要性は高くないと思われます.ただ,Excel VBAを使いこなせる人にとっては,タイムスタンプまで一括で保存できる(と思われる)ので,こちらのほうが便利かもしれません.また,こういったツールを勉強して実装する余裕がなくなってしまったときには,助け舟になると思います.機能面での差は大したことはないので,冒頭にも書いたように,PCのスペック上の制約で,あまりいろいろなソフトを入れたくないという場合には筆頭候補となりうるでしょう.そういえばマイクロマウスではMATLABが誰でも利用可能…ということは…

 さて,最後に不穏な流れになってまいりましたが,私の担当分はここまでとします.期限ぎりぎりの中適当に書いたので短いうえに読みづらく挙句内容も…と思いますがご容赦ください.
 明日のWMMC Advent Calendar 2020 - Adventarはジャッジー君二本目の記事です.前回登板ではUSBについて書いてくれましたが今回はどんな記事になるのでしょう.大変楽しみです.

<訂正>

明日の担当はジャッジーではなく,yoka様でした.偉大なる同志ジャッジーのあまりのインパクトの大きさとと私の不注意のために誤りをしてしまいました.お詫びして訂正いたします.