フォト
2017年12月
          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年7月 | トップページ | 2017年9月 »

2017年8月の9件の記事

2017年8月30日 (水)

キーボードの作成 その1

豊四季 Tiny BASIC for Arduino STM32用やIchigoJamで利用出来る
小型キーボードを作成しよう思いつき、到着したタクトスイッチを調査しました。

1個 $0.66の製品を6個注文

03

到着したのがこれです。

Dscn6929

回路図不明のため、テスターで調べてみると、次のような感じになっているようです。
抵抗等の部品は無く、単純な4x4のマトリックスです。
04

押されているボタンを判定するには、
1~4に順番に電圧を付加し、5~8の出力を読み取れば良いみたいです。

  1、2,3,4が HIGH、LOW、LOW、LOW
の場合、ボタンK1~K4の状態を調べることが出来ます。
K3が押されている場合、端子7の出力はHIGHとなります。

この4x4マトリックスを4つ使って64キー(4行x16列)を仮実装してみます。
4行x16列だと端子が20ピンとなります。Arduino的にI/Oポートが足りません。

そこでシフトレジスタを2つ追加。回路的には次のような感じです。

※2017/09/05 更新 回路図を差し換えました

01_2

実装してみるとこんな感じになります。

Dscn6928

テスト用のスケッチ

#include <Arduino.h>

#define SOUT_PIN   2 // シリアルアウト
#define CLK_PIN    3 // クロック
#define LATCH_PIN  4 // ラッチ
#define SCN1_PIN   5 // 
#define SCN2_PIN   6 //
#define SCN3_PIN   7 //
#define SCN4_PIN   8 //


uint8_t lines[] = { SCN1_PIN, SCN2_PIN, SCN3_PIN, SCN4_PIN };
uint16_t scn[4];

uint8_t getKeyCode() {
  uint16_t clm = 0x0001;  
  memset(scn, 0, 8);
  for (uint8_t i=0; i < 16; i++) {
    digitalWrite(LATCH_PIN, LOW);
    shiftOut(SOUT_PIN, CLK_PIN, LSBFIRST, ~clm & 0xff );
    shiftOut(SOUT_PIN, CLK_PIN, LSBFIRST, ~(clm>>8) & 0xff ); 
    digitalWrite(LATCH_PIN, HIGH);     
    for (uint8_t j=0; j <4; j++) {
        scn[j]<<=1;
        scn[j] |= digitalRead(lines[j]);
     }
     clm<<=1;  
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(SOUT_PIN,  OUTPUT);
  pinMode(CLK_PIN,   OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);  
  pinMode(SCN1_PIN,  INPUT_PULLUP);  
  pinMode(SCN2_PIN,  INPUT_PULLUP);  
  pinMode(SCN3_PIN,  INPUT_PULLUP);  
  pinMode(SCN4_PIN,  INPUT_PULLUP); 
}

void bitout(uint16_t d) {
  uint16_t tst=0x8000;
  for (uint16_t i=0; i <16; i++) {
    Serial.write(tst&d ? '1' : '0');
    tst>>=1;
  }
  Serial.println();
}

void loop() {
  getKeyCode();
  for (uint8_t i=0; i <4; i++) 
     bitout(scn[i]);
  Serial.println("----");     
  delay(100);  
}

実行すると、4行16列のボタンのON/OFF状態を表示します。
1がOFF、0がONです。

02

取りあえず動いているようです。

次のステップとしては、
・各ボタンにスキャンコードを割当て
・PS/2キーボード インタフェース対応
・シリアル出力対応
をやってみます。

最終的には、ArduinoをPro miniまたはAtmega328単体利用にして小型化もしてみます。

2017年8月23日 (水)

Windowsストア版 Arduino IDEを試してみる

Arduinoの開発環境(IDE) はWindows 10環境をメインに利用しています。
このWindows 10用のArduino IDE、Windowsストア版があるのを最近知り、早速試して見ました。

WindowsストアにてArduinoで検索すると見つけられます。

01

アプリの説明にはバージョン情報等の記載が無く、ちょっと不親切ですが、
インストールすると最新版でした。機能はほぼ同じです。

02

タイトル部に(Windows Store 1.8.6.0)との表示があり、これによりWindowsストア版と
判断できます。

異なる点が若干あります。
環境設定ファイルpreferences.txt及びパッケージ配置場所が、
%ユーザーホーム%\Documents\ArduinoData\でした。

03

Documentsの中なので隠し属性でなく、自由に参照できます。
DocumentsのフォルダはOSの設定で任意に移動できるのでノーマル版より融通がききます。


とりあえず、ボートを追加したり、Arduino STM32モジュールを追加したり、
ライブラリの更新等をやってみました。

Arduino STM32は問題なく追加出来ました。

04

再度確認すると、もう一点異なる点がありました。
ライブラリマネージャーにてラリブラリの更新を行うと、
更新したライブラリはスケッチの保管場所で指定したフォルダのlibrarysに配置されます。

Windowsストア版の方が追加パッケージ、更新ライブラリの配置場所が分かりやすいのです。

また、通常版とWindowsストア版そ同時に起動してみましたが、全く干渉しないようです。
環境の使い分けを行いたい場合には両方入れて使うと良いかもしれません。

通常版のWindowsストア版のArduino IDEはアイコンが異なる形状なので、
同時に利用してもどちらがどのバージョンなのか判断できます。

2017年8月22日 (火)

ブートローダーに任意のスケッチを結合する

Arduino STM32環境利用メモです。

ブートローダーに任意のコンパイル済スケッチのイメージを結合する手順

・利用ツール: mergesketch.exe
https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/sketch_combiner/bin_merge_tool

・使い方
mergesketch ブートローダイメージファイル スケッチイメージファイル 出力ファイル名
例: mergesketch.exe generic_boot20_pc13.bin ttbasic.bin boot_ttbasic.bin
      Opened bootloader file generic_boot20_pc13.bin : size is 7188

      Opened sketch file ttbasic.bin : size is 82092
      Allocated 90284 bytes for buffer
      Wrote combined file to boot_ttbasic.bin

・作成したブートローダ付きスケッチイメージの書込み(stm32flash利用の場合)
  - Blue Pillボードのboo0を1:boot1を0に設定しリセットしてDFUモード起動する
  - USB-Serialモジュール接続 PB9にTX、PB10にRXを接続
  - stm32flashで書き込む

    stm32flash.exe -f -v -w boot_ttbasic.bin COM5
    stm32flash 0.4
    http://stm32flash.googlecode.com/
    Using Parser : Raw BINARY
    Interface serial_w32: 57600 8E1
    Version      : 0x22
    Option 1     : 0x00
    Option 2     : 0x00
    Device ID    : 0x0410 (Medium-density)
    - RAM        : 20KiB  (512b reserved by bootloader)
    - Flash      : 128KiB (sector size: 4x1024)
    - Option RAM : 16b
    - System RAM : 2KiB
    Write to memory
    Erasing memory
    Wrote and verified address 0x080160ac (100.00%) Done.


2017年8月15日 (火)

OLED(SSD1309)ディスプレイモジュールを試して見る

大き目のOLEDディスプレイをAliExpressで見つけ、ポチりました。
2.42" 12864 OLED Display Module IIC I2C SPI Serial FOR C51 STM32 WHITE SSD1309

Aliexpress

$22.99はちょっとお高いかなぁと思いつつ、製品が到着。
0.96インチのOLEDと比較すると、以外と大きい...値段に納得。

Dscn6854

早速動作確認しました。
下記の情報を参考にしました。参考記事の製品は私の物と全く同じようです。
Arduino Forum >  Using Arduino >  Displays >  2.42" OLED SSD1309 with U8GLIB

SPI接続で利用します。
ライブラリはu8glibではなく、u8g2を使いました。
ライブラリはここから入手しました。

Dscn6842

流石OLED、表示が綺麗です。
画面のサイズも思っていたよりも大きいです。これなら$22.99で十分お得かも..

Dscn6841

参考にした記事ではVCC 5Vで稼働させていますが、3.3Vでも動作しました。
このモジュール、SPI利用の場合のピンの利用がちょっと分かりにくですが、
参考記事にて使い方が判明しました。

Dscn6846

SSD1309はSSD1306と互換性があるようです。u8glibではデバイスとしてSSD1306を
指定しても動作しました。

AdafruitのSSD1306ライブラリも試して見ました。

Dscn6853

問題なく動いていると思いきや、スクロールのデモでスクロールせず..

Dscn6850

ハードウェアスクロールが動かないです。SSD1309は完全互換では無いみたいですね。

次の調査として、Blue Pillボードでも使えるかやってみます。

追記

Blue Pillボードでもu8glib(u8g2)ライブラリを使った表示制御が出来ました。
豊四季Tiny BASICから利用出来るよう、ちょっとやってみます。

Dscn6863


2017年8月11日 (金)

豊四季 Tiny BASIC for Arduino STM32、 V0.84に更新しました

現在メインで取り組んでいる「豊四季 Tiny BASIC for Arduino STM32」、
バージョン 0.84に更新しました。

豊四季タイニーBASIC for Arduino STM32 V0.84(2017/08/11)
https://github.com/Tamakichi/ttbasic_arduino/tree/ttbasic_arduino_ps2_ntsc

従来は、NTSCビデオ画面、PS/2キーボードがほぼ必須だったのですが、
V0.5のターミナルコンソールでのスクリーン編集機能を復活させてました。

Blue Pillボードの小さいメリットを生かした利用にも対応できると思います。

01

03


追記 2017/08/13
ILI9341 TFT液晶モジュールに対応しました。
ただし、表示は遅いです。

2017年8月 7日 (月)

豊四季 Tiny BASIC for Arduino STM32でOLED(SSD1306)の制御

豊四季 Tiny BASIC for Arduino STM32をつかった
OLED(SSD1306)ディスプレイの制御です。I2Cにて接続しています。
以前V0.83用に作成したものを、V0.84でも問題なく動くかの動作確認を行いました。


このOLED、横向きに文字を表示するにはフォント回転が必要です。
その回転もBASICでは苦しいかと思ましたが、問題なくリアルタイム表示出来ました。

プログラムソースは、ちょっと長めです。
https://gist.github.com/Tamakichi/36896640d6e8ac94e618f78f9a5bddd8

1 'SSD1306_2(PB6=SCL,PB7=SDA)
10 M=MEM:A=$3C:CLS
20 GOSUB "@INIT":GOSUB "@CLS"
30 X=0:Y=0:C=ASC("A"):GOSUB "@OUT(X,Y,C)"
40 X=1:Y=1:C=ASC("B"):GOSUB "@OUT(X,Y,C)"
50 X=2:Y=2:C=ASC("C"):GOSUB "@OUT(X,Y,C)"
60 X=0:Y=5:S="Hello Tiny BASIC":GOSUB "@PRN(X,Y,S)"
70 'WAIT 2000
80 'GOSUB "@CLS"
90 GETTIME E,F,G
100 LOCATE 0,0:?#-2,E;":";F;":";G
110 X=0:Y=7
120 FOR b=0 TO 7
130 C=VPEEK(X,0)
140 GOSUB "@OUT(X,Y,C)"
150 X=X+1
160 NEXT b
170 WAIT 1000
180 GOTO 90
190 END
5000 "@INIT"
5010 POKE M,$00,$B0,$21,$00,$7F,$40,$80
5020 POKE M+7,$AE,$A8,$3F,$D3,$00,$40,$A1,$C8
5030 POKE M+15,$DA,$12,$81,$FF,$A4,$A6,$D5,$80
5040 POKE M+23,$2E,$20,$10,$21,$00,$7F,$22,$00
5050 POKE M+31,$07,$8D,$14,$AF
5060 FOR I=0 TO 27:R=I2CW(A,M,1,M+7+I,1):NEXT I
5070 RETURN
5080 "@OUT(X,Y,C)"
5090 POKE M+3,X*8:POKE M+1,Y|$B0
5100 GOSUB "@ROTATE(C)"
5110 R=I2CW(A,M,1,M+1,4)
5120 R=I2CW(A,M+5,1,M+50,8)
5130 RETURN
5140 "@CLS"
5150 POKE M+3,0:POKE M+1,0|$B0
5160 R=I2CW(A,M,1,M+1,4)
5170 FOR I=0 TO 127
5180 R=I2CW(A,M+5,1,FNT,8)
5190 NEXT I
5200 RETURN
5210 "@PRN(X,Y,S)"
5220 L=LEN(S)
5230 FOR I=1 TO L
5240 C=ASC(S,I)
5250 GOSUB "@OUT(X,Y,C)"
5260 X=X+1:IF X>15 X=0:Y=Y+1
5270 NEXT I
5280 RETURN
5290 "@ROTATE(C)"
5300 F=FNT+C*8
5310 FOR J=0 TO 7
5320 D=0
5330 FOR K=7 TO 0 STEP -1
5340 D=D+((PEEK(F+K)>>(7-J))&1)<<K
5350 NEXT K
5360 POKE (M+50+J),D
5370 NEXT J
5380 RETURN

5000~5380行はサブルーチンです。
ラベル指定呼び出しで5つのサブルーチンを定義しています。
・"@INIT"
  OLEDモジュールの初期設定を行うサブルーチンです。
・"@CLS"
  OLEDの画面の表示を全消去します。
・"@OUT(X,Y,C)"
   指定した座標に文字を表示します。
   変数Xに横座標、Yに縦座標、Cに文字コードを指定します。
・"@PRN(X,Y,C)"
   指定した座標に文字列を表示します。
   変数Xに横座標、Yに縦座標、Sに文字列を指定します。
・"@ROTATE(C)"
  "@OUT(X,Y,C)"から利用されるサブルーチンです。
  指定した文字コードのフォントデータを回転してメモリに格納します。

10~190行がメインルーチンです。
サブルーチンを利用して文字、文字列、時刻の表示を行っています。

プログラムがちょと長いですねぇ
長いとNTSCのビデオ出力画面でのプログラム作成は辛いです。
テキストエディタで作成して転送になっちゃいますね。

そこで、 V0.84(現在動作確認中)では長いプログラムを作成しやすくするために、
次の機能を盛り込みました。

  1)プログラム編集機能の改善
    ・ターミナル上で最大横128文字x縦50行のスクリーン編集をサポート
    ・プログラムソースの上下スクリール表示

  2)プログラムソースの部分保存・読み込み
    例:上記ソース5000行~5380行(サブルーチン部)だけを保存・読み込みする

  3)RENUMコマンドで範囲指定の番号振り直し対応
   例; 上記ソースの10行~190行だけを行番号の振り直しする

  4)利用可能変数の追加
    A~Zではちょと足りないので、A0、A1のように数字を付けた変数名もOK


色々と長いプログラム作成の改善方法を模索したのですが、
幾つか長いプログラムを作成してみると、
「行番号付けるのうざい、行番号要らなくねぇ?」
と、感じる今日この頃です。

  行番号廃止
これが一番の改善策と思えてきました。
行番号が無ければ、番号の振り直しとか不要ですし...
行番号の付け間違えで、行が消えたり等弊害もあります。

たしか、BASICの親戚(親?)のFORTRANは必要な時だけ(GOTOの飛び先)、
行番号を付けていたはずです。

行番号ではなく、単に行(先頭からの行の連番)だけでもイケないだろうか模索中です。
何れは、号番号廃止したいなぁと思っています。

また、引数を伴うサブルーチン呼び出しも
  CALL "@PRN", X,Y,S
みたいな呼び出しと
  SUB "@PRN" X0,Y0,S0
    ・・・
  RETURN

みたいなサブールーチンの定義にしたいです。

2017年8月 6日 (日)

Maker Faire Tokyo 2017に行ってきました

8/5(土)、Maker Faire Tokyo 2017に行ってきました。
手作り感漂う素晴らしい展示品の数々...

楽しい創作には、思わず笑みがこぼれてしまいます。
出展者、見学者ともに楽しめる雰囲気の会場です。
個人的に興味を持った展示をちょっと紹介

安価なパイプオルガン、演奏パフォーマンスも楽しい
出来そうでで出来ない創意工夫も素晴らしい
Dscn6790

先行販売品等があり、スイッチサイエンスさんのブースは大人気

Dscn6772

会場を徘徊しているR2D2。半端ない完成度。家にこれが居ると楽しいだろうなぁ..

Dscn6795

サラリーマンが人工衛星を打ち上げるプロジェクトの展示
一般人でもお手軽に人工衛星を打ち上げられる時代が到来?

Dscn6779

最初の目標は、「地球をバックに自撮りをする」とのこと。
人工衛星から伸びたフレームの先にカメラが搭載されています。
制御やデータ送受信はアマチュア無線(430MHz帯)で行うそうです。

Dscn6777


ハッカブル位牌、確かにこんなお洒落な位牌もアリでしょ

Dscn6780

自動演奏時に鍵盤が動きます。演奏に動きがあると楽しさ2倍

Dscn6773


対応しい時を過ごすことが出来ました。

教育用の教材が多数ありましたが、ちょと高すぎかなぁ..
興味を持った子供がお小遣いで気楽に買えるようなって欲しいなぁ
特にソニーさんのあれは高すぎ..

2017年8月 5日 (土)

Blue Pill ボード(STM32F103C8T6) $1.58

Aliexpress、Blue Pillボード取扱い業者が増え、値段が下がっていますね。
原価はいくらなんだろう..

Free Shipping STM32F103C8T6 ARM STM32 Minimum System Development Board Module Forarduino
Blue Pillボード

とりあえず、2個注文しました。
安くて、小さくて、高性能とバランスが取れて良いボードです。

利用者も増えている感があります。

増えているといえば、最近のArduino STM32は更新の頻度も増えてます。
利用者増加に伴い、プルリクエスト・不具合の指摘も増えています。

機能追加・不具合対応等は大歓迎です。

早速更新すると、何気にメニューの設定項目が増えています。
オーバクロック 128MHz !?

04

2017/08/07 追記
Arduino STM32、最近の激しい更新ラッシュ、Wire(I2C)ライブラリに大きな変更があり
豊四季Tiny BASICでコンパイルエラーが発生するようになりました。

Wireライブラリはハードウェアバージョンとソフトウェアエミュレーションバージョンがあり、
デフォルトではWire.hがソフトウェアエミュレーションバージョン、HardWire.hが
ハードウェアバージョンを使うためのヘッダーファイルでした。

これが、最近の修正で、Wire.hがハードウェアバージョンとなり
ソフトウェアエミュレーションバージョンを使う場合はSoftWire.hを使うこととなります。

豊四季Tiny BASIC for Arduino STM32は、
これを機会に、Arduino STM32の安定版での利用をデフォルトとしました。

2017年8月 2日 (水)

豊四季タイニーBASIC for Arduino STM32 V0.84

現在手掛けている、豊四季タイニーBASIC for Arduino STM32.
次バージョン0.84の画面切り替えのデモ動画です。



左の画面はNTSCビデオ出力をキャプチャーして表示しています。
右の手前の画面はUSB端子経由のシリアル接続のターミナル画面です。
その奥の画面はシリアルポート経由でのターミナル画面です。
ターミナルソフトとしてTeraTermを利用しています。

シリアル接続のターミナル画面は921,600bpsで接続しています。

スクリーン編集可能な画面をNTSCビデオ画面から2つのシリアル接続の
ターミナルコンソールに切り替えることが出来ます。

豊四季タイニーBASIC for Arduino STM32.は、
4Kバイトまでのプログラムが作成可能なのですが、
4kバイトだとプログラム行数は数百行になっちゃいます。

NTSC出力の狭い画面ではプログラム作成・編集がちょっと辛いです。
また、変数がA-Zの26個なの大きいプログラムでは足りません。

そこで次バージョンの0.84では、現時点の利用面での不満を考慮し、
次の対応を行う予定です。
   1)シリアルコンソール画面にてプログラム作成が出来るようにする
   2)変数はA-Zの他に英字+数字の変数も利用可能にする

V0.84は取りあえずほぼ完成なのですが、
かなりの変更になってしまい、動作確認に時間がかかっています。

« 2017年7月 | トップページ | 2017年9月 »