タッチアンドゴーのタイムレコーダーを作る--赤外線通信の自作

2004年8月30日


使いやすさが持続の決め手

起きた時刻や寝た時刻、でかけた時刻や帰った時刻などは、よほど物覚えがよくない限り、しばらくすれば忘れます。

自分がいつ、どこで何をしたかを正確に記録するには、メモなどを持ち歩く必要があります。でも、いつもメモをとり続けるのは疲れます。

そこで、タイムレコーダーの出番です。タイムレコーダーを使えば、自分がいつその場所にいたかを記録できます。

社員を管理するためのレコーダーというよりは、自分の暮らしを自分で管理するためのレコーダーがあると、便利そうです。

そんなレコーダーとして、私は1年前に8ピンのICを「カード」のかわりにしたレコーダーを作っています。

このレコーダーは、機能的にはそれなりにうまく動いてくれたのですが、8ピンのICを持ち歩いて、レコーダーのソケットに「ペタ」とつけるのが、たいへん面倒だったので、実は実用にはなりませんでした。

そこで、今回は使いやすさを考えて、もう一度タイムレコーダーにチャレンジしました。

赤外線リモコンを参考に、赤外線通信を行うことで、少し離れた状態でも、正しくデータを記録できるようにしました。もう、8ピンの端子をソケットに押し込む苦労はありません。

作った装置の概要

全体の概要

据置用赤外線信号発信装置

装置が持つ固有のIDを、赤外線信号として送ります。IDは15bitからなるので、32768種類まで作れます。赤外線の信号フォーマットは、赤外線リモコンを参考に自分で考えました。

携帯用タイムレコーダー

持ち歩けるタイムレコーダーです。赤外線の信号を受け取り、外付け256kbitsのEEPROMに記録していきます。経過時間と、受け取った信号のIDを蓄積していきます。

レコーダーに蓄積されたデータをパソコンに転送する装置

タイムレコーダーに記録したデータを、パソコンに送るための装置です。EIA-574インターフェース(いわゆるRS-232C)のコネクタと、タイムレコーダーに接続するためのコネクタがあります。タイムレコーダーとパソコンの間に挟む形で使います。

使い方

赤外線発信装置にかざして記録

普段は、タイムレコーダー本体を持ち歩き、赤外線発信装置にかざして、記録を行います。

赤外線発信装置を、会社や学校など、自分が行く場所にあらかじめ置いておきましょう。

毎日、タイムレコーダーを持ち歩きます。会社や学校に到着した時や、これから帰宅する時などに、タイムレコーダーを赤外線発信装置にかざして、時刻を記録しましょう。

このようにして、毎日時刻を記録していきましょう。記録は、タイムレコーダー本体のメモリに蓄えられます。メモリには、1か月ぶんくらいであれば、十分な容量があります。

ふつうは、タイムレコーダーの本体を据え置きで使いますが、この作品では、レコーダー本体を持ち歩きます。会社や学校が、人間を管理するのではなく、人間のほうが、自分の生活を自分で管理するのに役に立つ機械にしたかったからです。

赤外線発信装置を、複数個置くのもよいでしょう。家の玄関などにも赤外線発信装置を置けば、自分が家を出る時刻や、家に帰る時刻も記録できます。

ときどきパソコンにデータを転送

タイムレコーダーに記録した情報は、シリアルポートを持った伝送装置をつなげば、パソコンに転送できます。



タイムレコーダーと伝送装置とをコネクタで接続し、さらに、伝送装置とパソコンをシリアルケーブルで接続します。

伝送装置の青いボタンを2秒ほど押し続けると、タイムレコーダーのEEPROMにアクセスが行われ、情報がパソコンへと転送されます。

送信済みの情報を、今後は送らないようにするため、タイムレコーダー本体に信号を記録できます。パソコンへの転送が終わった状態で、伝送装置の黄色いボタンを2秒ほど押し続けると、伝送終了信号がタイムレコーダー本体に記録されます。

パソコンに送られるデータは、テキスト形式になっているので、あれこれ加工して利用できると思われます。

赤外線発信装置からタイムレコーダー本体までの通信

赤外線を出して、受けることで、IDを伝えるためには、通信のルールが必要です。

赤外線リモコンに仕組みが似ているので、実際のリモコンで使われている「NECプロトコル」などを参考に、低速動作させるPICマイコンでも受信可能なフォーマットを、考えてみました。


発信部(左上が赤外線LED)


受光部(右下がフォトトランジスタ)

要件を洗い出す

光でデータを送る場合に考える必要があることは、例えば次のことです。

また、発信機を安く作りたかったので、発信機が出す信号のタイミングには、いくらかのずれがあっても差し支えないようにしたいです。

さらに、受信側は消費電力を減らしたい都合で、1秒間に8192回しか命令を実行しない設定でマイコンを使うので、解釈が簡単な信号がいいです。

そんなふうに考え、既存のプロトコルからいろいろと検討をしてみました。

1ビットを表現する方法

そこで、私は、1つのビットを表すことについて、こんなことを決めました。

絵にかくと、こんな感じです。

15ビットのIDを伝える方法

送信側のIDは15ビットあります。「00000」から「32767」までの32768種類を作ることが可能です。

通信をすると、ときには相手に間違って伝わることもあります。

送り手の側で、余分な情報を加えて送り、受け手の側が、受け取った情報が正しいかを確かめられるようにします。

そんなことを考えながら、私は15ビットのコードをこのように送ることにしました。

  1. まず、トリガ「T」を送る。
  2. 次に、15ビットあるIDに含まれる「1」の個数が偶数の場合は「1」、奇数の場合は「0」を出力する。こういうのを、奇パリティという。
  3. それから、ID本体を15ビット続けて送る。
  4. 奇パリティとして送った値を反転させた値を、1ビット送る。
  5. ID本体のビットを全て反転させて、15ビット続けて送る。

送ったビット数は、最初のトリガを除けば、32ビットです。

イラストに書くと、こんな感じになります。ただし、「T」はトリガ、「P」は奇パリティです。文字の上に横線を引いたのは、ビットを反転させることを意味します。

「メーカーの番号」に相当する機能は省略

こんなわけで、NECのフォーマットとも、標準電波のフォーマットとも、似て非なるフォーマットになりました。

ちなみに、本来リモコンには、他の機器を誤動作させないようにするため、機器ごと、あるいはメーカーごとに固有の番号がつけられています。何か指令を送信するときは、必ずその番号を添えて送ることになっています。

受信側では、その番号を受け取ったときにだけ、リモコンからの命令を受け付けることになっています。

今回は、赤外線を出すLEDと赤外線を受けるフォトトランジスタが、ともに狭い角度にしか影響を与えないので、他の機器に信号が届いておかしくなることは、考慮していません。

なので、このフォーマットを使って、別の機器を自作する場合は、誤動作しないように気をつける必要が出てきそうです。

また、搬送波を使わないフォーマットなので、家電などの機器に受信される可能性は、それほど高くはないと思われます。

EEPROMに格納するデータの形式

タイムレコーダーには、赤外線発信装置から受け取ったIDや、経過時間などの情報が蓄積されていきます。

情報を記録するのは、タイムレコーダー本体の256Kbitsメモリーです。電源を切っても情報が消えない、EEPROM(不揮発性メモリー)を使っています。

メモリへの記録は全て、16ビット単位で行います。256Kbitsのメモリーには、16384件まで記録できます。

何かできごとがあるたびに、16ビットずつ情報を記録していきます。記録すべきできごとには、今のところ次のものがあります。

また、情報そのものではありませんが、データの始まりと終点を見分けるための区切りも記録する必要があります。

個々の情報に割り当てる値は、具体的にはこうなっています。

内容
赤外線発信装置から受けたID0000hから7fffhまでの範囲で、32768通りが可能。IDの長さは15ビットである。
経過した時間fe00hからfeffhまでの範囲。4秒ごとに1ずつ大きくなる。0秒でfe00h、1020秒でfeffhとなる。
タイムレコーダーの起動ffefh。電池を取り替えるなどして、タイムレコーダーを起動すると、ffefhが書き込まれる。
シリアルポートへのデータ転送完了fff0h。シリアルポートにデータを送信し終えた後に、伝送装置のボタン操作により、転送完了コードであるfff0hを記録できる。タイムレコーダー本体からではなく、伝送装置により書き込まれる。
データ列の終端ffffh。記録されているデータの終点にあたる位置には、終端コードであるffffhを書き込む。

これらの値を、できごとがあるたびに、次々とメモリの末尾に書き足していきます。

経過した時間が記録されるのは、次の場合です。ただし、4秒未満(値が00となる場合)は、記録しません。

メモリの最後の番地まで書いたら、先頭に戻って書き進めます。したがって、古いデータを上書きしながら、メモリ番地全体を書き進めていくことになります。

メモリにデータを書き込むときは、データの終端であるffffhが確実に記録されることが大切です。なぜなら、ffffhの位置が、最新の記録がどこであるかを示すからです。

データの追記は、次の順序で処理します。

こうすることで、書き込み中に電源が切れても、ffffhが全てなくなる状態を、避けられます。

シリアルポートに情報を送り込む仕組み

タイムレコーダーに記録された情報を、人間が活用できるようにするには、データをパソコンなどに転送する必要があります。

パソコンにデータを送るには、図のように、タイムレコーダーから転送装置までの通信と、転送装置からパソコンまでの通信の2つを、うまく行う必要があります。

タイムレコーダーから転送装置までの通信

タイムレコーダーは、普段は赤外線の受信を行い、発信装置との出会いを待っています。

この状態では、タイムレコーダー自身が256kbitsメモリにアクセスする可能性があるので、いきなり伝送装置からアクセスをかけると、アクセスが衝突して誤動作する可能性があります。

そこで、伝送装置自身がまず、「アクセスしていいですか?」とタイムレコーダーに問いかけ、「いいですよ」とタイムレコーダーが応答した場合に限って、アクセスを始めるようにしています。

アクセスの要求を受けたタイムレコーダー本体ではまず、現在までに経過した時間をメモリに記録します。次に、メモリを電気的に切り放します。続いて、アクセスを許可する信号を伝送装置に送ります。

伝送装置では、最新の情報がどこに記録されているかを調べたのち、データをシリアルポートを通じてパソコンに送ります。

伝送装置は、アクセスの許可を得た後は、タイムレコーダー本体の256kbitsメモリーに直接アクセスします。タイムレコーダー本体のクロック周波数は32kHzで遅いため、メモリのアクセスもたいへん低速ですが、クロック周波数が4MHzある伝送装置がメモリに直接アクセスすることで、高速な検索と伝送を可能としています。

パソコンに送られるデータのフォーマット

伝送装置がパソコンに対して行う通信は、「38400bps, データは8ビット, スタートビット1ビット, ストップビット1ビット, パリティなし, ハードウエアフロー制御あり」となっています。Windowsでしたら、「ハイパーターミナル」などで使える方式です。フリーソフトウエアの「Tera Term」なども便利かと思います。

通信は全て、伝送装置からパソコンへ向かい、一方通行で行われます。

パソコンに届くデータは、次のフォーマットになっています。

具体的なファイルの事例を、次のリンク先に示します。

改行コードが0ahだけなので、Windowsのパソコンで見ると、行が変わっても左端に戻らないので、少し不思議な感じに見えるかもしれません。UNIX系のシステムであれば、きちんと改行して見えるかと思います。

伝送装置では、パソコンから送られるRTS信号に従い、フロー制御を行います。RTS端子が送信を許可しているときにだけ、データを送ります。最後の改行コードまでを全て送り届けると、伝送装置の青色LEDが点灯し、通信の完了を知らせます。

それぞれの装置の詳細

この作品は、赤外線発信装置、タイムレコーダー本体、パソコンへの伝送装置の3台からなっています。

それぞれの装置の、回路図やプログラムは、以下のリンクからご覧ください。


赤外線発信装置


タイムレコーダー本体


伝送装置

やってみましょう

  1. 起きた時刻や寝た時刻など、ご自分の生活の様子を、何らかの方法で記録してみましょう。最近では、Webに日記を書く「BLOG」を楽しんでいる方も多いようです。
  2. サービス残業などで苦しまれている方は、きちんと勤務実態を記録した上で、関係する官庁などに申し出てみましょう。

ちなみに、電子工作は一般的に、けがをしたり、やけどをしたりする可能性のある遊びです。また、作ったものをパソコンにつないだらパソコンが壊れたなど、いろいろな事故が起こる可能性もあります。電子工作をするときは、このような危険性をよく考えた上で、ご自分の責任においてお楽しみください。



杉原俊雄のホームページ -> PICマイコンを楽しむ -> タッチアンドゴーのタイムレコーダーを作る--赤外線通信の自作
製作・著作:杉原俊雄(すぎはら としお)
(c)2004 Sugihara Toshio. All rights reserved.