温度センサをケーブルで伸ばしてジャケット(ガラス管)に入れる工作です。温度センサは ニキシー管時計を作ったときにコロンのネオン管を収めた 小さいガラスチューブに丁度入りました。少量で購入できなかったのでまだ大量に残っている。
昔、ダイソーで購入したUVレジンで封印します。かなり前に買ったのですがまだ使えました。
温度センサをケーブルで伸ばしてジャケット(ガラス管)に入れる工作です。温度センサは ニキシー管時計を作ったときにコロンのネオン管を収めた 小さいガラスチューブに丁度入りました。少量で購入できなかったのでまだ大量に残っている。
温度ロガーに秋月のマイクロSDカードスロットDIP化キット(写真左上に写ってます)を繋いで、ログを記録できるようにしました。
蛍光灯型懐中電灯の改造 や NFJ謹製エンクロージャキットを製作途中 ですが、赤外線リモコン・レピータ のところで書いた赤外線リモコンブースタを試してみました。
以下のような回路で赤外線リモコンの光を受けて、パワー赤外線LEDを駆動すれば上手くいくかな、と目論んでいたのですがダメでした。ちなみに赤外線リモコンで使われる波長は940nmが一般的のようなので、この波長のパワー赤外線LEDはアリエクで購入しました。
下図は赤外線リモコンの受信用モジュールのデータシートからですが、リモコンの制御コードは38KHzの副搬送波に乗せて送られています。上記の回路ならこの副搬送波も含めてドライブできると思っていたのですが、、、
下の写真は受信した信号波形をみたところです。上はフォトトランジスタのコレクタ、下はFETのドレインで、パワーLEDを駆動する信号です。信号は反転しています。これを見ると、フォトトランジスタの出力信号から38kHzの副搬送波が消えていることが分かります。
改めてフォトトランジスタのデータシートを確認してみたら、なんと立ち上がり立下り時間が15usとなっていました。15us=66.7kHzです。これでは38kHzの副搬送波のスイッチングには間に合いません。
秋月で調べたら立ち上がり2us,立下り3usのフォトトランジスタがありました。3us=333kHzなので間に合うか? それとも正攻法で専用モジュールを使って38kHzを重畳するか? 後者はPICを使えば簡単ですがどうするか悩み中。
エンクロージャ製作や懐中電灯の改造の他に色々野暮用もあって中々時間がとれない。
ラジオライフ誌を発行している三才ブックスから大き目の封筒が届きました。何かな?と思って開けてみると、「電子工作傑作ガイド」というムック本です。3月に発行されたラジオライフ誌に掲載されたLINE防犯カメラの記事 が再録されていたので、見本誌として送って頂けたようです。7/18発売のようで出来立てです。ありがたい。感謝です。
表紙に「6年分+α」とあり、これまでラジオライフ誌に載った記事の総決算です。おまけで秋月の組み立てキットのカタログが付いています。
毎日猛烈に暑くて半田ごてを握る気になりませんが、夏休みに作るネタを探してみます。
//------------------------------------------------------------
// 2020.6.28 naka
// ロータリエンコーダ習作
//
//------------------------------------------------------------
#include <FaBoLCDmini_AQM0802A.h>
FaBoLCDmini_AQM0802A lcd;
#define SDAPIN A4
#define SCLPIN A5
#define RT0 2
#define RT1 3
#define LED_R 4
#define LED_G 5
#define LED_B 6
#define SW 7
int Count;
void setup() {
// i/oピン設定
pinMode(RT0,INPUT_PULLUP);
pinMode(RT1,INPUT_PULLUP);
pinMode(LED_R,OUTPUT);
pinMode(LED_G,OUTPUT);
pinMode(LED_B,OUTPUT);
pinMode(SW,INPUT);
// モニタLCD設定
SetupLCD();
lcd.clear();
lcd.print("Encoder ");
// カウンタ
Count = 0;
}
void loop() {
int dir;
char buff[10];
while(1) {
dir = sample_coder(); // エンコーダの回転方向
if (dir!=0 || Count==0) {
Count += dir;
disp_count(Count);
LED_LightsUp(Count);
}
if (digitalRead(SW)==1) { // ロータリエンコーダの軸スイッチが押されたか?
Count = 0;
disp_count(Count);
LED_LightsUp(Count);
break;
}
}
while(digitalRead(SW)==1);
delay(100);
}
void SetupLCD() {
lcd.begin();
lcd.command(0x38);
lcd.command(0x39);
lcd.command(0x14);
lcd.command(0x73);
lcd.command(0x51); // 5V
// lcd.command(0x56); // 3.3V
delay(2);
lcd.command(0x6c);
delay(300);
lcd.command(0x38);
delay(1);
lcd.command(0x01);
delay(2);
lcd.command(0x0c);
delay(2);
}
void disp_count(int cnt) {
char buff[9];
sprintf(buff,"CNT=%3d",cnt);
lcd.setCursor(0, 1); // Col,Raw
lcd.print(buff);
}
void LED_LightsUp(int val) {
if (val<0) led_rgb(0,0,1); // Blue
else if (val==0) led_rgb(0,0,0); // off
else if (val<10) led_rgb(0,1,0); // green
else if (val<20) led_rgb(1,1,0); // yellow
else if (val<30) led_rgb(1,0,0); // red
else if (val>=30) led_rgb(1,0,1); // purple
}
void led_rgb(int r,int g,int b) {
r = (r ^ -1) & 1; // 論理反転
digitalWrite(LED_R,r);
g = (g ^ -1) & 1;
digitalWrite(LED_G,g);
b = (b ^ -1) & 1;
digitalWrite(LED_B,b);
}
int sample_coder()
{
static int code = 0;
int code_val,code_pin0,code_pin1;
code_val = (PIND >> 2) & 3;
code = ((code << 2) | code_val) & 15; //
switch (code) { // デテンド位置=3
case 0xE:
return(1);
case 0xD:
return(-1);
default:
return(0);
}
}
//------------------------------------------------------------