フリップドットディスプレイ[Flip-Dot Boards XY5]を入手からRaspi4で動かすまで

# フリップドットディスプレイを入手からRaspi4で動かす

### 入手の話
フリップドットディスプレイという以下の写真みたいなディスプレイがあり

![IMG_0543.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667657/0593e67d-6eb3-47d7-8eb2-bb4df73fdf89.jpeg)

このようなディスプレイを動かしてみたいっと思っていろいろ調べてみてたけど
日本人でフリップドットディスプレイについて記事を書いている人がチラホラ見かけたので
[その人](https://blog.iizukak.com/entry/2016/09/18/225731)を参考に[ALFA ZETA の Flip-Dot Boards XY5](https://flipdots.com/en/products-services/flip-dot-boards-xy5/)を購入してみました


ALFA ZETAさんはメールからの注文なのでなかなか手を出しにくいけど中古もどうかなって
とおもってメールで「Flip-Dot Boards XY5はいくらぐらいですか」って送ったら
値段表が来て「色々なサイズがあるよー」っていう感じでメールが届きましたね。


けど思ったよりも高くて、自分は28x7のもので我慢しましたがそれでも送料込みで
５万くらいでしたね　(学生にはきつい)
まあそのあと色々とユーロで支払いやら住所と名前を送って届いたかんじですね。


もちろんRaspiで動かす用のHATとマニュアルも送ってもらったので良かったけど全部英語
なのでなんもわからんからグーグル先生に教えてもらいながらやりましたね。
そんで「pythonで動かすサンプルコードってある」っていう質問をしてみたら
「[pyserial](https://pypi.org/project/pyserial/)を使えば基本的には制御できるよー　制御プロトコルはこんな感じ」
と来てPDFで仕様書をもらいました　
(だけどあんまりわからんかったから手探りで色々試した)

#### 結果このような制御方法だとわかりました
(手探りだから完璧に合ってるとは言えないけど)

githubからでも見れるよー

https://github.com/mokuttii/Flip-Dot-Display

### Alfa Zeta Flip Dot Display XY5 28x7 操作説明

Alfa Zeta Flip Dot Display XY5 28x7を制御する方法制御コマンドは
シリアルインターフェースを介して送信され、特定のバイト構造で構成されます。

## コマンド構造

ディスプレイを制御するためのコマンドは以下のように構成されています：
(データフレーム)

```python
all_dark = bytearray([ #全部黒にするやつね
    0x80,  # ヘッダ
    0x83,  # 28バイトのリフレッシュ
    0xFF,  # アドレス
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # 28バイトのデータ
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x8F # 伝送終了（EOT）
])
```

- **0x80**: ヘッダバイト

- **0x83**: 28バイト、リフレッシュ

- **0xFF**: アドレスバイト

- **0x00** から**0x7F**: 28バイトのデータ

- **0x8F**: 伝送終了（EOT）

### バイトの説明

- **0x00から0x7F**: これらのバイトは、7x28グリッドの28列を表します。各列は16進数の値で表され、最大値は0x7F（10進数で127）です。この値は、その列の7ビットのデータに対応し、各ビットはドットのオンまたはオフの状態を表します。

たとえば、2進数値の**1111111**は16進数値の**0x7F**に変換され、1列の7つのドットがオンであることを示します。

### 7x28グリッドの表現
以下は、7x28グリッドの視覚的な表現です。各ドットはオン（*）またはオフ（.）の状態を示します。


```plaintext
    0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
1   .  .  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
2   .  .  .  *  .  *  .  *  .  *  .  *  .  *  .  *  .  *  .  *  .  *  .  *  .  *  .  *
3   .  .  .  .  *  *  .  .  *  *  .  .  *  *  .  .  *  *  .  .  *  *  .  .  *  *  .  .
4   .  .  .  .  .  .  *  *  *  *  .  .  .  .  *  *  *  *  .  .  .  .  *  *  *  *  .  .
5   .  .  .  .  .  .  .  .  .  *  *  *  *  *  *  .  .  .  .  .  *  *  *  *  *  .  .  .
6   .  .  .  .  .  .  .  .  .  .  .  .  .  *  *  *  *  .  .  .  .  .  .  *  *  *  .  .
7   .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  *  *  *  .  .  .  .  .  *  *  .  .
    0x00 0x00 0x01 0x03 0x05 0x07 0x09 0x0B 0x0D 0x0F 0x11 0x13 0x15 0x17 0x19 0x1B 0x1D 0x1F 0x21 0x23 0x25 0x27 0x29 0x2B 0x2D 0x2F 0x31 0x33 0x35 0x37
```
この下の0x**になっているところに１６進数を入れる感じ
**簡単に言えば、表示させたい１列のドット表示を２進数として考えてそれを１６進数へする
それが27個ある感じ**

## 制御セットアップ
![DIP スイッチ設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667657/95e65a43-4dc5-49c4-9a9f-cb05cd6a2dac.jpeg)


### アドレスバイトの説明

- コード側では**0xFF**と今はなっているけど基本的にはここにはそのパネルの裏にある
- DIPスイッチと同じにする　**(写真の8ピンDIP側)**
この写真だと**0x01**となっているからコード側でも**0x01**にしないといけない
基本的に後ろのＤＩＰスイッチは２進数なのでそこだけ注意かな
demoを動かすのなら8ピンをオンすればOK

8ピンDIPの説明
------------------------------
1-6  | アドレスをバイナリコード（自然順）
7    | 磁化時間：OFF: 500μs（デフォルト）、ON: 450μs
8    | テストモード：ON/OFF。OFF = 通常運転


### ボートレートの説明
**ボーレート (3ピンDIP)**
通信速度は以下のように設定できます。写真の設定に従うと、速度は9600になります。

3ピンDIPの説明
-----------------------------------------
0     | ↓ ↓ ↓               | なし
1     | ↑ ↓ ↓               | なし
2     | ↓ ↑ ↓               | なし
3     | ↑ ↑ ↓               | 9600
4     | ↓ ↓ ↑               | 19200
5     | ↑ ↓ ↑               | 38400
6     | ↓ ↑ ↑               | 57600
7     | ↑ ↑ ↑               | 9600
オフ  |                      |

### 追記　24V電源もいるからねー　詳しくは[この記事](https://garretlab.web.fc2.com/arduino/lab/flipdotdisplay/)

## Raspi4で動かしてみた

Raspiで動かすんだったらRS-485を変換する**HAT**が要ります(USBに変換する物でもＯＫ)
だけど自分はALFA ZETAさんからHATも貰ったのでそれを使いました
![スクリーンショット 2025-03-10 201858.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667657/883f092b-3b8c-4dbb-8e83-e757260e0a91.png)

これでRS-485を変換してディスプレイに接続する感じ

### 接続を完了したら


**シリアルポートを有効にしてシリアルコンソールを無効にする**:

Raspberry Pi 構成ツールを開きます:
```bash
sudo raspi-config
```
1. 「Interfacing Options」に移動して、「Serial」を選択します。

2. 「ログインシェルをシリアル経由でアクセスできるようにしますか?」と尋ねられたら、「No」を選択します。

3. 「シリアルポートハードウェアを有効にしますか?」と尋ねられたら、「Yes」を選択します。

4. 構成ツールを終了し、Raspberry Pi を再起動します:
```bash
sudo reboot
```
 **`flip` ディレクトリを作成してそこに移動します**:
```bash
mkdir flip
cd flip
```

**リポジトリを `flip` ディレクトリにクローンします**:
```bash
git clone https://github.com/mokuttii/Flip-Dot-Display
cd flip
```

**仮想環境を作成します**:
```bash
python3 -m venv env
```

**仮想環境をアクティブにします**:
```bash
. /env/bin/activate
```

**必要な依存関係をインストールします**:
```bash
pip install opencv-python pyserial
```
これで環境構築は終わりー

```bash
python3 demo.py
または
python3 start.py
```
で動くよー

**(一応)仮想環境をアクティブにしないと動かないです**
```bash
. /env/bin/activate
```


### とりあえず フリップドットディスプレイで動画を再生したよ
**bad apple** 

https://www.youtube.com/watch?v=qY5p3bfn78A&ab_channel=mokuttii

次はテトリスでも作ろうかな

--------
**引用**　又　**参考になった**

購入元

https://flipdots.com/en/products-services/flip-dot-boards-xy5/

購入に関する記事を書いている人

https://blog.iizukak.com/entry/2016/09/18/225731

arduinoで制御している人たち

https://garretlab.web.fc2.com/arduino/lab/flipdotdisplay/

https://blog.iizukak.com/entry/2016/09/24/175721

海外の人でraspiを使って制御している人

https://www.instructables.com/Howto-Flipdot-With-a-Raspi/