COM & NAV LCD display
液晶表示モジュール
周波数表示は20文字 4行のLCD 2004 を使いました。コンパクトに4行表示ができます。
このLCD2004 は I2C へのシリアル変換ボードが裏面に取り付けられている製品が便利です。
Arduinoとは I2Cによるシリアル接続です。ArduinoMEGAの SDAとSCL端子(D20,D21)に接続します。これは変更できないようです。
シリアルアドレスが 0x27であることはディスプレイ基板に取り付けてある I2C変換基板で決められています。ただしこのアドレスは変換基板にあるジャンパA0,A1,A2 で変更ができます。アドレスを変更することによって、同じシリアル端子に最大8個のI2C機器が使えます。ここのジャンパはオープンで1,つなぐと0です。
( I2C変換チップによっては シリアルアドレスが 0x27 ではなく、0x37 の場合もあるそうです)
MobiFlightの設定では はじめに4行それぞれに、FSUIPCから受け取るデータを設定します。この4行には表示設定はしません。
つぎに ディスプレイの表示設定を別に行います。Display type のところで使用するLCDを選びます。そして、青いバックの表示Textボックスにカーソルを持って行き、表示させる内容をキーボード入力して決めます。(Use the Text Box to define your output)
変数部分は#&?などの文字で5桁分だけ入力しておきます。Config Reference にCOMなど必要な項目が出てないときは 右端の Vマーク を押して探せます。
▶test で実際に接続した LCDに文字が表示されるか 試してみます。この時点ではFSUIPCからデータを受け取ってませんので数値は出ません。
周波数の入力
周波数入力には ロータリーエンコーダーを使いました。
可変抵抗器とはまた違ったおもしろい入力装置です。
接続はArduino入力側でのプルアップを利用して簡単にできます。チャタリングも心配なしです。
周波数入力はMobiFlightのInputタブで設定します。
ロータリーエンコーダーには回転方向によって周波数を上下させる部分と、
ACTIVE周波数 と STANBY周波数 を切り替えるための 押しボタンスイッチの部分をそれぞれ設定します。
COM_STBY_RADIO_SWAP と NAV1_RADIO_SWAP をそれぞれ SW1 と SW2 に割り当てています。
なぜか FSUIPCのオフセット0x311Aでは COM Stby周波数がうまく入力できなくなり、いまは 代わりに 0x05CC を使っています。
これは INT 4byteなので 桁数が多くなります。
これを使えばCOM周波数を6桁表示にできるのですが、NAVの方にはこれに相当するものがないので、5桁表示に揃えています。
エラーが起こったときに
この設定で動いていたものが、あるときから入力のエラーで動かなくなりました。
MSFS2020が動いているときにCOM Stby周波数を変更しようとロータリーエンコーダーを回すと、Mobiflightが停止してしまうのです。RUNにしても すぐにSTOPになりました。
エラーの原因を探るために OutputやInput の左端にある 'Active'のチェックを外してどれが原因か調べました。ハードが原因になることもあるのですが、Mobiflightの設定かも知れません。調べるために 'Extras' の Setting にある 'Logging' によって エラーが起こったときの記録を残すことができます。この記録を残す状態はシステムが重くなるので、必要がなくなれば外しておきます。
私の場合は「Error on config execution. Input string was not in a correct format :構成の実行中にエラーが発生。入力文字列が正しい形式ではありません 」 と記録されていました。
Config設定を調べたのですが異常が見つけられませんでした。それで .mccファイルをエディタで開いて 正常な動きをする部分と比較をしました。
手がかりになるのは FSUIPCのオフセットです。そこで見つけたのは 以前に試した設定が 消されたはずなのに残っていたのです。改造を重ねてきたのでいろんな設定も試しています。もう使っていない設定でConfigWizardでも見えないのに .mccファイル内には記録されていたのです。
また、たまに失敗するのは Deviceなどの名前を変更した後です。それを使っていた設定を変更せずに残っているとエラーで止まります。
エラーでMobiflightが停止する原因を探るために、Config設定をいろいろ試してみます。エラーで止まった状態から抜け出せないときには、別の.mccファイルをOpenすると停止状態から抜け出せます。それには、ファイルを保存するときには上書きではなく、別名で保存して違う状態をいくつか残しておくことが必要です。
Arduino リセット
Arduino がうまく動かなくなったとき、まず やってみることは Arduino IDE を使って EEPROMの消去をやってみます。
ファイル>スケッチ例>EEPROM >eeprom_clear を使います。シリアルポートもその前に設定しておきます。
その後、必要なものに書き直せばいいのです。
(Mobiflight9.6から、リセットはMobiFlightの設定ダイアログからもできるようになり、EEPROMがクリアできます。)
これだけでは少しも回復せず、Arduinoボードを壊してしまったかと思ったときがありました。でも もうひとつやることは ハードリセットがあります。
ArduinoMEGA 2560なら基板上にリセットスイッチのボタンがあります。Arduino Pro Micro では RST(reset)端子とGNDとの間を接触させます。リセットボタンを押し続けながら、電源を入れます。(Pro Microではちょっとやり方が違いますが)
これで 反応しなかったArduinoが生き返りました。
COM2 & NAV2
COM1,2 & NAV1,2 を表示
LCD2004の20文字4行表示に これまではCOM1とNAV1を表示していましたが、ここにCOM2とNAV2も表示させることをやってみました。周波数設定するロータリーエンコーダーは2つだけなので切り換えて使います。
8つの数値表示が必要なのですが、WizardにあるConfig Referencesではこれまで6つしか設定できなかったのです。Mobiflight9.6では 図のように Add Reference で増やすことができるようになってます。これで難しいトリックを使わなくても、8つの数値表示が簡単にできるようになりました。
このとき 変数として #$%? などの記号を8つ指定します。ここは ABCD などのアルファベット文字を使うことも可能です、ただし COM NAVなど 表示に使う6つの文字(C,O,M,N など)は避けないと 表示が混乱してしまいます。
ロータリーエンコーダー入力を切り換える
ロータリーエンコーダーの押しボタンスイッチはエンコーダー入力の COM1 と COM2の切り換え、NAV1 と NAV2の切り換えて どちらかを選ぶようにしています。選んでいるのがどっちなのかを示すために LCDの右横にLEDを4つ取り付けました。表面の穴を楕円にした小さな表示ランプです。楕円の穴は裏側からホットボンドでレンズ状に埋めています。この選択表示はLCD内の文字に含めることもソフトウエアによって可能ですが、COM1とCOM2は6桁表示に変更できるようスペースを残しています。また、LED切り換えのためのインバータは2つだけなので ここは TTLを使わず、トランジスタで構成しました。
Active周波数とStandby周波数の切替は 表示LCD下の4つのスイッチを使います。スイッチパネルの74HC165 Input Shifter にカスケード接続して使いました。押しボタンスイッチはプルアップを兼ね、押したときにLEDが点灯する回路です。
Offset 0x66C0
周波数を変更するロータリーエンコーダー入力を切り換える方法のポイントは、FSUIPCのオフセット 0x66C0~66FF を使えることです。この64byteの領域はユーザーが自由に使えます。スイッチの状態をここに書き込んでおき、ここを読み出してスイッチの状態を知り ロータリーエンコーダーの入力先をPrecondition Settingで切り換えます。
切替設定のWizard
1. エンコーダーの押しボタンを if($=1,0,1) をInput settingsに使って 押すたびに1と0を切り換え、その値をオフセット0x66C0 に入力します。 NAV1と2の切替は オフセット 0x66C1 に入力します。オフセットのsizeは 1byteです。
2. このオフセットの値 0または1を読み出して利用できるよう Outputを設定します。
また、このOutputを利用して、切り換えスイッチの状態(エンコーダー入力先)をLEDで表示します。
3. SW_encCOM1/2= 0または1の値によって、ロータリーエンコーダーの入力先を決めます。これにはPreconditionを使います。
EncoderCOM1 が機能しているときは、EncoderCOM2 は停止しているので 赤い!マークが付いています。
これはスイッチが0の状態なので、COM1の入力が機能しています。COM2入力は停止しています。
COM周波数を6桁表示に
COM1とCOM2を6桁の表示に変更しました。NAVは5桁です。この 0x05C4~05D0のFSUIPCオフセットを使って、6桁表示にする方法は Hortax氏の記述(Mobiflight>Forum)に学びました。
4byte(DWORD)では 0~4294967296の数値が表せるので 6桁に対応できます。このままでは9桁になるので、Transformで $/1000 にしています。 なお、実際のCOMでは8.33kHz単位もあるようですが、ここでは 25kHz(0.025MHz)単位で周波数の変更ができます。
Activeと Standby周波数の交換は COMでは Event ID でうまく働いたのですが、NAVでは問題が出たので Action TypeはこのようにMSFS2020のものを使いました。