ラベル B041 : Tiny SD card module の投稿を表示しています。 すべての投稿を表示
ラベル B041 : Tiny SD card module の投稿を表示しています。 すべての投稿を表示
2010年5月8日土曜日
MTM05 (Make: Tokyo Meeting 05) の準備
既に再来週に迫ったMTM05ですが、初出展にも関わらず暢気なものです。
今日は目玉(のはず)のB041の製造を開始。
一台一台本当に心を込めて半田付けしました。
悲しいかな工業製品ってこういうのは伝わりにくい。
ほぼ自己満足の世界です。
通りかかった人が「おっ。買っても良いかな。」と思って欲しいので1台1台きちんと梱包。
袋の感じはスイッチサイエンスさんのパクリです。スイッチサイエンスさんはたまに利用するのですが、対応が親切で気持ち良いです。
今回お会いする人達に気持ち良くなって頂ければと願うばかりです。
今日は目玉(のはず)のB041の製造を開始。
一台一台本当に心を込めて半田付けしました。
悲しいかな工業製品ってこういうのは伝わりにくい。
ほぼ自己満足の世界です。
通りかかった人が「おっ。買っても良いかな。」と思って欲しいので1台1台きちんと梱包。
袋の感じはスイッチサイエンスさんのパクリです。スイッチサイエンスさんはたまに利用するのですが、対応が親切で気持ち良いです。
今回お会いする人達に気持ち良くなって頂ければと願うばかりです。
2010年4月25日日曜日
B041 : Tiny SD card moduleにブートローダを載せる(AVR109対応)
随分前に対応しようと思い立っていたAVR109にようやく対応させた。
以前やった時にうまく書けなかったのはボードのクロック精度が原因。
ここ数日モニタを実装していて、思った以上にRC内蔵クロックの精度が悪いことが分かった。
エコーバックのテストでやたらと文字が化ける。
データシートを見返してみると確かに。
あらら。
実験用途とは言え、オシレータは載せておきたかったところではある。
デモアプリケーション起動時に100[us]で割り込みを発生させるようにしてオシロスコープで観察し、モニタコマンドでOSCCALを調整できるようにした。
この状態でエコーバックテストをすると当然問題ない。
ブートローダの問題もきっとこれだろうと気付き早速試す。
ブートローダには2[KB]を割り当てた。
ワード先頭アドレスは0x0C00でmakefileで.textのベースアドレスを指定する時には0x1800となる。
AVRISP mkIIでブートローダを書き込む。
次にやるのはブートローダ経由で書き込むアプリケーション。
現在実装しているデモアプリケーションは既にフラッシュの大部分を使い切っている。今回はブートローダの動作を確認するだけなので、機能をザクザク削って6[KB]に収めたバージョンを作った。
後はavrdudeの書き込み機器指定をavr109としてポートにシリアルポートを指定するだけ。
これで書き込みを実行。
べリファイまでの動作を確認した。
B041の場合FATの実装が入るのでブートローダの搭載はあまり現実的ではないかもしれない。
書き込んだアプリケーションはFATの実装+エコーバックの実装だが、6[KB]ギリギリ。
以前やった時にうまく書けなかったのはボードのクロック精度が原因。
ここ数日モニタを実装していて、思った以上にRC内蔵クロックの精度が悪いことが分かった。
エコーバックのテストでやたらと文字が化ける。
データシートを見返してみると確かに。
あらら。
実験用途とは言え、オシレータは載せておきたかったところではある。
デモアプリケーション起動時に100[us]で割り込みを発生させるようにしてオシロスコープで観察し、モニタコマンドでOSCCALを調整できるようにした。
この状態でエコーバックテストをすると当然問題ない。
ブートローダの問題もきっとこれだろうと気付き早速試す。
ブートローダには2[KB]を割り当てた。
ワード先頭アドレスは0x0C00でmakefileで.textのベースアドレスを指定する時には0x1800となる。
AVRISP mkIIでブートローダを書き込む。
次にやるのはブートローダ経由で書き込むアプリケーション。
現在実装しているデモアプリケーションは既にフラッシュの大部分を使い切っている。今回はブートローダの動作を確認するだけなので、機能をザクザク削って6[KB]に収めたバージョンを作った。
後はavrdudeの書き込み機器指定をavr109としてポートにシリアルポートを指定するだけ。
#!/bin/sh
AVRDUDE=avrdude
MCU=atmega8
PORT=/dev/ttyUSB0
PROGRAMMER=avr109
TARGET=sdcmod
FLAGS="-p $MCU -P $PORT -c $PROGRAMMER"
WRITE_FLASH="-U flash:w:$TARGET.hex"
$AVRDUDE $FLAGS $WRITE_FLASH $WRITE_EEPROM
これで書き込みを実行。
べリファイまでの動作を確認した。
B041の場合FATの実装が入るのでブートローダの搭載はあまり現実的ではないかもしれない。
書き込んだアプリケーションはFATの実装+エコーバックの実装だが、6[KB]ギリギリ。
2010年4月6日火曜日
Play WAV files on a micro SD card using Atmega8
SDカード上のWAVファイルを読み込んでPWMで音声を出力する実験。
サンプリング周波数をどこまで上げられるかの事前確認を兼ね、SDカードI/Oの様子をオシロで観察。
リングバッファによるFIFOを作り空きがあれば順次読み出しリクエストを発行する仕組み。
悪くはないが、これを調整したところで技術的な取り組みとしての魅力をあまり感じない。
もやもや考えていたらFreeRTOSで以下を試してみたくなる。
* SDカードからデータを読み出してFIFOに転送するタスク
* FIFOからデータを読み出してPWM値を設定するタスク
実現の可能性を探るために事前調査を開始。
現状の基板に搭載されているAtmega8では実用性に欠けるが事前調査なので良しとしよう。
まずはデバッグ環境のためにもシリアル通信とその他のタスクの平行動作だろうということで、
早速FreeRTOSをポーティングして10[ms]毎にシリアル通信をするプログラムを仕立てる。
シリアル送受信も割り込みベースで行われるのでタスク処理に時間的影響を与えない。
ふむふむ。
次はサンプリング周波数に応じた高精度タイマー割り込みタスクでの動作を確認したいところだ。
サンプリング周波数をどこまで上げられるかの事前確認を兼ね、SDカードI/Oの様子をオシロで観察。
リングバッファによるFIFOを作り空きがあれば順次読み出しリクエストを発行する仕組み。
悪くはないが、これを調整したところで技術的な取り組みとしての魅力をあまり感じない。
もやもや考えていたらFreeRTOSで以下を試してみたくなる。
* SDカードからデータを読み出してFIFOに転送するタスク
* FIFOからデータを読み出してPWM値を設定するタスク
実現の可能性を探るために事前調査を開始。
現状の基板に搭載されているAtmega8では実用性に欠けるが事前調査なので良しとしよう。
まずはデバッグ環境のためにもシリアル通信とその他のタスクの平行動作だろうということで、
早速FreeRTOSをポーティングして10[ms]毎にシリアル通信をするプログラムを仕立てる。
シリアル送受信も割り込みベースで行われるのでタスク処理に時間的影響を与えない。
ふむふむ。
次はサンプリング周波数に応じた高精度タイマー割り込みタスクでの動作を確認したいところだ。
2010年2月11日木曜日
B041 : Tiny SD card moduleでWAVを再生したい。
B041 : Tiny SD card moduleの電源ドロップ
ダラダラと進んでいるSDカードモジュールプロジェクトですが、「おや?」と思った瞬間があったのでオシロで現象を確認してみました。
あらら。
ご覧のとおりSDカードを挿入した瞬間に電源がドロップしています。
ChaNさんの記事にもあるようにSDカードの電源ラインは対策は必須です。
ちなみにB041は、、、
回路図
配置配線
SDカードの電源ラインを全く意識していません。
これでは上記のような波形になるのも無理ありません。
たかだかSDカードと思っていると妙な誤動作に悩まされることにもなりかねません。
あらら。
ご覧のとおりSDカードを挿入した瞬間に電源がドロップしています。
ChaNさんの記事にもあるようにSDカードの電源ラインは対策は必須です。
ちなみにB041は、、、
回路図
配置配線
SDカードの電源ラインを全く意識していません。
これでは上記のような波形になるのも無理ありません。
たかだかSDカードと思っていると妙な誤動作に悩まされることにもなりかねません。
2010年2月6日土曜日
B041 : Tiny SD card moduleにブートローダを載せる
あれこれちょっと試すときにAVRISP mkIIを持ち出すのはあまりエレガントとは言えない。
丁度Arduinoにも興味があったのでArduinoのIDEから書き込みできるようにすることを思い立つ。
が、またFUSEビットを間違ってしまう。
B041にはATmega8を載せているが、別のプロセッサの設定「low(0xf8), high(0xdd)」を書き込んでしまう。
これはATmega8ではExternal RC OSCを選択することを意味する。
Arduinoの設定ファイルの編集間違いが原因だ。
B041はInternal RC OSCで動かす設計なので当然クロックは発振しない。
間違って設定したFUSE値がわかっているので前述のようにどういう外部回路にすれば良いかわかる。
今回は幸いにも簡単な外部回路で済みそうだ。
部品箱にあった抵抗を一本(本当に適当にとった抵抗330オーム)取り出して半田付け。
AVRISP mkIIを接続して試したところシグネチャが読めた。
クロックは良さそう。
すぐさまFUSEを所望の値に書き換えて元に戻した。
提供する基板もこの辺りを扱いやすいようにしないとなぁ。
丁度Arduinoにも興味があったのでArduinoのIDEから書き込みできるようにすることを思い立つ。
が、またFUSEビットを間違ってしまう。
B041にはATmega8を載せているが、別のプロセッサの設定「low(0xf8), high(0xdd)」を書き込んでしまう。
これはATmega8ではExternal RC OSCを選択することを意味する。
Arduinoの設定ファイルの編集間違いが原因だ。
B041はInternal RC OSCで動かす設計なので当然クロックは発振しない。
間違って設定したFUSE値がわかっているので前述のようにどういう外部回路にすれば良いかわかる。
今回は幸いにも簡単な外部回路で済みそうだ。
部品箱にあった抵抗を一本(本当に適当にとった抵抗330オーム)取り出して半田付け。
AVRISP mkIIを接続して試したところシグネチャが読めた。
クロックは良さそう。
すぐさまFUSEを所望の値に書き換えて元に戻した。
提供する基板もこの辺りを扱いやすいようにしないとなぁ。
2010年1月3日日曜日
AVR109: Self Programming
AVRISP mkIIは便利なのですがオンフィールドで書き換えるには不便ですし、ユーザに書き変えを頼むわけにもいきません。
Atmelが公開しているアプリケーションノートAVR109に自己プログラミングがありましたので試してみました。ターゲットMPUはATmega8とATmega328Pです。
preprocessor.shを使うとdefines.hに記述する内容を吐き出してくれるようになっています。
ATmega8の例では
と言った感じです。
このケースの場合、PORTBのビット0がLOWレベルになっていたらプログラミングモードに入ります。ブートローダ内部では対象ポートのプルアップレジスタを有効にしますので、外付け抵抗は必要ありません。ピンにスイッチを付けておくだけでこの機能をサポートするボードが完成します。
(ブートローダはこれ以外のI/O設定は一切行いません。要するにすべてのピンが入力のままです。)
ターゲットにブートローダを書き込んで一度電源を切り、PORTBのビット0をLOWにして電源を入れます。ブートローダが起動したはずですのでminicomを使って接続してみましょう。
コンソールに大文字Sを入力した時にAVRBOOTという文字列が帰ってくればブートローダが期待通りに動作しています。ホストは特定のプロトコルに従って書き換え対象プログラムをブートローダに渡すことで、ブートローダが自身のフラッシュを書き換えてくれるというわけです。
ここで疑問が湧いてきます。
試しに、ブートローダのことを意識せず従来のユーザプログラムを書き込んでみましょう。
avrdude -c ?とすると対応しているプログラマを表示できます。
この中に「avr109 = Atmel AppNote AVR109 Boot Loader」というのがあります。
sudo avrdude -c avr109 -b 9600 -P /dev/ttyUSB0 -p m8 -U flash:w:sdcmod.hex
書き込んでみました。
あれれ。
プログラマIDやソフトウェアバージョンは取得できているようです。
でも書き込めませんでしたね。
プログラマからの応答がないようです。
ここで言うプログラマとはまさにブートローダの事です。
おかしいですね。
プロトコルの仕様では0x13を返すようになっています。
ブートローダのソースを見るとまさにそういう実装になっています。
あれれ?
ちょっと何か思い違いがありそうですね。
ここからは次回のデバッグ編に続くことになりそうです。
Atmelが公開しているアプリケーションノートAVR109に自己プログラミングがありましたので試してみました。ターゲットMPUはATmega8とATmega328Pです。
preprocessor.shを使うとdefines.hに記述する内容を吐き出してくれるようになっています。
usage: preprocessor.sh device bootsize progport prog_no cpu_freq baud_rateデバイス名とブートコードサイズ、プログラミングモードに入るポート名とポート番号、CPU周波数とUSARTのボーレートを指定します。
ATmega8の例では
preprocessor.sh atmega8 1024 PORTB 0 8000000 9600> defines.h
と言った感じです。
このケースの場合、PORTBのビット0がLOWレベルになっていたらプログラミングモードに入ります。ブートローダ内部では対象ポートのプルアップレジスタを有効にしますので、外付け抵抗は必要ありません。ピンにスイッチを付けておくだけでこの機能をサポートするボードが完成します。
(ブートローダはこれ以外のI/O設定は一切行いません。要するにすべてのピンが入力のままです。)
ターゲットにブートローダを書き込んで一度電源を切り、PORTBのビット0をLOWにして電源を入れます。ブートローダが起動したはずですのでminicomを使って接続してみましょう。
コンソールに大文字Sを入力した時にAVRBOOTという文字列が帰ってくればブートローダが期待通りに動作しています。ホストは特定のプロトコルに従って書き換え対象プログラムをブートローダに渡すことで、ブートローダが自身のフラッシュを書き換えてくれるというわけです。
ここで疑問が湧いてきます。
- ユーザプログラムはどこに配置するのでしょう?
- 何か特別な配慮が必要になるのでしょうか?
- ブートローダは上書きできないようにできるのでしょうか?
試しに、ブートローダのことを意識せず従来のユーザプログラムを書き込んでみましょう。
avrdude -c ?とすると対応しているプログラマを表示できます。
この中に「avr109 = Atmel AppNote AVR109 Boot Loader」というのがあります。
sudo avrdude -c avr109 -b 9600 -P /dev/ttyUSB0 -p m8 -U flash:w:sdcmod.hex
書き込んでみました。
Connecting to programmer: .
Found programmer: Id = "AVRBOOT"; type = S
Software Version = 1.5; No Hardware Version given.
Programmer supports auto addr increment.
Programmer supports buffered memory access with buffersize=64 bytes.
Programmer supports the following devices:
Device code: 0x77
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e9307
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: butterfly_recv(): programmer is not responding
あれれ。
プログラマIDやソフトウェアバージョンは取得できているようです。
でも書き込めませんでしたね。
プログラマからの応答がないようです。
ここで言うプログラマとはまさにブートローダの事です。
おかしいですね。
プロトコルの仕様では0x13を返すようになっています。
ブートローダのソースを見るとまさにそういう実装になっています。
あれれ?
ちょっと何か思い違いがありそうですね。
ここからは次回のデバッグ編に続くことになりそうです。
2009年10月23日金曜日
B041 : Tiny SD card module+スピーカの動作確認
通常のルーチンでSDカードから読み出したデータをFIFOに入れ、8K[Hz]の割り込みルーチン内でFIFOから読み出してPWM設定する。
オーディオ周りの回路は寄せ集めなのでなんとも評価しづらい。
そういえばこの増幅回路基板はもう4年も前に作ったもの。
あの頃よりも設計を洗練させられるようになった気がする。
でもそれは多分気のせいだろう。もっとできるはずだ。
この回路、こんなにオーディオオーディオするならそういう設計にすれば良かったなぁ。
ついでにやっぱりmp3デコーダなんかも搭載したくなるだろう。
2009年10月21日水曜日
B041 : Tiny SD card moduleにスピーカーを付ける
2009年10月20日火曜日
B041 : Tiny SD card module改良したら良さそうなところ
ついつい欲が出てしまうところ。
基本的には現状の設計でも十分に活用可能。
でも改版するとしたら以下を考えたいところ。
・MPUに外部クロックが欲しい。現状、OSCCALによる校正が必要。
・SDカードの電源を制御したい。
・MPUのROMが8KBだときつい。もう少し上のクラスのMPUが欲しい。ATmega328が候補。
・リセットスイッチが欲しい。
・SDカードアクセスLED。
・FIFO状態表示LED(EMPTY, FULL)
・AMP付けたい。
・スピーカ端子付けたい。
どうせなら・・・
・mp3デコーダを載せたい。
・AMPを付けたい。
・表示器も欲しい。(カラーグラフィックスLCDを使ってみたい。)
・スイッチが欲しい。
という方向になってしまう。
B041は当初の方向性に従い小さくてSDカードの実験ができるボードということに留めておこう。
だから、まとめると
X ・スイッチでなくIRにしたらどうか。O ・MPUに外部クロックが欲しい。現状、OSCCALによる校正が必要。O ・SDカードの電源を制御したい。O ・MPUのROMが8KBだときつい。もう少し上のクラスのMPUが欲しい。ATmega328が候補。O ・リセットスイッチが欲しい。O ・SDカードアクセスLED。X ・FIFO状態表示LED(EMPTY, FULL)X ・AMP付けたい。X ・mp3デコーダを載せたい。X ・AMPを付けたい。X ・表示器も欲しい。(カラーグラフィックスLCDを使ってみたい。)X ・スイッチが欲しい。X ・スピーカ端子付けたい。O ・AUX端子を付けてユーザ拡張に備える。
ということになる。
2009年10月19日月曜日
B041 : Tiny SD card moduleのISPではまる
順調に見えるB041。
写真に写っているATmega8、実は2つ目。
1つ目のATmega8は回路の安定性を確認しないままFUSEのコンフィギュレーションした結果、書けなくなった。
クロックの設定をする操作で、実際の回路と異なるクロック設定になってしまった様子。
まったくISPできなくなり、やむなくデバイス交換。
2つ目は慎重になり、シグネチャを何度か読む操作を実行。
案の定読むたびに出てくるシグネチャが異なる始末。
やったことは2つ。
・そもそもキャパシタが小さいだろうということで増量。(SDカードを使うことも含めて総合的に判断)
・ISP周波数を500K[Hz]から125K[Hz]に変更。
今回の回路、ATmega8の電源電圧は3.3[V]だが、500K[Hz]でISP動作が安定しなかった。
125K[Hz]に変更したところ10回立て続けにシグネチャを読んでも安定して読める。
この状態でFUSE設定を実行し、問題なく8M[Hz]動作にできた。
今度から新しい基板のAVRのコンフィギュレーションは、
シグネチャ読み込みを何度かやって安定性を確かめてから行おうと思う。
電源ももっと気を配ろう。
こういう時にオシロがあったらと思ってしまう。
B041 : Tiny SD card module基板到着
2009年9月26日土曜日
B041 : Tiny SD card moduleの発注
2009年9月25日金曜日
B041 : Tiny SD card moduleの元々のコンセプト
SDカードのI/Oテストに加えて音をちょっと出せるというのがコンセプト。
SDカードの実験のみにフォーカスした小型基板だったはず。
RTCを付けるのは良いが、最初のコンセプトがかなりボケる。
B041 : Tiny SD card moduleにRTCを付ける
2009年9月23日水曜日
B041 : Tiny SD card module
SDカードのテストボード。
基板サイズは45[mm]x30[mm]。
マイクロSDカード用コネクタを搭載し、ATmega8Lに接続される。
デバッグ用としてFT232RLを搭載。
最終的には簡単なシリアル通信でSDカードを制御できるようにするという目論見。
電源はUSBコネクタから供給する。
だからこのモジュールさえ持ち出せば色々実験できるという仕組み。
写真は検討中の様子。
最初はFT232RLの搭載を考えていなかったが、あると相当に便利。
マイコンになった気分でSDカードのやり取りを体験できるわけだ。
電源系統もこれによって選択肢が1つ増えた。
その検討の様子が写真。
結果的に基板も一回り大きくなったが、今回はこれで良い。
今後必要に応じて小型化すれば良いだろう。
登録:
コメント (Atom)