微妙なgain

tiny261のADコンバーター AVRのADコンバーターの使い方も少しずつ分かってきて、いろいろと試している。0.3Vぐらいの電圧を精度良く測定しようとしているのだが、意外に難しい。まずは、ADコンバーターを初期化する。 void ad_init(){ setbit(ADCSRB,REFS2); // 2.56V setbit(ADMUX,REFS1); // 2.56V clearbit(ADMUX,REFS0); //2.56V clearbit(ADMUX,ADLAR); // bit0-9 setbit(ADCSRB,MUX5); // ADC0-1 clearbit(ADMUX,MUX4); // ADC0-1 clearbit(ADMUX,MUX3); // ADC0-1 clearbit(ADMUX,MUX2); // ADC0-1 clearbit(ADMUX,MUX1); // ADC0-1 setbit(ADMUX,MUX0); // ADC0-1 setbit(ADCSRB,GSEL); // gain 8 setbit(ADCSRA,ADPS2); // CK/128 setbit(ADCSRA,ADPS1); // CK/128 setbit(ADCSRA,ADPS0); // CK/128 setbit(ADCSRA,ADEN); // enable setbit(ADCSRA,ADIE); // interupt enable } ちなみに、ヘッダーでは #define setbit(PORT,BIT) PORT|=_BV(BIT) #define clearbit(PORT,BIT) PORT&=~_BV(BIT) #define checkbit(PORT,BIT) (PORT&_BV(BIT)) と定義しておく。そして、割り込みで結果を受け取る。 ISR(ADC_vect){ unsigned int c; c=ADCL; c|=(unsigned int)ADCH<<8; } 最初は1.
Read more...

液晶ディスプレイの故障

LEDバックライト
本日、メンバーの液晶ディスプレイが故障した。微妙に表示はしているのだが、色が変になって、チラチラするようになった。最近、ディスプレイの故障が多い気がする。暑いからなのかも知れない。ディスプレイが映らないと仕事にならないということで、近くの店で買ってきた。IODATAの23型だが、バックライトがLEDである。まず感じたのは、非常に薄くて軽いということである。これまでの液晶では、バックライトの陰極管のための高電圧発生回路が必要だし、二つの陰極管の光を、面状に分散させるための板なども必要だった。LEDバックライトはどのような仕組みになっているのかはまだ知らないが、面状に発光するために、薄くできるのかも知れない。いつかLEDバックライトの液晶ディスプレイが故障した時に、仕組みを調べてみよう。

Read more...

3日目のrails

railsのモデル
ruby on railsは、MVCという概念を採用している。これは、model, view, conrtollerに分けて設計するというものである。viewは、いわゆる見た目を定義する部分で、この意味合いは理解しやすい。残りのmodelとcontrollerが具体的に何を意味しているのかは、私には漠然として理解できていない。 modelの使用法の一つとして、入力されたデータを検証するというものがある。app/modelsの下にあるファイルに記述すると、データが適切でない場合に警告が出るようになる。その記述するコマンドにどのようなものがあるかを調べたところ、以下のようなものがあることが分かった。

validates_acceptance_of
validates_associated
validates_confirmation_of
validates_each
validates_exclusion_of
validates_format_of
validates_inclusion_of
validates_length_of
validates_numericality_of
validates_presence_of
validates_size_of
validates_uniqueness_of

使い方が明らかなものもあるが、複雑そうなものもある。徐々に使い方を覚えていきたい。

Read more...

自作サイリスタ

サイリスタユニットの設計
AVRを使って、サイリスタユニットを作れる気がしたので、いろいろと考えてみた。いくつかの解決すべき問題がある。 まずは、信号の入力をどうするかである。電気的に絶縁した状態で、4-20mAの信号を読み取る必要があるのだが、アナログフォトカプラというものがあるようで、電流の違いを抵抗の変化として検出できるようだ。 次の問題は、AC電源の位相をどのように検出するかである。いくつかの方法があるようだが、トランスで降圧した電圧をブリッジダイオードで正にした電圧を、ツェナーダイオードを通すことによって、ゼロ付近の電圧になったのをデジタル信号としてとらえることができる。ADを持つAVRならば、それを電圧として読み取ることもできる。 最後の問題は、AC電源の正と負をどのようにして判別するかである。トライアックを用いる場合には、これは問題にならないが、サイリスタの場合には正と負のそれぞれで信号を出さなければいけない。センター端子のあるトランスでそれをGNDにして、ダイオードで整流することにすれば、正と負のそれぞれの電圧を別々の信号として受けることができる。 マイコンでこれらの信号を受けて、適切なタイミングでフォトトライアックを介して、トライアックを制御すれば、サイリスタユニットが完成するはずである。 今度、試しに作ってみよう。

Read more...

サイリスタユニット
電力の制御が必要な時には、ソリッドステートリレーまたはサイリスタを使用する。後者としては、これまでサイリスタユニットを購入して利用していた。これは信号の入力にしたがって、出力を制御するユニットです。箱に組み込もうとしたのだが、放熱器は箱の外に出ていた方が良いだろうということで、分解して放熱器以外を箱の中に入れ、放熱器が外にでるようにした。その時にサイリスタユニットの構造をざっと見たのだが、基本的には、制御回路がサイリスタモジュールに適切なタイミングでトリが信号を送るようになっているようだ。 折角なので、サイリスタモジュールの制御の仕方を調べてみた。昔からよく使われている回路では、ダイアックを使ってトリガを作って、これでトライアックなどのサイリスタモジュールを制御する場合が多いようです。最近の回路では、マイコンを使ってトリがを生成する場合もあるらしい。フォトカプラで適切に絶縁しないといけないが、余分な回路が不要になるので、単純化できる気がする。いつかAVRでサイリスタユニットを作ってみようかな。

Read more...

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をリストから選べるようになった。

Read more...

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が使えるらしい。

Read more...

温度の記録

AVR温度計
今年の夏は例年に比べて相当暑い気がする。しかし、やはり自分でそのデータを示さないことには結論を出せないだろう。というわけで、AVRで温度計を作ってみることにした。ICとしては、tiny261を使うことにした。これにはAD converterが内臓されており、さらに内臓温度計の電圧を測ることによって、温度も分かる。しかし、UARTは無いので、RS232Cでデータを送信するのは難しい。そこで、測定結果は、液晶に表示するようにした。 さて、いろいろと苦労をして、なんとか測定できるようになった。引っかかった点としては、電源の方向、reset端子になっているためにIOとしては使えないpinの位置、液晶のコントラストの調整、周波数の設定などである。液晶も普段使っている161が余っていないので、162のものを使った。 1.1Vを基準電圧として、10bitでADが行われるので、理想的な分解能は約1.1mVということになる。一方、温度センサは、1mV/1度らしい。ということは、分解能は1.1度しか無いことになってしまう。これでは使い物にならない。外部に適切な温度計をつないで、電圧を読むようにしないと。

Read more...

RS232Cモニター

AVRでRS232Cのmonitor PS2のマウスをAVRで扱おうと計画しているが、その前段階として、RS232Cのモニターを作ってみた。具体的には、PCからRS232Cで送った数字を、液晶で表示するというものだ。PCからのデータは次のようなスクリプトでrubyから送信できる。 s=open("/dev/ttyS0","r+") system("stty raw -echo -crtscts 9600 cs8 -parenb cstopb </dev/ttyS0") # 9600bps 8bit, 2 stop bit, no parity loop{ i=rand(256) puts '%02x'%i s.write(i.chr) s.flush sleep 1 } この信号をMAX232でTTLレベルに変換して、それをtiny2313のUSARTの機能を使って受信する。あとは液晶表示ルーチンを利用して表示するだけだ。あまりきれいではないけれど、そのソースはこんな感じ。 #include #include #define F_CPU 1000000 /* 1MHz */ #include #define BAUD 9600 /* 9600bps */ #define SET_BAUD F_CPU/8/BAUD-1 // U2X=1 #define setbit(PORT,BIT) PORT|=_BV(BIT) #define clearbit(PORT,BIT) PORT&=~_BV(BIT) #define checkbit(PORT,BIT) (PORT&_BV(BIT)) // LCD #define LCD_PORT PORTD #define LCD_DDR DDRD #define LCD_MASK 0x3c // data PD 2-5 #define LCD_RS 1 //PA #define LCD_RS_PORT PORTA //PA #define LCD_RS_DDR DDRA //PA #define LCD_RW 0 //PA #define LCD_RW_PORT PORTA //PA #define LCD_RW_DDR DDRA //PA #define LCD_EN 6 //PD #define LCD_EN_PORT PORTD //PD #define LCD_EN_DDR DDRD //PD static volatile unsigned char lcd_buf[16]="
Read more...

今度の修理

液晶ディスプレイが故障
昨年、共用のディスプレイが故障した。他にも故障しているディスプレイを集めてみると、三台あった。一台はバラしてしまって部品取り用にして、その他の二台を修理することができた。二台ともインバーター回路のトランジスタが死んでいたので、移植することによって動くようになった。先月一台が不調になったので、追加修理をした。 今日、メインに使っている液晶ディスプレイが急に動かなくなった。幸い、昨年卒業した学生が使っていたものが余っていたので、それに置き換えて仕事ができるようになった。今回壊れたのはIO-DATAのLCD-AD194VBというものである。いつ購入したか覚えていないが、おそらく三年前ぐらいだと思う。問題は、どう修理するかだ。 まず、中を開けてみて気がついたのが、前のものにくらべて、インバーター回路がすっきりとしているということだ。前回の経験を生かすことができない。見た目では電解コンデンサは大丈夫なようだし、インバーター回路のトランジスタがどこにあるのかも分からない。今度の故障箇所を特定するのは難しそうだ。

Read more...