こんにちは、「メカのりまき」です。

この記事では、「Excel」の「Data Streamer」を使って、「Arduino Uno R3」とシリアル通信を行いたいと思います。

「Arduino Uno R3」のシリアル通信については、以下の記事で説明していますので、シリアル通信がよく分からないという方は、是非、ご覧になってください。

本記事で使用するもの

本記事で私が使用した物は以下の通りです。

  • 「Arduino IDE 2.3.4」と「Excel 2019 (バージョン 2501)」をインストールしたPC(Windows11)
  • Arduino Uno R3(ELEGOO UNO R3でも可)
  • USBケーブル

今回使用した物は、記事の最後にある広告のところで紹介しています。

記事を見て、気になるものがあれば、是非チェックをしてみてください。

Data Streamerとは

Data Streamerは、Excelで使用可能なアドイン(拡張機能)です。

Data Streamerを使えば、Arduinoボードからデータを受け取って、それをExcelのセルにまとめたり、逆にセルのデータを、Arduinoボードに送信したりするといったことが可能になります。

Data Streamerを使う準備

Data Streamerを使うためには、Data Streamerアドインを有効にする必要があります。

まずは、Excelを開き、新規ファイルを作成します。

ファイルを作成しましたら、次に「ファイル」タブをクリックします。

ファイルをクリック

「ファイル」タブをクリックしましたら、切り替わった画面先で「オプション」をクリックします。

なお、画面が小さい場合は、「オプション」が「その他」になっていて表示が隠れている場合があります。

オプションをクリック

「Excelのオプション」というウィンドウが開きますので、ウィンドウ左下側にある「アドイン」をクリックします。

アドインをクリック

次に、画面下のほうにある「管理」の部分が「Excelアドイン」となっていると思われるので、そこをクリックし、「COMアドイン」を選択します。

COMアドインに変更

その後、右隣にある「設定」をクリックすると、「COMアドイン」というウィンドウが開きます。

設定をクリック

「COMアドイン」のウィンドウが開きましたら、「Microsoft Data Streamer for Excel」にチェックを入れ、「OK」をクリックします。

Microsoft Data Streamer for Excelにチェックを入れOKをクリック

なお、Excelのバージョンによっては、「Microsoft Data Streamer for Excel」が存在せず、利用することができない可能性があります。

以上の操作を行うと、「Data Streamer」タブが追加されます。

Data Streamerが追加される

これで、Data Streamerを使う準備は完了です。

ArduinoボードからのデータをData Streamerで受け取る

まずは、Arduinoボードからデータを送信し、それをData Streamerによって受け取り、Excelにまとめるといったことを行いたいと思います。

Arduinoボードにスケッチを書き込む

今回は回路を作成せず、USBケーブルのみを接続したArduinoボードを用意します。

USBケーブルを接続したArduino Uno R3

その後、以下のようなスケッチをArduinoボードに書き込みます。

このとき、ExcelのData Streamerで、「デバイスの接続」が行われている場合、書き込みが上手くいかないので注意してください。

デバイスが接続されている状態だとスケッチの書き込みができない

Data Streamerを使って通信をする

書き込みが完了したら、次はExcelの操作を行います。

「Data Streamer」タブをクリックし、「デバイスの接続」をクリックします。

Data Streamerをクリックした後、デバイスの接続をクリック

すると、Arduino Uno(COM~)というのが、表示されるので、それをクリックします。

Arduino Uno(COM~)をクリック

なお、このとき「Arduino IDE」の「シリアルモニタ」など、別のソフトで通信を行っている場合、接続ができないので注意が必要です。

シリアルモニタが開いている場合はシリアルモニタを閉じる

上記の操作を行うと、Data Streamer用のシートがいくつか作成されます。

Data Streamer用のシートがいくつか作成される

シートが作成されましたら、「入力データ」シートに移動した後、「データの開始」をクリックします。

データの開始をクリック

すると、シリアル通信が開始し、Arduinoボードから送られてくるデータが、Excelに表示されていきます。

Arduinoボードから送られてくるデータがシートに表示されていく

シリアル通信を止めたいときは、データの停止をクリックします。

データの停止をクリック

Arduinoボードへの書き込みなどをするために、接続を解除したいときは「デバイスの接続解除」をクリックします。

デバイスの接続解除をクリック

解説

Data Streamer側

Data Streamerは「データの開始」をすると、外部デバイスからデータを「入力データ」シートのセルにまとめていきます。

このとき、外部デバイスから送信するデータと「入力データ」シートは、以下のような関係になります。

外部デバイスから送信するデータと入力データシートの関係

なお、通信速度やチャンネル数などを、「詳細」や「設定」シートで変更することができますが、今回の記事ではすべてデフォルトの状態にしています。

Arduino側

今回、Arduino側では、「Serial.print()」により、データを送っています。

シリアル通信の通信速度は、Data Streamerのデフォルトが9600[Baud]なので、Arduino側は合わせて、「Serial.begin(9600)」と設定しています。

Arduinoで送るデータと「入力データ」シートの関係を見るために、すこし変な送り方をしているので、それらについて順に説明していきます。

まず、「a」という文字を送信し、その後、「,」という文字を送信しています。

ここで、Data Streamer側では「,」をチャンネルの区切りとして扱うため、ch1のセル(B5)に「a」という文字が入ることになります。

なお、セルに入力されるデータは、頭に「’」が付いており、文字列として扱われます。

頭に'が付く

次に、「100」という数字を送信し、続けて「,App」という文字列を送信しています。

「,App」のように、文字列内に「,」が入っている場合でも、チャンネルは区切られます。

よって、ch2のセル(C5)に「100」という数字が入ることになります。

なお、セルに入力されるデータが数字のみの場合は、頭に「’」が付いておらず数値として扱われます。

これは、「Serial.print(100)」を、「Serial.print(”100”)」にしたとしても同様です。

頭に'がつかない

続いて、「le,」という文字列を送信しています。

「,」が送られるまでは、チャンネルを区切らないため、先程送った「,App」の「App」と「le」が繋がって、「Apple」という文字列がch3のセル(D5)に入ることになります。

続いて、「Mecha,,Norimaki,」という文字列を送信しています。

文字列内には「,,」と「,」を2回連続で送っている部分があります。

この場合は、チャンネルの区切りだけが、行われるので、ch5(F5)のように空白のセルが発生します。

ただし、完全な空白というわけでは無く、「’」だけが入力されている状態になっています。

'のみ入力されている

続いて、変数「number」の値を送信しています。

この変数「number」は、変数宣言のときに「3」を格納しているため、ch7(H5)には「3」という数字が入ることになります。

最後に、「\n」という文字を送っています。

この「\n」は改行コードというもので、Data Streamerでは、データの終わりを意味しています。

よって、「\n」を最後に送らない場合は、上手く通信が行われないので注意してください。

なお、「Serial.print(’\n’)」の代わりに、「Serial.println()」を使った場合でも正常に通信が行われます。

よって、スケッチ内の「Serial.print(nuber)」と「Serial.print(’\n’)」をまとめて、「Serial.println(nuber)」としても同じように通信することが可能です。

今回は、センサなどの外部デバイスを使用しませんでしたが、センサの情報などを取得して、その情報を、「Serial.print()」で送ることも可能です。

センサなどの情報をExcelにまとめるときに便利なので、是非、試してみてください。

ただし、PCとの通信には0番ピンと1番ピンを使用しており、0番ピンと1番ピンをデジタル入出力ピン(接続した電子部品から情報を受け取ったり、接続した電子部品を制御したりするピン)として使用することはできないので注意してください。

Data StreamerでArduinoボードにデータを送る

次に、セルのデータをData Streamerによって、Arduinoボードに送信するといったことを行いたいと思います。

ここで、Data Streamerによってデータが送られたかどうか、Arduino IDEのシリアルモニタで確かめたくなりますが、残念ながらData Streamerとシリアルモニタは同時に使えません。

よって、ここでは、Data Streamerによって送ったデータを、Arduinoボードでそのまま送り返して、Data Streamerの「入力データ」シートで確認したいと思います。

Arduinoボードにスケッチを書き込む

以下のようなスケッチをArduinoボードに書き込みます。

このとき、ExcelのData Streamerで、「デバイスの接続」が行われている場合、書き込みが上手くいかないので注意してください。

Data Streamerを使って通信をする

先程と同じように、「デバイスの接続」、「データの開始」を行います。

今回は、「データの開始」をしても、「入力データ」シートに変化はありません。

「データの開始」をしましたら、「出力データ」シートに移動し、A5:I5の範囲内にデータを入力します。

A5:I5の範囲に送りたいデータを入力

データの入力を行った後に、「入力データ」シートに移動すると、「出力データ」シートで入力したデータが送られていることが確認できます。

出力データシートで入力されたデータが送られている

私の環境だけかもしれませんが、「出力データ」シートのch10(J5)にデータを入力しても、そのタイミングでデータの送信は行われませんでした。

ただし、ch10(J5)にデータが入っている状態で、A5:I5の範囲内にデータを入力した場合、ch10(J5)のデータも送信されました。

解説

Data Streamer側

Data Streamerは5行目の入力部分にデータを入力すると、外部デバイスにデータを送信します。

A5:I5の範囲にデータが入力されると、そのタイミングでデータの送信が行われる

このとき、「出力データ」シートと外部デバイスに送信するデータは、以下のような関係になります。

データが空だったとしても全チャンネルのデータがカンマ区切りで送信される データの最後は改行コード

Arduino側

今回、Arduinoでは、data Streamerによって送信されてきたデータをそのまま送り返すといったことを行っています。

「,」や「\n」もそのまま送り返しているため、「出力データ」シートで入力したデータが、そのまま「入力データ」シートに入力されます。

Arduinoが受け取り、送り返すデータ

Data Streamerで送ったデータを数値として扱う

Data Streamerで数値のデータを送り、その数値をArduinoボードで使用したいということがあるかもしれません。

しかし、Data Streamerとやり取りするデータは、文字データであるため、スケッチに工夫を加える必要があります。

ここでは、Data Streamerで2つの数値を送り、Arduinoボードで、それらを足し算して結果をData Streamerに返すといったことを行いたいと思います。

Arduinoボードにスケッチを書き込む

以下のようなスケッチをArduinoボードに書き込みます。

このとき、ExcelのData Streamerで、「デバイスの接続」が行われている場合、書き込みが上手くいかないので注意してください。

Data Streamerを使って通信をする

今回は、「デバイスの接続」をする前に、「出力データ」シートに移動し、A5,B5に数値が入っている状態にしておきます。

数値を2つ入力した状態にしておく

「出力データ」シートの編集が終わりましたら、先程までと同じ手順で、「デバイスの接続」、「データの開始」を行います。

「データの開始」をしただけでは、データのやり取りは行われないため、「出力データ」シートの値を編集します。

値を変更しなくても編集するふりをしてEnterを押すだけでデータは送信される

その後、「入力データ」シートに移動すると、「出力データ」シートで入力した数値の和が送られていることが確認できます。

出力データシートで入力した数値の和(足し算の結果)が入力される

解説

Data Streamer側

「出力データ」シートと送信するデータの関係は先程の説明どおりです。

今回の場合は、A5,B5に数値を入力しているので、以下のようなデータが送られることになります。

出力データシートと外部デバイスに送信するデータ

Arduino側

送られてくる数字の文字データを、数値に変換する関数については、自力で用意してもよいですが、もともと便利なものが用意されています。

それが、「Serial.parseInt()」です。

この関数は、シリアルバッファ内にある最初の整数値を、long型のデータとして返します。

Serial.parseInt()の説明

シリアルバッファ内に数値が無い場合は「0」を返します。

マイナスの値でも読み取ることができますが、取り出せるのは整数値のみで、小数点を含んだ数値は取り出せません。

小数点を含んだ数値を取り出したい場合は、「Serial.parseFloat()」という関数を使うと同じような仕組みで小数点を含んだ数値を扱うことができます。

今回のスケッチでは、2回の「Serial.parseInt()」によって、シリアルバッファから2つの数値を取り出してlong型の変数に格納しています。

シリアルバッファ内と変数の中身

その後、シリアルバッファには、「,」や「\n」が残っている状態であるため、while文と「Serial.read()」を利用してそれらを取り出しています。

while文でカンマと改行コードを取り出す

そして最後は、取り出した数値の和を、「Serial.println(numberA + numberB)」により送信しています。

これにより、「入力データ」シートに、「出力データ」シートで入力した数値の和が入ります。

なお、while文で「,」や「\n」を取り除かなかった場合、もう一度if文の条件を満たすことになりますが、「Serial.parseInt()」は数値が無い場合「0」を返すため、numberA=0、numberB=0ということになり、「入力データ」シートでは、足し算の結果の後に「0」が入力されることになります。

また、蛇足ですが、今回のスケッチでは、2つの数値を取得して、他は無視するというものなので、ch1に「20aaa2」といった入力を行った場合、結果は「22」になります。

終わりに

皆さん、Data Streamerを利用して、Arduinoボードとシリアル通信を行うことができたでしょうか。

今回の記事では、Data StreamerとArduino Uno R3を使って、単純なシリアル通信を行いました。

Data Streamerを使いこなせれば、センサやロボットの状態のデータをExcelで編集してまとめたいといったときに便利そうです。

今回の記事でData Streamerの基本を理解していただき、色々と活用していただければ幸いです。

本記事はここまでです。ご清覧ありがとうございました。

広告

今回使用したArduino Uno R3です。

Arduinoの互換機と電子部品が入ったスターターキットです。

これからArduinoを始めるという方におすすめのキットで、本サイトでもこの中にある部品を使った記事をいくつか書いています。

楽天モーションウィジェットとGoogleアドセンス広告です。

気になる商品がございましたら、チェックをしてみてください。