PS2モニタ
液晶の表示に成功したので、これを何かに生かしたい。AVRでいくつかやってみたいことはあるのだが、とりあえずは、PS2のモニタを作ろうと思う。
PS2のマウスのプロトコルは昔勉強したことがあるのだが、復習していると新たな発見がいくつかあった。スクロールボタンや5ボタンの扱い方を知らなかったが、これはモードを切り替えると良いらしい。さらに深く理解するために、PCとマウスとの間で、実際にどのようなデータがどのような頻度でやりとりされているのかを観察できるようにPS2モニタがあれば、便利である。
PCからのデータもマウスからのデータも同じdataとclockのラインを使って送られる。PCやマウス自身は、自分が送っていない信号は相手から出たものだと分かるが、第三者から見ると、どちらから出た信号なのかが分かりにくい。さらに、PCからの信号に関しては、マウスは受け取ったという返事をするので、第三者から見て1bit多くなる。途中でデータ転送を中段した場合なども考え出すとどんどん難しくなる。
クロックがlowになったときにdataを見て、highならばPCからのデータで11クロック、lowならばマウスからのデータで12クロック分読み込むようにすれば、途中で中段されない限り、データのやりとりを見ることができるだろう。気をつけないといけないのは、PCからのデータはクロックの立ち上がりで読んで、マウスからのデータは立ち下がりで読むということだ。
これを実現するには、クロックで割り込みをかけると良いだろう。以前はint0を使ったが、今後の拡張も考えるとpcintを使いたい。そうすれば、原理的には同時にいくつものPCやマウスと通信できるはずだ。
さて、大体の構想はまとまったのだが、これを実際に試すのはいつになるのだろう。
busyが読めないが
AVRで液晶表示
数年前からやろうと思って時間が無くてできなかったが、液晶の表示に成功した。AVRでプログラムを組んでいると、バグがあっても状態を出力する手段がほとんど無いので、バグを発見するのに非常に苦労する。液晶で状態を表示できるようになれば、非常に快適になると思っている。
今回使ったのは、秋月で300円で売っていた16文字の液晶モジュールで、HD44780準拠の標準的なものだ。ライブラリを書いている人もたくさんいるので、これを使っても良いのだが、それでは面白くないので、自分で適当に書いてみた。8bit通信と4bit通信ができるのだが、pinを節約するために、4bit通信を選択する。それでも制御信号が3pin必要なので、7pinも費やしてしまうことになる。tiny2313の通常使える17pinから7pin使うと、残りは10pinになってしまう。
いくつかトラブったことろはあるが、一応の表示には成功した。まず、文字コードを書き込むだけでは表示が消えてしまい、その後で表示オンの指示を出さないといけなかった。マニュアルにはそんな記述は見当たらない気がするんだけどな。あと、busyの読み込みにはなぜか失敗してしまうので、適当なwaitの後で次のコマンドを送るようにした。
面倒なのは、16文字のアドレスが連続していないことだ。他の液晶との互換性のためだろうが、少し処理を書き加えないといけない。
バックライトはないけど、別に見にくいわけではないし、一応の表示ができるようになったので良しとしよう。
AVRのconst
AVRの定数をflashに置く
以前、flashにconstを作るときには、よく分からずにやっていたが、やり方が分かったので、書いておこう。まず、宣言のところでは、型の後に"PROGMEM"を入れるか、“prog_“が頭についた、flash専用の型で宣言する。以前のプログラムでは、
const prog_uint16_t number[0x60];
としていた。次に、定数の値を読むときには、pgm_read_byte, pgm_read_word,pgm_read_dwordを使う。
p=pgm_read_word(&number[c-0x20]);
などと、アドレスを引数にする必要がある。宣言はさておき、読み取るときの命令が面倒だと感じる。今後、定数を使うときには、flashを有効利用するようにしよう。
二年越し
液晶の修理
また壊れた
久々に秋葉に行って、部品を買ってきた。以前修理した液晶のディスプレイを修理するために、トランジスタを買ってきた。以前と同様に、2SC5707が壊れたので、その代わりに2SC3709Aを買って、入れ替えると、一応うまくバックライトが点灯した。しかし、直ったと思って組み立て終わって、もう一度チェックすると、また同じ症状になってしまった。一度取り替えた2SC5707がもう一度壊れているので、その原因が別にあるのだろう。トランジスタを取り替えると、しばらくはうまくいくが、また壊れる。今回もそれを再現したのだと思う。その原因を見つけないと、根本的な修理にはならないのだが、どうやってみつけようか。部品取り用の基板もあるので、あやしい部品を総とっかえしてみようかな。
2010/6/15追記 昨晩、もう一度動かしてみたら、普通にバックライトが点灯した。おかしいな、また壊れたはずなのに。どこかに浮いた半田でもあるのかな。もうしばらく様子を見ることにしよう。
impressiveでプレゼン
netbookで
これまで、プレゼンテーションが必要なときには、prosperで準備して、pdfに変換してacroreadで表示していた。知人がimpressiveというプレゼンテーションツールを使っていて、興味を持ったので試してみた。インストールはaptitude impressiveでできるが、日本語が表示できない。poppler-dataを入れると、表示できるようになる。しかし、非力なPCの場合には変換に時間がかかってしまう。ubuntuのレシピで工夫の仕方が紹介されていた。まず、
impressive --geometry 1024x768 -o presen presen.pdf
とすると、presenというフォルダに各ページがpngとして展開される。そして、実行するときには、
impressive -t none -c memory -g 1024x768 presen
とすると、変換に時間がかからなくなるので、快適に使うことができるようになる。しばらく使ってみることにしようかな。
引数の最後のカンマ
methodの引数と配列
rubyの引数を取るmethodでは、引数をカンマで区切って、丸括弧で囲む。
def test(*a) puts a.class end
などとすると、引数の数が可変になり、それが配列として受け取ることができる。このような場合に、引数を一行ごとに書いて、
test( 1, 2, 3, )
などとしたくなるのだが、これだと最後のカンマの後に引数が無いのでエラーが起きてしまう。仕方がないので、これまでは
test( 1, 2, 3 )
と書いていたが、多少不便な点があった。例えば、2を除く時には行ごとコメントアウトすれば良いのだが、3を除くときには、少し書き換えなければいけない。これを回避する方法を見つけた。
test(*[ 1, 2, 3, ])
と書くと、3を消すときも、一行コメントアウトすれば良いことになる。配列だと、最後のカンマは無視してくれることを利用している。しかし、引数を配列にしてから、もう一度展開するのは二度手間な気がする。そうするならば、初めから配列を引数にすれば良いのだが、必ず配列を渡すのも面倒な時もある。しばらくはこの書き方でいくことにしよう。
引越し完了
! tdiaryの更新
本日、Webサーバーの更新が行われた。rubyは1.8.5になったので、新しいtdiaryにした。見た目はほとんど変えていないが。ようやく基本的な設定が終わって、昔のデータも移し終えた。ユーザー権限では、apacheが作成したデータを書き換えられないので、細かい設定がうまくいかずに苦労した。新しいプラグインも使えると思うので、何か面白いものがないか探してみようと思う。少しずつスタイルを調整していこう。
tdiaryの引越し
webサーバーの更新
もうすぐ、このblogを動かしているサーバーが更新される。rubyも1.6から1.8になるようなので、新しいtdiaryを入れようと計画している。しかし問題なのは、データの移行である。まだtdiaryのデータ構造を理解していなので、この記事を投稿したときに、どのファイルのサイズが変化するか調べてみよう。
2010/5/30追記 201005.td2のサイズが変わったので、このバイナリが本文を記録しているファイルらしい。
Wineのfont
ttf-mscorefonts-installer
久しぶりにWindows用のソフトを使わざるを得なくなったので、仕方なくwineでインストールした。いざソフトを起動すると、いくつかのフォントが無いと言われた。aptitude searchでfontとmsで検索すると、ttf-mscorefonts-installerというものが見つかったので、インストールしてみたら、フォントが無いというエラーは無くなった。これでwineでうまく動くと良いな。