JJ1WKN Log

自作や移動運用関連のログです。

Sipeed Longan Nano のテスト その6

2019-12-19 | その他
その6です。

16ドット東雲フォントを表示してみましたが、気に入ったものがありませんでした。
他のフリーフォントを試してみればいいのかもしれませんが、とりあえず周波数表示用に太字で見やすいフォントが欲しいので、7セグフォントでデザインしてみました。

数字だけなので横8ドットに収まりそうです。8ドットフォントにしてもいいのですが、直線だけの単純なフォントなので、一筆書きで端点をつないで描画することにしました。
線幅が2ドットなので、0~9まで一筆で描くことができました。
黄緑色の数字上の1~dが描く順番です。


下のようにフォントの端点を並べたフォントデータの配列(char font[])と、端点の数は数字によって異なるので、各数字の開始位置を示す配列(int pos[])で構成されます。
例えば、0の開始座標は(1,1)なので、1バイトにパックして0x11、次の端点は(6,1)なので0x61です。
--------------------------------
char font[] = { // C Pos
0x11,0x61,0x6e,0x1e,0x12,0x52,0x5d,0x2d,0x23, // 0 0
0x51,0x61,0x6e,0x5e,0x52, // 1 9
・・・
};
int pos[] = {
// 0 1 2 3 4 5 6 7 8 9
0, 9, 14, 26, 38, 48, 60, 74, 80, 93, 104
};
--------------------------------
以前5x7ドットと10x14ドットを同様の方式で作ったことがあるので、これを流用してもいいのですが、今回は数字だけなのと、LCD.Cでサポートされたフォントとの兼ね合いもあり、で新たにフォントデータを作りました。

表示してみました。
現状は2ドットの線幅で横8ドットですが、もう少し太らして横12ドットくらいがいいのかもしれません。


<追記>

横12ドットフォントのデザインをしてみましたが、一部の線幅を3ドットにしたところ、うまく一筆書きができませんでした。
そこで発想を変えて、例えば0では中心も含めて横11ドット縦14ドットを黒く塗りつぶして、中心の四角を白色で塗りつぶすことにしました。
白抜きにするためのデータは1~2個なので多くても2バイトに収まります。
2と3の例を下に示しましたが、最初に0-0の四角を黒く塗りつぶし、1-1と2-2の四角を白く塗りつぶします。
フォントに必要なデータ量をかなり削減できましたが、こういう芸当ができるのも単純な7セグフォントの利点です。


表示してみました。
中央の横線のみ2ドットですが、とりあえずこのフォントを使用しようと思います。
全体的なレイアウトをして余裕があれば縦17ドットに変更します。
線幅は全部2ドットにする方がスッキリするかもしれませんね。


この後は3桁ごとに少数点を半角で表示して9桁の数値を表示できるようにします。

<追記>

結局、線幅2ドットに統一しました。


フォントデータです。だいぶデータ量を削減できました。赤色がアクティブなVFOのつもりです。
--------------------------------
char font[] = {     // C Pos
 0x33,0x9c,      // 0 0
 0x11,0x5e,0x81,0xbe, // 1 2
 0x13,0x96,0x39,0xbc, // 2 6
・・・
};
int pos[] = {
 0,2,6,10,14,18,22,26,28,32,36
};
--------------------------------

<追記>

無線機パネルの画面レイアウトをしてみました。
表示内容は、VFO A/Bの周波数、Sメータ、周波数ステップ、送受信(Rx/Tx)、RIT周波数、モード(USBなど)です。
せっかくのカラーLCDなので色を付けてみました。



Sipeed Longan Nano のテスト その5

2019-12-17 | その他
その5です。

16ドットの東雲フォントは8種類ありますが、実際に表示してどのフォントを使用するか決めたいと思います。
フォントごとに配列を作成し、各フォントを表示できるようにしました。

----------------------------------
u8 Font01[] = {
// cshnmk16.bdf
// 0123456789
// STARTCHAR 2330 824f 0
0x00,0x00,0x03,0xc0,0x04,0x20,0x08,0x10,0x08,0x10,0x10,0x08,0x10,0x08,0x10,0x08,
0x10,0x08,0x10,0x08,0x10,0x08,0x08,0x10,0x08,0x10,0x04,0x20,0x03,0xc0,0x00,0x00,
・・・・
// STARTCHAR 2339 8258 9
0x00,0x00,0x03,0xc0,0x04,0x20,0x08,0x10,0x10,0x08,0x10,0x08,0x10,0x08,0x08,0x18,
0x04,0x28,0x03,0xc8,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0xc0,0x07,0x00,0x00,0x00,
};

u8 Font02[] = {
// cshnmk16b.bdf
・・・・
};
・・・・

----------------------------------
表示してみました。




Sipeed Longan Nano のテスト その4

2019-12-14 | その他
その4です。

シリアル出力とLCDへの表示ができるようになったので、I2CとADCのテストをしてみました。

Longan Nanoにはファームウェアライブラリが用意されており、サンプルもあるのですが、色々なケースのサンプルがあり、どれが基本的な例なのか良くわかりません。
作例を調べてみまいたが、ファームウェアライブラリの使用例は見つかりませんでした。

ファームウェアライブラリではありませんが、独自にライブラリを開発された方のブログを見つけたので、「なんとなく活動記録。」さんのライブラリを使用させて頂きました。
こちらのページからI2Cを、こちらのページからADCのライブラリを使用しました。

I2Cのテスト写真です。
I2Cの使用例は、マスタとして、スレーブへコマンドを送信するケースがほとんどですが、今回はSi5351aに周波数を設定することにしました。
Si5351aの設定はuBITXのライブラリを使用しました。
Si5351aのスレーブアドレスは0x60の7ビットなのですが、引き続くR/Wビットを含めて0xc0で指定しないと動作しませんでした。


ADCのテスト写真です。

Gndに接続したとき

3v3に接続したとき

AD変換は12ビットなので0~4095のハズなのですが、誤差にしては大きすぎます。
リファレンスは電源電圧と同じと思い込んでいる状態なので、何かの設定が必要なのかもしれません。




Sipeed Longan Nano のテスト その3

2019-12-05 | その他
その3です。

任意の漢字の表示ができるようにしました。

フリーの漢字フォントを探したところ、東雲フォントが見つかりました。
16ドットフォントもあり、LCDライブラリがそのまま使えそうです。
東雲フォントはBDF形式のビットマップフォントで下の例はJISコード=2121で、BITMAP以降の16行が16進数で表示したフォントデータです。
1行目が16x16ドットの一番上の1ドット行(0,0)-(15,0)に相当します。2行目は(0,1)-(15,1)。
LCDやプリンタ用のフォントデータは縦8ドットで1バイトの形式が多いのですが、汎用のフォントデータなので素直な並びです。

STARTCHAR 2121
ENCODING 8481
SWIDTH 960 0
DWIDTH 16 0
BBX 16 16 0 -2
BITMAP
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
ENDCHAR

試しにLCDライブラリ中のoledfont.hの漢字の1文字を置き換えてみたところ、鏡文字で表示されたので、ビットの並びが左右逆なようです。
フォントデータのビット列を反転させてもいいのですが、LCD_ShowChines()の1<<iを128>>iに変更して逆にスキャンするようにしました。(><は小文字)

フォントファイルの形式が判明したので、bdf形式ファイルからJISコードの行とビットマップ部分を抜き出して、コメントと16進数での配列定義に変換してファルへ出力しました。
上の2121は下のようになります。

// STARTCHAR 2121
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

変換プログラムは勉強を兼ねてrubyで開発しました。

これで表示したい漢字のJISコードが分かればこのファイルを検索してコピペすればOKですが、単純作業となるので、SJISで記述された文字列からSJISコードに変換、さらにJISコードに変換してこのファイルを検索して必要な部分を抽出して出力するようにしました。
STARTCHAR、JISコード、SJISコード、SJIS文字の順です。
漢字コードが混在しているので、厄介でした。

// JJ1WKN
// STARTCHAR 234a 8269 J
0x00,0x00,0x00,0x70,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,
0x00,0x20,0x00,0x20,0x00,0x20,0x08,0x20,0x04,0x40,0x03,0x80,0x00,0x00,0x00,0x00,
// STARTCHAR 234a 8269 J
0x00,0x00,0x00,0x70,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,
0x00,0x20,0x00,0x20,0x00,0x20,0x08,0x20,0x04,0x40,0x03,0x80,0x00,0x00,0x00,0x00,
// STARTCHAR 2331 8250 1
0x00,0x00,0x00,0x80,0x00,0x80,0x01,0x80,0x02,0x80,0x00,0x80,0x00,0x80,0x00,0x80,
0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x01,0xc0,0x00,0x00,

検索したところ、外部ROMやSDカードに全部の漢字フォントを入れる例がありましたが、テキストビューワーを作る訳ではないので、電光掲示板や画面の一部ならソースに記述する方式で十分です。
LonganNanoにはSDカードが付いているのでそのうち試してみようと思います。

最後に「中景…」の代わりに「JJ1WKN」を表示させた例です。