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

arduino

2019年7月16日 (火)

Arduino用美咲フォントライブラリを更新しました

Arduino用美咲フォントライブラリ 2つを更新しました。

01_20190716204201

更新したライブラリ

Arduino用 美咲フォントライブラリ 教育漢字・内部フラッシュメモリ乗せ版(UTF16/8対応)
   https://github.com/Tamakichi/Arduino-misakiUTF16

Arduino用 美咲フォントライブラリ 教育漢字・内部フラッシュメモリ乗せ版 SJISバージョン
   https://github.com/Tamakichi/Arduino-misakiSJIS

※ 美咲フォントは、Little Limitさんが開発し、配布しているフォントです。
  ・8×8 ドット日本語フォント「美咲フォント」
     http://littlelimit.net/misaki.htm

主な変更点

ライブラリサイズ 約1.7kバイト弱 削減
   美咲フォントは8x8ドットのフォントなのですが、実質的には8x7ドットのため、
  1文字あたり1バイトを減らすことが出来ました。
  ライブラリサイズ的には、約15kバイト強となります。

SJISバージョンの半角全角変換不具合対応
   ","が全角に変換できませんでした。

#include <arduino.h> ⇒ #include <Arduino.h>に訂正
   大文字小文字を区別するOS(Linux、Mac)でエラーとなる不具合に対応しました。

ライセンスについて追記
  このフォントライブラリについては、
 「美咲フォント」と同様にフリー(自由な)ソフトウエアです。
  あらゆる改変の有無に関わらず、また商業的な利用であっても、自由にご利用、複製、再配布することができます。
  ただし、全て無保証とさせていただきます。


2019年7月13日 (土)

Arduino機能拡張版の修正中(5) タイマー割り込み機能の追加

豊四季タイニーBASIC for Arduino機能拡張版(+ VFD MW25616L対応)の修正、
タイマー割り込み機能を追加しました。

Tamakichi/ttbasic_MW25616L
   ブランチ(随時更新) https://github.com/Tamakichi/ttbasic_MW25616L/tree/update_to_v007

追加コマンド
■ タイマー割り込みの定義
  ON TIMER 周期 GOTO | GOSUB 行番号|ラベル

  周期はミリ秒単位 1 ~ 32767

■ タイマー割り込みのオン・オフ指定
  TIMER ON | OFF

サンプルプログラム

10 ON TIMER 500 GOSUB "BLINK"
20 GPIO 13,OUTPUT:D=LOW:TIMER ON
30 "LOOP":GOTO "LOOP"
40 "BLINK":OUT 13,D
50 IF D ?"Blink!"
60 D=!D
70 RETURN

サンプルプログラムでは、
10行で500ミリ秒毎に、"BLINK"ラベルのある40行のサブルーチンを呼び出すように定義しています。
20行は、LED用の13ピンを出力設定にし、TIMER ONでタイマー割り込みを開始しています。

30行は、"LOOP"ラベルの行、すなわち30行にジャンプです。ここ30行で無限ループを繰り返します。
40行~70行は、タイマー割り込みで呼び出される処理です。LEDを点滅させて、画面に"Blink!"を出力します。

実行時の出力

01_20190713203001

う~ん、
タイマー割り込みが出来れば、
「何か面白いことが出来るのでは?」と思い、組み込んだのですが
使い道が浮かびません。
まあ、イベント処理の実装はちょっと勉強になったので良しとします。

タイマー割り込みは、Timer1ライブラリを利用しました。
コンパイルにも別途、Timer1ライブラリが必要です。 (2019/07/16 本体に組み込みました)


タイマーイベントキューは最大1個としています。
呼び出される処理が、追いつかない場合はイベントは破棄されます。
ですので、呼び出される処理内でカウントして時刻を刻むような処理において、
イベントが破棄された場合は、カウント数がずれます。
回避策として、Windowsみたいに、多重のコマンドイベントが重なる場合は、
1つのイベントにまとめて回数情報を付加する等の処理等が考えられるのですが、
まあ、これで良しとします。

ピン変化イベントも追加する予定でしたが、どうしよう ...

2019年7月 8日 (月)

4連8x8ドットLEDマトリックスを試してみる 続編(2)

以前書いた記事「4連8x8ドットLEDマトリックスを試してみる 続編」に関して
スクロール表示ではなく、固定メッセージを表示したいとの質問があり、ちょっとやってみました。

ハードウェア構成は、前回のSDカードモジュールを使わず、SDカードシールドを使っています。
この方が結線が楽ちんですね。SDカードシールドは意外と安いです。

Dscn1883

動作している様子



スケッチ: ダウンロード - max7219_test3a.zip

  別途自作ライブラリ sdfonts を利用しています。
   ・sdfonts : Arduino用漢字フォントライブラリ SDカード版
     https://github.com/Tamakichi/Arduino-KanjiFont-Library-SD


スケッチを直接貼り付けて掲載したかったのですが、
ArduinoのHTML形式コピーのスケッチを貼るとココログの編集画面が100%暴走するようになり、
掲載出来なくなってしまいました。
まだまだ、リニューアルの後遺症が残っているようです。

代わりに、GitHub(gist)を使って掲載します。


追記

このスケッチで利用している、ビットマップ操作を行う処理、
機能強化&ライブラリ化してGitHubに登録していたことをすっかり忘れていました。
しかも、マニュアルを作成せず、登録しただけ...

 ・Arduino ビットマップ操作ライブラリ
    https://github.com/Tamakichi/libBitmap

暇をみて、ドキュメントを追記しますです。

2019年7月 7日 (日)

豊四季タイニーBASIC for Arduino機能拡張版の修正中(4)

豊四季タイニーBASIC for Arduino機能拡張版(+ VFD MW25616L対応)の修正、
前回から、美咲フォントの漢字選定の変更やらダイエットやらを行いましした。
(コード見直しで500バイトくらいダイエット出来たのですが、機能追加で差し引き0です)

・Tamakichi/ttbasic_MW25616L
   ブランチ(随時更新) https://github.com/Tamakichi/ttbasic_MW25616L/tree/update_to_v007

見た目的には、前回とあまり変わらないのですが、修正で"埼玉"が表示出来るようになりました。

動いている様子



プログラム

10 NINIT ARRAY,64
20 NBRIGHT 1
30 FOR N=1 TO 5
40 C=RND(255)
50 FOR I=0 TO 3
60 NCLS 0
70 NLINE I,I,7-I,7-I,C,1
80 WAIT 150
90 NEXT
100 NEXT
110 NMSG 80,RGB(7,0,0),"こんにちは、埼玉♪"
120 NMSG 80,RGB(0,0,3),"今日は、7月7日です。"
130 GOTO 30


色々と悩んだ挙句、次のフォントを選定しました。
年号、季節、時刻、天気、方向、単位、地形、色を強化しました。

01_20190707203001

フォントは約5kバイト容量を喰うため、他の機能をOFFにする必要があります。
オプション指定で、フォントの利用を無効にすることも出来ます。

また、英数記号・カタカナ・ひらがな 288文字のみ利用可能とするオプション指定も
用意しました。この場合は3kバイト程度の消費となります。

NeoPixel制御はこれくらいにして、次はタイマー割り込み機能に着手します。


2019年6月27日 (木)

豊四季タイニーBASIC for Arduino機能拡張版の修正中(3)

豊四季タイニーBASIC for Arduino機能拡張版(+ VFD MW25616L対応)の修正中です。
前回から、さらにNeoPixcelを制御するコマンドを追加しました。

・Tamakichi/ttbasic_MW25616L
   ブランチ(随時更新) https://github.com/Tamakichi/ttbasic_MW25616L/tree/update_to_v007

02_20190627200601

NeoPixel的には1個のLEDあたり、24ビット色なのですが、今回は、メモリ制約等を考慮して、8ビット色としました。
また制御できるLEDは最大で64個までとしました。

NeoPixelのリボン・スティック形状(ストレート)、リング形状、8x8ドットマトリックス形状に対応しました。

追加コマンド(×は未実装、いずれ対応する予定)
 補足: コマンドの更新flgは、デフォルト値が1、0を指定した場合はバッファへの書き込みのみで、表示に反映しません。
         NUPDATEで、バッファ内容を表示に反映出来ます。

■ 初期設定
   NINIT バッファアドレス,ピクセル数
   バッファアドレスには、仮想アドレスを指定します。1ピクセルあたり1バイト必要です。

■ 輝度設定
   NBRIGHT 輝度
   輝度は0(低)~5(高)の範囲で指定します。

■ 表示クリア
   NCLS [更新flg]

■ 指定LEDの色設定
   NSET 番号,色[,更新flg]
   番号はLEDのピクセル番号(0~)、色は0~255(RGB関数を使うと便利)

■ 8x8マトリックスの指定位置にピクセル設定
   NPSET X,Y,色[,更新flg]

■ 8x8マトリックスにメッセージ文表示
   NMSG 色,速度,メッセージ文
   速度はスクロール時のウェイト時間(ミリ秒単位)

■ 8x8マトリックスを指定方向に1ピクセルスクロール
   NSCROLL 方向[,更新flg]

■ 8x8マトリックス ライン描画
   NLINE X1,Y1,X2,Y2,色[,モード] [,更新flg]
   モードは、0:直線(デフォルト)、1:矩形、2:矩形塗りつぶし

■ バッファ表示反映
  NUPDATE

■ LEDの表示をシフト
   NSHIFT 方向[,更新flg]
   LEDの表示を1つずらします。
   先頭のLEDの色は最後尾のLEDに設定されます。ループとなります。

■ 8ビット色コード取得
  RGB(赤,青,緑)

■ 8x8マトリックス 指定座標色コード取得
  NPOINT(X,Y)

結線

NeoPixel

Arduino

1 VDD

5V

2 DOUT

(未接続)

3 VSS(GND)

GND

4 DIN

MOSI(11ピン)



NeoPixelを制御するプログラムの例

01_20190627201201

動いている様子

色々とメッセージを表示してみたのですが、
やはり、文字が足りません。漢字はもう少し選定を見直す必要があります。

まだまだ、色々とと見直し中です。
う~ん、メモリが足りず中々厄介です。


追記 2019/06/28

1メートル 30個LED搭載テープ(リボン)を制御してみました。

Dscn1862

プログラムで2点(赤と青)を往復運動させています。



プログラムはこんな感じです。

10 NINIT MEM,30
20 NBRIGHT 5
30 NCLS
40 NSET 0,RGB(0,0,3)
50 NSET 1,RGB(7,0,0)
60 N=0:D=0
70 NSHIFT D
80 N=N+1
90 IF N=28 N=0:IF D=0 D=1 ELSE D=0
100 WAIT 30
110 GOTO 70

10行で、NeoPixel用のメモリ領域として、仮想アドレスMEMから30個分30バイトを確保しています。
20行で、輝度を最大の5にしています。
30行で、念のためすべての表示をクリア
40行、50行で0番目、1番目のLEDに青、赤の色を設定して表示しています。
60行のNはNSHIFTコマンドの実行回数のカウント用、DはNSHIFTの方向引数です。
70行のNSHIFT Dは、LEDの表示を前または後ろに1つ分移動します。
80行で移動数をカウント、
90行で方向転換するための判定と、方向Dの値を逆方向に設定しています。
100行はウェイト
110行は70行にジャンプして繰り返し表示

プログラム次第で色々と面白い動き、表示が出来ると思います。

追記 2019/06/29 

1メートル 30個LED搭載テープ(リボン)制御のその2です。
全LEDを一括更新する例として、全LEDを0.5秒間隔で赤、緑、青と変化させています。

Dscn1864

動いている様子



プログラムはこんな感じです。

10 NINIT MEM,30:NBRIGHT 3
20 NCLS
30 @(0)=RGB(7,0,0),RGB(0,7,0),RGB(0,0,3)
40 C=0
50 FOR I=0 TO 29
60 NSET I,@(C),0
70 NEXT I
80 NUPDATE
90 C=C+1:IF C=3 C=0
100 WAIT 500
110 GOTO 50

50行~70行で全LEDの色を設定しています。
60行のNSET I,@(C),0 で各LEDの色の設定をしているのですが、
3番目の引数の0を指定することで、バッファのみの書き込みとなります。
80行のNUPDATEで一括してバッファの内容をNeoPixelに反映させています。

60行は、次の処理と等価です。
 POKE MEM+I,@(C)
10行のNINITで指定したアドレスのデータに直接値を設定して、
NUPDATEで表示に反映させることも出来ます。


上記に、輝度制御を追加したバージョン



プログラムはこんな感じです。

10 NINIT MEM,30:NBRIGHT 0
20 NCLS
30 @(0)=RGB(7,0,0),RGB(0,7,0),RGB(0,0,3)
40 C=0
50 FOR I=0 TO 29
60 NSET I,@(C),0
70 NEXT I
80 NUPDATE
90 C=C+1:IF C=3 C=0
100 WAIT 200
110 FOR I=1 TO 5:NBRIGHT I:NUPDATE:WAIT 200:NEXT I
120 NBRIGHT 0:NUPDATE
130 GOTO 50

110行~120行で輝度を変化させる処理を行っています。
NBRIGHTコマンドで輝度を指定します。表示への反映はNUPDATEの実行します。

NBRIGHTコマンドはちょっと見直そうと思います。
 ・NUPDATEを呼び出さずに、表示に反映
 ・輝度を-3 ~ 5 として、マイナス値で減光出来るようにする

2019年6月13日 (木)

Arduino Web Editorを試してみる

ブラウザ上でArduinoのスケッチの開発が出来る、「Arduino Web Editor」を試してみました。
クラウド形式の開発環境です。

以前よりもかなり使えるようになっていました。
Arduino.ccが適用している「Arduino Create」というサービスの中にあります。

利用には、アカウントの登録が必要ですが無料(100Mバイトまで)で利用出来ます。

01_11

エディタの使い勝手は、Arduino IDEとほぼ同じ感覚で利用出来ます。
ブラウザにプラグインをインストールすることで、Arduinoへのスケッチ書き込みも可能です。

試しに、やろうと思っていたNeopixelのライブラリ作成をブラウザ上でやってみました。

02_7

書き込みも問題なく出来ました。
中々使い勝手も良いです。

03_3

このNeopixelのライブラリは、
豊四季タイニーBASIC for Arduino機能拡張版(+ VFD MW25616L対応)
に組み込む予定です。


2019年6月11日 (火)

豊四季タイニーBASIC for Arduino機能拡張版の修正中(2)

先日の豊四季タイニーBASIC for Arduino機能拡張版(+ VFD MW25616L対応)の修正計画、
美咲フォントを組み込みました。

・Tamakichi/ttbasic_MW25616L
   ブランチ(随時更新) https://github.com/Tamakichi/ttbasic_MW25616L/tree/update_to_v007

コマンドとしては、次の関数を追加しました。
 ・GETFONT(フォント格納アドレス、シフトJISコード)

次のような感じで、指定した文字のフォントデータを取得することが出来ます。

01_10

これで、LEDマトリックス等にメッセージ表示が出来ると思います。
ただし、Arduinoのフラッシュメモリ的に厳しくて、フォントデータは500文字分に絞っています。
(美咲フォントの組み込みは5kバイト程、フラッシュメモリを消費します)

500文字の内訳は非漢字が287文字、漢字213文字です。
500文字は次の通りです。

02_6   
 
漢字は、新聞などでの利用頻度の多い上位250字を見て文字を採用しましたが、
なんとなく偏っている気がします。漢字はもう少し調整しようと思います。

2019年6月 8日 (土)

豊四季タイニーBASIC for Arduino機能拡張版の修正中

豊四季タイニーBASIC for Arduino機能拡張版(+ VFD MW25616L対応)の見直しを行い、
修正作業を行っています。

・Tamakichi/ttbasic_MW25616L
   ブランチ(随時更新) https://github.com/Tamakichi/ttbasic_MW25616L/tree/update_to_v007

主な修正点(予定含む)
・冗長部等の見直しによるプログラムサイズのダイエット(ほぼ済)
・MML処理の見直し、不具合対応(済)
・プログラムソースを機能別にファイル分割(済)
・NEXT文で変数名を省略可能にする(済)
・配列変数の領域増量(済)
・美咲フォント(400文字程度版)の組み込み(未)
・Neopixel対応(未)
・4連LEDマトリックス対応(未)
・HD44780コントローラ(互換品含む)キャラクタ液晶対応(未)
・イベント処理(タイマーイベント、外部割込み、エラー発生)(未)

フラッシュメモリ、SRAMの容量的に用途によって機能を選択する形式でのサポートになります。

現時点で、コア部分(すべての追加機能をオフ)のスケッチが22628バイトです。
残りの10kバイトで美咲フォント+Neopixel or 4連LEDマトリックス で
メッセージ表示なんかをBASIC言語で制御できるのではないかと思い、調整中です。


2019年6月 1日 (土)

Arduino STM32でキャラクタ液晶ディスプレイを使う

現在ちびちびと Arduino STM32 リファレンス 日本語版 を整備しているにですが、
今回、標準ライブラリの LiquidCrystalライブラリの部分を追記しました。

このライブラリはHD44780コントローラ(互換品含む)を使った
キャラクタ液晶ディスプレイ用のライブラリです。

動作確認として、実際にBluePillボードで制御してみました。

02_5  

利用したキャラクタ液晶ディスプレイ
1602A-V2aitendoでも販売されています)
   表示文字数 16桁×2行 、バックライト付きSTN液晶ディスプレイ
   Aliexpressでは、2ドル以下で購入出来ます。

久しぶりに、パラレル接続のキャラクタ液晶ディスプレイを使いました。
色々と忘れていて、コントラスト調整に戸惑ってしまいました。

今回はとりあえず、4ビットモードで利用しました。
動作電源が5Vのため、BluePillボードの5Vで利用可能なピンを利用しました。
下記がその結線です。

結線表

1602A-V2端子 接続先 備考
VSS BluePill - GND  
VDD BluePill - 5V  
V0 20kΩ半固定抵抗(GND接続) コントラスト調整用
RS BluePill - PA8 5Vトレラントピン利用
RW BluePill - GND LOW(GND)でWモード固定
E BluePill - PA9 5Vトレラントピン利用
D0 (未接続)  
D1 (未接続)  
D2 (未接続)  
D3 (未接続)  
D4 BluePill - PB6 5Vトレラントピン利用
D5 BluePill - PB7 5Vトレラントピン利用
D6 BluePill - PB8 5Vトレラントピン利用
D7 BluePill - PB9 5Vトレラントピン利用
A BluePill - 5V バックライトLED用
K BluePill - GND バックライトLED用


動作確認に利用したスケッチ

#include <LiquidCrystal.h>
#define LCD_RS  PA8
#define LCD_E   PA9
#define LCD_D4  PB6
#define LCD_D5  PB7
#define LCD_D6  PB8
#define LCD_D7  PB9
uint8_t font[]= {
  0b00001010,
  0b00001110,
  0b00011111,
  0b00010101,
  0b00011111,
  0b00011111,
  0b00001110,
 0b00000000,
};
LiquidCrystal lcd(LCD_RS,LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
void setup() {
  lcd.begin(16, 2);
  lcd.createChar(1,font);
  lcd.clear();
  lcd.cursor();
  lcd.blink();
  lcd.setCursor(0, 0);
  lcd.print("Hello, world!");
  lcd.setCursor(0, 1);
  lcd.print("\xc8\xba\x20\xc6\x20\xba\xdd\xca\xde\xdd\xdc\x01");
}
void loop() { }

スケッチは、LiquidCrystalクラスのインスタンス lcd をピン割り付けを指定して生成し、
begin()にて利用開始します。

4ビットモードだと結線数も少なく、割と簡単に制御出来ます。

LiquidCrystalライブラリ は、Printクラスの派生クラスのため、
Serialオブジェクトのような感じで、print()関数が利用出来ます。
数値等の出力も簡単に出来ます。

写真の 「ネコ ニ ホンバンワ」の半角カタカナ表示の部分は、
Arduino IDE環境の文字コードUTF-8コードのため、文字列をそのまま記述することはできません。
UTF-8で半角カタカナ1文字は、3バイトに置き換えられてしまい文字化けします。
ですので、文字コードを16進数表記で記述しています。

また、猫っぽいアイコンは、CGRAM領域にフォントデータを登録して表示しています。
CGRAM領域には、最大8文字(5x8ドット)登録することが出来ます。
lcd.createChar(1,font)にてその登録を行っています。
登録した文字は文字コード0~7にて指定出来ます。
(ただし、文字コード0は文字列終端子と被るのでwrite()で書く必要あり)

登録するフォントデータは8バイトですが、横5ドットは下位5ビットにて定義します。
縦は実際は7ドットのため、最後の8列目は0を設定します。

参考文献
 ・Adafruit Explore & Learn - Wiring a Character LCD
 ・HD44780U (LCD-II)

2019年5月29日 (水)

Arduino STM32のWS2812Bライブラリ(NeoPixel制御ライブラリ) その1

Arduino STM32には、WS2812Bライブラリ(NeoPixel制御ライブラリ)が、
標準で(最初から)用意されています。

このライブラリを使いたいと思い、ドキュメントが無いので
プログラムソースから日本語ドキュメントを作成しました。

Arduino STM32 リファレンス 日本語版
 ┗  WS2812Bライブラリ(NeoPixel制御ライブラリ)

ドキュメントを作成し、ライブラリの仕様を理解した上で
さっそく、BluePillボードで動作確認してみました。

ダメです。このライブラリ、まともに動作しません。
LEDが全く点灯出来ません。
色々とソースを修正して現時点で、やっとLED点灯するももの、
意図したとおりに制御出来ません。

01_8

このライブラリはSPIを使ってパルスを生成しています。
システムクロック72MHzを1/32に分周した2.25MHzのパルス幅 0.444μSを使っています。
  パルス幅 0.444μSは許容範囲、
  1ビットのデータは3パルス幅、
  1つのLEDのRGBデータが24ビット、
  1つのLEDは3×24=72パルス、
   SPIは8パルス(8ビット)なので9バイト分、

これなら1個のLED単位でなんとか制御出来そうなのですが、リセット信号のがマズいようです。
ソースを見た限り、リセット信号の送信がされていないみたいなのですが..

更新
1ビット分の3パルスが0.444μS×3= 1.332 μS、
1.25 μS を超えているのがマズいようです。仕様では±0.6μSは許容範囲なのですが駄目っぽい。
24ビット分のデータの前半と後半部分がちゃんと受信されていないようです。
データはGRB(緑、赤、青)の順番で送信するのですが、
1点ルーレット表示は赤しかちゃんと点灯しません。

現在、ライブラリ修正中です。

より以前の記事一覧