QY20 表示部(LCD)を自作⑥:試作ボードの作成、表示部のポーティング

2024/01/07

RP2040 YAMAHA QY20 実験 電子回路

 XIAO RP2040を使ったArduinoでのMSP2807の表示、PICOを使ったC言語でのQY20からのDMF50202N表示データ取得は、すべてブレッドボード上で作業してきました。しかし、信号線の接触不良などで、しばしば、作業が中断されたり、接触不良に気づかず、プログラム側の問題として、時間を費やすことが増えたので、試作ボードを作りました。

単なる、ソケット端子と結線だけです。


さて、本題。MSP2807の制御プログラムは、Arduino言語で作りました。言語自体は、Cなのですが、ライブラリを使っているので、その部分を書き直しです。PICOのCライブラリ(実際にはインクルード)に1つ1つ置き換えます。PICO用のSPI仕様を調べるのに、相当苦労しました。未だに、よくわかっていない部分もありますが、なんとか動きました。
初期化部分は、こんな感じです。関数名は、MSP2807の初期化になってますが、SPI自体の初期化もしています。
---

void init_MSP2807() {
    spi_init(spi0, 40 * 1000 * 1000);
    gpio_set_function(SPI0_RX, GPIO_FUNC_SPI);
    gpio_set_function(SPI0_CSK, GPIO_FUNC_SPI);
    gpio_set_function(SPI0_TX, GPIO_FUNC_SPI);
    bi_decl(bi_2pins_with_func(SPI0_TX, SPI0_CSK, GPIO_FUNC_SPI));
    spi_set_format(spi0, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);
    
    gpio_init(TFT_DC);
    gpio_set_dir(TFT_DC, GPIO_OUT);
    gpio_init(TFT_RST);
    gpio_set_dir(TFT_RST, GPIO_OUT);
    
    sleep_ms(1000);
    // --- HARDWARE Reset
    gpio_put(TFT_RST, 0);
    sleep_ms(100);
    gpio_put(TFT_RST, 1);
    sleep_ms(100);

    gpio_put(TFT_DC, DC_CMD);
    spi_data[0] = 0x01;
    spi_write_blocking(spi0, spi_data, 1);    
    sleep_ms(150);  

    spi_data[0] = 0x13;
    spi_write_blocking(spi0, spi_data, 1);    

    spi_data[0] = 0x36;
    spi_write_blocking(spi0, spi_data, 1);        
    gpio_put(TFT_DC, DC_DATA);
    spi_data[0] = 0x48;
    spi_write_blocking(spi0, spi_data, 1);    

    gpio_put(TFT_DC, DC_CMD);
    spi_data[0] = 0x3a;
    spi_write_blocking(spi0, spi_data, 1);    
    gpio_put(TFT_DC, DC_DATA);
    spi_data[0] = 0x55;
    spi_write_blocking(spi0, spi_data, 1);

    gpio_put(TFT_DC, DC_CMD);
    spi_data[0] = 0x11;
    spi_write_blocking(spi0, spi_data, 1);         
    sleep_ms(120); 
    spi_data[0] = 0x29;
    spi_write_blocking(spi0, spi_data, 1);
}
---

実際の表示の際は、表示領域を指定して、データを書き込みます。その時、16ビットを使うのですが、16ビット送信でトラブりました。普通に、"spi_write16_blocking"関数を使うと、エンディアンが違うのか、表示領域がずれます。MSB指定が効果していないみたい。仕方なく、8ビット指定で設定します。これでなんとか動きました。しかし、SPI通信を40Mにしても、1フレーム80ms要します。なんと12フレーム/秒の遅さ。カクカクした動きになりそうですが、もともと、速度を必要とする表示内容ではないので、大丈夫かも。


LCD換装に着手して、1か月少しですが、かなり進みました。処理速度の面で、PICやH8/3694などが使えないことがわかり、半年くらいはかかる想定でした。RP2040のPIOを使えば可能と分かりましたが、一からの習得のため、半年は見込んでいました。
年末年始で、PICOのプログラミング本を読み込み、同時にWebを探し回って、なんとかここまで来ました。使った本は、これです。

この本の2章がほとんど。あとは、raspberry pi picoのホームページのドキュメントですね。Webで紹介されている内容は、とっかかりとして大事ですが、基本を押さえるには、Webでは難しいです。わからない部分を探すには、Webのがよい。というように、使い分けつつ、進めています。

設計レベルとしては、調査・試験段階である、
  • QY20からのデータ取得可能(PICO:C言語)
  • QY20とPCO/RP2040の電圧変換での駆動確認(試作ボード作成)
  • MSP2807の表示処理可能(XIAO RP2040:C言語)
が完了したので、これらを組み合わせた作業に移ります。今後の作業は、
  • XIAO RP2040でのQY20データ取得(試作ボード使用)
  • 取得データをMSP2807へ、そのまま出力(データのチェック)
  • 取得データのアスペクト変換
  • 表示速度改善
ですね。



QooQ