osc tokyo 2013 spring jrpug
DESCRIPTION
OSC Tokyo/Spring 2013 のJapanese Raspberry Pi Users Group セミナー後半の資料ですTRANSCRIPT
OSC 2013 Tokyo/Spring
超小型 & 超安価 ARM コンピュータ
Raspberry Piでできること ~応用編~
Raspberry Pi で温度計を作ってみる( GPIO の初歩として )
Japanese Raspberry Pi Users Group
あおしま ひでき( @azarashi55 )
2
自己紹介● あおしま ひでき
– 某中小企業のシステムエンジニア(と言う名の何でも屋)
– Twitter: @azarashi55 – こういうアイコンを見つけたら要注意
– Japanese Raspberry PI Users Group– 汎用制御装置 GVC の開発にも携わる
今日の内容
● GPIO (汎用入出力)端子の初歩
● Arduino との違いについて
● 今回使う I2C プロトコルの簡単な説明● 今回作る温度計に使うデバイスと配線● Raspbian の準備と実際の温度計スクリプト
4
Raspberry Pi の魅力 -1-● CPU が(そこそこ)速い
– GPU 性能は抜群
● 安い(上位モデルの Model B で 35 米ドル)● 美味しい ・・・かどうかは知りません (´ ・ ω ・ `)
– まじめに言うといろいろいじり甲斐がある– 応用がききます
→ARM 系ボード界の牛丼!?
5
Raspberry Pi の魅力 -2-● GPIO (汎用入出力)ヘッダーがついている
– 普通の PC と異なり GPIO 端子がついていることにより、多種多様な外部デバイスを接続可能
● I2C 、 SPI 、 UART 、 etc...
– もちろん USB などの端子もあります
→ 普通の PC ではできないことができる!
6
GPIO ヘッダーを見てみよう● GPIO ヘッダー
これです
7
GPIO の応用例● よくある使い方
– USB- シリアル変換( Model A で便利)
– LCD キャラクターディスプレイ
– GPS センサー
– モーター制御 etc...● ワイルドな使い方
– FM 送信機(個人的にこういうバカっぽいネタは大好き)
8
Arduino との違い● Arduino は入出力電圧が 5V 、 Raspberry Pi は 3.3V
→ 接続したいデバイスの動作電圧に注意しましょう● Arduino と異なり Raspberry Pi は A/D 変換機能がない
→ アナログデータはデジタルで入出力しなければいけない
→ 場合によっては Arduino の併用が楽かもしれません
● ピンヘッダーが Arduino ではメス、Raspberry Pi ではオス
9
温度計を作ろう● なぜ温度計か?
– 使用するデバイス( TMP102 )が比較的安価( 600円ぐらい)で入手しやすい( SWITCHSCIENCEなど)
– Raspberry Pi の GPIO ヘッダーに I2C (あとで触れます)の端子がある
– I2C 接続なのでデジタル入力で、かつ結線数が少ない→お手軽にできる
→GPIO 入門にはいいかと
– I2C 接続以外では DS18B20の利用例もあります
10
I2C ってなんだろう● I2C とは
– もともとは 1980年代初期に開発されたもの→その後改訂を経て今に至る
– シリアルデータ (SDA) とシリアルクロック (SCL) の2本の信号線のみで通信できる→実際にはこの他に電源ラインが必要→それでも電源ラインを含めて4本の結線で使える
– すでに特許が失効しているので自由に使える– 1つのマスターと1つ以上のスレーブから構成される
– Raspbian のデフォルトのカーネルで I2C が使える
11
実際に配線してみよう
● Fritzing で大体の見た目と配線図確認
回路図
TMP102
12
実際にはこんな感じ● ブレッドボードのほんの一部しか使いません
13
配線時の注意点● Raspberry Pi の電源を外しておく
● 念のため LAN ケーブル等も外しておく
● GPIO のピンヘッダーを扱う際には静電気に要注意(空気の乾燥、衣服の種類などに気を使い、事前に家具などの金属部に触れるといいでしょう)→ GPIO ピンヘッダーは CPU 直結なので注意しましょう
14
Raspbian の準備 -1-● Raspbian ではイメージを SD カードに書き込んだままの状態では
I2C モジュールが有効になっていません
$ sudo nano /etc/modprobe.d/raspi-blacklist.conf(nano でなくてもいいですが最初から nano が入っているため )
● 右のスクリーンショットのようにblacklist i2c-bcm2708の一行をコメントアウト– 行頭に#をつける
15
Raspbian の準備 -2-● 次に I2C デバイスを使えるようにカーネルモジュ
ールを起動時に読み込むように設定します
$ sudo nano /etc/modules● 右のスクリーンショットの
ようにi2c-dev の一行を追加し
$ sudo reboot で再起動します
16
Raspbian の準備 -3-● 一旦Raspberry Pi を再起動したら、
$ dmesg | grep i2c ( $ dmesg | more でも OK)
で以下の 3行が出力されていることを確認します。
[ 4.686775] bcm2708_i2c bcm2708_i2c.0: BSC0 Controller at 0x20205000 (irq 79) (baudrate 100k)
[ 4.897084] bcm2708_i2c bcm2708_i2c.1: BSC1 Controller at 0x20804000 (irq 79) (baudrate 100k)
[ 14.220329] i2c /dev entries driver
17
TMP102 の動作確認準備● I2C デバイスを操作するのに必要なパッケージをイ
ンストールします
$ sudo apt-get install i2c-tools python-smbus● 今回使用している温度センサー TMP102 は前記の
ように配線すると、 I2C アドレスが 0x49となります
18
TMP102 の動作確認● 実際に i2cdetect というコマンドで確認してみます
● 上記のように 0x49の箇所に 49が表示されれば正常に通信できています→ I2C のチャンネルが Rev.1 では 0ですが、現在のRev.2 では 1 に変更されていますのでご注意下さい
● 具体的には、 i2cdetect コマンドの引数が異なります
19
Python のスクリプト● 今回は先ほどインストールした Python の SMBus モジ
ュールを使いました。→ 極端にドキュメントが少ないです
→ google先生にいくら尋ねても本当にドキュメントがなくて泣けます
(私は情弱なのかしら)● 本当はクラスとか使ってきちっと書くのですが、スラ
イドなので簡略版
20
というわけでスクリプト#!/usr/bin/env python
import smbus
# TMP102のI2Cアドレスは0x49
addr = 0x49
# SMBusの引数はRev.1の場合0、Rev.2の場合1
# 何度もハードコーディングしてスイマセン、スイマセン、スイマセン
i2c = smbus.SMBus(0)
# TMP102から2バイト読み込みます
temp = i2c.read_i2c_block_data( addr, 0 ,2)
# 最後に、TMP102のデータシート通りに温度を計算して、画面表示します
print temp[0] + (temp[1] >> 4) * 0.0625
21
スクリプト動作結果
● I2C デバイスを操作するには root 権限が必要なので sudo コマンドを使って実行します
22
温度計はほんの一例● 今回ご紹介した Raspberry Pi で温度計は、
あくまでほんの一例に過ぎません● GPIO のみではなく、有線 LAN 、無線
LAN 、 USB などとの組み合わせで応用範囲は無限大です
● ぜひ” Raspberry Pi で楽しみましょう”
23
ご清聴ありがとうございました● 展示ブースにて、同じ回路で、きちんとソー
スコードを書いて、さらに Open JTalk を使った”しゃべる温度計”のほか、当 Users Group 有志の展示がありますので、ぜひお越しください