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

ARM

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以外のユーザーインタフェース
に利用出来るよう、思案中です^^

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にて更新版を公開します。

2017年6月 1日 (木)

豊四季 Tiny BASIC for Arduino STM32の動作テスト(4) - 文字の拡大表示

現在取り組んでいる「豊四季 Tiny BASIC for Arduino STM32」の動作確認の続きです。

内蔵しているRTCから時刻を取得して、拡大文字で時間を表示するデモです。


プログラムソース

10 CLS
20 GETTIME H,M,S
30 @(0)=H/10:@(1)=H%10
40 @(2)=10
50 @(3)=M/10:@(4)=M%10
60 @(5)=10
70 @(6)=S/10:@(7)=S%10
80 FOR I=0 TO 7
90 BITMAP I*24+10,20,FNT,@(I)+ASC("0"),6,8,4
100 NEXT I
110 GOTO 20

GETTIMEコマンドで時刻を取得して、
BITMAPコマンドを使って、6x8ドットの文字を4倍に拡大して表示しています。
処理的には単純です。

内蔵しているRTCは外付けのボタン電池でバックアップをしており、
電源を切っても時刻を刻んでくれます。

Dscn6653

一ヶ月か1っヶ月半前に時刻をセットしたのですが、7分もずれています。
あまり精度は良く無いです。

ここで、1回ループ当たりの処理にかかる時間をTICK()関数で測定したのですが、
値は0でした。
TICK()関数、現時点の仕様は0.1秒刻みなのですが、これだと役に立たないっぽい。
長期の時間測定はRTCを使えば良いので、TICK()は1ミリ秒刻みにして
処理時間計測に利用出来るように修正します。

2017年5月28日 (日)

豊四季 Tiny BASIC for Arduino STM32の動作テスト(3) - LEDドットマトリックス

現在取り組んでいる「豊四季 Tiny BASIC for Arduino STM32」の動作確認の続きです。

LEDドライバ、MAX7219を使った8x8LEDドットマトリックスの制御をやってみました。

02

利用したモジュールはAliexpressで以前入手したものです。
1個150円程度で購入できます。amazonでも1個200円くらい入手出来るようです。

Free shipping! 1PCS MAX7219 dot matrix module

01

実際の動作


思っていたより、スムーズに表示出来ました。
以前IchigoJamでやった時は、1文字1秒かかりスクロール表示なんて無理な状況でした。
さすが、IchigoJamの100倍近い性能、難なく動かせました。

プログラムソース

1 'MAX7219(PB13: CLOCK, PB12: CS, PB14: DAT)
100 GOSUB "INIT"
110 M="ネコニコンバンワ!"
115 T=100
120 L=LEN(M)
130 FOR S=1 TO L
140 C=ASC(M,S)
150 GOSUB "SCROLLIN(C,T)"
160 NEXT S
170 END
200 "SCROLLIN(C,T)"
210 FOR J=0 TO 5
220 FOR K=0 TO 7
230 @(K)=(@(K)<<1)|(PEEK(C*8+FNT+K)>>(7-J))
250 NEXT K
255 GOSUB "DISP(@)"
260 WAIT T
270 NEXT J
280 RETURN
300 "DISP(@)"
310 FOR I=0 TO 7
320 R=I+1
330 V=@(I)&$FF
340 GOSUB "WRITE(R,V)"
350 NEXT I
360 RETURN
400 "INIT"
410 GPIO PB12,OUTPUT
420 GPIO PB13,OUTPUT
430 GPIO PB14,OUTPUT
440 @(0)=$0B,7,$0A,0,$0C,1,9,0,$0F,0
450 FOR I=0 TO 8 STEP 2
460 R=@(I):V=@(I+1)
470 GOSUB "WRITE(R,V)"
480 NEXT I
485 FOR I=0 TO 7:@(I)=0:NEXT I
490 RETURN
500 "WRITE(R,V)"
510 OUT PB12,LOW
520 SHIFTOUT PB14,PB13,MSB,R
530 SHIFTOUT PB14,PB13,MSB,V
540 OUT PB12,HIGH:OUT PB12,LOW
550 RETURN

プログラムの構造的には次のような感じになっています。
ボトムアップ的(下位から上位)に解説します。

・510~550行:ラベル "WRITE(R,V)"
MAX7219へのコマンド送信を行うサブルーチン
変数Rがレジスタ、変数Vがレジスタに設定する値です。
ボード上の端子PB12がCS、PB14がデータ、PB13がCLKへの出力です。
シフト操作によってR、Vの16ビットを送信しています。

ちなみに、ラベル名の"WRITE(R,V)"は単なるラベル名で、(R,V)は引数として
渡していることを分かり易くするためラベルに付けているだけです。

・400~490行:ラベル "INIT"
MAX7219の初期化処理
PB12,PB13,PB14を出力設定にしたのち、
"WRITE(R,V)"を呼び出して、440行のレジスタその設定値の内容を送信しています。
また、485行で8x8ドットの表示用バッファ(配列@(0)~@(7)を初期化しています。
レジスタ設定では輝度等の設定を行っています。

・300~360行:ラベル "DISP(@)"
8x8ドットパターンの表示処理
8x8ドットの表示用バッファ(配列@(0)~@(7))の内容をMAX7219に送信しています。
送信には"WRITE(R,V)"を呼び出しています。

・200~280行:ラベル "SCROLLIN(C,T)"
1文字単位のスクロール挿入処理
変数Cで指定した文字をスルロールしながら挿入します。
スクロールする際の1ドット毎のウェイトを変数Tで指定します。
8x8ドットの表示用バッファ(配列@(0)~@(7))に1ドットスクロールしたデータを書き込み
"DISP(@)"を呼び出して実際の表示を行っています。

文字のドットデータは、フォントデータを利用しています。
フォントデータの格納アドレスは定数FNTにて参照できます。

・100~170行:メイン処理
  下位のモジュールを使って文字列表示を行っています。
   変数Mに文字列、変数Tにスクロール速度を指定します。
   このレイアでは、MAX7219の使い方は意識しないで表示したい文字を指定して
   表示するだけです。
   
処理的に余裕がありそうなので、手持ちの四連結もMAX7219も制御出来そうです。
そのうちチャレンジ試してみよう..

2017年5月14日 (日)

豊四季 Tiny BASIC for Arduino STM32の動作テスト(2) - ゲームパッドの利用

現在取り組んでいる「豊四季 Tiny BASIC for Arduino STM32」の動作確認の続きです。

今回は、ファミコン用ゲームパッドを利用するプログラムを作成しての検証です。

Dscn6614

利用したのは、Aliexpressで入手したゲームパットです。350円くらいで入手しました。

01

ファミコン関連の周辺機器は"NES"で検索して探せますが、コネクタがUS版では
ちょっと異なります。今回はDSUB9ピンのものを利用しました。

Dscn6603

ファミコン用のゲームパッドのボタン状態の読み取りのプロトコルは、
シフトレジスタからのデータ取得の手順となります。

大まかな内部の回路は次のような感じになります。
シフトレジスタCD4021相当のプロトコルにてボタン情報の取得が行えます。
DSUB9ピンのうち、5ピン(GND、VCC、CLOCK、LATCH、DATA)を利用します。

回路図

Photo

Blue Pillボード(TinyBASIC)には、次の結線を行います。
  PB12 2: DATA(INPUT)
  PB13  3: LATCH(OUTPUT)
  PB14  4: CLOCK(OUTPUT)
  3.3V  6: 3.3V
  GND   8: GND

  Dscn6613

  ブレッドボードに接続して利用するために、次のような感じのコネクタを作成しました。

  Dscn6607

  D-SUBオスピンは秋月電子で入手しました。
  このコネクタ、端子がちょっと特殊で2.54ピッチの基板には乗りません。
 
  仕方がなく、1.27ピッチの基板に乗せました。ちょっと面倒でした。
  ブレッドボード用の変換基板があるので、それを買うべきでした。 

04


プログラム

ボタン情報を読み取り、各ボタンの状態0、1を表示します。
50行から100行がシフトレジスタから1ビットずづボタン情報を取得しています。
変数Rに読み取り結果をセットします。
110行でその変数Rの値を2進数で表示しています。

10 CLS
20 GPIO PB12,INPUT_FL
30 GPIO PB13,OUTPUT
40 GPIO PB14,OUTPUT
50 OUT PB13,HIGH:OUT PB13,LOW
60 R=0
70 FOR I=0 TO 7
80 R=R+IN(PB12)<<I
90 OUT PB14,HIGH:OUT PB14,LOW
100 NEXT I
110 LOCATE 0,0:?BIN$(R,8)
120 WAIT 100
130 GOTO 50


実行すると次のような感じになります。
ボタンを押している場合は0、離している場合は1となります。
ボタンは同時押しもOKです。

Dscn6617

画像のビットとボタンの関係は次の通りです。
10111111

左の上位ビットからゲームパッドのボタン⑦⑥⑤④③②①⓪に対応しています。
上のビット情報では⑥のボタンを押した状態です。

Dscn6609

ゲームパッド上にボタンは10個ありますが、
右上の2つはその下のボタンの連打(ターボ)用です。
連打ボタンを押し続けると、オン、オフを自動で繰り返します。

TinyBASICにはシフトレジスタから値を読み取るSHIFTIN()関数があります。
SHIFTIN()関数を使うと、プログラムがちょっと短くかつ処理の高速化が出来ます。

10 CLS
20 GPIO PB12,INPUT_FL
30 GPIO PB13,OUTPUT
40 GPIO PB14,OUTPUT
50 OUT PB13,HIGH:OUT PB13,LOW
60 R=SHIFTIN(PB12,PB14,LSB,LOW)
70 LOCATE 0,0:?BIN$(R,8)
80 WAIT 100
90 GOTO 50

SHIFTIN()関数を利用した記述すると、先ほどの60行~100行の5行は
50行~60行の2行に短縮出来ました。
10行から40行は初期設定なので、実質2行でボタン情報が取得できます。

今後、ゲームなんかに利用していくことにします。

さて、今回の検証でTinyBASICのSHIFTIN()関数の引数を追加しました。
当初、Arduinoのshiftin()と同じ機能そのまま実装したのですが
Arduinoのshiftin()の仕様ではCD4021には対応出来ません。

CD4021ではCLOCKがLOWの場合にデータ取得するのですが、
shiftin()はCLOCKがHIGHの場合にデータを取得にした対応していません。
その仕様が分からず、正しくデータが取得出来ないことにハマりました。

そのため、TinyBASICのSHIFTIN()では第4引数(省略時可能)、データ取得の
CLOCKの状態を指定出来るようにしました。

やはり、実際に利用してみないと問題点は気付かないですね。

2017年5月11日 (木)

豊四季 Tiny BASIC for Arduino STM32の動作テスト(1) - サーボモータの利用

現在取り組んでいる「豊四季 Tiny BASIC for Arduino STM32」
色々と機能が充実してきましたが、テスト不十分です。
そこで動作確認テストとして、BASICにてプログラムを色々と作成して
検証して行こうと思います。

まずは、PWM出力機能を使ってサーボーモーターを制御をやってみました。

01

上記写真がその様子です。安価なサーボモーターSG90をアナログジョイスティックで
グリグリと動かすという制御です。

利用したパーツについては次の通りです。

サーボーモーター SG90
  Aliexpressで入手したものです。秋月電子やAmazonでも入手出来ます。

  Dscn6601

利用方法については秋月電子の製品紹介ページのPDFを参照参考にしました。
データシートによると、
   ・利用電圧 4.8V ~ 5V
   ・PWMのパルス 50Hz (周期 20ms)
   ・-90°~  0° ~ 90°の可動域
   ・Duty Cycle 0.4ms ~ 1.45ms ~ 2.4ms が上記の範囲に対応
とのことです。

アナログジョイスティック
Aliexpressで入手したものです。1個100円くらいだったと思います。
amazonを探すと同じようなものが販売されているようです。

Dscn6602

X,Y方向のアナログ入力、ヘッドを押すとボタンのON/OFF入力が出来ます。
今回はX方向のアナログ入力のみ利用します。

Blue Pillボードとの接続
・SG90
    VCC(赤) => 5V
    GND(茶) => GND
    PWM (オレンジ)  => PA8

・アナログジョイスティック
   VCC => 3.3V
   GND => GND
   X => PB0


プログラム  

1 'サーボモーターセイギョ
5 CLS
10 GPIO PB00,ANALOG
20 GPIO PA08,PWM
30 P=MAP(ANA(PB00),0,4095,102,491)
40 POUT PA08,P,50
45 D=MAP(P,102,491,-90,90)
47 LOCATE 0,0:?#3,D
50 GOTO 30

動作の様子


プログラムの説明

やっていることは単純です、10行、20行は利用するIOピンの設定です。

30行でアナログジョイスティックかあらアナログ値を取得しています。
アナログ入力値の範囲はジョイスティックの操作にて0~4095となりますが、
その値は102~491の範囲にスケール変換して変数Pに設定しています。
MAP関数はArduinoのmap()関数を同等の機能です。

このスケール変換は、SG90の仕様からPWM出力するduty値が4095を100%とした場合、
    -90°=>  102/4095
       0°=>  297/4095
     90°=>  491/4095
であるため、ジョイスティックの入力0~4095を102~491に対応させて、
ジョイスティックの入力で全可動域を操作出来るようにしています。

03

40行のPOUTで50Hz(周期20ms)で0.50~2.40ms幅のパルスを出力しています。
45~47行は画面に角度を表示しています。

このPWM出力いよるサーボーモーター制御、いくつか問題が発生しました。
モーターは結構、消費電力が大きいのかBlue Pillボードから5Vを供給すると、
PS/2キーボードが微妙不安定になったり、USB経由のシリアル出力をすると
フリーズしたりしました。

最初はプログラム的な不具合かと思ったのですが、電源を別から供給することで安定しました。
モーター制御は電源周りには注意が必要ですね。

2017年5月10日 (水)

次はSTM32ボードを積極的に使ていきたい(18) - Tiny BASIC(4)

今回は、内部RTCの時刻を電池で保持する調査です。

「次はSTM32ボードを積極的に使ていきたい(12)」で内部RTCを使った時刻表示、
現在取り組んでいる豊四季Tiny BASICでも利用可能です。
DATE、SETDATE、GETDATE、GETTIME等のコマンドをサポートしています。

Blue PillボードではVBAT端子からの電池によるRTCバックアップが可能です。
手持ちの部品で電池によるバックアップを試してみました。

Dscn6561

次のような感じの結線を行ってVBATに電源を供給します。
VDDにはBlue Pillボード上の3.3Vに接続しています。

02

利用部品
  ・ショットキーバリアダイオード 1N5819 x 2
  ・電解コンデンサ 100μF x 1
  ・ボタン電池 CR2032(3V) x 1

ダイオードはは別の物でもOKです。
順方向の降下電圧が低いものが良いでしょう(1N5819は0.45Vです)。
VBATは2.0V以上であれば良いようです。

実際の接続の様子

Dscn6594

とりあえずこの電池で、電源を落としても時刻が初期化されなくなりました。

2017年4月30日 (日)

次はSTM32ボードを積極的に使ていきたい(17) - SDカード&ビデオ出力

Blue PillボードでのSPI2本同時利用のテストです。
NTSCビデオ出力しながら、SDカードからBitmapファイルを読んで表示してみました。

01

画面の解像度は448x216ドットです。
表示内容は青空文庫の蜘蛛の糸をビットマップ画像にしたものです。

02

動いている様子


プログラムは以前 Arduino UNO用に作成したものを組み合わせて、作成しました。
下記のスケッチを流用しました。
   aitendo 16x16LEDマトリックスの制御 (5)
   http://nuneno.cocolog-nifty.com/blog/2016/06/aitendo-16x16-2.html

Arduinoの資産が流用出来るのは、大変うれしいです。

これはこれで、何かに使えそう..

より以前の記事一覧