本記事はライオン株式会社様とは全く無関係の情報です。本内容について同社に問い合わせすることはしないで下さい。内容については正確性を期すように注意しておりますが、一切保証いたしません。実施は各人の責任で行ってください。本記事を参考にしたことにより直接的または間接的に発生したいかなる損害等にも理由に関わらず一切責任を負いません。本記事は、スマートハレタに搭載された各デバイスをどのようにしたら自分で作成したソフトウェアで制御できるかを、独自に調べて整理したものです。私と同じく、このハードに興味を持った方のご参考になれば幸いです。本記事ではざっとハード構成を調べたのち、ドットマトリクスLEDに好きな絵を描いて遊んでみます。ちなみに、(その1)とか書いておりますが、続きがあるかは不明です。(笑)スマートハレタとは?スマートハレタは、ライオン株式会社による洗剤「ハレタ」向けのスマートデバイスで、本体上部のカップに「ハレタ」のボトルを乗せると、その重量を監視し、残量等を確認して詰め替え時期の提案や、WiFiを通じた天気情報に基づく干し方の提案をしてくれる楽しいデバイスです。公式ページ本機はキャンペーンで配布する非売品のようで、2019/1/15から2019/2/28までの応募による抽選で、1000台が配布されたとの事です。なんでHACKするの?実は私も応募して当選し、本来の用途で使用して喜んでいた一ユーザーでした。2019年4月下旬に品物が届き、セットアップし、何となくネットワークスキャンツール"Fing"でスキャンするとMACアドレスから"Espressif"と出るわけです。電子工作でESP-WROOM-32やM5Stackと戯れている人だったら、Bluetoothにも対応している事からひょっとしてESP32が入っているのでは?と思うのは自然かもしれません。※以下のFingのスクショの「スマートハレタ」は私が手入力で設定したものです。分解してみたわけです。すると、やはりESP32(ESP-WROOM-32)を搭載していることが分かりました。面白いことに、他のデバイスも結構アキバ(秋月電子や千石電商等)で入手可能なデバイスを中心に構成されている為、いじることが楽しめそうだなと感じました。頂いたスマートハレタはこのまま、ハレタのパートナーとして使い続けたいのでメルカリをちらっと見たら、あるわあるわ・・・800円送料込みくらいで購入できました。後述しますが中身は結構色々詰まってて楽しめそうです。実際に自分の好きな工作をこれでやるとしても、まずこのハードがどういう構成でどう使用できるかが分かっていないとどうにもなりません。最低限、どんな感じの構成になっているのか調べてみます。以下はスマートハレタを分解して中の部品を撮影したものです。LEDマトリクス基板とメイン基板間は、ストレインゲージとメイン基板間はコネクタで抜き差しできるようになっており、その他は直にケーブルがはんだ付けされています。LEDモジュール基板は本体の左右側面に配置されていて、状態に応じて本体全体を光らせることができます。ストレインゲージはひずみゲージとも呼ばれるセンサで、金属片に取り付けられ、洗剤を載せるカップにネジ付けされています。これで載せた洗剤の重量から残量がわかる、という仕組みでしょう。メイン基板それでは、メイン基板から見ていきます。ESP-WROOM-32です。このモジュール1つでマイコン、WiFi、BT/BLE、ブート用フラッシュ(4MB)を搭載しています。右上にあるピンヘッダは、ESP-WROOM-32モジュールを扱った方にはおなじみのシリアルとGPIO0端子でソフトウェアの書き換えモードに遷移させ、ソフトウェアを流し込む際に使用するもののようです。DS1307のバックアップ電源を担っているようです。使用しているようです。Amp)、Ch.Bは32倍固定です。PD_SCKにクロックを入力するとDOUTからA/D変換結果を出力するようです。TXS0108Eにより5V系に変換しています。これは前述のRTCや、本体のLED周辺の回路、重量測定に用いるAD変換ICが5V動作仕様であるために挿入されているようです。下図ではESP32とTXS0108Eが複数の箱に別れていますが、機能的に分かれている為分けただけですので、デバイスとしてはそれぞれ1個です。本機の音声再生に使用されているようです。Vorbis、MP3、AAC、WMA、FLACといったコーデックのデコーダーと、オーディオ入出力に加え、GM規格の音色配列を持つMIDI音源まで搭載されているチップです。MIDIの出音はYoutube等で検索すると先人の作例が出てきます。LED基板それでは、もう一つの大きな基板、LED基板を見ていきたいと思います。LED基板は、写真右側の白いコネクタを通してメイン基板と繋がっています。信号の内訳は、5V電源、シリアルLED信号、ドットマトリクスLED制御用I2Cシリアルです。HT16K33が5つ実装されています。Scanのプログラムを走らせると、70h~74hの5アドレスがそれぞれのICに設定されていることがわかりました。Arduinoのデフォルトではないため、以下のようにWire.beginに引数の追加が必要です。Scanner");}ドットマトリクスLED部LEDは24ドット×24ドット構成になっています。ドットマトリクスLEDは8×8構成のモジュールが9つ並んで構成されています。HT16K33は1個で8×16のドットマトリクスLEDを制御できます。従って、24×24の場合には5個(4.5個)のICが必要となります。5つのLEDドライバHT16K33はそれぞれI2Cスレーブアドレス70h~74hがアサインされていますが、スレーブアドレス毎のLEDとの対応付けは以下のようでした。HT16K33の詳細仕様については割愛しますが、ドットマトリクス8×16の領域にデータを送信する際、8x8の2つの領域にわけて8ビット毎に設定していきます。下図の矢印と"LSB"はこの8ビット毎のデータの配置の方向とビットの並び方向を示しています。領域Eのみ、8x8を担当しています。本基板の下部にはシリアルLEDが1個接続されています。シリアルLEDは、LEDとLEDを制御するコントローラーが1パッケージになった便利なデバイスです。本機で使用されているのはWS2812B系の1線のシリアル制御LEDのようです。これは、シリアルのパルス信号のH期間とL期間の時間で"1"と"0"を表現するシリアルになっています。以下はWS2812Bの場合のシリアルタイミングです。(実際に使用されているデバイスはWS2812Bではない可能性もあります。引用LEDを以下のようにカスケード接続し、PIX1のDINにマイコン等から24ビット(1個のLEDの色情報)を超えるデータを送出すると、そのままPIX1のDOからそのデータが送出されます。3つのLEDがある場合には24×3=72ビットのデータを送出する事で各LED内のコントローラーにデータが届きます。その後、RES期間(WS2812Bであれば280[μs]以上)PIX1のDINにLowを入力すると、各LEDコントローラーは、それぞれの制御しているLEDの発光状態に反映させます。本機では、ESP32から出力されたシリアルLED制御信号が本基板のシリアルLEDに接続され、その後にLEDモジュール子基板×2に繋がっています。ESP32からは、1+8+8=17個のLED制御信号を出力すれば全LEDの制御ができるものと考えられます。Systemsが提供するesptoolというツールを使用します。IDEにESP32の環境をセットアップして書き換える場合には、ツール内部からesptoolを呼び出してくれるので、特に難しい手順はありません。Managerから簡単に行うことができます。以下のサイトに詳しく説明されています。マイコンに自分で作成したデータを書き込むと、元々書き込まれていた内容に上書きされるため元々の機能は失われますのでご注意ください。元々のデータをバックアップしておきたい場合にはesptoolでflashのリードあたりで検索して実施して下さい。ESP-WROOM-32内のプログラムは、内蔵のSPIフラッシュメモリに書き込まれています。書き換えには、USBシリアル変換を介してPCと接続します。ESP32を書き換える場合に使用する信号は、以下の4つです。3TXD0、RXD0は一般的にUARTで見かける信号ですので説明は割愛します。ENはESP32のリセット信号です。GPIO0はリセット解除のタイミングでLowに接続していた場合に、ESP32がUARTからのファームウェア書き換えモードになります。従って、最低限PCと接続しなければならない信号はUARTのTXDとRXDです。ESP32のボード(ESP32-DevKitC等)では、RTSとDTRを使用してPC側からブートモードの設定やリセットのアサートも出来ます。今回は手元にあった適当なUSBシリアル変換を使用しました。USBシリアル変換モジュール)ので、よろしければどうぞ。今回は、USBシリアル変換基板のTXDをメイン基板のRXD0に、USBシリアル変換基板のRXDをメイン基板のTXD0に接続し、それぞれのGNDも接続し、ブート状態に入れる際は、GPIO0とGNDをリード線で接続し、ACアダプタを差し込むことにしました。ドットマトリクスLEDの制御ドットマトリクスLEDは前述の通りI2Cで接続されています。SCLドットマトリクスを点灯するプログラムを作成してみるArduinoのI2CドライバであるWireの初期化は以下のようになります。setClockメソッドは、I2Cバスの速度を指定する為のものですが、ICの仕様上400kHz(400000)を指定可能ですが、実際に設定してテストしたところ通信エラーが発生したため、半分の200kHzにしたところ、手元環境では安定しています。Standardの100[kHz]な気がします。設定は100[kHz]にしてみます。HT16K33の初期化を行います。Registerの設定)、LEDの輝度を設定します。以下のサンプルコードでは、brightnessという変数に一旦代入して操作するようにしているので、好きな輝度になるよう0~15の範囲で設定してください。値が大きいほど輝度が高くなります。}}上記initializeLedDriver関数はスレーブアドレスを引数に取るようにしているので、0x70~0x74の範囲で呼び出します。}}setupDriver関数が実行できれば、ドットマトリクスLEDは点灯できる状態になりますので、LEDを適当なパターンで点灯させてみます。以下のプログラムでは、各LEDコントローラの1つ目の8×8をベタ塗り白、2つ目の8×8を千鳥配置のパターンを塗るものです。Wire.endTransmission();}これを実行した様子はこちらです。LEDマトリクス基板のところで説明したような並びのパターンで表示されていることが分かります。このソースコードをgithubの以下に掲載しています。https://github.com/yishii/SmartHaretaHacks/tree/master/SmartHaretaDotMatrixSimpleTestシリアルLEDの制御WS2812BタイプのシリアルLEDは、シリアルLEDの説明で記載した通り1本のデジタル信号出力で複数個のカスケード接続されたLEDを個別制御できるものです。本機では、以下のようにGPIOがアサインされていました。OUTシリアルLEDを制御するプログラムを作成してみるESP32でWS2812b等のシリアルLEDを制御する為のライブラリをネット検索していると、FastLEDというライブラリが人気のようです。そこで、FastLEDをインストールしてやってみます。ArduinoIDEの「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」と辿るとライブラリマネージャが開きますので、FastLEDをセットアップします。あとは以下のように初期化すると、制御できます。短いので全部掲載します。27に接続した17個のLEDに対してデジタルRGBのカラーを一秒ごとに設定しています。delay(1000);}なお、上記ソースコードは以下に掲載しております。https://github.com/yishii/SmartHaretaHacks/blob/master/SmartHaretaNeoPixelTest/SmartHaretaNeoPixelTest.inoデモプログラム今回ドットマトリクスLEDを制御するデモを作成しました。本デモでは、ビットマップのキャラクタを描画したりしています。以下で公開しておりますので、よろしければどうぞ。y)座標に点を打ってるsetPixel、unsetPixel関数、矩形のビットマップの貼り付け処理など作成しています。もらったので使ってたけど、ハードいじるのも面白そうだったのでメルカリでもう一個買ってみた。2019年5月2日こんな感じで24×24のドットマトリクスが入ってます。最後にちょっと長文になってしまいました。次回は音出したいっすねー!間違いとかあればご指摘いただけますとありがたいです。