ArduinoとオシロスコープをPythonで制御して測定する

##1. はじめに
「[ArduinoとオシロスコープをExcelで制御して測定する](https://qiita.com/pbjpkas/items/7da7ff99e7226fa84bcb)」をPythonで試しました。測定システムの概要を以下に示します。
![system.png](https://qiita-image-store.s3.amazonaws.com/0/221758/72fd1dd8-3902-d481-9523-c4d479479e01.png)

##2. 環境構築
###2.1 Arduino治具
本稿で使用しているArduino治具は「[Arduino Leonardoで多目的ツールの製作](https://qiita.com/pbjpkas/items/97dbf835b0aab6725e94)」をご参照ください。コマンド制御により以下のような矩形波パルスを生成します。
![pulse.png](https://qiita-image-store.s3.amazonaws.com/0/221758/d895c412-d2d7-f1c1-ef4a-243d59566e21.png)

###2.2 Python実行環境
MinicondaでPythonの実行環境を用意します。[miniconda](https://conda.io/miniconda.html)から最新版のWindows 64-bit(exe installer)をダウンロード、インストールします。インストール時の質問は全部デフォルト値です。

###2.3 PyVISA、PyVISA-py
VISAをハンドリングするライブラリとしてPyVISAを使用します。PyVISAの公式サイトは[こちら](https://pyvisa.readthedocs.io/en/master/index.html)ですがインストールはcondaコマンドで行います。また、バックエンドのVISAライブラリとしてPyVISA-pyをcondaコマンドでインストールします。

PyVISA-pyはPyVISAが提供する代替VISAライブラリで現時点ではVISAの一部のみをサポートしているとのことです。詳しくは[こちら](https://pyvisa.readthedocs.io/en/master/getting.html)をご参照ください。

1.Anaconda promptを開く

2.conda install -c conda-forge pyvisa
<details><summary>コマンド実行ログ</summary><div>

```

>conda install -c conda-forge pyvisa
Solving environment: done

## Package Plan ##

  environment location: C:\Users\hoge\Miniconda3

  added / updated specs:
    - pyvisa


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    conda-4.5.11               |        py37_1000         654 KB  conda-forge
    openssl-1.0.2p             |    hfa6e2cd_1001         5.4 MB  conda-forge
    certifi-2018.10.15         |        py37_1000         137 KB  conda-forge
    pyvisa-1.9.1               |        py37_1000         231 KB  conda-forge
    ca-certificates-2018.10.15 |       ha4d7672_0         170 KB  conda-forge
    yaml-0.1.7                 |           vc14_0         103 KB  conda-forge
    ------------------------------------------------------------
                                           Total:         6.6 MB

The following NEW packages will be INSTALLED:

    pyvisa:          1.9.1-py37_1000   conda-forge

The following packages will be UPDATED:

    ca-certificates: 2018.03.07-0                  --> 2018.10.15-ha4d7672_0 conda-forge
    certifi:         2018.8.24-py37_1              --> 2018.10.15-py37_1000  conda-forge
    conda:           4.5.11-py37_0                 --> 4.5.11-py37_1000      conda-forge
    openssl:         1.0.2p-hfa6e2cd_0             --> 1.0.2p-hfa6e2cd_1001  conda-forge

The following packages will be DOWNGRADED:

    yaml:            0.1.7-hc54c509_2              --> 0.1.7-vc14_0          conda-forge [vc14]

Proceed ([y]/n)? y


Downloading and Extracting Packages
conda-4.5.11         | 654 KB    | ###################################################################################### | 100%
openssl-1.0.2p       | 5.4 MB    | ###################################################################################### | 100%
certifi-2018.10.15   | 137 KB    | ###################################################################################### | 100%
pyvisa-1.9.1         | 231 KB    | ###################################################################################### | 100%
ca-certificates-2018 | 170 KB    | ###################################################################################### | 100%
yaml-0.1.7           | 103 KB    | ###################################################################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done

```

</div></detail>

3.conda install -c conda-forge pyvisa-py
<details><summary>コマンド実行ログ</summary><div>

```

>conda install -c conda-forge pyvisa-py
Solving environment: done

## Package Plan ##

  environment location: C:\Users\hoge\Miniconda3

  added / updated specs:
    - pyvisa-py


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    pyvisa-py-0.2              |          py_1000          29 KB  conda-forge
    pyserial-3.4               |             py_2          61 KB  conda-forge
    ------------------------------------------------------------
                                           Total:          90 KB

The following NEW packages will be INSTALLED:

    pyserial:  3.4-py_2    conda-forge
    pyvisa-py: 0.2-py_1000 conda-forge

Proceed ([y]/n)? y


Downloading and Extracting Packages
pyvisa-py-0.2        | 29 KB     | ###################################################################################### | 100%
pyserial-3.4         | 61 KB     | ###################################################################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: / C:\Users\hoge\Miniconda3\lib\site-packages\conda\core\link.py:772: UserWarning: Package conda-forge::pyvisa-py-0.2-py_1000 uses a pre-link script. Pre-link scripts are potentially dangerous.
This is because pre-link scripts have the ability to change the package contents in the
package cache, and therefore modify the underlying files for already-created conda
environments.  Future versions of conda may deprecate and ignore pre-link scripts.

  """) % prec.dist_str())
done

```

</div></detail>

###2.4 PySerialのインストール
RS-232C通信をハンドリングするライブラリとしてPySerialを使用しますが、PySerialはPyVISA-pyのインストールの際に一緒にインストールされたためここで行うことは特にありません。

##3. pythonのプログラム
pythonを実行し以下の操作を行います。

1. serialをimportし通信設定を行う
2. Arduino Leonardo治具へ "x" を送信しコマンドモードへ遷移する(xは任意の文字)
3. Arduino Leonardo治具へコマンド "toneon 1000" を送信し1000Hzのパルスを生成する
4. VISAをimportしリソースを生成、オープンする
5. オシロスコープへコマンド "*IDN?" を送信しオシロスコープを認識していることを確認する
6. オシロスコープへコマンド ":MEAS:FREQ? CHAN1" を送信し周波数をreadする
7. Arduino Leonardo治具へコマンド "toneoff" を送信しパルスの生成を停止する

実行結果を示します。Arduino Leonardo治具へコマンドを送信して1000Hzの矩形波パルスを生成し、オシロスコープへ:MEAS:FREQ? CHAN1コマンドを送信してその戻り値として9.980040e+02を得ました。

```python
(base) C:\Users\hoge>python
Python 3.7.0 (default, Jun 28 2018, 08:04:48) [MSC v.1912 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>> import serial
>>> ser = serial.Serial("COM6", 9600)
>>> data = "x"
>>> data = data +'\r\n'
>>> ser.write(bytes(data, 'UTF-8'))
3
>>> data = "toneon 1000"
>>> data = data +'\r\n'
>>> ser.write(bytes(data, 'UTF-8'))
13
>>>
>>>
>>> import visa
>>> rm = visa.ResourceManager()
>>> print(rm.list_resources())
('USB0::0x1AB1::0x04CE::DS1ZXXXXXXXXXX::0::INSTR',)
>>> dso = rm.open_resource('USB0::0x1AB1::0x04CE::DS1ZXXXXXXXXXX::0::INSTR')
>>> print(dso.query("*IDN?"))
RIGOL TECHNOLOGIES,DS1054Z,DS1ZXXXXXXXXXX,00.04.04.SP3

>>> print(dso.query(":MEAS:FREQ? CHAN1"))
9.980040e+02

>>>
>>>
>>> data = "toneoff"
>>> data = data +'\r\n'
>>> ser.write(bytes(data, 'UTF-8'))
9
>>>

```

##4. おわりに
- Excelの代わりにPythonでArduinoとオシロスコープを制御して周波数を測定できました。
- 本稿では割愛しましたが測定結果が期待結果を満足するか判定を行うとプログラム(ここではArduinoのスケッチ)のテストになります。
- 組込み機器をPythonで制御したりテストできるメリットとしてPythonの豊富なライブラリを使用できることが挙げられます。こちらは稿を改めてご紹介できればと思います。

##5. 参考
- [Python3でpyserialを使う](https://qiita.com/gazami/items/d1d5801beeb4d42393bb)
- [PythonでVISA](https://qiita.com/tamura23/items/cebaae35f1ed15d1d1fd)
- [condaとpip：混ぜるな危険](http://onoz000.hatenablog.com/entry/2018/02/11/142347)