フォト
2019年2月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28    
無料ブログはココログ

STM32

2019年2月18日 (月)

入手したボード用 Arduino STM32用ブートローダの作成

AliexpressにてSTM32F103RCT6搭載miniボード(写真の上のボード)を
入手したのですが、Arduino STM32環境で使うためのブートローダが
用意されていないため、ソースからビルドして用意しました。

その時のまとめメモです。

ブートローダの作成はWindows 10環境にて行いました。

Dscn9600


ボードの調査


ボート別にたくさんのブートローダが用意されていますが、基本的な相違は、
  1) ボード上のLEDの制御用ポート番号
  2) 永続モード設定用のボタン用のピート番号

です。この修正版を用意すれば良いわけです。

今回入手したボードは、2つのLEDがPC0、PC1に接続、1つのボタンがPC2に接続しています。

02

ボタンは、押すとLOWになるタイプです。

03

そこで、ブートローダで利用するLEDをPC0、ボタンをPC2として利用することにします。

ブートローダの作成には、下記の情報が大変参考になりました。

ただし、参考にした情報はLinux環境でのビルドのため若干方法が異なります。

参考サイト
   ・Visuariddim - STM32Duino Bootloaderの自前ビルドとか


ブートローダのビルドに必要なものの用意

1)Arduino STM32ブートローダのソースファイル

  STM32duino-bootloader
  https://github.com/rogerclarkmelbourne/STM32duino-bootloader

上記からダウンロードまたは、gitコマンドでcloneを作成します。
ここでは、解凍したフォルダを D:\work\STM32duino-bootloader とします。

2)makeコマンド

  Cygwinのmake.exeを利用しました。
  ※Cygwinのインストール時にmakeパッケージのインストール指定が必要です。   

04

インストールしたCygwin環境のコマンドパスを調べておきます。
ここでは、C:\cygwin64\bin とします。


3)arm-none-eabi-gcc 4.8.x

  Arduino IDEの環境のものを利用しました。   

  arm-none-eabi-gccの絶対パスの調査

05

Arduino IDEの環境設定画面下の赤枠部分のパスをクリックすると、
エクスプローラーが起動します。
そこから、フォルダpackagesに下記のパスがあることを確認します。
\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1\bin\

エクスプローラーのアドレスバーの絶対パスをコピペして、
D:\work\STM32duino-bootloader\ の下に
環境設定用のバッチコマンド makeenv.bat をメモ帳で作成します。

makeコマンドへのパスが通っていない場合、
一緒にmakeコマンドのパスの設定します。

makeenv.bat の中身

PATH=%PATH%;C:\Users\Owner\AppData\Local\Arduino15\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1\bin;C:\cygwin64\bin; 

※ アップデート等により、4.8.x以降のパス名称は異なる可能性があります。

ファイルの修正

新しいボード用のブートローダ作成にために、
D:\work\STM32duino-bootloader\にあるMakefile、config.h を修正します。

追加は面倒なので、既存のgeneric-pg15 用の定義をgeneric-pc0に変更します。

1)Makefileの修正
  メモ帳で開いて、置換機能でpg15 ⇒ pc0、PG15 ⇒ PC0に置換して保存します。

06_2

07

2)config.hの修正

メモ帳でconfig.hを開き、PG15で検索して該当する定義を参照します。

08

次に、下記の修正をします。
ターゲット
  PG15 ⇒ PC0
LED
  GPIOG ⇒ GPIOC
  15 ⇒ 0
Button
  14 ⇒ 2
  1 ⇒ 0

この修正は、LEDがPC0(1でON)、ボタンにPC2(0でON)を割り当てるためです。

09

保存してメモ帳を閉じます。


ブートローダのビルド

コマンドプロンプトを起動し、 D:\work\STM32duino-bootloader  フォルダに移動し、
作成しておいた環境設定バッチコマンドを実行します。

さらに、makeコマンドを実行します。
ターゲットは generic-pc0 を指定します。

> make generic-pc0

12

ビルド処理が実行されて、程なく genenic_boot20_pc0.bin が
D:\work\STM32duino-bootloader\bootloader_only_binaries\ に
作成されます。

13


ボードへのブートローダの書き込み

ST-Linkを使って書き込みを行いました。

Dscn9661

ボードを接続し、STM32 ST-Link Utilityにて、genenic_boot20_pc0.bin を読み込んで
書き込みを行いました。

14

ブートローダの書き込み後は、USB経由でのスケッチ書き込みです。

ボードを永続モード(スケッチ書き込み待ち状態)にて、最初のスケッチを書き込ます。
永続モードの設定は、ユーザーボタンを押したまま、リセットボタンを押します。
LEDが点滅して永続モードの状態を示します。

16

スケッチも問題なく書き込めました。

Dscn9662

スケッチ書き込み後は、COMポートも認識出来ました。

以後、このボードはArduino IDE環境でUSB経由でスケッチが書き込めます。
ブートローダのコンパイルはLinux環境の方が楽ですね。




2019年2月15日 (金)

Arduino STM32のBluePill用ブートローダについて

Arduino STM32のBlue Pill用のブートローダ、
いつの間にか、いくつか修正があるようです。私も把握していませんでした。


Blue Pill用の3種類のブートローダ
1)bootloader_only_binaries/generic_boot20_pc13.bin
2)bootloader_only_binaries/generic_boot20_pc13_fastboot.bin
3)binaries/generic_boot20_pc13.bin

1)は従来のものですが、永続モードの設定ピンがPC14から、
PB2(=BOOT1のピン、ボードの黄色いピンです)に変更されています。

ここで、永続モードとはリセット直後にスケッチ書き込みを待ち続けるモードです。
初回のスケッチ書き込み時に利用します。

2)は、リセット直後0.5秒間のスケッチ書き込み待ちを省略したバージョンのようです。
まだ試していないため、挙動は不明です。

3)は1)にLチカスケッチを結合したバージョンです。
スケッチが結合されているため、永続モードに設定して
最初のスケッチを書き込む作業が省略できます。

永続モードからみで少々考察し、まとめてみました。
もしかしたら正しくないかもしれません。

USB経由でのスケッチ書き込みについて
Arduino STM32では、
Arduino IDEからUSB経由(Upload methodにSTM32duino bootloader指定)での
スケッチの書き込みは、次の手順で行われます。

1)USBシリアルポート経由でBluePillボードをリセットさせる
2)リセット後、ブートローダが0.5秒間書き込み待ちを行い、スケッチを書き込む

02

この手順では、スケッチに組み込まれているUSBシリアル通信ドライバも必要です。
ですので、初回のスケッチ書き込みが重要となります。
スケッチが書き込まれていないと、自動でのスケッチ書き込みが出来ません。

ブートローダだけ書き込んだ際の状態は...
・ブートローダには、USBシリアル通信ドライバは組み込まれていません。
・DFUはリセット直後時のみ有効、パソコンに接続してもデバイス認識されません。
・BluePillをパソコンに接続しても、COMポートへの接続は見えません。
・BluePillにブートローダだけでは、Arduino IDEからはリセットがかけられません。


ですので、初回のスケッチ書き込みは重要です。

初回スケッチ書き込み対策
・書き込みのタイミングで、手動でリセットボタンを押す
・または、永続モードに設定してスケッチの書き込み待ちを行った上で、
  スケッチの書き込みを行い、その後、永続モードの設定を解除する。

Arduino IDEのシリアルポートの設定を行っていない場合や、
ことなるシリアルポートを設定している場合でも、リセットボタンを押す、
永続モードに設定することでスケッチの書き込みを行うことが出来ます。

また、スケッチプログラムが暴走している場合、シリアルポートを経由での
リセットが機能しない場合があります。この場合も、リセットボタンを押す、
永続モードに設定することでスケッチの書き込みを行うことが出来ます。


USB経由の書き込みはトラブルも多いので、
上手くいかない場合は、ST-LINNK経由での書き込みを推奨します。

関連記事
・FASTBOOT option has been added to the maple bootloader

・BluePill bootloader updated to use boot1 as the button

2019年2月 6日 (水)

Arduino Basicを改良してシリアルコンソール対応

Robin Edwards氏が開発し、公開している「Arduino Basic」を
シリアルコンソールで使えるように改良しました(ArduinoArduino STM32対応)。

Dscn9589

オリジナル版
・Arduino Basic

改良版
・Arduino Basic (シリアルコンソール対応版)
  https://github.com/Tamakichi/ArduinoBASIC


Arduino BASICは、Tiny BASICとは異なり、小数、文字列、多次元配列が利用出来ます。
変数名も8文字まで付けられます。かなり本格的なBASIC言語です。

オリジナル版は、OLED画面+PS/2キーボードで利用する形式なのですが、
プログラミング言語としてどれくらい使えるのかを評価するため、
プログラミング効率向上のために、シリアルコンソール利用に変更しました。

こんな感じで、TermTerm等で利用出来ます。

01

簡単なスクリーン制御(CLS、POSITIONコマンド、BSキーで文字削除)にも対応しました。
ただし、オリジナル版と同様にスクリーンエディタは未対応です。

02

改良点
  ・画面表示をOLEDからシリアルコンソールに変更
  ・PS/2キーボード利用は廃止(シリアルコンソールから入力)
  ・コマンド実行後、OKプロンプトを表示するように変更
  ・Arduino STM32 (Blue Pill対応) 、ただしLOAD、SAVE、TONEピンは未対応
  ・プログラムソースに日本語コメント追加、ソースの整形
  ・ファイル名arduino_BASIC.ino をarduinoBASIC.ino に変更
  ・プログラムの中断は[ESC]キーまたは、[CTRLC]で行う。

今後の改良を考えて、コメントに日本語訳、説明追記を行いました。

03

Blue Pillボード(STM32F103C8T6)でも、I/Oピンを使ったデジタル入出力が可能です。

Lチカプログラム

10 pc13=32
20 PINMODE pc13,1
30 PIN pc13,1
40 PAUSE 500
50 PIN pc13,0
60 PAUSE 500
70 GOTO 30

スクリーンエディタ対応は、やってみようと思います。
利用出来るコマンドについては、配布ページのドキュメントに記載しています。

追記

プログラムソースを読んでいると、このArduino BASIC
変数の管理方式があまり良くないです。
中間コード方式を採用しているのに、変数名はコード化せず、
そのまま文字列で管理しています。

マズい処理方式
・実行時に、変数テーブルに変数を変数名(文字列)で登録
・変数参照の都度、変数テーブルを単純文字列検索でなめて該当変数にアクセスする

この作りだと、変数を多用すると指数的(実際は2乗)に実行速度が落ちると思われます。
行入力時の中間コード化の時点で、変数テーブルへの登録を行い、
変数はコード化して、中間コード化したプログラムに埋め込み等の修正が必要です。

本格的に改造して利用しようと思ったのですが、
ちょっとテンション(モチベーション)下落、ちょっと微妙になってきました。

追記 2019/02/08

別途、Arduino STM32対応版をおこしました。

・Arduino Basic シリアルコンソール対応(Arduino STM32専用)
https://github.com/Tamakichi/ArduinoBASIC_STM32

変更点
  ・プログラム領域を4096バイトに増量
  ・フルスクリーンエディタ対応(全角文字 シフトJISも利用可能)
  ・LOAD [n] 、SAVE [n] でロード、セーブ対応(nは0~ 5)

コンパイルにはArduino STM32が必要です。
Blue Pillボード(STM32F103C8T6)、フラシュメモリ128kバイト利用です。




2018年12月13日 (木)

豊四季Tiny BASIC for Arduino STM32 をV0.87に更新しました

豊四季Tiny BASIC for Arduino STM32 をV0.87に更新しました。

公開サイト
・豊四季タイニーBASIC for Arduino STM32V0.87β
  https://github.com/Tamakichi/ttbasic_arduino_stm32

  テストが不十分でβ版です^^;

マニュアルの作成がまだまだ進まないのですが、とりあえすコマンドリファレンスを
V0.87対応に更新しました。

・「豊四季タイニーBASIC for Arduino STM32」 コマンドリファレンス(更新中)

V0.87の主な追加機能


・漢字フォント利用の対応(SDカード上のシフトJISコードフォントファイルを利用)
   - KANJI コマンドによる全角文字列の描画が出来る
   - SETKANJI コマンドで全角文字描画時のフォントサイス等の設定が出来る
   - KFONT コマンドによる、漢字フォントデータの取得が出来る

・内部フラッシュメモリのプログラム保存領域の直接書き換え対応
   - 仮想化ドレスPRG2 の追加
   - BANK コマンドの追加
   - FWRITE コマンドの追加、
   - BLOAD コマンドの機能強化でバイナリファイルに直接書き込みに対応

   この機能は少々危険ですが、プログラム保存領域4096バイト x 6本の領域を
   有効利用するために、データを配置して利用出来たら.. と思い追加しました。
   
   SDカード上のバイナリーファイルをBLOADコマンドでフラッシュメモリに
   読み込んだり出来ちゃいます。
   ファイルからちょっとした画像や文書データを読み込んで配置出来ます。

・バイナリファイル操作の機能強化
   - BLOADBSAVE コマンドで、ファイル内読み書き位置を指定可能にしました

   ちょっとしたレコードファイルの構造を実現できると思います。

・文字列比較関数の追加
   - STRCMP 関数を追加しました

・グラフィック描画関連のコマンド追加
   - GCOLOR GCLS コマンドの追加

・その他
   いくつかの不具合対応を行いました


ここで、あらためて補足ですが、
豊四季Tiny BASICのオリジナル版開発は私ではなく、鈴木氏です。
私は、オリジナル版をSTM32対応し、機能拡張しているのみです。
オリジナル版  https://github.com/vintagechips/ttbasic_arduino


今後の予定としては、機能追加はこのあたり迄として、
ドキュメントの充実、BASICプログラムの作成、基板作成を行っていこうと思っています。

2018年12月 7日 (金)

豊四季Tiny BASIC for Arduino STM32で日本語フォント利用対応中(4)

豊四季Tiny BASIC for Arduino STM32の日本語フォント対応版、
ちびちびとドキュメント類を作成しています。
ドキュメント作成は、モチベ―ジョンが下がり、なかなか作業が進みません。

今回は、リファレンスマニュアルよりも先に「早見表」(クイックリファレンス)を
先に作成しました。PDF化して添付を予定しています。

Dscn9093

パウチして、傍らにおいて参照する感じでの利用を想定しています。

Dscn9091

コマンド、編集キー、ボードピン配置、ピン用途一覧、結線図の
7ページにまとめています。

01

コマンド一覧を1枚に収めるのにちょっと苦労しました。

02

ピン割り付けと、起動時のコンソール選択の設定関連のシート

03

英語版も作成したいところですが、とりえずは後回しです。

追記

このドキュメントをブランチの方に追加しました。
ttbasic_arduino_stm32/TinyBASIC早見表.pdf

2018/12/08 修正

マスターブランチにマージしました。
早見表は下記のリンクからの参照となります。
ttbasic_arduino_stm32/TinyBASIC早見表.pdf

キーワード一覧(簡易コマンドリファレンス) キーワード.html追加しました。

04


2018年11月30日 (金)

豊四季Tiny BASIC for Arduino STM32で日本語フォント利用対応中(3)

豊四季Tiny BASIC for Arduino STM32の日本語フォント乗せ対応、
追加したい機能の実装はほぼ完了し、マニュアル作成と動作確認中です。
文字列比較関数等も追加しました。

動作の様子


NTSC版で全角フォントを表示するデモです。
全角フォントは8、10、12、14、16、20、24ドットの7種類が利用出来ます。
また、倍角、四倍角等の拡大表示も可能です。

デモのプログラムソース

10 CONSOLE 0
20 GCLS
30 SETKANJI 20,1,0,0
40 KANJI 10,0,"こんにちは、埼玉!"
50 SETKANJI 10,1,2,1
60 KANJI 10,30,"7種類の漢字フォントを使って、"
70 KANJI 10,42,"全角表示が出来るようになりました。"
80 SETKANJI 24,2,2,2
90 KANJI 0,60,"豊四季"
100 SETKANJI 20,2,0,0
110 KANJI 0,106,"Tiny BASIC"
120 SETKANJI 16,1,0,0
130 KANJI 0,150,"for Arduino STM32"
140 SETKANJI 24,2,0,0
150 KANJI 90,170,"V0.87"
160 WAIT 2000
170 FOR I=1 TO GW
180 GSCROLL 0,0,GW-1,GH-1,LEFT
190 WAIT 10
200 NEXT I
210 WAIT 2000
220 GOTO 20

マニュアル作成とテストにちょっと手こずっています。

現時点のバージョンは、GitHubのブランチからダウンロード可能です。
(このブランチは随時更新しています)
https://github.com/Tamakichi/ttbasic_arduino_stm32/tree/add_SDSfonts

   2018/12/08 修正 マスターブランチにマージしました(上記ブランチは削除します)。
                     => https://github.com/Tamakichi/ttbasic_arduino_stm32

ただし、ファームウェア・マニュアル等は旧版のままです。
ソースからコンパイルする必要があります。

フォント利用には、解凍したfontbinの下にあるSFONT.BINをSDカードに入れる必要があります。

描画速度をもう少し何とかしたいです。
漢字フォントをSPI接続のフラッシュメモリに配置すれば高速化出来るのですが、
フラッシュメモリの入手と書き込みがちょっと面倒なので悩みどころです。

また、BASICプログラムのソースが英字大文字だと可読性が悪いので、
GOTO => GoTo
WAIT => Wait
SETKANJI => SetKanji
IF => If
FOR I=0 TO 10 STEP  2:NEXT I => For I=0 To 10 Step 2: Next I
のように大文字小文字を混ぜる感じにしようかと検討中です。

2018年11月20日 (火)

RobotDyn STM32 Miniボード(Blue Pill互換)でJPEG画像表示

RobotDyn STM32 Miniボード(Blue Pill互換)でJPEG画像の表示をやってみました。
(BluePillより面積が狭いので、ブレッドボードで多線が出来ます)

グラフィック液晶モジュール は、
ILI9341搭載(SPI接続)+ SDカードスロット付きのものを利用しました。

Dscn9014

グラフィック液晶モジュールのスロットに刺したSDカードに
320x240ドット JPEG形式のフルカラー画像を配置し、それを表示しています。
開発環境はArduino STM32を利用しています。

JPEG表示は、Arduino UNOではSRAMの容量的に無理(バッファに2kバイト必要)ですが、

Blue Pillでは比較的簡単に表示出来ました。

動いている様子

これくらいの、速度で表示出来ればOKでしょう。

構成

03
※クリックすると拡大表示します

結線表
04
利用したテスト画像(test1.jpg)

Test1


スケッチは下記のサイトのESP8266用のJPEG画像表示スケッチを
参考にしました。

参考にしたサイト
・楽しくやろう。 ESP8266でJPEG画像をTFT LCDに表示する
   https://blog.boochow.com/article/427690966.html


利用ライブラリ

・JPEGデコーダーライブラリ
   MakotoKurauchi/JPEGDecoder
 https://github.com/MakotoKurauchi/JPEGDecoder
 
   ※fdfat対応にJPEGDecoder.cppの一部を修正しています。

   修正
    ・
#include <SD.h> を #include <SdFat.h> に変更
   
・ その下に
       extern SdFat SD;
      を追加

スケッチ
(こちらからも参照出来ます Tamakichi/stm32_jpeg_tft.ino)

//
// Arduino STM32 TFT(ILI9341) SPI接続 jpeg画像表示サンプル
//
// 参考にしたサイト
//  元にしたスケッチ
//  ・楽しくやろう。 ESP8266でJPEG画像をTFT LCDに表示する
//    https://blog.boochow.com/article/427690966.html
//  ライブラリ
//  ・MakotoKurauchi/JPEGDecoder
//    https://github.com/MakotoKurauchi/JPEGDecoder
//  Jpegに関する情報
//  ・JPEG/MCU
//    https://monobook.org/wiki/JPEG/MCU
//

#include <SPI.h>
#include <Adafruit_GFX_AS.h>
#include <Adafruit_ILI9341_STM.h>
#include <SdFat.h>
#include <JPEGDecoder.h>

// SDカード(SPI2利用)
#if ENABLE_EXTENDED_TRANSFER_CLASS == 1
  SdFatEX  SD(2);
#else
  SdFat  SD(2);  
#endif

#define SPI_SPEED SD_SCK_MHZ(36) // バスクロック
#define SD_CS PB0                // SDカード選択

// TFT制御用ピン (SPI1利用)
#define TFT_CS  PA0
#define TFT_RST PA1
#define TFT_DC  PA2

// TFT制御用オブジェクト
Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  Serial.begin(115200);
  delay(200);
  
  if (!SD.begin(SD_CS,SPI_SPEED)) {
    Serial.println("failed!");
  }
 
  tft.begin();
  tft.setRotation(3);
  tft.fillScreen(ILI9341_BLUE);
  Serial.println("OK!");

  jpegDraw("/test1.jpg"); // 320x240ドットフルカラー画像の表示
}

void jpegDraw(char* filename) {
 char str[100];
 uint8_t *pImg;
 int x,y,bx,by;
 
 // Decoding start
 JpegDec.decode(filename,0);
 uint16_t buf[JpegDec.MCUWidth*JpegDec.MCUHeight];
 uint16_t pos = 0;

 // Image Information
 Serial.print("Width     :");
 Serial.println(JpegDec.width);
 Serial.print("Height    :");
 Serial.println(JpegDec.height);
 Serial.print("Components:");
 Serial.println(JpegDec.comps);
 Serial.print("MCU / row :");
 Serial.println(JpegDec.MCUSPerRow);
 Serial.print("MCU / col :");
 Serial.println(JpegDec.MCUSPerCol);
 Serial.print("Scan type :");
 Serial.println(JpegDec.scanType);
 Serial.print("MCU width :");
 Serial.println(JpegDec.MCUWidth);
 Serial.print("MCU height:");
 Serial.println(JpegDec.MCUHeight);
 Serial.println("");
 
 sprintf(str,"#SIZE,%d,%d",JpegDec.width,JpegDec.height);
 Serial.println(str);

  // Raw Image Data
  while( JpegDec.read() ){    // MCU毎の描画処理
    pImg = JpegDec.pImage ;   // MCUブロックの先頭アドレス
    pos = 0;                   // バッファ位置初期化
    
    // MCUブロック描画ウィンドウの設定
    tft.setAddrWindow(JpegDec.MCUx * JpegDec.MCUWidth,
                      JpegDec.MCUy * JpegDec.MCUHeight,
                      JpegDec.MCUx * JpegDec.MCUWidth+JpegDec.MCUWidth-1,
                      JpegDec.MCUy * JpegDec.MCUHeight+JpegDec.MCUHeight-1);
 
    // ウィンドウ領域へのデータ転送
    for( by = 0; by < JpegDec.MCUHeight; by++)
      for( bx = 0; bx < JpegDec.MCUWidth; bx++, pImg += JpegDec.comps, pos++)
        buf[pos] = (JpegDec.comps == 1) ? 
         tft.color565(pImg[0], pImg[0], pImg[0]) : tft.color565(pImg[0], pImg[1], pImg[2]);
    tft.pushColors(buf, JpegDec.MCUWidth*JpegDec.MCUHeight, 0); 
  }
}
   
void loop() {
}

スケッチは高速化優先で、MCU内の端数画像には考慮していません。

SDカード利用のためのライブラリは、SdFatを利用しています。
SDカードアクセスのパフォーマンス改善のために、SdFatConfig.hの設定を修正しています。

変更
#define ENABLE_EXTENDED_TRANSFER_CLASS 1

2018年11月15日 (木)

豊四季Tiny BASIC for Arduino STM32で日本語フォント利用対応中(2)

前回からの修正、全角文字列を表示できるコマンドを追加しました。

表示している様子

01

プログラム

02

10 'OLED日本語表示デモ
20 @(0)=8,10,12,14,16,20,24
30 S="吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。"
40 L=LEN(S)
50 FOR J=0 TO 6
60 SETKANJI @(J):CLS 1:KANJI 0,0,STR$(S):WAIT 500
70 NEXT J
80 GOTO 50

KANJIコマンドで指定した座標に文字列を描画します。
  KANJI x,y,"文字列"
  KANJI x,y,STR$(文字列を格納した変数)

SETKANJIコマンドは、フォントサイズ等の設定を行います。

これで、簡単に全角文字列を描画出来るようになりました。
前回と同じことやってますが、プログラムがかなり短く出来ます。

OLED版では、CONSOLEコマンドにてプログラム編集画面をシリアルターミナルに
切り替えることが出来ます。
この場合でも、OLEDディスプレイへのグラフィック描画を行うことが出来ます。

2018年11月 7日 (水)

豊四季Tiny BASIC for Arduino STM32で日本語フォント利用対応中

先日作成した「Arduino用SJIS漢字フォントライブラリ SDカード版」を
豊四季Tiny BASIC for Arduino STM32に組み込んで日本語表示対応を試みています。

(現時点の修正案は下記のリンク先にまとめています。
  ttbasic_arduino_stm32のプロジェクトのissues#58にまとめています^^)

日本語表示が出来れば、簡単なアドベンチャーゲームが作成出来ると思います。


日本語表示表示の雰囲気は次のような感じです。

OLED版の表示デモ


プログラムソース

10 'OLED日本語表示デモ
20 @(0)=8,10,12,14,16,20,24
30 S="吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。"
40 L=LEN(S)
50 FOR J=0 TO 6
60 Z=@(J):X0=0:X=X0:Y=0
70 CLS 1
80 FOR I=1 TO L
90 R=KFONT(MEM,ASC(S,I),Z)
100 BITMAP X,Y,MEM,0,Z,Z,1
110 IF (X+Z*2+1)>(GW-1) X=0:Y=Y+Z ELSE X=X+Z+1
120 IF Y+Z>GH-1 I=L
130 NEXT I
140 WAIT 500
150 NEXT J
160 GOTO 160

プログラムはKFONT関数で1文字ずつフォントデータを取得して表示しています。
フォントをSDカードから逐次参照して表示しているため、表示は遅いです。

表示専用のKANJIコマンドを追加予定です。
これを使えばもう少しプログラムが短くなり、表示も早くなると思います。

OLEDの他に、NTSC画面、TFT画面にも表示出来ます。


NTSCビデオ出力画面での表示デモ

プログラムソース

5 CONSOLE 0
10 CLS
20 S="日本語表示にほんご"
30 L=LEN(S):X0=0:X=X0:Y=30:@(0)=8,10,12,14,16,20,24
35 FOR J=0 TO 6
40 FOR I=1 TO L
50 R=KFONT(MEM,ASC(S,I),@(J))
60 BITMAP X,Y,MEM,0,@(J)/R,@(J),1
70 X=X+@(J)/R+0
80 NEXT I
90 X=X0:Y=Y+@(J)+10
100 NEXT J
110 GOTO 110

プログラムの日本語入力は、NTSC、OLED、TFT画面では入力出来ないため、
シリアル接続したTeraTermにて行います。

01


TFT版ではカラー表示に対応しています。

Dscn8965

2018年10月30日 (火)

Arduino用SJIS漢字フォントライブラリ SDカード版を作成しました

以前作成した Arduino用のUTF-8版の漢字フォントライブラリ SDカード版をベースにして
シフトJIS版の漢字フォントライブラリ SDカード版を作成しました。

指定したシフトJISコードに対応する漢字フォントデータを取得するAPIを提供します。
漢字フォントは8、10、12、14、16、20、24ドットのサイズの利用が可能です。
フォントデータはSDカード上に配置して利用します。

公開ページ
・Arduino用SJIS漢字フォントライブラリ SDカード版
  https://github.com/Tamakichi/Arduino-SJISKanjiFont-Library-SD

ライブラリの利用にはSDカードが必要となります。

02_2

02

ライブラリに添付しているサンプルプログラム

// SJIS版フォントライブラリ利用サンプル
// 作成 2018/10/27  by Tamakichi
//

#include "SDSfonts.h"

// ビットパターン表示
// d: 8ビットパターンデータ
//
void bitdisp(uint8_t d) {
  for (uint8_t i=0; i<8;i++) {
    if (d & 0x80>>i) 
      Serial.print("#");
    else
      Serial.print(".");
  }
}

//
// フォントデータの表示
// buf(in) : フォント格納アドレス
//
void fontdisp2(uint8_t* buf) {
  uint8_t bn= SDSfonts.getRowLength();                // 1行当たりのバイト数取得
  Serial.print(SDSfonts.getWidth(),DEC);             // フォントの幅の取得
  Serial.print("x");      
  Serial.print(SDSfonts.getHeight(),DEC);            // フォントの高さの取得
  Serial.print(" ");      
  Serial.println((uint16_t)SDSfonts.getCode(), HEX); // 直前し処理したフォントのコード表示

  for (uint8_t i = 0; i < SDSfonts.getLength(); i += bn ) {
      for (uint8_t j = 0; j < bn; j++) {
        bitdisp(buf[i+j]);
      }
      Serial.println("");
  }
  Serial.println("");
} 

//
// 指定した文字列を指定したサイズで表示する
// pSJIS(in) SJIS文字列
// sz(in)    フォントサイズ(8,10,12,14,16,20,24)
//
void fontDump(char* pSJIS, uint8_t sz) {
  uint8_t buf[MAXFONTLEN]; // フォントデータ格納アドレス(最大24x24/8 = 72バイト)

  SDSfonts.open();                                   // フォントのオープン
  SDSfonts.setFontSize(sz);                          // フォントサイズの設定
  while ( pSJIS = SDSfonts.getFontData(buf, pSJIS) ) // フォントの取得
    fontdisp2(buf);                                 // フォントパターンの表示
  SDSfonts.close();                                  // フォントのクローズ
}

void setup() {
  Serial.begin(115200);                   // シリアル通信の初期化
  SDSfonts.init(10);                        // フォント管理の初期化
  Serial.println(F("sdfonts liblary"));
  char str[] = {0x7a,0x7b,0x7c,0x7d,0x7e,0xa2,0xb1,0xb2,0xb3,0};// z{|}~「アイウ
  fontDump(str,14);
  fontDump("\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8",16);//あいうえお
  fontDump("\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8",20);//あいうえお
  fontDump("\x8d\xe9\x8B\xCA\x81\x99\x82\xB3\x82\xA2\x82\xBD\x82\xDC", 24); // 埼玉☆さいたま
}

void loop() {
}

実行結果

01


このライブラリは豊四季Tiny BASIC for Arduino STM32に組み込むために作成しました。
TFT、NTSC、OLED画面に日本語文字列を表示したいと思っています。
BASICにてアドベンチャーゲーム的なものが作れないかなぁっと。

Arduino IDEでは、文字列にUTF-8を利用しているため、
このシフトJIS版でのフォントデータの扱いはちょっと面倒です。
通常は、UTF-8版を使った方が良いでしょう。

より以前の記事一覧