EmRiverのハイドログラフを変更してみる

# 河川移動床実験模型　EmRiver
EmRiverとは，アメリカのEmRiver社が開発提供している小型の河川地形変動模型です．比較的小型の水路にEmRiver独自の軽量のプラスチック粒子を堆積物に使用することで，蛇行などダイナミックに変動する河川地形を短時間で実験的にシミュレートすることができる優れものです．

 https://emriver.com/?lang=ja

 河川地形の研究はもちろん，地形学の教育用ツールなど視覚的なわかりやすさを生かして，学会などの各種イベントでもよく用いられており，ブースにはいつも多くの人が集まっています．

EmRiverの中でも小型のEm2を用いて蛇行や砂州の発達に及ぼす流量変動の影響を調べるために，EmRiverの流量調節コントローラーのハイドログラフを使うことを考えました．コントローラーではいくつか設定済みのハイドログラフを使用できますが，いろいろなパターンを試してみたいので，EmRiver社の担当者さんに相談し，ハイドログラフを変更する方法を教えてもらいましたので，忘備録的にまとめておきます．

**※注意!　ハイドログラフ変更のためにはEmRiverのコントローラーを開けて，基盤にプログラマを接続してプログラムを書き換える必要があります．その過程で故障する可能性もありますのであくまで自己責任の上で実施してください．著者は責任を負いかねます．故障した場合，新しく購入する必要があるかも．．またコントローラーはK500を対象としており，古いものでは規格が違うものもあるようです．**

# 用意するもの

![DSC_3115.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260410/8172f2fc-384b-e461-3188-7ce9023279b0.jpeg)

**プログラマ**
コードを基盤にアップデートするためのプログラマです．ここでは教えていただいた下記USBTinyISPを用いましたが，機器の知識があれば他のプログラマでもできると思います．

https://www.aitendo.com/product/11633

**USBタイプBケーブル**
PCとプログラマをつなぐケーブルとしてUSBタイプBが必要です．

https://www.netattest.com/usb-type-b-2023_mkt_tst

**ジャンパーワイヤー　メスメス**
プログラマとEmRiverコントローラーの基盤をつなぐ配線であるジャンパーワイヤ－を6本用意します．両端はメスになっている必要があります．プログラマには6本一つにまとまったジャンパーワイヤーが同封されていると思いますが，規格によってはEmRiverの基盤に接続するには挿し口が大きくて入らない場合があるので，その場合はこのようなワイヤーを購入して接続します．

https://www.switch-science.com/products/56

**EmRiverのコントローラー**
電源とケーブルを取り外した状態にしておきます．

# Arduino IDEのダウンロード

コントローラーを制御しているプログラムを編集したり，プログラマを経由して基盤へuploadするためのソフトであるArduino IDEをダウンロードします．

https://www.arduino.cc/en/software

使用するOSのバージョンを下記の右側の表より選択してインストールします．寄付やnewsletter送付の案内もありますが，必要なければjust downloadを選択するとよいでしょう．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260410/121a1e28-a44f-d457-31e6-40a0a7187a36.png)

ダウンロードしたファイルを実行してインストールします．

# USB Tiny ISPの接続とドライバのインストール

プログラマであるUSB Tiny ISPとPCをUSBタイプBケーブルで接続します．正常に接続されていると下記のように黄緑のライトが点灯します．余談ですが，著者が最初に購入したUSB Tiny ISPは不良品であったためか，ここが赤いライトになっており，対応にはまり込みました．．その場合はあきらめて新しいものを購入しましょう．

![DSC_3116.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260410/9f0c90f8-a00c-7162-3c5b-2a8c00b0158f.jpeg)


接続後，ドライバをインストールする必要があるようです．接続しただけでは下記のデバイスマネージャーにあるように認識されていない状態です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260410/8377b859-932b-ce35-50e3-c6527fa5b555.png)

ドライバのインストールは自動ではできないようなので，下記よりインストールを行います．

https://learn.adafruit.com/usbtinyisp/drivers

Windows 7, 8 and XPとなっていますが，著者が使用しているWindows 10のPCでも大丈夫のようでした．adafruit_drivers_2.5.0.0.exeを実行して進んでうまくいくと以下のように認識されるようになると思います．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260410/db21afc6-0372-9465-fa75-d5de892861ff.png)

# USB Tiny ISPとEmRiver基盤の接続

EmRiverコントローラーの四隅にあるねじをドライバーで外してふたを開けてEmRiverの赤い基盤が見えるようにします．**このとき，ふたのディスプレイと基盤のケーブルを外す場合は基盤のどこに刺さっていたか，写真をとっておくことをお勧めします．あとでわからなくなります** 

ジャンパーケーブルで下記の番号が合うように基盤とプログラマを接続します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260410/4402ea33-5c57-1c86-c4fc-178271d35737.png)

下記が接続した例になります．

![DSC_3118.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260410/b838b624-6d6f-e042-972c-8abd58bf6926.jpeg)


# Arduinoでコードの編集とアップロード

先ほどインストールしたArduino IDEを立ち上げます．初回立ち上げ時にはなにやらドライバがインストールされますが，すべて許可していきます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260410/f77d74c3-5134-d73b-9703-db438732a517.png)

FIle→OpenからEmRiver社さんから提供されたコード（K500_v3-1-22.ino，別途問い合わせ必要）を開きます．

次にTools→Board→Arduino AVR Boardsと進み，Arduino Unoを選択します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260410/dd06aa47-706d-b6c3-8290-b716f03c9985.png)

その後，Tools→Programmerから使用しているプログラマを指定します．ここでは，USBtinyISPになります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260410/f811d8cc-b573-f815-58aa-3b5d9f436ee2.png)

さらに，Tools→Burn Bootloaderと進みます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260410/c4d6af8f-7541-455a-4512-c8dbdba31510.png)

うまくいくと，プログラマのもう一つのライトが下記のように一瞬赤く光ります．

![DSC_3119.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260410/5c6d3dd9-bf62-ed73-a68d-68930eca9b82.jpeg)



この上で，ハイドログラフを変更していきます．プログラムの179行目あたりに以下のような記述があります．これがハイドログラフの流量値(ml/s)になっており，ここに書いてあるように30sおきの値になります．最大で30分，つまり，60個の数字を書くことができます．ここの値を変更することでハイドログラフが変更できます．

```
//Hydrographs, values are flow setpoints at 30s spacings, max length is 30 minutes
const uint8_t flashy[] = { 40, 66, 105, 100, 90, 85, 82, 76, 66, 60, 58, 50, 45, 40, 25, 25 }; //8 Minutes
const uint8_t classichigh[] = { 29, 38, 44, 54, 58, 67, 74, 80, 91, 102, 110, 117, 115, 113, 102, 99, 93, 84, 82, 80, 78, 73, 69, 66, 62, 58, 55, 51, 47, 44, 40, 37, 33, 25, 25 }; //17.5 Minutes
const uint8_t megaflood[] = { 40, 68, 90, 110, 130, 150, 160, 170, 170, 165, 160, 155, 150, 146, 139, 132, 125, 121, 113, 107, 96, 89, 82, 75, 68, 60, 53, 51, 51, 45 }; //15 Minutes
const uint8_t classic[] = { 25, 30, 48, 56, 66, 82, 95, 106, 92, 80, 75, 72, 69, 65, 62, 60, 57, 55, 52, 50, 47, 45, 41, 38, 35, 31, 25, 25, 25 }; //14.5 Minutes
const uint8_t flashyhigh[] = { 25, 126, 160, 155, 120, 102, 80, 60, 50, 40, 30, 25, 25 }; //6.5 Minutes
const uint8_t regulated[] = { 40, 50, 50, 70, 70, 70, 70, 70, 70, 50, 50, 70, 70, 70, 70, 70, 50, 50, 50, 50, 70, 70, 70, 70, 50, 50, 50, 50, 50, 70, 70, 70, 70, 50, 50, 50, 70, 70, 70 }; //19.5 Minutes
uint16_t currenthydro[maxhydro] = {}; //The longest hydrograph can be .5 hour (60, 30-Second intervals) I needed a number for this, Increasing maxhydro uses up loads of memory
```

最後にSketch→Upload Using Programmerによって変更したプログラムを基盤にuploadします．うまくいくと，doneというようなメッセージが出て完了すると思います．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260410/7e9f1e3e-cec0-e616-53b0-0b7f50906bc4.png)

これでハイドログラフの変更は終了です．コントローラーの基盤からジャンバーケーブルの引き抜き，ふたを閉めて，また元通り接続して流量が変更になっていることを確認してみてください．

# おわりに
実際に水を流して確認したところ，30秒おきに設定した流量値に徐々にあっていき，その後，次の値まで設定した流量値が流れるので，徐々に変化するというよりは階段状に流量が変化しているようです．