2010年7月17日土曜日
B057 : mp3 player kit
先日のSTM32開発環境構築と共に進めていたmp3 player kitについての仕様を詰めてみます。
今考えているのはちょうどB046 : uMP3PLAYERとB051 : WAV MODULEを混ぜたような内容。
B046の液晶表示器は扱いづらかったのでそれを変更し、B051のオーディオ出力を付けたような感じになると思います。
今考えているのはちょうどB046 : uMP3PLAYERとB051 : WAV MODULEを混ぜたような内容。
B046の液晶表示器は扱いづらかったのでそれを変更し、B051のオーディオ出力を付けたような感じになると思います。
- mp3ファイルなどをmicroSDカードから再生できる。
- LCDに再生状況を表示できる。
- 赤外線リモコンで制御できる。
- 時計機能が付いていて目覚ましmp3プレイヤーとしても機能する。
- ステレオスピーカ内蔵でアンプいらず。
- プラスチックケースに入っていて扱いやすい。
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を返すようになっています。
ブートローダのソースを見るとまさにそういう実装になっています。
あれれ?
ちょっと何か思い違いがありそうですね。
ここからは次回のデバッグ編に続くことになりそうです。
2010年1月1日金曜日
B046 : uMP3 PLAYERへFreeRTOSをポーティングする
B046 : uMP3 PLAYERはAtmelのATmega328Pを使っている。
FreeRTOSにはATmega323への対応がある。
基本的にはカーネルティックタイマ周辺のレジスタ設定を変更するだけで使用できる。
基本に戻ってシミュレータでハードウェアタイマがきちんと動作しているのか確認すると、タイマオーバーフロー時の割り込み有効フラグが設定されていないことに気づく。
修正した結果が_BV(OCIE1A)というわけ。
ハードウェア依存箇所の値によるハードコーディングはできれば避けてほしいなぁと思う。
使用したFreeRTOSのバージョンは6.0.1。
バージョンが上がっても幅広いデバイスをきちんとサポートし続けている。
今のところすごく信用のできるオープンソースプロジェクトだ。
FreeRTOSにはATmega323への対応がある。
基本的にはカーネルティックタイマ周辺のレジスタ設定を変更するだけで使用できる。
- TIMSKをTIMSK1に変更する。ATmega328PにはTIMSKというレジスタは存在しない。
- portCOMPARE_MATCH_A_INTERRUPT_ENABLEのビット定義を修正する。_BV(OCIE1A)
- 割り込みハンドラ名を修正する。TIMER1_COMPA_vect
基本に戻ってシミュレータでハードウェアタイマがきちんと動作しているのか確認すると、タイマオーバーフロー時の割り込み有効フラグが設定されていないことに気づく。
修正した結果が_BV(OCIE1A)というわけ。
ハードウェア依存箇所の値によるハードコーディングはできれば避けてほしいなぁと思う。
使用したFreeRTOSのバージョンは6.0.1。
バージョンが上がっても幅広いデバイスをきちんとサポートし続けている。
今のところすごく信用のできるオープンソースプロジェクトだ。
ラベル:
B046 : uMP3PLAYER
2009年12月30日水曜日
B046 : uMP3 PLAYERの組み合わせデバッグ
今回は
このハードウェアはSPIづくし。
一連の動作を先日までに実装したドライバで行なうことになる。
まずは単機能毎のテスト。
VS1011e周辺のアナログ回路の動作も確認。
一応問題なさそう。
念のため波形も確認しておく。
次にVS1011eを使った再生。
これはSDカードから読み出したデータをVS1011eへ転送するというもの。
アプリケーションノートで再生方法について再度確認。
今回はvs1011e_play関数にストリーム読み出し関数のポインタを与えることで
自動的に読み込みと再生制御を行ってくれるように設計した。
再生してみるとイヤホンから音楽が流れた。
正直に嬉しい。
現段階はハードウェアチェック用ファームウェア。
ユーザ向けのアプリケーション用ファームウェアは別途設計することになる。
- SDカードからデータを読み出す。
- 読み出したデータをVS1011eに書き込む。
- 上記動作前後にAT45DB161Dへの入出力を実行する。
- 上記動作前後にLCDへの入出力を実行する。
このハードウェアはSPIづくし。
一連の動作を先日までに実装したドライバで行なうことになる。
まずは単機能毎のテスト。
VS1011e周辺のアナログ回路の動作も確認。
一応問題なさそう。
念のため波形も確認しておく。
次にVS1011eを使った再生。
これはSDカードから読み出したデータをVS1011eへ転送するというもの。
アプリケーションノートで再生方法について再度確認。
今回はvs1011e_play関数にストリーム読み出し関数のポインタを与えることで
自動的に読み込みと再生制御を行ってくれるように設計した。
再生してみるとイヤホンから音楽が流れた。
正直に嬉しい。
現段階はハードウェアチェック用ファームウェア。
ユーザ向けのアプリケーション用ファームウェアは別途設計することになる。
ラベル:
B046 : uMP3PLAYER
VS1011eのドライバを書く
VLSI社のVS1011eのドライバを書く。
レジスタ全般を読めるようにして、いくつかのレジスタへの設定インターフェースを実装。
途中レジスタの書き込みや読み込み動作で怪しい挙動を示しているのを発見。
オシロで波形を見ていたらおかしな波形がMISOに出てきていてすぐに気づけた。
データシートを再度確認するとSPIのクロックがスペックを超えていた。
すぐにクロックを修正して、動作確認。
期待通りレジスタが正しく読めることを確認した。
レジスタ全般を読めるようにして、いくつかのレジスタへの設定インターフェースを実装。
途中レジスタの書き込みや読み込み動作で怪しい挙動を示しているのを発見。
オシロで波形を見ていたらおかしな波形がMISOに出てきていてすぐに気づけた。
データシートを再度確認するとSPIのクロックがスペックを超えていた。
すぐにクロックを修正して、動作確認。
期待通りレジスタが正しく読めることを確認した。
ラベル:
B046 : uMP3PLAYER
AT45DB161Dのドライバを書く
AT45DB161DはAtmelから出ているSPIインターフェースを持つフラッシュロム。
2つのSRAMで構成されたバッファとメインのフラッシュロムから構成されている。
これが8ピンSOPで提供されているのだから使わない手はない。
2つのSRAMで構成されたバッファとメインのフラッシュロムから構成されている。
これが8ピンSOPで提供されているのだから使わない手はない。
xputs(PSTR("buffer1 write:\r\n"));
at45db161d_buffer1_write(0, 16, romtest_src);
xputs(PSTR("buffer1 read:\r\n"));
at45db161d_buffer1_read(0, 16, romtest_des);
xputs(PSTR("buffer1 to main memory with erase:\r\n"));
at45db161d_buffer1_to_main_memory_page_with_erase(0);
xputs(PSTR("main memory page to buffer1 transfer:\r\n"));
at45db161d_main_memory_page_to_buffer1_transfer(0);
xputs(PSTR("buffer1 read:\r\n"));
at45db161d_buffer1_read(0, 16, romtest_des);
xputs(PSTR("main memory page read:\r\n"));
at45db161d_main_memory_page_read(0, 0, 16, romtest_des);
at45db161d_main_memory_page_to_buffer1_compare(0);
at45db161d_status_register_read(&stat);
if ((stat & 0x40) == 0x00) {
xputs(PSTR("Verify successed.\r\n"));
} else {
xputs(PSTR("Verify failed!\r\n"));
}
ラベル:
B046 : uMP3PLAYER
NOKIA 6100とかNOKIA 6610と呼ばれている液晶モジュールについて
STNの液晶モジュールでSPIで制御できるというもの。
今回B046 : uMP3 PLAYERのために二つの取り扱い店から合計で7個購入した。
これに関して少し整理しておく。
二つの取り扱い店から購入したのだが、実際に制御しようと思った時にはまるのがこれ。
取り扱い店も正確な情報は把握していないと考えた方が良い。
調べて見ると少なくとも4つのコントローラがあるようだ。
■コネクタの取り扱いについて
0.5[mm]ピッチ自体はそんなに難しいハンダ付けではないのだが、コネクタの形状に起因した難しさがある。フラックスを軽く塗ってハンダ付けしたところ、コネクタの溝にそってフラックスがハウジング全体に流れ込んでしまう。
また、取り外しや取り付けには細心の注意が必要。
乱暴に取り外そうものならLCD側のコネクタがパターンから離れたり、ハウジング内部のピン(極細)が変形してしまう。
これによって何より困るのが動かないときのデバッグ。
先にあげたコントローラが不明な事が重なった場合、一体何を見ているのかわからなくなる。
実際に最初に実装したコネクタは若干変形していてLCDの初期化に成功したり失敗したりしていた。こういう現象がデバッグ1台目で発生すると結構手間取ってしまうことがある。
■バックライトの電圧について
バックライトの端子に印可する電圧というのが示されているものの、これでは設計できない。
多くは+7Vという一瞬考えてしまう電圧が示されている。
購入したLCDの一つをバラバラにしてみたところ単なるチップLEDの直列回路のように見える。
これなら別に+7Vという電圧に拘らなくても順方向電圧x2と電流制限抵抗を考慮すれば良い。
以上3点が今回のプロジェクトで整理が必要と思ったところ。
機会があれば各LCDモジュールの写真を挙げて識別方法とそのライブラリを掲載したい。
今回B046 : uMP3 PLAYERのために二つの取り扱い店から合計で7個購入した。
これに関して少し整理しておく。
- 外見が少し異なれば中身は大幅に違う。
- コネクタの取り扱いについて。
- バックライトの電圧について。
二つの取り扱い店から購入したのだが、実際に制御しようと思った時にはまるのがこれ。
取り扱い店も正確な情報は把握していないと考えた方が良い。
調べて見ると少なくとも4つのコントローラがあるようだ。
- EPSON社S1D15G00
- EPSON社S1D15G10
- LEADIS Technology社LDS176
- PHILIPS社PCF8833
■コネクタの取り扱いについて
0.5[mm]ピッチ自体はそんなに難しいハンダ付けではないのだが、コネクタの形状に起因した難しさがある。フラックスを軽く塗ってハンダ付けしたところ、コネクタの溝にそってフラックスがハウジング全体に流れ込んでしまう。
また、取り外しや取り付けには細心の注意が必要。
乱暴に取り外そうものならLCD側のコネクタがパターンから離れたり、ハウジング内部のピン(極細)が変形してしまう。
これによって何より困るのが動かないときのデバッグ。
先にあげたコントローラが不明な事が重なった場合、一体何を見ているのかわからなくなる。
実際に最初に実装したコネクタは若干変形していてLCDの初期化に成功したり失敗したりしていた。こういう現象がデバッグ1台目で発生すると結構手間取ってしまうことがある。
■バックライトの電圧について
バックライトの端子に印可する電圧というのが示されているものの、これでは設計できない。
多くは+7Vという一瞬考えてしまう電圧が示されている。
購入したLCDの一つをバラバラにしてみたところ単なるチップLEDの直列回路のように見える。
これなら別に+7Vという電圧に拘らなくても順方向電圧x2と電流制限抵抗を考慮すれば良い。
以上3点が今回のプロジェクトで整理が必要と思ったところ。
機会があれば各LCDモジュールの写真を挙げて識別方法とそのライブラリを掲載したい。
2009年12月12日土曜日
B046 : uMP3PLAYERのLCDがやっと表示された
某所通信販売で購入した液晶。
nokiaの携帯電話部品ということらしい。
取り付け直後からトラブル発生。
基板とLCDの間にジェルを入れて固定したのだが、
曲がってしまったので取り付けなおそうと思って外したらコネクタがもげた。
部品の性質もあるだろうが、基板のパッドも小さい気がする。
半田付けすれば使えそうなので予備で購入してあったもう1つと交換。
これで納得。
販売元が主張するコントローラのデータシートを入手して実装してみるものの、
うんともすんとも言わない日が1週間ほど続く・・・。
この手の部品は市場に大量に流出しているので仕方なくウェブ上の調査も開始。
大量の互換品があるらしい。
おぉ。携帯電話だから供給リスクを最小限にしたいのだろうか。
色々調査するなかで行き着いた結論は、「販売元が主張するEPSON社製コントローラの互換品という説明は間違い」であるということ。
彼らの主張ではEPSON S1D15G10 compatibleだが、実際にはPhilips LDS176かあるいはPCF8833であるということ。 これらは非常に良く似た操作で制御できるが、実際動かないのだから互換とは言えない。彼らも市場にこれだけの「そっくりさん」が出ていることを知らないのかもしれない。
調査の結果を元に実装を修正。
わかってしまえばなんでもない。
無事にLCDコントローラを初期化できた。
同じようにはまる人がいると人類の時間が勿体無いので販売元にも連絡。
こういうのを乗り越えられるかどうか?というのは自分にとって大切になってくるだろう。
それにしてもひどいなぁ。
ラベル:
B046 : uMP3PLAYER
2009年12月7日月曜日
B046 : uMP3PLAYERの実装とデバッグ
ここ一週間での作業は以下のとおり。
まずは実装。
意外にも苦労します。
その理由はコネクタ形状にあり。
フラックスを塗っても半田がコネクタの溝に沿って流れてしまう。
ちょっと熱しすぎたので心配だ。
この回路は元々+5.0V系電源で設計されていたものを流用したものだが、
+3.3V系に設計変更した時に修正が漏れてしまった。
確認作業も甘かった。
この基板には入力電圧(+6.0V)と+3.3Vしか存在しない。
仕方がないのでUSBホストから供給される+5.0Vを利用することに。
でも本来これは正しくない。
USBホストに接続されていない時にはVCCIOに+3.3Vが印加され、VCCは0.0Vだからだ。
この時の動作はデータシートには書かれていないが、普通に考えて良くないだろう。
これは他の機能をデバッグするための暫定措置。
まぁ、こんなことでガックリ来ていては先に進めないのでこれはこれとして考えよう。
ラベル:
B046 : uMP3PLAYER
2009年11月29日日曜日
B046 : uMP3PLAYER基板到着
2009年11月23日発送となっているので6日で届いたことになる。
エアーメールなので飛行機のどの便にどういう経路で載るかによって違うのだろう。
今回はすごく早かった。
ラベル:
B046 : uMP3PLAYER
2009年11月27日金曜日
B046 : uMP3PLAYER基板発送の連絡を受け取る
Olimexから基板発送の連絡を受け取る。
最近はちゃんと?インボイスを添付して連絡をくれる。
私が発注し始めた6年前はもっと適当だった。
基板も最近は綺麗になってきてるし嬉しい。
あとは支払い形式が改善されれば嬉しい。
ラベル:
B046 : uMP3PLAYER
2009年11月17日火曜日
B046 : uMP3PLAYERのファームウェアを検討
このあたりを考慮した設計がミソ。
FreeRTOSを載せる予定だがまだ詳細まで検討していない。
確認順序
- 電圧を確認する。
- MPUへのプログラム書き込みを確認する。
- USBインターフェースの動作を確認する。
- スイッチが読めることを確認する。
- SD CARDからの読み込みを確認する。
- FLASH ROMへの書き込みを確認する。
- LCDへの書き込みを確認する。
- MP3 decoderへの書き込みを確認する。
The hardware components only have a SPI interface except USB and switches.
I'd like to use FreeRTOS, but I don't have the detail of the plan.
Debug step
- Voltage level.
- Program to the MPU.
- USB I/F.
- Read the switches.
- Read from the SD card.
- Write the FLASH ROM.
- Write the LCD.
- Write the MP3 decoder.
ラベル:
B046 : uMP3PLAYER
2009年11月16日月曜日
2009年11月15日日曜日
B046 : uMP3PLAYERのスイッチを変更
今日、部品ボックスから数年前購入したスイッチが出てきた。
ALPSのSKQUDBE010で4方向+プッシュスイッチがひとつになったもの。
I found switches which I bought few years ago.
SKQUDBE010 made by ALPS is a 4 directional switches with center-push function.
そして設計変更。
I changed the board design.
There are 2 TACT switches, and the SKQU.
ATmega8の空きポートがないので2つのタクトスイッチはアナログ入力に接続。
強引だけど仕方がない。
There are no any free digital input port.
so I connected the 2 TACT switches to the analog input pins.
It's a little overly aggressive, but It's just O.K.
設計ではATmega8を使っている。
今日は搭載予定のATmega328を購入。
The design used ATmega8 MPU.
I'm going to use ATmega328 MPU.
So I ordered the MPU today.
ラベル:
B046 : uMP3PLAYER
2009年11月14日土曜日
B046 : uMP3PLAYER配線完了
先週からコツコツとやってきた配線をひとまず完了させた。
ディジタル系とアナログ系の分離がイマイチなのだけど、ひとまずこれで製造してみるつもり。
今回はカラーLCDを採用しているのだけど、これもいつまで入手できるかわからない。
旬なうちに作ってみようという方向。
I just finished routing wires.
It's not so good design of digital-analog isolation.
But I'm going to order the PCB.
In this project I used a color LCD made by Nokia, It's a special component.
I should order it ASAP if I wanna be more uMP3PLAYER.
ラベル:
B046 : uMP3PLAYER
2009年11月10日火曜日
2009年11月9日月曜日
B046 : uMP3PLAYER
B043 : MP3 PLAYERプロジェクトの方向性を修正。
B046 : uMP3PLAYERとして設計。
B041 : Tiny SD card moduleの設計を再利用して工数を大幅縮小する・・・
ラベル:
B046 : uMP3PLAYER
登録:
コメント (Atom)