自分にやさしく

特小/電子工作/プログラミング/アニメ/雑記等

#02 [電子工作]Raspberry Pi

前回

yuhanaoka.hatenablog.com

今日は第7章、I2Cデバイスを使った電子工作。

I2C : アイ・ツー・シー と読む。シリアル通信の一種で、多数のセンサを取り扱えるのが特徴。
I2Cインターフェースは同期式シリアル通信(送る側と受け取り側の同期ができる通信)で、高速な通信が可能。
また、制御できる機器(スレーブっていうの?)も複数扱えるとのこと。

但し伝送距離は短く、基本的に基板内の通信に使う模様。

(...うーん。。。シリアル通信についてもまとめたほうが良さそうだ。)


実は以前にも、I2Cデバイスを使ったことがあって

これ

akizukidenshi.com


を使って、温湿度、気圧のデータを取得したことがある。


=事前準備=

まず、Raspberry Pi の I2C 通信を許可しなけばならない。


sudo raspi-config

をコマンドで実行し


f:id:yuhanaoka:20170401195437p:plain

からInterfacing Options を選択


f:id:yuhanaoka:20170401195817p:plain


I2C を選択する。
Would you like the ARM I2C interface to be enabled? と聞かれるので <はい>を選択。

次にpythonでI2C通信を行うためのモジュールをインストールする。

sudo apt-get update

sudo apt-get install i2c-tools python-smbus

を打ち込み実行。


=準備=


事前準備が完了したら、道具の準備。

今回使用した機器はこれ。



なんか、ピンと本体がバラバラ何だが....。
うん。半田付けが必要みたい。

というわけで、モクモクはんだ付け。

f:id:yuhanaoka:20170401202843j:plain
あ、ちなみにこのこてを使いました。

f:id:yuhanaoka:20170401203124j:plain
はんだも半田ごても所有していたけど、結局使わず。
自宅で使ったの初めてなのでは?

そして無事半田付け完了。

f:id:yuhanaoka:20170401203205j:plain




=回路の作製=

回路は書籍を参考に作る。

この図がイマイチ理解できていないのだけれど、

I2Cマスター : Raspberry Pi

スレーブ : 温度センサー

で良いのだろうか?

こんな感じで作製した。

つなげたら

i2cdetect -y 1
を入力

最初はうまく認識しなくて、ワイヤーをもう一度つけ直したら認識した。
(認識しなくても、あきらめないこと!)

=コードの記述=

サンプルコード通りに打ってみたけど、エラーが消えない...?

サンプルコードを読んでみたら、おかしいところがあった。

関数で宣言されてない変数を使っている。よく見ると、プログラムの初期化時にこの変数は宣言されているが、関数に渡されていない。

f:id:yuhanaoka:20170401204633j:plain

そこで、関数に引数として渡してやるように書き換えた。

import smbus
from time import sleep

#----------def------------
def read_adt7410(address_adt7410,register_adt7410):
word_data = bus.read_word_data(address_adt7410,register_adt7410)
data = (word_data & 0xff00) >> 8 | (word_data & 0xff) << 8
data = data >> 3
if data & 0x1000 == 0 :
temperature = data*0.0625
else :
temperature = ((~data&0x1fff) + 1)*-0.0625
return temperature
#---------main----------

bus = smbus.SMBus(1)
address_adt7410 = 0x48
register_adt7410 = 0x00

try:
while True :
inputValue = read_adt7410(address_adt7410,register_adt7410)
print(inputValue)
sleep(0.5)
except KeyboardInterrupt :
pass

=実行=

エアコンを20℃に設定して動かしているので、結構正確な値が取れているのではないか!


=メモ=

光センサを使えば、部屋の照度を取ることで在室か否か判断できそうだ。

#01 [電子工作]Raspberry Pi

以前から目をつけていた書籍

を使う。

パーツ等は秋月電子から通販で入手。
一時期品薄だったけど、ちょうどよいタイミングで購入できた。

実はこの記事を書く前に書籍を少し進めていて、ブログに書くのは6章からになる。


6章はAD変換をやってみる章だ。

次のパーツを使う。

f:id:yuhanaoka:20170401002438j:plain


半固定抵抗:
抵抗値を任意で変更できる抵抗器。画像ではわかりづらいけが、つまみが付いていて、これを回すことで抵抗値を変更できる。
固定抵抗器との違いはピンが3つあること。真ん中のピンとADコンバータを適切に接続すると、電流値を取得できる。

AD変換器:
ADコンバータが正しいか?アナログ値をデジタル値(離散値)に変換できる。
ROHMっていう会社が詳しい説明を載せていた。
基本動作 | A/Dコンバータとは? | エレクトロニクス豆知識 | ローム株式会社 - ROHM Semiconductor

・・・よくわからんが。。。まぁあとでゆっくり理解しよう。

今回使用した、MCP3208 というADコンバータは12bit。つまり 2^12 = 4096の値を取得できる。
今回は3.3vの電源を用いいるので  0-3.3V は ADコンバータでは 0 - 4095 に対応するようだ。

光センサー:
照度を取得できる。照度などのアナログ値をラズパイではADコンバータで離散値のしてやる必要がある。



サンプルコード写経....

実行。

すごい怒られたぞ。


変数名間違い程度で、すんだ。ホッ。

取得できた!

では光センサーように、回路とプログラムを書き直す....

実行!

取得できた!
値の上下はセンサー部に手をかざしたか、そうでないかによるもの。

LEDと組み合わせて、こんなことができる。


目標1

目標は明確に。あまり実感は無いけれども、立てたほうが良いらしい。

 

まず、目標は

 

 

Raspberry Pi でラジコンを作る!

 

 

電子工作を始めたくて、道具は揃えたけど、1年経ってしまっている。

ここから始めよう。

目標は11月の文化祭で発表できる程度に。

二台作って対戦できたら面白そう。

ブログ始めました。

色々と、やりてー!と思うこと(願望)はあるけれど、そこにエネルギーを費やせず悶々としている中の人です。

何らかの目標を達成したいと真剣に思うなら、それに向けてかなりのエネルギーを注ぐ必要がある。

分かってますよー!そんなこと!!

まぁ、ブログにやったことを書き留めながら、

一歩ずつ、地道に、確実にやっていきましょう。