ArduinoでMAX7219を使った8×8×4のLEDドットマトリックス用Parolaライブラリを使うときに、LEDの並びがおかしかったらどうするか

#はじめに
Amazonで買った8×8×4のドットマトリックスをArduinoで使うときにちょっと躓いたので書いておきます。
![AMZN_2020-03-24_22_07_57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216739/32624183-adeb-5a3a-6be7-7b9c778d2a8a.jpeg)

購入したのは[kwmobile 8x32 LED ドットマトリックス モジュール - Raspberry Pi Arduino DIY キット MCU - ディスプレイ 表示モジュール MAX7219](https://www.amazon.co.jp/gp/product/B06XJ9ZX17/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1)
似たようなものがあちこちで1000円前後で売られています。
中国から直接買うともっと安いと思います。
8セグメントLED制御ICのMAX7219と8×8のLEDドットマトリックスを組み合わせたものを４つ数珠繋ぎにしたものです。SPIでマイコンに接続して動かします。

#ライブラリ
このタイプのドットマトリックスのライブラリはいろいろあって迷うのですが、
[Parola for Arduino 2.0 - LED Matrix with MAX7219 controller](https://www.youtube.com/watch?v=u1iELyROjW8)
このYoutubeのデモをみてParolaを使うことにしました。

必要なライブラリは
[https://github.com/MajicDesigns/MD_MAX72XX](https://github.com/MajicDesigns/MD_MAX72XX)
![MD_MAX.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216739/4b4f8a35-ce93-c12c-965d-0b3c197988df.png)
[https://github.com/MajicDesigns/MD_Parola](https://github.com/MajicDesigns/MD_Parola)
![MD_parola.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216739/5c890d33-4e8e-04a3-e64b-1c08e6d20136.png)

の２つです。ライブラリの管理からそのままインストールできます。
ライブラリをインストールするとMD_Parolaのスケッチ例にHelloWorldが追加されるので、ArduinoUnoに繋いで動かしてみます。

#Arduinoとの接続
接続は次のようになります
このとき、ArduinoUnoがマスターでドットマトリックスがスレーブです。

|基板のピン|ArduinoUnoのピン|備考|
|---|---|---|
|CLK|Digital13(SCK)|System Clock<br>システムクロック<br>SPI通信の同期信号|
|CS|Digital10(SS)|Slave Select<br>スレーブセレクト<br>このピンがlowのときマスターとの通信が有効になる<br>このピンがHighのとき、スレーブは通信を無視するようになる|
|DIN|Digital11(MOSI)|Moster Out Slave In<br>マスターアウトスレーブイン<br>SPI通信でマスター側からスレーブ側への信号を送信する<br>SPI通信にはこれとは逆にMISOというスレーブ側からマスターに信号を送るピンがあるが、LEDマトリックスからマイコンに信号が送られることはないのでこれは省略されえている|
|GND|GND|グランド|
|VCC|5V|LEDの電源<br>数珠繋ぎを長くすると、Arduinoの給電能力を超えるかも<br>そのときは安定化電源を繋ぐ必要があるかもしれない|

#Helloサンプル
```c++:Parola_HelloWorld.ino
// Program to demonstrate the MD_Parola library
//
// Simplest program that does something useful - Hello World!
//
// MD_MAX72XX library can be found at https://github.com/MajicDesigns/MD_MAX72XX
//

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 11

#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10

// Hardware SPI connection
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// Arbitrary output pins
// MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

void setup(void)
{
  P.begin();
  P.displayText("Hello", PA_CENTER, 0, 0, PA_PRINT, PA_NO_EFFECT);
}

void loop(void)
{
  P.displayAnimate();
}
```
最大デバイス数が11になっているので4に変更します。

```
#define MAX_DEVICES 4
```

#トラブルシューティング
しかしこれを使ってもそのままでは動きませんでした。
![AMZN_2020-03-24_22_11_10 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216739/7ef70165-ce8c-aa0e-c22f-fd4a59ec27f1.jpeg)
左右が反転してしまっています。

これに関して検索してみると、公式のフォーラムで回答を見つけました。どうやらこのトラブルは定番のようです。
[Topic: Parola for arduino problem. My texts are reversed! ](https://forum.arduino.cc/index.php?topic=214150.15)
>FIXED
>For those of you who are still struggling, replace the PAROLA_HW with your appropriate type on this line:
>\#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
>
>PAROLA_HW <br>Use the Parola style hardware modules.
>
>GENERIC_HW<br>Use 'generic' style hardware modules commonly available.
>
>ICSTATION_HW<br>Use ICStation style hardware module.
>
>FC16_HW<br>Use FC-16 style hardware module.

どうやらハードウェアの構成が4種類があり、

```
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
```

の"::"以降を変更すれば正常に表示できるようです。
さらに詳しい情報はこちらにありました。
[Parola A to Z – Adapting for Different Hardware](https://arduinoplusplus.wordpress.com/2017/04/14/parola-a-to-z-adapting-for-different-hardware/)
LEDの取り扱い方が異なっているようです。
回路を調べるよりは総当たりで正常に表示されるものを使ったほうが早そうです。
##PAROLA_HW
![AMZN_2020-03-24_22_11_10 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216739/7ef70165-ce8c-aa0e-c22f-fd4a59ec27f1.jpeg)
左右が反転してしまっています。


##GENERIC_HW
![AMZN_2020-03-24_22_37_41 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216739/82733ba5-cdcb-b371-dd81-f39db2743115.jpeg)
これはLEDマトリックスの配置が縦になると正常に表示されそうです。
##ICSTATION_HW
![AMZN_2020-03-24_22_09_07 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216739/cdaff0b3-6d59-970a-0da2-a664994ce62a.jpeg)
コネクタが右側にきましたが、正常に表示できました。
##FC16_HW
![AMZN_2020-03-24_22_47_10 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216739/38aa8a58-6b81-153e-c7e4-5bef18498994.jpeg)
ドットマトリックス自体の順番がおかしくなっています。

よって、ICSTATION_HWを使えば問題なく表示できるようです。
#おわりに
Parolaのライブラリを使って、ドットマトリックスにHelloを表示させることができるようになりました。
スクロール表示等はまだですが、これからやっていきたいと思います。