SSブログ

人感センサー/赤外線センサモジュール [ハード]

焦電センサーともいうし、モーションセンサーとも。
原理は、人が出す赤外線をセンサーで感知するもの。
といっても赤外線はそこら中にあるので、
正確には、赤外線の変化を捉えるもの。
このため、人がいてもジッとしてると反応しない。
A_0091.JPG
このモジュールは、完成品で、
電気を供給すれば、人を感知すると出力に3.3Vの電気が出てくる。
リレーなんかを繋げば、電気を付けたりもできる。
白いドーム状のものは、ただのカバーではなく、レンズになってて、
これで集光しているので、外すと反応が悪くなる。
A_0096.JPG
仕様は、下記の通り。
1.電源は、DC4.5Vから20V、内部動作も出力も3.3V。
2.センサー感度は、3~7m、調節できる。
3.検知範囲120度
4.一定時間の出力を保持する遅延時間0.5秒~200秒、調節できる。
5.トリガーモードの切り替えができる。
6.CdSセルを取り付けられる。

5.は、動作モードの切り替えで、ジャンパで切り替える。
デフォルトはリピートになっていて、動きを検知して出力がでて、
継続して遅延出力中に再度動きを検知すると、
さらに出力が出続け遅延時間が延長される。
たとえば、トイレや倉庫の照明で、人が来ると明かりが点いて、
そこに人がいる(動いてる)限り明かりが点き続け、
いなくなってしばらくする(遅延時間)と明かりが消える。
こんな感じの使われ方が、普通だろう。
ノンリピートは、動きを検知して出力がでて、
遅延出力中に再度動きを検知しても無視。
遅延時間が過ぎると一旦明かりが消える。
再度動きを検知するまで明かりは点かない。
防犯用とかは、この方がいいのかね。
【追記】回路図上のデフォルトは、リピートだが、
いろいろ調べてみると実機はノンリピートになってるっぽい。

6.は、CdSセル(光電スイッチ)を取り付ければ、
センサは、暗いときにしか反応しなくなる。
外灯や廊下の明かりとかの用途にはこの方がイイね。
HC-SR501 240円

【追記】気になる穴がもう一つ。遅延時間調整の半固定抵抗のそばにある。
いろいろ調べてみると、ここにはサーミスタを付けるらしい。
温度補正用で、高温になってセンサの感度が落ちるのを防ぐようだ。
あくまでも「らしい」で詳細は不明。回路図にもないしね。

【注意】同じHC-SR501で、写真の青い基板のもののほかに、緑の基板のものがあるが、
緑の基板のものは、モード切替のためのジャンパピンが省略されていて、半田付けしないとモードが切り替えられない。値段はちょっと安いようだけど。
【追記】緑の基板のものでもジャンパピンが付いているものがあるようだ。買うときは写真で確認したほうがいい。

超音波距離センサ [ハード]

超音波を発して、帰ってきた音を感知して、その時間が計測できるセンサー。
HC-SR04_2.JPG
裏側はこんな感じ。
HC-SR04_3.JPG
このHC-SR04の仕様。

電源電圧:5V
電流:15mA、待機で2mA以下
センサ角度:30度
検出距離:2cm-4m

VCCとGNDに5Vの電圧をかけて、
Trigを一度LOWにして、10マイクロ秒以上Highにしてから、LOWにすると、
40kHzの超音波を8回出す。
この後EchoがHighになり、出した音波が帰ってくるとLOWになる。
つまり、このEchoがHighになっている時間を計測すると、
音が出て、対象物に反射して帰ってきた時間がわかる。

この時間から距離を計算するのは、音の速度を340m/sとして、

距離=時間/2×340

音の速度は、気温によって変わるので、正確に計算したければ、気温を測って、

音の速度=331.5+0.6×温度
HC-SR04_1.JPG
VCC←5V
Trig←8
Echo←9
GND←GND

と4本つなげば使えるようになる。
**********************************************************************
int Trig = 8;
int Echo = 9;
int Duration;
float Distance;

void setup() {
Serial.begin(9600);
Serial.println("START");
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
}

void loop() {
digitalWrite(Trig,LOW);
delayMicroseconds(1);
digitalWrite(Trig,HIGH);
delayMicroseconds(1);
digitalWrite(Trig,LOW);

Duration = pulseIn(Echo,HIGH);
if (Duration>0) {
Distance = Duration*0.017; // Duration/2*340*100/1000000;
Serial.print(Duration);
Serial.print(" us ");
Serial.print(Distance);
Serial.println(" cm");
}else{
Serial.println("Error");
pinMode(Echo,OUTPUT);
digitalWrite(Echo,LOW);
pinMode(Echo,INPUT);
}
delay(500);
}
**********************************************************************
超音波なので、距離を測る対象物は、ある程度の硬さが必要で、
服やカーテンなど柔らかいものだと音が反射せずに計測できなくなくなる。

Matrix LED 8×8ドットもMAX7219で動かす [ハード]

MT_01.JPG
7セグメントLEDで使ったMAX7219というICは、Matrix LEDでも使える。
考えてみれば、LEDの配置が違うだけで、同じもの。
写真の配置だとアドレスの0が一番左の列になり、右端が7.
そしてそれぞれビットに対応して1番上が1ビット目で一番下が8ビット目になる。

Arduino用のライブラリは、いろいろあるけど、
このモジュールでは、↓の2ページ目にある「LedControlMS.zip」が使いやすそう。
http://www.instructables.com/id/LED-Matrix-with-Arduino/

例によって、ダウンロードしたら、解凍してフォルダーをArduino IDEのlaibrarysに入れれば使えるようになる。
配線は、
VCC→5V
GND→GND
DIN→12
CS→10
CLK→11

サンプルでは、「MakeSpace_LEDMatrix」を使ってみたけど、
「LCDemoMatrix」でもいい。
まだ、使ってないけど「LCDemo7Segment」は、7セグメントLED用。
「LCDemoCascadedDevices」は、カスケード接続用。
カスケード接続とは、LEDを数珠つなぎにして使うもので、
写真のLEDの上に出ているPINに他のMatrixLEDを繋いで、使える。
昔の電光掲示板のように表示できる。
1つでも、文字を流したりもできるけど、
複数が連なってると見やすいし迫力もある。
タグ:Matrix LED

MAX7219が超便利!7セグメントLEDが楽々 [ハード]

img_0.jpg
昔からある「7セグメントLED」。
家庭じゃあまり見ないけれども、
電子工作なんかでは、いまだに現役。
表示できるのは、ほぼ数字だけだけど、
安いし扱いが簡単なのと離れてても見えるのが、
いまだに使われている理由だろうか。

1ケタは、8つのLEDで構成されてて、それぞれをON/OFFして、文字を表示する。
つまり1ケタで8つのIOが必要なわけだけど、
普通何かを表示するには、4桁くらいはほしいわけで、
こうなると、8×4=32本のIOピンが必要。
で、そんなことはできないわけで、ダイナミックドライブといわれるテクニックで、
1ケタずつ切り替えて表示するので、8+4=12本のIOピンで済ませている。
テレビで工場とかの機械を映してるときに、表示がチラチラしてるのはこのせい。

これをたった3本のIOピンで、8桁も表示してしまうのが、MAX7219というIC。

http://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf
↑データシート。
しかもこのICは、文字パターンも持っているので、パターンを入れる必要もない。

IOピンは、LOAD,DIN、CLKの3つだが、
使い方は簡単で、LOADピンをLOWにして、アドレス+データをDINとCLKでシリアルで書き込み、
LOADピンをHIGHに戻すだけ。

#define P_LOAD 10
#define P_DIN 11
#define P_CLK 13

void setup() {
pinMode(P_LOAD,OUTPUT);
pinMode(P_DIN, OUTPUT);
pinMode(P_CLK, OUTPUT);
digitalWrite(P_LOAD,HIGH);
digitalWrite(P_DIN, LOW );
digitalWrite(P_CLK, LOW );

delay(1);

max_out( 0x0F, 0x00 );
max_out( 0x09, 0xFF );
max_out( 0x0A, 0x08 );
max_out( 0x0B, 0x07 );
max_out( 0x0C, 0x01 );
}

void loop()
{
char i;
for (i=1; i <= 8; i++){
max_out(i, 9-i);
}
delay(2000);
}
void max_out( byte high_byte, byte low_byte )
{
digitalWrite( P_LOAD, LOW );
shiftOut( P_DIN, P_CLK, MSBFIRST, high_byte );
shiftOut( P_DIN, P_CLK, MSBFIRST, low_byte );
digitalWrite( P_LOAD, HIGH );
delayMicroseconds(1);
}

こんな感じで書くと↓こうなる。
img_1.jpg
max_out(アドレス,データ)で書き込める。
アドレスは、右端が1で順に増えてって左端が8になる。
9からは設定になっていて、
9は、FFにするとデコードになり、データに1を書くだけで1が表示される。
   0を設定するとデコードされず、ビットで表示される。
10は、輝度で0が暗くて、15が明るい。
11は、何ケタ表示するかで、0-7の値で1-8桁になる。
12は、表示のON/OFFができ、0でOFF、1でON。
13,14はなく、15がテストモードで、0がノーマル、1でテスト。

データの表示だが、アドレス9でデコードにしてると
0から9までは、0から9が表示され、10からは、-,E,H,L,Pになる。

アドレス9で非デコードにしてると、ビット表示になる。
img_2.png

温湿度センサー買ってみました [ハード]

早速、どんなもんかテスト。
今までみたいにアナログで計測ではなく、
デジタルでデータが出てくるというので、
PICを使う必要もないので、RaspberryPiで実験。
回路は、簡単。パスコンもあるといいんだろうけど、パス。
プルアップだけ入れといた。

ノーブランド品 温湿度センサーモジュール DHT11 [並行輸入品]

ノーブランド品 温湿度センサーモジュール DHT11 [並行輸入品]

  • 出版社/メーカー: Phishine
  • メディア: おもちゃ&ホビー


こっちの方が安いけど、これだとプルアップされてるのかな?

EasyWordMall DHT11温湿度センサーモジュール Arduino用

EasyWordMall DHT11温湿度センサーモジュール Arduino用

  • 出版社/メーカー: Apple Trees E-commerce co., LT
  • メディア: その他



プログラムの方は、
「DHT11 raspberrypi」で、検索すれば何人か先人がいらっしゃる。
みなさん、「Raspberry Pi Blog」に書かれてるものをモディっているようです。
ちょっと気になるとこもあるけど、動いてるからいいかってわけで、
そのまま、コピらせていただいて、

2014/09/10 20:23:23 ,Humidity = 55.0 % Temperature = 28.0 *C

という結果に。
そこそこ合ってるような感じだけど、何回やってもおんなじような結果で、
温度がちょっと高め。それに、湿度の振れが今一つ。50%台しか見たことない。
本当かな。
まーでも、温度変化とかを記録するのにいいかな。
Raspberry Piだから、結果ファイルに入れるのも簡単だし。
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
#define MAX_TIME 85
#define DHT11PIN 4
int dht11_val[5]={0,0,0,0,0};
int res;

int dht11_read_val()
{
  uint8_t lststate=HIGH;
  uint8_t counter=0;
  uint8_t j=0,i;
  float farenheit;
  for(i=0;i<5;i++)
     dht11_val[i]=0;
  pinMode(DHT11PIN,OUTPUT);
  digitalWrite(DHT11PIN,LOW);
  delay(18);
  digitalWrite(DHT11PIN,HIGH);
  delayMicroseconds(40);
  pinMode(DHT11PIN,INPUT);
  for(i=0;i<MAX_TIME;i++)
  {
    counter=0;
    while(digitalRead(DHT11PIN)==lststate){
      counter++;
      delayMicroseconds(1);
      if(counter==255)
        break;
    }
    lststate=digitalRead(DHT11PIN);
    if(counter==255)
       break;
    // top 3 transistions are ignored
    if((i>=4)&&(i%2==0)){
      dht11_val[j/8]<<=1;
      if(counter>16)
        dht11_val[j/8]|=1;
      j++;
    }
  }
  // verify cheksum and print the verified data
  if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF)))
  {
    time_t timer;
    struct tm *date;
    char str[256];
    timer = time(NULL);
    date = localtime(&timer);
    strftime(str, 255, \"%Y/%m/%d %H:%M:%S\", date);
    printf(\"%s ,\", str);
    printf(\"Humidity = %d.%d %% Temperature = %d.%d *C\\n\",dht11_val[0],dht11_val[1],dht11_val[2],dht11_val[3]);
    return 2;
  }
}
 
int main(void)
{
// printf(\"Interfacing Temperature and Humidity Sensor (DHT11) With Raspberry Pi\\n\"); 
  if(wiringPiSetupGpio()==-1)
    exit(1);
  while(1)
  {
     res = 1;
     res = dht11_read_val();
     if(res==2) {
      return 0;
      break;
     }
     delay(3000);
  }
  return 1;
}



それにしても、やっぱ、温度が小数点以下が出ないのは面白くない。
同じシリーズのDHT22の方がよさそうだけど、いきなり値段があがるね。

【ノーブランド品】DHT22/AM2302  デジタル温度と湿度センサー  接続線付き

【ノーブランド品】DHT22/AM2302  デジタル温度と湿度センサー  接続線付き

  • 出版社/メーカー: 【ノーブランド品】
  • メディア: エレクトロニクス



作り直すか?!温度リモコン [ハード]

温度のほか、湿度も計れるとは。
シリアルでデジタル表示なのでPICじゃなくても使えそうだし、
アナログと違って、変換が要らないのもいい感じ。

AYWS DHT11 デジタル湿度 温度センサー

AYWS DHT11 デジタル湿度 温度センサー

  • 出版社/メーカー: AYWS
  • メディア: エレクトロニクス



これもあると面白い?3軸ジャイロ/3軸加速度センサー [ハード]

3軸ジャイロ/3軸加速度センサーが付いたMPU-6050 使用。
インターフェースは、I2C。
しかも値段がスイッチサイエンスのものの1/10。
使い方が難しそうだけど、チャレンジしてみる価値ありそう。

KKHMF GY-521 MPU-6050 三軸加速度計 ジャイロスコープ 6DOF モジュール

KKHMF GY-521 MPU-6050 三軸加速度計 ジャイロスコープ 6DOF モジュール

  • 出版社/メーカー: Apple Trees E-commerce co., LT
  • メディア: その他


Arduinoだとlibraryがあるので簡単。
数値は出てくるけど、どうやって使うかがわかりにくいのが問題。
「3軸加速度センサー」は重力加速度の方向を計測するもので、
つまり、重力に対する傾きだね。
真っすぐになっていれば、x、y軸は0、z軸に重力がフルに入るはず。
傾いていれば、zが減って、x、yに数字が入る感じだろうか。
一方の「3軸ジャイロセンサー」は、ジャイロに対する加速度を計測する。
ヨー、ピッチ、ロールといわれるもので、
ヨーは水平の回転、飛行機だと左右に曲がること。
ピッチは前後の動きで、飛行機だと上昇下降だね。
ロールは左右への傾きで、飛行機だと羽を傾ける動き。
加速度なので動いたら値が出るので停まってると0のはず。
普通に姿勢制御だけなら、ジャイロは必要なさそう。

ちなみに、これだと傾きはわかるが、
どっちを向いてるかという平面での方向はわからない。
方向を測るのは、地球の磁場を測定するコンパス。




この3つが一つになった9軸のセンサーもある。MPU-9150




超音波で距離が測れる!それにしても [ハード]

安すぎ!こんなもんなんでしょうか。
ネットで検索すると、そこそこ使えそうな感じなので、
とりあえず1つ買って、おもちゃにしてみようかな。

HC-SR04 超音波距離センサーモジュール For Arduino

HC-SR04 超音波距離センサーモジュール For Arduino

  • 出版社/メーカー: サインスマート(SainSmart)
  • メディア: エレクトロニクス



嵌ってるねー [ハード]

このPIC16F886では、ずいぶんと嵌ってしまった。
もともと。パラレルのLCDを使いたいがためにこのマイコンにしたんだけど、
これほど性能が違うとは思わなかった。

回り道して、完全に元の道に戻ってきた感じだけど、
PIC18F14K50を使うことに。
改めて調べると、このマイコンは、AD変換の基準電圧を内部に持っているらしい。
これで、さんざん苦労した電源問題もクリアなので、電源回路もスッキリできそう。

使い方は、
ADCON1の2-3bit目の正基準電圧指定(PVCFG0:1)に"10"=内部基準電圧(FVR)にして、
REFCON0というリファレンス制御レジスタ0で、
bit 7のFVR1EN: 固定電圧リファレンス1 イネーブルビットを1 = FVRを有効にする、
bit 5-4 FVR1S: 固定電圧リファレンス1 電圧選択ビットを下記のように指定する。
00 = 予約( 使用不可)
01 = 1.024 V (x1)
10 = 2.048 V (x2)
11 = 4.096 V (x4)
で、今回のは、温度センサーの出力がMAX1.6Vだけど
これは100℃を計測したときの電圧。
気温を測るだけなので、
40℃の時に1Vなので、精度を上げるため1.024Vにした。
これで、AD変換結果=センサーの出力電圧になるので、-600して10で割れば温度になる。
超便利。


いよいよ寒くなってきたので、リモコン始動!! [ハード]

やっと、温度センサー付きのリモコンの活躍できる季節が来た!
ということで、
気温が16度で、エアコンがON、18度に上がるとOFFになる設定にした。
ちょっと低いけど、寝てる時だからね。こんなもんでしょう。
スイッチオンにして、お休み。

寒くて目が覚めるということもなく、朝までぐっすり。
起きた時も、寒くも暑くもなく快適。

こりゃいいね。ということで、翌晩も使って快適。

事件は、次の日に起こった。
朝、寒くて目が覚めた。??リモコンは?とみると
OFF状態。電源を入れなおすと一度入るけど、すぐにOFF。
電池切れだ。テスタで電池を測ってみたけど、1Vを切ってる。

マー使いかけだったからと、新しい電池に替えて3日目。
朝起きるとOFF。電池切れ。夜しか使ってないので実質18時間もたない!
なんだこりゃと、リモコンの電流を測ってみると
203mA!食いすぎ。

前にブレッドボードでテストしたときは、そんなに食ってなかったような。
で、はたと思い出した。
PICが違うんだった。

さっそく、PIC18F14K50でブレッドボードに同じ回路を組んで電流を調べると23mA。
1/10だよ。
かなしー。

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

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