エントリー

IJFW 機能詳細

前回はIJFWが実装している機能について簡単に触れましたが、今回はその詳細について説明します。(少し内容が被る部分もありますが・・・)

 

IchigoJamファームウェアの書き換え

IJFWの電源(IchigoJamの電源スイッチと連動)をONにしたとき、IJFWはメモリーカード上にIchigoJamファームウェアのファイル(jam.bin)が存在するかどうかをチェックします。存在すれば自動的にIchigoJam側のマイコンをISPモードにしてファームウェアの書き換え処理に移ります。

書き換え中はCARD-LEDが点灯します。書き換えが終わったらCARD-LEDが消灯し、IJFWはIchigoJam側のマイコンを再起動させます。書き換え時にエラーが発生した場合、POW-LEDとCARD-LEDが共に点滅を繰り返して知らせます。

書き換えに成功した後、jam.binは自動的に削除されます。

 

BASICプログラムのセーブとロード

IchigoJam側からはI2C-EEPROMが繋がっているように見えるので、使い方はそれと同じです。SAVE/LOADコマンドで、プログラム番号は100~227を使用します。

SAVEコマンドを入力すると、例えばプログラム番号が100の場合、メモリカード直下に「IJ100.BAS」というファイル名でプログラムが保存されます。ファイルが無い場合は新規に作成され、ファイルが存在する場合は上書きされます。

これらのファイルはパソコン等でコピーしたり移動したりすることができます。ファイルはテキストファイルではなくバイナリファイルです。テキストエディタ等でプログラムを編集することはできません。これはIchigoJamにPCで表示できない特殊な文字があり、IJFW側で対応できないためです。

 

任意のデータの保存と読み出し

IchigoJam上からI2Cコマンド(I2CW/I2CR)を用いて、アドレス#11に対してライトおよびリードを行うと、メモリカードにデータを保存したり読み出したりすることができます。


データを保存するときのコマンド

R=I2CW(#11,#700,1,#700,2)

コマンドバイト部はダミーです。書き込みデータに反映されません。アドレスは何を指定してもかまいませんが、長さは1バイト固定です。データバイト部には書き込むデータのアドレスと長さを指定します。最大長は512バイトです。512バイトを超えたデータは無視され書き込まれません。

コマンドを実行すると、メモリカード直下に「IJDATA.DAT」に書き込んだデータが保存されます。ファイルが無い場合は新規に作成され、ファイルが存在する場合は上書きされます。


データを読み出すときのコマンド

R=I2CR(#11,#700,1,#701,2)

コマンドバイト部はダミーです。書き込みデータに反映されません。アドレスは何を指定してもかまいませんが、長さは1バイト固定です。データバイト部には読み出し先のアドレスとデータの長さを指定します。最大長は512バイトです。

コマンドを実行すると、メモリカード直下の「IJDATA.DAT」から指定バイト数のデータがIchigoJamへ送信されます。

ファイルが存在しなかったり、指定バイト数のデータが無い場合でも、I2CRコマンドは正常終了となります。エラーの処理についてはBASICプログラム側で対応してください。

 

連続追記(ロガー)モード

IchigoJam上からI2CWコマンドを用いてアドレス#12にライトを行うと、メモリカードにデータを追記し続けることができます。ロガーモードのコマンドを実行する前に、後述するコントローラのリセットを必ず行ってください。

コマンド

R=I2CW(#12,#700,1,#700,4)

コマンドバイト部はダミーです。書き込みデータに反映されません。アドレスは何を指定してもかまいませんが、長さは1バイト固定です。データバイト部には書き込むデータのアドレスと長さを指定します。最大長は512バイトです。512バイトを超えたデータは無視され書き込まれません。


ロガーモードでは下記の仕様に従ってデータが保存されます。

  • 一回のコマンドで書き込めるデータのサイズは512バイトまで。
  • データが保存されるファイル名は「0000.dat」から始まり、ファイルサイズが1MBを超えた時点で、ファイル名の数字が+1された新たなファイルに書き出される。
  • 1023.datまでファイルが作成されると次は0000.datに戻る。元の0000.datは上書きされる。
  • ファイルは全てdataディレクトリ(フォルダ)に保存される


なお、一度に書き込むデータのサイズが512バイト未満の場合、コントローラー内部にバッファリングされ、すぐにはメモリーカードに書き出されません。さらにデータを書き込んで、合計で512バイト以上になった時点でメモリーカードに書き出されます。

この動作はメモリーカードの劣化を防ぐためですが、途中で電源を切断した場合など、一部のデータがメモリーカードに書き込まれずに消えてしまう可能性があるので注意してください。

バッファリングされたデータが残っている場合、コントローラのリセットを行うことで、メモリカードに書き出すことができます。ただしBASICプログラム側でリセットの仕組みを入れる必要があります。

 

コントローラのリセット

IchigoJam上からI2CRコマンドを用いてアドレス#12にリードを行うと、コントローラー(IJFWのマイコン)の内部状態がリセットされます。ロガーモード使用後でバッファーに残っているデータがあれば、メモリーカードに書き出されます。

コマンド

R=I2CR(#12,#700,1,#700,1)

コマンドバイト部、データバイト部ともにダミーですが、リード先のアドレスはプログラムで使用していない場所を指定してください。

 

各機能の位置づけとしては、基本機能(初心者向け)として、ファームウェア書き換えと、BASICプログラムのセーブ&ロード。マニア(上級者)向けとしてそれ以外の機能がある、というところでしょうか。

 

<追記 16/4/20>

「任意のデータの保存と読み出し」、「ロガーモード」、「コントローラのリセット」のスレーブアドレスを変更。秋月電子で売っているセンサー類となるべく被らないアドレスにしました。

IJFW開発中!

みなさん「IchigoJam」をお持ちですか?

IchigoJamは、テレビとキーボードを繋げばBASICプログラミングができる1チップのボードです。こどもパソコンということですが、昔懐かしMSX世代のおじさん達にも大人気です。

こどもパソコン IchigoJam
http://ichigojam.net/


その登場から早くも2年が経とうとしていますが、現在も頻繁にファームウェアが更新されています。ファームウェアは新しいバージョンでしかできないことがあったりするので、なるべく更新したいところですね。

ファームウェアの更新方法は多くのサイトで紹介されていますが、電子工作初心者でもより簡単に更新できるようにしよう、というコンセプトから、現在IJFW(IchigoJam Firmware Writer)というボードの開発を進めています。IchigoJamのピンソケットに上から挿す形のボードで、だいたい形になってきたので今回紹介します。

IJFWの主な機能は次の通りです。メインはファームウェア更新ですが、それ以外にも便利な機能を実装しています。

  • ファームウェアの自動更新
    ファームウェアのファイル(binファイル)を置いたメモリカード(MMCおよび互換カード)をIJFWに挿し、電源を入れると、自動的にファームウェアの書き換えを行います。書き込み後ファイルは消去されます。なおLFN(ロングファイルネーム)には対応していないので、ファームウェアのファイル名を「jam.bin」に変更する必要があります。
  • メモリカードへBASICプログラムのセーブ・ロード
    IchigoJamからのSAVE/LOADコマンドで、メモリカードへのセーブ/ロードができます。I2C-EEPROMのエミュレーションをしているので、同じ要領(プログラム番号は100?227)で扱えます。セーブされたデータはそれぞれ「IJ100.BAS」のような番号別の1つのファイルになります。生のデータをそのまま記録したバイナリファイルになります。(PCでは扱えない特殊な文字があるのでテキストファイルにはしていません)
  • メモリカードへデータの書き込み・読み出し
    ある一つのファイルに対して読み書きするモードと、ひたすらデータを追記していくモードがあります。IchigoJamからはI2Cデバイスに見えるのでI2CW/I2CRコマンドを使用します。一つのファイルに対して読み書きするモードは例えばFlashAirとのデータのやり取りに、データを追記してくモードはセンサーログを取り続けるような用途に使用出来ます。


まだ基板の方が完成していないので、プロトタイプのユニバーサル基板になりますが、このような外観になります。

20160224120317.jpg

コントローラーとして、IchigoJamと同じマイコンLPC1114FN28を使い、これでファイルシステムの処理も行っています。電源についてはピンソケット経由でIchigoJam側から供給するので別途の電源は不要です。

右側には、秋月電子のUSBシリアル変換のボードが付いていますが、正式版ではオプション扱いにする予定で取り付けるランドのみ用意しています。USBシリアル変換ボードは必須ではありませんが、このボードを取り付けると、たろサ氏が公開しているIJKBが使えてさらに便利になります。

とりあえず、コントローラーのプログラムのみ先行して公開しています。LPC1114FN28ということでmbed環境で作成しました。エェェェェンベッド!!

IJFW_firmware / oks486 (mbed)
https://developer.mbed.org/users/oks486/code/IJFW_firmware/


現時点ではプログラムからハードウェアが起こせる人向けです。

あと、プログラムの各モジュールはある程度の独立性を確保していますので、例えば「FatfsIJFW」のファイル一式をそのまま持ってこれば、同じLPC1114FN28上でメモリカード用のファイルシステムが実現出来ます。LFN非対応かつ最低限の機能しか入れていないので、SDFileSystemライブラリを使うよりFlashROMの消費量は格段に少なくなります。

プログラムの詳細については、また後日解説します。

 

mbed小ネタ (ソフトウェアによるリセット)

先日、香川県で開催された「えれくら」という電子工作系のイベントに参加しました。

えれくらでは、LPC1114FN28を使用した「がちゃコンボード」というマイコンボードのキットを頒布しています。それを多少(かなり?)アレンジして製作したものがこちらです。

 20150217180013.jpg

 

プログラムの開発環境としてmbed Compilerを使っているので、タイトルもとりあえずmbedとしています。

そしてこれに合体できるような、キャラクタLCDディスプレイと、秋月電子で販売されているUSB-シリアル変換モジュールを載せたボードを作ってみました。(こちらはえれくらのキットではありません)

 20150217212547.jpg

 

こういうしょぼしょぼ製作物を持っていってドヤッしたわけですね。^^;

 

さて、このがちゃコンボード、写真を見ていただくと2種類のスイッチがあります。十字に並んだキーは、押したスイッチによって抵抗の分圧比が変わり、それをADCで読み取ることで押されたキーを判別するという仕組みです。

一方2つ横に並んだスイッチは、汎用のIO(GPIO)で読み取ります。プルアップをONにしてスイッチからのL入力を判定する方法です。

 

問題は2個並んだスイッチで、このうちの一つがDP23に繋がっています。LPC1114FN28のDP23はノーマル状態でリセット端子の機能となります。つまり、

  • 何も設定しなければリセット端子になるので、通常スイッチの入力として使いたい場合はGPIOに設定(DigitalIn)する
  • GPIOとして設定するとリセットの機能が無効になるので、手動でリセットをかけられる端子が無くなる

ということになります。

 

がちゃコンボードのような趣味用途のボードでは、手動でリセットが出来ないとかなり不便です。そこでソフトウェアリセットを使用して、特定のキー入力でリセットがかかるようにしてみました。

ググればすぐ出てきますが、ライブラリ周りの関係からか mbed_reset() は使用できませんでした。NVIC_SystemReset() でリセットすることが可能です。例えば次のようなプログラムを書きます。

 

DigitalIn din1(dp23, PullUp);
DigitalIn din2(dp25, PullUp);

  ・・・

  if (~din1 && ~din2) {
    NVIC_SystemReset();
  }

 

前述の、がちゃコンボードに合体させた自作ボードでは、DP24を引き出してスイッチを取り付けています。(写真ではLCDに隠れて見えませんが・・・) そしてここにソフトウェアリセットを割り当てています。

LPC1114FN28のDP24をL印加した状態で電源投入またはリセットをかけると、ISPモードに入ります。よく訓練されたmbedユーザーなら常識ですよね。

つまりこうすると、プログラムが正しく動作する限りという条件がつきますが、スイッチを押すだけでISPモードに入ることができ、プログラムの書き換えが楽になります。

そしてISPモードの時、DP23はノーマル状態になりリセット端子として働きますので、通常のリセット(ハードウェアリセット)をかけるときは、DP24→DP23と2回スイッチを押します。

逆にリセットが多少面倒になる・・・というのは、この際我慢ということで。

 

Ogaki Mini Maker Faire 2014

  • 2014/08/31
  • カテゴリー:Make:

8月23日と24日の2日間、岐阜県大垣市のソフトピアジャパン・センタービルで開催の「Ogaki Mini Maker Faire 2014」に出展しました。ここでのMakerFaireは2年に1度開かれ、今回で3回目となります。

 20140831194419.JPG

 

実は前回も参加していて、とあるブースで出展のお手伝いをしていました。

前回は基本見る側だったので全てのブースをじっくり見て回れたのですが、今回は正式に出展者で、頒布品もあり、コアラのマーチ振り機の面倒も見る必要があったため、ほとんど他のブースを見て回る時間がありませんでした。残念・・・

時間配分を全く考えていなかった、と言ってしまえばそれまでなのですが ^^

 20140831194417.JPG

 

来場者の方々には、京都電創庵の出展物に色々と興味を持って頂けたようで嬉しい限りです。

7セグブロックに関しても、「完成品が欲しい」との声があり、次回、11月末にビッグサイトで開催される「Maker Faire Tokyo 2014」には、完成品の頒布を予定しています。色のバリエーションも若干増えると思います。

 

あと個人的に欲しいと思っているのが、同じサークルの@yishiiさん製作のRaspberryPi用小型液晶モジュールです。RaspberryPiは画面出力がHDMIしかなく、モニタに繋ぐのが結構手間ですよね。例えば簡単なテキスト表示をさせて稼働状況やログなどを確認したいときには、これが非常に便利です。

 

20140831194418.JPG

 

当日も4個限定で頒布されていましたが、即完売という状況でした。

一応RaspberryPiユーザーの私としても、是非とも1つ欲しいところなのですが・・・次回のイベントまで待ちのようです。

 

200万画素シリアル出力カメラを試食してみた

SparkfunでLinkSprite社製「LS-Y201-2MP」というカメラモジュールを見つけたので、試しに購入してみました。価格は約$55、下記のような仕様です。

  • CMOSイメージセンサ 200万画素
  • シリアル(UART)インターフェース、最大1.2Mbps
  • 出力画像フォーマット JPEG
  • 最大解像度 1600x1200(UXGA)


このカメラモジュールは、撮影した画像をシリアル(UART)経由で取り出せます。画像フォーマットはJPEG。JPEGファイルのデータがそのまま送られてくるイメージです。

同じくシリアル出力で解像度がVGAの「LS-Y201」の後継にあたります。制御コマンドの体系がLS-Y201とほとんど同じなので、ネット上に数多く公開されている、LS-Y201用のプログラムをほぼそのまま流用できます。

高速インターフェースを使用せず、非力なマイコンでも、200万画素を扱える。
多分SDカードへの保存がやっとというくらいでしょうけど。なかなか魅力的ですよね。


外観はこのような感じです。サイズは32x32(mm)。

20140810002105.JPG

裏面

20140810002107.JPG
QCのシールを剥がしてみると・・・

20140810002106.JPG
STM32F103・・・おっとどこかで見たことのあるマイコンですね。

せっかくカメラモジュールにSTM32が付いているのに、わざわざデータをUART経由で出してきて、さらにそれを別のマイコン等のデバイスで受ける、という構成になってしまい、非常にイマイチな感じを受けます。

カメラ側のマイコンをプログラミングしたいところですが、おそらくプログラム領域は常識的に考えてプロテクトが掛けられていて読み書き出来ないはずなので、諦めるしかないようです。(あくまで憶測ですので、もしかしたら、ということがあるかもしれません)


さて、LS-Y201-2MPの使い方ですが、簡単に言えば、UART経由でコマンドを送り、初めにカメラの各設定を行います。次に撮影コマンド送信後、リードコマンドを送り、カメラからのデータをひたすら受信します。JPEGファイルの内容がそのまま送られてくるので、JPEGイメージの終了を表すマーカー値「FFD9」が来たら受信処理を終了させます。


データ受信側のマイコンとしてmbed(LPC11U24)を使った場合の回路と、サンプルコードを紹介します。10秒毎に撮影、カメラからJPEGデータを受信しSDカードへ書き込みます。

 

  • 回路図

20140810002439.jpg

 


前モデルと異なり、解像度は一度設定するとカメラ側に記憶されますが、UARTの転送速度については電源を切ると115200bpsに初期化されます。設定ミスを心配することなく、安心して高速転送に挑むことができます。

ちなみに上記構成で576kbpsまでデータが正常に受信できていることを確認しています。さすがに1.2Mbpsでは、受信データが化けてしまいました。

サンプルプログラムで使用している、SDFileSystemライブラリについてですが、デフォルトの状態ではSPIのクロックが1MHzの設定になっています。このままではSDカードへの書き込みがかなり遅いので、SDFileSystem.cppの210行目にあるの周波数設定を変更しておきます。24MHzくらいで良いと思います。

LS-Y201-2MPの最も信頼できる資料は、今のところSparkfunにあるpdfのUserManualくらいです。ただこの資料も「Pin Description」記載の端子の並びが、実際の並びとは異なるので注意が必要です。

つづく・・・

 

ユーティリティ

Author


oaks (twitter: @oks486)

記事の内容に関しては無保証です。何事も At your own risk ってことでよろしく。
リンクはご自由にどうぞ。

SPAM対策が面倒なため現在コメント投稿機能を停止しています。あしからず...

検索

エントリー検索フォーム
キーワード

Feed

リンク