Windows10 + SPIDriver で SK9822 を光らせる

# やったこと

SPIDriverにAdafruit DotSTAR互換LEDのSK9822をつないで光らせてみました。
- https://www.crowdsupply.com/excamera/spidriver

SPIDriverは、PCからUSB経由で直接コントロースできるデバイスで、SPI信号(SCK,MISO,MOSI,CS)がClassとして提供されます。また、SK9822は、2線式3チャネル(RGB)駆動のフルカラーLEDです。本記事では、開発元から提供されているサンプルコードを使用して、LEDを点灯するまでの手順を報告します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/a6ea0cff-b775-e9e1-5c93-9976f7385ccb.png)

# 機材

1. SPIDriver(Excamera)
2. SK9822(DONGGUANG OPSCO OPTELECTRONICS)
3. Windows 10 PC

# 準備

SPIDriverをUSBケーブルで、PCと接続します。接続すると以下のような画面が表示されます。

表示画面と信号線の対応は以下の通りです、表示色と同色のケーブルが付属しています。
ケーブルは、画面表示色に合わせて使用すると間違いが少なくなると思います。


| SCK | orange |
|:----|-------:|
|MISO |	yellow |
|MOSI |	green |
|CS	| blue |
|A	| purple |
|B	| gray |

## ソフトウェアのインストール

　最初に、”SPIDriver USER Guide”を参照して下さい。ユーザガイドに沿って作業を進めます。

- https://spidriver.com/spidriver.pdf

　SPIDriverのソフトウェアは、Windows/Mac/Linuxに対応していますが、本記事ではWindowsを使用します。

- 最初に、ユーザガイドのinstaller (https://spidriver.com/windows) をクリックします。
- ダウンロードした ”spidriver-installer.exe”をクリックします。
　以下のソフトウェアがインストールされます
　
- Windows GUI 
- indows command-line
- python 2 and 3
- Windows C/C++

また、インストールが終了すると、デスクトッップ上にGUIのショーカットが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/5def20c4-e20d-97a4-8e55-7f1f9e005e7d.png)

(30ショートカットをクリックすると以下の画面が表示されます。
上部のドロップダウンメニューから、接続されているCOMポートを選択することができます。
また下部の空欄に2バイトの16進数を入力し、転送(Transfer)を押すことによって、PCからSPIDriver経由で、接続されたデバイスに信号を送ることができます。送信された信号と、デバイスからの応答が、SPIDriverの画面に表示されます。まずは、GUIツールで、動作確認するとよいと思います。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/5df44ec8-2ddd-53e3-0ae5-572c2d354d7c.png)
 
## LEDテープを光らせる

本記事では、SPIDriverをPythonで書かれたサンプルプログラムを使用します。

Python 2/3 用ドライバのインストール

```
$ pip install spidriver
```

SPIDriverとLED(SK9822)テープを下記の写真のように接続します。画面の表示色、付属ケーブルの色、及び並び順をしっかり合わせると間違いがないと思います。


## SK9822のピン配置（データシートより）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/036351b8-2e59-ade0-19ff-045ba4792bbc.png)


|SPIDriver	 | SK9822	| Color	| comment|
|:---------------|:-------------|:------|:-------|
|SCK	         |CKI	|orange	|クロック信号 |
|MISO	        |	|yellow	|未使用    |
|MOSI	        |SDI	|green	|RGBデータ|
|CS	        |	|blue	|未使用|
|A	        |	|purple	|未使用|
|B	        |	|gray	|未使用|
|POWER(5V)	|VCC	|red	|電源(5V)|
|POWER(GND)	|GND	|black	|電源(接地）|


## SK9822の典型的な回路構成（データシートより）
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/142a16cd-f14b-ca66-6620-bc22ca7f4ff6.png)


 ソースコード（標準のExample Code）
　今回使用したサンプルコードは、以下のgithubリポジトリからダウンロードします。
　
　https://github.com/jamesbowman/spidriver/tree/master/python/samples

　インストール先は以下の通りです。
　　(インストールの際の格納先）/spidriver-master/python/samples/leds.py

(使用したコード)
  
 9行目の” s = SPIDriver(sys.argv[1])”で、使用するCOMポートを指定します。

```sample.py
!/usr/bin/env python3
# coding=utf-8
import colorsys
import sys
 
from spidriver import SPIDriver
 
if __name__ == '__main__':
    s = SPIDriver(sys.argv[1])
    L = 300
 
    blanking = [0] * ((L + 31) // 32)
    s.write(blanking + [0x80, 0x80, 0x80] * L + blanking)
 
    rainbow = sum([colorsys.hsv_to_rgb(float(i) / L, 1, 1) for i in range(L)], ())
    rainbow = [int(128 + 127 * v) for v in rainbow]
    while True:
        s.write(rainbow + blanking)
        rainbow = rainbow[3:] + rainbow[:3]
```

　(4)windowsのコマンド・プロンプトで、pthonパッケージののインストール

```
　　 $ pip install spidriver
```

　(5)pythonフォールダを作成してコードを格納します。

```
　　C:\python\ledtest.py
```

　　(注)名称を”ledtest.py”に変更しています。


# 点灯テスト

　準備が整ったので、SPIDriver経由でSK9822を点灯させます。

1. windowsのコマンド・プロンプトを起動します。
2. サンプルプログラムの格納先にパスを通してから、pythonを実行します。

```
C:\Users\mpp>cd c:\python
c:\python>python ledtest.py com13
```

3.点灯しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/7e593e2c-282e-01b7-80ea-e7835c8edd41.png)


# 【補足説明】

ユーザガイドより

## SPIDriverのコマンドラインツール(spocl)の操作方法

　コマンドラインからの操作は、プラットフォームに依存しません。

・第1パラメータ：シリアルポート番号（ポート番号の表示はOSに依存します）
・以下に、コマンドとパラメーターを示します。

```
　i ： ステータス情報の表示（時刻 voltage, current, temperature)
　s ：SPIデバイスの選択 
　u ：SPIデバイスの非選択
　w ：SPIデバイスへの書込みバイト（複数）
　r ：SPIデバイスからの読み込みバイト数
　a：0/1 Aラインにセット
　b：0/1 Bラインにセット
```

（コマンド使用例）

```
　$ spicl /dev/ttyUSB0 s w 0x9f r 3 u
```

　内容を以下に示します。

```
　s ：SPIデバイスの選択
　w 0x9f ：バイト情報 0x9f を書込む
　r 3 ：スレーブから3バイト読込む
　u ：SPIデヴァイスを非選択にする
```

　バイト情報の値は,10進数がデフォルトで、16進数の場合はプレフィックス 0x を付けます。複数バイトを送信する場合は、1バイトずつ別々にコマンドとともに、送信します。

(後日修正予定)