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

« 2017年3月 | トップページ | 2017年5月 »

2017年4月の6件の記事

2017年4月30日 (日)

次はSTM32ボードを積極的に使ていきたい(17)

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の資産が流用出来るのは、大変うれしいです。

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

2017年4月27日 (木)

次はSTM32ボードを積極的に使ていきたい(16)

現在取り組んでいる Blue Pillボード用のTiny BASIC、PWM出力を追加しようと調査中です。

Arduino STM32には、標準でPWM出力を行う機能があります。

PA6からデューティ比50%のパルスを出力するには次のように行います。
  pinMode(PA6, PWM);
  pwmWrite(PA6, 0);
  pwmWrite(PA6, 65535/2);


出力結果は次のような感じのパルスとなります。

01

周波数366Hzとちょっと低めですが、デューティ比50%のパルスが出力出来ます。
(550Hzくらいの時もあり、利用するピンによって違うのかもしれません。謎)

pwmWrite(PA6, 0)をやったのは、
Arduino STM32では、pinMode(PA6, PWM)ピン設定だけで、デューティ比50%のパルスが
勝手に出力されてしまうので、設定直後に出力を止める必要があるためです。

標準のAPIでも使えないことはないのですが、
もうちょっと周波数の早いパルスを出したいですね。そこで関数を自作してみました。
//
// Arduino STM32
// PWM出力サンプル(周波数,デューティ比指定)
// 2017/04/27 by たま吉さん
//

#if F_CPU == 72000000L
#define TIMER_DIV 72
#else if  F_CPU == 48000000L
#define TIMER_DIV 48
#endif

#define PWM_PIN PA8
#include <libmaple/timer.h>

//
// PWM出力
// 引数
//   pin     PWM出力ピン
//   freq    出力パルス周波数(0 ~ 65535)
//   dcycle  デューティ比 (0~ 4095:4095で100%)
// 戻り値
//   0 正常
//   1 異常(PWMを利用出来ないピンを利用した)
//
uint8_t pwm_out(uint8_t pin, uint16_t freq, uint16_t duty) {
  uint32_t dc;
  
  timer_dev *dev = PIN_MAP[pin].timer_device;     // ピン対応のタイマーデバイスの取得 
  uint8_t cc_channel = PIN_MAP[pin].timer_channel;  // ピン対応のタイマーチャンネルの取得

  if (! (dev && cc_channel) ) 
    return 1;  

  uint32_t f =1000000/(uint32_t)freq;  // 周波数をカウント値に換算
  dc = f*(uint32_t)duty/4095;
  timer_set_prescaler(dev, TIMER_DIV);  // システムクロックを1MHzに分周
  timer_set_reload(dev, f);             // リセットカウント値を設定 
  timer_set_mode(dev, cc_channel,TIMER_PWM);
  timer_set_compare(dev,cc_channel,dc);    // 比較レジスタの初期値指定(デューティ比 0)
  return 0;
}

void setup() {
  pinMode(PWM_PIN, PWM);
  pwmWrite(PWM_PIN,0);
  pwm_out(PWM_PIN, 20480, 4095/2);
}

void loop() {

}


20kHzのパルスを出してみました。
デューティ比の指定は、アナログ入力の分解能が12ビット(0~4095)なので
スケールをそれに合わせまあした。

02

しっかりと出力出来ました。

PWM出力はタイマー資源を使います。
TinyBASICではTIMER1とTIMER3がまだ未使用なので、
このタイマーに対応するGPIOピンで利用出来るようにしたいと思います。

追記
上手く行ったと思ったら、なぜかTIMER1だけ動かない。調査中..
対応し、スケッチを修正しました。初期化がまずかったようです。

2017年4月20日 (木)

次はSTM32ボードを積極的に使ていきたい(15)

移植&機能追加中のBlue Pill用豊四季タイニーBASIC、
コマンド等を追加しました。

豊四季タイニーBASIC for Arduino STM32 V0.7
https://github.com/Tamakichi/ttbasic_arduino/tree/ttbasic_arduino_ps2_ntsc

色々と遊べるようになってきました。

ビットマップ表示



スクロール表示


試しに、簡単な下記のプログラムでIchigoJamとBlue Pillボードで性能比較してみました。

10 FOR I=0 TO 30000
20 A=(12345/67+89)*10
30 NEXT I

;結果次の通りです。

処理にかかった時間(TICK()で測定)
  IchigoJam       84.3秒
  Blue Pillボード  0.8秒
マイコンレベルのスペックでIchigoJamの3倍くらいの性能が出ればいいと思っていたところ、
なんと100倍近い性能!

この理由は、IchigoJamが中間コード形式を採用していないためだと思われます。
IchigoJamが"12345"を30,000回文字列から2バイト整数に変換してから計算するのに対し、
tinyBASICでは、最初に中間コードに変換した状態でプログラムを実行します。
"12345"は実行時に2バイト整数に変換されている状態です。
中間コード変換はかなり、効果があることが分かりました。


Blue Pillボードを使った TinyBASICの構成は次のような感じです。

接続図(クリックで拡大表示します)

02

利用可能市販パーツ
 

2017年4月13日 (木)

次はSTM32ボードを積極的に使ていきたい(14)

豊四季版tiny BASIC をBlue Pill用に移植&機能追加中です。

02

オリジナル版は、シリアル接続で行単位のプログラム入力でしたが、
ビデオ出力とPS/2キーボード対応、フルスクリーンエディタ対応等の機能追加して
IchigoJamのような感じで利用出来るようになってきました。

03

04

グラフィック描画や、GPIOを使った入出力、I2C、シリアル通信、RTC対応等
色々と詰め込中です。

豊四季タイニーBASIC for Arduino STM32 V0.6
https://github.com/Tamakichi/ttbasic_arduino/tree/ttbasic_arduino_ps2_ntsc

2017年4月 9日 (日)

次はSTM32ボードを積極的に使ていきたい(13)

コントローラーにILI9341を使った液晶モジュールの動作確認
メモしておかないと結線忘れるので記録に残しておきます。

Dscn6523


Arduino STM32にはILI9341を使った液晶モジュールを使うためのライブラリが用意されています。

ライブラリ
   Adafruit_GFX_AS         Adafruit GFX Graphics Library(Arduino版の修正版 _ASが付く)
   Adafruit_ILI9341_STM   ILI9341搭載液晶モジュールコントローラ

ライブラリのサンプルスケッチを使って、手持ちのILI9341搭載液晶モジュールを
動作させてみました(SDカード、タッチパネルも使えるのですが今回は表示のみです)。


  接続(クリックすると拡大表示します)

01


サンプルスケッチはそのままでは動かす、ピン割り付け部分の修正が必要です。
下記のように接続しました。CS、RESET、D/Cは任意のピンが利用出来ます。
SPI接続のピンA5,A6,A7は変更できません。

    02


graphicstest.inoの修正箇所

#include "SPI.h"
#include "Adafruit_GFX_AS.h"
#include "Adafruit_ILI9341_STM.h"

#define TFT_CS  PA0                  
#define TFT_RST PA1
#define TFT_DC  PA2

            
//Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC);
Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  Serial.begin(115200);
  delay(3000);
  Serial.println("ILI9341 Test!"); 
 
  tft.begin();

RESETをBlue Pillのリセットと連動させる場合はBlue PillのRSTへの接続でもOkです。
その場合は、TFT_RSTを-1にするか、コメントアウトしているコンストラクタの方を
利用して初期化します。

Adafruit GFX Graphics Libraryを使って自分で好きなように動かしたい場合は、
Adafruitのサイトの公開情報が参考になります。
  ・Adafruit GFX Graphics Library
   https://learn.adafruit.com/adafruit-gfx-graphics-library/

Arduino STM32に付属しているAdafruit GFX Graphics Libraryは、フォントが削られているので、
上記リンクからライブラリをダウンロードしてフォントだけコピーしたほうがよいかも。
(訂正) Arduino Stm32版では、setFont()が削られていて使えないようです。

Arduino UNOに比べると描画速度が非常に速いです。
Arduino UNOではSPIのクロックが8MHzなのに対して、Blue Pillはで36MHzです。

次のYoutubeの動画によると、Arduino Unoの12倍の速度で描画出来るようです。
 
   Generic STM32 vs Arduino Pro Mini/Nano speed comparison
   

2017年4月 4日 (火)

Arduino IDEでのchar型の変数の振舞

最近のArduino IDEでは従来のAVRマイコンほ他に、ARM系のボードもサポートしています。
スケッチもある程度、他のマイコンボードへの流用が出来ます。

私もAVR系のArduino UnoのスケッチをSTM32のボードに流用したりするのですが、

動作が異なる不可解な現象が発生し、ちょっとハマりました。

色々と突き詰めていくと、
AVRマイコンとARMマイコンではchar型の扱いが異なることが判明しました。
次のスケッチはchar型の変数aに-1を格納して表示する例です。
void setup() {
  Serial.begin(115200);

  char a;
  a= -1;
  Serial.print("a=");
  Serial.println(a,DEC);
  Serial.print("-1=");
  Serial.println(-1,DEC);

}

void loop() {

}

Arduino UNOの実行結果   Arduino Duo、M0、Bulle Pillボードの実行結果

Arduino          Arduinom0

if 文判定でも差異は明確に現れました。

まあ、char型の変数にマイナス値を使うようなプログラムはあまりないですが、
先日、ゲームの移植でちょっとハマってしまいました。

同じ開発環境でこの不統一はちょっとやめてほしいなぁ

char型についてはちょっと気を付ける必要があります。
私は、int8_t、uint8_tとC99的に記述しています。

« 2017年3月 | トップページ | 2017年5月 »