honeylab's blog

各種ハードウェアの改造、主にファミコンミニなどをやってます(ました)

ソースネクストの「ポケトーク(初代)」をAndroidとして自由に使う&電話として使うw

honeylab.hatenablog.jp

 

図らずも上記の記事の続きとなってしまいました。

前回の記事で、Androidベースの小型通訳機に興味を持ってしまったので、
似たようなソースネクストの「ポケトーク」を入手しました。

いろいろいじってみたところ、なんとこれは上記のVT300Lと同じSoCであるMT6850を使用していることがわかり、SP Flash Toolを使ってあっさりとAndroid化することができました。

(パーティションサイズが若干違うため、後述するscatterファイルが必要です)

 

 

f:id:honeylab:20210418012316p:plain

 

しかし、この機種はタッチパネルではないため、一つのAndroid端末として常用するには少々厳しい気がします。ディスプレイも丸型ですし。
カバーで隠れているだけで、中身は普通の液晶なので、小型ゲーム筐体に突っ込んでみたり、キオスク端末的に使用するならアリなのではないでしょうか。

Bluetoothが使えますので、キーボード、マウスを使用できるようにしておいたほうが便利だと思います。

 

今のところ、メルカリで3000円程度はしていますが、下がってきたら遊んでみるのもいいかと思います。

ハックの細かーいところまでは書きませんが、上記の記事の一部を本機のパラメータに変更するだけで可能ですので、その部分を記録しておきます。

ものによってはネットワークに接続後、最新ファームが降ってくる場合があります。

更新をかけてしまった場合は、systemパーティションが更新されてるっぽいので、下記改変を再度やる必要があります。

 

書き込みに必要なscatterファイル

pocketalk_scatter.txt · GitHub

上記に書いてありますが、system.binの吸い出し領域

linear_start_addr: 0xa800000
partition_size: 0xA0000000

 

改変するファイル:build.prop

改変する内容:以下の3行を追加

persist.service.adb.enable=1
persist.service.debuggable=1
persist.sys.usb.config=mtp,adb

この内容で書き換えると、電源投入+USBでadbが利用できるようになります。

(adb rootはダメでした。bootも書き換えれば行けると思いますが。)

 

尚、今のところSIMカード、通信機能の有効活用化はできていません。
もうちょっといじってみたいと思います。

 

電話の発信、データ通信ができましたw

うまくいかなかったのはどうやらdocomo SIMロックorバンドの問題だったっぽいです

 電話、なぜか発信しかできない…(かけると通話中になってしまう)

イオシスで売ってる翻訳機 VT300LをAndroid端末として自由に使えるようになった

honeylab.hatenablog.jp

 

あれやこれややった結果、最終的に成功しました!

いろいろ試行錯誤した結果をまとめておきたいのはやまやまですが、とりあえず得られた最終結果とその手法をまとめておきます。

 

これは作業ログのつもりのものであり、求める結果に対するマニュアルやガイドラインではありません。間違いがある可能性があります。
もし、間違いを見つけた場合、指摘を頂けると世界に対して役に立つ可能性があります

 

ここで使用する、「SP Flash Tool」やバイナリエディタVMなどを使用したext4ファイルシステムのマウントなどのやり方はあらかじめ知っているものとします。

jagadgetaholic.blogspot.com


そのぐらいの知識がないと、失敗したときに自己解決できいないかと思います。
どうしてもわからない場合はTwitterで聞いてください。
とはいえ、あくまでもこのやり方は各自の自己責任となります。

ので記事を修正していきたいと思います。


故障した場合、損害はおそらくこれを買った端末代、せいぜい2000円程度でしょうから、勉強代としてあきらめてください

この製品、手元に届いた時点で発売から結構立っていますので、本体を開封したらまず、十分に充電をしておいてください。電池枯れかけだとよくわからない動きをしたとき、失敗したのか充電切れかがわかりません。

1.内蔵Flashを吸い出す

 →解析には全領域を吸い出す必要がありますが、この目的を満たすためには実はそこまでやる必要はないです。

 SP Flash ToolのReadBack機能を使い、以下のような設定で、Android システムパーティションの領域のみ吸い出します。(USER領域、 0xa800000 から 長さ 0x009A800000)

ファイル名はsystem.binとでもしておきましょう(自由です)
このイメージを書き換えるので、元に戻せるようにバックアップを忘れずに。

 

f:id:honeylab:20210406100555p:plain

 

ツールの使い方は、ググれば似たようなやり方が出てくると思うのでそっちを参照してください。

(簡単に説明すると、翻訳機の電源OFF→USBケーブル外しておく→Readbackボタン
 →待ち状態になるのでUSBケーブルをつなぐ→デバイスマネージャーに Preloaderという仮想COMデバイスが現れる→それをFlash Toolsが見つける→Readbackされるという動きをします。慣れるまでわからん。)

(↓このPreloaderもデバイスのインストールがいるかも。)

f:id:honeylab:20210406140738p:plain

2.吸い出したイメージの状態を確認する。

 私の手元ではそういった機器はありませんが、もしかしたらパーティション情報が書き換わっている場合があります。
その場合、このやり方では失敗しますので念のため確認します。
HEX Workshopなど、大きめのファイルがダンプ表示できるものを使用し、先頭の部分を眺めてext4イメージであることを確認します。

 


もしくは、次の手順に進んでしまい、binwalkやfileコマンドを使用したり、ext4ファイルシステムとしてマウントできることを確認してしまってもいいでしょう。

f:id:honeylab:20210406101148p:plain

 

吸い出しがうまくいっていれば、0x470付近に"system"の文字列が見えると思います。
もし駄目なら教えてください。

 

ファイルサイズも確認します。2592079872バイト、であればOKです。

f:id:honeylab:20210406101546p:plain

 

3.Linux上に持っていき、マウントして buid.propを編集する

私はVMWare上のUbuntuで作業しましたが、例えばraspberry piなどをお持ちならUSBメモリにでも入れてそっちで作業したほうが早い人もいるでしょう。

f:id:honeylab:20210406102152p:plain

例として /tmp/systemに先ほどのファイルシステムをマウントしています。

ここで sudo nano /tmp/system/build.prop し、文末に以下の3行を追加します。

service.yuntian.win=1
service.yuntian.wintoo=1
ro.yuntian.kyt=1

これで、build.propに必要な情報が書き加えられました。

ちなみに上の1行目は adbd接続有効、2行目はadbd root権限、3行目はAPKのインストール許可です。

こうして出来上がった/tmp/systemをマウントしたsystem.bin を書き戻すことになります。

確実にumountして、出来上がったsystem.binをWindowsに持ってきます。

ここまでの作業、VMWareのファイル共有機能などを使うと便利です。

 

4.ファイルを書き戻す

さて、出来上がったファイルをSP Flash Toolを使って書き戻します。

ここで重要なのが、パーティション情報を記述したscatterファイルと呼ばれるものです。これを作るのに苦労したのです。

scatter_sayeasy.txt · GitHub

このファイルをダウンロードし、先ほどのsystem.binと同じディレクトリに置き、system.binは "20_system.bin"という名前にしてください。

f:id:honeylab:20210406133415p:plain

Flash Toolを起動し、Downloadタグ、scatter-loading fileでこのテキストファイルを指定します。

 f:id:honeylab:20210406133322p:plain

すると、同じディレクトリにある20_system.binを見つけてLocationに表示してくれます(確認してください)。
翻訳機の電源を切り、USBケーブルも抜き、Downloadボタンを押し、USBケーブルを接続してしばらく待つと、Download(更新)が始まります。

f:id:honeylab:20210406140820p:plain

↑書き込み中の状態です

更新が終わったらUSBケーブルを抜き、再度電源を入れます。
無事起動したでしょうか。私の環境では「Andoridを更新しています」といったメッセージが表示され、起動し…ますが、もともと入っていた翻訳アプリがエラーを出して起動しません…まぁ、これは使えたら便利でしょうが、それを使うならもう一個買っておけばいいかなぁ…直せたら直しますが…

たぶん、先ほど吸い出したsystem.binに書き戻したら動くんじゃないでしょうか。そのためのバックアップですし。

 

で、起動はしたものの、もともとのホームアプリであった翻訳アプリが落ちるし、設定画面も出せないので詰んでいるようにも見えます。
そこで、気づいた人は気づいたかもしれませんが、この時点でUSBを接続したPCからはAndroidバイスとして認識されています。

 

では、試してみましょう。

Windowsだと、もしかしたらドライバが足りないかもしれません。
その場合、Mediatek用のスマホのadb用ドライバを探してきて入れると認識できるかもしれません。
あと、adbも必要です。

f:id:honeylab:20210406135451p:plain

 

以前も書きましたが、この更新をするまでは、adbドライバが認識され、adb接続を行っても、デバイスから強制的に切断されてしまっていて使用できませんでした。

 
その辺がめんどくさい場合、得意な方はLinuxで作業したほうが便利かも。

こんどは接続できました。

f:id:honeylab:20210406141409p:plain

では、adbを使ってここからAndroidの設定画面を表示させます。

adb shell am start -a android.intent.action.MAIN -n com.android.settings/.Settings

このコマンド(すでにshellにいる場合は adb shellは省略)

 

f:id:honeylab:20210406141717p:plain

 

見慣れたホーム画面が現れました。

「ホーム」を選択し、Launcher3が入っていますのでホームアプリを変更します。

f:id:honeylab:20210406141832p:plain

 

f:id:honeylab:20210406142324p:plain


これで、起動時にホーム画面が無事表示されます。
言語設定も日本語にしておきましょう。

野良APKをインストール可能にします。

 

f:id:honeylab:20210406142007p:plain

APKのインストールに必要な /data/local/tmp の権限が正しくない可能性がありますので調整します。
これがうまくいってないと、APKのインストールに失敗します。

ここまでやると、APKPureからダウンロードしたアプリがインストールできるようになります。すごい!

 →まっさらな端末でも成功しました

 

あとは、もうこれで普通のAndroidです。6.0とちょっと古めですが、
適当なジャンクとして手に入る小型機としては十分新しく、遊べると思います。

 

なにかわからないことがあれば twitter @bakueikozoまでお気軽に。

イオシスで売ってる翻訳機 VT300LをAndroid端末として自由に使う、の前に

akiba-pc.watch.impress.co.jp

 

こんなものを見つけました。

機能などを考えると、LinuxないしAndroidが入っているような気がしましたので
早速、調べてみることにしました。

どうやら、国内代理店が輸入していて、技適があるようです。

総務省技適検索から型番を検索すると、内部の写真を見つけることができました。

 どうやら、結構遊べそうです。
イオシスの通販サイトを見てみましたが、この時点で見つけられませんでした。

そのため、メルカリを見てみていると、この機種の前の機種である「TW30A SpeakMe」というものを見つけました。どうやら同じ会社が関係しているようです。

…というか、どうやらTW30AとこのVT300L、基板が同じようです…

 

とりあえず、こいつを調達して、中身を解析してみることにしました。

というか、どうもこいつは去年、ツクモで大量入荷・特価販売されていたもののようです。

akiba-pc.watch.impress.co.jp

 

f:id:honeylab:20210320030532p:plain

 

到着して早速分解します。基板のシルクに親切にもTX、RXが書いてあるためUSBシリアル変換でPCに接続して起動します。

すると、想定通りLinuxAndroidが起動していることがわかりました。

 

 Androidが起動しているなら、adbでshellなどの操作ができることを期待してしまいます。
USBで接続すると、確かにADBインターフェイスが現れましたが…
接続しようとすると"closed"というメッセージが出て切断されてしまいます。
どういうこっちゃ。

ADBインターフェイスを使えるように

Image

とりあえず、シリアルコンソールから最低限の操作ができます。

この端末は「翻訳機」として売られていますので(というか、翻訳機としての性能はなかなかいい感じです。このまま使ったほうがいいいと思うんですが…)

Androidのホーム画面や設定画面を表示することができません。
しかし、シリアルコンソールからコマンドを入力することで、Androidの設定画面を表示することができました。

設定画面の中、ホームアプリの設定を出してみると、どうやら翻訳アプリがホームアプリとして設定されていましたが、なんと通常のホームアプリとして使用できる「Launcher3」が残されていました。

 これに切り替えると、普通のAndroidとしてのホーム画面が現れました!

まずはここまで、順調に来ているようです。

しかし、シリアルコンソールからの操作しかできないのでは本体のふたが閉められません。

なんとかadbで接続できるようにしてみたいです。

この翻訳機のCPUはMediaTekです。MediaTekスマートフォンでは、「SP FlashTool」というアプリを使用して、ファームウェアの書き換えなどができる環境があります。

このアプリを使用してシステムイメージを吸い出し、原因を探ってみることにしました。

 吸い出したシステムイメージを、起動中に表れていたパーティション情報と比較し、ファイルシステムとしてマウントしてみます。

 adbでPCから接続する際、Android側ではadbdというデーモンが動作しています。
このデーモンが何か特殊な操作をしていて、特定の手順でないと動作しないのではないか、と推測し、adbdを解析してみます。

 どうやら、ここに違いがあるようです。

この端末に内蔵されたadbdは、Android環境の環境変数の値によって挙動が切り替わるようになっていました。本来、この値はシステムに組み込まれていて変更しにくいものですが、本機はシリアルコンソールが有効になっているため、そこから書き換えてみました。

すると、見事にadbが接続でき、shellが利用できるようになりました。

しかし、この環境変数の書き換えは起動中の一時的なものなので、恒久的にするには起動ファイルシステムを書き換える必要がありそうです。

 さて、adbも動作するようになったら、あとは自由にAPKをインストールできれば普通のAndroid端末として使えるようになります。

 

しかし、… adb pm install を行っても、INSTALL_FAILED_INVALID_APK のエラーでインストールができません。
INVALID_APKというので、APKの中身をいろいろ確認してみますが問題なさそうです…

あれー???

いったい何が起きているのか詳細なログを探してみると、logcatの出力内にヒントがありました。

 isWhiteListApplicationかどうか、というチェックを行っているようです。
やはり専用端末、このように勝手にアプリをインストールされては困ります。
そのため、ホワイトリスト方式でAPKのインストールを撥ねているようです。

このメッセージでググってみましたが、他に実装されている例は見つかりません。
つまり、このベンダが独自にホワイトリストを実装していると思われました。

さて、ではこの部分をどうしようか。ホワイトリストを編集するのはブラックリストの編集より大変です。
これはハッカーの勘ですが、先ほどのadbdのように、何らかのフラグがシステム内に存在すると期待し、APKをインストールする部分を解析してみることにしました。

Androidのパッケージマネージャ「pm」を解析する

Androidのシステム解析はあまりやったことがありませんが、どうにかなるだろう、とソースコードファイルシステムを漁っていくと、どうやらpmコマンドは /frameworkディレクトリの下にjarファイルとしてインストールされていることがわかりました。
しかし、このjarファイルはほぼ空で、実態はその下、にodexファイル、として存在しているようでした。

f:id:honeylab:20210320033306p:plain

 

f:id:honeylab:20210320033428p:plain

odexファイルはELFフォーマットのバイナリです。

 

f:id:honeylab:20210320033541p:plain

 

…しかし、pmコマンドは実際にはAndroidコアのAPIを呼び出しているだけで、その実装はPackageManagerServiceというクラスに実装されていることがわかりました。

その部分はどこにあるかを調べてみると、実態は /framework/arm/boot.oat というバイナリに実装されているようです。
さて、これを解析することができるでしょうか。

boot.oatを解析する

forum.xda-developers.com

調べていくと、このページのやり方でoatファイルをデコンパイルできる、と書いてありました。
(「java -jar baksmali.jar -x -c boot.oat -d framework NAME.odex -o out」の部分ですが、この部分間違いがあり、-xではなく x が正解です)

その通りにやってみると…

おお!smaliファイルとやらがたくさん生成されました。

f:id:honeylab:20210320034404p:plain

まさに、今回求めているPackegeManagerServiceの逆コンパイル結果です。

検索していると、この部分でAPKのチェックを行っているようです。

 このjavaアセンブリコード、正確に読むのはめんどくさそうですが、明らかに怪しい「const-string/jumbo v4, "ro.yuntian.kyt"」という部分が見えます。

どうやら、このプロパティが怪しい、ということでシリアルコンソールからこの値を適当に、1 と設定してみました。

すると…

これまで絶対に成功しなかったAPKファイルのインストールが成功しました!!!

 しかし、そのあと二つ目がインストールできずに悩みます…
とりあえず再起動して、改めてプロパティを設定したら続けてインストールできました。

 

やはり、ファイルシステムを改変してプロパティを恒久化するのがよさそうです。

ここまで、VT300Lが届くまで、このTW30Aで解析していましたが、おそらくこれと同じ手法でVT300Lが解析できると思っています。

 

 

うまくいくかな?

それは次の記事で。

ドンキで売ってた5000円のCo2モニタを改造して無線LAN対応にする

先日、ドン・キホーテをうろうろしていたところこんな商品を見つけました。

 

室内用の格安Co2モニタのようです。
性能的には安かろうなんとやら、であることは承知の上、
仕事柄Co2センサについての情報収集は必要なためサクッと買ってみました。

 

早速ですが分解します。

 

Co2センサや温度・湿度センサがこの辺に格納してありました。

 

メインボードとCo2センサはUART接続されているようです。

 

f:id:honeylab:20210221020719p:plain

 

 


ここに内蔵されているCo2センサは「CM1106-C」のようです。
データシートがここにあり、UARTのプロトコルも明記されています。

f:id:honeylab:20210221020527p:plain

そのため、Co2センサ自体は単体で動作させることもできますが、
ここではあくまでもこの本体を生かし、
改造して外部から値を収集できるようにしてみます。

ほら、みんな

「またなんかよくわかんないセンサ買ってきたの?」とか

「これで何がわかるの?」とかいわれて

やっとのこと組み立てて頑張ってケースに収めたところで

「ガラクタ?」

って言われたことないですか?ないですかね。

まぁ、

Co2センサってエンジニア的には今特に興味のあるものだと思いますが、
それをうまいこと使いこなしたり、定期的に校正したり、
「誰にでも」見やすい値として表示する、ってちょっと難しいことなんですよ。

ところが、これはもう形はできてて値もカッコよく表示されるんですよ。
この状態で、中に何入れても、値をとってきても誰にも文句言われたりしないですからw
さらに、このメーカが最低限商品として成り立つレベルに実装してきた自動構成の仕組みなどをそのまま利用できるわけです。
それが5000円、これを安いとみるかどうか。

 

脱線しましたか。

 

さて、せっかくですから無線でデータをとれるように、無線LAN対応マイコンを中に入れてみたいと思います。

f:id:honeylab:20210221020821p:plain

今回使用するのはなんかその辺に転がっていたESP8266のマイコンボードです。
これに限らず、ご家庭にある無線対応マイコンや、場合によってはただのUART-TCP変換機などを使用することも可能でしょう。

 

このマイコンボードを、データシートを参考に配線していきます。

f:id:honeylab:20210221020915p:plain

5VはCo2センサの根元からとりますが、これをマイコンボードに直結していしまうと、マイコンボードに書き込むためにUSBケーブルを接続したときに逆流してしまい、
ちょっと嫌な感じになるため、ショットキーバリアダイオードを挟むことにします。


Co2のデータ収集は、もともとのマイコンが勝手にやってくれていますので、Co2からの返答が送られてくるTXD端子だけを無線LANマイコンの入力に突っ込みます。

f:id:honeylab:20210221021623p:plain

 

そして、シリアルからCo2の読み取りパケットを解析してppmの値を取得し、
HTTPレスポンスで返すようなスケッチを書きこみます。

せっかくなのでmDNSに対応させたかったため、mDNSのサンプルコードを書き換えて使用しています。

 

gist.github.com

 

家の中に置いておいて、家庭内のネットワーク上のPCなどから値を取得することを想定し、クライアントモードで立ち上げていますが、
こいつをAPにして動かすようにすることももちろん可能です。

さて、ブラウザでアクセスしてみると…?

 

f:id:honeylab:20210221022319p:plain

できたできた。二つ目の数字はフリーズ検出のため、パケット解析ごとにインクリメントされる値です。

 

自動化のために、wgetを使ってみます。(wslではmDNSが使えなかった…)

f:id:honeylab:20210221022431p:plain

おっけー。

あとは、これをスクリプトでもなんでもして、DBに入れるなり、CSVにするなり何でもできます。

13f:id:honeylab:20210221032329p:plain

これは、この作業をしているとき(1600ppm)→窓を開けて(1350ppm)→誰もいないリビングで(650ppm)と移動してみた時のグラフです。

amazonなんかで無線対応のCo2センサはなかなか見つかりませんし、
国内のものでネット対応のものは、謎のメーカ専用クラウドにアップロードされてグラフしか見れなかったりして柔軟性に欠けます。
しかし、このようにすれば生のデータが取得でき、自由に使用することができるという利点があります。
改造にかかる費用も1000円程度です。


Co2センサ自体の正確性ですが…その辺は追々確認していきたいと思いますが、買って半年ぐらいのおんどとり(自動校正無効化)と大体同じ値を表示してくれているようです。

 

raspberry pi picoのGPIO制御速度とマジョカアイリス液晶の制御

皆さんお待ちかねのRaspberry pi PICO 、無事入手したので
早速マジョカアイリス液晶に接続してみることにしました。

最近発売されている普通のRaspberyPi用の液晶はほとんどSPI接続ですが、パラレル接続の液晶を制御しようとすると、それなりのピクセルレートで信号を生成しないといけないため、結構早くGPIOを制御する必要があります。

それだけの信号を生成できるか、まず確認してみます。

 

検索用:「Raspberry Pi PICO GPIO 高速」

 

Raspbery pi PICOはMycroPythonとやらで簡単にプログラムを書けるらしいですが、残念ながら私は ぱいそん はさっぱりなのです。
仕方ありませんのでC言語で書いていくことにします。

ここからいろいろ書いていきますが、C言語での開発環境は公式などを参照してすでにできているものとします。

 

C言語でGPIOを制御するには

付属のSDKの中にある「Blink」を改造して作っていきます。
まず、通常のGPIOを1ピンずつ制御してみることにします。

f:id:honeylab:20210205105100p:plain

このような、単純にforループで出力した場合、1ピン当たり少々遅延して出力されているのがわかると思います。

 

f:id:honeylab:20210205103320p:plain

この時のパルス幅は1.31us*2=2.62us周期、周波数にすると381KHz、決して高い周波数ではありません。

 

forループを展開してみます

f:id:honeylab:20210205105018p:plain

 

f:id:honeylab:20210205103818p:plain

明らかに速くなりました。… forの判定にそんなに時間がかかっているのでしょうか??ここまでの二つは順次ON/OFFでしたが、

今度は一ピンの上げ下げを連続させてみます。

 

f:id:honeylab:20210205104935p:plain

f:id:honeylab:20210205104302p:plain

…何だこりゃ??

一ピンの上げ下げはすぐですが、隣のピンを触ろうとするとまた時間がかかります。

f:id:honeylab:20210205104359p:plain

拡大してみると、一ピンのパルスは10nsで済みますが、隣のパルスの発生まで465nsぐらいかかっています。

これは、gpio_put関数周辺の処理がなんか複雑なんだと思います。
このように、ピンの制御が厳密なタイミングで行えるとは限りません。
クロック同期式ならまぁどうにか通信できるとは思いますが、ちょっと気持ち悪いです。

あれこれ探してみると、複数ビットを一括で制御する関数「gpio_put_masked」もありました。

f:id:honeylab:20210205110106p:plain

これを使ってみると…

f:id:honeylab:20210205110028p:plain

 お、はやいやはい。そして出力も同期しています。
(ずれてるのはたぶんロジアナが悪い)。

この時、周波数は1/70ns=約14MHzとなり、そこそこの速さが出せるようです。

 

では、PICOの売りであるPIO(Programmable IO)の機能を使ってみることにします。

これは、内蔵のステートマシンにアセンブラを食わせて、SPIやパラレル出力、LED制御用のパルス幅デジタル出力などをメインCPUとは別に行うことができる機能です。

詳しくはこちら

blog.boochow.com

などに書かれています。

今回は、マジョカアイリス液晶制御を目標にしているため、もともとSPI液晶用に準備されていたサンプルコードをもとに修正することで超高速パラレル出力を実現させました。

github.com

 

改変したファイルはこのあたりです。
コメント等が修正されていないため、嘘コメント部分があります(ひどい)
そのうちメンテしたい…

まぁ、GPIOがどのぐらい出るか、っていうのを見てみてください。

f:id:honeylab:20210205111222p:plain

この機能を使うと、きちんとクロック同期させたパラレル信号を、CPU時間を消費することなく出力することができます。
PIOファイルを適当にいじったので、もしかするともっと早くできる気がするんですが、いまいちわかんないですこれw

拡大してみると、

f:id:honeylab:20210205111407p:plain

書き込みパルスを5-10nsで生成できているようです。
上にある最短パルス幅に近いようですね。

この方法を使ってマジョカアイリス基板を制御しているのがこちらです。

 まだまだチューニングの余地はあるんですが、結構なフレームレートで画面更新ができている気がします。

 

・まとめ

 速度:遅い順にgpio_put →gpio_put_masked→PIO

 難易度はまさにこの逆です。

 

 

まずは、GPIOの制御方法の違いとその速度、PIOの存在についてこれからラズピコで遊ぶ人の参考になればと思いまとめてみました。

 

「マジョカアイリス」を魔改造して「アイリスオーヤマ」の照明のリモコンにする

さて、ぼちぼち各方面からのハックも佳境となり、
液晶単体での使用や、内蔵リソース書き換えの技術も整ってきました。

そんな中で、どうしてもやらないと気が済まなかったネタが

「内蔵赤外線LEDを使ってリモコン操作をする」ということです。

 

マジョカアイリス、マジョカランタンとの連携のために赤外線LEDが内蔵されています。

 

f:id:honeylab:20210118031026p:plain

せっかくなので、マジョカアイリスを振って何かを操作出来るようにしてみましょう。

 必殺技の発動などの時に赤外線信号が出ますが、あくまでもランタンと連動させるための単純な信号しか出ていません。

 

この信号だけでは外部機器を制御できませんので、マジョカアイリス基板に外付けした小型のマイコンにリモコンの赤外線信号を学習させておいて、この信号をトリガにリモコン信号を出力させるようにします。

これなら、必殺技などのモーションはそのまま残し、リモコンとして使用できます。

 

先駆者として、中身を引っこ抜いて別マイコンに置き換えてエアコンのリモコンにした方はいたようですが、ちょっと中身を引っこ抜くのは私の美学じゃないのですよ…

 

まず、内蔵赤外線LEDの配線を確認してみます。

すると、内蔵LEDは+側ではなく、-側を制御して点灯させているということがわかりました。この信号はあくまでもLEDを点灯させるための制御のため、外付けマイコンのトリガとするのには少し面倒です。

 そのため、そのLED信号を制御信号をいったんフォトMOSリレーに入力し、外付けマイコンに入力することにします。
フォトMOSリレーは内部的にLEDが入っているために、元の基板の回路に与える影響が少ない、という利点もあります。

 内蔵赤外LED自体は一般的なリモコンのLEDと互換性のあるものですので、この部分はそのまま利用することにします。

  

最終的な回路構成はこんな感じです。

 

f:id:honeylab:20210118032014p:plain

Arduinoのリモコン送出ライブラリでは+制御のLEDしか使用できませんので、

-制御の基板のまま赤外LEDを制御するために、赤外LEDの手前に2SC1815を使用した反転ドライブ回路を追加しています。

 

このようにすることで、最小の改造でマジョカアイリスをリモコンにすることができます。
さて、なんのリモコンにするか…派手なアクションをしてくれたほうがいいよな…照明…

 

ん!!! うちの照明 「アイリスオーヤマ」

リモコン付き照明じゃん!!!!

(しかもAlexa連携とかもついてて便利)

https://www.amazon.co.jp/dp/B07J5VTMS2

  

 

まさかのアイリス被り!!!これやこれ!!!

 

というわけで、

リモコン受信モジュールとArduinoを接続してリモコンコードを取得します。
受信モジュールは、マジョカランタンに入っていたものを毟り取りました。

 

 スケッチは、サンプルにあるIRRecvDumpV2を使っています。
ネットで探せばたくさん例が出てきます。

www.shibuya24.info

 

この信号を、マジョカアイリスの赤外線信号をトリガにし、アクション映像が流れた分の時間を待ってリモコン信号として送出するようにArduinoのスケッチを作成します。

gist.github.com

 

Image

Image

こんな感じで適当に配線して突っ込みます。

 

幸い内部には十分なスペースがありました。

Image

ついでに、起動画面をちょっと書き換えてみました。

 

f:id:honeylab:20210118032155p:plain

 

アイリスオーヤマのロゴ、ハートが入ってて意外と親和性が高いのでは…?!

リソース書き換えの方法はこちら

honeylab.hatenablog.jp

 

さて、実際にやってみましょう!!!

 

www.youtube.com

 

 

魔法少女 部屋の電気をつけられるおっさん誕生!!!

 

…あぁぁぁあ! 
ちょっと楽しいぞこれ!!

そういう風に作ったんだから動くのは当たり前なんだけど、
なんだろうこのワクワク感wwww

 

さて、本体魔改造系はこんなもんかなぁ…

 

マジョカアイリスハック

アストロシティミニをほったらかしてこんなことやってました。

 

こちらのblog

kako.com

 

や、Twitterなどで広まって
もはや電子工作おっさんみんなが買っちゃったんじゃないかと思われる
「マジョカアイリス」

 

www.takaratomy.co.jp

詳しい成り行きは各種まとめなんかを見てもらうことにして

 

twitter.com

 

みんな、この横長 64x480 液晶の特殊性と在庫過多による圧倒的値引きにひかれて買いあさってしまったようです。
ところで、この液晶を真面目に使おうとすると、フラットケーブルの処理やマイコンのプログラムなど、すでに電子工作の猛者と化しているレベルでないと
結構処理の難しい工作になってしまいます。

 

 ここまでの工作、結構むずいです。

github.com

しかし、この「マジョカアイリス」、ロットによって本体基板上にmicroSDスロットが搭載されているモデルがあることがわかっています。
このSDカードの中に、おそらく画像や動画が入っているので、これを差し替えてしまえばとりあえず画像が表示できるではないか、というソフトウェア的な取り組みを行ってみました。

 

内蔵microSDカード、2Gのものと4Gのものが現在確認されています。

 中身を一通り確認しましたが、普通のFATフォーマットのパーティション内に、いくつかのフォルダ、データがあるのみです。

この中で、ルートフォルダにあるAB565.binというファイルが、このオモチャの操作中に表示される画像であることがわかりました。

 このファイルは16bitRAW画像データが連結された特殊な形式ですので、これを編集しやすくなるように分離し、再度結合できるようにするツールを作成し、ファイルを置き換えてみました。

 ファイルをいくつか編集してSDカードを更新してみると…

 見事、待機時に表示されるアニメーションが変化しました。

液晶を単体で接続したときのように滑らかに動かすことはできませんが、
この工作、はんだ付け等難しい作業が必要ないため、オモチャハックの入り口としてはそこそこ難易度が低く、結果もわかりやすいのでいい教材かと思います。

 

この作業に必要なC#のプログラムのソースコードは公開しておきます。

 

microSDからコピーしたファイルを使って、このプログラムに読み込ませることでファイルが分離できます。
このソースコード、VisualStudioで作成したものですが、あえてプロジェクトファイルなどは置かず、単一のクラスだけ置いておきます。
そのため、まずはこれをコンパイルして、自分の環境で実行できるというのが最低限必要な力です。それ以下の方はサポートできません。

ここまで登ってきてください。

このソースコードを使って、すでに同様に差し替えに成功されている方もいるようです。

 

 

microSD内には、このほかにもアクション時に再生される動画や音声などが収められていますが、まだフォーマットに未確定の部分があるためその部分の差し替えはまだできません。私の興味が続けばその辺もできるようになるかもしれません。