COM & NAV LCD display

LCD2004

液晶表示モジュール

 周波数表示は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 の場合もあるそうです)

LCD2004side

 MobiFlightの設定では はじめに4行それぞれに、FSUIPCから受け取るデータを設定します。この4行には表示設定はしません。
Display Setting  つぎに ディスプレイの表示設定を別に行います。Display type のところで使用するLCDを選びます。そして、青いバックの表示Textボックスにカーソルを持って行き、表示させる内容をキーボード入力して決めます。(Use the Text Box to define your output)
変数部分は#&?などの文字で5桁分だけ入力しておきます。Config Reference にCOMなど必要な項目が出てないときは 右端の Vマーク を押して探せます。
▶test で実際に接続した LCDに文字が表示されるか 試してみます。この時点ではFSUIPCからデータを受け取ってませんので数値は出ません。
LCD Setting

LCD_config
Com_Encoder

周波数の入力

周波数入力には ロータリーエンコーダーを使いました。 可変抵抗器とはまた違ったおもしろい入力装置です。
接続はArduino入力側でのプルアップを利用して簡単にできます。チャタリングも心配なしです。

周波数入力はMobiFlightのInputタブで設定します。 ロータリーエンコーダーには回転方向によって周波数を上下させる部分と、
ACTIVE周波数 と STANBY周波数 を切り替えるための 押しボタンスイッチの部分をそれぞれ設定します。
COM_STBY_RADIO_SWAP と NAV1_RADIO_SWAP をそれぞれ SW1 と SW2 に割り当てています。
Rotary Encoder
なぜか FSUIPCのオフセット0x311Aでは COM Stby周波数がうまく入力できなくなり、いまは 代わりに 0x05CC を使っています。 これは INT 4byteなので 桁数が多くなります。
これを使えばCOM周波数を6桁表示にできるのですが、NAVの方にはこれに相当するものがないので、5桁表示に揃えています。
COM_FQ_set
NAV_FQ_set
COM_NAVswap

エラーが起こったときに

 この設定で動いていたものが、あるときから入力のエラーで動かなくなりました。
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すると停止状態から抜け出せます。それには、ファイルを保存するときには上書きではなく、別名で保存して違う状態をいくつか残しておくことが必要です。
Logging Error

Arduino リセット

 Arduino がうまく動かなくなったとき、まず やってみることは Arduino IDE を使って EEPROMの消去をやってみます。
ファイル>スケッチ例>EEPROM >eeprom_clear を使います。シリアルポートもその前に設定しておきます。
その後、必要なものに書き直せばいいのです。
(Mobiflight9.6から、リセットはMobiFlightの設定ダイアログからもできるようになり、EEPROMがクリアできます。)
EEPROM Clear  これだけでは少しも回復せず、Arduinoボードを壊してしまったかと思ったときがありました。でも もうひとつやることは ハードリセットがあります。
 ArduinoMEGA 2560なら基板上にリセットスイッチのボタンがあります。Arduino Pro Micro では RST(reset)端子とGNDとの間を接触させます。リセットボタンを押し続けながら、電源を入れます。(Pro Microではちょっとやり方が違いますが)
 これで 反応しなかったArduinoが生き返りました。
Mobiflight Rocks

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 など)は避けないと 表示が混乱してしまいます。 Add Reference Com Panel

ロータリーエンコーダー入力を切り換える

 ロータリーエンコーダーの押しボタンスイッチはエンコーダー入力の COM1 と COM2の切り換え、NAV1 と NAV2の切り換えて どちらかを選ぶようにしています。選んでいるのがどっちなのかを示すために LCDの右横にLEDを4つ取り付けました。表面の穴を楕円にした小さな表示ランプです。楕円の穴は裏側からホットボンドでレンズ状に埋めています。この選択表示はLCD内の文字に含めることもソフトウエアによって可能ですが、COM1とCOM2は6桁表示に変更できるようスペースを残しています。また、LED切り換えのためのインバータは2つだけなので ここは TTLを使わず、トランジスタで構成しました。
 Active周波数とStandby周波数の切替は 表示LCD下の4つのスイッチを使います。スイッチパネルの74HC165 Input Shifter にカスケード接続して使いました。押しボタンスイッチはプルアップを兼ね、押したときにLEDが点灯する回路です。
HC165_shiftregister

Offset 0x66C0

 周波数を変更するロータリーエンコーダー入力を切り換える方法のポイントは、FSUIPCのオフセット 0x66C0~66FF を使えることです。この64byteの領域はユーザーが自由に使えます。スイッチの状態をここに書き込んでおき、ここを読み出してスイッチの状態を知り ロータリーエンコーダーの入力先をPrecondition Settingで切り換えます。
OFFSET 0x66C0

切替設定のWizard

1. エンコーダーの押しボタンを if($=1,0,1) をInput settingsに使って 押すたびに1と0を切り換え、その値をオフセット0x66C0 に入力します。 NAV1と2の切替は オフセット 0x66C1 に入力します。オフセットのsizeは 1byteです。
OFFSET 0x66C0 & 66C1 SW_encoder 2. このオフセットの値 0または1を読み出して利用できるよう Outputを設定します。
  また、このOutputを利用して、切り換えスイッチの状態(エンコーダー入力先)をLEDで表示します。
SW_encoder 3. SW_encCOM1/2= 0または1の値によって、ロータリーエンコーダーの入力先を決めます。これにはPreconditionを使います。
  EncoderCOM1 が機能しているときは、EncoderCOM2 は停止しているので 赤い!マークが付いています。 Encoder_COM1   これはスイッチが0の状態なので、COM1の入力が機能しています。COM2入力は停止しています。 Encoder_COM2 LCD


COM周波数を6桁表示に

COM1とCOM2を6桁の表示に変更しました。NAVは5桁です。この 0x05C4~05D0のFSUIPCオフセットを使って、6桁表示にする方法は Hortax氏の記述(Mobiflight>Forum)に学びました。
Offset COM 6digit 4byte(DWORD)では 0~4294967296の数値が表せるので 6桁に対応できます。このままでは9桁になるので、Transformで $/1000 にしています。 なお、実際のCOMでは8.33kHz単位もあるようですが、ここでは 25kHz(0.025MHz)単位で周波数の変更ができます。 config wizard
Encoder setting Encoder setting Activeと Standby周波数の交換は COMでは Event ID でうまく働いたのですが、NAVでは問題が出たので Action TypeはこのようにMSFS2020のものを使いました。 NAV SWAP
COM NAV 6digit

next
logo