ピクセルアートフレーム Divoom PIXOO で遊んでみた

# はじめに

これは社内LTイベンント向けの資料です。

---

# 今日のお題「ガジェット」

- Maker's Fair Tokyo 2019 行ってきました
    - 2019.08.03 - 08.04 
    - [https://makezine.jp/event/mft2019/](https://makezine.jp/event/mft2019/)
- 買ったもの： ピクセルアートフレーム Divoom PIXOO
    - [http://www.divoom.com/product/pixoo.html](http://www.divoom.com/product/pixoo.html)

<img width="685" alt="divoom_pixoo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19403/9e42ece3-98ba-f9bf-95e4-b5992409ccbf.png">

---

# Divoom PIXOO

- ハード
    - 16x16 の LEDパネル
        - スピーカーは無し（付いている機種もある）
    - Bluetooth接続
        - WiFiは無し
- スマートフォンの専用アプリでコントロール
    - Divoom ([iTunes](https://apps.apple.com/jp/app/divoom/id1237452417))
    - 共有ギャラリーもある

---

# Divoom アプリでできること

- 静止画の描画、PIXOOへの転送
- アニメーションの作成、PIXOOへの転送
- テキストから、簡易電光掲示板の作成
- つくった静止画/アニメーションの公開、他の人の作品のダウンロード
- 組み込みアプリの利用（ここでデモ）
    - 時計、カレンダー、天気情報
    - 通知の連携
    - 各種VJ風アニメーション
    - 音のビジュアライズ

---

# PIXOO ハック！

- やりたいこと: パトランプ的に使いたい
    - PC/Macから、自分のプログラムでコントロール
- 参考情報
    - 解析情報 ... protocol ([github/MarcG046/timebox](https://github.com/MarcG046/timebox/blob/master/doc/protocol.md)) 
        - Bluetooth シリアルで 「01 04 00 45 00 49 00 02 」等を送る
    - 解説動画 ... Timebox Hacks ([youtube](https://www.youtube.com/watch?v=AxLrxUsjFd8))
    - Python ライブラリ ... [derHeinz/divoom-adapter](https://github.com/derHeinz/divoom-adapter)
    - Node.js ライブラリ ... [RomRider/node-divoom-timebox-evo](https://github.com/RomRider/node-divoom-timebox-evo)

---

# Node.js でやってみる

不安定だが、限定的に動作

- 接続できないことがある
- 一部の機能しか使えない

(1) 接続

```js
const TIMEBOX_ADDRESS = "xx:xx:xx:xx:xx:xx"; // Bluetoothアドレス

const btSerial = new (require('bluetooth-serial-port')).BluetoothSerialPort();
const Divoom = require('node-divoom-timebox-evo');

btSerial.findSerialPortChannel(TIMEBOX_ADDRESS, function (channel) {
  btSerial.connect(TIMEBOX_ADDRESS, channel, function () {
    console.log('connected');
    btSerial.on('data', function (buffer) {
      console.log(buffer.toString('ascii'));
    });

    showTime(); // <-- ここのタイミングで、表示処理を呼び出す
    //sendImage();

  }, function () {
    console.log('cannot connect');
  });
}, function () {
  console.log('found nothing');
});
```

---

# Node.jsで時刻を表示

(2) 時刻を表示
 
```js

function showTime() {
  const d = new Divoom.TimeChannel;
  const buf = d.messages[0].asBinaryBuffer()[0];
  //console.log(buf);

  btSerial.write(buf,
    function (err, bytesWritten) {
      if (err) console.log(err);
      else {
        console.log('bytes sent=' + bytesWritten);
      }
      btSerial.close();
    }
  );
}
```

---

# Node.jsでイメージを表示

(3) イメージ表示
なぜか、表示できるイメージとできないイメージがある

```js
const imageFile = 'img16x16.png';
function sendImage() {
  const d = new Divoom.DisplayAnimation;
  d.read(imageFile)
    .then(result => {
      result.asDivoomMessages().forEach((message /*: TimeboxEvoMessage*/, index /*: number*/) => {
        const buf = message.asBinaryBuffer()[0];
        console.log(buf);

        btSerial.write(buf,
          function (err, bytesWritten) {
            if (err) console.log(err);
            else {
              console.log('bytes sent=' + bytesWritten);
            }
            btSerial.close();
          }
        );
      })
    })
    .catch(err => {
      console.error('read ERROR:', err);
    })
}
```
---

# ハマりどころ1: デバイスのbluetoothアドレスが見つからない

- スマートフォンとの接続を解除
- Macに接続
    - システム環境設定 - Bluetooth - Pixoo に接続

<img width="400" alt="system-bluetooth.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19403/e4dd28a6-5b3c-d0fc-f2fc-b5aa988a131e.png">

- Macで調べる
    - [Apple]メニュー - [このMacについて] - [概要]タブ - [シルテムレポート]ボタン
    - [ハードウェア] - [Bluetooth] を選び、右のリストで「Pixoo」のアドレスを探す

<img width="480" alt="system-report.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19403/b2e75d52-bb92-6e52-0ac0-290426f01b33.png">

---

# ハマりどころ2: サンプルコードが古い（動かない）

- Divoomライブラリのソースコード自体は結構新しい
    - テストコードもある（シリアル通信は除く）
- readme.md にあるサンプルの説明があってない（古い）
- コードを読んでサンプルを直す
    - テストコードと、ライブラリの実装
    - 外部ライブラリ bluetooth-serial-port

---

# まとめ

- PIXOO ちょっとしたディスプレイ装置として、おもしろい
    - イベントごとの簡易電光掲示板にベスト
- スマートフォンアプリから、素直に使える
- ハックしても使えそう（が、まだ上手くは使えていない）
    - 通信の確立に失敗することがある
    - 動くコマンドと動かないコマンドがある
    - 表示できる画像と、表示できない画像がある（違いは不明）
    - → 気が向いたら調べます
- 積みガジェットを消化するには、LTに取り上げるのが良い
    - 今回も買ったまま放置していたが、今回のネタとして調べてみた

---

# おまけ: もう1つ買ったもの

- 木製ブロック玩具「もくロック」
    - [http://mokulock.com](http://mokulock.com)
    - キッチリはまる感覚が心地よい