テイラー流制御装置を作る -Python, Raspberry Pi-

# はじめに
　こんにちは。
　私は、2024年の4月に博士後期課程に進学した池端です。
 
　テイラー流の研究をしており、その実験装置の制御をするため、プログラミング言語のひとつであるPythonでコードを書くことにしました。
 
　この記事の目的は、私がどうやってプログラムと装置を構成したかを記録し、今後に役立てることです。
　しばらくは、日記のように当日実施したことを書く予定です。
　必要ない作業をしていた場合は、後日消去することにします。

# 背景
　本研究室ではこれまでLabView*でプログラムを組み、制御していました。
 *National Instruments社のソフトウエア
 
　わざわざPythonでプログラムを書こうと思ったのは以下の理由があります。
* Pythonでコードを書いたことがあり、学習コストがLabViewと同程度だと判断したから
* 今後、LabViewのライセンス登録をしていない研究機関で雇用される場合、ライセンス料を研究資金から捻出することになるから
* ネットや知人に訊けるから

うまくいくかはまだわかりませんが、とりあえず始めてみようと思います。


# 1日目 Windows側での環境構築
　今回はChatGPT君と相談しながら、環境構築をしました。
* Pythonのインストール (version: 3.9.13)
* 使いそうなライブラリのインストール
  * pyserial
  * numpy
  * matplotlib
* Visual Studio Code (以下VSCode)のインストール
* VSCodeの拡張機能の導入
  * Python
  * ~~Jupyter~~(2024/06/14追記　なくてもいい)
* Gitのインストール
* GitHubの登録(テストフォルダ: https://github.com/KatsuyaIkebata/test)

　各項目については、検索すればいくつかチュートリアルのようなものが出てきます。ですので、説明は省略します。
 
　とりあえず、今回は以上です。
　また明日頑張ります。

 # 2日目(2024/06/14) シリンジポンプとの接続
　前回から時間が空いてしまいました。
　今日もChatGPT君と相談して、シリンジポンプを運転しました。

* シリンジポンプ(HARVARD PHD Ultra)をパソコンとUSBケーブルで接続
* タスクバー左にある検索ボックスからデバイスマネージャーを開き、ポート(COMとLPT)のUSB シリアルデバイス(COM6)があることを確認
    * もしなければ、もう一度USBケーブルを抜き差しする
    * serialPort.pyを作成し、コマンドプロンプトで実行でも確認できる
* バージョンの確認(GetVersion.py)
* ポンプの動作確認(ControlPump.py)

　

　コードに関しては、GitHubのTaylorFlowControl/240614_CONTROLPHDULTRA下に格納されています (https://github.com/KatsuyaIkebata/TaylorFlowControl )。
 なお、シリンジポンプ(HARVARD PHD ULTRA)のコマンドリストは以下のPDFに載っていました。
 https://www.harvardapparatus.com/media/manuals/Product%20Manuals/PHD%20ULTRA%20Manual-70-3xxx_5419-002REV1.0.pdf
 
 以下、メモ書きを残しておきます。
 * Quick Start でしか動作しないコマンドあり
 * Syringeのプロパティ(直径など)を変更するなら、すべて設定する

　また、本研究室にあったポンプはinfuse onlyで、withdrawのコマンドは使えませんでした。


# 3日目(2024/06/17-21) シリンジポンプの稼働プログラム
　いろいろ迷走して、並列計算とか並行計算とか一通りやった後、WhileLoopを使って連続運転を実施しました。
　WhileLoop2.pyが最終的なファイルになっています。
　ほかの迷走したファイルと合わせて、GitHubのTaylorFlowControl/tree/main/240617_MakingTF下に格納されています (https://github.com/KatsuyaIkebata/TaylorFlowControl )。
　以下には概要を書いておきます。
~~~ ruby:コマンドプロンプト
> Python WhileLoop2.py
~~~
で実行可能。ログがcsvファイルに残るようにしました。

　また、コードの特徴は以下の通りです。
* While loopを使い、0.01秒ごとに経過時間がイベント時間に達しているか判断して稼働させる
* イベントが起こった回数を変数iterationで保存し、イベント開始の判断に用いる
* イベントは1A, 1B, 1C, 1D, 2A, 2B, 2C, 2Dで、数字がポンプ番号を、アルファベットが動作を表す(A: RUN, B: RUNした後の応答を記録, C: STOP, D: STOPした後の応答を記録)
* こちらからの命令と、ポンプからの応答をcsvファイルに記録した

次回は、出口でスラグを仕分けしようと思います。

# 4日目(-2024/7/8) 装置の設計

　今回は以下の事柄を行いました。
* 実験装置の概略の考案 
* 必要な器具などの購入
* Raspberry Piの初期設定

　出口でスラグを仕分けるのは装置ができてからにします。
　以下では、各項目について詳しく説明します。

## 実験装置の概略
　拙い図ですが、概略を載せます。
 ![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776664/2cb88457-fc01-26ba-2742-f5b5441d8ac7.png)
　シリンジポンプとバルブを同時に制御することで脈動を減らしています。
　使用流体にはスラリーを想定しているため、ピンチバルブと、ホモジナイザー(ねじ口瓶、スターラー、攪拌子、ナイロンポリ袋からなる)を使用していますが、固体を含まない場合はこの2つの代わりにソレノイドバルブだけで問題ないと思います。
　ナイロンポリ袋の選択理由についてですが、内側が柔軟性や密閉性の高いPE、外側が耐薬品性の高いナイロンであり、外側が有機溶剤や水、内側が水である本実験条件にふさわしいと考えたからです。
　ヒートシーラーでチューブと接続する予定です（うまくいくかはやってみないとわかりません）。

　次に、バルブ制御を行うための回路図です。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776664/8a72147b-8565-2cb0-92ed-e4cbd46c7f74.png)
　Raspberry Pi4 model BのGPIOピンの出力が基本3.3 V, 最大 5Vで、ピンチバルブの24Vに全く足りないので、外部電源としてスイッチング電源を使用しています。
　フリーホイールダイオードは、バルブの中に組み込まれているかもしれませんが、回路保護のためつけています。
　バルブ数を増やすときは、バルブ、フリーホイールダイオード、トランジスタ、抵抗を同様に増やせば問題ないです。ただ、GPIOの一つの3.3 V出力ピンから$(3.3 - 1) \~ \mathrm{V}/ \~ 510 \~ \mathrm{Ω} = 4.5 \~ \mathrm{mA}$で電流が流れる計算であり、GPIOピンは合計50 mAまでしか流せないので、接続数が8を超える場合は別の回路が必要となります。


## 必要な器具の購入
　リストを作成して購入しました。
 https://github.com/KatsuyaIkebata/TaylorFlowControl/blob/main/common/ApparatusList.xlsx
　主に電子部品は秋月電子通商から、ほかの器具はアズワンやモノタロウなどから入手しました。
　秋月電子通商はすごく便利です。
　制御用にRaspberry Pi 4 Model Bを購入しました。今後はこちらの環境で装置システムを構築します。

## Raspberry Piの初期設定
　以下のステップで初期設定を行いました。
1. Raspberry Pi 3 Model Bの初期設定記事（https://x-tech.pasona.co.jp/media/detail.html?p=9013 ）を参考に、初期設定を行いました
1. VNCを用いてパソコンからリモートデスクトップ接続ができるようにしました（https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-vnc/ ）

なお、ステップ2において、設定でVNCを有効にしてもRealVNCのアイコンが表示されないという問題が生じたため、ターミナルを開き
~~~ ruby:ターミナル
sudo raspi-config
~~~
と入力
→6 Advanced Options
→A6 Wayland
→w1 x11
を選択し、再起動してからもう一度、設定でVNCを有効にしたところ表示されました。

　以下はコピペの方法についてのメモです。
　Windows → Raspberry Piへのコピペは以下の通りです。Windows側でコピーしたい文字を選択してCtrl + Cでコピー、VNC内でペーストしたいところにカーソルを合わせてCtrl + Shift + Vでペーストできます。
 
　逆に、Raspberry Pi → Windowsへのコピペは、VNC内でコピーしたい箇所を選択して右クリック→コピーして、Windows上でCtrl + Vです。

 2024/07/25追記
 　コードのコメントを日本語で書きたかったため、fcitxをインストールしました。
  fcitxのインストールにはhttps://raspida.com/install-rpi-ime/ を参考にしました。

　次回は、実際に回路を組んでみて動かそうと思っています。


# 5日目(-2024/7/11) Raspberry Piとシリンジポンプの接続、GitHubで新規デバイス追加
　Raspberry PiとシリンジポンプをUSBで接続し、稼働させました。
　下にRaspberry Piからシリンジポンプを稼働させるときのportを取得する方法を記録します。
　まず、homeディレクトリで
``` ruby: ターミナル
ls /dev/ttyACM*
```
または
```
ls /dev/ttyUSB*
```
と入力し、/dev/ttyUSB* や/dev/ttyACM*があるか確認してください。
　私は/dev/tty/USB0 と/dev/tty/USB1 が出力されました。これがシリアルポートとなります。
　サンプルコードとして、GitHubのコード(https://github.com/KatsuyaIkebata/TaylorFlowControl/blob/main/240621_outlet/WhileLoopPi.py )が使用できます。

　また、Raspberry PiからGitHubに接続するためSSHキーを作成しました。
　ChatGPTに訊いた手順でうまくいきました。
### SSHキーの作成
　以下のコマンドを入力してSSHキーを生成します。
```ruby: ターミナル
ssh-keygen -t rsa -b 4096 -C "your-email@example.com"
```
コマンドを入力すると、次のようなメッセージが表示されます。
```ruby: 出力
Generating public/private rsa key pair.
Enter file in which to save the key (/home/yourusername/.ssh/id_rsa):
```
ここで何も入力せずにエンターキーを押すと、デフォルトの場所（~/.ssh/id_rsa）にキーが保存されます。

次に、パスフレーズの入力を求められます。パスフレーズは10文字以上にしてください。
```ruby: ターミナル
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

### SSH公開キーをGitHubに追加する
　まず、生成した公開キーの内容を表示します。
```ruby: ターミナル
cat ~/.ssh/id_rsa.pub
```
　表示された内容をクリップボードにコピーします。 
　公開キーの内容はssh-rsaで始まり、メールアドレスで終わります。
　続いてGitHubにログインし、右上のプロフィールアイコンから「Setting」 を選択します。
　左側のメニューから「SSH and GPG keys」を選択し、「New SSH key」ボタンをクリックします。
タイトルを入力し（例：「My Laptop」）、コピーした公開キーを「Key」フィールドに貼り付けます。
「Add SSH key」ボタンをクリックします。

### リポジトリのリモートURLをSSHに変更する
　まずリモートリポジトリをRaspberry Piの任意のフォルダにクローンします。
```ruby: ターミナル
cd ローカルリポジトリを作成したいフォルダ
git clone git@github.com:KatsuyaIkebata/TaylorFlowControl.git
```
次に、ローカルリポジトリに移動して既存のリポジトリのリモートURLをHTTPSからSSHに変更します。
```ruby: ターミナル
git remote set-url origin git@github.com:your-username/your-repository.git
```
これにより、今後の操作はSSHを使用して行われます。

### 変更をプッシュする
　今後はWindowsと同様に操作できます。
```ruby: ターミナル
git add .
git commit -m "Your commit message"
git push origin main
```
　SSHキーのパスフレーズ入力が求められるので、パスフレーズは忘れないようにしましょう。

# 6日目(-2024/7/25)  回路の組み立て
　スイッチング電源とブレッドボードを接続しました。
　なお、スイッチング電源と片側コンセントを接続するとき、電源タップのNとLをテスターで確認する必要があります。危険を伴うので、詳しい人に見てもらってください。
  
  また、ブレッドボードを用いて回路を組み立てました(写真)。
  ![20240726_145048.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776664/c0f8aea7-5598-1549-3c2a-7adab645f838.jpeg)

注意！　はじめに購入したトランジスタは、よく言われるECB(えくぼ)の順ではなく、EBCの順でした。また、コレクタエミッタ間の電圧降下が約2.7 Vと大きかったので、買い直したものを回路に組み込んでいます。
https://akizukidenshi.com/catalog/g/g113601/
これはECBの順です。
　それにあわせて、抵抗も680 Ωのものにしました。新しい回路は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776664/98e1674c-d6d1-e8c6-219d-83eaf7422647.png)


# 7日目(-2024/7/26) ラズパイでバルブの制御
　ラズパイのGPIOピンのうち、使えるピンを確認します( https://deviceplus.jp/raspberrypi/raspberrypi-gpio/ )。
　私は、GND(29), GPIO6(31), GPIO13(33), GPIO19(36), GPIO26(37)の5つを使用しました。
　GPIO.setmode(GPIO.BCM)とすることで、BCM
番号でGPIOピンを指定できます（たとえばGPIO.setup(6, GPIO.OUT)とするとGPIO6を出力モードに設定できる)。
サンプルコード(https://github.com/KatsuyaIkebata/TaylorFlowControl/blob/main/240726_GPIOControl/GPIOtest.py )でGPIOピンに電流が流れるか、テスターを使って検査することができます。
　なお、GPIOピン同士は間隔が非常に狭いので、メスジャンパワイヤ(https://akizukidenshi.com/catalog/g/g108933/ )を挿しています。
 　電流が流れることを確認したので、実際にブレッドボードにジャンパワイヤのオス側を挿しこんでサンプルコードを実行しました。
  すると、5秒ごとにバルブが一つずつ起動し、すべて起動した30秒後にすべて停止することを確認しました。
  トランジスタによる電圧降下は無視できるほどで、フッ素ゴムチューブがしっかりとピンチされているので、問題ないと思います。


# 8日目(-2024/8/2) VScodeでラズパイ内ファイルを編集
　少し話題はそれますが、今までラズパイでpythonファイルをデバッグするときは、nanoエディタで直接編集するか、windowsに送ってVScodeで編集してラズパイに送っていました。
　VScodeでラズパイ内のファイルを直接編集することができたので、ここに記しておきます。

公開鍵認証を用いてVSCodeの「Remote - SSH」を使う（https://zenn.dev/bon/articles/vscode-remote-ssh)