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

arduino

2017年11月19日 (日)

Arduino STM32で漢字表示

以前、Arduino用でやってみた「Arduino - TV出力(TVoutLibrary使用)で漢字表示」を
Arduino STM32でやってみました。

マイコンボードは、STM32F103C8T6搭載のBlack Pillボードを利用しています。
Blue Pillボードでも動きます)

自作フォントライブラリを利用しています。
  Arduino用漢字フォントライブラリ SPIフラッシュメモリ版
  https://github.com/Tamakichi/Arduino_exfonts


01

動いている様子



結線

02



スケッチ

//
// TTVOutでマルチフォント表示 by たま吉さん 2017/11/18
//  

#include <SPI.h>
#include <W25Q64.h>
#include <exfonts.h>
#include <TTVout.h>

TTVout TV;
exfonts ft;  // フォント管理オブジェクト

// 指定位置に1文字表示
void mputc(uint16_t x, uint16_t y, uint16_t code) {
  byte buf[MAXFONTLEN]; 
  ft.getFontData(buf,code); // フォントデータの取得  
  TV.bitmap(x,y, buf ,0,ft.getWidth(), ft.getHeight());
}

// 指定位置に文字列表示
void mprint(uint16_t x, uint16_t y, char* str) {
  uint16_t wstr[1024];
  int16_t   len;
  
  len = exfonts::Utf8ToUtf16(wstr, str);  // UTF8からUTF16に変換する
  for (uint16_t i=0; i <len; i++) {
    mputc(x, y, wstr[i]);
    if (x + ft.getWidth()*2 < TV.hres()) {
      x += ft.getWidth();  
    } else {  
      x = 0;
      if (y+ft.getHeight()*2 < TV.vres()) {
        y+=ft.getHeight();
      } else {  
        break;
      }
    }
  }      
}

void setup () {
  static const char* text=
   "吾輩わがはいは猫である。名前はまだ無い。"
   "どこで生れたかとんと見当けんとうがつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。"
   "吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。"
   "というのは時々我々を捕つかまえて煮にて食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。"
   "ただ彼の掌てのひらに載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。"
   "掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始みはじめであろう。";
   
  TV.begin(SC_448x216,2); // 第2引数でSPI 1,2を指定(デフォルト 1))
  TV.adjust(2);           // 垂直同期信号補正(デフォルト 0)
  ft.init(PA4);           // フォント管理の初期化
      
  //7種類のフォントサイズで文字列表示
  while(1)
    for (uint8_t i =0 ; i <7; i++) {
      TV.fill(0);
      ft.setFontSize(i);
      mprint(0,0,(char*)text);
      delay(1000*3);
    }
}

void loop () {

}

Arduinoと比べると、SRAMが20kバイトあるため画面解像度448x216ドットを確保出来ました。 表示も速いです。

2017年11月17日 (金)

豊四季 Tiny BASIC for Arduino STM32のファームウェア書込み手順

豊四季 Tiny BASIC for Arduino STM32のファームウェア書込み手順を下記サイトにまとめました。

ブートローダ付きファームウェアのインストール手順

Photo

この手順では、Arduino環境無しにファームウェア(ブートローダ付きスケッチ)を
ボードに書き込むことでが来ます。

ただし、下記の写真のようにUSBシリアル変換モジュール(200円程度)が別途必要です。

1000

2017年11月16日 (木)

Visual Studio 2017 でArduinoを利用する

マイクロソフトの統合開発環境 「Visual Studio 2017 Community 2017」で
Arduino向けプログラムの開発が出来ると聞き、試してみました。

最近のVsual Studioは個人レベルの利用であれば、無償版の範囲でも
かなりの機能が利用できるようです。

プラグイン的な「Arduino IDE for Visual Studio」をインストールすると、
Arduinoのプラグイン的に利用していたArduino STM32もコンパイルと書き込みまで出来ました。

Vs

他に、Androidアプリ開発、マークダウンドキュメント対応と充実しています。
最近のマイクロソフトは個人開発・オープンソース開発者に優しくなった感があります^^

2017年11月15日 (水)

豊四季Tiny BASICでHC-SR04を使った距離計測

豊四季Tiny BASIC for Arduino STM32
超音波距離センサHC-SR04を使った距離計測を試してみました。

HC-SR04は、秋月電子でも販売されていますが、amazonで探すと、200円程度で入手出来るようです。

1000

プログラム

 1 'キョリケイソク
 10 CLS
 20 P1=PB8:P2=PB3:T=180
 30 K=(3315+T*6)/20
 40 GPIO P1,OUTPUT
 50 GPIO P2,INPUT_FL
 60 "loop"
 70 OUT P1,LOW
 80 OUT P1,HIGH
 90 OUT P1,LOW
 100 D=PULSEIN(P2,HIGH,200,1)
 110 ?DMP$(D/100*K,2)
 120 WAIT 300
 130 GOTO "loop" 

PUKSEIN()関数を使って、超音波が反射して帰ってくるパスル幅を調べ、
その時間から距離を求めています。
小数が使えないため、DMP$()という、指定位置に小数点を挿入する文字列関数で
見かけ上、小数表示しています。


接続
HC-SR04 Trig端子 :PB8(5Vトレラントピン)
HC-SR04 Echo端子 :PB3(5Vトレラントピン)
HC-SR04 GND端子 :GND
HC-SR04 VCC端子 :5V
HC-SR04は5V動作のため、Blue Pillボードの5V入力可能(5Vトレラント)ピンを利用します。

動作の様子

正確な計測値とは言えませんが、そこそこ目安となる数字はでていますね。

参考にしたサイト
【Arduino】超音波距離センサ(HC-SR04)の測定精度を向上(気温考慮)

こちらのサイトにもまとめました
超音波距離センサ(HC-SR04)を使った距離計測

2017年11月 3日 (金)

micro:bitはじめました

micro:bitは、子供向けのスクラッチみたいなプログラム環境と思い込んで様子見だった
のですが、MicroPython、mbed、Arduinoも利用可能とうことを知り、入手しました。

02

まずは、ハードウェアスペック
MPU:Nordic nRF51822 ARM Cortex-M0 16MHz RAM 16kバイト Flash 256kバイト
BLE搭載、5x5ドットマトリックスLED、ユーザー利用可能ボタン 2個
加速度センサ、磁気センサ

これだけあれば、そこそこのサイズのプログラムが作成できます。

利用可能開発環境

下記は、公式サポートしている開発環境です。
ブラウザ(クラウド)で利用出来ます。
  ・Javascript(JavaScriptブロックエディターでスクラッチのようにプログラミング可能)
  ・MicroPython(Pythonエディターでプログラム開発)

次が本命の利用したい環境
  ・mbed(BBC micro:bit
  ・Arduoino

早速、Arduinoの開発環境を利用してみました。
開発環境の構築は、adafruit - Micro:bit with Arduinoを参考にしました。
BLE、加速度センサ、磁気センサ、5x5ドットマトリックスLED用ライブラリは、
上記解説サイトの内容に従って別途インストールしました。

試しに、豊四季Tiny BASICのターミナルスクリーン版を動かしてみました。

03

Arduino対応版は取りあえず、無修正で動きました。

01

開発環境周りのドキュメントを調べていくと、
micro:bit runtimeという解説を見つけました。
・micro:bit runtime https://lancaster-university.github.io/microbit-docs/

このサイトのconseptの解説に次の階層図があります。
(画像は、https://lancaster-university.github.io/microbit-docs/concepts/ より引用)

04

プログラム環境はmbedベースであることが分かります。
NordicのSDKがベースになっていて、その上にmbed、 runtimeが乗っています。

ランタイムはmicro:bit DALという名称のようです。
このmicro:bit DALは、mbedの他に、Yotta という環境で利用可能なようです。

Arduinoよりも、mbed、Yottaに手を出した方が良さそうです。

micro:bit DALにはmessageBusというイベント駆動をサポートしているようです。
かなり洗練されたデザイン(設計)がなされています。

 

#include "MicroBit.h"

MicroBit    uBit;

void onButtonA(MicroBitEvent e)
{
    if (e.value == MICROBIT_BUTTON_EVT_CLICK)
        uBit.display.scroll("CLICK");

    if (e.value == MICROBIT_BUTTON_EVT_DOWN)
        uBit.display.scroll("DOWN");
}

int main()
{
    uBit.init();
    uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_EVT_ANY, onButtonA);

    // We don't want to drop out of main!
    while(1)
        uBit.sleep(100);
}

2017年10月22日 (日)

次はSTM32ボードを積極的に使ていきたい(20) BKPの利用

このシリーズのパート20、今回はBKP(Backup register)の利用についてです。

Blue Pill(STM32F103C8T6)では、バックアップ・ドメイン領域と呼ばれる領域に、
ユーザーが自由に利用出来る20バイトのメモリがあります。

このメモリがBKP(Backup register)です。
このBKPは、ボード上のリセットボタンを押してもデータは消えません。
さらに、VBATにボタン電池等での電源バックアップがあれば、ボードの電源を落としても
データは保持されます。

具体的な使い方は次のようなスケッチとなります。
//
// stm32_BKP_exsample.ino (for Arduino STM32)
// BKP利用サンプルプログラム by たま吉さん
// バックアップドメインのメモリ10ワード(20バイト)を利用するデモです.
// バックアップドメインのメモリの性質
//  1)リセットしてもデータは保持される
//  2)さらにバッテリーバックアップ有りの場合、電源OFFでのデータが保持される
//  

#include <libmaple/bkp.h>

void setup() {
  Serial.begin(115200);
  while (!Serial.isConnected())
    delay(100);
  bkp_init();   // BKPの初期化  
  Serial.println("[Menu] 1:Write 2:Read");
}

void loop() {
  uint8_t InputChar;
  if (Serial. available()) {
    switch(Serial.read()) {
    case '1':
      Serial.println("Write data.");
      bkp_enable_writes();    // 書込み可能にする
      for (uint16_t reg=1; reg <= BKP_NR_DATA_REGS; reg++) {
      bkp_write(reg, reg-1);  // データの書込み
      Serial.print("DR"); 
      Serial.print(reg,DEC);
      Serial.print("=");
      Serial.println(reg-1,DEC);
     }
     bkp_disable_writes();  // 書込み禁止にする    
     break;
    case '2':
      Serial.println("Read data.");
     for (uint16_t reg=1; reg <= BKP_NR_DATA_REGS; reg++) {
      Serial.print("DR");
      Serial.print(reg,DEC);
      Serial.print("=");
      Serial.println(bkp_read(reg),DEC); // データの読み込み
     }   
     break;
    }
  }
}

上記のスケッチはメニュー選択で、テストデータを書いたり読んだりしています。
書込み後、リセットボタンを押して再度スケッチを起動してデータを読むと
その内容が保持されていることが確認出来ます。

03

さらに電池によるバックアップをして、電源を切ってみてもデータが
保持されていることが確認できると思います。

01

ボタン電池を使ったバックアップ回路

02

保存出来るデータ量は少ないですが、
EEPROMエミュレーションライブラリを使うよりもお手軽です。
システム設定の保持やゲームのハイスコアの保持等に使えるでしょう。

BKPの利用方法の詳細については、下記にまとめました。
Backup register (BKP) suport (bkp.h) バックアップ・レジスタの利用



Arduino STM32 リファレンスマニュアル 日本語版

Arduino STM32に関するリファレンスマニュアル的なドキュメントが無いので
自分で作成することにしました^^;

作成中のドキュメント:
 ・Arduino STM32 リファレンス 日本語版
  ・Arduino STM32関連情報

現状では、Arduino STM32を使ってプログラムを作成する場合、
リファレンスマニュアルとしては、Arduino STM32のベースとなっている、
LeafLabs, LLCの「Maple Language Reference」を参照しつつ、Adsuino STM32のソースや
フォーラムの投稿を読んで追加・修正をくみ取って利用していました。
これは、かなり効率悪いです。そこで、
Maple Language Reference」をベースに、プログラム作成の過程で調べたことを、
追記し少しずつドキュメントをまとめることにしました。

「せっかくまとめるなら、何か新しいやり方・ツールを使ってみよう」
と思い、Scrapboxを使ってみました。

Scrapbox、なかなか使いやすいです。文章入力中に勝手に自動保存してくれるし、
リンクやプログラムコードの記述がやり易いです。

2017年10月15日 (日)

Arduino STM32スケッチをPlatformIOで利用するメモ

Windows 10にてAtom+PlatformIOでArduino STM32を利用するためメモです。

01

platformio.iniの定義
[env:genericSTM32F103CB]
platform = ststm32
board = genericSTM32F103CB
framework = arduino
upload_protocol = dfu
upload_port = COM4
build_flags = -v

この設定で、USB経由でのスケッチの書込みが出来ました。
ボードはBlue pillですが、フラッシュメモリが128kバイトのためgenericSTM32F103CBを
指定しています。

とりあず、Lチカ出来ました。

Dscn7228

見慣れたArduino STM32のパッケージは下記に配置されいるので、
\ユーザーホーム\.platformio\packages\framework-arduinoststm32

02

ライブラリの配置や、安定版R20170323への差し換えはここをいじれば良さそうです。

2017年10月14日 (土)

豊四季 Tiny BASIC for Arduino STM32 V0.85βの公開

「豊四季 Tiny BASIC for Arduino STM32」を V0.85βに更新しました。
公開サイト: https://github.com/Tamakichi/ttbasic_arduino/tree/ttbasic_arduino_lcd_plus

まだまだテスト不十分のため、β版としています。

OLED(SSD1306、SSD1309、SH1106)、TFT(ILI9341)ディスプレイに対応しました。
グラフィック描画にも対応しています。
TFTディスプレイでは、16ビットカラーに対応しています。

01

写真はSDカードからビットマップファイルをロードして表示している例です。

利用環境としては、次の構成をサポートしました。

04_1

最小構成は①ターミナルコンソール利用となります。
目的に応じて、②~④の表示機器を用意し、オプションのSDカード等を追加します。

04

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

より以前の記事一覧