USBデバイスが作りたいんじゃ：CPUメーター

#はじめに
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/e28d4f24-64a3-57dd-631f-d9a5119c7e7b.png" width=50%>

[Digispark](http://digistump.com/products/1)互換をAmazonで購入し、まだ世に出てないっぽい「**Digispark CPU Meter**」を作ってみた。CPU負荷の他にパフォーマンスモニタ風に表示した。
([YouTube](https://youtu.be/RqtdDrryobQ))

##利用場面
**ノートPCに**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/a12e20ea-7a62-2450-9211-a4539f8a929c.png" width=50%>
**サーバーなどに**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/a605ac3c-f9a1-ebc9-feb1-29e9100cfcc2.png" width=50%>
**RaspberryPiで**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/ff46c698-94b0-4bdf-212b-486538ee5bb7.png" width=50%>

#ハード
* Digispark（[Amazonで300円/1個](https://www.amazon.co.jp/s?k=digispark+attiny85)）
* SSD1331 96x64 OLEDディスプレイ（[Amazonで1,300円/1個](https://www.amazon.co.jp/dp/B08FM7HFM6/)）
* Windows10(母艦)
* ユニバーサル基板、ワイヤ、抵抗、コンデンサ等（回路図参照）
* ケースは 100均のフォトスタンドの透明プラスチックを切って作った
* ネジは M2x20

##Digispark
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/313b86af-a4a0-fbbd-acb3-dbef2c9003ad.png" width=20%>Amazon
[開発元はここなのですが](http://digistump.com/products/1)、Amazonで買えるのはほとんど互換品。PB5ピンが初期では使えなくなっているとかあり、他は問題なく使えている。Windows10で開発するには [こちらのサイト](https://wave.hatenablog.com/entry/2017/03/11/083000)通りに行った。USB-HIDとして使用する分にはドライバのインストールは不要なのだが、ArduinoIDEで開発するには開発用ドライバのインストールが必要だった。
プログラム用メモリが実質6KBしかないので、使用するライブラリはかなりシビア。有名所のグラフィックライブラリはほとんど使えなかった。

##OLED SSD1331
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/a0dc0ac4-36aa-04dc-6ee5-6845ca936618.png" width=20%>Amazon

[DataSheet](https://www.makerfabs.com/desfile/files/0.95inch_RGB_OLED_ds.pdf)

#開発環境
* ArduinoIDE 1.8.12
* Visual Studio 2019 (Community 無料版)

#システム概要

##CPUメーター(Digispark+OLED)
Digisparkと OLED(SSD1331)を SPI接続する。回路図は下記参照。

DigisparkのP3,P4は USB で使用するため他の用途では使用できない。中華Digisparkでは P5 は REST になっているため初期状態では使えません。
なのでP0,P1,P2の３つでSPIをするのに苦労した。使えそうなディスプレイ＋SPIライブラリがないか色々探したところ、[ここにたどり着きました](http://www.technoblogy.com/show?2EA7)。このページでは生ATtiny85だが、Digisparkも中身はATtiny85なのでバッチリ。

スケッチは、ArduinoIDEで作成。HIDライブラリは [v-usb](https://www.obdev.at/vusb/) を使用した。

RapsberryPi用は以下を有効にする。

```cpp:DigiCPUMeter.ino
//#define _RASBERRYPI // to use RaspberryPi
```


###USB転送方式
今回のUSB転送方式は、コントロール転送 を使った。比較的簡単に扱えるが転送データ量は小さいため、コマンドぐらいの用途で使用されるのが一般的。
今回は、ホストプログラムから データ5byte を デバイスに送るようになっている。

###回路図

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/6d626421-f72f-fa9e-971d-9dffd3fe2b35.png" width=50%>
※5V/GND はDigisparkのUSBより供給される。
※SSD1331は3.3Vに降圧した方が良いかもしれません。

## Windows10
Windows10環境では、タスクマネージャーの下記赤線部を表示している。

* スクショのタイミングが違うので写真と一致していない。
* Network は、送受信の合計を Kbps/Mbps で表示。目安程度かな。

| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/abac4ec3-790f-f22a-baae-4afb6f75f246.png" width=80%> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/af96a3ac-bdaa-d388-a2bc-2e505b1b0377.png" width=50%> |
|:-:|:-:|


USB は HID を使うため、実行環境にドライバをインストールする必要はない。ただしCPU負荷などをDigisparkに送るホストプログラムが必要。
ホストプログラム(CPUMeter.exe)は、C# で作成した。HIDライブラリとして [HIDSharp](https://www.zer7.com/software/hidsharp) を使用した。


##RaspberryPi
RaspberryPi環境では ```$ dstat``` [コマンド](https://qiita.com/aosho235/items/c4d6995743dd1dac16e1) の出力の下記赤線部を表示している。

* スクショのタイミングが違うので写真と一致していない。
* Memoryはpagingのout値が1以上だと <font color="Red">[swap]</font> が赤くなる。
* TempはCPU温度(```$ vcgencmd measure_temp```)。
* CPU は、100 - idl を表示した。
* Network は、送受信の合計を Kbps/Mbps で表示。目安程度かな。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/2887d75a-de44-8b2b-5a12-a98b059d0eb6.png" width=60%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/50c8b8d3-11ba-6b43-7203-392c7afa88fe.png" width=30%> 

ホストプログラム(CPUMeter.js)は、Node.js で作成した。
HIDライブラリとして [node-hid](https://www.npmjs.com/package/node-hid)、USB 監視ライブラリとして [usb-detection](https://www.npmjs.com/package/usb-detection) を使用した。
パフォーマンス収集として [dstat](https://qiita.com/ryuichi1208/items/387fa1cba44690c3db9b) の 標準出力を利用している。よって、dstat のインストールが必要。

```$ sudo node CPUMeter.js > /dev/null &```

#ソースコード
HID周りのコードは、[こちらのコード](http://milkandlait.blogspot.com/2017/08/digisparkgcc-lfreebsd.html)を利用させて頂きました。
SSD1331ディスプレイ制御用のコードは、[こちらのコード](http://www.technoblogy.com/show?2EA7) を利用させて頂きました。回路も参考にさせて頂きました。

github:https://github.com/nori-dev-akg/Digispark-CPU-Meter

#おわりに
もちょっとキレイなケースなどにすれば、千円ぐらいで売れるんじゃないかな？と思うぐらいの出来になりました。材料で2千円弱なので大赤字。ディスプレイが500円ぐらのを見つければ行けるかな。Macを持っていないのでMac版は作れていません。

YoutTube
<iframe width="560" height="315" src="https://www.youtube.com/embed/RqtdDrryobQ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

#Special Thanks!!!
* https://qiita.com/takeru@github/items/42873e1a7e0aef830eea
* http://milkandlait.blogspot.com/2017/09/digisparkgcc-usb-hid.html 
* http://www.technoblogy.com/show?2EA7
* https://github.com/obdev/v-usb
* https://www.zer7.com/software/hidsharp
* https://wave.hatenablog.com/entry/2017/03/11/083000
* https://qiita.com/ryuichi1208/items/387fa1cba44690c3db9b