フォト
2025年3月
            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年2月 | トップページ | 2017年4月 »

2017年3月の9件の記事

2017年3月30日 (木)

次はSTM32ボードを積極的に使ていきたい(12) - 内部RTCの利用

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

2018/08/24 更新
  ・利用環境のArduino STM32安定版(R20170323) 最新版(masterブランチ 随時更新)で
   RTClockライブラリの仕様が異なるため、それぞれのバージョンのサンプルスケッチを
   を掲載するよう、内容の一部を修正しました。 

   最新版の更新が激しいため、
   私は、一部のプログラムは安定版を継続して利用しています。

   最新版の途中で、曜日開始が日曜から月曜に変更されたのに今(08/24)気づきました^^;
   曜日を設定しなくても(0を設定)でも、他の時刻情報で自動で設定されるようです。
   設定しなくても、読出し時に正しい曜日が読み出せました。

スケッチ(Arduino STM32 R20170323安定版対応)

//
// 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);
}



スケッチ(Arduino STM32 最新版 2018/08/24時点)

//
// FILE: stm_RTC_sample.ino
// Arduino STM32 内部RTCを利用して時刻を表示する(最新版対応)
// 作成日 2018/08/24 by たま吉さん
//

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

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

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

  t.year    = 2018-1970;  // 年   [1970からの経過年数]
  t.month   = 8;          // 月   [0-11] 0から始まることに注意
  t.day     = 24;         // 日   [1-31]
  t.weekday = 5;          // 曜日 [0-6] 0:月曜 ~ 6:日曜
  t.hour    = 12;         // 時   [0-23]
  t.minute  = 0;          // 分   [0-59]  
  t.second  = 0;          // 秒   [0-59] 
  rtc.setTime(t);         // 時刻の設定
}

void loop() {
   char str[64];  
   struct tm_t st;   
   rtc.getTime(st);      // 時刻取得  
       
   sprintf(str, "%04d/%02d/%02d [%s] %02d:%02d:%02d",
      st.year+1970,      // 西暦年
      st.month,          // 月
      st.day,            // 日
      wday[st.weekday],  // 曜日
      st.hour,           // 時
      st.minute,         // 分
      st.second          // 秒
   );
   Serial.println(str);
   delay(1000);
}

実行結果

01

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


→ 2017/04/01 追記

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

参考文献
  ・RTClock 内蔵RTC(real time clock:リアルタイムクロック)利用ライブラリ(最新版API)
    https://scrapbox.io/ArduinoSTM32/RTClock

関連記事
  ・次はSTM32ボードを積極的に使ていきたい(18) - Tiny BASIC(4) 内部RTC時刻を電池で保持

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) - Tiny BASIC

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) - 128kB利用可能?

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互換ライブラリ

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しかないようです。

2017年3月12日 (日)

次はSTM32ボードを積極的に使ていきたい(8) - PWMで単音演奏

Arduino STM32環境 Blue PillボードでPWMを使った単音演奏

01

Blue Pillボード(STM32F103C8)でPWMを使った「こいのぼり」の単音演奏をやってみました。
音の出力には圧電スピーカー(圧電サウンダ)を使いました。
ゲームなんかの効果音には使えますね。

演奏の様子
(ちょっと音が小さいです)


回路図

02

スケッチ

「こいのぼり」の演奏部分はスイッチサイエンスさんのサンプルスケッチを流用させていただきました。
SWICHI SCIENCE MAGAZINE - Arduinoで童謡「鯉のぼり」を流してみよう

/*
 *  Arduino STN32
 *  Stm32ボード(STM32F103C8T6)で PWMで任意の周波数を生成する
 *  作成日 2017/01/17 by たま吉さん

 *  説明
 *  ・PB9端子の圧電スピーカーを接続することで任意の周波数を音を出す
 *  ・Timer4 チャンネル 4 を利用しているため、PWM出力ピンはPB9固定

 *  参考にした情報
 *  ・Topic: DUE PWM Frequency (Read 51962 times) 
 *    https://forum.arduino.cc/index.php?topic=131323.15
 *    
 *  サンプル作成に参考にしたサイト
 *  ・Arduinoで童謡「鯉のぼり」を流してみよう
 *    http://mag.switch-science.com/2015/04/29/gwprojact_koinobori/
 */

//
// 音出し
// 引数
//  pin     : PWM出力ピン (現状はPB9固定)
//  freq    : 出力周波数 (Hz) 15~ 50000
//  duration: 出力時間(msec)
//
const int pwmOutPin = PB9;  // PWM出力ピン
void _tone(uint8_t pin, uint16_t freq, uint16_t duration = 0) {
  if (freq < 15 || freq > 50000 ) {
     _notone(pin);
  } else {
    uint32_t f =1000000/(uint16_t)freq;
    Timer4.setPrescaleFactor(72); // システムクロックを1/72に分周
    Timer4.setOverflow(f);
    Timer4.refresh();
    Timer4.resume(); 
    pwmWrite(pin, f/2);  
    if (duration) {
      delay(duration);
      Timer4.pause(); 
    }
  }
}

//
// 音の停止
// 引数
// pin     : PWM出力ピン (現状はPB9固定)
//
void _notone(uint8_t pin) {
    Timer4.pause();  
}

//HardwareTimer pwmtimer(2);
#define PIN pwmOutPin
void setup() {  
  pinMode(pwmOutPin, PWM);
  _tone(pwmOutPin,440, 100);
  _tone(pwmOutPin,880,100);  
  delay(500);

  _tone(PIN, 330, 150);
  delay(150);
  _tone(PIN, 294, 150);
  delay(150);
  _tone(PIN, 262, 300);
  delay(300);
  _tone(PIN, 294, 300);
  delay(300);
  _tone(PIN, 330, 300);
  delay(300);
  _tone(PIN, 440, 300);
  delay(300);
  _tone(PIN, 392, 150);
  delay(300);
  _tone(PIN, 330, 150);
  delay(150);
  _tone(PIN, 330, 150);
  delay(150);
  _tone(PIN, 330, 300);
  delay(300);
  _tone(PIN, 294, 150);
  delay(150);
  _tone(PIN, 262, 150);
  delay(150);
  _tone(PIN, 294, 300);
}

void loop() {
  
}


Arduino STM32では音を出すためのAPIとしてtone()関数があります。
  参考:  ・Arduino for STM32 - tone() and notone() have been added to the libmaple core

使ってみると音がちょっと汚いです。濁ったような音です。
原因はタイマー割り込みを使って、出力をオン・オフしているためです。
他の様々な割り込みの影響により、タイミングがずれたりして濁った音になっています。
(USBシリアル、SysTicの時間処理等)

また、このやり方だとCPU負荷もそれなりにかかります。
今後のビデオ出力を使ったゲーム作成なんかに使うにはちょと問題ありです。

そこで、PWM出力に置き換えて綺麗な音が出るようにしました。
音が出ている間はCPU負荷がかかりません。

問題点としては、利用するピンが固定となることです。標準のtone()では任意のピン
を使って音が出せます。

2017年3月 9日 (木)

IchigoJam用画像コンバータを少々改良

以前作成した「IchigoJam用画像コンバータ」をちょっとだけ改良しました。

  Top

  ・過去の関連記事
    IchigoJamで疑似グラフィックを使った画像の表示
    IchigoJamでQRコードを表示してみる

改良点
・ドラック&ドロップ対応
・画像ファイルパスを直接入力出来るように修正
・Windows 10対応(動作確認)

GitHubにてこの改良プログラムの公開しました。
・Tamakichi/IchigoBmpConv  IchigoJam用画像コンバータ
   https://github.com/Tamakichi/IchigoBmpConv

動作確認にQRコード表示プログラムを作成しました。

09

前回はMS Wordの差し込み印刷機能を使ってブログURLをQRコードに変換したのですが、
Wordのバージョンアップのためか、イチゴジャムの画面解像度64x48ドットに収まるサイズの
画像が作成出来なくなってしまいました。

そこで、下記のサイトを利用させていただいてQRコードを作成しました。
・QRコードBlog
  http://www.qrcodeblog.com/date/qrcgi/

  誤り訂正レベル:Q(25%)
  バージョン:自動
  サイズ:1
を指定して作成しました。この指定で41x41ドットの画像が作成出来ました。
これを元にしてペイントツールで加工して64x48の変換用画像を作成しました。

02

これを作成したツールで変換し、プログラムソースをIchigoJamに転送します。
(転送はこれこれを使って出来ます)

転送したプログラムをIchigoJamで実行

10

スマートフォンでこのQRコードが読めました。

03


2017年3月 5日 (日)

Arduinoで使えるcursesライブラリ

Arduino等の組み込みマイコン系で
「シリアル経由でLinuxのviエディタみたいな表示や制御をしたい、cursesが使いたい!」
と思い、調べたところ、
機能縮小版のMCURSESなるもを見つけました。

本家サイトMCURSESでは、Arduino用ではないものの、AVRマイコン、STM32マイコン
には対応しているのでArduinoへの移植を試みていたのですが、
既に移植した方がおられました(下記)。

・ChrisMicro/mcurses
  https://github.com/ChrisMicro/mcurses

Arduino用にライブラリ化(サンプルスケッチ付き)されて公開されています。
ダウンロード&ライブラリ登録してサンプルスケッチを動かしてみました。

フルスクリーン16進ダンプ表示のバイナリエディタ

01

ArduinoのSRAM上のデータを編集することが出来るバイナリエディタです。
矢印キーでカーソル移動できます。上限、下限に達すると画面がスクロールします。
カーソル位置のデータの修正が可能です。
TABキーで16進数表示部とASCII表示部の行き来が出来ます。

文字に色を付けて表示するデモ

02

文字に色を付けたりすることが出来ます。

MCURSESで利用可能なAPI関数を見ると、
残念ながらWINDOW(本家cursesはマルチウィンドウ機能がある)は使えないようです。
まあ、バッファにメモリを消費しますから無理でしょう。
WINDOWが使えると、Windowsのようなドロップダウンメニュー、ポップアップメニュー
っぽいのが簡単に実装できるのですが..

それでも、ちょっとしたメニュー画面や計測データのリアルタイム表示、簡易グラフ表示
なんかは出来そうです。

フルスクリーンテキストエディタっぽいのが欲しいと思い探してみると、
下記のフォーラムにて
  ・MCURSES - Mini Curses Bibliothek für Mikrocontroller
   http://www.mikrocontroller.net/topic/227312
フルスクリーンテキストエディタsmed.cが公開されていました。
Linux用のコードっぽいですが、強引に動かしてみました。

03

取りあえず、、フルスクリーンにて文字入力が出来ました。
だたし、BS,DELキーで文字削除できません。
そこそこ動くので、実装の参考にはなりそうです。

« 2017年2月 | トップページ | 2017年4月 »