SSブログ
ソフト ブログトップ

ちゃんと残しておかないと [ソフト]

今のところ、リモコンタイマーとオシロの回路を作ったわけだけど、
参考にさせてもらった回路から、結構違うものになってるわけで、
これも、残しておかないと後でわけがわかんなくなる可能性が高い。

で、回路CADを物色。もちろんフリーなのがいいけど。

ネットで探すとEscadというのをよく見かける。Vectorに行ってみると、
対応OSにWindows7がない。残念。

Vectorでは、Bschv3が有名みたい。
DesignSparkPCBも魅力的。これだと回路図だけでなく、基板イメージも作れるらしい。しかも3D。
それがタダって、ほんまかいなー。
ユーザー登録が必要らしいけど、雑誌とかでも紹介されてるので、そんなに怪しくない?。

とりあえずインストールしてみますかね。
タグ:回路図CAD

ちゃんとチェックしないと Part2? [ソフト]

赤外線が発射されない件だけど、
タイミングがおかしそうなので、ソフトを見直し。

ちゃんとタイミングは取れてるみたいで、おかしい所はなさそう。
Datasheetの見直し、計算のやり直しをさんざんやって気が付いたのが、
タイマー2を使ってたこと。

実は、温湿度センサーと赤外線受発信のソフトを組み合わせるときに、
タイマーを変更したのだった。
温湿度センサーでは、タイマー1で湿度センサーの周波数をカウントし、
そのタイミングをタイマー0で測っている。
赤外線受発信では、発信のタイミングをタイマー0で測っている。
このため、赤外線受発信のタイマーを2に変えていた。

何も考えずにタイマー2に変えたんだけど、
以前、サーボモーターでPWMを使おうとして、嵌ったポストスケーラーにまた嵌った感じ。
つくずく、学習能力ないなー。

タイマー0は、プリスケーラーが256:1まで指定できるんだけど、
タイマー1と2は、16:1まで。
ただ、タイマー2には、ポストスケーラーがあって、さらに16:1まで指定でき、
この積で割り込みのタイミングが計算される。
ポストスケーラーは、1:1から16:1まで16通りの指定ができるので、その点では、
2、4、8、16、32、64、28、256しか指定できないタイマー0より細かい指定ができる。

ただ、このポストスケーラーは、タイマー2のオーバーフローをカウントして、割り込みを発生させるので、
タイマー2の値を使うような場合は意味がない。
PWMの時に、しっかり理解したはずなんだけど、すっかり忘れてた。カナシー。

PWMって使えねー [ソフト]

完全に面白半分で買ったサーボモーターも気になるので試してみることに。

マイクロサーボ SG90 (2個入)

マイクロサーボ SG90 (2個入)

  • 出版社/メーカー: Tower Pro
  • メディア:


安いので買ってもたけど、飛行機ようにそこそこ使われているモデルみたい。
他から拾ってきたスペックは、下記のようになってる。
* Dimensions: 22 X 11.5 X 22mm
* Operating Speed (4.8V no load): 0.12sec/60 degrees
* Stall Torque (4.8V): 17.5oz/in (1 kg/cm)
* Temperature Range: -30 to +60
* Degree CDead Band Width: 7usec
* Operating Voltage: 3.0-7.2 Volts
* Each servo comes with 3 different servo horns and fittings as seen.
Pulse Width:500-2400 μs
電源を繋いで、信号線にパルスを入れれば動くようで、
パルスの周期は決まってなくて、0.5msから2.4msまでのパルスを入れると
その長さに応じてほぼ180度までの角度で止まるという。

パルスを出すのでPICのPWMという機能を使うのが簡単だろうということで、
調べてみると、
どうやら、タイマー2のオーバーフローでパルスの周期を決めるらしく、
この時、PR2というものを設定しておくとタイマーが255にならなくてもPR2の値と同じになった時に、
ブレークして割り込みが発生する。これで周期を細かく設定できるようにしている。
さて、肝心のパルス幅の方は、CCPR1LとDC1B <1:0>の値の10bitで決まるらしいが、
「この値とタイマー2が一致すると」と書いてあるところがあり、惑わされたけど、
ただしくは、1024で割った値がデューティ比になるということらしい。

まとめると、パルス周期=システムクロック÷4÷プリスケーラ値÷255×PR2
       パルス幅=パルス周期÷1024×(CCPR1L×4+DC1B <1:0>)

で、計算しようとしたんだけど、タイマー2のプリスケーラーって16までしか設定できない。
ほかのタイマーは256まで設定できるのに。
代わりにポストスケーラーというのが16まで設定できて、結局、スケーラーとしては256まで機能するんだけど、
割り込みの記述には、このポストスケーラーがあるのに、PWMの記述にはなく
PWM period =[(period ) + 1] x 4 x TOSC x TMR2 prescaler な感じ。
(period )がPR2で、 TOSC は、クロックの時間=4MHzで動かしてれば0.25us。
たとえば、4MHzでプリスケーラ=16だとPR2=249で、パルス周期=4ms。
0.5msは、CCPR1LとDC1B <1:0>の値が128、2.4msは、614。

とりあえず、プログラムにこの値を突っ込んでテストして見ると、動いた!
だけど、ちょっと不安定。なんか震えてるのよね。
パルス周期が4msじゃダメなのかなと思い、変えてみようと
一応、ポストスケーラーにもトライしてみたけど、まるでシカトされ、
クロックを1MHzにしてと思ったら、プリスケーラーが16、4、1しか指定できない。8は?
仕方ないので、1MHz、プリスケーラー16、PR2=78で何とか安定したかなー。というより前よりましな程度。
まーこんなものなんでしょうか。ロボットが震えてるのもよく見るもんね。
しかし、ここまでクロックを落とさないと使えないとなると、なんだかなー。

で、試しに、PWMを使わず、プログラムで直に時間指定して動かすと
シャキッ!
なんか、とってもスムーズかつシッカリ動く。PWM使えねー。

やっぱり湿度はたいへん [ソフト]

今度は、湿度センサのテスト。
そういえば、Amazonで買ったんだけど、今は、在庫切れになってしまったらしくヒットしない。
ネットで調べる限り、もう日本にはないみたい。

早速、回路を作ってテスト。使うPICは、PIC16F887。
回路は、タイマICのLMC555に1MΩの抵抗2本とセンサーを付けて、一応コンデンサも入れる。
タイマICの足が8本もあって右左にまたがる線もあって、ちょっとゴチャ付いたけど。
後は3番PINからPICの11番PIN(RC0)に入れるだけ。
11番PINは、T1タイマーのクロック。

ソフトの方は、割り込みルーチンにT0タイマーで、割り込みを入れて、
1秒を測って、その間のタイマーT1のカウントを周波数として計算で湿度に変換する。
計算は、PICのクロック8MHzなので、OPTION_REGでプリスケーラを64にすると、
タイマー0の周波数は8M/4/64 =31,250Hzなので、タイマー0の初期値を6にして
250回カウントさせると8msになるので、これを125回カウントさせて8ms*125=1秒のときに
タイマー1のカウントを周波数にする。
さて、その周波数が求まったら480000/周波数で、センサーの容量が求められるので、
とりあえず線形だとみて湿度=(容量-163)/0.35で求められる。

で、実際にやってみると、周波数は、2300台。計算だと容量は210pF。
http://www.picfun.com/pic18/app18x05.html
でも、ちょっと高めに出ていたようなので、そんなもんですかね。

クロックが、内部発信回路なので1秒も怪しいし、もうちょっと使って、校正をかけるしかないね。

タグ:湿度センサ

なーんだ!そういうこと [ソフト]

暖房も使えるようにするには
切り替えが必要で、設定温度も変えなくちゃいけないので、
いちいちプログラム変更もめんどくさいので、入力できるようにしないと。

それには、タックスイッチとかを付けて・・・。
やっぱり、基板に起こさないとだめだね。

どうせなら、リモコンコードも入れられるようにして・・・。

などと考えてると、ふと思いつた。
エアコンの「まろやか運転」のコードって、2つつながってるか?
今のコード解析のプログラムって、1つしか解析できないので、
コマンドが2つつながって来ても、解析できない。

そこで、コード解析のプログラムを若干変更。
EPROMに受信したコードを記録するようにして、リモコンを操作。
記録したものを、PickitでPCに読みだしてみた。

やっぱり!最初に解析した「まろやか運転」のコードの後に、運転開始のコードが。
なーんだ。

しかし、これだとコード解析のプログラムに問題が起きる。
前のは、1つコードを受信すると終わっていたけど、2つあるものもあるとすると
こーど解析終了のタイミングがつかめず、いつまでも終われない。
かなり難しそー。

問題は味付け [ソフト]

リモコン操作に疑問は、残るものの、一応PICでON・OFFはできるので、
使うのには問題ないはずなので、
温度の計測と、リモコンコードの発信プログラムを統合。

寝ている間に快適な温度にしようというのが目的で、
寝不足より風邪ひかない方が優先、そして省エネだといいね。
寒くなりすぎないような味付けが問題なんだけど、
すでに涼しくなって実験できなくなっているので、
とりあえず、温度と時間をパラメータにして変化させられるように組んで見る。

温度の変化でエアコンをON/OFFすればいいわけだけど、
単純にある温度を境にON/OFFだと、下手すると数秒おきにON/OFFされちゃうので、
電気的にも無駄が多い。

そこで、28度を超えたら、運転開始し、10分は運転。26度以下になったらOFF。
OFFになったら、とりあえず10分は運転しないという風にした。

実験は、温度センサーを指で触って温度を上げてやってみる。
一応、思った通りに動くようだけど、これが正解かどうかはわからない。

もっと寒くなった暖房で実験しよう。
って、暖房だと逆にしないといけない。
タグ:温度センサ

エアコンをPICで操作 [ソフト]

さて、いよいよエアコンのリモコンを解析。
こっちは、家電協のフォーマットだね。
同じ東芝だけどTVはNECで、エアコンは家電協なんだね。
ただ、ちょっと違うのは、リーダ部分で、仕様ではONが3.2ms、OFFが1.6msらしいが、
計測結果はともに4ms。データビットも0.4msのはずが0.5ms位になっている。
いろいろ試してみたけど、みんな同じ。独自の仕様なんだろうね。

いろいろやっててわかったんだけど、
自動運転でONにして、1度上げる。というのと
1度上げた状態でONとは、押すボタンが違うけど、コードが同じ。
ここで、さらに1度上げると、2度上げた状態でONというコードが発せられる。
同じように、3度上、4度上、1度下、・・・4度下までそれぞれ別のコード。
当たり前っていえば当たり前のことで、1度上げるというコードがあったら、
本体とリモコンで状態が違ってしまう可能性があるものね。

運転と停止を一通り発信してみて、エアコンが動くのを確認できた。
寝てる間に使うので「まろやか運転」のコードもと思ってやってみたが、
これがまるで反応しない。
風量弱への切り替えも反応なし。

???なぞは深まる。

学習リモコンのソフトを作る [ソフト]

DSC_0012.JPG
さて、ソフトの方だけれども、本に載ってる学習リモコンのソフトをサポートページがらダウンロード。
ただ、使ってるPICが違うのでコンパイラも違い、受信したコードをLCDに表示したいので、
その部分も追加しなくちゃいけないので、これをベースにするのはあきらめて、
LCDの表示テストに使ったソフトをもとにして、赤外線の受信/発信の部分だけ使うことに。
赤外線の受発信は、仕様が決まっているので、ハードに左右されないので、そのまま使えそう。
とはいえ、かなりの変更/追加なので、コンパイラを通すのに、結構時間がかかった。

試しに、TVのリモコンを受信させてみると見事に受信。
さすが、メインの部分は、そのまま使った効果があって、バグなしでいけたらしい。
家の東芝のTVは、NECフォーマットだね。
ついで発信してみるが、TVは反応しない。???。
そういえば、制限抵抗を調整してなかった。適当に半分くらいに合わせて、発信してみると
こちらもOK。さて、いよいよ目的のエアコンのリモコンでテストだね。

赤外線リモコンの仕様については、秋月電子に参考資料がある。http://akizukidenshi.com/download/k4174_format.pdf

ディスプレイは何とかなったので [ソフト]

DSC_0010.JPG
今度は、温度を測ってみる。
温度センサーは、いろいろな種類があって、

ボクの電子工作ノート

ボクの電子工作ノート

  • 作者: 鈴木哲哉
  • 出版社/メーカー: ラトルズ
  • 発売日: 2012/06/18
  • メディア: 単行本(ソフトカバー)


参考にさせてもらっている↑では、温度で抵抗が変化するものを使い、
発信回路の周波数をカウントして、温度に変換しているが、
私は、精度は落ちるかもしれないが簡単な、温度で電圧が変化する
National Semiconductor のLM61CIZにした。
測定範囲:-30℃~100℃、温度係数:+10mV/℃ 、動作電圧範囲:+2.7~+10V。
つまり、ある程度の電圧をかけてあげると、温度に応じた電圧を出力してくれるというもの。
この電圧をPICでA/D変換して、温度に換算する。
A/D変換では、PICは電圧を基準電圧の1024分率で出力するので、
電圧=A/D変換の結果/1024×基準電圧。0℃が0.6V、1℃あたり0.01Vずつ増えるので、
温度=(電圧-0.6)/0.01になる。

というわけで
TRISC = 0x01; // 入出力設定
OpenADC( // ADC初期化
ADC_FOSC_4 & // AD変換クロック指定
ADC_RIGHT_JUST & // 右詰め出力
ADC_12_TAD, // チャージ時間
ADC_CH4 & // アナログ入力チャネル
ADC_INT_OFF, // 割込みは行わない
ADC_REF_VDD_VDD & // 正基準電圧
ADC_REF_VDD_VSS, // 負基準電圧
ADC_0ANA ); // すべてデジタル入力に設定
ANSELbits.ANS4 = 1; // AN4はアナログ入力に設定
ConvertADC(); // AD変換開始
while(BusyADC()); // AD変換終了待ち

tempw = ADRESH * 256 + ADRESL;
temp = tempw*3.22-600; // AD変換結果=>温度
itoa(temp,tempc);           //2進=>文字
で、温度×10をLCDに表示してみたけど、”.”を出した方が感じが出るかなと
for(i=0;i<5;i++){
if(tempc[i]==0x00){
tempc[i+1]=tempc[i];
tempc[i]=tempc[i-1];
tempc[i-1]=dot;
break;
}
}
を追加。”.”ごときで結構大変。

正確な温度計が、家にないので校正ができない。
暑いか寒いか程度の話なので、正確な温度も必要ないので、
後は、体で決めるしかないね。

さてさて、ちゃんと動いてくれるんだろうか。 [ソフト]

ディスプレイは、DISPLAYTRONICのACM1602NI-FLW-FBW-M01。
PICは初めてで、しかもインターフェースがI2Cというさらに未知のもので、
不安材料がいっぱい。ハードの方は、繋ぐ箇所も少ないのでそれほどだけど、問題はソフト。

とりあえず、テスト表示のプログラムを作らないといけないけど、ひな形は3つ。
秋月のHPにある取説に2つ。「はじめてのPIC」に1つ。
ただ、取説の方は、PICの機種が違い、「はじめてのPIC」の方は、PICは同じだけどディスプレイが違う。

取説のサンプルプログラムは、8ビットのPIC16F877A用が2つ。もう1つあるが、これはAVR用?
2つのうち、1つは直接ピンを操作しているもので、もう一つはMSSPモードを使ってるもの。
とりあえず直接ピンを操作しているものから試してみることに。

MPLAB IDEでプロジェクト作って、プログラムをコピー。
このままじゃコンパイラが通らないので、
#include #include //**********************************************************************************// #define uchar unsigned char //**********************************************************************************// #define sda RC4 #define sclk RC3 //**********************************************************************************// __CONFIG(HS & WDTDIS & PWRTDIS & BORDIS & LVPDIS & DUNPROT & UNPROTECT); //**********************************************************************************// となっている頭の部分を //**********************************************************************************// #include #include //**********************************************************************************// #define uchar unsigned char //**********************************************************************************// #define led PORTBbits.RB5 #define led2 PORTBbits.RB7 #define sda PORTBbits.RB4 #define sclk PORTBbits.RB6 #define _XTAL_FREQ 8000000 //**********************************************************************************// #pragma config PLLEN = OFF , FOSC = IRC , PWRTEN = ON , WDTEN = OFF #pragma config MCLRE = OFF , LVP = OFF //**********************************************************************************// にして、コンパイルはOK。 プログラムを書き込んで実行してみる。????。 ディスプレイには、■×16が2行。なんにもしてないってこと?ムム。 インターバルのタイミングを変えてみたりしたけど、動かない。 なんだか怪しい感じだな。たとえば、通信スタートの部分の void start(void) { sclk=1; sda=1; sda=0; sclk=0; } は、データをクロックより先にダウンさせるといことで、論理的には合ってるけど、 こんなタイミングでいいんだろうか。クロックは8MHzなので、1命令が4クロックだと0.5μs。 こんなの受け手が理解できてるんだろうか。 取説を熟読するとわかってきたのは、I2Cはデータとクロックのシリアル通信。 クロックが、オンになった時のデータの状態を1bitとしてやり取りしている。 だから「1」を送るなら、両方OFFからデータON、クロックON、クロックOFF、データOFFの順番。 クロックがオンの最中にデータは変化しない。 ただ、スタート、ストップの時は、これを変化させることでそれぞれの意味を伝えている。 つまり、クロックONの最中にデータをOFFするとスタート、ONするとストップになる。 取説のタイミングチャートには、このディスプレイのスルーレートは100KHz=1サイクル10μs。 スタート、ストップコンディションのホールド時間は、最低2.4μsと書いてあるし、 クロックが1MHZ位ならタイミングがいいのかも。 などなど、疑問はあるものの、ここで悩んでもしょうがないので、 もう一つの方でやってみると、すんなり動いた。 なんだよーと思いつつも、一安心。 さっき悩んだせいで、少しわかった気もするし、前には進んでるからいいか。 もう少し、研究してみないと。 DSC_0011.JPG
ソフト ブログトップ

いろいろ覚えることも多く、知りえた知識を貯めておこうと思います。先はまるで見えないですけどね。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。