サイリスタユニットの設計
AVRを使って、サイリスタユニットを作れる気がしたので、いろいろと考えてみた。いくつかの解決すべき問題がある。
まずは、信号の入力をどうするかである。電気的に絶縁した状態で、4-20mAの信号を読み取る必要があるのだが、アナログフォトカプラというものがあるようで、電流の違いを抵抗の変化として検出できるようだ。
次の問題は、AC電源の位相をどのように検出するかである。いくつかの方法があるようだが、トランスで降圧した電圧をブリッジダイオードで正にした電圧を、ツェナーダイオードを通すことによって、ゼロ付近の電圧になったのをデジタル信号としてとらえることができる。ADを持つAVRならば、それを電圧として読み取ることもできる。
最後の問題は、AC電源の正と負をどのようにして判別するかである。トライアックを用いる場合には、これは問題にならないが、サイリスタの場合には正と負のそれぞれで信号を出さなければいけない。センター端子のあるトランスでそれをGNDにして、ダイオードで整流することにすれば、正と負のそれぞれの電圧を別々の信号として受けることができる。
マイコンでこれらの信号を受けて、適切なタイミングでフォトトライアックを介して、トライアックを制御すれば、サイリスタユニットが完成するはずである。
今度、試しに作ってみよう。
サイリスタユニット
電力の制御が必要な時には、ソリッドステートリレーまたはサイリスタを使用する。後者としては、これまでサイリスタユニットを購入して利用していた。これは信号の入力にしたがって、出力を制御するユニットです。箱に組み込もうとしたのだが、放熱器は箱の外に出ていた方が良いだろうということで、分解して放熱器以外を箱の中に入れ、放熱器が外にでるようにした。その時にサイリスタユニットの構造をざっと見たのだが、基本的には、制御回路がサイリスタモジュールに適切なタイミングでトリが信号を送るようになっているようだ。
折角なので、サイリスタモジュールの制御の仕方を調べてみた。昔からよく使われている回路では、ダイアックを使ってトリガを作って、これでトライアックなどのサイリスタモジュールを制御する場合が多いようです。最近の回路では、マイコンを使ってトリがを生成する場合もあるらしい。フォトカプラで適切に絶縁しないといけないが、余分な回路が不要になるので、単純化できる気がする。いつかAVRでサイリスタユニットを作ってみようかな。
2日目のrails
railsで二つのデータ
人の名前を選べるようにしてみた。まず、
rails use cd use ruby script/generate scaffold member name:string affiliation:string rake db:migrate ruby script/generate scaffold use from:time to:time member_id:integer rake db:migrate
として、人のデータベースと、時間のデータベースを作る。そして、app/models/use.rbにbelongs_to :memberと追記して、 app/views/uses/index.html.erbとshow.html.erbのuse.member_idをuse.member.nameに変える。そして、app/views/uses/new.html.erbとedit.html.erbのf.text_field :member_idを
select("use","member_id",Member.find(:all).collect{|i| [i.name,i.id]})
に変更する。これで、member_idをリストから選べるようになった。
ruby on rails
railsを入れてみた
rubyを使う人間としては、railsをいつか使ってみようと考えていたのだが、debianでインストールしている人の記録を見ると、面倒そうだったのでなかなか手を出していなかった。しかし、いろいろと試してみると、
aptitude install rails
で、ほとんどのパッケージが入るようだ。データベースはsqliteがデフォルトのようだ。railsはまだ全く理解していないのだが、試しにテストをしてみた。
rails memo cd memo ruby script/generate scaffold memo date:date title:string body:text check:boolean rake db:migrate ruby script/server
とすると、http://localhost:3000/memosに簡単なメモのwebアプリができた。なんとなくrailsの一部を感じることができた気がする。今はwebrickでwebサーバーを動かしているが、apach+SCGIで動かすのが良いらしい。SCGIはlibapache2-mod-scgiを入れれば良いのかな。
2010/7/31追記 script/generateで指定できるのは、controller, integration_test, mailer, migration, model, observer, plugin, resource, scaffold, session_migrationがあるようですが、それぞれが何をするものなのかまだ理解していません。 ちなみに、scaffoldで指定するデータの型としては、 :primary_key, :integer, :float, :string, :text, :datetime, :timestamp, :date, :time, :boolean, :binaryが使えるらしい。
温度の記録
AVR温度計
今年の夏は例年に比べて相当暑い気がする。しかし、やはり自分でそのデータを示さないことには結論を出せないだろう。というわけで、AVRで温度計を作ってみることにした。ICとしては、tiny261を使うことにした。これにはAD converterが内臓されており、さらに内臓温度計の電圧を測ることによって、温度も分かる。しかし、UARTは無いので、RS232Cでデータを送信するのは難しい。そこで、測定結果は、液晶に表示するようにした。
さて、いろいろと苦労をして、なんとか測定できるようになった。引っかかった点としては、電源の方向、reset端子になっているためにIOとしては使えないpinの位置、液晶のコントラストの調整、周波数の設定などである。液晶も普段使っている161が余っていないので、162のものを使った。
1.1Vを基準電圧として、10bitでADが行われるので、理想的な分解能は約1.1mVということになる。一方、温度センサは、1mV/1度らしい。ということは、分解能は1.1度しか無いことになってしまう。これでは使い物にならない。外部に適切な温度計をつないで、電圧を読むようにしないと。
RS232Cモニター
今度の修理
液晶ディスプレイが故障
昨年、共用のディスプレイが故障した。他にも故障しているディスプレイを集めてみると、三台あった。一台はバラしてしまって部品取り用にして、その他の二台を修理することができた。二台ともインバーター回路のトランジスタが死んでいたので、移植することによって動くようになった。先月一台が不調になったので、追加修理をした。
今日、メインに使っている液晶ディスプレイが急に動かなくなった。幸い、昨年卒業した学生が使っていたものが余っていたので、それに置き換えて仕事ができるようになった。今回壊れたのはIO-DATAのLCD-AD194VBというものである。いつ購入したか覚えていないが、おそらく三年前ぐらいだと思う。問題は、どう修理するかだ。
まず、中を開けてみて気がついたのが、前のものにくらべて、インバーター回路がすっきりとしているということだ。前回の経験を生かすことができない。見た目では電解コンデンサは大丈夫なようだし、インバーター回路のトランジスタがどこにあるのかも分からない。今度の故障箇所を特定するのは難しそうだ。
PS2の勉強
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を有効利用するようにしよう。