Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

概要

題名の通りです

やっぱりみんな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

miwazawa
情報工学専攻
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away