こんにちは、「メカのりまき」です。
この記事では、「Excel」の「Data Streamer」を使って、「Arduino Uno R3」とシリアル通信を行いたいと思います。
「Arduino Uno R3」のシリアル通信については、以下の記事で説明していますので、シリアル通信がよく分からないという方は、是非、ご覧になってください。
目次
本記事で使用するもの
記事を見て、気になるものがあれば、是非チェックをしてみてください。
Data Streamerとは
Data Streamerは、Excelで使用可能なアドイン(拡張機能)です。
Data Streamerを使えば、Arduinoボードからデータを受け取って、それをExcelのセルにまとめたり、逆にセルのデータを、Arduinoボードに送信したりするといったことが可能になります。
Data Streamerを使う準備
Data Streamerを使うためには、Data Streamerアドインを有効にする必要があります。
まずは、Excelを開き、新規ファイルを作成します。
ファイルを作成しましたら、次に「ファイル」タブをクリックします。

「ファイル」タブをクリックしましたら、切り替わった画面先で「オプション」をクリックします。
なお、画面が小さい場合は、「オプション」が「その他」になっていて表示が隠れている場合があります。

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

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

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

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

なお、Excelのバージョンによっては、「Microsoft Data Streamer for Excel」が存在せず、利用することができない可能性があります。
以上の操作を行うと、「Data Streamer」タブが追加されます。

これで、Data Streamerを使う準備は完了です。
ArduinoボードからのデータをData Streamerで受け取る
まずは、Arduinoボードからデータを送信し、それをData Streamerによって受け取り、Excelにまとめるといったことを行いたいと思います。
Arduinoボードにスケッチを書き込む
今回は回路を作成せず、USBケーブルのみを接続したArduinoボードを用意します。

その後、以下のようなスケッチをArduinoボードに書き込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/* ExcelのData StreamerでArduinoボードと通信する 2025/03/15 data_streamer_test //スケッチの詳細はこちら↓ https://mecha-norimaki.com/data_streamer_arduino_01/ */ //変数を用意する int number = 3; void setup() { //シリアル通信の初期化 Serial.begin(9600); } void loop() { //データを出力する Serial.print('a'); Serial.print(','); Serial.print(100); Serial.print(",App"); Serial.print("le,"); Serial.print("Mecha,,Norimaki,"); Serial.print(number); Serial.print('\n'); } |
このとき、ExcelのData Streamerで、「デバイスの接続」が行われている場合、書き込みが上手くいかないので注意してください。

Data Streamerを使って通信をする
書き込みが完了したら、次はExcelの操作を行います。
「Data Streamer」タブをクリックし、「デバイスの接続」をクリックします。

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

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

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

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

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

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

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ボードに書き込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/* ExcelのData StreamerでArduinoボードと通信する 2025/03/15 data_streamer_test_2 //スケッチの詳細はこちら↓ https://mecha-norimaki.com/data_streamer_arduino_01/ */ //データを格納するための変数を宣言 char inputChar; void setup() { //シリアル通信の初期化 Serial.begin(9600); } void loop() { //受信したデータ数を確認して、データがあった場合、受信したデータを出力する if (Serial.available() > 0) { inputChar = Serial.read(); Serial.print(inputChar); } } |
このとき、ExcelのData Streamerで、「デバイスの接続」が行われている場合、書き込みが上手くいかないので注意してください。
Data Streamerを使って通信をする
先程と同じように、「デバイスの接続」、「データの開始」を行います。
今回は、「データの開始」をしても、「入力データ」シートに変化はありません。
「データの開始」をしましたら、「出力データ」シートに移動し、A5:I5の範囲内にデータを入力します。

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

私の環境だけかもしれませんが、「出力データ」シートのch10(J5)にデータを入力しても、そのタイミングでデータの送信は行われませんでした。
ただし、ch10(J5)にデータが入っている状態で、A5:I5の範囲内にデータを入力した場合、ch10(J5)のデータも送信されました。
解説
Data Streamer側
Data Streamerは5行目の入力部分にデータを入力すると、外部デバイスにデータを送信します。

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

Arduino側
今回、Arduinoでは、data Streamerによって送信されてきたデータをそのまま送り返すといったことを行っています。
「,」や「\n」もそのまま送り返しているため、「出力データ」シートで入力したデータが、そのまま「入力データ」シートに入力されます。

Data Streamerで送ったデータを数値として扱う
Data Streamerで数値のデータを送り、その数値をArduinoボードで使用したいということがあるかもしれません。
しかし、Data Streamerとやり取りするデータは、文字データであるため、スケッチに工夫を加える必要があります。
ここでは、Data Streamerで2つの数値を送り、Arduinoボードで、それらを足し算して結果をData Streamerに返すといったことを行いたいと思います。
Arduinoボードにスケッチを書き込む
以下のようなスケッチをArduinoボードに書き込みます。
このとき、ExcelのData Streamerで、「デバイスの接続」が行われている場合、書き込みが上手くいかないので注意してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
/* ExcelのData StreamerでArduinoボードと通信する 2025/03/15 data_streamer_test_3 //スケッチの詳細はこちら↓ https://mecha-norimaki.com/data_streamer_arduino_01/ */ //データを格納するための変数を宣言 long numberA, numberB; void setup() { //シリアル通信の初期化 Serial.begin(9600); } void loop() { //受信したデータ数を確認して、データがあった場合、データ内の2つの数値を足し算して出力する if (Serial.available() > 0) { //受信したデータから数値を取り出す numberA = Serial.parseInt(); numberB = Serial.parseInt(); //\nまでデータを取り出す while (Serial.read() != '\n') {} //足し算の結果を出力 Serial.println(numberA + numberB); } } |
Data Streamerを使って通信をする
今回は、「デバイスの接続」をする前に、「出力データ」シートに移動し、A5,B5に数値が入っている状態にしておきます。

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

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

解説
Data Streamer側
「出力データ」シートと送信するデータの関係は先程の説明どおりです。
今回の場合は、A5,B5に数値を入力しているので、以下のようなデータが送られることになります。

Arduino側
送られてくる数字の文字データを、数値に変換する関数については、自力で用意してもよいですが、もともと便利なものが用意されています。
それが、「Serial.parseInt()」です。
この関数は、シリアルバッファ内にある最初の整数値を、long型のデータとして返します。

シリアルバッファ内に数値が無い場合は「0」を返します。
マイナスの値でも読み取ることができますが、取り出せるのは整数値のみで、小数点を含んだ数値は取り出せません。
小数点を含んだ数値を取り出したい場合は、「Serial.parseFloat()」という関数を使うと同じような仕組みで小数点を含んだ数値を扱うことができます。
今回のスケッチでは、2回の「Serial.parseInt()」によって、シリアルバッファから2つの数値を取り出してlong型の変数に格納しています。

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

そして最後は、取り出した数値の和を、「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アドセンス広告です。
気になる商品がございましたら、チェックをしてみてください。
