扇風機のファームウェアを書き換えて潜在能力を引き出した話(その1)

# 初めに
私の家には数年前に買った安い扇風機(FBQ-191D https://www.amazon.co.jp/dp/B00V3EKFMU )があるのですが、暑い時は風量を最強にしてもすこし風が弱いと感じることがありました。(amazonのレビューでも何件かそんなこと書かれてました)
なので、改造して風を強くさせることを検討してみました。
![FBQ-191D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12125/eb3277d0-73f9-ee2d-7d0e-e4513b3298f9.jpeg)

モータを変えたりしないと風を強くすることはできないと考えてたのですが、あまりお金をかけずしようと検討した結果、中身のソフトを書き換えるだけで風量を強くすることができましたので、どのようにしたのかについてお話ししたいと思います。

# 調査
## 潜在能力を持っているかどうかの確認
まずはどうやってモータを制御してるかを確認しました。
内部の基板はこんな感じでした。
![扇風機基板.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12125/f97eea9b-d7b4-483e-ed02-ac3aefa53199.jpeg)
まずは、一番重要なモータ駆動用の信号を見てみました。
モータに繋がるケーブルは画像の下にある5線のコネクタでつながっていて、左から順に5V, GND, HALL, MU, MVと書かれていました。
5VとGNDはいいとして、HALLというのはホール素子というものの出力で、ホール素子は磁気を検出する素子らしいです。
それによってモータの回転の状態を確認できるようになっています。
モータを回したときの信号をオシロスコープで確認してみると、1/4周でHigh、Lowが切り替わるようになっていました。
![hall_sensor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12125/bcea0e0b-6b4a-ea28-2367-c4e050233c7f.png)
次にMU, MVについてですが、この扇風機はブラシレスDCモータを使っているようですが、一般的なブラシレスDCモータはU, V, Wの3つの制御信号で制御します。しかし、このモータにはU, Vしかないので一般的な3相ではなく2相のブラシレスDCモータのようです。
2相とか回転方向どう決めるの？という感じですが、試しに手動でUが+5V、Vが0V、次はその逆、と交互に入れてやると扇風機の動作する方向に1/4ずつ回転していきました。ただ、ちょっと逆方向に動いてる瞬間に電圧を入れると逆方向に回転しました。なので、ホール素子で検出した位置に合わせて正しい電圧の方向を切り替えてやらないと正しい方向に回転しないです。
回転する方向はホール素子の出力がHighの時にUを+5V、Vを0V、Lowの時にその逆とすれば扇風機の前に風が行く方向に回りました。
逆にホール素子の出力がHighの時にUを0V、Vを+5V、Lowの時にその逆とすれば扇風機の後ろに風が行く方向に回るようです。(羽の形状的に後ろへの風は起きにくいっぽいですが)

マイコンから出ているU, Vのモータ制御信号をオシロスコープで確認すると、PWM信号になっていて、風量が最大の時でもDuty比は90%弱だったのでまだ100%の力は出していないということがわかりました。
そのため、ソフトを変えることによってパワーアップさせられそうです。
## ソフトの書き込みが可能かどうかの確認
潜在能力があることがわかってもソフトの書き換えができなかったら結局基板を改造しないといけないので、次にマイコン周辺を確認しました。
使用されているマイコン(画像中の赤枠)はSTM8S003F3というマイコンでした。
そして、基板上にデバッガ接続用のピンにつながっているスルーホール(画像中の黄枠：半田付けした後なのでスルーホールじゃなくなってます)がありましたので、デバッガがあればソフトの書き込みもできそうです。

## マイコンのピンアサインの確認
ソフトを作るためにはマイコンのどのピンが何に繋がっていて、どういう入出力をさせる必要があるのかを理解する必要があります。
そのため、テスタ等を使って調べ、大まかな回路図を作成しました。
(ソフトに必要な部分だけです。コンデンサとか電源回路とかありましたが、ソフトには関係なさそうなので省略してます。回路よくわかりませんし。)

まずはマイコンとスイッチ等の回路です。
![fan_回路図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12125/8588487b-a819-942a-752c-36f0cd3a4043.png)
スイッチは三つあり、SW1が電源用、SW2が風量調整用、SW3がタイマ設定用のスイッチです。
SW1は10番ピンに接続されていて、内部プルアップされているようです。
次にSW2, SW3はそれぞれ抵抗と並列接続されていて、それが2番ピンに接続されています。このピンにはADC機能があるので、それを使って電圧値を見て2つのピンのどちらが押されたかを判断しているようです。
あと、操作音を出すための圧電スピーカーが1番ピンに接続されています。
その他、状態を表すLED、モータが接続されています。

次にモータ周辺回路です。
![fan_回路図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12125/35c1d856-d358-72d5-6808-f413adb7d77d.png)
基板の写真の青枠で囲んでるICの型式を確認すると「MDS9754A」と書かれていて、ググっても似た型式のもののデータシートしか出てこなかったので確証は持てないですが、N-ch MOSFETとP-ch MOSFETが入っているもののようです。(見つかったのは「MDS9753EURH」というICのデータシート https://pdf1.alldatasheet.com/datasheet-pdf/view/1267284/VBSEMI/MDS9753EURH.html)
このICを2つ使って上図のようなHブリッジ回路を構成しているようです。
プラス側はバイポーラトランジスタも使って2段階で増幅しているみたいですが、なぜそうする必要があるのかはよくわかりません。(わかる方がいたら教えてください)
この回路の場合、U+とV-にHigh、U-とV+にLowを出力してやるとモータの左から右(上図の場合)に電流が流れます。逆にU+とV-にLow、U-とV+にHighを出力してやるとモータの右から左に電流が流れます。それをホール素子の状態に合わせて切り替えてやればモータが回ります。

次に状態表示用LEDの回路です。
![fan_回路図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12125/043f8686-0e44-a935-9ba9-422526dfbaf9.png)
LEDは上側に4個、下側に4個の合計8個ついてますが、下側の4個は赤色と緑色の2色のLED(アノードコモン)という構成なので上記のようなLEDが12個の回路と同等になります。
上側の4個が風量の強さを表していて、下側の4個の赤色がOFFタイマ、緑色がONタイマを表します。
マイコンからLEDを制御する際、12個のLEDを制御するには単純にはGPIOを12個使って制御しますが、このマイコンではそこまでのピン数の余裕はありませんし、風量、及びタイマは4つのうちの1つだけを光らせればいいため、行と列それぞれに1個ずつのGPIOが接続されています。
この接続方法はドットマトリックスLED(https://akizukidenshi.com/catalog/c/cdotmtx/ )と同様の接続方法で、点灯させる際は1度に1つの列(抵抗のつなぎ方によっては行)を点灯させ、次に隣の列、その次にまた隣の列...というのを高速で切り替えてすべてのLEDを制御します。人の目にとってはあまりに速いので全部を同時に制御しているように見える。という仕組みです。(電光掲示板とかも同様です。)
なお、回路図上ではLED2-〇が緑色、LED3-〇が赤色ですが、不思議なことに真ん中の2つは赤色と緑色が逆につながっていました。
そのおかげでソフトが組みやすくなるというわけでもなく、安全性が担保されるとかそういったこともなさそうなのでこのような接続にした理由はわかりません。なので、ソフトを組む時にはその部分はわざわざ交換させて制御する必要があります。

# ソフト開発環境構築
マイコンはSTM8S003Fというマイコンだとわかりましたが、使ったことがないマイコンでしたので、開発環境の構築から行いました。
まず、デバッガですが、STMマイコン用のデバッガはST-LINKというものだそうです。STMicroelectronics社純正品を買うと新しい扇風機が買えるくらいの値段がしてしまって本末転倒なので、中国製の1000円以下で買えるものを買いました。(amazonとかyahooショッピングとかいろんなとこで買えます)
https://store.shopping.yahoo.co.jp/kuranakaya/zwezc52xdf.html

ただ、純正品でも3000円程度で買えるみたいなので、リスクを考えると純正品を買ってもいいかもしれません。
https://akizukidenshi.com/catalog/g/gM-04012/

そして、IDEはST Visual Develop(STVD)、コンパイラはCosmic C compilerというものが無料でダウンロードできます。(ダウンロードには登録が必要)
https://www.st.com/ja/development-tools/stvd-stm8.html
http://cosmicsoftware.com/download_stm8_free.php

# 現行ソフトのバックアップ
ソフトを開発するのはいいですが、現在動いているソフトに戻せるようにしておかないといろいろ調べるのに不便だと思いますので、
いつでも現行ソフトに戻せるようにバックアップを取っておこうと思いました。
マイコンのROMの書き込み、読み込みはSTVDと一緒にインストールされるST Visual Programmer(STVP)で行えるようなので、読み込んでみました。
![STVP_read_fail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12125/d2250f18-33b7-42f9-faad-b17f7372a0a8.png)
まぁ、読めないですよね。
何やらプロテクトされてるようです。
OPTION BYTEというところを見ると、「Read Out Protection OFF」という項目があるので、
ここで読み込みのプロテクトをするかどうか決めているようです。
![STVP_read_protection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12125/c6ef6a7f-8ce8-d57c-111d-3b064d2f33a5.png)
このOPTION BYTEというところも読み込みプロテクトされてるので同様に読めませんが、書き込みはできるようなので、
これをOFFで書き込めば読み込めるようになる？？
と思って書き込んでみました。
すると、書き込みはできたようです！
そして、読み込みもできるようになりました！
読み込んだデータは全部0です！
全部0のプログラムで扇風機が動くんや～。というわけでは当然なく、
デバッガを外して扇風機を動かしてみようとすると全く動きません。
読み込みプロテクトは解除するとソフトを消してしまう機能のようです。

ここまでの手順を行うことで、動かない扇風機が完成します。

～つづく～

続き書きました↓
[扇風機のファームウェアを書き換えて潜在能力を引き出した話(その2)](https://qiita.com/junp007/items/02febf389880fa8cd3d3)