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

« 2016年8月 | トップページ | 2016年10月 »

2016年9月の8件の記事

2016年9月20日 (火)

LEDドットマトリックスを使ったメッセージ表示デバイスを作成中(2)

前回の続きです。

IchigoJamとの連携を意識し、IchigoJamのフォントをフラッシュメモリ上に乗せました。
(フォントを美咲フォント(UTF8)とIchigoJam フォント(ASCII)を切り替えて利用可能)

機能をいくつか追加そのため、スケッチサイズが29,312バイト(95%)に達しました。

RTCを使った実用的な時計機能くらいは付けようかと思ったのですが、
I2Cライブラリが乗りそうにないです。困った..

Ide

その分、比較的簡単の定義で動きのあるメッセージ表示が出来るようになりました。

動作デモ



デモで表示しているメッセージの定義コマンドは次のような感じです。
メッセージ0 にメッセージを定義しそのメッセージ0を繰り返し表示する定義です。

@setmsg 0,{s10}{t50}IchigoMsg{s9}{a255}{d300}{s5}by たま{o10FE107C007C7C00}さん{s9}{a236}{s5}
@setplist 0
上記の定義で表示されるメッセージは
    "IchigoMsg[苺アイコン]by たま吉さん [猫アイコン]"

ですが、制御文字{ } を埋め込んでいるので長くなっています。

{s10}、{s5}、{s9}はスクロール動作を指定しています。現状16種類あります。
{t50}はスクロール速度(1ドット50nsec)を指定しています。

{a255}、{a236}はIchigoJamの文字コードを指定して苺、猫アイコン(文字)を指定しています。
IchigoJamのフォントはコード指定での表示の他にIchigoJamにつなげて使うことを
想定して@setcodeコマンドでIchigoJamの文字をそのまま利用できるようにしています。

{d300}は留め、一時停止で300msecウェイトです。

{o10FE107C007C7C00}は"吉"のフォント8バイトを指定しています。
"吉"は教育漢字でないため、フラッシュメモリ上に乗っていないため外字的に定義して
表示しています。
別途フォント定義機能がありますが、こんな感じで直接埋め込んだ表示も出来ます。


次のステップとして基本機能の動作確認したら、IchigoJamに繋げてみます。

現状の問題点としてはやはりArduinoのシリアル通信です。
Arduinoの受信バッファから更にバッファリングして.. というアホなつくりは
避けられないのですが、長いデータでは64バイトのバッファサイズ制約から
どうしても取りこぼしが発生します。

取りあえず、互換性が無くなるけどライブラリソースいじってバッファ拡張は試して
みます。
(劇的に改善すればそのいくかもしれません)







2016年9月18日 (日)

LEDドットマトリックスを使ったメッセージ表示デバイスを作成中

(2016/09/18 更新・一部変更)

「Arduinoで8x8LEDマトリックスを直接(直結)で制御する」でやったことをベースに
ここ数日、ArduinoベースでのIchigodotS的なものを製作中です。
(最終的にはAtmega328を直接利用を予定)

 Matrix
  ※写真はArduino pro miniにLEDドットマトリックスを直付けて駆動
     "@out 043E2F566AD6ACF0"のコマンド実行で表示しています。

方向性はちょっとIchigodotS異なり、ゲーム性は無くメッセージ表示機能を重視しています。

現状の機能のデモ

TeaTerm上(シリアル通信)にてコマンドを実行して表示メッセージを定義する例です。
(コマンドの実行はメッセージ表示を中断することなく、並行して行えます)

   Photo

下記のコマンドを5つ実行しています。
   @setfont  0,043E2F566AD6ACF0  : フォント0 に苺のフォントを定義
   @setmsg 0, Hello{f0}IchigoJam      : メッセージ0の定義. {f0}はフォント0を埋め込み指定
   @setplist 0                                : 表示するメッセージを指定(メッセージ0だけ指定)
   @scroll 5,50                               : スクロール方向、速度指定 横、50msecに1ドット移動
   @save                                       : 上記の設定を保存

この定義で次の動画の動作をします。

 

メッセージ、フォント、設定値を内部EEPROMに保存しているので、再起動しても以後
同じ動作をします。内部EEPROMは設定値の保存に重宝しますね。

メッセージ文に埋め込み制御文字を駆使して途中でスクロールを早めたり緩めたり、
逆スクロールにしたり、フォントを{f0}{f1}{f2}.. としてアニメーションなんかも出来そうです。

埋め込み制御文字もセンサーやRTC等の可変データを埋め込むようなこともやろうと思っています。

主な機能
  ・さまざまなLED8x8ドットマトリックスに対応(ピン配置、アノード、カソード設定)
  ・内部EEPROMに最大長128バイトのUTF-8日本語メッセージを6つ登録可能
  ・ユーザー定義フォント(8x8ドット)を24文字登録可能
  ・メッセージ表示プレイリストの登録機能
  ・文字の回転、反転、スクロール速度の設定
  ・メッセージ内に制御用文字を埋め込んで、表示の装飾が可能
  (メッセージのスクロール速度や方向を途中で変えたり、戻したり等が可能)
  ・ホスト機(IchigoJam、Windows機、ラズパイ等)から表示メッセージ送信

主なコマンド
・メッセージの登録/追記
   @setmsg  メッセージ番号, メッセージ[LFCR]
   @setmsga メッセージ番号, メッセージ[LFCR]

・メッセージの削除
   @delmsg メッセージ番号[LFCR]

・メッセージ再生リストの設定
@setplist 0123456[LFCR]
  数字はメッセージ番号のリスト

・登録メッセージの取得
  @getmsg メッセージ番号[LFCR]
    メッセージ番号省略で全部取得

・スクロールの設定
  @scroll dct , tm[LFCR]
    dct  方向 0:スクロールなし、1: 上 、2:右上、 3:右、 4:右下、 5:下、6:左下、7:左、8:左上
    tm   ウェイト 0~255(msec)

・文字の回転設定
@rotate dct[LFCR]
dct    0:0度、 1:90度、2:180度、 3:270度

・表示停止 
@stop[LFCR]

・表示指定
play n[LFCR]
n:  0:停止、 1:シーケンシャル、2:ランダム表示

・フォント登録
@setfont フォント番号, フォントデータ(16桁HEX)[LFCR]

・フォント直後出力
@out フォントデータ

・フォントデータの取得
  @getfont フォント番号[LFCR]
  フォント番号省略で全部取得

・メッセージ間隔時間設定
  @wait 間隔[LFCR]

・登録フォント表示
  @printfont フォント番号

・設定値の保存/ロード
  @save
  @load

・変数の設定
  @setvalue 変数番号, 値

表示メッセージ埋め込み制御文字
  {fn} フォント埋め込み
  {oR1R2R3R4R5R6R7R8} ビットマップ埋め込み
  {r[+/-]n} 回転 +/-で相対指定
  {s[+/-]n} スクロール方向指定
  {tn} スクロール速度指定
  {e} 停止
  {w} 即時ウィエイト
  {dn} 日付情報埋め込み (RTCモジュール利用時)
  {Tn} 温度情報埋め込み (温度センサーモジュール利用時)
  {vn} 変数値の埋め込み (n:0~9)

利用例
@setmsg 0,今日は{d1}です{o043E2F566AD6ACF0}。
@setmsg 1,現在の気温は{t1}です。
@setfont 0, 043E2F566AD6ACF0
@setmsg 2, いちごアイコン{f0}を表示するテスト
@playlist 012
@platy 1
@save

色々と機能を詰め込んでいって、フラッシュを87%利用している状況です。
もしかしたら、足らなくなるかも..

  Ide

問題点

現状、Arduinoの標準のシリアル通信の作りの悪さに悩んでいることろです。
受信バッファサイズが64バイトの制約はちょっと辛いです。
広げることは出来るのですが、互換性が無くなってしまいます。

広げても根本的な問題解決にはならなそうです。
バッファーオーバー時にタイミングを確実にキャッチしてフォロー出来るように
方向が無いかを模索中です。

関連記事
Arduinoで8x8LEDマトリックスを直接(直結)で制御する  (2016/08/07)

2016年9月13日 (火)

IchigoJamのI2Cインタフェースについて

IchigoJamのI2Cインタフェースに関するまとめです。
(対象はファームウェア 1.2.1です)

IchigoJamのI2Cインタフェース利用時の注意点

  1)3.3V対応であること
    I2Cデバイスの中には5V利用が前提で3.3Vに対応していないものがあります。
    ただし、仕様上3.3Vに対応していなくても3.3Vで動くものもあります。
    8x8ドットLEDマトリックスを制御するHT16K33は4.5~5.5Vが利用範囲ですが
    利用出来  ています。

  2)IchigoJam BASICの I2CR、I2CWコマンド仕様で利用可能なデバイスであること
     IchigoJam BASICの I2CR、I2CWコマンドの仕様により、
     一部のI2Cデバイスの制御が出来ません(そう多くないです)。

     I2Cアドレスのみを送信してデータ取得を行うような通信が出来ません。
     (Wiiヌンチャク、タッチセンサーなんかは利用出来ませんでした)

  3)I2Cスレーブアドレスが同時利用するデバイスと同じでないこと
    例:秋月電子 液晶キャラクターディスプレイ(ACM1602NI-FLW-FBW-M01)
        アドレスが0x50なのでEEPROMの0x50と競合して使えないです。

  4)I2Cアドレスは7ビット長

  5)プルアップ抵抗は必須(ボード上の搭載・MPU内部プルアップなし)

      
利用ピン


図の紫色の5番ピンSDA27番ピン SCLをデータの2ピンをデータ通信に利用します。
また必要に応じて、VCC、GNDをIchigoJamに結線します。
5番ピン、純正品のラベルはIN3のみしか書いていないのでちょっと分かりにくいですね。

  Ichigojam121

IchigoJam Tの場合、 マイクロUSBコネクタの近くにある端子の利用も可能です。

 

接続方法

一般的な接続方法

I2Cはバスですので複数のI2Cデバイス(スレーブ)が接続出来ます。
注意点としてSDAとSCLにプルアップ抵抗(2.2kΩ~10kΩ、図では4.7kΩを利用)が必要です。

ただし、I2Cデバイスにあらかじめプルアップ抵抗が搭載されている場合があります。
この場合は、そのプルアップ抵抗を利用するため回路図の抵抗は省略出来ます。
(省略しなくても利用可能)

Photo

「プアップ抵抗って何? 何で必要なの?」、「なんで出力が競合しないん?」的な解説
(内容が間違えているかもしれません)

I2Cバスの電気的性質

(読み返すと若干、内容が怪しいかも..後で修正します)

I2CのSDAとSCLは双方向の信号ラインです。
普通に考えると、それぞれのデバイスで入出力の方向が異なる可能性があり、
なんで上手く動いているのだろう?って疑問に思います。

通常のH(ハイ 3.3V)、L(ロー 0V)の状態を持つ線を共通配線にした場合、
それぞれが出力状態かつ、出力値が異なる場合、厄介なことが発生します。

例えば、SDA接続で1つがH(3.3V)、別の1つがL(0V)を出力するとこれはもう、
ショート状態です。H→L間で大きな電流が流れICが破損する可能性もあります。
また、ショートしなくてもSDAのバス的に信号がHなのかLなのか不定です。

そこでI2CバスではワイヤードAND接続が採用されています。
この場合、SDA、SCL端子はオープンドレインという状態で利用します。

この時の出力の取り得る状態はH(1、ハイ 3.3V)、L(0、ロー 0V)ではなく、
H(Hi-Z:ハイインピータンス=絶縁状態)、L(0、ロー 0V)となります。

ハイインピータンスは高抵抗値を意味し、端子には電流が流れない状態です。
この状態であれば、バス上で各デバイスの出力状態でHとLが重なっても
問題となりません。
絶縁状態の端子に0Vの端子を接続しても電流は流れませんね。
当然、ショートも発生しません。

ただしこの場合、1つ厄介なことが発生します。
下の図は共通配線SDA、各スイッチがI2CデバイスのSDA出力を等価的に表しています。
スイッチOFF時がハイインピータンス(絶縁状態)、スイッチON(接続時)がLです。

   Photo_2

全てのデバイスがH(ハイインピータンス=スイッチが開いている状態)、
共通配線SDAは、電圧が不定て右端のSDA出力端子からは
状態(H? L?どっち?)を読むことが出来ません。

そこで、プルアップ抵抗を入れて
SDAがH(ハイインピータンス)の場合は、プルアップ抵抗経由の電圧が出力され、
ロジックとして"1"をとるようにします。
SDAがL(0V)の場合は、そのまま0Vでロジックとして"0"と判定出来ます。

  __2

もしも、それぞれが好き勝手に出力した場合ですが、
1つでもL(0V)があればSDAの状態はLになります。
上図は全てがHですが、どれか1つスイッチを閉じるとSDAが0Vになるは明白です。

論理的にはANDをとってどれか1つでも0ならばSDAのバスは0、
全部がHなら1となります(= ワイヤードAND (論理積))。
(ちなみにI2Cでは、SDA、SCLともHの場合にバスがフリーな状態と規定しています)


IchigiJamのI2C利用コマンド

例としてRTCモジュール(DS3231搭載)を使って説明します。
RTCモジュールは時計機能を持つモジュールで時刻設定、時刻参照、アラーム設定、
アラーム通知が主な機能です。

 
   (このデバイスはプルアップ抵抗搭載なのでIchigoJamに直結で利用出来ます)

IchigoJamにはデータ送信用とデータ受信用の2つのコマンドが用意されています。

  ・ データ送信
      I2CW(I2Cアドレス、 コマンド、コマンド長、送信データ、データ長)

  ・ データ受信
      I2CR(I2Cアドレス、 コマンド、コマンド長、受信データ、データ長)

引数のI2Cアドレスは利用するI2Cスレーブのアドレスを指定します。
このアドレスの指定方法は7ビット、8ビット、10ビット等がちょっと混乱しすが
IchigoJamでは7ビットアドレスを指定します。

まず、利用するI2CデバイスのI2Cアドレスを知る必要があります。
通常は添付の解説書または、商品情報HPのリンク先の資料に記載されています。
大抵は下図のような通信データのレイアウトが記載されています。

I2c

この図で<SLAVEADDRESS>がI2Cアドレスとなります。
(0と1の羅列が7個あるので7ビットだと分かります。系によっては<R/W>を含めて
8ビットで指定する場合もあります)

2進数表記 1101000  をIchigoJamでそのまま指定する場合は、
`1101000   となります(` はキーボードの[@]キーを[Shift]キーを押しながら入力)。
  メモリー的&読書きにおいて無駄なので16進数に直して#68 で指定することにします。
(IchigoJam上で ?HEX$(`1101000) を実装すれば楽に求められますね)

I2CWI2CRコマンドの引数、
コマンドはI2Cデバイスに送るコマンドの格納アドレス、コマンド長はその長さです。
IchigoJamの変数では可変長のデータを直接扱うことが出来ません。
そのため、アドレスでの指定となります。

ここで、RTCモジュールに時刻設定する場合を考えます。
設定にはI2CWコマンドを使います。

RTCモジュールの場合、引数のコマンドにはRTCモジュール内のレジスタアドレスを指定します。

次の表がレジスタアドレスに割りつけられている機能です。
引数のコマンドにはこの表のアドレスを指定し、書きこみたいアドレスを指定します。

<レジスタアドレス表>
Photo_3

引数の送信データには上記の表に設定する内容を指定します。
ここでは年、月、日、曜日、時、分、秒 の7つの値を1回の送信で設定したいと思います。

2016年9月13日(火) 20時30分00秒 を設定することにします。
この場合、アドレス00h~06hにだけ値を設定します。

まず、設定値は次のようになります。データ長は7バイトです。
アドレス 設定値   補足
00h:   #00         秒
01h:   #30         分
02h:   #20         時
03h:   #03         曜日(01:日、02:月、03:火 ... 06:土)
04h:   #13         日
05h:   #09         月
06h:   #16         西暦年下2桁

16進数BCD表記ではほぼ見た目のままの数字の指定となります。

以上のコマンドと設定データの実際の送信を行うプログラムと実行結果です。

10 POKE #700,#00,#00,#30,#20,#03,#13,#09,#16
20 R=I2CW(#68,#700,1,#701,7)
30 ?R

1

10行のPOKEコマンドでIchigoJamのアドレス#700から#00#00#30..#16
順番に格納しています。最初の#00はコマンドとして送信するデータ1バイト、
次の#00#16が設置値7バイトです。

#700からの領域はPCG定義用の領域です。フォント定義を利用しない場合は、
自由に利用出来ます(256バイト)。

20行ではI2CWコマンドを使って実際にI2Cデバイスのデータを送信しています。
変数Rは送信結果が返されます(0で正常、1で異常)。

#68はI2Cデバイスのアドレス、#700がコマンド格納アドレス、1がコマンド長、
#701が送信データの格納アドレス、7が送信データの長さです。

実行すると次のような感じになります。
正常動作の0が表示されます。

次にI2CWコマンドを使って現在時刻を読みだしてみます。

    I2CR(I2Cアドレス、 コマンド、コマンド長、受信データ、データ長)

やりたいことは、I2Cデバイスのレジスタアドレス表の00h~06hに格納されている、
ここでは年、月、日、曜日、時、分、秒 の7つの値を取得することです。

I2CRの引数のI2CアドレスはI2CRと同じ#68を指定します。
コマンドおよびコマンド長にはレジスタアドレス表の00hを指定します。
受信データおよびデータ長は取得したデータを格納するアドレスとして#710、長さ7を指定します。

以下が実際のプログラムと実行結果です。
10 POKE #700,0
20 R=I2CR(#68,#700,1,#710,7)
30 ?R
40 FOR I=0 TO 6
50 ?HEX$(PEEK(#710+I),2)
60 NEXT

2

10行はコマンドを#700に設定
20行はI2Cアドレス#68、コマンド格納アドレスとして#700、その長さとして1を指定、
受信したデータ格納アドレスとして#710、その長さとして7を指定しています。
30行がI2CRの実行結果の表示
40~60行は#710#706に格納されている取得データを16進数2桁で表示しています。


IchigoJamのI2CW、I2CRのバグ(不具合)について


2つのコマンド、
  I2CW(I2Cアドレス、 コマンド、コマンド長、送信データ、データ長)
  I2CR(I2Cアドレス、 コマンド、コマンド長、受信データ、データ長)

において次のバグ(不具合)があります。
・コマンドにて送信するデータはコマンド長0を指定すると意味不明なデータが
  I2Cデバイスに送信されます。この時、データ長も固定ではないようです。

・コマンドにて5バイト以上のデータを送信するとI2Cデバイスには
  正しくないデータが送信されます。

(本不具合は開発者に連絡済です)
なのでコマンドは1~4バイトの範囲で利用しましょう。

2017/04/03 追記
最新のβファームでは上記不具合は対応済みです。
(facebook IchigoJam-FANにて公開 IchigoJam 1.2 beta 42)

以前試した、Wii用ヌンチャク等も利用可能になりました。

2016年9月11日 (日)

aitendoのこどもパソコン「ai.Jam-T」キット を組み立てました

秋葉原に行ったついでに購入して放置しいた「ai.Jam-T」キットを本日組み立てました。

Aitendo_ichigojam

999円(税別)とリーズナブルな価格です。
基板サイズ・コネクタ・ピン位置は純正と同じです。

中身はこんな感じです。パーツケースが付いてます。
抵抗、コンデンサには丁寧にラベルは貼ってあります。

01

MPU(LPC1114)、抵抗、コンデンサは表面実装タイプです。
表面実装のはんだ付けの練習には良いキットだと思います。
はんだ付け初心者にはちょっと辛いかもしれませんね。

02

表面実装のはんだ付けはフラックスは必須です。

03

説明書等はありません。
商品ページに掲載の図およびパーツリストを参考にして組み立てていきます。

背の低いパーツから部品を取りつていきます。
まずは心臓部のLPC1114FDH28/102を取り付けます。

このLPC1114FDH28/102の足のピッチは0.65mmです。
端子取り付け用の2.54mmピッチの穴と比べるとその狭さが分かります。
これが一番、難易度が高いですが、なんとか取り付けられました。

04

軽いチップ抵抗やチップコンデンサははんだを当てると動いてしまうので、
途中でクリームはんだに切り替えました。

06

取りあえず完成。
やはり表面実装はちょっと時間がかかりますね。

07

純正品と比べると黄色のAV単位のプラスチックが薄くて剛性がなく変形します。
プラグの抜き差しを繰り返すうちにもげてしまうかもしれません。

電源用のスライドスイッチが固くてヘッドのプラスチックが細いのでこちらも
そのうち破損する可能性があります。

タクトスイッチはヘッドが付いており、純正品よりも使いやすいです。

完成後、ファームウェアを書きこんで、画面表示、キーボード入力、LEDが付くことを
確認し特に問題無しでした。

08

はんだ付けに自信がある方は、純正品よりもこちらがおすすめです。

別途半実装タイプもありますが、基板750円(MPU実装済)部品ボックス395円
若干高くなります。この場合のパーツは表面実装ではないようです。

2016年9月 8日 (木)

IchigoJamでRTCモジュールを使った時刻表示 その3

前回からの続きです。年月日も表示するようにしました。

Dscn5719

プログラムソース (GitHub gisでソースを公開しています こちら)

10 'RTC DS3231
20 'T="16090805190630":GSB @SET
30 CLS:M=#700:A=#68:POKE M,0:L=0:S=M+16
40 LET [0],31599,4681,29671,29647,23497,31183,31215,29257,31727,31695,0,1040,672
50 LET [20],11,11,10,12,12,10:X=2:Y=13
60 FOR I=0 TO 12:FOR J=14 TO 0 STEP -1
70 IF ([I]>>J)&1 D=1 ELSE D=32
80 POKE S+L,D:L=L+1:P=-1
90 NEXT:NEXT
100 GOSUB @PDT
110 @LP
120 R=I2CR(A,M,1,M+1,7)
130 IF PEEK(M+5)<>P P=PEEK(M+5):GOSUB @PDT
140 GSB @PTM
150 GOTO @LP
160 @SET:N=M+7
170 FOR I=T TO T+13 STEP 2
180 POKE N,(PEEK(I)-48)<<4+PEEK(I+1)-48:N=N-1
190 NEXT
200 R=I2CW(A,M,1,M+1,7)
210 RTN
220 @PTM:FOR I=0 TO 4:LC X,Y+I:K=20
230 FOR J=2TO0STEP -1:D=PEEK(M+1+J):E=S+I*3
240 ?STR$(E+(D>>4)*15,3);" ";STR$(E+(D&15)*15,3);STR$(E+[K]*15,3);
250 K=K+1:NEXT:NEXT
260 RTN
270 @PDT:FOR I=0 TO 4:LC 0,5+I:K=23
280 FOR J=6TO 4 STEP -1:D=PEEK(M+1+J):E=S+I*3
290 ?STR$(E+(D>>4)*15,3);" ";STR$(E+(D&15)*15,3);" ";STR$(E+[K]*15,3);" ";

非常に可読性が悪くなってきました。
このくらいのコード量になると、IchigoJam上でのプログラム作成と修正は辛いですね。
Windows上でテキストエディタで作成後、IchigoJamにシリアル通信にて転送しています。

IchioJamのエディタ、もう少し使い勝手がよくならんかなぁ..

動作の様子


取りあえず、ちょっと実用的なプログラムが完成しました。
このシリーズはこれで終了とします。

2016年9月 7日 (水)

IchigoJamでRTCモジュールを使った時刻表示 その2

前回のプログラムをベースにして、
キャラクタ文字を使って大きく表示するように改造しました。

  Dscn5708

動いている様子



ちょっと表示が遅い感がありますが、秒刻みにて表示出来ています。

更新頻度の少ない時・分も毎回表示しているので、これを変更時のみにすれば
もう少し早く表示出来るかもしれません。


プログラムソース(IchigoJam BASIC 1.2.1)
  GitHub:Tamakichi/IchigoJam RTC DS3231利用サンプルソースその2

10 'RTC DS3231
20 'T="16090407085800":GSB @SET
30 CLS:M=#700:A=#68:POKE M,0:L=0:S=M+16
40 LET [0],31599,4681,29671,29647,23497,31183,31215,29257,31727,31695,0,1040,2184
45 LET [20],11,11,10:X=2:Y=5
50 FOR I=0 TO 12:FOR J=14 TO 0 STEP -1
70 IF ([I]>>J)&1 D=1 ELSE D=32
80 POKE S+L,D:L=L+1
90 NEXT:NEXT
130 @LP:R=I2CR(A,M,1,M+1,7):GSB@PDG:GOTO @LP
170 @SET:N=M+7
190 FOR I=T TO T+13 STEP 2
200 POKE N,(PEEK(I)-48)<<4+PEEK(I+1)-48:N=N-1
210 NEXT
220 R=I2CW(A,M,1,M+1,7)
230 RTN
240 @PDG:FOR I=0 TO 4:LC X,Y+I:K=20
270 FOR J=2TO0STEP -1:D=PEEK(M+1+J):E=S+I*3
290 ?STR$(E+(D>>4)*15,3);" ";STR$(E+(D&15)*15,3);STR$(E+[K]*15,3);
300 K=K+1:NEXT:NEXT
330 RTN


プログラムサイズは658バイトです。まだ少々の機能追加の余地がありますね。
時報くらいは追加出来るかもしれません。

プログラムの説明

RTC(DS3231)周りの処理は前回と同じなので省略します。

40行で表示用の拡大文字(13文字分 0~9、空白、:、/)を定義しています。
1文字は3x5ドットとして15ビット分を配列変数に格納してます。
例えば、315999は2進数だと 111101101101111 になります。
これを3ビットづつ切り出して縦に並べると
   111
   101
   101
   101
   111


パターンが'0'に見えますね。
画面表示では1を"■"、0を"  "(空白)に置き換えて表示しています。

ただし、この置き換え処理を表示の都度毎回行うには無駄なので、
あらかじめ、表示用の文字に置き変えておきます(=フォントテーブルの作成)。
その処理を50~90行で行っています。
具体的には、変数Sが指し示すアドレスに変換したパターンを格納しています。

170~210行は時刻設定時に利用するサブルーチンです。
(前回と同じなので説明省略)

240~330行が表示処理を行っています。
フォントテーブルを利用してキャラクタを表示しています。
(ここの説明はちょっとしんどいので、後日追記します)


続きを読む "IchigoJamでRTCモジュールを使った時刻表示 その2" »

2016年9月 4日 (日)

IchigoJamでRTCモジュールを使った時刻表示

IchigoJamで安価なRTCモジュールを使って見ました。

Dscn5697

取りあえず、必要最低限の機能を実装しました。

20160904092832

購入はいつものAliexpressを利用しました。
DS3231 Real Time Clock Module 3.3V/5V with battery For Raspberry Pi Free shipping
100円以下で買えます。

  03

利用したのはRaspberry Pi用のRTCモジュールです。
Maxim製のDS3231がのっており、3.3VでI2Cにて利用出来ます。

Dscn5690

裏面にボタン電池(もしかしたら二次電池かもしれません)が乗っており、
一度時刻設定すれば、単体で時刻を刻みます。
IchigoJamの電源を切っても、時刻がリセットされることはありません。

Dscn5691


ピン割り付け

02

IchigoJamにはGND、VCC(3.3V)、SCL、SDAの4線を接続します。
プルアップ抵抗はモジュール上に乗っているので不要です。
このIC自体はアラーム機能あるのですが、ピンレイアウト的にその機能が利用出来ません。
ICのINT/SQWをNCにつなげれば、利用出来るかもしれません。
IchigoJamのスリープ状態からの復帰なんかに使いたいですね。

プログラムこんな感じです。IchigoJam 1.2.1で作成しています。
  ※GitHubにも掲載しています
     GitHub:Tamakichi/IchigoJam RTC DS3231利用サンプルソース

1 'RTC DS3231
10 CLS:M=#700:A=#68:POKE M,0:D="//  :  "
20 'T="16090407085800":GSB @SET
30 @LP:LC 0,0:GSB @PRN:WAIT 30:GOTO @LP
40 @SET
50 N=M+7
60 FOR I=T TO T+13 STEP 2
70 POKE N,(PEEK(I)-48)<<4+PEEK(I+1)-48:N=N-1
80 NEXT
90 R=I2CW(A,M,1,M+1,7)
100 RTN
110 @PRN
120 R=I2CR(A,M,1,M+1,7): ?"20";
130 FORI=0 TO 6
140 IF I<>3 ?HEX$(PEEK(M+7-I),2);STR$(D+I,1);
150 NEXT
160 RTN

20行をコメントアウト(コメントにして実行しないようにする)しています。
時刻設定時はこのコメント(')を取って実行します。
   
T="16090407085800" 
にて設定時刻を指定しています。この数字文字列の意味は左から
  西暦下2桁、月2桁、日2桁、曜日2桁(01が日、02が月・・・07が土)、時2桁、分2桁、秒2桁
です。
この指定により 2016/09/04 08:58:00 が設定されます(曜日は表示していません)。

プログラムとしては、
  10~30行 が初期化等の設定、
  30行 が時刻表示の繰り返しループ(メイン処理)、
  40~100行 が時刻設定用のサブルーチン、
  110~160行が時刻取得と表示用のサブルーチン
です。

時刻設定部は毎回利用するわけでもないので、別プログラムに分けた方が
よいかもしれません。表示のみなら、20行、40~100行は不要です。

I2Cを使ったデータ通信を含めこのモジュールの利用自体はそう難しくはありません。
ただし、データがBCD形式なので注意が必要ですね。

2016年9月 2日 (金)

DigisparkでUSB経由のシリアル通信が出来ない

以前動作確認しただけで使っていなかったDigisparkを使おう(赤外線送信したい)と思い、
Arduino IDE 1.6.11上に開発環境を構築しました。

Dscn5684

インストール等は公式サイトの下記のドキュメントに従って行いました。
  Connecting and Programming Your Digispark

私の環境ではCRCエラーが発生してインストール失敗しました。
インストール先の\staging\packages\の次の2つのファイルを削除するとうまくいきました。
  digistump-avr-1.6.7.zip
  micronucleus-2.0a4-win.zip

  01

  インストール後、取りあえずLチカは問題なく動作しました。
  一見、インストールは問題ないようです。

  ところが一番やりたかった、USB経由のシリアル通信が出来ませんでした。

   03

   ドライバーが正常の動かないようです。
   ドラーバーの状態を見ると、一部のドライバがインストールに失敗していました。
 
   "ドライバーの署名なし"に引っかかっているのかと思い、Windows 10を署名無し
   でインストールする状態にしてインストールしてみたのですが、今度はDigisparkを
   接続する度にブルー画面でOSが落ちていまうという悲惨な状況になってしましました。

    Dscn5686

   ドライバーの作りが悪いんでしょうねぇ。普通ここまでの状況にはならないと思うけど..

   Digisparkのファームウェアとドライバー類が古い可能性もあるので、
   下記のサイトから一式ダウンロードしてファームウェアの書き換えと、ドライバーの
   インストールを行いました。
     ・micronucleus/micronucleus  https://github.com/micronucleus/micronucleus

    ファームウェアの更新はちょっと面倒でした。
    avrdudeコマンドを使って、USBtinyによる書き込みを実施
   
     ピン接続
        No.1ピン : MOSI
        No.2ピン : MISO       
        No.3ピン : CLK
        No.6ピン : RESET 
      
 
      コマンド引数
         avrdude -c usbtiny -p t85 -U flash:w:t85_default.hex
       
     Dscn5688
    
    ファームウェアは問題なく動作している(書き込み、Lチカ問題なく動作)ものの、
    シリアル通信はやっぱりダメでした。

    書き込みは出来ているのでUSB機能のうちHIDは問題ないようです。
   
    Digisparkのフォーラムを見てもこの問題は多数発生しておりかつ解決策も
    無いようです。動いている人もいるみだいですが..   
    元々、V-USB を使った強引なUSB実装なので、これ以上の深追いは止めて
    諦めることにします。

    HIDデバイスを作る際には利用することにしましょう。
    (例:マウス、キーボード、ジョイスティック的なもの)

    価格も大きさも2倍($3.2くらい)になりますが、
    Digisparkを使うよりも Arduino Microのクローン製品を使った方が良さそうです。
    Arduino IDEも標準サポートしていますし..


    左: Digispark 、右:Arduino Microクローン製品(ただし、リセットボタン、ICSP端子なし)

     Dscn5689

« 2016年8月 | トップページ | 2016年10月 »