前回で、エレキ部分は出来上がったので、今回よりソフト設計に入っていきます。
天板上の部品や工程については、ソフト設計完了後に行う予定です。
まずは、一番の不安「初代Raspberry PI & Raspberry PI OSで「Sharp LS055R1SX04」は使用可能か?」を確認しました。結果から言いますと、使用可能でした。本当にほっとしました。
使用可能になるまで苦しんだことと、わすれてしまいそうなので、経過を備忘録としてまとめました。
■ 結果
下記は、液晶に画像を表示した結果です。モノクロ/カラー画像とも表示できることを確認しました。
まずは、いただいたRaspberry PIが使用でき、余計な出費は抑えられそうで一安心です。
■ Raspberry PI用「Sharp LS055R1SX04」設定
昔からHDMIの設定が苦手で、あまり一発でうまくいった試しがありません。
特に変わった解像度を扱うと大抵試行錯誤になってしまうような気がします。
今回もやはり試行錯誤となってしまいました。
Raspberry PI のHDMI設定は、/boot/config.txtを修正して行います。
デフォルトは、標準的なモニターであれば特にいじる必要はありませんが、今回使用する「Sharp LS055R1SX04」は、アスペクト比、解像度が特殊でW x H = 1440 x 2560という変わり種ですので、修正は必至です。
〇 config.txtの設定項目
config.txt(HDMI)の設定については、こちらに詳細が記載されています。
これを元に試行錯誤しながら修正しました。下記は、今回修正、設定した項目です。
No. | 項目名 | 意味 |
1 | hdmi_ignore_edid | 0xa5000080を設定した場合には、全EDIDを無視して接続を行う。今回は、これ一択。 |
2 | hdmp_force_hotplug | 1をセットするとHDMI接続に関係なく、HDMIホットプラグが発生したものとして振る舞う。 紫外線露光機では、無条件に1。 |
3 | hdmi_group | 0:auto-detect from EDID、1:CEA、2:DMT 1は、CEAグループ、2は、DMTグループを示している。 この値により、4:hdmi_modeのResolution、Frequency、Aspectの意味が変わる。 「Sharp LS055R1SX04」を使用する場合は、無条件に2 |
4 | hdmi_mode | 「Sharp LS055R1SX04」を使用する場合は、一致するテーブルがないので、hdmi_group=2、hdmi_mode=87(カスタム)をセットして使用する。 |
5 | hdmi_drive | 1:DVI mode 2:HDMI mode(DVI + sound) 「Sharp LS055R1SX04」を使用する場合は、1:DVI modeを選択。 |
6 | hdmi_pixel_freq_limit | Width x Height x Frequencyを指定する。 「Sharp LS055R1SX04」の場合 = 1440 x 2560 x 50(Hz) = 184320000 |
7 | hdmi_timings | HDMIタイミング設定。HDMIデバイスに依存する。書式は、下記の通り。 hdmi_timings=<h_active_pixels> <h_sync_polarity> <h_front_porch> <h_sync_pulse> <h_back_porch> <v_active_lines> <v_sync_polarity> <v_front_porch> <v_sync_pulse> <v_back_porch> <v_sync_offset_a> <v_sync_offset_b> <pixel_rep> <frame_rate> <interlaced> <pixel_freq> <aspect_ratio> HDMI_ASPECT_4_3 = 1 HDMI_ASPECT_14_9 = 2 HDMI_ASPECT_16_9 = 3 HDMI_ASPECT_5_4 = 4 HDMI_ASPECT_16_10 = 5 HDMI_ASPECT_15_9 = 6 HDMI_ASPECT_21_9 = 7 HDMI_ASPECT_64_27 = 8 「 Sharp LS055R1SX04」の情報はないので、別途デバイスより読み取って設定を行う。詳細は、「〇 hdmi_timings取得/設定」を参照。 |
8 | framebuffer_widh | フレームバッファ Width。「 Sharp LS055R1SX04」の場合は1440。 |
9 | framebuffer_height | フレームバッファ Height。「 Sharp LS055R1SX04」の場合は2560。 |
10 | max_framebuffer_width | 最大フレームバッファ Width。 「Sharp LS055R1SX04」の場合は1440。 |
11 | max_framebuffer_height | 最大フレームバッファ Height。 「Sharp LS055R1SX04」の場合は2560。 |
12 | display_hdmi_rotate | ディスプレイのローテーションモード。 0:no rotation 1:rotate 90 degrees clockwise 2:rotate 180 degrees clockwise 3:rotate 270 degrees clockwise 0x10000:horizontal flip 0x20000:vertical flip 「Sharp LS055R1SX04」の場合は0。その他は使用不可。 |
〇 hdmi_timings取得/設定
「Sharp LS055R1SX04」を使用する場合は、hdmi_timingsに設定する値をHDMI経由で取得しないと、まずわかりません。今回私は、CRUを使用させていただき値を取得しました。
HDMIに「Sharp LS055R1SX04」を接続し、CRUを実行すると下記の値を取得することができます。
hdmi_timingsの引数は、それぞれHorizontal、Vertical、Refresh rateから読み取った値を下記のように設定すればよさそうです。
hdmi_timings=1440 1 70 35 45 2560 1 12 2 2 0 0 0 50 0 184320000 3
※ 緑部=1440 x 2560 x 50(Hz)
〇 その他設定
ここまでで大体の設定は終わりなのですが、実はこの設定だけでは起動しませんでした。
dtoverlayにvc4-kms-v3d(DRM VC4 V3D driver)を設定すると起動時にHDMIがストールしてしまいます。こちらも汎用解像度である場合は使えるのですが、変わり種の解像度ですので使えません。
今回は、フレームバッファが直接読み書きできれば十分なので、下記の設定行を削除することにしました。
dtoverlay=vc4-kms-v3d
■ 画像確認
画像確認は、下記のようにコマンドラインで実行して確認しました。
% sudo chvt 1
% sudo fbi -T 1 xxx.JPG
今回はフレームバッファに画像を書き込み、しばらくそのままにして、ノイズ、ちらつきが入らないことを確認しました。「hdmi_pixel_freq_limit」「hdmi_timings」の設定が間違っていると、表示する瞬間だけでなく、表示中にちらつきやノイズが入っていたので、その確認のためです。
デバッグ中は、常に発生するわけではなく、不定期に発生していたので、じっと目を凝らして確認しました。
■ 次週
次週からは、まず、ロータリーエンコーダー、1602 LCDの対応を行っていこうと思います。
またよかったら、のぞいていただけるとありがたいです。