Blog2Viewer

以前、Movable Typeで運用していたブログの内容を表示させるために作成したページです。
5V20Aの電源装置
140701a0部品が揃ったので、買っておいた5V20Aの電源ユニットをケースに収めた。電源ユニットはTDK-LAMBDAのVS100E-5、マルツパーツで購入。値段は4,100円(税別)。適当な端子台や電源ユニットのコネクタが無かったのでロッカースイッチ、ACインレットなどとともに共立電子に注文した。使用したケースは、昔、試しに買ってみた秋月の500円のプラスチックケース。アルミフレームの格好いいケースを使いたいところだが数千円も払う気は起きない。今回は、これで我慢する。容積の割に安いし、パネルが分離できるので加工しやすい。内部に固定用のネジ穴もあるし良いケースだと思う。でも密閉したプラスチックケースに100Wの電源ユニットを入れるのは怖いので、気休めでファンを付け、排気用の穴もあけた。



部品が集まるまで、グズグズしていたが、集まって配置を決めると後は早い。特にアルミ板の罫書きが終わるとやる気が止まらずに一気に完成。途中ACインレットの内側の端子と電源ユニットが干渉する問題が発生したが電源ユニットを反対側につけることで解決。この影響でケースを縦に置かなければならなくなり電源スイッチの場所がちょっと変になったが、まぁ良いだろう。

[gallery link="file" ids="9011,9013,9014,9012,9009,9008"]

電源装置ができたので、次はケーブルを作り、LEDモジュール8枚点灯実験か...
RSS表示装置のソフトウェア解説(1)

fig140712a1トランジスタ技術7月号に書いたNucleo試用レポートの記事中で作成したRSS表示装置のソフトウェアについて解説する。


この装置のソフトウェアを開発することで確かめたかったのは以下の2点。


1.XBee WiFiでRSSの取得ができるのか? 2.stm32+XBee WiFiでRSSの表示ができるか? RSSの解釈やバッファリングなどで問題は発生しないか

今回は1について解説する。



[caption id="attachment_9027" align="alignright" width="252"]XBee WiFiの使いそうなATコマンド XBee WiFiの使いそうなATコマンド[/caption]

XBee WiFiはネットで話題になっているのは読んでいて、買ってもいたのだが、使うのは今回が初めてだ。ネットでの話題は、電源投入時(リセット時)に瞬間的に大電流が流れるので電源ラインにある程度のコンデンサを入れて置かないとマイコンがリセットされ、無限リセットループから抜け出せない、というような話だったが、その後XBee WiFiも改良されて現在のものは大丈夫らしい。


今回、改めてネットでXBee WiFiを使用しましたというような記事を探してみたが、pythonで作ったプログラムとUDPで通信しました、というような記事しか見つからず、本当に普通のWebサーバにTCPで接続して通信できるのか不安になった。



[caption id="attachment_9028" align="alignright" width="300"]AIコマンドの戻り値と状態 AIコマンドの戻り値と状態[/caption]

どのみち試さなければ仕方ないので、XBee WiFiのマニュアルを読むと XBeeと同じくトランスペアレントモードとAPIモードがあるそうだ。APIモードを使用するといろいろ複雑なこともできそうだが、今回は締切もあるし、何とか行けそうなのでトランスペアレントモードを使用する。このモードでは、XBee WiFiとやりとりするデータは基本的に、そのまま通信相手とのやりとりとなる。エスケープシーケンスでコマンドモードに遷移すれば、ATコマンドで設定の変更などができる。マニュアルから使いそうなATコマンドを抜き出したのが右上の表。



[caption id="attachment_9029" align="alignright" width="300"]PCから設定するXBee WiFiのパラメータ PCから設定するXBee WiFiのパラメータ[/caption]

LAコマンドでDNSを引き、DLコマンドでIPアドレスを設定、AIコマンドで接続状態を確認してやれば通信できそうだ。変更する必要のないパラメータは、XBee Wifiをパソコンに接続し、事前に設定しておくことにする。製品ではないので、この辺は楽だ。


で、プログラムを組み、試してみるとLAコマンドが動かなくてDNSが引けない。仕方が無いので、自分でDNSを引き、各RSSのサイトのIPアドレスをプログラム中に書き込んでおくことにする。 これで問題無いと思ったが、メジャーなサイトのIPアドレスはロードバランシング等の理由で結構変更されているようで1ヶ月もすると読めないサイトが多数発生、IPアドレスを更新することで読めるようになった。ちなみに、この問題をネットで調べてみるとファームウェアを更新すると解決するらしい。近く試してみたい。


接続は、できたのでGETコマンドを送ればRSSが取得できるはず、と試してみるがデータが何も返ってこない。linux上でwgetコマンドで試すと、RSSのデータが取得できる。パケットアナライザでwgetコマンドが送っているデータを見て原因が判明。 以下のようなデータを送ることでRSSデータを取得できるようになった。


GET %s HTTP/1.0
Host: %s
Accept: */*
Connection: Keep-Alive

次は、受信したRSSデータから表示すべき部分を抜き出す処理が必要なのだが、その話は ... RSS表示装置のソフトウェア解説(2)へ続く ...予定


RSS表示装置のソフトウェア解説(2)
fig140713a1RSSの取得ができたので、表示するデータを抜き出す。RSSはXMLで記述され、多くの情報が含まれている。RSSの構造を図にしてみたものを右に示す。今回この中でジャンルとタイトルを表示に使用した。

そこでXMLを解釈しデータを抜き出さなければならない。いつもはPHPやPerlなどでXML Parserライブラリを使用するがstm32でphpやperlは動かないので使えない。探せばC言語用のライブラリもありそうだが、メモリー容量等の問題で使えるか怪しいので、今回は簡単なParserを自作した。



シンプルなParserで、オープンタグとクローズタグを読み込んだ時点で、ユーザの関数を呼び出す。タグ名は引数で渡される。ちゃんとしたParserならばタグのパラメータの情報も渡さなければならないが、今回は使用しないので無視している。あと、タグ以外のテキストも読み込まれた時点でユーザの関数を呼び出す。

大変簡単なParserだが、これで情報のあるタグに来たこと/出たことを検出し、データを抜き出すことができた。

あとは、抜き出したデータの文字データでフォントを呼び出しビットマップに変換しOLEディスプレーにスクロールしながら表示する。

fig140713a2

スクロール表示する速度は遅いので、表示する間、XBee WiFiをuartのフロー制御で待たせていたのだが、待たせ過ぎたようでサーバーとの接続が切断され、RSSの後半のデータが取得できない。

そこで、RSSの情報を表示する前に一旦 RAMに記憶することにしたが、STM32のメモリー容量は限られている。表示するデータだけ記憶するようにしたことで、20Kbyte程度のバッファーで問題なく表示できた。

これで、RSS表示装置ができた。動かしていると結構面白い。今回はNucleoを使用したのでサイズが小さくないが、必要なのはディスプレーとSTM32とXBee WiFiだけなので、基板を起こせばOLEDディスプレーよりも小さいサイズでできそうだ。汎用の情報表示端末として使えるのではなかろうか。

ヒートガンの広告を見てテスターを買ってしまった話
140719a3温度表示付きヒートガンをネット検索で調べたら、ネットを見るたびに温度表示付きヒートガンの広告に付まとわれるようになった。ヒートガンに温度表示が無いと不便だ。どのくらいの温度なのか送風を手に当てて確かめるわけにもいかない。なので、気になり、広告をクリックしてしまい、また広告に付まとわれる。

温度表示付きヒートガンも、いつかは買うつもりなのだが、その温度表示も信じられるのか?別に温度計が有ったほうが便利じゃない?と思い付き、秋月の熱電対式の温度計キットとか見てみると、販売再開で在庫がなくなり次第終了などと書いてある。これは買わねば、何かのついでに買おうと「お買い物リスト」に追加するが、何か引っかかる。このキット見たことがある... 自宅の引き出しの中にあるような気がする。確かめると...あった。



おお、不要な買い物を回避することができたと喜びつつ、組み立て説明書を見ると、ちょっと面倒くさそう。基準の温度で校正する必要がある、とも書いてある。どうやって校正しようかとかんがえているうちに、熱電対で温度をを計測できるマルチテスターを持っていたことを思い出す。これで校正できる...というか、これを使えばいいわけだが、若干おおぶりのマルチテスターでほとんど使っていないため、たまに使おうとすると電池(006P)が切れている。

今なら、熱電対で温度を測れる、もっと安いマルチテスターが有るんじゃないかと調べてみると果してあった。デジタルマルチメータ(テスタ) MS8221C 温度+容量 オートレンジ 2,000円。温度計キットよりも安い。 そういうわけでMS8221Cを購入。ついでにヒートガンの温風の温度計測に便利ではなかろうかと、K型熱電対 ステンレス管タイプも購入。

到着したので、試しにヒートガンと、お湯の温度を測ってみる。ステンレス管タイプはヒートガンの温度を測るのに、特に便利、というわけではなかった。テスター付属の熱電対の方が熱容量が小さくて反応が早いような気がする。お湯の温度をはかるにはステンレス管の方が若干便利かもしれない。

[gallery link="file" ids="9048,9049,9052,9053,9054,9055"]

温度表示つきヒートガンの宣伝をいろいろみていると、いろんな方式が混在していることがわかってきた。マイコン温度制御付きというのが一番良いのだろうか。でも、このタイプだと表示されている温度は目標値なのかな。計測した温度としても、どこで計測しているのかという問題もある。吹き出し口なのかヒータ近くなのか、吹き出し口の温度と温風をぶつけているターゲットの温度は、また違うわけだし。吹き出し口あるいはヒータ近くの温度と風量を一定にできれば、あとはターゲットとの位置関係を一定にすることで温度環境を同じに出来そうに思えるので、それでいいのかもしれない。

ターゲットの温度を確認するのには放射温度計とかあると便利かも。アマゾンで放射温度計を調べてみると案外安い。これも買っておこうか...
三代目LEDコントローラ基板到着
140723a3LEDコントローラは、まだソフトウェアの開発中。なかなか終わりそうにないので、この時間を利用してfusionPCBで基板を作ってみる。目的は、コネクタ・ネジ穴回りのスペース不足の修正といくつかの回路ミスの修正と拡張端子の追加。



注文したのが7月10日で到着したのが7月22日、Air Parcelでも2週間で届いたことになる。ちなみにサイズは 15cm x 5cmで、価格は送料込みで$34.64。まぁやっぱり安いよね。有料のオプションは全て回避した。だからレジストも緑色。

このLEDコントローラでは、とにかく端子が足りない。しかし、動画の再生とかやらせると、どうしても音声出力が欲しい。そこで、端子の配置を移動するなど、いろいろ頑張ってなんとか実験に使えそうな端子を出すことができた。PIC32MX自体にはDAがついていないので、何を使えばいいかその辺も実験しなければいけない。もしかしたら、問題が発生し、表示自体できないかもしれない。そのために、安く基板を作りたかったわけである。

[gallery link="file" ids="9065,9064,9063"]
mips16導入
[caption id="attachment_9135" align="alignright" width="150"]組み立た3代目ボード(右)と音出力ボード(左) 組み立た3代目ボード(右)と
音出力ボード(左)[/caption]先日届いた3代目LEDコントローラ基板を組み立て動作を確認した。さらにVS1011eで音声出力ボードを試作、いろいろ苦労しながらmp3ファイルを再生できるようになった。端子が足りないので、音出力時には、使えない機能がある。もう少し工夫すればそれもなんとか出来そうなので、考え中。

ところで、いろいろと機能を追加しているとプログラムサイズが、どんどん大きくなって行き、PIC32MX250の128Kbyteのプログラムメモリーをほぼ使い尽くしている感じ。まさか128KbyteものROMをプログラムだけで使い切るとは思っていなかった。今後、不要な機能を探して削っていくつもりだが、mips16命令セットを使用すれば、コード全体のサイズを減らせそうなのでこれも使ってみたい。 いろいろ調べてみると以下のことがわかった。




  • gccに -mips16をつければ mips16のコードが生成される。
  • だが、mips16にないアセンブラ命令などがあるとエラーになる
  • mips32/mips16の切り替えは jal命令などでやってくれて、復帰も自動らしい。
  • リンカーがmips32/mips16を認識し、jal命令の部分は自動で調整してくれるらしい。
  • つまり、mips32/mips16は関数単位で混在し放題。
  • 例外(reset,割込み等)時はmips32になる。
  • mips16の命令ではコプロを読み書きできない。割込み禁止/許可ができない
  • attributeでも関数ごとにmips32/mips16を指定できる。
  • gccは-mips16オプション指定時、__mips16というマクロを定義する


割込み関係をイジっている部分は __mips16マクロで処理を切り替えるようにして、プログラム全体をmips16/mips32両対応にできた。プログラムサイズを調べてみると mips32で 103,744byteだったtext領域がmips16では76,116byteとなり 25%程度プログラムが短くなった。

pic32mx2xxシリーズだと、どのCPUでもROMのサイズが小さめなので、なかなか使えるオプションだと思う。