フォト
2017年9月
          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 29 30
無料ブログはココログ

STM32

2017年9月20日 (水)

グラフィック描画まわりの実装に苦戦

ここ数日、手がけている豊四季Tiny BASIC for ArduinoのOLED(SSD1309)利用
グラフィックスクロール処理の実装ではまっていました。

画面の向き(縦横の変更)を変えることが出来て、各画面の向きに応じて
画面の任意矩形領域の上下左右1ドット単位スクロールを行うというコマンドの実装です。

いきなりコーディングしていたのですが、上手く動かず。
それで、机上で図やなりやらを書いて、変換式を求めて再度実装すると
期待通りの動きが出来ました。

やはり、コーディング => 実行 => 修正の繰り返しの試行錯誤で「何となく動いた」ではなく
ちぇんとロジックと方式を検討してからコードを書かないとだめですね。効率的にも..

Dscn7032

具体的な数値の変換例から、抽象的な数式を求めて一般化しました。

とりあえず、GSCROLLコマンドが実装出来ました。


デモ動画では全画面スクロールですが、画面上の任意の矩形領域のスクロールも可能です。
あまり用途の無いコマンドですが、まあいいでしょう^^

OLEDだと、スクロールしても残像もなくっ切り表示ですね。
手持ちのモノラルグラフィック液晶はもう、使いたくなくなります。


動画の動作確認のプログラムはつぎのような感じです。

10 'GSCROLL TEST
20 FOR R=0 TO 3
30 SCREEN 1,R
40 FOR D=0 TO 3
50 GOSUB "@DISP"
60 FOR I=1 TO 8
70 GSCROLL 0,0,GW-1,GH-1,D
80 WAIT 200
90 NEXT I
100 NEXT D
110 NEXT R
120 SCREEN 1
130 END
140 "@DISP"
150 CLS:GPRINT 10,10,"GSCROLL"
160 GPRINT 0,0,"A"
170 GPRINT GW-7,0,"B"
180 GPRINT 0,GH-9,"C"
190 GPRINT GW-7,GH-9,"D"
200 RETURN

2017年9月15日 (金)

豊四季 Tiny BASIC でOLEDとグラフィック液晶の対応

現在取り組んでいる豊四季 Tiny BASIC for Arduino STM32、
OLEDディスプレイとグラフィック液晶対応を行っています。

そこそこ、動作するようになってきました。

Dscn7017

OLED (SH1106コントローラ I2C接続)ディスプレイ利用のデモ

TFTグラフィック液晶(ILI9341コントローラ SPI接続)パネル利用のデモ


表示系は、NTSC、ターミナルコンソール、グラフィック液晶、OLEDと複数対応するために
プログラム的には基本クラスを設けて、派生する形で各表示器対応の実装をしています。

ただし、クラス設計が今一だったため、実装が進むにつれて、
非常に分かりにくいプログラムになってしまいました。

思うがままに、機能追加していった割には、良く動いているなぁ



2017年9月12日 (火)

SH1106コントローラ使用OLED用ライブラリの作成

以前購入した 次の1.3インチのOLEDモジュール(I2C版とSPI版)、

I2Cインタフェース版
1.3" OLED module white color 128X64 1.3 inch OLED Display Module 1.3" I2C Communicate

02

SPIインタフェース版
1.3" OLED module white color 128X64 1.3 inch OLED Display Module 1.3"  SPI Communicate
03

SH1106というコントローラーが乗っているのですが、Arduino STM32用のライブラリがありません。
そこで、公開されている次のAdafruitベースのライブラリを参考にして作成しました。
(正確には移植ですね^^)

https://github.com/wonho-maker/Adafruit_SH1106
ttps://github.com/rogerclarkmelbourne/Arduino_STM32/tree/master/STM32F1/libraries/Adafruit_SSD1306


SH1106というコントローラーはほぼSSD1306コマンド等はにており、
wonho-makerさんが作成公開しているArduino用のSH1106利用ライブラリの参考にして
Arduino STM32版 SSD1306利用ライブラリを修正しました。
(wonho-makerさんに感謝!)

SSD1306ではSPIのクロック速度が10MHzくらいまでしか出せなかったのですが、
SH1106ではBlue Pillボードで出せる最高速度の36MHzでも動作しました。

作成したライブラリは下記にて公開しました。
https://github.com/Tamakichi/Adafruit_SH1106_STM32


サンプルスケッチを動かした様子
左がSPI版、右がI2C版です。

01

SSD1306とほぼ同じ動作ですが、スクロール機能は未対応です。

2017年8月22日 (火)

ブートローダーに任意のスケッチを結合する

Arduino STM32環境利用メモです。

ブートローダーに任意のコンパイル済スケッチのイメージを結合する手順

・利用ツール: mergesketch.exe
https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/sketch_combiner/bin_merge_tool

・使い方
mergesketch ブートローダイメージファイル スケッチイメージファイル 出力ファイル名
例: mergesketch.exe generic_boot20_pc13.bin ttbasic.bin boot_ttbasic.bin
      Opened bootloader file generic_boot20_pc13.bin : size is 7188

      Opened sketch file ttbasic.bin : size is 82092
      Allocated 90284 bytes for buffer
      Wrote combined file to boot_ttbasic.bin

・作成したブートローダ付きスケッチイメージの書込み(stm32flash利用の場合)
  - Blue Pillボードのboo0を1:boot1を0に設定しリセットしてDFUモード起動する
  - USB-Serialモジュール接続 PB9にTX、PB10にRXを接続
  - stm32flashで書き込む

    stm32flash.exe -f -v -w boot_ttbasic.bin COM5
    stm32flash 0.4
    http://stm32flash.googlecode.com/
    Using Parser : Raw BINARY
    Interface serial_w32: 57600 8E1
    Version      : 0x22
    Option 1     : 0x00
    Option 2     : 0x00
    Device ID    : 0x0410 (Medium-density)
    - RAM        : 20KiB  (512b reserved by bootloader)
    - Flash      : 128KiB (sector size: 4x1024)
    - Option RAM : 16b
    - System RAM : 2KiB
    Write to memory
    Erasing memory
    Wrote and verified address 0x080160ac (100.00%) Done.


2017年8月11日 (金)

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

現在メインで取り組んでいる「豊四季 Tiny BASIC for Arduino STM32」、
バージョン 0.84に更新しました。

豊四季タイニーBASIC for Arduino STM32 V0.84(2017/08/11)
https://github.com/Tamakichi/ttbasic_arduino/tree/ttbasic_arduino_ps2_ntsc

従来は、NTSCビデオ画面、PS/2キーボードがほぼ必須だったのですが、
V0.5のターミナルコンソールでのスクリーン編集機能を復活させてました。

Blue Pillボードの小さいメリットを生かした利用にも対応できると思います。

01

03


追記 2017/08/13
ILI9341 TFT液晶モジュールに対応しました。
ただし、表示は遅いです。

2017年8月 7日 (月)

豊四季 Tiny BASIC for Arduino STM32でOLED(SSD1306)の制御

豊四季 Tiny BASIC for Arduino STM32をつかった
OLED(SSD1306)ディスプレイの制御です。I2Cにて接続しています。
以前V0.83用に作成したものを、V0.84でも問題なく動くかの動作確認を行いました。


このOLED、横向きに文字を表示するにはフォント回転が必要です。
その回転もBASICでは苦しいかと思ましたが、問題なくリアルタイム表示出来ました。

プログラムソースは、ちょっと長めです。
https://gist.github.com/Tamakichi/36896640d6e8ac94e618f78f9a5bddd8

1 'SSD1306_2(PB6=SCL,PB7=SDA)
10 M=MEM:A=$3C:CLS
20 GOSUB "@INIT":GOSUB "@CLS"
30 X=0:Y=0:C=ASC("A"):GOSUB "@OUT(X,Y,C)"
40 X=1:Y=1:C=ASC("B"):GOSUB "@OUT(X,Y,C)"
50 X=2:Y=2:C=ASC("C"):GOSUB "@OUT(X,Y,C)"
60 X=0:Y=5:S="Hello Tiny BASIC":GOSUB "@PRN(X,Y,S)"
70 'WAIT 2000
80 'GOSUB "@CLS"
90 GETTIME E,F,G
100 LOCATE 0,0:?#-2,E;":";F;":";G
110 X=0:Y=7
120 FOR b=0 TO 7
130 C=VPEEK(X,0)
140 GOSUB "@OUT(X,Y,C)"
150 X=X+1
160 NEXT b
170 WAIT 1000
180 GOTO 90
190 END
5000 "@INIT"
5010 POKE M,$00,$B0,$21,$00,$7F,$40,$80
5020 POKE M+7,$AE,$A8,$3F,$D3,$00,$40,$A1,$C8
5030 POKE M+15,$DA,$12,$81,$FF,$A4,$A6,$D5,$80
5040 POKE M+23,$2E,$20,$10,$21,$00,$7F,$22,$00
5050 POKE M+31,$07,$8D,$14,$AF
5060 FOR I=0 TO 27:R=I2CW(A,M,1,M+7+I,1):NEXT I
5070 RETURN
5080 "@OUT(X,Y,C)"
5090 POKE M+3,X*8:POKE M+1,Y|$B0
5100 GOSUB "@ROTATE(C)"
5110 R=I2CW(A,M,1,M+1,4)
5120 R=I2CW(A,M+5,1,M+50,8)
5130 RETURN
5140 "@CLS"
5150 POKE M+3,0:POKE M+1,0|$B0
5160 R=I2CW(A,M,1,M+1,4)
5170 FOR I=0 TO 127
5180 R=I2CW(A,M+5,1,FNT,8)
5190 NEXT I
5200 RETURN
5210 "@PRN(X,Y,S)"
5220 L=LEN(S)
5230 FOR I=1 TO L
5240 C=ASC(S,I)
5250 GOSUB "@OUT(X,Y,C)"
5260 X=X+1:IF X>15 X=0:Y=Y+1
5270 NEXT I
5280 RETURN
5290 "@ROTATE(C)"
5300 F=FNT+C*8
5310 FOR J=0 TO 7
5320 D=0
5330 FOR K=7 TO 0 STEP -1
5340 D=D+((PEEK(F+K)>>(7-J))&1)<<K
5350 NEXT K
5360 POKE (M+50+J),D
5370 NEXT J
5380 RETURN

5000~5380行はサブルーチンです。
ラベル指定呼び出しで5つのサブルーチンを定義しています。
・"@INIT"
  OLEDモジュールの初期設定を行うサブルーチンです。
・"@CLS"
  OLEDの画面の表示を全消去します。
・"@OUT(X,Y,C)"
   指定した座標に文字を表示します。
   変数Xに横座標、Yに縦座標、Cに文字コードを指定します。
・"@PRN(X,Y,C)"
   指定した座標に文字列を表示します。
   変数Xに横座標、Yに縦座標、Sに文字列を指定します。
・"@ROTATE(C)"
  "@OUT(X,Y,C)"から利用されるサブルーチンです。
  指定した文字コードのフォントデータを回転してメモリに格納します。

10~190行がメインルーチンです。
サブルーチンを利用して文字、文字列、時刻の表示を行っています。

プログラムがちょと長いですねぇ
長いとNTSCのビデオ出力画面でのプログラム作成は辛いです。
テキストエディタで作成して転送になっちゃいますね。

そこで、 V0.84(現在動作確認中)では長いプログラムを作成しやすくするために、
次の機能を盛り込みました。

  1)プログラム編集機能の改善
    ・ターミナル上で最大横128文字x縦50行のスクリーン編集をサポート
    ・プログラムソースの上下スクリール表示

  2)プログラムソースの部分保存・読み込み
    例:上記ソース5000行~5380行(サブルーチン部)だけを保存・読み込みする

  3)RENUMコマンドで範囲指定の番号振り直し対応
   例; 上記ソースの10行~190行だけを行番号の振り直しする

  4)利用可能変数の追加
    A~Zではちょと足りないので、A0、A1のように数字を付けた変数名もOK


色々と長いプログラム作成の改善方法を模索したのですが、
幾つか長いプログラムを作成してみると、
「行番号付けるのうざい、行番号要らなくねぇ?」
と、感じる今日この頃です。

  行番号廃止
これが一番の改善策と思えてきました。
行番号が無ければ、番号の振り直しとか不要ですし...
行番号の付け間違えで、行が消えたり等弊害もあります。

たしか、BASICの親戚(親?)のFORTRANは必要な時だけ(GOTOの飛び先)、
行番号を付けていたはずです。

行番号ではなく、単に行(先頭からの行の連番)だけでもイケないだろうか模索中です。
何れは、号番号廃止したいなぁと思っています。

また、引数を伴うサブルーチン呼び出しも
  CALL "@PRN", X,Y,S
みたいな呼び出しと
  SUB "@PRN" X0,Y0,S0
    ・・・
  RETURN

みたいなサブールーチンの定義にしたいです。

2017年8月 5日 (土)

Blue Pill ボード(STM32F103C8T6) $1.58

Aliexpress、Blue Pillボード取扱い業者が増え、値段が下がっていますね。
原価はいくらなんだろう..

Free Shipping STM32F103C8T6 ARM STM32 Minimum System Development Board Module Forarduino
Blue Pillボード

とりあえず、2個注文しました。
安くて、小さくて、高性能とバランスが取れて良いボードです。

利用者も増えている感があります。

増えているといえば、最近のArduino STM32は更新の頻度も増えてます。
利用者増加に伴い、プルリクエスト・不具合の指摘も増えています。

機能追加・不具合対応等は大歓迎です。

早速更新すると、何気にメニューの設定項目が増えています。
オーバクロック 128MHz !?

04

2017/08/07 追記
Arduino STM32、最近の激しい更新ラッシュ、Wire(I2C)ライブラリに大きな変更があり
豊四季Tiny BASICでコンパイルエラーが発生するようになりました。

Wireライブラリはハードウェアバージョンとソフトウェアエミュレーションバージョンがあり、
デフォルトではWire.hがソフトウェアエミュレーションバージョン、HardWire.hが
ハードウェアバージョンを使うためのヘッダーファイルでした。

これが、最近の修正で、Wire.hがハードウェアバージョンとなり
ソフトウェアエミュレーションバージョンを使う場合はSoftWire.hを使うこととなります。

豊四季Tiny BASIC for Arduino STM32は、
これを機会に、Arduino STM32の安定版での利用をデフォルトとしました。

2017年8月 2日 (水)

豊四季タイニーBASIC for Arduino STM32 V0.84

現在手掛けている、豊四季タイニーBASIC for Arduino STM32.
次バージョン0.84の画面切り替えのデモ動画です。



左の画面はNTSCビデオ出力をキャプチャーして表示しています。
右の手前の画面はUSB端子経由のシリアル接続のターミナル画面です。
その奥の画面はシリアルポート経由でのターミナル画面です。
ターミナルソフトとしてTeraTermを利用しています。

シリアル接続のターミナル画面は921,600bpsで接続しています。

スクリーン編集可能な画面をNTSCビデオ画面から2つのシリアル接続の
ターミナルコンソールに切り替えることが出来ます。

豊四季タイニーBASIC for Arduino STM32.は、
4Kバイトまでのプログラムが作成可能なのですが、
4kバイトだとプログラム行数は数百行になっちゃいます。

NTSC出力の狭い画面ではプログラム作成・編集がちょっと辛いです。
また、変数がA-Zの26個なの大きいプログラムでは足りません。

そこで次バージョンの0.84では、現時点の利用面での不満を考慮し、
次の対応を行う予定です。
   1)シリアルコンソール画面にてプログラム作成が出来るようにする
   2)変数はA-Zの他に英字+数字の変数も利用可能にする

V0.84は取りあえずほぼ完成なのですが、
かなりの変更になってしまい、動作確認に時間がかかっています。

2017年7月19日 (水)

次はSTM32ボードを積極的に使ていきたい(19) - シリアルポートの調査(2)

2017/07/13 訂正
Serial.setTimeout()は接続待ちのタイムアウトには関与しないようです。
私の勘違いでした。内容を修正しました。

STM32F103C8T6搭載ボードをArduino STM32環境下にて利用する場合の
シリアルポートの利用について以前調査し、下記にまとめたのですが、

 関連記事 : 「次はSTM32ボードを積極的に使ていきたい(2) - シリアルポートの調査」


起動直後のUSB-シリアル接続待ち処理において若干、推奨する作法が変わったようです。

従来
Serial.isConnected() で接続確認
void setup(void){
  Serial.begin(115200);
  while (!Serial.isConnected()) delay(100);
}

現時点
Serial で 接続確認

#define timeoutPeriod 2147483647    // Long time... about 25 days
void setup(void){
  Serial.begin(115200);
  while (!Serial) delay(100);     
}

この変更はUSBをサポートしている Arduino Leonardo、Micro、DueとAPIを
同じにするためのようです。

関連情報: https://github.com/rogerclarkmelbourne/Arduino_STM32/pull/270

Serial.isConnected()も現時点でも利用出来ますが、
Arduino STM32(ベースのmapleを含む)固有ですので今後は使わない方がようでしょう。
Arduino STM32のサンプルスケッチも全てSerial.isConnected()を廃止して
Serialの値で判定するように修正されています。

現在手掛けている、豊四季Tiny BASICでは次ようにしました。
無限ループだと、1.5秒だけまって接続をスルーします。
こうしないと、接続済みの時にリセットした場合、接続直後の通信データの取りこぼし
が発生します。

void setup() {
  for(uint8_t tm=0; tm <15 && !Serial; tm++) 
    delay(100);
    ・・・


2017年6月27日 (火)

豊四季タイニーBASIC for Arduino STM32、ボード実装

「豊四季タイニーBASIC for Arduino STM32」
開発環境をブレッドボードからユニバーサル基板に移行しました。

Dscn6689

ジャンパーワイヤーから解放されてすっきりしました。

Dscn6693

現在、スクリーンエディタ部のクラスを再設計して汎用化し、差分実装にて
色々なデバイス(シリアルコンソール、液晶モジュール等)への対応を行っています。

スクリーンエディタ部分はライブラリ化して、Tiny BASIC以外のユーザーインタフェース
に利用出来るよう、思案中です^^

より以前の記事一覧