今回は、ESP-IDF で AQM1248A グラフィックLCD を使用する です。PICで使用、Arduinoで使用、と同じサンプルプログラムを ESP-IDFで実行しています。
先ずは回路
CPUはESP32を使用しています。ESP32とAQM1248Aとは下記の様に配線しています。
AQM1248A | ESP32 |
---|---|
SCLK | 30: GPIO18(SCK) |
SDI | 36: GPIO23(MOSI) |
CS | 27: GPIO16 |
RS | 24: GPIO15 |
RESET | 01: EN |
次はソフト
AQM1248AのインターフェイスはSPIです。AQM1248AはコマンドとデータをRS端子でコントロールしています。よってESP32から単純にSPIでデータを送信するプログラムを書けば良いことになります。
samp.c
----------------------------------------------------------------------------------------
spi_bus_config_t buscfg={
.miso_io_num=PIN_NUM_MISO,
.mosi_io_num=PIN_NUM_MOSI,
.sclk_io_num=PIN_NUM_CLK,
.max_transfer_sz=3
};
//Initialize the SPI bus
spi_bus_initialize(VSPI_HOST, &buscfg, SPI_DMA_CH_AUTO);
spi_device_interface_config_t devcfg={
.clock_speed_hz=SPI_MASTER_FREQ_20M,
.mode=0,
.queue_size=1,
};
//Attach the LCD to the SPI bus
spi_device_handle_t spi;
spi_bus_add_device(VSPI_HOST, &devcfg, &spi)
-----------------------------------------------------------------------------------------
void LCD_cmd(uint8_t cmd,spi)
{
spi_transaction_t t;
memset(&t, 0, sizeof(t));
t.length=8;
t.tx_buffer=&cmd;
spi_device_polling_transmit(spi, &t);
}
- ESP32でAQM1248AをコントロールするのでMASTER設定となります。
- 3から8行:バスコンフィグの作成
- 3行:spi_bus_config_t型の変数 buscfgを宣言
- 4行: .miso_io_num: マスターイン・スレーブアウト用のピン指定。
- 5行: .mosi_io_num: マスターアウト・スレーブイン用のピン指定。
- 6行: .sclk_io_num: クロック用ピンの指定
- 7行: .max_transfer_sz: 一度に送る最大のバイト数。
- mosi_io_num にGPIO23。 sclk_io_numにGPIO18。 miso_io_numは使用していません。使用しない時は、”−1”を指定します。
- 今回は1バイトづつの転送なので .max_transfer_sz は1で良いと思うのですが、念の為3を指定しています。
- 3行:spi_bus_config_t型の変数 buscfgを宣言
- 11行: spi_bus_initialize(VSPI_HOST, &buscfg, SPI_DMA_CH_AUTO);
- 上記で設定したピンコンフィグを使って、SPIの初期化を行います。
- 第一引数:使用するSPIバスの指定。HSPI_HOSTとVSPI_HOSTの2つのバスが有ります。今回はVSPI_HOSTを使用します。
- 第二引数:ピンコンフィグです。上記で作成したコンフィグを使用します。
- 第三引数:チャンネルの指定。
SPI_DMA_CH_AUTO
を選んで置けば無難。
- 13から17行:インターフェイスコンフィグの作成
- 14行: .clock_speed_hz:転送クロックの指定。指定出来るクロックは
SPI_MASTER_FREQ_9M:
8.89MHz-
SPI_MASTER_FREQ_10M
:10MHz SPI_MASTER_FREQ_11M
: 11.43MHzSPI_MASTER_FREQ_13M
:13.33MHzSPI_MASTER_FREQ_16M:
16MHzSPI_MASTER_FREQ_20M
:20MHzSPI_MASTER_FREQ_26M
:26.67MHzSPI_MASTER_FREQ_40M:
40MHzSPI_MASTER_FREQ_80M:
80MHz
- 15行:通信モード。0,1,2,3が有ります。今回は0を使用
- 16行:これは良く分かりません。1以上の数字を指定すれば良い様です。
- この他にも色んな設定項目が有りましたが、今回はこれでOKでした。
- 14行: .clock_speed_hz:転送クロックの指定。指定出来るクロックは
- 20行:SPI用のハンドルを宣言して
- 21行:先程選択したVSPI_HOSTにインターフェイスコンフィグを適応させます。
- ここまでの設定が完了すると、SPI通信が可能になります。
- 通信に使っている関数は、spi_device_polling_transmit(spi, &t);です。
- 25から33行が通信用関数の例です。この関数は引数として下記の2つを持ちます。
- cmd:送信するデータの文字列。
- spi:SPI通信用のハンドル。
- 27行:通信用のインスタンスを宣言
- 30行:送信するデータの長さをビットで指定。今回は1バイトのみなので8としています。
- 31行:送信用バッファーに送信データをコピー。
- 32行:ここで送信します。
後は、PICで使用、Arduinoで使用 で使用したプログラムのデータ送信部分をこの関数に置き換えればOKです。
今回のプロジェクトは以下の様になっています。
- ~esp/AQM1248/
- CMakeLists.txt
- components/
- AQM1248/
- AQM1248A.c
- AQM1248A.h
- CMakeLists.txt
- main/
- AQM1248_demo.c
- CMakeLists.txt
- CMakeLists.txt
- componentsフォルダーの下のAQM1248A.cとAQM1248A.hがAQM1248A制御用のコードです。
- mainフォルダーの下のAQM1248_demo.cがデモプログラムです。PICで使用、Arduinoで使用 と同じでもが流れます。
文字表示に使用しているフォントサイズは6x8ビット。AQM1248Aに表示すると小さく見難いので1文字表示と、文字列表示に引数を追加して文字の大きさを指定出来る様にしています。
- 一文字表示関数:void LCD_Print_C(int x_data, int y_data, char c_data, int cl, int m_fl)
- 文字列表示関数:void LCD_Print_Str(int x_data, int y_data, char *c_data, int cl, int m_fl)
- 共に最後の引数で文字の倍率を指定します。
- 1,2,3、4が指定出来ます。指定するとそれぞれ文字が1、2,3,4倍になります。
- 表示範囲を超えて表示しようすると暴走します。気を付けて下さい。
最後に
今回使用してプロジェクトをここに保存します。
モニターで idf.py -p [USB port} flash monitor を実行すればデモが起動します。