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

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月30日 (木)

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

Bule Pillボード(STM32F103C8T6)の内部RTCを使った時刻表示

スケッチ

//
// FILE: stm_RTC_sample.ino
// Arduino STM32 内部RTCを利用して時刻を表示する
// 作成日 2017/03/30 by たま吉さん
//

#include <RTClock.h>
#include <time.h>

RTClock rtc(RTCSEL_LSE);
char *wday[] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};

// セットアップ
void setup() {
  struct tm t;  
  Serial.begin(115200);
     while (!Serial.isConnected()) delay(100);

  t.tm_isdst = 0;             // サーマータイム [1:あり 、0:なし]
  t.tm_year  = 2017-1900;     // 年   [1900からの経過年数]
  t.tm_mon   = 3-1;           // 月   [0-11] 0から始まることに注意
  t.tm_mday  = 30;            // 日   [1-31]
  t.tm_wday  = 4;             // 曜日 [0:日 1:月 2:火 3:水 4:木 5:金 6:土]
  t.tm_hour  = 22;            // 時   [0-23]
  t.tm_min   = 10;            // 分   [0-59]  
  t.tm_sec   = 0;             // 秒   [0-61] うるう秒考慮
  rtc.setTime(&t); // 時刻の設定
}

void loop() {
   time_t tt; 
   struct tm* st;
   char str[64];

   tt = rtc.getTime();   // 時刻取得
   st = localtime(&tt);  // 時刻型変換
    
   sprintf(str, "%04d/%02d/%02d [%s] %02d:%02d:%02d",
      st->tm_year+1900,   // 西暦年
      st->tm_mon+1,       // 月
      st->tm_mday,        // 日
      wday[st->tm_wday],  // 曜日
      st->tm_hour,        // 時
      st->tm_min,         // 分
      st->tm_sec          // 秒
   );
   Serial.println(str);
   delay(1000);
}

実行結果

01


Blue Pillボードでは動作しますが、Black Pillボードでは動作しませんでした。
動かすとフリーズします。


2017/04/01 追記

Black Pillボードでも動作するようです。
SNSにて上記プログラムが動作することを確認して頂きました。
私の持っているBlack Pillボードが調子悪い(不良)みたです。


2017年3月25日 (土)

LED electronic display

AliexpressでLEDドットマトリックスを使った小型製品を見つけて衝動買いしました。

$7.79(現時点では$9.39)で充電出来てケーブルやACアダプタ付きです。

LED electronic display
02

中身はこんな感じです。

07

マニュアルはありませんが付属のCDにドキュメント類が入っていました。

充電中

こんな感じの表示となります。アニメーション表示します。
作りこみは結構いい感じです。

06


付属ソフト


中華製なので、念のためウィルスチェックを行ってから、ソフトをインストールしました。
2種類のソフトがインストールされました。

日本語対応しています。
ただし、若干怪しい。「選択」「画像」の次の「倒語」は縦表示のことです。
デフォルトの設定では、正しく表示できません。文字が崩れます。

メニュー[ツール]-[オプション]で縦ドット数を11に変更すると正しく表示出来ました。

03

使い勝手は良いです。
複数のメッセージを登録し、それぞれにモード(表示パターン)が指定出来ます。
複数のメッセージは後ろのボタンで繰り返しのパターンの設定が出来ます。

もう一つのソフトは、プレビュー表示の部分においてマウス操作でお絵かき出来ます。
フォントの微妙な修正が出来ます。

04


表示の様子


ドット数は縦11ドット、横44ドットくらい(目測)です。
縦が11ドット使えれば日本語表示にも耐えられます。

08

動作の様子


後りにマグネットと、ピンがあるので服に名札として付けたり、
ホワイトボードに付けたりできます。

どういうパーツを使っているのか、分解したかったのですが、
裏ぶたが外せまん。このLED部分のパーツだけで手に入れたいところです。

趣味の電子工作において、この作りこみとユーザーインターフェースは
参考になります。

2017年3月23日 (木)

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

Blue PillでIchigoJamのような、BASICインタプリタを動かしたいと思い、
vintagechipsさんが公開している豊四季タイニーBASICを動かしてみました。

関連情報
   ・電脳伝説 Vintagechips - 豊四季タイニーBASIC確定版

シンプルなプログラムでいい感じです。
対話型 BASICインタプリタの売り、「トライ&RUN」を行うには編集機能がちょっと弱いです。
そこで、IchigoJamのような感じでプログラム入力が出来るよう、ちょっと機能追加しました。

動画はtinyBASIC 起動直後の表示メッセージに行番号とPRINT文付けて
プログラム化してしまう操作デモです。
フルスクリーン編集対応しているからこそ出来る操作です。


MCURSESを使って手を加えただけで、結構イケてる環境にビフォー&アフターしました。
MCURSESスバラシイ..

スクリーン制御が出来ると凝ったプログラムが作れますね。
次のコマンドを追加しました。

CLS,LOCATE,COLOR,ATTR,WAIT

02_2

こんな感じで指定した位置の文字を色を付けて表示出来ます。

修正版を下記にて公開します

・Tamakichi/ttbasic_arduino 豊四季タイニーBASIC for Arduino 修正版 V0.1
  https://github.com/Tamakichi/ttbasic_arduino
まだまだ、ガンガン修正していきます.

Blue Pillでは、USBでのシリアル接続での利用となります。
Arduino MEGAでも動作しました。Arduno UNOはメモリ不足で動きません。

01_2

2017年3月19日 (日)

脈拍パルス(?)センサーを試してみる

Aliexpressで見つけた、脈拍パルス(?)センサー

02_2


到着した部品は、写真見本に比べると若干、状態が悪いです。

Dscn6501

無理やりリード線を捻じ曲げて調整しました。

Dscn6503

Arduinoとの接続は3線(GND、VCC、アナログ入力)のみです。

Dscn6502

スケッチは、Arduinoフォーラムに投稿されているものを使用しました。
https://forum.arduino.cc/index.php?topic=209140.msg1941983#msg1941983



実行して、シリアル出力をArduino IDEのシリアルプロッタでモニターします。

01

測定はこんな感じでよいのかなぁ
赤外線送信部(LED)の受光センサーの間に指を入れます。
LEDの向き、指の位置で測定値がかなり変わってしまいます。

この調整が難しいです。あまり実用的でないです。
プログラムでフィルタリングやなにやら色々とやらないとダメっぽいです。

Dscn6504

赤外線LEDとセンサーとしてフォトトランジスタを使っているようです。

仕組みはよくわかりませんが、
センサーにあてた指を動かすと、測定値が変化するので、
脈打ったときの微妙な指の膨張(または、上下左右の動き)を検出して
心拍としているのでしょうかね。

2017/03/24 追記
脈拍パルス検出は、血中ヘモグロビンの近赤外線吸収の性質を利用しているようです。
(caskazさん、情報ありがとうございます)

下記の記事にてその仕組みが分かり易く解説されています。

参考記事
・ケータイ Watch ケータイ用語の基礎知識「377回:脈拍センサー とは」
  http://k-tai.watch.impress.co.jp/cda/article/keyword/40664.html

このセンサーモジュール、結局は単なる赤外線LEDとフォトトランジスタが乗っている
に過ぎず、特別なことをやっているわけではないですね。
汎用的な部品使って、100円くらいで実装出来そうです。


2017年3月16日 (木)

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

Blue Pillボードのフラッシュメモリの容量の確認

Blue PillボードにはARMマイコン STM32F103C8が搭載されています。

STM32F103C8は、公式にはフラッシュメモリ容量は64kバイトなのですが、
実際には128kバイトのものが流通しているとのことです。

実際にどうなのか、ちょっと確かめてしました。
まずは、搭載マイコンの刻印のチェック



STM32F103C8T6」と明記されています。

データシートにより、このマイコンのフラッシュメモリサイズは64kバイトのはずです。

03

次に、実際にフラッシュメモリサイズを128kバイトと仮定して、
その領域の最終領域のアドレス 0x801FC00 に書き込みを行ってみました。
フラッシュメモリはページ単位(1kバイト)で消去、16ビット単位で書き込みが出来ます。

04

書き込み確認用スケッチ

特定の文字列をフラッシュメモリ上の指定アドレスに書き込んで、その内容を
確認するプログラムです。
64kバイト目のページと128kバイト目のページに異なる文字列を書きこんで、
シリアル接続にて内容を確認します。

//
// FILE stm31_testFlash
// フラッシュメモリ書き込みテスト for Arduino STM32
// 作成日 2017/03/16 by たま吉さん
//

#define FLASH_PAGE_SIZE        1024
#define FLASH_START_ADDRESS    ((uint32)(0x8000000))

#include <string.h>
#include "stm32_hexedit.h"
#include "TFlash.h"

uint8_t str1[] = "1234567890A";
uint8_t str2[] = "abcdefghij";

void Arduino_putchar(uint8_t c) {
  Serial.write(c);
}

char Arduino_getchar() {
  char c;
  while (!Serial.available());
  return Serial.read();
}

uint32_t adr0 = FLASH_START_ADDRESS + FLASH_PAGE_SIZE *  63;
uint32_t adr1 = FLASH_START_ADDRESS + FLASH_PAGE_SIZE *  127;

void setup() {
  Serial.begin(115200);
  while (!Serial.isConnected()) delay(100);
  setFunction_putchar(Arduino_putchar); 
  setFunction_getchar(Arduino_getchar); 
  initscr();

  // フラッシュメモリ書き込みテスト
  TFlash.unlock();
  TFlash.eracePage(adr0);
  TFlash.write((uint16_t*)adr0, str1, strlen((char*)str1));
  TFlash.eracePage(adr1);
  TFlash.write((uint16_t*)adr1, str2, strlen((char*)str2));
  TFlash.lock();
}

void loop() {
  // 64kバイトフラッシュメモリ最終ページの参照
  clear();
  hexedit2 (adr0, false);

  // 128kバイトフラッシュメモリ最終ページの参照
  clear();
  hexedit2 (adr1, false);  
}

スケッチを実行して確認すると、64kバイト目のページ、128kバイト目のページに
それぞれちゃんと書き込めていました。

ページ63、64kバイト目のページへの書込みの確認

06

ページ127、128kバイト目のページへの書込みの確認

05

ということで、STM32F103C8T6 ですが128kバイト利用出来ます。
ただし、生産ロット・時期により64kバイトの可能性もあります。

動作確認で利用した、フラッシュメモリ書き込みは色々と使えそうなので
ライブラリ化しました。

   ・Arduino STM32用 内部フラッシュメモリ書き込みライブラリ
     https://github.com/Tamakichi/ArduinoSTM32_TFlash

     まだ、ドキュメント等は未作成です。

     動作確認したスケッチはそのまま、ライブラリのサンプルとして入れています。
     別途、mcursesライブラリ(https://github.com/ChrisMicro/mcurses)が必要です。

 

2017年3月14日 (火)

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

TVoutライブラリと互換性の高いライブラリ

「次はSTM32ボードを積極的に使ていきたい(7)」で作成した、
「Arduino STM32用 NTSCビデオ出力ラブラリ」の上位層のライブラリを作成しました。

Arduino用のTVoutライブラリと互換性の高いAPIを実装しました。
TVoutのソースの一部を利用しています。

02

GitHubの方に登録&公開しました。
  ・Arduino STM32 TVoutライブラリ - TTVout
   https://github.com/Tamakichi/ArduinoSTM32_TVout


サンプルスケッチの動作の様子です
(だだし、古いバージョンのものです)




回路図(接続図)は次のような感じとなります。

01
使い方等については、公開ページの説明を参照願います。


ライブラリの実装において、ARM cortex-M3のビットバンド機能を使ってみました。
メモリ上のデータをビット単位で効率よく操作する仕組みです。

具体的には、1ビット毎にワードアドレス(32ビット)を割り付け、
そのアドレスへの読み書きでビット単位の読み書きが出来る仕組みです。

ビット操作を行うドット描画部分関数sp()に適用しました。
このsp()は、直線や円等の描画にも利用しています。
以下がその関数の実装部分です。

//
// ドット描画
// 引数
//  x:横座標
//  y:縦座標
//  c:色 0:黒 1:白 それ以外:反転
//
static void inline sp(uint16_t x, uint16_t y, uint8_t c) {
#if BITBAND==1
  if (c==1)
    _adr[_width*y+ (x&0xf8) +7 -(x&7)] = 1;
  else if (c==0)
    _adr[_width*y+ (x&0xf8) +7 -(x&7)] = 0;
  else 
    _adr[_width*y+ (x&0xf8) +7 -(x&7)] ^= 1;
#else
  if (c==1)
    _screen[(x/8) + (y*_hres)] |= 0x80 >> (x&7);
  else if (c==0)
    _screen[(x/8) + (y*_hres)] &= ~0x80 >> (x&7);
  else
    _screen[(x/8) + (y*_hres)] ^= 0x80 >> (x&7);
#endif
}

BITBANDが1の場合、ビットバンドを利用してフレームバッファのビットを操作します。
BITBANDが1でない場合は、ビットバンドを利用しません。かわりにビットシフト等にて
ビット操作を行います。

上記ソースでビットバンドを利用している場合と利用していない場合で
フレームバッファのアドレスが_adr、_screenといった具合に異なるのは、ビットバンドでの
アドレス操作が32バイト単位のため、型変換とアドレス変換を行っているためです。
    _adr = (volatile uint32_t*)(BB_SRAM_BASE + ((uint32_t)_screen - BB_SRAM_REF) * 32);

画面224x216ドットを1点ずつ点を描画して全面白色処理を行った場合、
ビットバンド機能を利用すると、全体で10%くらいパフォーマンスが向上しました。
10%は大きいです。

このビットバンド機能、ARMでもCortex-M3、Cortex-M4しかないようです。

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