LoginSignup
4
10

More than 3 years have passed since last update.

【C#】Arduinoで取得したセンサ値をシリアル通信からCSV出力する

Last updated at Posted at 2020-06-24

概要

題名の通りです

やっぱりみんなpythonが好きらしく,C#でやっている人は少なかったので情報共有

今回はArduinoからのセンサ出力をWindowsコンソールアプリケーションを用いてCSVに出力するまでの道のりです

環境

windows10
Visual Studio 2019
Arduino IDE
Arduino Pro mini
適当な光センサ

実装

Arduino IDE側


const int analogInPin = A0; 

int sensorValue = 0;   

void setup() {
  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(analogInPin);

  Serial.print("sensor = ");
  Serial.print(sensorValue);
  Serial.print("\n");

  delay(2);
}

image.png
シリアルモニタ結果はこんな感じ
このウィンドウ名の通り今回のシリアルポートはCM3
ツールタブ押してシリアルポート見ても確認できます
後,bpsは9600であることも覚えておきます

Visual Studio側

まず今回必要なパッケージを.NETからインストールします

①System.Text.Encoding.CodePages

csvに出力する際にあのShift-Jisを使います
そして案の定Shift-Jisは適してないと怒られます
Windowsの呪いは恐ろしいです
そして調査したところ,
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
と魔法の言葉を打てば大丈夫らしいです(投げやり)

1.VSのプロジェクトタブからNuGetパッケージの管理を選択

2.参照タブの検索ボックスにSystem.Text.Encoding.CodePagesと入力

3.一番上のやつをインストール,私のはver.4.7.1でした

②System.IO.Ports

私のSystem.IO.Portsは旧バージョンだったらしくコンパイル時にSerialPort型が名前空間にないと怒られました

最新verの方は必要ないと思いますが私のような症状が出たのであればインストールしてみてください

1.VSのプロジェクトタブからNuGetパッケージの管理を選択

2.参照タブの検索ボックスにSystem.IO.Portsと入力

3.一番上のやつをインストール,私のはver.4.7.0でした

ソースコード

ArduinoSerial_DataToCSV.cs
using System;
using System.IO.Ports;
using System.Text;

namespace ArduinoSerial_DataToCSV
{
    class Program
    {
        static void Main(string[] args)
        {
            //キー入力に使用
            var outChar = "";

            //現在時刻
            DateTime dt = DateTime.Now;
            String now_time = dt.ToString();
            now_time = now_time.Replace("/", ".").Replace(" ","_").Replace(":","-");

            String PATH = @"C:/Users/○○/~/"+now_time+"_SensorData.csv";

            //EncodeをShift-Jisに対応
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            //シリアルポート取得
            SerialPort sp = new SerialPort("COM3");

            //csv出力
            var sw = new System.IO.StreamWriter(PATH, false, System.Text.Encoding.GetEncoding("shift_jis"));

            //Arduino側のサンプリング周波数
            sp.BaudRate = 9600;
            sp.Open();

            while (true)
            {
                //センサ値1行分取得
                string data = sp.ReadLine();

                //csv出力
                sw.WriteLine(data);
                Console.WriteLine(data);

                //Q入力でプログラム終了
                if (Console.KeyAvailable)
                {
                    outChar = Console.ReadKey().Key.ToString();
                    if (outChar == "Q")
                    {
                        return;
                    }
                }

            }
        }
    }
}

実行結果

image.png
image.png

1行目がうまくいかない不具合があるけどよくわからずじまい
疲れたので修正するならまた今度

参考資料

Arduino日本語リファレンス
http://www.musashinodenpa.com/arduino/ref/index.php

.NET CoreでShift-JISを取り扱う方法
https://blog.hitsujin.jp/entry/2019/01/27/200055

4
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
10