おじさん工房 BBS
LCDの互換性でわかる方いたら教えてください。 - yama
2018/12/10 (Mon) 13:29:12
LCDの互換性でわかる方いたら教えてください。
Amzonで3.5インチのLCDが売っていますがこれコネクターの配列や信号か同じなのですが互換性はあるのでしょうか?
https://www.amazon.co.jp/dp/B075FQRBXX/?coliid=IXP0BHVK7GQFV&colid=25C5FVKUUHHR5&psc=0&ref_=lv_ov_lig_dp_it
https://www.amazon.co.jp/dp/B077TM4XX8/?coliid=I1DT6C0CVLUPLL&colid=25C5FVKUUHHR5&psc=0&ref_=lv_ov_lig_dp_it
使えるなら大きくして見たいです。
Re: LCDの互換性でわかる方いたら教えてください。 - やどさん
2018/12/16 (Sun) 22:26:27
yamaさんこんにちは。
単純に「2.4インチの表示画面をそのまま、3.5インチの大きな画面で見たい」ですよね?
ちょっとググってみたら、
3.5インチLCDは 320x480ドットで、コントローラがILI9481でした
SDR-3の
2.4インチLCDは 240x320ドットで、コントローラはILI9341など
端子はコンパチみたいですが、表示はドット数とコントローラが違うので、置き換えは無理そうです。
//
Re: LCDの互換性でわかる方いたら教えてください。 - yama
2018/12/17 (Mon) 18:53:49
「やどさん」情報有難うございます。
単純にはいかないのですね、
でもこの小さなLCD奇麗ですよね!
Re: LCDの互換性でわかる方いたら教えてください。 - すーみん
2018/12/25 (Tue) 20:40:41
yamaさん
コメント遅くなりましたが、まだご覧になっていたら参考までに。
SDR-3のLCDはArduinoのシールド(拡張基板)を転用していますのでピン配列は標準化されたものですが、やどさんがお書きになったとおり、ドット数とコントローラが互換性に関係してくるかと思います。
手持ちのLCDシールド(2.8インチ/ILI9341コントローラー/320x240ドット)をSDR-3に換装して問題なく動作しています。
2.8インチの液晶部分は、オリジナルのLCD赤基板と同じ大きさです。
ただし、私が入手したものは基板が液晶よりもSW1側にやや大きくてSW1の上に重なるので、そのままケーシングできないのが残念。
また、コントローラ違いのLCDシールド(2.4インチ/ILI9325/320x240ドット)では、全体のXY表示は変わらないものの、文字やメータなどのグラフィックを差し込んだ部分が上下左右逆に表示されました。ソース変更で修正可能かと思いますが試しておりません。
肝心のKUMAN SC3A-1(3.5インチ/ILI9486/480x320ドット)ですが、手元にはあるもののロータリエンコーダーに干渉するため試せていないです。ドットサイズや縦横比が異なるので表示が崩れるのは確実ですが、縮小して表示されるのかが気になりますね。
お正月には足が長いピンソケットを準備して試してみようと思っています。
Re: LCDの互換性でわかる方いたら教えてください。 - ぎょふん
2018/12/26 (Wed) 00:13:54
3.2インチの例ですが、見え方の参考になればと思い写真をアップしました。そのまま実装できないので、折角のコンパクトさが犠牲になってしまいます。また、固定しないと扱いにくいし、ショートや断線のリスクがありますのでケーシングは必須です。
すーみんさんの試験も参考にさせていただいて、方針を決めたいと思います。
色々なものがあると思いますが、配線だけで済むのは
・ILI9341
・8bit パラレル(16bit,SPIはNG)
・320:240
・電源 +5V
といったところがキーワードかと思います。
ただ、縦横が90度回転したりする可能性は低いながらも否定できません。
おじさんの目に優しくなったので、触る時間が増えました。早速、Sメータをピークホールド付きに改造し、冬なので暖色系の柿色にしたりして遊んでいます。
Re: LCDの互換性でわかる方いたら教えてください。 - すーみん
2018/12/28 (Fri) 19:38:49
ぎょふんさん
ILI9341/3.2インチ液晶は配線やケーシングが必要ですがとてもFBですね!
ピークホールドもぜひ実装したいです。
参考までにKUMAN K60(2.8インチ/ILI9341/320x240)と、aitendo UL024TF(2.4インチ/ILI9325/320x240)の写真を添付します。実際は2.8インチ液晶と2.4インチ赤基板が同サイズです。上下左右逆=180度回転ですね。
2.8インチはSW1が犠牲になるものの、PTTで代用できますし、SW1を装着したまま延長接続OKということなので、コンパクトを重視するならよいかと思います。
Re: LCDの互換性でわかる方いたら教えてください。 - ぎょふん
2018/12/29 (Sat) 14:59:31
すーみんさん。
こんにちは。
参考画像有難うございます。
やはりそのまま実装できるほうが良いですね。
同じILIのシリーズなのに面白い反転するんですね。
LCDコントローラーICの制御(動作モード?)のレジスタ書き換えみたいな対応で可能なのでしょうか。
同時に、ソースには色々なICの型番が記されているのが気になります。
LCDはaitendo の M032C9341B3 で、改修などが容易にできる範囲に留めて組み立ててみました。数Wのリニア実装や12V化の実装も踏まえつつのつもりですが、現物合わせのその場しのぎなので、何れしわ寄せが来る予感もしています。(^^;
SWは1~5と8に絞り、エンコーダのSWを独立させて、計8個のSWを配置。
また、プログラム書き換え用のポートとSW9,10をコネクタの形で前面に出してあります。
比較的使用頻度が少ないと思ったSW6,7もここから取り出せるようにできます。
エンコーダの別SWは、やや硬いのと、私がグルグル回しまくるので万一交換必要になった時の選択肢を広くするためです。
ピークホールドは勿論JI1UUDさんのSTEP18を間借りさせていただいた亜種ですがSTEP19でもokかと。
ナンチャッテピークホールドなのですが、宜しければお試しください。
ピークを追記するだけの簡易方式なので、実際よりSメータとして0.5くらい多めに見えます。
また、boldはyesに絞ってあります。colorは柿色でなくて設定を反映するようにしてあります。
★や--- peek hold *** ---で囲んだ行が追記部分で、「書き換え」行はありません。
int hold_time = 20 は時間というより、書き換え回数のカウントを時計代わりにしていますが10~30くらいの間かと。
//------------------------------------------
// Sメーターパネル TYPE3用 (ぎょふんさん作)
//------------------------------------------
#define s_meter_type3_origin_y 24
int bar_old = 225 ;
int hold_time = 20 ;//peek hold用変数 保持時間★
int s_peek = 225 ; //peek hold用変数 peek 初期値★
int hold_count = 0 ;//peek hold用変数 保持時間カウンタ★
void analog_s_meter_type3 ( int s, int s_meter_needle, int color ) {
int x0, y0, x1, y1 ;
int bar_sub ; //前回と今回のsの差
int bar_count ; //描画回数
int bar_patn ;
if ( s < -14 ) // Sメーター用 dBu値 の上下限リミット処理
s = -14 ;
else if ( s > 100 )
s = 100 ;
s = (int)( s * 0.8158 + 236.9 ) ; // -14dBu は 225、100dBuは 318に変換
y0 = s_meter_type3_origin_y + 6 ; //バーグラフの上辺
y1 = s_meter_type3_origin_y + 11; //バーグラフの下辺
if ( bar_old < 225 ) bar_old = 225 ;
//************************** バーグラフ表示 ***************************
// 今回のs値と直前のs値(bar_old)が同じ場合は何もしない
// 今回のs値が直前のs値(bar_old)より大きい場合はバーグラフを左端から描画
if ( s > bar_old ) {
bar_sub = s - 224 ; //バーグラフを左端から描画
bar_patn = (s_meter_needle == 0) ? 2 : 1 ;
for ( bar_count = 0 ; bar_count <= bar_sub ; bar_count += bar_patn ) {
lcd_draw_line ( 224 + 1 + bar_count, y0, 224 + 1+ bar_count, y1, color ) ;
}
}
// 今回のs値が直前のs値(bar_old)より小さい場合は差分を消去
if ( s < bar_old ) {
bar_sub = bar_old - s; // 差分を消去する回数 消去の起点は前回のs値(bar_old)
for ( bar_count = 0 ; bar_count <= bar_sub ; bar_count++ ) {
lcd_draw_line ( bar_old + 1 - bar_count, y0, bar_old + 1 - bar_count, y1, C16_BLACK ) ;
}
}
bar_old = s ; // 今回のs値を直前のs値として記憶して次回比較対象とする
//--------------- peek hold code -----------------★
//s値がs_peek以上ならpeekを再描画、s_peek値更新、hold_countを初期化
if ( s >= s_peek ) {
s_peek = s ; hold_count = 0;
for ( bar_count = 0 ; bar_count <= 2 ; bar_count++ ) {
lcd_draw_line ( s_peek + 1 + bar_count , y0, s_peek + 1 + bar_count, y1, color ) ;
}
}
//hold_countがhold_time設定値になったらpeek表示を削除
if ( hold_count == hold_time ){
for ( bar_count = 0 ; bar_count <= 2 ; bar_count++ ) {
lcd_draw_line ( s_peek + 1 + bar_count , y0, s_peek + 1 + bar_count, y1, C16_BLACK ) ;
}
s_peek = 225 ;//s_peekを初期化
}
hold_count++ ; //hold_count 1up
//------------- peek hold code end -------------★
}
//--------------------------------------------------------------------
// Sメーターのパネルと指針の描画 (s_meter_typeでパネルタイプ指定)
Re: LCDの互換性でわかる方いたら教えてください。 - すーみん
2018/12/31 (Mon) 22:54:23
ぎょふんさん こんばんは
ピークホールドのソースその他丁寧に教えて下さり、ありがとうございました。
このお休み中に実装させたいと思います!
>同じILIのシリーズなのに面白い反転するんですね。
>LCDコントローラーICの制御(動作モード?)のレジスタ書き換えみたいな対応で可能なのでしょうか。
>同時に、ソースには色々なICの型番が記されているのが気になります。
lcdarduino.cその他のソースを追いかけて、ニーズはあまりないと思いますが、ILI9325対応を行ってみました。
・lcdarduino.cでは、LCDコントローラのレジスタを読出し、ILI9328, ILI9341, ST7783, HX8347Gの4種についてドライバを切り替えて対応している。
・ILI9328ドライバの実態はILI932X用でILI9325もカバーしているもの。
・ILI9325のレジスタの読み出し値は0x93259325でILI9328(0x93289328)とは異なるが、4種以外の場合はデフォルトでILI9328ドライバを選択して処理しているために、結果的に(=たまたま)ほとんどの表示はうまくいく。
・ところが、lcd_draw_ch(一文字を描く)では、ILI9328とST7783のみに限定して180度回転処理を行っているので、ILI9325の文字は正しく表示されない。
・また、lcd_draw_pic(メータのグラフィック描画)については、回転処理を行っていないので、文字同様正しく表示されない。
上記のプログラムの流れから、KUMAN SC3A-1(3.5インチ/ILI9486/480x320ドット)をそのまま挿しても正しく表示されません。、(実際に試しました)そもそも、16bitパラレルである可能性があります。
以下、冗長なソースで恥ずかしいですが、参考までに添付します。 ILI9328, ST7783, HX8347Gについては未テストです。
皆さま、良い年をお迎え下さい。
lcdarduino.c
//--------------------------------------------------------------------
//
// lcdarduino.c Arduino TFT shield(320*240, 8bit parallel)の制御プログラム
// ILI9328, ILI9341, ST7783, HX8347G を統合したドライバー
// ILI9325追加/メータ表示のILI9328,ST7783対応 2018.12.31
//--------------------------------------------------------------------
:
(中略)
:
#define ILI9325 0x93259325 //★ILI9325を追加 2018.12.31
#define ILI9328 0x93289328
:
(中略)
:
static void lcd_setadrs( int x0, int y0, int x1, int y1 ) {
switch( lcdcontroller ) {
default:
case ILI9325: //★ 2018.12.31
case ILI9328:
ili9328_setadrs( x0, y0, x1, y1 );
break;
case ILI9481:
:
(中略)
:
//───────────────────────────────────
void lcd_init( void )
{
LCD_RESX_L();
delay_msec(1); // reset pulse > 10us ILI9341 spec 15.4 p.218
LCD_RESX_H();
delay_msec(10); // resetting time < 5ms ILI9341 spec 15.4 p.218
lcd_controller(); // which controller?
uint i=0, a, d;
switch( lcdcontroller ) {
default:
case ILI9325: //★2018.12.31
case ILI9328:
while( i < sizeof(ILI932x_regValues) / sizeof(uint16_t) ) {
:
(中略)
:
//----------------------------------------------------------
// 1 文字描く
//----------------------------------------------------------
void lcd_draw_ch( int x, int y, int ch, int size, int color1, int color2 ) {
:
(中略)
:
#if defined LCD_LANDSCAPE || defined LCD_LANDSCAPE_INV
//if( lcdcontroller==ILI9328 || lcdcontroller==ST7783 ) {
if( lcdcontroller==ILI9325 || lcdcontroller==ILI9328 || lcdcontroller==ST7783 ) { //★ILI9325を追加
font += ((size+7)/8)*size - 1; // font 右下から描いていくので
:
(中略)
:
//----------------------------------------------------------
// 矩形領域にビットマップ(4色)を描画
//----------------------------------------------------------
void lcd_draw_pic( int x0, int y0, int x1, int y1, int size, const int *pixelbuf) {
int i, pix16, pix, color;
lcd_setadrs( x0, y0, x1, y1 );
LCD_CSX_L();
int tmp = (LCD_DATA_PORT->ODR)&(~LCD_DATA_PORT_MASK);
while( size-- ) {
// ★ILI9325,ILI9328,ST7783の時は末データから描画 2018.12.31
if( lcdcontroller==ILI9325 || lcdcontroller==ILI9328 || lcdcontroller==ST7783 ) {
pix16 = *(pixelbuf + size);
for ( i=0; i<31; i+=2) {
pix = ( pix16 >> i ) & 0x3 ;
switch ( pix ) {
default:
case 0: color = C16_BLACK ;
break ;
case 1: color = C16_WHITE ;
break ;
case 2: color = C16_RED ;
break ;
case 3: color = C16_YELLOW ;
break ;
}
LCD_WRX_L();
(LCD_DATA_PORT->ODR) = tmp | ((color>>8)&LCD_DATA_PORT_MASK);
WRX_DLY();
LCD_WRX_H();
WRX_DLY();
LCD_WRX_L();
(LCD_DATA_PORT->ODR) = tmp | ((color)&LCD_DATA_PORT_MASK);
WRX_DLY();
LCD_WRX_H();
}
} else {
pix16 = *pixelbuf++ ;
for ( i=30; i>-1; i-=2) {
pix = ( pix16 >> i ) & 0x3 ;
switch ( pix ) {
default:
case 0: color = C16_BLACK ;
break ;
case 1: color = C16_WHITE ;
break ;
case 2: color = C16_RED ;
break ;
case 3: color = C16_YELLOW ;
break ;
}
LCD_WRX_L();
(LCD_DATA_PORT->ODR) = tmp | ((color>>8)&LCD_DATA_PORT_MASK);
WRX_DLY();
LCD_WRX_H();
WRX_DLY();
LCD_WRX_L();
(LCD_DATA_PORT->ODR) = tmp | ((color)&LCD_DATA_PORT_MASK);
WRX_DLY();
LCD_WRX_H();
}
}
} //★
LCD_CSX_H();
}
Re: LCDの互換性でわかる方いたら教えてください。 - ぎょふん
2019/01/03 (Thu) 21:35:37
すーみんさん
皆さま
明けましておめでとうございます。
すーみんさん
詳細な調査とコードも公開いただきまして有難うございます。今のスキルでは到底出来ないので勉強させていただきます。
arduinoファンもいらっしゃるはずなので、すーみんさんの投稿を参考にして、実験・実装なさる方が多くいらっしゃるものと思います。私は該当のコントローラのものが手元にないのですが、一先ずILI9327がありましたので挑戦してみたいと思います。ただ、悲しいかな3.2" 400*240です。
ILI9325についても試したいのですが、実装時の干渉については、粗々な案ですがunoかmega用の蛇の目基盤を2枚とコネクタ関係を少々用意してスライドした下駄をつくる構造を考えています。向かって左にスライド実装するようにしたら何とかなるかと・・・。
下駄の上側を大きくして「お面」のようにすればエンコーダやSWも取り付けれる? なとど現バージョンが未完なのに別の実装方法の妄想が広がっております。
何らか結果でましたらまた投稿させていただきます。
Re: LCDの互換性でわかる方いたら教えてください。 - すーみん
2019/01/07 (Mon) 21:16:16
ぎょふんさん、皆さま
明けましておめでとうございます。本年も宜しくお願いします。
>ILI9327がありましたので挑戦してみたいと思います。ただ、悲しいかな3.2" 400*240です。
9325の部分を9327に書き替えると、横80ドット分が表示されないだけになるのでは。。(想像です)
下駄基板を挟むのは妙案ではないでしょうか。私もシールド用蛇の目基板を手に入れてあります。
2.8インチの手軽さと3.2インチのサイズのどちらを優先するかが悩ましいところですが、
とりあえずM032C9341B3をポチッとしてしまいました (^^)
ピークホールドもうまくいきました。ありがとうございました。
Re: LCDの互換性でわかる方いたら教えてください。 - ぎょふん
2019/01/08 (Tue) 21:10:08
すーみんさん
JI1UDDさん
みなさん
毎度長文で申し訳ありません。
ILI9327ですが、先日のトライで失敗。真っ白でした。後でファイルを間違えていたことに気づき心が折れました。ブレッドボードとは言え再度回路を組む気力が・・・・
気力が回復したら真っ先にすーみんさんの想定で再挑戦します。(^^;
ピークホールドですが、BUGがあったのと、非対応としていたbold off時に中途半端な動きをしないように変更しました。ピーク表示は白固定。
後日bold off時の対応をしたくなった時に分かり易くするために、初心者なりにswitchで明示的に分離しておいたつもりです。
また、お気づきと思いますが、sに変化が無いとホールド時間のカウントが止まります。そのため、AMなど信号の変化が緩やかな場合はピーク表示時間が頻繁に長くなります。SSBやCWでは気にならないと思いますが、AM等でも同様にする場合は、一時的にradio.cを下記のように2行コメントアウトしていただくと良いと思います。(他への影響は不明)
radio.c
変更後
// アナログ S メーター
// if ( diff != 0 ) { // s と s_old に差があるなら更新する
disp_smeter( s ) ;
// }
JI1UDDさん
TYPE3のバーの描画で私のソースに誤りがありました。まことに勝手なお願いですが、次回STEPリリースの機会がございましたら改定をお願い致します。
BUGは、x軸の計算ミスで40dBuの時にs9を示していなかったので発覚。ピーク表示部分は正規s表示に付け足し表示しています。
"""""""""""""" 以下 mater.cの改定部分 """""""""""""""""
//------------------------------------------
// Sメーターパネル TYPE3用 (ぎょふんさん作)
//------------------------------------------
#define s_meter_type3_origin_y 24
int bar_old = 225 ;
int hold_time = 20 ;//peek hold用変数 保持時間
int s_peek = 225 ; //peek hold用変数 peek 初期値
int hold_count = 0 ;//peek hold用変数 保持時間カウンタ
int bar_patn ;
void analog_s_meter_type3 ( int s, int s_meter_needle, int color ) {
int x0, y0, x1, y1 ;
int bar_sub ; //前回と今回のsの差
int bar_count ; //描画回数
if ( s < -14 ) // Sメーター用 dBu値 の上下限リミット処理
s = -14 ;
else if ( s > 100 )
s = 100 ;
s = (int)( s * 0.8158 + 236.9 ) ; // -14dBu は 225、100dBuは 318に変換
y0 = s_meter_type3_origin_y + 6 ; //バーグラフの上辺
y1 = s_meter_type3_origin_y + 11; //バーグラフの下辺
if ( bar_old < 225 ) bar_old = 225 ;
//************************** バーグラフ表示 ***************************
// 今回のs値が直前のs値(bar_old)より大きい場合はバーグラフを左端から描画
if ( s >= bar_old ) {
bar_sub = s - 225 ;
bar_patn = (s_meter_needle == 0) ? 2 : 1 ;
for ( bar_count = 0 ; bar_count <= bar_sub ; bar_count += bar_patn ) {
lcd_draw_line ( 225 + bar_count, y0, 225 + bar_count, y1, color ) ;
}
}
// 今回のs値が直前のs値(bar_old)より小さい場合は差分を消去
if ( s < bar_old ) {
bar_sub = bar_old - s; // 差分を消去する回数 消去の起点は前回のs値(bar_old)
for ( bar_count = 0 ; bar_count <= bar_sub ; bar_count++ ) {
lcd_draw_line ( bar_old - bar_count, y0, bar_old - bar_count, y1, C16_BLACK ) ;
}
}
bar_old = s ; // 今回のs値を直前のs値として記憶して次回比較対象とする
//--------------- peek hold code -----------------
//s値がs_peek以上ならs_peek値更新、hold_countを初期化、peekを再描画、
switch ( bar_patn ) {//bold yes/no での動作を明示的に分けておく
default:
case 1://bold yes の場合
if (s >= s_peek) {//s値がs_peek以上
s_peek = s ; hold_count = 0;
for ( bar_count = 0 ; bar_count <= 1 ; bar_count++ ) {//peek 2行
lcd_draw_line ( s_peek + 1 + bar_count, y0, s_peek + 1 + bar_count, y1, C16_WHITE ) ;}
}
if (hold_count == hold_time) {//hold_countがhold_time設定値
for ( bar_count = 0 ; bar_count <= 1 ; bar_count++ ) {//peek表示を削除
lcd_draw_line ( s_peek + 1 + bar_count, y0, s_peek + 1 + bar_count, y1, C16_BLACK ) ;}
s_peek = 225 ;//s_peekを初期化
hold_count = 0 ;//hold_countを初期化
}
break ;
case 2://bold no の場合 peek描画しない
break ;
}//switch
hold_count++ ; //hold_count 1up
//------------- peek hold code end -------------
}
//--------------------------------------------------------------------
// Sメーターのパネルと指針の描画 (s_meter_typeでパネルタイプ指定)
""""""""""""""" ここまで """""""""""""""""""""""""
M032C9341B3の設定と接続は下記で動きました。
8bit MODE , 5V にジャンパ設定変更。
SDR-3D側はunoに見立てたピン名称になっています。
LCD側は偶々1列に集中しています。
タッチパネル機能は有りませんので配線もありません。
このLCDは下駄を履かせてフラットケーブルで接続してみました。uno互換ソケットの未使用ピンを利用してエンコーダ等のほかの信号も取り出しているので線数は多めです。
【SDR-3D(uno)側 - M032C9341B3側pinNo. 計16本】
D2-9,D3-10,D4-11,D5-12,D6-13,D7-14
D8-7,D9-8
A4-17,A3-15,A2-4,A1-5,A0-6
GNG-1,+5V-2,+3.3V-19
Re: LCDの互換性でわかる方いたら教えてください。 - ji1udd
2019/01/08 (Tue) 21:47:06
ぎょふんさんへ
> 次回STEPリリースの機会がございましたら改定をお願い致します。
了解です。ピークホールド機能を活用させて頂くという意味でも次Stepにて改訂します。
> 一時的にradio.cを下記のように2行コメントアウトしていただくと良いと思います。
S値が変化しないときに、電源電圧表示もUpdateされないこともあり、恒久的にコメントアウト(削除)とする方向で対処したいと思います。