AM変調315MHz電波リモコンの製作
------------------------------------------------------------------------------------------------------
(これまでのあらすじ)
バイクの盗難アラームを作ろう!から第一弾の試作品が完成して、只今2号機を製作中。
製作開始から半年が過ぎ、アラーム本機能とは別にリモートコントロール機能の必要性に迫られた。
赤外線リモコン(38KHz)なら単純に市販モジュールの組み込みが可能であったが、木の葉一枚で遮られるようでは実用的ではない。
そこで一般的に車で採用されている315MHz〜2.4GHz帯の無線電波方式を検討してみた。
しかし430MHz以上は電波法が絡む事が判り、モジュールの価格も鑑みて315MHzに決定した。
------------------------------------------------------------------------------------------------------
ってな訳で18F2550から分離してページを設けた訳だ。
さて、2月からの一ヶ月間こんな感じで無線モジュールと格闘していた。
取り敢えずはゲットした送受信モジュールをPICのシリアル通信に接続してみる。
ブレッドの左半分が送信で右半分が受信。
いづれもPIC16F88を使っているが、その訳はTXとRXを使う為だった。
しかし結果は全く反応しなかった。
無線の知識が全く無いので悩む悩む・・・・。
何故シリアルで反応しないの?・・・に一ヶ月近くを費やした訳だ。
ストロベリー・リナックスから通販で買った、これが送信モジュールで、下が受信モジュール。
AM変調とかASKとかもう知らない単語ばっかり・・・・エンコーダやらデコーダやら、
・何故それが必要なのか?
・このモジュールだけじゃダメなの?
いろいろ調べていくうちに面倒になってきちゃったよ・・・。
ショップの但し書きにも、
---------------------------------------------------------------
※TV・ラジオなどのノイズを受信しますのでそれをソフトウェアでフィルタリングして使ってください。
繋いで簡単に無線になるものではありません。
何も電波を受信していなくてもかなりノイズが入ります。
ノイズは割りと小さいパルス幅のものが多いのである程度の時間キャリアを出せばパルス幅を検出して区別できます。
このモジュールは受信機内部の1つの部品とお考えください。このモジュールだけでは通信できません。
ソフトウェアを開発できない方は他社で数万円程度で市販されております無線通信モジュールをお求めください。
多分そちらの方がお客様の希望の商品に近いと思います。
---------------------------------------------------------------
とかエライ挑戦的な文面もあり、難儀を予想させる。
そんな時に知り合ったU師匠(以下、師匠)がここで登場する。
実はこの師匠、あたしの仕事上のお客さんなのだが、殆ど電子の専門家!
ってか、アキバでジャンク買い集めて再生させる事を趣味としているような人で電波にもメチャ詳しい!
早速この画像を見せると、
「これはエンコードとかデコードと言った類のものじゃないよ」
「未変調のパルスが飛んでるだけからシリアルじゃなくて只の入出力ピンじゃないかな?」
とアドバイスを貰った。
早速ピンを変更してみる。
スイッチが押されたらLED−ONのプログラムと共に。
しかし何も操作していないのにONもOFFも点灯。
だめだ・・・全く理解不能だ・・・・これがノイズか?
よほど気の毒に思ってくれたのか?
師匠が現場(我が家)に来てくれる事になった。(感謝です!)
一目見るなり、
「これはAMだから全部ノイズだよ」
「ノイズがすごい速さでON−OFFしてるから両方のLEDが光って見えるんだよ」
と解説してくれた。
つまり、この点灯は気にしなくていい・・・というか、このノイズ群から正しいデータを取り出すプログラムが必要なのだと知る。(それをカクテルパーティー効果というのだそうだ)
だとするならショップの文面にある「ある程度の時間キャリアを出せばパルス幅を検出して区別できる」の意味が理解できる。
って事は、やっぱりシリアルとかじゃなくてパルスの組み合わせをプログラムすれば送信データとなる訳か?
受信ピンをプルダウンして送信ボタンを押すと、微妙に揺れるものの受信のON−OFFが止まった!
持参してくれたデジタルオシロに掛けてみるとご覧の通り。
大きなサイン波は交流ノイズで本来は直線なのだそうだ。
その先から細かくピコピコと上下しているのがノイズ。(写真上)
送信ボタンを押すと何らかのパルスが載ってノイズが消えた。(写真下)
結構感動していると「電波が出ているか?確認しよう」とラジゲータを組む事にする。
事前に師匠に言われて用意しておいた、ショットキー・バリア・ダイオード(1SS97)2本を+−にしてラジゲータ(500uA)に半田付けしておしまい!?
これが所謂「検波器」の原型なのだそうな。
正確な数値が必要ならもっと複雑に作る必要があるが、電波が射出しているか?否か?を検知するにはこれで十分との事。
理屈も判らぬまま、言われるままに送信アンテナに接触させてみる。
送信スイッチを押していない時はそのまま変化なし。(写真上)
スイッチを入れてビックリ!
カチン!と音を立ててメーターの針が振り切れた!(写真下)
「ほら、十分電波が出てますね!」
ほぉ〜ぅ・・・・すごいニャぁ〜・・・・勉強になるニャぁ〜・・・・。
つまりこの送受信モジュールの使い方は、
@送信で「スタート→データ→エンド」を射出する。
Aそのパターンを受信で解析してユニークデータの認識とする。
って事か?
・・・という事は・・・・ここからはプログラムの世界?・・・あたし?・・・・
う〜ん・・・・なんかとっても面倒そうだったので避けていたPWMの出番なのかなぁ・・・・。
最終的にはブザー音もPICの中で生成して搭載スペースを小さくしたいと目論んではいた。
しかし早くもここで勉強する必要に迫られてきたか・・・・・。
Aのパータンの採取方法が全く判らないが、とにかく進めてみよう。
【PWMをマスターする】
先ず・・・・だ。
そもそもパルス幅変調(PulseWidthModulation)って何よ!?
--------------------------------------------------------------------------------
PWMとはパルス信号を出力しておく時間(パルス幅)を長くしたり、短くしたりして電流や電圧を制御する方式のことである。
パルス信号とはON/OFFを繰り返す電気信号のことで、矩形波で表される。
電圧の出力時間であるパルス幅はこの矩形波の横軸で表される。
PWM方式では一定周期で動作するタイマを利用する。
このタイマにパルス信号をONにする位置を設定してパルス幅を制御する。
一定周期の中でONにしている比率のことを「デューティー比」と呼ぶ。(出典:IT用語バイナリ)
--------------------------------------------------------------------------------
ステッピングモーターの制御には不可欠・・・・・と。
ONとOFFの時間比をデューティー・・・・と。
要は、あるサイクルを定義して、その範囲でHIの時間を変化させる=比率を変更してやる事が、パルス幅を変更してやるという事になる訳だ。
設定に必要な用語は、
CCP1、PWM、TMR2、プリスケーラ、デューティー比くらいかな?
これらの役目をデータシートから当りを付けてみる。
その母体となる1サイクルの決定はおそらくクロック周波数から起算するハズだ。
取り合えずはLEDの点灯だけで実験してみよう。
使うレジスタは4つ。
@CCP1CON
AT2CON
BPR2
CCCPR1L
だが、その前にCCP1を設定する必要がある。
CCP1は通常RB3に固定されているが、16F88はデフォルトでRB0になっている。
別にそのまま使えばいい話だが、一般的にはRB3なので、ここでもRB3にセットして覚えよう。
方法は簡単でコンフィグレーションビットに”& CCPRB3”を追加してやるだけ。
@CCP1CON
CCPとは「正確な周期を作るコンペア/正確な時間測定のキャプチャー/パルス発生のPWM」をセットにして管理するレジスタで頭文字のCCPとなる。
CCPは2つ以上あるCPUもあるが、88は1つしかないのでCCP1CONとなる。
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
--- | --- | CCP1X | CCP1Y | CCP1M3 | CCP1M2 | CCP1M1 | CCP1M0 |
未使用 | 未使用 | CCPR1Lの下位2ビット目 (CCPR1L参照) | CCPR1Lの下位1ビット目 (CCPR1L参照) | コンペア/キャプチャー/PWMの選択 |
コンペアとキャプチャは不使用なので省略。
PWMモードの設定は”1100”であるから、
CCP1CON=00001100=0x0C
となる。(CCPR1Lも参照)
AT2CON
PWMとタイマー2は常に対なようだ。
尤も今回は単にパルスを発生させたいだけで、故にタイマー割り込みは使わないので単純に時間計測として扱う。
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
--- | TOUTPS3 | TOUTPS2 | TOUTPS1 | TOUTPS3 | TMR2ON | T2CKPS1 | T2CKPS0 |
未使用 | TMR2割り込み回数 | TMR2セット | プリスケーラ設定 |
TOUTPS3-0
この回数でTMR2を割り込ませる。
今回は不使用なので”0000”とする
TMR2ON
これをセットしておかないとPWMが有効にならない。
T2CKPS1-0
TMR2をカウントするサイクルを決定する。
T2CKPS1-0 | プリスケーラ |
00 | 1 |
01 | 4 |
10 | 16 |
このサイクル毎に「TMR2+1」を実行する。
今回は16倍にするので”10”とする。
T2CON=00000110=0x06
となる。
BPR2
PR2は、TMR2との値を比較して等しくなった時にTMR2割込みを発生させる(今回はタイミングを計る)目的で使用する値。
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
PR2の値を0−255で設定する |
周期=周波数はPR2値とCPUの1サイクル時間とT2CKPS1-0のプリスケーラ値で決まる。
PR2は最大値が8ビット(255)〜最小値が0ビット(0)になる。
この値より、
周期=(PR2値+1)* 4 * CPUの1サイクル時間 * プリスケーラ値
と表せる。
(PR2値+1)の”+1”はPR2がゼロの指定だと周期がゼロになってしまう為。
CPUクロックが8MHzの場合の1サクル時間は、
1/8000000=0.000000125(秒)=0.000125(ミリ秒)=0.125(マイクロ秒)
となる。
また1秒の周期=1ヘルツ(1Hz)だから、これらよりPR2とプリスケーラの値を変更してみた目安となる周波数を表にしてみると、
CPUクロック数 MHz | 1サイクル時間 マイクロ秒 | PR2 | プリスケーラ | 周期 ミリ秒 | 周波数 int(Hz) | 周波数 KHz |
8 | 0.125 | 255 | 16 | 2.048 | 488 | 0.488 |
8 | 0.125 | 200 | 16 | 1.608 | 621 | 0.621 |
8 | 0.125 | 150 | 16 | 1.208 | 827 | 0.827 |
8 | 0.125 | 100 | 16 | 0.808 | 1237 | 1.237 |
8 | 0.125 | 50 | 16 | 0.408 | 2450 | 2.45 |
8 | 0.125 | 40 | 16 | 0.328 | 3048 | 3.048 |
8 | 0.125 | 30 | 16 | 0.248 | 4032 | 4.032 |
8 | 0.125 | 20 | 16 | 0.168 | 5952 | 5.952 |
8 | 0.125 | 10 | 16 | 0.088 | 11363 | 11.363 |
8 | 0.125 | 5 | 16 | 0.048 | 20833 | 20.833 |
8 | 0.125 | 3 | 16 | 0.032 | 31250 | 31.25 |
8 | 0.125 | 1 | 16 | 0.016 | 62500 | 62.5 |
8 | 0.125 | 0 | 16 | 0.008 | 125000 | 125 |
8 | 0.125 | 255 | 4 | 0.512 | 1953 | 1.953 |
8 | 0.125 | 200 | 4 | 0.402 | 2487 | 2.487 |
8 | 0.125 | 150 | 4 | 0.302 | 3311 | 3.311 |
8 | 0.125 | 100 | 4 | 0.202 | 4950 | 4.95 |
8 | 0.125 | 50 | 4 | 0.102 | 9803 | 9.803 |
8 | 0.125 | 40 | 4 | 0.082 | 12195 | 12.195 |
8 | 0.125 | 30 | 4 | 0.062 | 16129 | 16.129 |
8 | 0.125 | 20 | 4 | 0.042 | 23809 | 23.809 |
8 | 0.125 | 10 | 4 | 0.022 | 45454 | 45.454 |
8 | 0.125 | 5 | 4 | 0.012 | 83333 | 83.333 |
8 | 0.125 | 3 | 4 | 0.008 | 125000 | 125 |
8 | 0.125 | 1 | 4 | 0.004 | 250000 | 250 |
8 | 0.125 | 0 | 4 | 0.002 | 500000 | 500 |
8 | 0.125 | 255 | 1 | 0.128 | 7812 | 7.812 |
8 | 0.125 | 200 | 1 | 0.1005 | 9950 | 9.95 |
8 | 0.125 | 150 | 1 | 0.0755 | 13245 | 13.245 |
8 | 0.125 | 100 | 1 | 0.0505 | 19801 | 19.801 |
8 | 0.125 | 50 | 1 | 0.0255 | 39215 | 39.215 |
8 | 0.125 | 40 | 1 | 0.0205 | 48780 | 48.78 |
8 | 0.125 | 30 | 1 | 0.0155 | 64516 | 64.516 |
8 | 0.125 | 20 | 1 | 0.0105 | 95238 | 95.238 |
8 | 0.125 | 10 | 1 | 0.0055 | 181818 | 181.818 |
8 | 0.125 | 5 | 1 | 0.003 | 333333 | 333.333 |
8 | 0.125 | 3 | 1 | 0.002 | 500000 | 500 |
8 | 0.125 | 1 | 1 | 0.001 | 1000000 | 1000 |
8 | 0.125 | 0 | 1 | 0.0005 | 2000000 | 2000 |
これを周波数順にソートしてみると、
CPUクロック数 MHz | 1サイクル時間 マイクロ秒 | PR2 | プリスケーラ | 周期 ミリ秒 | 周波数 int(Hz) | 周波数 int(KHz) |
8 | 0.125 | 255 | 16 | 2.048 | 488 | 0 |
8 | 0.125 | 200 | 16 | 1.608 | 621 | 0 |
8 | 0.125 | 150 | 16 | 1.208 | 827 | 0 |
8 | 0.125 | 100 | 16 | 0.808 | 1237 | 1 |
8 | 0.125 | 255 | 4 | 0.512 | 1953 | 1 |
8 | 0.125 | 50 | 16 | 0.408 | 2450 | 2 |
8 | 0.125 | 200 | 4 | 0.402 | 2487 | 2 |
8 | 0.125 | 40 | 16 | 0.328 | 3048 | 3 |
8 | 0.125 | 150 | 4 | 0.302 | 3311 | 3 |
8 | 0.125 | 30 | 16 | 0.248 | 4032 | 4 |
8 | 0.125 | 100 | 4 | 0.202 | 4950 | 4 |
8 | 0.125 | 20 | 16 | 0.168 | 5952 | 5 |
8 | 0.125 | 255 | 1 | 0.128 | 7812 | 7 |
8 | 0.125 | 50 | 4 | 0.102 | 9803 | 9 |
8 | 0.125 | 200 | 1 | 0.1005 | 9950 | 9 |
8 | 0.125 | 10 | 16 | 0.088 | 11363 | 11 |
8 | 0.125 | 40 | 4 | 0.082 | 12195 | 12 |
8 | 0.125 | 150 | 1 | 0.0755 | 13245 | 13 |
8 | 0.125 | 30 | 4 | 0.062 | 16129 | 16 |
8 | 0.125 | 100 | 1 | 0.0505 | 19801 | 19 |
8 | 0.125 | 5 | 16 | 0.048 | 20833 | 20 |
8 | 0.125 | 20 | 4 | 0.042 | 23809 | 23 |
8 | 0.125 | 3 | 16 | 0.032 | 31250 | 31 |
8 | 0.125 | 50 | 1 | 0.0255 | 39215 | 39 |
8 | 0.125 | 10 | 4 | 0.022 | 45454 | 45 |
8 | 0.125 | 40 | 1 | 0.0205 | 48780 | 48 |
8 | 0.125 | 1 | 16 | 0.016 | 62500 | 62 |
8 | 0.125 | 30 | 1 | 0.0155 | 64516 | 64 |
8 | 0.125 | 5 | 4 | 0.012 | 83333 | 83 |
8 | 0.125 | 20 | 1 | 0.0105 | 95238 | 95 |
8 | 0.125 | 0 | 16 | 0.008 | 125000 | 125 |
8 | 0.125 | 3 | 4 | 0.008 | 125000 | 125 |
8 | 0.125 | 10 | 1 | 0.0055 | 181818 | 181 |
8 | 0.125 | 1 | 4 | 0.004 | 250000 | 250 |
8 | 0.125 | 5 | 1 | 0.003 | 333333 | 333 |
8 | 0.125 | 0 | 4 | 0.002 | 500000 | 500 |
8 | 0.125 | 3 | 1 | 0.002 | 500000 | 500 |
8 | 0.125 | 1 | 1 | 0.001 | 1000000 | 1000 |
8 | 0.125 | 0 | 1 | 0.0005 | 2000000 | 2000 |
となる。
ちなみに他のクロック数/PR2値/プリスケーラ値で周波数を計算するために、こんなん用意した。
って事は、クロック8MHzの出せる最低周波数は488Hzで、それ以下にしたい場合はクロック数を落とすしかないって事だ。
逆に、最高周波数は2MHzでそれ以上出したい場合もクロック数を上げるしかない事になる。
ちなみに上記の表をグラフにして驚いた。
当然赤の軌跡を想像していたのだが、こんな感じなんだ・・・・。
使用可能領域が薄緑の範疇になるのが判る気がする・・・。
CCCPR1L
1周期の中でパルスを何%発生させるか?の比率がデューティー比だ。
CCPR1Lは8ビットで構成されているので、00〜FFとなり、50%=127(10)=7F(16)になる。
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
デューティー比を0−255で設定する |
例えば50%をHI(パルス発生)、50%をLOW(切断)とするならば、デューティー比は127であり、
CCPR1L=50(10)=0x7F
となる。
【あれ?音が面白い!?】
この周波数を実感するには音を出してみるのが一番だ。
ってな訳で、無造作に圧電スピーカーを繋げてみる。
-------------------------------------------------------------------------
__CONFIG(DEBUGDIS & ・・・ & INTIO & FCMDIS & IESODIS & CCPRB3);
main(){
CCP1CON=0x0C; //PWMモード
T2CON=0x07; //TMR2有効、プリスケール*16
PR2=0xFF; //PWM周期
CCPR1L=0x3E; //PWMパルス幅
n=255;
while(1){
if(n<127){
n=255;
}
PR2=n;
Timer_GO(1); //タイマールーチン(1ms維持)
n--;
}
}
-------------------------------------------------------------------------
これだけ。
・・・・をっ!・・・・面白い!・・・・PR2を変えたりCCPR1Lを変えたりして遊んでみる。
何故127で止めているか?というと、周期とHIの物理時間が小さくなるにつれて、人間の耳にはHIにしか聞こえなくなってくる事が実験の結果判ったから。
具体的には「ピユ〜〜ン、ピー!」ってな感じでデューティー値255の「ピー」になってしまうのだ。
突然ですが、ここでアホ話を一つ。
余りチップを抜き差ししない想定だったが、面白くて何十回も焼き直しているとやっぱりピンが曲がってきた。
だからゼロプレッシャーソケットを買い足した。
一番安かったノーブランド(ELKシリーズ?)をマルツで525円で購入。(安っ!)
早速使ってみたが、LEDが光らない・・・・。
あれ?配線が抜けちゃったか・・・・?
点検するもOK。
ソケットからCPUを抜いて直差してみるとOK。
え?ソケットが不良品?
とソケットを横から眺めたら、なんと!接地面が湾曲している!
中央部が約0.2mm浮いているのだ!
つまり中央部のピンがブレッドボードに接触しきれてなくて通電していなかった!
久しぶりに「そもそもお前の目的は何だよ!」のバカ製品に遭遇したよ。
ノーブランドとはいえ笑えるぜぃ!
下面をヤスリで削ぎ落とすつもりで眺めたら、ご丁寧に足が付いてる。
その足と型番?をカッターで削ぐ。
これで0.2mmはピン足が伸びたか?
この状態でブレッドに差すと通電するようになったので、とりあえずこれで使う事にするが、根本的に是正していないのだから、もしまたダメなら鉄ヤスリで下面をフラットにするしかあるまい。
などど遊んでいる場合ではない・・・・。
さらに2週間掛けて電波の調査を進めているうちに壁に突き当たった。
最初は電圧と周波数の関係を必死に探していたのだが、そのうちにイヤでもそれは無知の成せる業だと気づいてくる。
特定の周波数を解析するにはどうすればいいんだろう?
と探しまくると”フーリエ”、”ラプラス”といった単語が見え隠れしてくる。
フーリエ変換などは大学の数学のお勉強程度の知識な訳で、確かに離散フーリエ変換(高速フーリエ変換=FFT)をプログラムすればスペクトラム解析が出来るのだろう。
しかし、その理屈から入るのがもう面倒になっている自分が居る・・・・。
そこまでやるかい?・・・・って思っていたらこんな参考書を見つけちゃった。
(本物は仕事のフリして読んでるから画像だけ→)
しっかし、PICって何?から先人達のHP情報だけでここまで来てたのだがついに参考書を買うハメになるとは・・・・・懐はそれほど痛くは無い(2940円也)が精神的(気力的)に痛いよ。
しかも思わず買っちゃったが、三角関数の微分まで来た処で眠くなっちゃたよ・・・(って、たった数ページでかい!)
しゃ〜ね〜・・・・進めるか・・・・・(ため息)・・・・って処で、すでに人柱を一ヶ月やってもらってる人から連絡あり。
「あの〜・・・バイクのシートを閉めただけでアラームが作動しちゃうんですけど、リモコンとか無いですかね・・・」
ドンピシャのタイミングで責められる・・・・。
「仕方がない。こうなったらシリアル通信で一時回避しよう!」
と人のせいにして一時勉強を逃れる理屈をコネる事にした・・・・・だってホント面倒になっちゃったんだよ・・・・・・。
あやうく電波が嫌いになる処だったので助かった!
(続きは一段落してからじっくりと再開しよう!参考書も買っちゃった事だし!)
(とか言いながら6月に解決!&完成!詳細はここ!)
ってな訳で、気が変わらない内に速攻でシリアル通信が出来る電波モジュールを購入する。
これはIPIの通販で購入した AM-HRR3-315(受信:左側)とAM-RT5-315(送信:右側)
送料込みで3,990円はチト痛かったな。
関連記事を参考にしてみると、この一ヶ月の電波のお勉強のお陰(?)で、今まで見えなかった内容が見えてくる。
例えば”TTLレベル通信”などと書かれていると「シリアルじゃないじゃん!」などと訳の判らない思い込みをしていたのだが「それじゃプルダウンさせりゃいいじゃん」と思うようになってきたり。
ともかく時間を費やす事で、薄い知識に何層かの膜が覆ったのは事実のようだ。
さて配線してみるも、うまくシリアルに上がらない。
あれぇ〜?簡単に出来ると思っていたんだが・・・・。
これまで真面目にプログラムしなかったエラー処理を噛ましてみるとフレーミングエラーである事が判明。
フレーミングエラーとは最後のストップビットが確認出来ないままタイムアウトになって1つのデータとして認識出来なかった事を指す。
これまで(無線以外)では全く発生しなかったエラーだ。
だってボーレートさえ合わせればフーレミングだのオーバーランだのは起こりえないもの。
何故フレームアウトになるんだろう?
採取時間が足りないのかな?
いや、RCIFを得てから処理しているのだから有り得ないし。
送信側(手前→)だけで送受信する、つまり有線で通信する分には何の問題もないので、設定やプログラムの問題ではないハズ。
無線しかないじゃん!・・・・と、これまた2週間座礁する。
とにかく何かのキーワードさえ掴めれば糸口にはなるハズと、いろいろググッていると「正しいストップビットの利得には電源電圧が必要・・・・」といった記事が目についた。
え?当たり前じゃん?電圧が無きゃ、そもそもRB2ピンが認識しないじゃん?
と思うものの念のためにRB2ピンをテスターで測ってビックリ!・・・・1Vしかない!
理屈は判らないが、電波に乗ったデータを受信モジュールのアンテナが受けてシリアル処理後にOUTから出てきた時点で電圧が1Vしかないのだ。
え〜?壊れてんのか?それともそういう仕様なのか?でも仕様書ではHレベルの最高出力は4.5Vになってるし・・・・。
電気の事を良く知らない強み(?)で受信モジュールのアウトプットを手元にあった抵抗(470Ω)でプルアップしてみる。
受信時の電圧が2.5Vに上がって、正しい送信データ+フレーミングエラーデータがバラバラと届いた。
よく見ると送信側のスイッチを離した時点で受信側の電圧がゼロになるのだが、その降圧がゆっくりになっている。
その電圧が失われないうちに送り出した最初(先頭)のデータだけが正常にストップビットを獲得している様に思える。
ちなみに右の文字は、
R:フレーミングエラー
E:オーバーランエラー
O:ボタン1押下
K:ボタン2押下
N:その他??文字
である。
そこで適当に結線した抵抗を可変抵抗に変えてテストした結果、1kΩが一番拾いやすい事が判明。
しかしそれと同じくらいに重要なのはプログラムロジックで「ほんの数行余計な記述をする=データ取得タイミングが変わる」だけで正しい値が到着する確率が変わるのだ。
と言う訳でメイン処理のループの部分は以下になる。
------------------------------------------------------------------------
MainLoop:
if(RCIF==0){
ResFlg=0; 送信ボタンを押し続けた場合の連続取得制限フラグ
}else{
Data=RCREG;
if(ResFlg==0){
RB3=1;
if(FERR==1){
for(i=0;i<10;i++){
Dmy=RCREG; フレーミングエラーをクリアする為にRCREGの内容を吸い出してやる
}
Data='R';
}else if(OERR==1){
CREN=0;
CREN=1; オーバーランエラーをクリアする為にCRENをクリア&セットしてやる
Data='E';
// }else if(Data=='O'){
// RS_GO(Data);
// }else if(Data=='K'){
// RS_GO(Data);
}else{
Data='N';
}
ResFlg=1; 一度送信ボタンを離すまでデータ取得を行わない
RB3=0;
}else{
Data='1';
}
RS_GO(Data);
}
goto MainLoop;
------------------------------------------------------------------------
もう・・・・電波ってとっても微妙・・・・・これ嫌い!
ともかくブレッドボードの接触も信用出来ない今、焼いてみるしかあるまい・・・・って事で製図に起こす。
できるだけコンパクトにする為に単5/12Vの乾電池を使ってみる事にした。
またここでやっとPCBEのレイヤーが固定化した。
0:パターン 0.6mm
1:ランド 1.8mm
2:孔 0.8mm
とする。
何か試作の試作・・・・って感じがしてきた。
上の製図は送信用で左側(→)
念のために受信単体も製図してみた(右側)
実はこの時点でまだ気付いていないが、シルクの反転を忘れている。
今回秋月電子でお買い求めした中に熱電対がある。
前回のエッジング時に水銀温度計を壊してしまい危険を感じた為、温度センサーを使ったデジタル温度計を作ろうと思っていた。
しかし秋月電子でステンレス管熱電対を発見し、
「そっか!この間買った電圧計は温度も計れたんだ!だったらこれ接続出来るじゃん!」
を思い出したのだ。700円也。
前回買った最後の感光基板で前回の自己メモ通り75秒で露光してみる。
なんだぁ〜??これ(→)
思い切り露出オーバー・・・・
何で?
前回の136秒よりも遥かにオーバーしている。
一番高いガラスエポキシなのに・・・・それも関係してるのかな?
素材毎に時間が大幅に違うのかな?
気を取り直して先日買った紙フェノールで60秒感光してみる。
今度は上手くいった。
この違いは何だろう?
たった15秒でこれほど差がつくとは思えないので単樹な露光時間のせいではない。
問題があるとすれば5ヶ月違いの製造鮮度か?
それとも材質による根本的な差なのか?
それに同じ版でありながらこの差はなんだろう?
単純に溶け切ってないだけなのだろうか?
もしかしたら結構難しい作業なのかもしれない。
次回の作業手順を目立つように書いておこっと。
1)シルク文字はPCBEで反転しておく事!
2)基板は使用する直前に買うこと。牛乳みたいに日付を選ぶ事!
3)露光時間は60秒にしてみる
4)現像液は皮膜落としで使うので最後まで捨ててはいけない!
5)エッジングは絶えず揺すりなが様子を見る事!
最後にヤスリで丁寧に面取してやれば、
「SW−T55ケース」(内径が50.5*35.5*16.0)にピッタリ!
************************************************************************************************
さぁ、飽きちゃった時の新作グッズ紹介コーナー〜!!!
ドン♪ドン♪ドン♪パフ♪パフ♪パフ〜♪(ホントに飽きてんな・・・・・)
先ずは照明スタンド。
半田付けの際に老眼鏡だけでは辛くなってきている昨今。
ところがもっと重要な問題が・・・・基板に0.8mmの穴を開けるボール盤のドリルの切っ先に焦点が合わな〜い!
悲しい・・・・・・。
せめて手元を明るくしてやろうと百均で見つけたグッズ!
ふむ・・・・なかなか良いかもしんない・・・・。
2つで200円!
次、3端子レギュレータ。
実はTA4805Sがデカ過ぎてケースに入らんかった!
ワハハ・・・・
だから小さめのTA48M05F。
次、モーメンタリープッシュスイッチ。
なんと!僕の大好きなブランド「日本開閉器」の逸品。
通常200円/個するのに、なんと!50円/個
当然、倒立タイプ(BB−15AP)での使用なんだけど、横向きタイプ(BB−15AV)は人気が無いらしくこの価格。
だったらピン曲げて使えばいいじゃん!
って事で、1/4の価格で10個購入!
こうやって使えばいいんじゃ!
最後はLED。
以前に2色LEDを面白半分で買ってみたがこれが役に立つ!
だってスペース半分で済むんだもん!
それに気づいちゃったから大変!
だって現在アラームは光だけでモニタしてるからLED5個も使ってるし・・・・。
そのスペース半端じゃね〜!
かなりの省スペースに貢献しそうだ・・・・と思ったのだが・・・。
先ずは順当にRGBを表現。
ここまではOK。
ちなみに、
R:2.0V:635mn:2000mcd
G:3.6V:470nm:2500mcd
B:3.6V:525mn:7000mcd
だそうで、均一に光らせるにはそれぞれ別の抵抗が必要だ。
ところが・・・・
ちっとも混ざってな〜いっ!!
当然の事ながら、
R+G=黄色
R+B=紫
G+B=水色
R+G+B=白
の合計7色は期待していたのだが、全く混ざらない・・・・。
これじゃただの3色LEDじゃんかぁ!
抵抗でかなり光量を抑えているので、もしかしたら調整をすれば遠目には混ざって見えるのかもしれん・・・。
まぁ今後の成り行きで。
(70円/個は失敗だったかも?)
************************************************************************************************
お買い物コーナーで買ってきたTA48M05Fに変更して完成!
ご覧の通り、単5電池を含む大きさ。
矢印のピンはパソコンでデバックする為のRS232C出力ピン。
スイッチはプッシュを買う前に回路製作してしまったので、今回はタクトをそのまま使用する。
================================================================================================
ここまで無線と格闘し続けてすでに4ヶ月。
シリアル無線が完成したところで、突然んっ?っと気が付いた。
もしかしてストロベリーの挑戦状はPICのシリアルに相当する何かが必要なのではないか?
データの出し入れにはやっぱりエンコードとデコードが必須なのではないか?
つまりエンコーダーとデコーダーが必須なのでは?
ここまでツラツラと見ては仕舞い、見ては仕舞い・・・を繰り返していた”PT2262/72”の仕様書を再びじっくりと眺める。
もう何十回見たんだよ・・・・・?・・・・そして・・・・・
あっ!っと気が付いた。
このICはプログラムをウンヌン・・・ではなくて、もうセットされた回路があって、
つまり単純に固定のスイッチなんじゃぁ?って事に気が付いた。
よし!それじゃ買ってみよう!って事で早速イーエレで購入する。
受信用(PT2272)はラッチとモーメンタリで製品が違うので注意が必要。
取り敢えず「モーメンタリ4データ」の”PT2272M4”にする。
また送信用(PT2262)はRFとIRの違いがあるが、その他は区別が無いので”PT2262”にする。
到着するまでの数日間に、
秋月電子で必要な部品のお買い物。
悩んだのがOSC1/OSC2。
4.7MΩってなんだよ?
何か抵抗みたいじゃんか!
確かにヘタに抵抗噛ますと共振してしまう・・・
ってな話はHPで見たことあるけど、
抵抗付けてオシレータになるんだったら
クリスタル要らないじゃん?
・・・・って思わない?
でもそうだったんです・・・Ωってあるんだから
4.7Mなんて見たこともない抵抗を千石通商でゲット。
さすがに秋月電子には置いてませんでした。
15−16ピンに差して電源を入れてみると、
おおっ!
18ピンに並列に付けたLEDが光った!
スゲッ!ホントに動いてる!
フローを見ながら配線の確認をする。
何々?
/TE(14ピン)がキッチリとアースされてないとプロブラムが動かないのね?
つまり受信にM4を選択した場合は、
・アドレスは8ビットが有効
・データは4ビットが有効
であり、
・アドレスは1/256を選べる
・データは4パターンの送受信が可能
って事だ。
取り敢えずは、
アドレス=0x00
データ=0x03
で開始するが、
”そりゃデフォルトだろうが!”
ってなツッコミは予想されるので、
アドレスは最後に任意設定する事にしよう。
今回はスペースの関係上、
スイッチ2つで2通りのパターンを作るが、
4つのスイッチで4通りのパターンまで可能だ。
またアドレス(個体の認識コード)は8ビットの組み合わせで256通り可能なので任意でプルダウンさせる。
(当然値は教えないよ!)
このテストでは、
・SW1=D3
・SW2=D2
とし、電圧計はD2に接続している。
(D0、D1は確認の為に一時的に付けている)
SW1を押すとD3がプルダウンされてOFFになる。
この時、D2は開放なので電圧が掛かっている。
下の写真はSW2を押した処で、
D2がプルダウンされて電圧が掛かっていない事が判る。
PIC側で4パターン取るには、
(SW1=A0、SW2=A1とすると)
if(RA0==1 || PA1==1){
if(RA0==1 && PA1==1){
(SW1とSW2の両方が押された処理へ)
}elseif(RA0==1){
(SW1が押された処理へ)
}elseif(RA1==1){
(SW2が押された処理へ)
}
とするルーチンをメイン処理でループさせておくか、
個別に割り込み処理を行なえばよい。
これに気がついてからここまで3日間。
今までの4ヶ月はなんだったんだろう・・・・でもないか!?
その期間の苦悩が無ければ突然のヒラメキなどありえまい!
さて、分離して電池でテストしてみる。
PT2262/2272は一度動き出すととっても素直だぞ!
だんだん好きになってきたぞ!
送信モジュールは背が高くケースに入らないので足を曲げて寝かせる事にした。
その分スペースがとられてしまうので設計のやり直しだ。
基板化はその後だな。
回路構成の話題はこれで終了する(あとは本編で出てきます)が、このエンコーダ/デコーダを扱う上での注意が1点。
抵抗値は必ず守る事!
いい加減に組んでも発振はおろか、プルダウンもうまくいかず、余計な悩みを抱える事になりますぞ!
スペースの関係で単5で12Vの乾電池を降圧して使う事にするが、秋月電子でこんな電池を発見!
A32という9V電池だが、単5と並べて見ると圧倒的に小さい!
単5が二回りも大きく見えてしまう!
しかしこれは特殊用途の電池のようで秋月電子に行かないと手に入らないようだ。
つまり汎用的ではないので、ここはガマンして一般に手に入る単5にしよう。
アンテナ無しでテストしてみると、約10mほどで通信が途絶えた。
試しに13cmの針金を送受信に立ててみると30mまで届いた。
それじゃここで組み込む為に真面目にアンテナの長さを計算しておこう。
あくまでも垂直アンテナの場合だが、
アンテナ長=300/電波周波数(MHz)/4=必要メートル
で求めるらしい。
照らし合わせると、
300/315/4=0.2381=23.8cm
となる。
パターンアンテナとは?の詳細が現時点でどこのサイトにも記載されていないので理論が判らぬまま勝手に解釈する事にした。
0.3mmで238mmの長さにパターン化する。
またアンテナはモジュール破壊を避ける為に抵抗を置くが、その値もどこにも記載されていないのでとりあえず50Ωとしておく。
将来真面目なアンテナを立てる時はこの抵抗を切って配線する事としよう。
薄いコントラストをさらに拡大したので画像が荒くなってしまったが、とても興味深い結果が出た。
先ずは今回の基板が今までで一番まともに出来たので、その記録。
・紙フェノール:製造2ヶ月前
・露光時間:60秒
・現像時間:30秒
・エッジング:40℃45分間
露光時間は60秒に決定。
緑色の皮膜がうっすらと乗っていて丁度いい加減。
前回「エッジングはよく撹拌する事」と明記したが、これは間違いかもしれない。
というのは、小さい器で撹拌すると「四隅がよく撹拌されて中心が残されてしまう」事が判ったのだ。
撹拌はABCDの端を持ち上げて揺するのだが、それぞれの隅の方が撹拌される度合いが大きいため、中心に向かうほど撹拌率が落ちるのだ。
大きな回路なら問題なくてもこのように小さい回路では大きな差が出てしまう。
@が適性な剥離になってもCは全然ダメ。
Cに合わせるとご覧のとおりに@Aは剥離しすぎて回路が消えてしまった。
つまり、四隅の端に細い回路を書くと消えてしまう可能性が高いという事だ。
また今回は、初めて、
パターン:0.6mm
アンテナ:0.3mm
という細いパターンに挑戦してみたが、0.3mmは最後まで剥離が進まず、その影響で0.6mmのパターンさえも消えかかっている。
やはりパターンは0.7mm以上で描いた方が賢明かもしれない。
欲張って1枚に4つの基板を作ったが、結果的には、
@は使用不可
ABはアンテナを使用しなければ使用可
Cだけがまともに使えそう。
となってしまったのだから、サイズ全部を使うことは考えずに、中央に寄せて「1回路入魂!」でやるべきだ。
【乾電池の不思議】
さて、回路を組んで作動させてみるとアンテナうんぬん・・・の前に、電池に問題発生!
12V電池(実際には10Vまで落ちている)の電池がスイッチONと同時に、もの凄い早さで電圧が落ちていき、あっと言う間に2V。
当然回路は作動しなくなる。
あれ?電池が切れてるのか?と暫く放置すると10Vに復活している。
それじゃ、と試験すると同じ繰り返し。
もしかしてバカみたいに電流消費している?
と測定してみると30mAであった。
う〜ん・・・・確かにちと多いが電池が死ぬ程多くはあるまい・・・・?
何だ?何が起こってるんだ?
といろいろググッてみると「電流容量」に行き着いた。
つまり一度に流せる電流量は決まっていて、それ以上は流せない・・・というもので、特に単5電池は1.5Vのボタン電池を8個直列に並べている構造から内部抵抗が大きく電流容量がとても小さいのだそうな。
秋月電子でパナソニック「GP23A」の電流容量を調べると41mAhとの事。
う〜ん・・・ギリギリだったのかぁ・・・・しかも新品時の値だものなぁ・・・・。
って事でLEDへの抵抗を外して消費電流を計測したらビックリ!
7mA!
なんとLEDだけで23mA使っていたのだ!
このまま単5乾電池に繋いでみると、全く問題なく稼働している!
正確には1mV/sくらいで電圧が落ち続けているのだが、30mA消費の時は500mV/sの勢いで落ちていたので、全く安定していると言える。
アンテナの話に戻るが、現在はまだパターンアンテナへは接続していない。
アンテナ有無の距離実験をしてみたかったからだ。
先ず、基板化してケースに収めると、そもそもアンテナ無しではキツくなっているようだ。
3mも離れると受信側のLEDが点滅し始めて5m程で消える。(何故点滅するのか?は知らん!)
そこでパターンアンテナへ抵抗を入れずに直結してみると8m程飛んだ。
50Ωが無かったので30Ωを入れてみると12m程飛ぶ。
やっぱりキチンと抵抗を入れないと共振しないようだ。
次に例の13cmの針金を垂直に立ててみると20m飛んだ。
全体的に30%程落ちているのはパターンのせいなのか?ケースに入れるとそんなものなのか?判らないが、これ以上深く考えるのは止めておこうかな。
ところで今回の電池問題で”単5乾電池は実は1.5Vのボタン電池8個の集合体”である事が判明した。
そう聞くと・・・・実際に確かめたくならないかい?
んで、ホレッ!
何か・・・美しいよ・・・
”LR932”って聞いた事ないな?
と調べてみた。
どうも「LR932」という規格は12V単5乾電池用の「23A」という規格製品の為だけに存在しているらしい。
よって単体では販売していないのだそうな。
現時点での各電圧を測ってみた。
1.125
1.025
1.023
0.961
0.775
0.311
0.297
0.295
なんだ?
こりゃぁ?
合計の電圧が低いのは判っていたけど、それにしてもこのバラ付きはひどくないか?
何か単5電池が信用出来なくなってきたぞ・・・・。
【レギュレータの不思議】
試しにそのまま24時間放置。
すると翌日には新品の電池の電圧が10Vに落ちている。
あれ〜?
何でだ?
と探ってみると、原因は乾電池ではなくレギュレータだった。
インプット電源とグランドが繋がってるだけでアウトプット電源を使用してなくても1mAの電力を消費していたのだ!
それは知らなかったよ。
じゃ、スイッチをレギュレータの前にしないとダメじゃん。
ん?それダメじゃん!
だって、レギュレータの前に置いたら何番スイッチ押したのか判らないじゃんか!
って事は・・・・2回路2接点のスイッチにして「インプット電源用+アウトプット電源用」の2つを同時に接続するしかあるまい。
って事で送信機2代目をつくり始める。(正確にはシリアル送信機もあるから3代目か?)
検索するも2回路2接点のDIP用プッシュスイッチ、しかもモーメンタリーはなかなか存在しない。
ようやく見つけたのが日本開閉器のこれ。
さすが!
で、回路はこうなる。
最初からこうすりゃ良かっただんよなぁ・・・。
基板が動くのをイライラしながら半田してたもの。
実はこの前に初めて現像に失敗している。
650Wの超強力ヒーターを作っちゃたもんだから、嬉しくってついつい現像液温を上げすぎてしまった。おそらく40℃くらいになっていたのであろう。
浸した瞬間にマスクした部分までもが1秒で剥がれ落ちて、2秒後には只の銅板と化していた。
びっくりした・・・・。
改めて温度の重要さを思い知ったのだった。
だから今回は常温(6月で約20℃)で行った。
すると3秒前後で溶け始め、完全に皮膜が落ちたのが15秒前後でちょうど良い感覚。
ところでこの塩化第二鉄溶液よいかもしんない!
温度43〜45℃前後にキープして、約15分で綺麗に落ちた。
サンハヤトの1/2〜1/3の時間だ。
使えるかもしんない!
(引き続き検証中)
今回は同じパターンを0.8mmと1mmで焼いてみた。
1mmは何か頼もしい感じだな。
これからは差支えが無い部分は1mmにしよう。
よく見ると0.1mmで描いた外枠線は切れ々になっているぞ。
ところで以前に買ったLEDのプチライトが大活躍。
この刃の先の照らしている部分がとっても見やすく、正確にど真ん中に穴を空けられる。
完成!
今度のボタンはちょっと高さが足りない・・・・・。
まぁ・・・いっか・・・・。
こんな感じで、赤ボタン、白ボタン、赤白ボタンの3種類が完成した。
ボタンの位置が低くて蓋が閉められん。
そこで棒を延長する事にした。
直径は2mm。
そんな棒を探していたらいいもん見っけ!
まさか1/72のサイドワインダーが使えるとは思わなかったよ!
ボンドで接着して。
良いね。
結局の処、フーリエ変換だのスペクトラム解析だのはエンコーダとデコーダがやってくれていた・・・・っつー事だ。
まぁ、でも折角参考書買ったんだから、次回は2.4G帯に挑戦でもしてみるか!
さぁ、戻るべぇ・・・・。
|