« 2011年1月 | トップページ | 2011年3月 »

2011年2月の2件の記事

2011年2月15日 (火)

フォトフレーム: ランダム表示とタクトスイッチでの制御

 スライドショー機能は出来たが、電源を入れる度に最初の画像から同じ順番で表示されるのはフォトフレームとしては面白くない。より実用的であることをめざして追加機能の開発にもう少し時間をかけてみた。前回までの表示位置を覚えているレジューム機能や、ランダム表示機能、スタンドアロンで画像の切り替えができるタクトスイッチの実装などである。

忘れていたリニアPCMプレーヤーの改修(2/6/2011)
 フラッシュROMを使ったレジューム機能開発のため、以前に開発したAVRのリニア(L)PCMプレーヤーのソースを久しぶりに覗いた。ここでは内蔵のEEPROMに、SDカードのディスク情報を記録し、10枚までのSDカードの頭出しができるようになっている。このやりかたのおさらいだ。

P2153688

 ソースを眺めているうち、このソフトで、Windows Media Player(以降WMP)でデコードしたWAVファイルのサポートが懸案になっていることを思い出した。これは、LPCMプレーヤーのソースコード公開後、Shuji009さんから指摘のあった不具合である。

 WMPで、音楽CDからWAVファイルをリッピングすると、WAVファイルの基本的なパラメーターの入ったデータブロック(FMTチャンク)の前に、WMPは何故か附帯情報の入ったLISTチャンクをヘッダーの直後に入れてしまう。これが原因で不正なWAVファイルとみなされ再生されない。

 チャンクなので、何処にあっても問題はないだろうと言うのがMSの言い分だろうが、これまでのWAVファイルで、ビットレートや、データレングスを規定する最も基本的なFMTチャンクが後に来たものを見たことはない。こういう業界常識を無視したいつもの横暴なMSの態度に腹が立って(というのは言い訳で、このときはたまたま猛烈に忙しかっただけ)、放ってあった。

 修正が一年後というのも気の抜けた話だが、まあ修正しないよりはましだろうと、ソースを見直す。Shuji009さんの言うように修正はあっけなかった。FMTチャンクのサーチのための3ステップの追加とパラメータの入っているアドレスを固定値から相対値に変更する数ステートメントの修正で終わった。

 これまでのWAVファイルが再生できることは確認したが、WMPが作ったテストするべきファイルを作ることが出来ない。WMPには、MP3や、WMAファイルをWAVに変換する機能がないのだ。やれやれどうしたものだろう。ウェブに尋ねる。何だと、WMPは音楽CDからリッピングすることができるだけで、PC上のファイルをいじることは出来ないのか。

 いかにもMSらしい虫の良い仕様だ。あくまでも自分のところに囲いこんで外には行かせないのかなどと、悪態をつきながら、音楽CDを入れて短い曲をWAVファイルにする。バイナリエディターで確認する。CDタイトルなどの漢字テキストが入ったLISTチャンクが、しっかりヘッダーの後に納まっている。再生してみた。よーし、問題なく音が出た。これで心配なくリリースできる。

 最初、1号機(パラレルLCD)のファームをブレッドボード上のミニLCD(2号機以降)の回路に書き込んでうんともすんとも言わず、動かない、動かないと悩んでいたことは秘密である。いや忘れること、忘れること。自分でも驚くばかりだ。LPCMプレーヤーのハードが2種類あることをすっかり忘れていた(修正したソースは、元記事、「量産を目指したリニアPCMプレーヤー3号機完成」に並べてファイルを置いてあります)。

スライドショーのランダム表示の開発(2/9/2011)

 ランダム表示のためには、乱数を作る必要がある。ウェブを漁る。どうもUNIXの乱数関数rand()は余り評判が良くなさそうだが、とりあえずは今のところこれしかない。ARM用のgccにあるのか試しにコンパイルしてみた。ちゃんと入っていた。えらいもんだ。 

 ここを見本に実装する。最初はうまく動かなかったが、サンプルは実数なのに整数にしてしまったためオーバーフローが起きていたことがわかり、ワークを使ってオーバーフローを回避する。出た出た。ただ、乱数の初期値にすべき変数がどうもうまく入らない。UNIXの乱数関数rand()は、乱数の初期化関数(srand(初期値))で初期値を変えて与えないと、乱数の出てくる順番が一定になってしまうというので、ここは起動の度に違う値が欲しい。参考にしたウェブではRTC(リアルタイマークロック)の時刻を初期値に使っている。

 まあ、あまりこだわることはないのだが、幸いこのM.Thomas氏のソースはfileシステム(FatFS)のタイムスタンプのため、RTCを実装している。それにこのCQ-STARM基板は、感心なことにRTCのバックアップ電源のVbatは、0オームの抵抗で分割できるようになっていて、以前、CPUチップの上に、コイン電池のフォルダーを両面テープで固定し、ちゃんとした時刻が出るようにしてある。折角動いているRTCだ。利用しない手はない。

P2153686

 しかし、ソースリストの中のTimeDisplayとかcurrent_timeといったそれらしい変数を試すが全部0。なんだ定義しているだけで何にも入れていないじゃないか。さらに探し回る。やっとのことで、現在秒を32ビットバイナリに出す関数RTC_GetCounter()を見つけた。これで実装する。うむ、同じ順番でない乱数が出始めた。しかし、いくつか乱数を出すと同じファイル番号(32ビットの乱数をファイルの数で割っている)が出てくることは避けられない。このままでは、何回も出てくる写真と、一回も出てこない写真がでてくる。

重複しないランダム表示のロジックを考える(2/11/2011)
 ランダムにはなっているが、これでは見ていて飽きてしまう。 シャッフルしたトランプをめくっていくように、一回表示された画像は、全部の画像が出来切るまで重複しないようにしたい。

 このロジックは結構、複雑になる。不揮発メモリはいらないが、出てくる乱数を配列に蓄積しながら、初めての数かどうか判断していかないといけない。まあ、FPGAと違って、printfデバッグが出来るので、いざとなったら変数を全部出して解析していけるので気分が楽だ。

 何もデータがないときや、JPEGファイルが1枚だけの時などの特殊な条件でも動くようにロジックを考える。昔を思い出して夢中になる。午後からの半日で、ほぼ想定どおりの動きをするランダム表示機能が完成した。電源を入れると、UARTには、乱数を出しては重複を調べ、次のファイル番号を調べるメッセージが次々に流れ、SDカードにはいっているJPEGファイルがランダムに表示されていく。乱数なので見ていて飽きない。最後の方になると重複が増えて何回も乱数を出しているのがわかる。少しづつフォトフレームが実用品に近づいていくのが楽しい。Randomuart

タクトスイッチの実装(2/14/2011)

 ランダム表示機能の開発はうまくいった。次はレジューム機能の予定なのだが、フォトフレーム画像をランダム表示してしまうと、前回の状況を保存するレジューム機能の目的が良くわからなくなってきた。ランダム表示では前の状況に戻すことに意味がない。

 折角、I2Cフラッシュを揃えたのだが、ここの開発は先送りし、それよりニーズの高いタクトスイッチを先に実装することにした。これはスタンドアロンでフォトフレームを動かすには欠かせない機能である。3ヶ並んだボタンのうち、中央ボタンの長押しでランダム/順次表示の切り替えをし、両側のボタンでLPCMプレーヤーのように画像を前後に切り替える。

 タクトスイッチは秋月で売っていた¥10のカラフルなスイッチだ。値段が安いせいかスイッチの押し具合が少しぎこちないが、まあご愛嬌である。場所は、STM32基板の端に並べる。10KΩのプルアップ抵抗を各スイッチにつけて、スイッチの実装はあっさり終わった。残るはスイッチ制御のソフト開発である。

P2153677

スイッチ制御で想定される必要な機能は、
(1)スイッチ入力の検知機能
(2)スイッチ入力による外部割込み制御
(3)チャタリングなどを防ぐ時間測定

である。いずれもAVRでは、簡単に実装できる機能だが、32ビットプロセッサーのSTM32ではそれぞれ、相当な準備が必要だ。以前買った「STM32マイコン徹底入門」には(2)の割り込みを除いた機能については解説がある(チャタリングのところが特に詳しい)が、入門書なので、全体を俯瞰するのには役に立っても実際のコーディングには残念ながら余り役に立たない。

 結局、STマイクロの標準ペリフェラルライブラリの中のHelpファイル(これは全部を網羅しているので役に立つ)が一番役に立った。とりあえずは(1)だけでも動きそうなので、これを実装する。参考までにソースの一部を紹介する。

/* まずポートGPIOEのクロックを立ち上げる  */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);  // Eポート

/* PE7からPE9をタクトスイッチの入力ピンに。GPIO_Mode のIN_FLOATINGが入力 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOE, &GPIO_InitStructure);

/* 以上は初期化。 次のステートメントでピンの値がcに入る(0か1)  */

  c = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_7);

長たらしいステートメントを連ねてやっとのことでタクトスイッチが動いた。 チャタリング防止機能はまだついていない。これまでの値を常に保存していて、立ち上がりと立下りを検知し、UARTに出力する。盛大なON/OFFの行が出るのかと思ったら、不思議なことにチャタリングが全くない。忠実にスイッチのON/OFFが一回しか表示されない。

 STM32のピンはチャタリングを吸収する機能がついているのか、このスイッチが元々チャタリングがないのか。どうも(3)は考える必要がなさそうである。(2)は、画像を表示している時にスイッチを押してもあとから機能してくれるためには必要だが、どうしても必要と言うものではない。

 となると、長押しの検出だけが残った。これは、これまでのSystickタイマーで出来そうなので(押された時タイマー値をリセットし、離れた時その値を調べる)、タイマーをあらためて設定する必要はなさそうだ。実装を続ける。

 タクトスイッチのコーディングは思いのほか早くすんだ。フォトフレームはスタンドアロンでほぼ想定した動きをするようになった。電源を入れるとフォトフレームは、ランダム表示モードで立ち上がり、Bスイッチを押すとスライドショーを中止して、A、Cスイッチを押すと、現在表示しているファイルの前後のファイルを表示する。

Bスイッチを更に押すとスライドショーを再開する。スライドショーの順序表示とランダム表示はBスイッチの長押し(1秒以上)でトグルする。これでUARTなどを使わなくても自由に画像を選んで表示ができる。

 ソースを公開することは迷った。雑誌付録のCQ-STARM基板とはいえ、JPEGライブラリ実装のためにCPUを換装しているので、オリジナルのCQ‐STARM基板では動かない。FPGAの部分はまだ公開していないので、このままではフォトフレームは作れない。SPIで16ビットRGBデータが送られるだけだ。

 でも、ランダム表示や、DMAを使ったSPI、JPEGデコードルーチンや、BMPファイルの読み出しロジックなどは、最近沢山の種類が出回ってきたSTM32基板で色々なものを開発する時の何かの参考になるかもしれない。とにかく公開してみることにした。公開するファイルは、Eclipseのプロジェクトファイルの形になっている。コンパイル等は、以前の記事を参考(2009/6/1)にしていただきたい。

以下のZIPファイルは、ここのブログの1MBという制限を越えるため、FatFSのオプションファイルを削除してあります。LFNを使うときは正規のサイトからダウンロードしてください。また、UARTは沢山のテストメッセージが出るようになっていますが、UARTをつながなくても動きます。

「STM32_PHO.zip」をダウンロード


| | コメント (5) | トラックバック (0)

2011年2月 6日 (日)

フォトフレーム: ケースの実装とI2CフラッシュROM

 恒例の北海道のスキー合宿があって、ほぼ1週間、電子工作から遠ざかっていた。以下は出かける前に書いてあった記録のまとめである。

「STM32マイコン徹底入門」を購入(1/21/2011)
 どうしようか迷っていたが、たまたま図書券を貰ったので仕事の帰りに買ってしまった(¥2310)。著者は何と専門家ではない、IT関係の弁護士さん(ブログがある)が書いたSTM32プロセッサーの入門書である。

 良く出来ている。専門家でないので説明の仕方が独特である。コラムには、今さら聞けない電子技術の基本的なノウハウの紹介がある。とてもためになる。

 所長が、これまでウェブの情報を手がかりに、あーでもない、こーでもないと試行錯誤して何とか動かしてきたペリフェラルの解説が丁寧で詳しい。もう少し早めに出版されていたら、これを読んであんなに苦労しなかったなあと思うところが沢山ある。

Stm32

 そういった意味では、STM32をまともに動かそうとしている人にとっては大変おすすめの本だ。しかし、入門書という位置づけとなると少し苦しいところがある。そもそも32ビットプロセッサーを入門のプラットホームにするところに無理があるようだ。

 本当のマイコンの入門というのならやはり8ビットプロセッサーから始めるのが一番だろう。データのハンドリングは8ビットが基本でわかりやすいし、タイマーやポートの設定は簡単で初心者にも直感的に理解し易い。最近はCPUチップのフラッシュの量も増えてきたのでソフトの開発はC言語でサイズを気にしないで自由に書ける。

 それに対してSTM32などの32ビットプロセッサーのペリフェラルの設定は半端な量ではない。おまじないのようなスタートアップルーチンを始め、割り込み環境は猛烈に複雑だ。この本の程度の解説では予備知識なしには全く先に進めないだろう。初心者は記事のあとを辿るだけならできるが、この本だけで自分の思い通りにプロセッサーを自由に動かすところまでは残念ながら不可能に近いと思う。

 32ビットに必要なのは、Ardiunoに代表されるような簡易なOS(またはモニター)が組み込まれた開発環境だ。簡単なコーディングで色々なペリフェラルが自由に使えれば言うことはない(mbedがそれに近いのかも)。普通の人にとっては、LEDがついたり消えたり、モーターの速度が制御できたりすれば良いので、中のPWMなどのレジスターの動きはどうでも良い。

 非力な8ビットマシンには、オーバーヘッドによる性能低下が心配な開発環境が用意され、性能に何の問題ない32ビットには、そういう便利なものがないという矛盾したことになっている。著者に責任があるわけではないが、何か状況が逆さまになっているような気がしてならない。

フォトフレームの第9ステップ、実装(1/22/2011)

 雑誌付録のFPGA XP2基板とARMプロセッサー基板(CQ-STARM、但しCPUはSTM32F103VEに換装)を使ったフォトフレームプロジェクトは大詰めを迎えた。基板の実装である。いかにも素人工作だが、裏蓋にビス穴を空けて基板をそこに固定することにする。ケースの中に入れるのは少し無理だ。

Pict0010

 そもそも、このケースは、以前買った中古(パチンコ)アナログ液晶のタバコのヤニで色の付いたジャンク品だが、思ったよりしっかりしているので、スイッチをつけたりスタンドをつけたりしてみた。本式には、もう少しまともなケースに入れるべきだろうが無精している。

 電源は、この間、秋月で手に入れた更に強力な5V 3AのDCアダプター(¥750)にした。これだけ余裕があると殆ど熱を持たない。DC-DCコンバーターも快調だ。これで十分である。第9ステップの工作は、電源ケーブルをFPGA基板とARM基板に振り分け、基板の四隅の固定穴(それもさぼって半分づつの4ヶしか空けない)にセパレーターを経由してケースに固定するだけであっけなく終了した。これでハード的には完成である。

 問題はソフトの改修だ。現在のソフトはありあわせのものなので、UARTをつないで端末からコマンドでJPEGファイルを指定しないと表示されない。これではスタンドアロンのフォトフレームにならない。少なくとも、フォトフレームは電源を入れるだけで、画像が次々に映し出されるスライドショー機能が動かないと話にならない。

 とはいえ、ソフト開発の前の段階、全体の仕様が中々決まらない。ファイル名を表示するLCDなどが必要かどうかで迷う。タクトスイッチだけにするか。LEDくらいはつけたほうがわかり易いかもしれない。このへんを決めずに気ままに開発していくやりかたもあるが、明らかに効率は悪い。

 BMP画像ファイルの表示は、色々考えたが、難しいので結局やめることにする。BMPファイルの画像分のバッファーがなければ逆さまから転送することは出来ないし、液晶モニターの制御信号で換えるのは、FPGAに画像データ以外のインテリジェントな機能を持たせる必要があり、大掛かりな変更が必要でしかも美しくない(STM32から別の制御線を引けばできるけれど)。

 実用的なフォトフレームとしては、他にも不満なところが多い。まず、画像の切り替えに2秒近くを要し、そのあいだ画面が消えてしまう。JPEGも4:3の比率以外の画像は表示できないし、この比率でも表示できないJPEGファイルがある(800x600 1600x1200など)

 みんな何とかしようと思えば出来ないものではないが、まあ、試作品としては、この程度で良いだろう。元はといえば、FPGAの勉強のための習作として企画したプロジェクトだ。これだけ動いただけでも上出来と思わなければならない。

秋月電子で1MHzの早いI2C EEPROMを調達してきた(1/24/2011)

 とはいえ、スライドショーでいつもSDカードの最初のJPEGファイルから表示されるのはつまらない。この前のリニアPCMプレーヤーのように、前の表示を記憶しておいてSDカード単位に頭出しをするようにしたり、任意のファイルから開始するランダム表示機能くらいは欲しいところだ。それには不揮発メモリが必要だが、STM32にはAVRのようにEEPROMはついていない。

 フラッシュメモリなら、Lattice XP2基板のためにSPI接続のフラッシュROM(EEPROM)、M25P40(512KB)を余分に買ってあるが、こんなに多量のメモリは必要ない。STM32用のフラッシュROMとしては、だいぶ前に千石電商でROHMの2KBのもの(BR24-S16  ¥100)を買ってあった。SPIインターフェースは、SDカードやFPGAで使っているので、このフラッシュのインターフェースは勉強の意味をこめてI2Cである。

 STM32でI2Cを使う機会が出来た。千石ではデータシートを別売りしているが買わなかった。最近は、ウェブでもっと詳細なデータシートが簡単に手に入る。今度もウェブから適当なデータシートを落としてアクセス法を勉強し始めた。

 ところがウェブを探しているうち秋月で、RHOMよりもっと安くて、早いI2CのフラッシュROMを売っているのを見つけた。MicroChip社の24FC256(¥90)である。こちらのほうが安くてメモリ量16倍。しかも早い(1MHzで動く)。早速手に入れる。秋月電子の安さを実感する。繁盛して店が混雑するわけである。

I03568

 I2Cフラッシュのアクセスは、アドレスの設定が少し違うくらいで、どのメーカーもほとんど同じである。共通のアクセス手段で読み書きができそうだ。気をつけなければならないのは、どのROMも複数データをページをまたがって連続してアクセスできないことで、読み書きはページ単位でしかできない。

 1バイト単位なら問題ないが、複数データのアクセスのユーザーインターフェースをどうすれば良いかあれこれ考える。このあたりは参考情報が少ない。3年前にAVRのEEPROMで開発したUNIXの標準入出力的な考え方が一番素直だが、今度のアプリケーション(ファイル情報の記録)は配列操作なのであまり合わないようにも思える。

 まあ、I2Cは、これまで色々開発してきているので、そう不安はないが、連続データの送受信のインターフェースはなかなか難しい。しかし今度のアプリケーションでは速度を期待されているわけでもない。一度に送れるといっても1ページ(BR24-S16で16バイト、サイズによって異なる)単位でしか送れない。しかも送った後は5ms以上待たされる。遅くはなるが、1バイト単位の転送で全部を組み立てる方法が一番楽そうだ。

 全体のソフトの構成はこのあいだのLPCMプレーヤーの考え方がそっくりスライドショーのつくりに適用できそうだ。ただランダムに画像を選ぶテクニックは新しく考える必要がある。ファイル数の制限はしたくないが、ランダムにするには最大数がいる。まあ、256葉(枚)を最大にしておけば良いか。

ヘッダーファイルにソースコードが入っている(1/27/2011)
 おおよその方針が決まったので、これまで、間借りするように組み込んでいたフォトフレームのソースコードを、少しづつまとめて一本にしはじめた。STM32のソースコードだけは公開しようと思っているので、もうちょっと見易くしておきたい。これだって人のソースに手を入れただけで気が引けるのだが、FPGAの方は、オリジナルといえども、ちょっと今のところ公開できる自信がない。

 FPGAの方は回路図も作っていないし、VerilogHDLのソースもつぎはぎだらけである。何とか動いているが、たまに画像の抽出をはずして白エッジが見える不具合が解決されていない。これが発表をためらっている一番大きな理由だが、コード自体が書き散らしである。12ビットRGBから15ビットに改修した跡地や、UARTでモニターらしいものを作ろうとしたときの残骸などがいたるところに残されており、とても公開できるレベルではない。

 STM32の方は少し手を入れれば、何かの参考にはなるだろう。ただオリジナルのソースコードはRTC(Real Timer Clock)や、UARTのテストルーチンが入ったままで、整理に気を使う。

 SysTickのあたりが勉強できたのが収穫だった。Eclipseの検索機能が強力なので、ソースの解析(探検)はとても楽だ。変数や関数のところにカーソルをあててファンクションキーを押すと、定義しているファイルに飛んでくれる。

Syttick_cfg ところが、SystickConfigというシステムの基本関数が見当たらなくて苦労した。何と、ヘッダーファイルでソースコードを見つけた。やれやれ、変なところにソースを入れるものだから時間の無駄をしてしまった(ヘッダーファイルにソースを入れないというのは鉄則なのだが、インライン関数は例外らしい)。

スライドショーの基本機能は完成(1/29/2011)

 恒例の北海道スキー合宿(60代後半の元国体選手と一緒に新雪に挑戦する)を前に、フォトフレームプログラムのスライドショーの基本部分が動き始めた。この2日間は、久しぶりにコーディングに没頭していた。これでこのフォトフレームは、UARTなどをつながなくても電源を入れるだけでSDカードのJPEGファイルを連続して表示してくれる。

 テスト用のUARTの分離に手間取ったが、本来のスライドショーの部分は、systickのタイマーが使いやすく、組み上げて動かしたら一発で動いた。全くデバッグなし。気分が良い。

 このChaNさんのFatFSをARMに移植したMartin Thomasさんのソースコードは、いろいろなしかけがあって面白いが、改修するのは最初難儀した。リエントラントと書いてあるのでソースを一生懸命追ったが、どこにもリエントラントなタスクは起きない構造になっている。

 普通、リエントラントと言うと、ユーザーから次々に仕事(マルチタスク)を受け取るイメージであり、LEDのブリンクや、RTCの表示などのコマンドをどうやってリエントラントしているのか、首を傾げていたのだが、ソースを調べていくうち、UARTがいつでも受信受付可能なことを単にリエントラントと言っているだけだということがわかり一気に改造が楽になった。

 夜半、ソフトが完成し嬉々としてフォトフレームを居間に持ち込んで家族に見せたが、反応なし。予想はしていたけれど、やっぱり落ち込む。この液晶、綺麗に見える角度が限られており、反射が多くて見難かったのかもしれないと一人慰める。

P2063676

 ランダムな表示、スイッチによる自由な画像の選択などの機能は、スキー合宿が終わってから着手することにする。

 とにかくフォトフレームプロジェクトは、このあたりの開発をもって一段落させることにしよう。小手先の操作を便利にしてもあまり意味がない。基本的なVGA画像をもっと早く表示することの方が大事だ。となるとやっぱりDE0の出番だろうか。ただDE0をフォトフレームにしてしまうのはもったいない。

| | コメント (4) | トラックバック (0)

« 2011年1月 | トップページ | 2011年3月 »