« 豚みそ丼 | トップページ | キジバトの巣 »

2010年4月13日 (火)

PICとArduinoのコラボレーション

グルグル回る、とある物の外周の一部の温度を測ろうということになりまして、さて困った。

温度はK熱電対+熱電対専用IC+A/D付きのPIC(16F88)で、シリアル通信(文字列)にまでは直ぐ出来るのですが、何しろブツは回っているのでコードを引き回すわけには行きません。そこで考えたのが、秋月辺りで売ってるリモコン用赤外受信IC。PICは006Pで駆動して、赤外LEDを使って赤外光を飛ばし、対になるリモコン用赤外受信ICで受信し、ICの出力波形をまたまた別のPIC(16F88)で拾って、1電文毎にPCに9600bpsでシリアル転送、ということになりました。

比較用にIR温度計も設置する予定なので、こちらはArduino(Duemillanove)のA/Dに突っ込んで、これまた9600bpsでPCにシリアル転送と。ArduinoはUSB接続なのですが、FTDIのUSBシリアル変換ICかなんか使っているようなので、シリアルポートで通信が可能なのです。便利だなぁ。

P1030068

出来た基板はこんな感じ。白い紙の右上が測温・送信基板、真ん中が受信基板、左がArduinoです。Arduinoには未だIR測温センサ(Keyence製)は付いていませんが、ソレだけで10万円以上したりして。個人じゃ出来ない遊びですね(^^;。

さて、今回の「山場」は、秋月のこのデバイス。

 http://akizukidenshi.com/catalog/g/gI-01570/

例えばシリアル通信の'H'ビットを送る時は、38kHzのキャリアとANDを取った信号を出さなければならなかったり、1ビットの長さも1666Hz(600us、min500us、max700us)と決まっていて、PCで直接読み込み可能な1200bpsと2400bpsの丁度中間の速度になるため、そのままではPCに読み込めなかったりします。おかげで赤外受信ICの後にまたPICを付けることになってしまいました。それにしても、赤外リモコン受信ICの仕様がこんなになっていたなんて、初めて知りましたよ(^^;。

結局丸1日かかって、キャリアをソフトで出すようにし(Cで書いているので一旦出力された.lstファイルを解析して実時間を割り出してから、ループの回数を調整とかして)、更に読み込み用のPICを増設し、何とか通信できるようになりました。

その中で1つ分かったのは、PIC用CコンパイラであるCCS-Cの、delay_us(d) 関数が結構精度が出ているということでした。まぁ、SH-3なんかよりは確実に実時間が算出しやすいCPUですね>PIC(実は2月にSH-3でソフトウエアディレイをやって痛い目に会った(^^;)。

というわけで、PC側はこんな感じで作りました。

Ws000000

収集したデータは1秒間隔でcsvファイルに書き込まれるようにしました。んで、終わったらExcelで解析と。

さ~、この後はいよいよ「いつもより余計に回っています」な実験だぞ(^O^。

終始 (T-T のまま終わったりして…

いや実際、回すことによって電磁誘導とかの影響を受けるんじゃないかと…(^^;

以下関連関数をメモ用に置きます。

//------------------------------//
// Send Response  //
//------------------------------//

void Send()
{
char *p;

p = SendBuffer;
while (*p != 0) {
  IRputc(*p++);
}
}

//------------------------------//
// IR putc   //
//------------------------------//

void IRputc(char c)
{
IRouth();  // Start Bit

if (c & 0x80) {  // ループにしない方が精度が出る
  IRouth();
}
else {
  IRoutl();
}
if (c & 0x40) {
  IRouth();
}
else {
  IRoutl();
}
if (c & 0x20) {
  IRouth();
}
else {
  IRoutl();
}
if (c & 0x10) {
  IRouth();
}
else {
  IRoutl();
}
if (c & 0x08) {
  IRouth();
}
else {
  IRoutl();
}
if (c & 0x04) {
  IRouth();
}
else {
  IRoutl();
}
if (c & 0x02) {
  IRouth();
}
else {
  IRoutl();
}
if (c & 0x01) {
  IRouth();
}
else {
  IRoutl();
}

IRoutl();  // Stop Bit
}

//------------------------------//
// IR out high  //
//------------------------------//

// PIC 周波数   8000000 Hz
// Toc    0.125 us
// 4Toc    0.500 us
// 赤外通信キャリア周波数  38000 Hz
// 赤外通信キャリア周期  26.32  us
// 希望する通信速度  1666 bps
// 1ビット当りの時間  600.24 us
// 1周期内のビットセット遅延 0.5 us
// 1周期内のビットリセット遅延 0.5 us
// 1周期内のdelay_us遅延  20 us
// 1周期の合計   21.00 us
// 繰り返し回数   28.58 回
// バイト長   7
// ビット数   10
// 全ビット長   70
// 1電文長   42.02 ms

void IRouth()
{
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10); // .lst解析から、1行が 21us
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10); // ループにしない方が精度が出る
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);

output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);

output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
output_high(PIN_B5); delay_us(10); output_low(PIN_B5); delay_us(10);
}

//------------------------------//
// IR out low  //
//------------------------------//

void IRoutl()
{
output_low(PIN_B5);
delay_us(600);
}

|

« 豚みそ丼 | トップページ | キジバトの巣 »

コメント

200 rpm でく~る、くるくる→OK!
2000rpm でギューン、ギュン→OK!

結構耐えてくれるものですね>手作り基板。
因みに基板製作はいつもの戸○さんでした。

投稿: Pawpaw | 2010年4月14日 (水) 17時27分

最近、基板とパソコンの通信用に
赤外線トランシーバーIC CS8130CSEP(115kbps)

激安 HP IrDA 赤外線モジュール HSDL-1000
をヤフオクで買いました。

本来CS8130は外部にIRLEDとBPV23NFというPINフォトダイオードを使うんですが、
これが見つからないので
HSDL-1000で代用しようとよく見ると、方や
LEDドライバとライトアンプがあり、
こなたPINダイオードアンプ、
LEDドライバがありました。

信号が違うのでどうしたものかと・・
思案しました。
CS8130、PINダイオード入力は
カソードプラス、アノードマイナスで
どちらかにアクティブ負荷が入り
どちらかは電源かグランドのはずなので、
調べてライトアンプ出力を入れ、

の出力でHSDL-1000のドライバ入力を
抵抗(300Ω)で制限して、やってみようかと思っています。

スタートが遅いので、直ぐに進みません。
(CS8130)はシリアル信号で初期設定が必要です。

投稿: ノンノ | 2010年9月17日 (金) 22時20分

ノンノさんいらっしゃいませ。

赤外通信を始めてみると、デバイス毎に独特な方法だったりして、結構大変ですね。ノンノさんお使いの CS8130CSEP というデバイスは使ったことありませんが、これもお作法がありそうですね。

私の場合、記事の後、秋月電子で売っている以下のデバイスで、高速化を狙った置き換えを計画中です。

 http://akizukidenshi.com/catalog/g/gM-00382/

LED ON で 1.5μs のパルスが出るのですが、そのままでは使いづらいので、1ショット回路を入れて、シリアル通信の1ビット分遅延しています。とりあえず 9600bps まで上げてOKとなったのが一昨日。タイムリーなレスでした(^^)/。

投稿: Pawpaw | 2010年9月18日 (土) 06時49分

HSDL-1000は5個400円+送料定形外送料\140
だったんです。
普通のノートなどでも使われている、
スタンダード的なトランシーバ光部品で
「Infrared Data Association」の
フィジカルレーヤーと言うことになっています。
(これが38kHまたは500kHzに対応するのか?)
http://www.irda.org/
USBなら解説があるのに、此処は内容が得られません。
http://monoist.atmarkit.co.jp/fembedded/articles/infrared/01/infrared01a.html
此処にはチョコット書いてありました。
IrPHY 1.0(IrSIR)方式
IrPHY 1.1(IrMIR/IrFIR)方式
IrPHY 1.2 省電力方式
IrPHY 1.3(IrVFIR方式)
IrUFIR方式
GigaIR方式
んーんもうややこしい、

投稿: ノンノ | 2010年9月18日 (土) 13時41分

投稿: ノンノ | 2010年9月18日 (土) 14時17分

ノンノさんへ

データシート情報ありがとうございます!

CS8130 は私の仕事でも使えそうな気がします。おっしゃるとおり初期化がめんどくさそうですが、特に不明な点は無さそうです。起動後、D/C ピンをLにし、9600bpps で通信速度以外の設定を行い、設定の最後で希望の通信速度の設定を行い、D/C ピンをHにする、でしょうか?

記事にある回路は電池駆動でしたが、次回作成する回路は「自家発電(^^;」の予定ですので、CS8130 の導入も検討してみます。

ではまた!

投稿: Pawpaw | 2010年9月18日 (土) 17時55分

コメントを書く



(ウェブ上には掲載しません)




« 豚みそ丼 | トップページ | キジバトの巣 »