ラズベリーパイに時計、リアルタイムクロック DS3231 [ハード]
ラズベリーパイには、時計が付いていない。
ネットに繋いでいるときには、ネットから時間をもらって表示している。
なので、スタンドアローンで使うときは時計なしになる。
だけど、気象の変化などを記録しようなどと思うと、時刻が必要になる。
そこで、必要なのが時刻を刻んでもらうリアルタイムクロックモジュール。
使ったのは、DS3231搭載のもの。
DS3231は、秒、分、時間、日、月、曜日、および年をカウント(2100年までうるう年を補正) 、高精度を謳っている。ほかに温度センサーや時刻アラームも付いている。
モジュールのピン配置は、
1. VCC 3.3V
2. SDA
3. SCL
4. NC
5. GND
の順番になっていて、ラズベリパイのGPIOの1,3,5,7,9に対応してるので、
そのまま挿すだけで接続は完了。
使い方も簡単で、というのもラズベリパイには、元々このモジュールを使えるようになっている。
まず、I2Cを使えるようにするため /etc/modprobe.d/raspi-blacklist.confのblacklist i2c-bcm2708の先頭に#で無効にして保存、再起動。
下記のコマンドを実行。
$ sudo su
# modprobe i2c-dev
# i2cdetect -y 1
I2Cのアドレス一覧が表示されます。68が検出される。
# modprobe rtc-ds3232
# echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
RTCを認識させます。上の「rtc-ds3232」 は打ち間違いではありません。
ラズベリーパイでは、ここ型番で認識されるようです。
# hwclock -w
時刻をRTCに書き込みます。
以上です。下記コマンドで確認できます。
# hwclock -r ; date
さて、このままだと電源を入れるたびに上のコマンドを入れなくちゃいけないので、
このまま使い続けるには、
/etc/rc.localの中の最終行の「exit 0」の手前に下記の3行を加える。
echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sleep 1
hwclock -S
「hwclock -s」はRTCをシステム時刻にする。
これで、電源を切っても時刻を使える。
データシート
RTC/リアルタイムクロック DS3231 I2C接続 ラズベリーパイ
電子回路で湿度を測る方法 [ハード]
湿度は、温度に比べると大体の数字がわかればイイ。
50%とか60%とかがわかれば、
47%±1%なんていう数字は、普通の人には必要ない。
1.抵抗が変化する
【HS-15P】【HR202L】
EasyWordMall 5個 HR202L 感湿 抵抗 湿度センサー
- 出版社/メーカー: Apple Trees E-commerce co., LT
- メディア: その他
接点の間に有機ポリマーなどの塗料を塗ったもので、
湿度で抵抗が変化する。
交流駆動が必要で、インピーダンスは指数関数的に変化する。
なので、結構めんどくさい。
2.デジタルで通信
【DHT11】【DTT22】【AM2302】【AM2320】【AM2322】
このシリーズは、温度も湿度も測れるが、
湿度はそれほどしっかり測れないようだ。
使った感じだと真ん中に寄ってるよう。
つまり、変化が乏しい印象。
価格が安いので使ってる人は多いが、1~2年で壊れるといっている人が多数いる。
WINGONEER 温度湿度センサーモジュールの5PCS Arduinoラズベリーパイ2のためのデジタルDHT11
- 出版社/メーカー: WINGONEER
- メディア:
Rasbee DHT22 デジタル温度センサーモジュール AM2302 接続線付き Arduino DIY用 1個 [並行輸入品]
- 出版社/メーカー: Rasbee
- メディア: エレクトロニクス
Rasbee デジタル温度湿度センサーモジュール DHT22 AM2302 1個 [並行輸入品]
- 出版社/メーカー: Rasbee
- メディア: エレクトロニクス
X172-01新しい AM2320 デジタル温度と湿度センサー オリジナル本物置き換える こと が でき sht20 sht10
- 出版社/メーカー: sindyahane
- メディア: おもちゃ&ホビー
送料無料AM2322 デジタル温度と湿度センサー を置き換える こと が でき sht21 、 sht10 、 sht11
- 出版社/メーカー: sindyahane
- メディア: おもちゃ&ホビー
【HTU21D】【SHT11】
温度、湿度が測れるこの2つは、メーカーは違うが、性能は同じよう。
温度範囲:-40~125℃、精度:±0.5℃
湿度範囲:0~100%、精度:±2~3%
かなり正確に測れそうだが、何しろ高い。
SMAKN? HTU21D Temperature & Humidity Sensor Breakout Board Module [並行輸入品]
- 出版社/メーカー: SMAKN
- メディア: エレクトロニクス
WINGONEER SHT21 HTU21 Digital Humidity Temperature Sensor Module Replace SHT11 SHT15 [並行輸入品]
- 出版社/メーカー: WINGONEER
- メディア: エレクトロニクス
【BME280】
温度、湿度のほか、気圧も測れる。
価格も手ごろで、性能も良さそうだが、事例がなく実態は不明。
温度:-40~85℃、 ±1℃
湿度:0~100%、±3%
気圧:300~1100hPa、±1hPa
I2C接続 BME280使用 温度/湿度/気圧センサーモジュール・キット
- 出版社/メーカー: Victory 7
- メディア: エレクトロニクス
3.容量
【HS1101】
容量の変化は164pF~201pFとわずか。
でも割と直線的に変化するので、近似値は求めやすい。
メーカーの回路では、発振器の一部に入れて発振する周波数を測定して
容量を求めている。
トランジスタなどを使った、充放電の時間を測定する方法もある。
使った感じでは性能は高いが、測定する回路の誤差を補正しないといけない
HiLetgo HS1101 湿度センサー コンデンサ式 湿敏コンデンサ 液検知センサー
- 出版社/メーカー: Phishine
- メディア: オフィス用品
電子回路で温度を測る方法 [ハード]
いままで知りえたもので、
価格も含めて一般人が手に入れやすいものをまとめてみました。
1.電圧
ICで温度に比例した電圧を出力するもの。
【LM35DZ】は、0℃の時0V、20℃→200mV
・測定温度範囲:0~100℃
・精度:±1℃
・温度係数:10.0mV/℃
・電源電圧:DC4V~20V
SODIAL(R) 10 x LM35 LM35DZ精密摂氏温度センサ
- 出版社/メーカー: SODIAL(R)
- メディア:
【LM61BIZ】は、マイナスも測れ、
・測定範囲:-25℃~+85℃
この場合、素子自体の精度もあるけど、
AD変換をしなくちゃいけないので、
その精度も影響する。
2.熱電対
温度差で発電する熱電対使ったもの。
【K型熱電対】
温度差で発電する電圧を測るので、
ほんとは反対側を0度にしなくちゃいけないのだけれども、
そんなことはできないので、普通は温度センサを付けた補正回路が必要です。
測定範囲は、-200℃~+1000℃と幅広い。
SODIAL(R)100mm スペードKタイプの温度調節熱電対センサー -100°C -1250°Cプローブ 1M
- 出版社/メーカー: SODIAL(R)
- メディア: その他
3.抵抗
温度によって抵抗が変化するものを使ったもの
【サーミスタ】
抵抗値がR=R0exp(B(1/T-1/T0))の式で表せる。
BはB定数といわれサーミスタの種類で異なる。
物にもよるけど使用温度範囲:-50~+110℃
NTCサーミスタは、温度の上昇につれて抵抗値が減少する。
温度感度が良いのが特徴です。
【測温抵抗体】
いろいろ種類はあるが、
Pt100が有名で、文字通りプラチナでできてる。
uxcell 熱電対 センサー プローブ PT100タイプ 400度摂氏 ばね荷重 20cm
- 出版社/メーカー: uxcell
- メディア: その他
「100」は0℃で100Ωということで、
直線的に抵抗が変化するので、計算が楽。
0-100℃近辺の精度が0.1~0.3℃ほどで精度が高く、
測定範囲は、-200℃~650℃と幅広い。
精度も高いが、値段も高い。
4.デジタル計測で通信
問い合わせると温度を数字で返してくれる。
個体により温度が異なるので、補正が必要。
【DS18B20】
通信方法がユニークだが、本当にケーブル1本で通信ができるため、
広い範囲で、何か所も計測するには最適。
測定温度範囲:-55~+125℃、精度:±0.5℃
Pickit2/Pickit3 書き込み用アダプタ プログラミングアダプタ [ハード]
マイクロチップ社のPICにプログラムを書き込むには、
Pickit2やPickit3などといった書き込みツールを使って書き込む。
Pickit2/3とパソコンはUSBで繋いで、
MAPLIBなどのプログラミングソフトでソフト開発ができる。
一方、マイコンとの接続は、「ICSP」という接続。
Pickitの端子は6つあるが、1つは予備なので、5つの端子を5本の線でそれぞれマイコンの端子につながなければならない。
普通は、回路を作るときにこのICSPのための配線もやっておいて、
ピンヘッダをつけて、そのまま接続できるようにする。
ただここに面倒なことが起きる。
複雑な回路だったりすると、このICSPのための接続が結構邪魔だったりして、線マタギになったりしちゃう。
マイコンはソケットに挿せば、出し入れできるので、
「だったら、最初から書き込み用の回路を作って、書き込んだものを挿せばいいじゃん。」
と思うんだけど、専用にいちいち作るのもなー。
で、汎用のものがないの?って感じだけど、
これがなんとマイコンの種類でピンの位置が違うので汎用化が難しい。
だから、Pickitも端子が出てるだけで配線は、ユーザー任せ。
なんで統一できないんだろうね。謎っちゃ謎。
ICSPには、PGD、PGC、MCLR、Vdd、GNDの5本が必要。
で、ちょっと調べてみる。
(D=PGD、C=PGC、M=MCLR、V=Vdd、G=GND、数字は端子番号)。
PIC10は、6ピンと8ピン、PIC12は8ピンと12ピン
6PIN | 8PIN | 12PIN |
---|---|---|
D1 6M | 1 8M | V1 8G |
G2 5V | V2 7G | 2 7D |
C3 | 3 6 | 3 6C |
C4 8D | M4 |
このPIC12の配列は、14PINや20PINの一部でも使われてて、ピン数が違うので右側の数字は違うけど配列は同じなので使える。
18PIN | 28PIN | 40PIN |
---|---|---|
M4 15 | M1 28D | M1 40D |
G5 14V | 27C | 39C |
6 13D | ||
7 12C | 9 20V | 9 32V |
10 19G | 10 31G |
28ピンと40ピンも場所が同じ。
これを何とかしようというのが、書き込み用アダプタ 。
いくつも同じものを書き込んだりするには便利だよね。
だけど実際、万能ではない、つまり全部のマイコンに対応しているわけではないけど、そこそこ網羅してるかな。
裏に使い方が書いてある。結局4つのパターンに分けたってこと。
一番左は、PIC10FXで、PIC10Fの8PINはOKだけど6PINはダメそう、
2番目は、8/14/18/20ピンのことだけど、PIC12Fの8PIN、PIC16Fの14ピン、20ピンは、同じパターンなので使えるけど18ピンは無理そう。
3番目は、PIC16F57専用。もう一つの異端児PIC16F59は対応なしのようだ。
そして、一番右が28/40ピンでこれは大丈夫そう。
あると便利なPickit書き込み用アダプタ 520円
互換機が安いPickit3 2,380円
I2Cで温度・湿度を測る AM2320 [ハード]
以前DHT11を使う方法を記した。
DHT11は、価格も手ごろなのだが精度が今一つで、特に湿度はそれほど敏感ではない。
精度がほしい場合は、ちょっと値段は張るけれどもDHT22という上位機種がある。
そして、これと同程度の性能で、さらにI2Cも使えるAM2320というモデルがある。
DHT11は小数以下は出てこなかったが、
こっちは、出力データは、湿度16bit(分解能:0.1%RH)、温度16bit(分解能:0.1℃)。
ピン配置は、左から1:Vdd、2:SDA、3:GND、4:SCL
DHT11やDHT22は、1:Vdd、2:SDA、3:NC、4:GND
となっていて、GNDの位置が違うので注意が必要。
I2Cで使うか、DHT11やDHT22と同じシリアル通信で使うかは、
4番ピンのSCLが、電源が入った時に0だとシリアル、+だとI2Cになる。
なので、シリアルで使うときには、SCLはGNDに、
I2Cで使うには、プルアップしておく。
アドレスはxB8。
赤外線リモコン受信モジュール [ハード]
家庭用のリモコンは、940nmの赤外線を38KHzで出力している。
赤外線リモコン受信モジュールは、この仕様に特化されてて、
何種類かあるけれども、ほぼ仕様は同じ。
小さいので、ただ受光しているだけに見えるだろうが、
これでも、フォトダイオード、アンプ、フィルター、検波回路などが
集約されて一つのモジュールになっていて、リモコンの信号部分のみを取り出して、出力する。
VS1838Bの仕様は、下記のようになっている。
・電源電圧範囲:2.7~5.5V
・消費電流:1.5mA(無信号時最大)
・38kHz用
・中心波長:940nm
使い方は、簡単で、VddとGNDに適当な電圧(仕様では、2.7~5.5V)をかけると、OUTに受信したした信号部分だけが出てくる。
自然界にはいろんな赤外線があるわけだけど、これは、リモコンの赤外線だけに反応するので、雑音の影響を受けにくい。
気を付けなくちゃいけないのは、信号が反転されて出てくることだけ。
Arduinoのライブラリ
赤外線リモコン受信モジュール VS1838B 45円
MP3プレイヤー モジュール [ハード]
ArduinoやPICで、SDカードを操作することは可能で、データなどを書き込んだりもできるけど、
相手が音のデータだとデータで取り出しただけでは音にならず、
圧縮を解凍してやらなくちゃいけない。
それに音というのは、途切れちゃいけないわけで、解凍処理に時間がかかって
音がブチブチ切れるなんてのは、NG。
で、解凍専用のICで、制御だけマイコンで行うようにすれば、楽。
音源は、SDカードかUSBメモリ。
出力は、スピーカー直かイヤホン。
マイコンとは、UARTで接続して、コマンドを入れることで制御できる。
もちろん、スイッチを付ければ直接制御もできるので、マイコンなしでも使える。
ただし、2つの端子で多くのコマンドを読むため、電圧で読み取っているので、抵抗が1端子で10種類必要。
ライブラリ
ステッピングモーターって知ってます? [ハード]
普通のモーターは、電圧かけると回るけど、
ステッピングモーターは、中の電磁石がいくつかに分かれていて、
各相にうまいこと電圧をかけることによって、カクカクな感じで動く。
なんでなめらかじゃないのがいいかって?
回る量を制御できるから。ということは、好きなところで止められるということ。
最近はやりの3Dプリンタで、ヘッドを動かすのに使われてるので、注目を浴びている。
ただ、制御は難しい。というかめんどくさい。
単純な2相でも、4つの端子に順番に電圧をかけなくちゃいけないので、
8ステップ=8パターンの電圧のかけ方が必要。
この面倒くささを解消してくれるのが、A4988というIC。
このモジュールの「STEP」端子に、パルスを入れるとモーターが1ステップ回るという単純な制御。
回転方向は、「DIR」が、ONかOFFで制御。
ステップ解像度は「MS1」、「MS2」、「MS3」の3つの端子で、1 1/2 1/4 1/8 1/16まで設定できる。
このモジュールは、モーターの各相へ最大2Aを流せるそうだけど、
あっちっちになる可能性があるので、ヒートシンクが付いてるけど、必須ってわけでもないようだ。
基板の上のトリマーは、この電流を制御するもの。
データーシート
使い方(英語だけどね)
超音波距離センサー エラー? [ハード]
販売中止の原因は、「仕様変更で計測中にロックされる」という。
で、私なりに調べてみたんだけれども、
このモジュールは使い方が2通りあって、
仕様通りだと「Trig」に信号を入れて計測を開始し、
「Ecoh」から取り出した信号の長さで距離を割り出す。
マイコンとかだとそれぞれにPINをつないで使う二線式。
そしてこれから派生したと思われるもう一つのやり方が、
「Trig」と「Ecoh」を抵抗でつないで、マイコンには1本で繋ぐ一線式。
この場合、マイコンのピンはIOを切り替える。
これだと1本でいいのでそれなりに便利。
で、問題の不具合だけど、
対象が計測範囲を超えた場合に信号が出っぱなしになる。
で、まともな二線式だと電源リセットしか方法がない。
でも、一線式だと「Ecoh」がタイムアウトした後、
再度使うのに、一度リセットされるので、使えるようになる。
どうせみんな便利な一線式で使ってるんだから、
こうすれば、安くできるとか思って作ったものなんだろうね。
で、見分け方だけど
穴の数とロゴの位置がちがうようで、
センターロゴで2穴が、問題のあるやつで、
上部ロゴで4穴が本仕様。
超音波距離センサーモジュール HC-SR04 230円
リアルタイムクロック/RTC DS3231+AT24C32 [ハード]
このモジュールは、リアルタイムクロック(RTC)のDS3231とEEPROMのAT24C32が載っている。
I2Cで、それぞれ別々にアクセスでき、時刻とともに計測データなどを記録するのに便利になってる。
I2Cのアドレスは、RTCが0x68、EEPROMが、何もしなければ0x57。
DS3231のデータシート
DS3231は、高精度、低消費電力が売りで、
確かにDS1307に比べると電池の持ちがかなりいいいようだ。
なお、「高精度」というと1秒も狂わないと思ってる人がいるようだけど、
単独で動いてる時計としては高精度な方ということ。
今、電波時計が流行ってるけど、結局時計メーカーでさえ単独で狂わないのをあきらめて、電波で補正することを選んだように、単独で正確な時刻を刻むのは無理。
DS3231は、電圧は、2.3-5.5V。推奨3.3V。
バックアップのバッテリ電圧は、2.3-5.5V。推奨3.0V。
ピンは、32K、SQW、SCL、SDA、VCC、GND。
(反対側にあるターミナルは、I2Cのカスケード用)
32Kは、FLAGをセットすることで、32KHzのパルスが出力される。
SQWは、FLAGでアラームをセットすることで、設定時刻になると
これもFLAGでセットされた周波数の方形波が出力される。
データの内容は、下記のようになる。
00h 秒:上4ビットの下3ビットが10の位、下4ビットが1の位。
01h 分:上4ビットの下3ビットが10の位、下4ビットが1の位。
02h 時:上4ビットが0、12/24=1、AM/PM、10の位、
または、 0、12/24=0、20の位、10の位、
下4ビットが1の位。
03h 曜日:下3ビット。ユーザーが決める。
04h日:上4ビットの下2ビットが10の位、下4ビットが1の位。
05h月:上4ビットの上1ビットが世紀、下1ビットが10の位、下4ビットが1の位。
06h年:上4ビットが10の位、下4ビットが1の位。
07h-0Ah:ALARM 1
0Bh-0Dh:ALARM 2
0Eh-0Fh:制御/ステータス
10h:オフセット値
11h-12h:温度
Arduinoのライブラリ。DS1307用だけど使えるようだ。
PCの時刻をセットできるので便利。
DS1307とTIMEの両方をArduinoのライブラリに入れて、
サンプルの「settime」を実行すればPCの時刻がセットされる。
EEPROM=AT24C32のデータシート
AT24C32は、32Kビット=4KバイトのEEPROM。
A0、A1,A2(写真の右下にある)は、短絡することでEEPROMの下位アドレスを変更できる。
デバイスアドレスは、1010、A2、A1、A0、R/W。(W=0、R=1)。
具体的には、何もしなければ0x57。A0を半田などで短絡させると最下位が0になるので、
アドレスは、0x56になる。これは、EEPROMを複数使う時に使い分けるためにあるので、
1つだけなら、何もしないで使える。
書き込みは、デバイスアドレス+ワードアドレス2バイト+データ
読み込みは、データなしで書き込んだ後に、デバイスアドレスでリードする。
使い方はこんな感じ。
EEPROMのでーたアドレス0に”A”を書き込んで、
アドレス0を読みだして、シリアルに表示しているだけ。
#include#define address 0x57 byte data; void setup() { Wire.begin(); Serial.begin(9600); delay(1000); //WRITE!!!!******************************* Wire.beginTransmission(address); Wire.write(0x00); //First Word Address Wire.write(0x00); //Second Word Address Wire.write(0x41); //Write an 'A' delay(10); Wire.endTransmission(); delay(10); //READ!!!!********************************* Wire.beginTransmission(address); Wire.write(0x00); //First Word Address Wire.write(0x00); //Second Word Address Wire.endTransmission(); delay(10); Wire.requestFrom(address, 1); delay(10); data = Wire.read(); Serial.write(data); //Read the data and print to Serial port Serial.println(); delay(10); } void loop() { }
RTC/リアルタイムクロックモジュール+EEPROM