Sipeed Longan Nanoで文字を表示してみる
前回の記事で、Sipeed Longan Nanoの開発環境のセットアップについて書きました。本日は、Longan NanoのLCDへの表示方法について書こうと思います。Longan NanoのLCDは、データシートを見てもコントローラの種類やMCUのどのポートに接続されているのかなど、何も記載がありません。Webを検索してもあまりLCDに実際に表示を行っている例もなく途方に暮れていたのですが、Sipeedのオフィシャルサイトの製品ページにLCD表示サンプルプログラムへのリンクがあったので試してみることにしました。製品情報のDocumentsタブにあるLCD Demoをクリックすると参照することができます(あるいは、こちらからもダウンロードが可能です)。
今回は、Arduinoではなくメーカー提供のSDKを用いてC言語で開発を行いますので、まずはPlatformIOのほうの準備を行います。PIO Homeを開き、“New Project”をクリックし、“Board”は“Sipeed Longan Nano”、“Framework”は“GigaDevice GD32V SDK”を選択し、“Finish”でプロジェクトが作成されます。

“platformio.ini”に追記を行います。

先ほどダウンロードしたサンプルプログラムの“include”フォルダの“lcd”フォルダと“systick.h”を、プロジェクトフォルダの“include”フォルダへコピー、“src”フォルダの“lcd”フォルダと“systick.c”も同様にコピーします。最後に、プロジェクトフォルダの“src”フォルダに“main.c”を作成します。これで準備は完了です。
ちなみに、lcd.c/lcd.h がLCD制御ライブラリの本体、bmp.h がライブラリ内で使用するロゴデータのサンプル、oledfont.h が文字フォントデータ、systick.c/systick.h が1ms単位でのウェイトを行う関数となっているようです。
エディタで main.c を開き、以下のように入力します。

ファイルを保存、コンパイルを行い、マイコンに書き込みます。今回はドライバのインストールが済んでいるので簡単です。BOOTボタンを押しながらUSB接続を行うか、BOOTボタンを押しながらリセットすると書き込みモードになります。書き込みツールを使用して書き込んでからRESETボタンを押すと、無事に表示されました(写真が汚くて申し訳ありません)。

以下に、ライブラリの簡単な説明を載せておきます。すべてを試したわけではないので誤っている部分もあるかもしれませんが、その際は指摘してしていただければありがたいです。また、フォントやロゴの定義方法などはまた今後調べてみたいと思います。
lcd.h 色指定用記号定数:
WHITE :白
BLACK :黒
BLUE :青
GBLUE :青緑
RED :赤
MAGENTA :マゼンタ
GREEN :緑
CYAN :シアン
YELLOW :黄色
BROWN :茶色
BRRED :赤茶色
GRAY :灰色
(その他中間色が数種類定義されています)
lcd.c グローバル変数:
unsinged int BACK_COLOR; :文字表示の際の背景色
unsigned char image[12800]; :LCD_ShowPicture() で表示するイメージを格納する配列
lcd.c 関数 (低レベルI/O関数は除く):
void Lcd_Init(void);
LCDを初期化する。
void LCD_Clear(u16 Color);
LCDをクリアする(=Colorで指定した色で全面を塗りつぶす)。
Color = 背景色
void LCD_ShowChinese(u16 x,u16 y,u8 index,u8 size,u16 color);
漢字を表示する(別途 oeldfont.h の中でパターン定義されているもののみ)。
x, y = 座標 index = 漢字のインデックス番号(定義されている順に0~)
size = フォントサイズ(16/32) color = 描画色
void LCD_DrawPoint(u16 x,u16 y,u16 color);
点を打つ。
x, y = 座標 color = 描画色
void LCD_DrawPoint_big(u16 x,u16 y,u16 color);
大きな点を打つ(実際には3x3ピクセルの正方形を描く)。
x, y = 座標 color = 描画色
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);
矩形領域を塗りつぶす。
xsta, ysta = 左上座標 xend, yend = 右下座標 color = 描画色
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);
直線を描画する。
x1, y1 = 起点座標 x2, y2 = 終点座標 color = 描画色
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);
矩形を描画する。
x1, y1 = 起点座標 x2, y2 = 終点座標 color = 描画色
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);
円を描画する。
x0, y0 = 中心 r = 半径 color = 描画色
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode,u16 color);
文字を表示する
x, y = 座標 num = 文字コード(ASCII) mode = モード color = 描画色
※mode = 1 のとき OR、 mode = 0 のとき 上書き(文字背景を BACK_COLOR で塗りつぶした上に描画)
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color);
文字列を表示する(必ず上書きモードとなる)。
x, y = 座標 p = ASCII文字列へのポインタ color = 描画色
void LCD_ShowNum(u16 x,u16 y,u16 num,u8 len,u16 color);
整数値を表示する。
x, y = 座標 num = 数値 len = 表示桁数 color = 描画色
void LCD_ShowNum1(u16 x,u16 y,float num,u8 len,u16 color);
小数値を表示する。
x, y = 座標 num = 数値 len = 表示桁数 color = 描画色
void LCD_ShowPicture(u16 x1,u16 y1,u16 x2,u16 y2);
イメージを表示する( image[] に格納されたデータを表示する)。
x1, y1 = 左上座標 x2, y2 = 右下座標
void LCD_ShowLogo(void);
ロゴマークを表示する( bmp.h で定義されたデータを表示する)。
最低限の機能ではありますが、ごれぐらいあれば困ることはほとんどないのではないでしょうか。参考としていただければ幸いです。最後に、Longan Nanoの開発に参考となりそうなサイトへのリンクをいくつか載せておきます。
公式Wiki(英語)
公式GitHub
GD32V MCUのマニュアル類
その他ツール、ドキュメント、サンプルなどの公式ダウンロードサイト
今回は、Arduinoではなくメーカー提供のSDKを用いてC言語で開発を行いますので、まずはPlatformIOのほうの準備を行います。PIO Homeを開き、“New Project”をクリックし、“Board”は“Sipeed Longan Nano”、“Framework”は“GigaDevice GD32V SDK”を選択し、“Finish”でプロジェクトが作成されます。

“platformio.ini”に追記を行います。
upload_protocol = dfu

先ほどダウンロードしたサンプルプログラムの“include”フォルダの“lcd”フォルダと“systick.h”を、プロジェクトフォルダの“include”フォルダへコピー、“src”フォルダの“lcd”フォルダと“systick.c”も同様にコピーします。最後に、プロジェクトフォルダの“src”フォルダに“main.c”を作成します。これで準備は完了です。
ちなみに、lcd.c/lcd.h がLCD制御ライブラリの本体、bmp.h がライブラリ内で使用するロゴデータのサンプル、oledfont.h が文字フォントデータ、systick.c/systick.h が1ms単位でのウェイトを行う関数となっているようです。
エディタで main.c を開き、以下のように入力します。
#include "lcd/lcd.h"
int main( void ) {
// LCD制御サンプルプログラム
Lcd_Init(); // lcdを初期化する
LCD_Clear( WHITE ); // lcdをクリアする
BACK_COLOR = CYAN; // 文字の背景色を指定
LCD_ShowString( 10, 4, "Longan Nano", MAGENTA );
LCD_ShowString( 10,24, "LCD Test", MAGENTA );
while( 1 );
}

ファイルを保存、コンパイルを行い、マイコンに書き込みます。今回はドライバのインストールが済んでいるので簡単です。BOOTボタンを押しながらUSB接続を行うか、BOOTボタンを押しながらリセットすると書き込みモードになります。書き込みツールを使用して書き込んでからRESETボタンを押すと、無事に表示されました(写真が汚くて申し訳ありません)。

以下に、ライブラリの簡単な説明を載せておきます。すべてを試したわけではないので誤っている部分もあるかもしれませんが、その際は指摘してしていただければありがたいです。また、フォントやロゴの定義方法などはまた今後調べてみたいと思います。
lcd.h 色指定用記号定数:
WHITE :白
BLACK :黒
BLUE :青
GBLUE :青緑
RED :赤
MAGENTA :マゼンタ
GREEN :緑
CYAN :シアン
YELLOW :黄色
BROWN :茶色
BRRED :赤茶色
GRAY :灰色
(その他中間色が数種類定義されています)
lcd.c グローバル変数:
unsinged int BACK_COLOR; :文字表示の際の背景色
unsigned char image[12800]; :LCD_ShowPicture() で表示するイメージを格納する配列
lcd.c 関数 (低レベルI/O関数は除く):
void Lcd_Init(void);
LCDを初期化する。
void LCD_Clear(u16 Color);
LCDをクリアする(=Colorで指定した色で全面を塗りつぶす)。
Color = 背景色
void LCD_ShowChinese(u16 x,u16 y,u8 index,u8 size,u16 color);
漢字を表示する(別途 oeldfont.h の中でパターン定義されているもののみ)。
x, y = 座標 index = 漢字のインデックス番号(定義されている順に0~)
size = フォントサイズ(16/32) color = 描画色
void LCD_DrawPoint(u16 x,u16 y,u16 color);
点を打つ。
x, y = 座標 color = 描画色
void LCD_DrawPoint_big(u16 x,u16 y,u16 color);
大きな点を打つ(実際には3x3ピクセルの正方形を描く)。
x, y = 座標 color = 描画色
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);
矩形領域を塗りつぶす。
xsta, ysta = 左上座標 xend, yend = 右下座標 color = 描画色
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);
直線を描画する。
x1, y1 = 起点座標 x2, y2 = 終点座標 color = 描画色
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);
矩形を描画する。
x1, y1 = 起点座標 x2, y2 = 終点座標 color = 描画色
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);
円を描画する。
x0, y0 = 中心 r = 半径 color = 描画色
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode,u16 color);
文字を表示する
x, y = 座標 num = 文字コード(ASCII) mode = モード color = 描画色
※mode = 1 のとき OR、 mode = 0 のとき 上書き(文字背景を BACK_COLOR で塗りつぶした上に描画)
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color);
文字列を表示する(必ず上書きモードとなる)。
x, y = 座標 p = ASCII文字列へのポインタ color = 描画色
void LCD_ShowNum(u16 x,u16 y,u16 num,u8 len,u16 color);
整数値を表示する。
x, y = 座標 num = 数値 len = 表示桁数 color = 描画色
void LCD_ShowNum1(u16 x,u16 y,float num,u8 len,u16 color);
小数値を表示する。
x, y = 座標 num = 数値 len = 表示桁数 color = 描画色
void LCD_ShowPicture(u16 x1,u16 y1,u16 x2,u16 y2);
イメージを表示する( image[] に格納されたデータを表示する)。
x1, y1 = 左上座標 x2, y2 = 右下座標
void LCD_ShowLogo(void);
ロゴマークを表示する( bmp.h で定義されたデータを表示する)。
最低限の機能ではありますが、ごれぐらいあれば困ることはほとんどないのではないでしょうか。参考としていただければ幸いです。最後に、Longan Nanoの開発に参考となりそうなサイトへのリンクをいくつか載せておきます。
公式Wiki(英語)
公式GitHub
GD32V MCUのマニュアル類
その他ツール、ドキュメント、サンプルなどの公式ダウンロードサイト
- 関連記事
-
- USB Blaster互換機でLongan Nanoのデバッグ環境構築 (2019/12/07)
- Sipeed Longan Nanoで文字を表示してみる (2019/11/10)
- Sipeed Longan Nanoを使ってみました (2019/11/09)
スポンサーサイト