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のマニュアル類
その他ツール、ドキュメント、サンプルなどの公式ダウンロードサイト
スポンサーサイト
Sipeed Longan Nanoを使ってみました
本日はXperia 1の記事の続きを書くつもりだったのですが、先日購入した安価なマイコンボード、Sipeed Longan Nanoが面白そうなので触ってみました。このボードはRISC-Vアーキテクチャの32bit MCUであるGigaDevice GD32VF103CBT6を搭載しており、32KBのSRAMと128KBのフラッシュメモリを内蔵、microSDカードスロット、160×80ドット、0.96インチのフルカラーIPS液晶も搭載しています。今回は秋月で購入しましたが、ボード本体とピンヘッダ、アクリルケースがセットになっていましたので、ピンヘッダをはんだ付けしてアクリルケースに収めてみました。加工精度が今一つなのか、コネクタ類が干渉してキレイに収めるのにはちょっと苦労しました。また、このままだとボード上のボタン類(BOOT, RESET)が押せなくて不便なので、3Dプリンタで簡単なパーツを作って対処しました(赤いボタンのように見えるもの)。
※後になって、秋月のセットにはボタン用パーツが付属していることに気づきました。

本日は、開発環境のセットアップとLチカを行うところまで手順を書いてみることにします。Longan Nanoには専用のIDEというものはなく、PlatoformIO IDEというものを開発に利用します。これは、Visual Studio Code (VS Code)の拡張機能として組み込むことでIDEとして使用できるようになるもので、Arduinoをはじめとする様々なマイコンボードに対応しているものです。
(1) まずはVS Codeを起動し、拡張機能“PlatformIO IDE”をインストールします。

(2) PlatformIOのアイコンが左端のツールバーに追加されるので、そこをクリックすると“PIO Home”が開きます。左下の“QUICK ACCESS”から“New Terminal”をクリックしてターミナルを開きます。

(3) ターミナルのコマンドラインで次のように入力し、Longan Nanoに対応しているSDKをインストールします。

(4) インストールが終了したら、PIO Homeの“Project Examples”をクリックして開き、“Arduino Blink”を選択して読み込みます。

(5) “platformio.ini”ファイルを開き、[env:gd32vf103v-eval]セクションを削除し[env:sipeed-longan-nano]セクションのみを残すようにします。このArduino用のLチカは様々なプラットフォームに対応しているわけですが、このファイルを編集することによってLongan Nano対応のプロジェクトであることを指定していることになるのだと思います。

(6) Longan NanoはUSBを利用してプログラムを転送します。それに備えて次の内容を追記します。

(7) ステータスバー左のほうにあるチェック☑のマークをクリックするとコンパイルされます(あるいは、[CTRL]+[SHIFT]+[B]を押して、表示されるメニューから“PlatformIO: Build”を選択)。コンパイル済みのバイナリはプロジェクトフォルダ内の“.pio\build\sipeed-longan-nano”に、“firmware.bin”というファイル名で保存されます。

(8) 書き込み用のUSBドライバをインストールするため、Longan Nanoを書き込みモードで起動します。PCのUSBポートにLongan Nanoを接続し、BOOTボタンを押してからRESETボタンを押します。その後RESETボタンを離し、BOOTボタンを離すと書き込みモードで起動します(この時点ではデバイスマネージャではUnknown Deviceとして認識されます)。

(9) PlatformIOから直接書き込むためには、書き込みに必要なWinUSBドライバをインストールします。これを行うにはZadigを用いるのが便利です。こちらからインストーラをダウンロードして実行します。“Unknown Device”が選択されているのを確認し“Install Driver”をクリックすればOKです。書き込むには、VS Codeのステータスバー左のほうにある右向き矢印→のマークをクリックします。この方法を用いる場合には以下の(10)-(12)の手順は不要です。

(10) 専用の書き込みツールを用いる場合には、こちらからダウンロードします。
(11) 書き込み用USBドライバをインストールします。上記ファイルを解凍してできた“GD32 MCU Dfu Drivers_v1.0.1.2316”フォルダ内から(末尾の数字などはバージョンによって異なります)、OSに合わせて(32bit→x86, 64bit→x64)選んでドライバのインストーラを「管理者として実行」します。

(12) 書き込みツールを実行します。“GD32 MCU Dfu Tool_v3.8.1.5784”フォルダ内の“GD32 MCU Dfu Tool”を起動します。書き込むbinファイルを選択してOKボタンをクリックすれば書き込まれます。

(13) Longan NanoのRESETボタンを押すと実行されます。
結構面倒くさく感じるかもしれませんが、上記の操作は最初の1回のみでOKです。その後はArduino言語での開発の場合には(4)~(7)でコンパイルを行ってから、BOOTボタンを押しながらLongan NanoをPCに接続、BOOTボタンを離して(12)→(13)でできると思うので、結構簡単だと思います。なかなかドキュメント類も少なくて苦労することもありますが、1個830円と安価なので、興味のある方は試してみてはいかがでしょうか。

RISC-Vに興味のある方はこちら。
※後になって、秋月のセットにはボタン用パーツが付属していることに気づきました。

本日は、開発環境のセットアップとLチカを行うところまで手順を書いてみることにします。Longan Nanoには専用のIDEというものはなく、PlatoformIO IDEというものを開発に利用します。これは、Visual Studio Code (VS Code)の拡張機能として組み込むことでIDEとして使用できるようになるもので、Arduinoをはじめとする様々なマイコンボードに対応しているものです。
(1) まずはVS Codeを起動し、拡張機能“PlatformIO IDE”をインストールします。

(2) PlatformIOのアイコンが左端のツールバーに追加されるので、そこをクリックすると“PIO Home”が開きます。左下の“QUICK ACCESS”から“New Terminal”をクリックしてターミナルを開きます。

(3) ターミナルのコマンドラインで次のように入力し、Longan Nanoに対応しているSDKをインストールします。
platformio platform install gd32v
platformio platform install https://github.com/sipeed/platform-gd32v

(4) インストールが終了したら、PIO Homeの“Project Examples”をクリックして開き、“Arduino Blink”を選択して読み込みます。

(5) “platformio.ini”ファイルを開き、[env:gd32vf103v-eval]セクションを削除し[env:sipeed-longan-nano]セクションのみを残すようにします。このArduino用のLチカは様々なプラットフォームに対応しているわけですが、このファイルを編集することによってLongan Nano対応のプロジェクトであることを指定していることになるのだと思います。

(6) Longan NanoはUSBを利用してプログラムを転送します。それに備えて次の内容を追記します。
upload_protocol = dfu

(7) ステータスバー左のほうにあるチェック☑のマークをクリックするとコンパイルされます(あるいは、[CTRL]+[SHIFT]+[B]を押して、表示されるメニューから“PlatformIO: Build”を選択)。コンパイル済みのバイナリはプロジェクトフォルダ内の“.pio\build\sipeed-longan-nano”に、“firmware.bin”というファイル名で保存されます。

(8) 書き込み用のUSBドライバをインストールするため、Longan Nanoを書き込みモードで起動します。PCのUSBポートにLongan Nanoを接続し、BOOTボタンを押してからRESETボタンを押します。その後RESETボタンを離し、BOOTボタンを離すと書き込みモードで起動します(この時点ではデバイスマネージャではUnknown Deviceとして認識されます)。

(9) PlatformIOから直接書き込むためには、書き込みに必要なWinUSBドライバをインストールします。これを行うにはZadigを用いるのが便利です。こちらからインストーラをダウンロードして実行します。“Unknown Device”が選択されているのを確認し“Install Driver”をクリックすればOKです。書き込むには、VS Codeのステータスバー左のほうにある右向き矢印→のマークをクリックします。この方法を用いる場合には以下の(10)-(12)の手順は不要です。

(10) 専用の書き込みツールを用いる場合には、こちらからダウンロードします。
(11) 書き込み用USBドライバをインストールします。上記ファイルを解凍してできた“GD32 MCU Dfu Drivers_v1.0.1.2316”フォルダ内から(末尾の数字などはバージョンによって異なります)、OSに合わせて(32bit→x86, 64bit→x64)選んでドライバのインストーラを「管理者として実行」します。

(12) 書き込みツールを実行します。“GD32 MCU Dfu Tool_v3.8.1.5784”フォルダ内の“GD32 MCU Dfu Tool”を起動します。書き込むbinファイルを選択してOKボタンをクリックすれば書き込まれます。

(13) Longan NanoのRESETボタンを押すと実行されます。
結構面倒くさく感じるかもしれませんが、上記の操作は最初の1回のみでOKです。その後はArduino言語での開発の場合には(4)~(7)でコンパイルを行ってから、BOOTボタンを押しながらLongan NanoをPCに接続、BOOTボタンを離して(12)→(13)でできると思うので、結構簡単だと思います。なかなかドキュメント類も少なくて苦労することもありますが、1個830円と安価なので、興味のある方は試してみてはいかがでしょうか。

RISC-Vに興味のある方はこちら。
Xperia 1 SO-03Lを購入しました
メインのスマートフォンをXperia Z3 CompactからXperia XZに変更して2年が経ち、性能に若干不満を感じるようになってきました。特に、ポケモンGOなどの3Dグラフィックスを多用するゲームアプリなとを連続使用していると発熱がひどくなり、動作速度がガタ落ちするのに耐えられなくなってきたのが大きいです。今回はiPhoneやPixelも含めて幅広く検討しましたが、結局Xperia 1(SO-03L)に落ち着きました。このスマートフォンはSoCとしてSnapdragon855を採用し、RAM 6GB, 内部ストレージ 64GBと申し分ないスペックで、ディスプレイは6.5インチ, 4K解像度(1644×3840)のOLEDを搭載しています。焦点の異なるトリプルカメラを搭載し、これまでのXperiaと比べてもカメラ性能に力を入れている感じがします。
今回はオンラインショップにて購入。

外箱はこんな感じで、最近の他のXperiaのものと似ていますね。「1」が強調されたデザイン。

早速箱を開けてみます。

本体のほか、USB-イヤフォンジャックの変換アダプタが付属しています。このアダプタはワンセグ・フルセグTVのアンテナも兼ねています。

今回、SIMカードを新しいものと交換可能だということだったのでしてみました。この水色のSIMは機能的にはピンクのものと変わらないとのこと。

Xperia XZと並べてみました。XZのほうは5.2インチFull HD(1080×1920)なので、ざっと概算するとXperia 1のほうが約1.5倍の解像度を持つという計算になりますが、そのためかXperia 1のほうがアイコンや文字が小さく、引き締まった印象を受けますね。ちなみに見ての通り、横幅はほぼ同じ、単純に縦に長くなったようなサイズです。

裏側。XZがマット仕上げになっているのに対し、Xperia 1は光沢があります。形状も、Xperia 1の方は局面を取り入れたデザインとなっています。

下がwには、スピーカーとUSB Type-C端子があります。

重量はXZの161gに対してXperia 1は178gです。実際の重量の差に比べて持つとずっしり重く感じるのは、やはり縦に長いため重心が上のほうにずれているためなのでしょうか。

しばらく使用していますが、ポケモンGOを含めた処理速度、バッテリの持ち、画面表示品質などを含め、概ね満足しています。アクセサリの紹介や、カメラの撮影例などについてはまた次回以降にでも…。
Dual SIMの並行輸入品もあります。
(右側、技適マークはありません)
今回はオンラインショップにて購入。

外箱はこんな感じで、最近の他のXperiaのものと似ていますね。「1」が強調されたデザイン。

早速箱を開けてみます。

本体のほか、USB-イヤフォンジャックの変換アダプタが付属しています。このアダプタはワンセグ・フルセグTVのアンテナも兼ねています。

今回、SIMカードを新しいものと交換可能だということだったのでしてみました。この水色のSIMは機能的にはピンクのものと変わらないとのこと。

Xperia XZと並べてみました。XZのほうは5.2インチFull HD(1080×1920)なので、ざっと概算するとXperia 1のほうが約1.5倍の解像度を持つという計算になりますが、そのためかXperia 1のほうがアイコンや文字が小さく、引き締まった印象を受けますね。ちなみに見ての通り、横幅はほぼ同じ、単純に縦に長くなったようなサイズです。

裏側。XZがマット仕上げになっているのに対し、Xperia 1は光沢があります。形状も、Xperia 1の方は局面を取り入れたデザインとなっています。

下がwには、スピーカーとUSB Type-C端子があります。

重量はXZの161gに対してXperia 1は178gです。実際の重量の差に比べて持つとずっしり重く感じるのは、やはり縦に長いため重心が上のほうにずれているためなのでしょうか。

しばらく使用していますが、ポケモンGOを含めた処理速度、バッテリの持ち、画面表示品質などを含め、概ね満足しています。アクセサリの紹介や、カメラの撮影例などについてはまた次回以降にでも…。
Dual SIMの並行輸入品もあります。
(右側、技適マークはありません)