温度湿度センサーDHT11を使う

ここでは温度湿度センサーDHT11をRaspberry piで使う手順を説明します.

温度センサーは種類が多く安価なものも見つかるのですが、湿度センサーは手頃な価格のものがなかなか見つからないものです.
そこで今回見つけたのがDHT11 というセンサーです。Google検索で海外のブログで多く見つかるので、メジャーなのかもしれませんね。とりあえず日本で手に入るところとして見つけたのがaitendoでした。
aitendo のDHT11通販ページ
Single wire接続なのでとてもシンプルです。
センサーにはアプリケーションノートどおりにパスコンとプルアップ抵抗を接続します。
スクリーンショット 2013-12-13 18.09.46

CIMG2380
写真のセンサー左端が1ピンです。抵抗は2つ付いていますが、手持ちの10kを二つ使って5kにしてあります。パスコンのセラミックコンデンサーも忘れずに。
Raspberry piには7番ピンであるGPIO4(GPCLK0)とDHT11の信号線を接続します。

制御するプログラムはこちらを参考にしました。
Raspberry Pi Blog

ソースコードを引用します。

#include 
#include 
#include 
#include 
#define MAX_TIME 85
#define DHT11PIN 7
int dht11_val[5]={0,0,0,0,0};

void 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=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)))
  {
    farenheit=dht11_val[2]*9./5.+32;
    printf("Humidity = %d.%d %% Temperature = %d.%d *C (%.1f *F)\n",dht11_val[0],dht11_val[1],dht11_val[2],dht11_val[3],farenheit);
  }
  else
    printf("Invalid Data!!\n");
}

int main(void)
{
  printf("Interfacing Temperature and Humidity Sensor (DHT11) With Raspberry Pi\n");
  if(wiringPiSetup()==-1)
    exit(1);
  while(1)
  {
     dht11_read_val();
     delay(3000);
  }
  return 0;
}

dht11.cというファイル名で保存しておきましょう。つぎにgccでコンパイルします。

gcc -o dht11 -lwiringPi

wiringPiは事前にインストールしていますね。無事コンパイルが出来たら実行します
sudo ./dht11

測定結果がコンソールに出力されていきます.
湿度の測定はなかなか難しいものが有りますので、何かと比較といってもそれぞれの誤差を勘案してみる必要が有るでしょう。温度の測定精度ですが、手元の電子温度計と比較した限りではプラスマイナス1度の範囲に入っているようです.科学的な測定でなければ、ある程度の実用範囲の測定結果だと思います.

I2C接続可能なLCD/ACM1602の使いこなし

Raspberry piにLCDモジュールを接続する場合にその選択肢は案外少ないものです.
まずは3.3Vで動作する事。Raspberry Pi の少ないDIOピンを節約したいのでバスインターフェイスではなくシリアルインターフェイスで接続できるのが望ましい。表示文字数も少ないよりも多い方が良いな。と言う事で選定したのがACM1602.

さっそく秋月電子で購入
CIMG2378

Raspberry piのI2Cを有効にするための諸設定は済んでいるものとして。
I2Cの2線SDAをSCLそしてVccとGNDを接続。

シェルから以下のコマンドを投げてみる。

pi@raspberrypi ~ $ sudo i2cdetect 1

しかし、呼べども答えず。返事を返してくれるデイバイスは誰もいません。

I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n]
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

接続を一通り確認したり、他のI2CデバイスとRaspberry Piとが通信できている事を確認し行き詰まった。
そこでGoogle検索の出番。ひたすら調べた結果次の事が判明。

  • デフォルトの通信速度では通信がつまずくことがある
  • Write専用で一度でもReadを掛けるとモジュールがフリーズする。製品に添付の資料にも明記しているが、Readを掛けた時の状態に付いては記載がない。

一つ目については通信スピードを落とせば同じバスに繋がるデバイスもそのスピードダウンの影響を受けるがまあよしと考えられる範囲ですが、二つ目については一度でもi2cdetectを掛けるとACM1601はフリーズ状態になりその都度モジュールの電源再投入して立ち上げ直す必要になるのです.Raspberry Pi本体のシステムをリスタートする必要はないのですが、やはり使いにくいことには変わりないですね。

一応I2Cの通信スピードを変更する手順について書き留めておきます。

sudo modprobe -r i2c-bcm2708
sudo modprobe i2c-bcm2708 baudrate=50000
sudo i2cdetect 1

この時点ではもちろんACM1602からの返答は有りません。ここでLCD電源を一度オフにしてオン ※1
これ以降はi2cdetectを掛けないでくださいね。するとまたACM1602がフリーズに落ちますので。
無事ACM1602が使えるようになっているはずなので、I2Cを通じて制御コマンドを渡して動作を確認してください。

通信速度をデフォルトのままだとI2Cでコマンドを渡した時にPythonなら「IOError: [Errno 5] Input/output error」が出ます。
上記コードをその都度シェルから入力するのが面倒だ、この設定をデフォルトにしたい場合は、/etc/modprobe.d/i2c.conf というファイル(ファイル名は .conf で終わっていれば何でもよい)を作って以下のように書いておけば良いようだ。

options i2c_bcm2708 baudrate=50000

でもi2cdetectを不用意に投げないようにご注意を

結論。秋月で買えるACM1602(I2Cインタフェイスキャラクターディスプレイ LCD 3.3V)はRaspberry pi との組み合わせでは使いにくい.

それからI2Cを使う場合sudo権限が必要なので、実行するPythonスクリプトなどはsudo権限を使って実行することを忘れずに。

LCDモジュールの取り扱いをもっと簡単に出来ないか、複数のI2Cデバイスをぶら下げた時に安心してi2cdetectを投げられるようにならないか。そういった悩みを解消するのに、i2cインターフェイス基板が便利かもしれませんね。
i2cインターフェイス基板
デジタルIOも拡張でき、アナログ入力にも対応。Raspberry piを使った電子工作を便利にする事だと思います.

無線通信モジュール XBee

XBee シリーズ1とXBeeエクスプローラUSB

XBeeエクスプローラUSBを使うことでPCとXBeeをUSBケーブルで接続。他のXBee機器と無線通信(シリアル通信)を行うことが出来ます。

XBeeはArduino Fioと組み合わせて使うことができます。

XBeeのピンピッチは2mmであり、一般の2.54mmピッチとは異なります。上記製品は2mmピッチのコネクターを持つものです。汎用基板で用いる場合にはピッチ変換基板が必要になります。

ピッチ変換基板の製品例

XBeeで使用する周波数は2.4GHzであり、無線LANの他にもBluetoothやワイヤレス電話にも使われており、相互に干渉し通信の妨げになることも起こり得るので、設置場所等に注意が必要です。

加速度センサ


3軸加速度センサーモジュール MM-2860 (サンハヤト)

加速度を検出し、アナログ出力またはデジタル出力によってその値を得ることが出来る。デジタル出力はI2cまたはSPIによってセンサーモジュールと通信を行う。ArduinoではI2c、SPI通信のためのライブラリーが用意されているため、プログラム(スケッチ)の作成も簡単に行うことができる。

モジュールによって測定できる加速度の大きさが異なるので、測定する事象に合わせてモジュールを選定する必要がある。