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

arduino

2017年8月15日 (火)

OLED(SSD1309)ディスプレイモジュールを試して見る

大き目のOLEDディスプレイをAliExpressで見つけ、ポチりました。
2.42" 12864 OLED Display Module IIC I2C SPI Serial FOR C51 STM32 WHITE SSD1309

Aliexpress

$22.99はちょっとお高いかなぁと思いつつ、製品が到着。
0.96インチのOLEDと比較すると、以外と大きい...値段に納得。

Dscn6854

早速動作確認しました。
下記の情報を参考にしました。参考記事の製品は私の物と全く同じようです。
Arduino Forum >  Using Arduino >  Displays >  2.42" OLED SSD1309 with U8GLIB

SPI接続で利用します。
ライブラリはu8glibではなく、u8g2を使いました。
ライブラリはここから入手しました。

Dscn6842

流石OLED、表示が綺麗です。
画面のサイズも思っていたよりも大きいです。これなら$22.99で十分お得かも..

Dscn6841

参考にした記事ではVCC 5Vで稼働させていますが、3.3Vでも動作しました。
このモジュール、SPI利用の場合のピンの利用がちょっと分かりにくですが、
参考記事にて使い方が判明しました。

Dscn6846

SSD1309はSSD1306と互換性があるようです。u8glibではデバイスとしてSSD1306を
指定しても動作しました。

AdafruitのSSD1306ライブラリも試して見ました。

Dscn6853

問題なく動いていると思いきや、スクロールのデモでスクロールせず..

Dscn6850

ハードウェアスクロールが動かないです。SSD1309は完全互換では無いみたいですね。

次の調査として、Blue Pillボードでも使えるかやってみます。

追記

Blue Pillボードでもu8glib(u8g2)ライブラリを使った表示制御が出来ました。
豊四季Tiny BASICから利用出来るよう、ちょっとやってみます。

Dscn6863


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月 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年7月15日 (土)

Windows 10でCH340を標準サポートになったっぽい?

先日購入した中古のWindows 10ノートパソコンにてArduino IDE 1.8.3インストールしました。

激安Arduino Uno互換機を接続するとUSB-シリアルCH340用のドライバーを
インストールすることなく、スケッチの書き込みができました。

以前は、ドライバーを入手して別途インストールが必要でした。

02

デバイスのプロパティを見ると、接続したタイミングでインストールされたようです。

01


それならばと思い、Silicon LabsのCP2102搭載のUSB-シリアルモジュールを繋げてみると、
やはりドライバーのインストール不要で利用出来ました。

02_2

デバイス マネージャーでの確認

03

いつから、標準対応になったのだろう..
それとも、夜中に小人さんさんがドライバーインストールしてくれたん?

2017/07/18 追記
念のため、他のWindows 10機で試してみました。
Arduino IDE等の開発環境をインストールしたことのないタブレットです。
Windows 10は最新版にアップデートしています。

04

CH340、CP2102搭載の搭載のUSBシリアル変換モジュールをUSBハブ経由で接続。
タブレットでもUSBに刺しただけで、ドライバーがインストールされました。
デバイスマネージャーで見てもちゃんとCOMポートとして認識しています。

05

やはり、わざわざドライバーを入手する必要はないみたいです。

 

2017年7月14日 (金)

SDライブラリのマルチメディアカード(MMC)対応

Arduino IDEのSDライブラリを修正してマルチメディアカード(MMC)が利用可能にしました。
ライブラリを下記のサイトにて公開します。
https://github.com/Tamakichi/SD

オリジナル版と名前がかぶりますが、ibrariesの下に配置するとこちらを優先して
スケッチで利用されます。

修正については、Elias Zacariasさん、ChaNさんの記事を参考にしました。
ソースはほぼElias Zacariasさんの差分を利用しています。感謝!
・A BIT of Mystery - ARDUINO SD LIBRARY SUPPORT FOR MMC CARDS
   http://blog.damnsoft.org/arduino-sd-library-support-for-mmc-cards/
・MMC/SDCの使いかた
   http://elm-chan.org/docs/mmc/mmc.html

マルチメディアカード(MMC)にはいくつかのタイプがありますが、
とりあえず、下記の端子が7つあるタイプでの動作を確認しました。

06

SDカードと形状は同じですが、端子が2つ少ないです。

07

SDライブラリのサンプルスケッチで読み書き出来ました。

03

01

02


ところで、

なぜ、マルチメディアカード(MMC) 対応?

と思われますが、大人の事情です。

ArduinoでSDカードを利用する場合、
お手軽な方法としてはArduino IDEのSDライブラリ利用します。
ところがこのSDカードの利用、個人利用でも厳密にはライセンス(有料)が必要なようです。

参考情報

     ・ねむいさんのぶろぐ - いろいろ試す25(今回はSDカード関連中心です)

これを回避する手段としては、SDカードの下位互換でかつライセンス不要の
マルチメディアカード(MMC)に対応することで、
  「MMCまたは互換カード対応」
と主張するしかないようです。

悲しいことに、Arduino IDEのSDライブラリはMMC対応されていません。
そこでこの修正版を作成しました。
現在手掛けている豊四季Tiny BASIC for STM32のSDカード利用で問題となります。
ほかに過去に色々とSDカードを利用したスケッチ等を公開しています。

といあえず、これで
  「MMCまたは互換カード対応」
と主張出来ます。

2017年6月27日 (火)

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

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

Dscn6689

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

Dscn6693

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

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

2017年6月15日 (木)

「豊四季 Tiny BASIC for Arduino STM32」 、v0.83に更新

現在手掛けている、Blue Pillを使った「豊四季 Tiny BASIC for Arduino STM32」、
SDカード対応してv0.83としました。

SDカードにプログラムのセーブ、ロード出来るようになりました。
やはり、名前を付けてファイルとして保存出来るのはいいですね。

03

動いている様子
FILESコマンドで、ワイルドカードが使えます。

amazonで入手出来る安価なSDカードモジュール3点は問題なく利用出来ました。

Dscn6664

06


トップの写真の画面表示は次のプログラムで行っています。

10 CLS
20 LDBMP "TT.BMP",MEM,0,0,32,32,1
30 LDBMP "TT.BMP",MEM+128,32,0,32,32
40 LDBMP "TT.BMP",MEM+256,64,0,32,32
50 LDBMP "TT.BMP",MEM+384,0,32,96,32
60 BITMAP 10,30,MEM,0,32,32,2
70 BITMAP 74,40,MEM,1,32,32,2
80 BITMAP 138,50,MEM,2,32,32,2
90 BITMAP 10,120,MEM+384,0,96,32,2

動作検証用なので、ちょっと面倒なことをやっています。
(最初から1つの画像にしておけば1行で表示できるのですが..)

次の画像ファイル"TT.BMP"から任意の部分を切り出してロードし、
2倍にして表示しています。

Tt

面白そうな機能、と思い実装してみたのですが
あまり使い道がなさそう...




2017年6月 4日 (日)

豊四季Tiny BASIC、ビットマップファイルの利用を可能に..

安価なBlue Pillボードを使った豊四季Tiny BASIC、SDカードからビットマップファイルを
ロード出来るようになりました。



224x312のビットマップファイルから224x216サイズを
部分ロードして表示している様子です。
縦の切り出し位置を逐次変更することでスクロールしているように見えます。

ここで言っているビットマップファイルは
Windowsのモノクロビットマップ形式の画像ファイルです。

動画のプログラムソース

10 CLS
20 FOR Y=0 TO 312-216
30 LDBMP "CAT.BMP",GRAM,0,Y,GW,GH
40 NEXT Y
50 GOTO 20
画像はHelm42さんの猫絵を利用させて頂いています。
エラー処理等をもうちょっと、強化してからGitHubにて更新版を公開します。

より以前の記事一覧