Raspberry Pi I2C How-To ガイド by @azarashi55

注)Raspberry PiのGPIOポートはCPUであるARMプロセッサーに直結されています。
また、GPIOポートで許容される電圧は3.3Vまでで、5Vには耐えられません(過電
圧保護回路はついていません)。
 また、CPUに直結されているために、端子間のショート、静電気等でRaspberry
Pi本体が壊れる可能性もあります。
 GPIOポートを使用する際には、十分に注意の上、あくまで自己責任で使用して
下さい。

Intro.
 この文書は、Raspberry PiをI2C経由でTMP102に接続し、気温データを取得す
るまでのHow-Toです。
 前提としている環境は、
・PC(Windows7 or WindowsXP)+sshクライアント(TeraTerm、puttyなど)
・DHCPサーバー機能をもつブロードバンドルーター
 です。

1.Raspberry Piの購入
http://jp.rs-online.com/web/generalDisplay.html?id=raspberrypi
から購入できます。(要:クレジットカード)
#ちなみに、今購入しても出荷まで4ヶ月ほど待つようです・・・。
2.Raspberry Pi以外に必要なもの
 Raspberry Pi本体には特に別途RS Onlineで購入しない限りケーブル・電源類
は付属されていません。そこで、以下のものを準備します。
・LANケーブル
・電源(推奨はしませんが電源電圧さえ合っていればAndroidスマホのMicroUSB
電源が流用可能です、なお5V 700mAの供給能力が必要です)
・SDカード(最低でもSDHC class4 4GBが推奨されています)
・X環境を使う場合には、HDMIケーブル+USBキーボード+USBマウス
(なお、母艦となるPCにVNCクライアントをインストールすれば、HDMIケーブル
のみでも使えます)
・SDHCカード対応SDカードリーダー・ライター
・Raspberry Piとブレッドボード接続用メスーオスジャンパーワイヤ
(千石通商、秋月電子などで取り扱っています)
3.Raspberry Pi用SDカードの準備
 http://www.raspberrypi.org/downloads
 から、公式に推奨されているRaspbian(Debian Wheezyベース)のイメージファ
イルをダウンロードします。
 RaspbianイメージファイルをSDHCカードに書き込むツールとして、Win32 Disk Imager
をダウンロードします。
http://www.softpedia.com/get/CD-DVD-Tools/Data-CD-DVD-Burning/Win32-Disk-Imager.shtml
 ZIP形式なので、適当なフォルダーに展開します。
 SDHCカードをリーダー・ライターに挿入し、ドライブレター(例:G:など)を
確認します。
 Win32 Disk Imagerを起動し、Image Fileで先ほどダウンロードしたRaspibian
イメージファイルを選択します。次にDeviceの欄に先ほど確認したSDHCカードの
ドライブレターが表示されていることを確認します(ココは重要!!)
 間違いがなければ、Writeボタンを押してイメージファイルを書き込みます。
 数分で書き込みが終わり、”Write Successful”と出たら無事書き込めていま
すので、Exitボタンを押し終了します。
4.Raspberry Piの準備・起動
 本体を取り出し、LANケーブル、イメージファイル書き込み済みSDHCカードを
刺します。Raspberry Piには電源スイッチはありませんので、MicroUSBケーブル
を差し込むとそれだけで電源が入ります。
 10秒ほどOKのLEDがチカチカと明滅し、OKのLEDが消灯するとRaspberry Piの
起動が完了しています。Raspbianの場合、イメージファイルを書き込んだ”素”
の状態ではDHCPクライアントが起動し、IPアドレスを取得するので、ブロードバ
ンドルーター上でDHCPで割り当てられたIPアドレスを確認します。
5.Raspberry Piの初期設定
 Windows(ここから先はホストPCはLinuxでもMacOSでもなんでもsshクライアン
トさえ動けば何でもOKです)のsshクライアントを起動し、IPアドレスを指定し
て接続します。初期設定では
Username: pi
Password: raspberry
 となっていますので、これでログインします。
 次に、
$ sudo raspi-config
 で最低限の初期設定を行います。
 とりあえずは、timezoneを”Asia”→”Tokyo”に変更するぐらいでいいかと
思います。ちなみにlocaleにja_JP.UTF-8を追加すると、各種メッセージが日本
語(UTF-8)になります。
 rebootを求められるので再起動します。

 毎回、IPアドレスを確認してログインするのも大変だ、という方は
/etc/network/interfacesを修正して、固定IPを振っておくといいでしょう。設
定方法はDebianと一緒です(当たり前ですが・・・)。
6.I2Cデバイスを扱えるようにする
 Raspbianでは、I2Cデバイス用モジュールがあるものの、初期設定では読み込
まれないようになっています。
 そこで、以下のファイルを編集します。
/etc/modules に以下一行を追加
i2c-dev

/etc/modprobe.d/raspi-blacklist.conf の以下一行をコメントアウト
blacklist i2c-bcm2708

 上記内容を反映するために、
$ sudo reboot
 で再起動します。

$ dmesg
 で
[    7.833728] bcm2708_i2c bcm2708_i2c.0: BSC0 Controller at 0x20205000 (irq 79)
[    7.942068] bcm2708_i2c bcm2708_i2c.1: BSC1 Controller at 0x20804000 (irq 79)
 の行が表示されればI2Cデバイスモジュールが読み込まれています。
7.I2C用パッケージのインストール
 今回はHow-Toということで、Debianパッケージのi2c-toolsを利用してみます。
$ sudo apt-get install i2c-tools
8.TMP102の接続
 Raspberry Piの場合、GPIOポートにI2C用のピンヘッダ、3.3V電源、GNDがあり
ますので、3.3Vで駆動するTMP102(http://www.switch-science.com/products/detail.php?product_id=258
を使ってみます。
 接続前に、
$ sudo shutdown -h now
 で、Raspberry Piを停止状態(Halt)にし、LANケーブル、電源ケーブルを外
します。
#PWRのLEDのみが点灯している状態でHalt状態になっています。

 Raspberry PiのGPIOピン配列は
http://elinux.org/RPi_Low-level_peripherals
 など各所に出ています。

 接続が終わったら、再びLANケーブルを刺し、電源を入れます。

 TMP102はADD0端子にV+を接続するとI2Cアドレスが0x49に指定されます。
$ sudo i2cdetect 0
 で、実際に0x49に表示が現れることを確認しましょう。

 今回はHow-Toということで、http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=11319
からサンプルのbashスクリプトを拝借してみます。

#!/bin/bash

hexraw=$(sudo i2cget -y 0 0x49 0x00 w)
while [ “$hexraw” == “” ]; do
    hexraw=$(sudo i2cget -y 0 0x49 0x00 w)
done

msb=$(echo ${hexraw:4:2})
lsb=$(echo ${hexraw:2:1})
dec=$(printf “%d\n” “0x$msb$lsb”)

echo “scale=4; $dec*0.0625” | bc

 なお、このスクリプト内で使われている計算ソフトbcはraspbianにはデフォル
トでは入っていませんので、
$ sudo apt-get install bc
 もしておきます。

pi@raspberrypi ~ $ ./tmp102.sh
29.8125
pi@raspberrypi ~ $

 のように気温データが取得できていれば成功です。

オマケ編

A.bootcカーネルを使う
http://www.bootc.net/projects/raspberry-pi-kernel/
 で公開されている、3.2 Kernelを使うともっと楽にTMP102の値が取得できるの
でやってみました。

 まず、http://www.bootc.net/projects/raspberry-pi-kernel/を参考に、
kernelイメージをとってきます。
$ wget http://apt.bootc.net/debian/pool/main/l/linux-source-3.2.23-rpi1+/linux-image-3.2.23-rpi1+_1_armel.deb

 ここからの操作はsudoでやっているとややこしいので、suでrootになって実行
します。
$ su passwd
お好きなrootのパスワードを設定して下さい。

$ su
rootになります。

 次に行うファームウェアアップデートで意外にSDカードの容量を消費するので、
あらかじめ
# raspi-config
 から、”expand_rootfs”を選択し、SDカードの全領域をRaspberry Piで使え
るようにしておきます。(SDHC class10 16GBのカードで大体数十分かかります)

次にSDHCカード内のkernelのファームウェア(おそらくkernel moduleを指して
いると思います)をアップデートします。
# wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && chmod +x /usr/bin/rpi-update
# apt-get install git-core
# /usr/bin/rpi-update
数分かかります。
# dpkg –force-architecture -i linux-image-3.2.23-rpi1+_1_armel.deb
 エラーメッセージが出ますが、無視します。
(Raspbianはアーキテクチャーがarmhfだが、入れようとしているkernelのアー
キテクチャーはarmelなため。なお、kernelのアーキテクチャーがarmelでも
armhfなアプリケーションはそのまま使えます)

# cd /boot
 現在のkernelを退避
# cp -p ./kernel.img /root
 3.2 kernelをコピー
# cp vmlinuz-3.2.23-rpi1+ /boot/kernel.img
# reboot

 これで、3.2 kernelで起動します。

$ uname -a
Linux raspberrypi 3.2.23-rpi1+ #3 Sun Jul 15 16:46:51 BST 2012 armv6l GNU/Linux
$ su
# apt-get install lm-sensors
 0x49の部分はI2Cデバイスアドレスに合わせて適宜変更して下さい
# echo tmp102 0x49 > /sys/class/i2c-adapter/i2c-0/new_device
# exit
$ sensors
tmp102-i2c-0-49
Adapter: bcm2708_i2c.0
temp1:        +29.2°C  (high = +160.0°C, hyst = +150.0°C)

$

 と、あっさりとTMP102のデータが取れました。

・3.2 kernelの長所・短所まとめ
長所)
 3.2 kernelでサポートされているI2Cデバイスについては極めて簡単に
データが取得できる

短所)
 3.2 kernelを導入するまでの手順が比較的大変
 ファームウェアの更新でSDカードの容量が必要となる
 I2Cデバイスがkernelモジュールの内部に隠蔽されるので、一旦
new_devicesにI2Cデバイスを登録してしまうと、ユーザーランドからI2Cデバイ
スにアクセスできず、生のI2Cデバイスのデータを取得できなくなる
 3.2 kernelが現状armelアーキテクチャーでコンパイルされているため
に、armhfと比べて浮動小数点演算を必要とするアプリケーション(ウェブブラ
ウザその他もろもろ)の動作が遅くなる(はず・・・)

B.参考URL
・Raspberry Piの公式サイト
http://www.raspberrypi.org/

・Raspberry PiのGPIOポートなどについて
http://elinux.org/RPi_Low-level_peripherals

・Raspberry Pi 3.2 Kernel(bootc kernel)について
http://www.bootc.net/projects/raspberry-pi-kernel/

赤外線信号がデコードできました。ヽ(´ー`)ノ

毎日暑い日が続いていますね、みなさん大丈夫でしょうか?(OSC関西@京都が心配だ…)
 
まだPICでではないんですが、Arduinoレベルで赤外線の解析がうまくできるようになりました。
 
先にメールした「NEC」「家電協」「SONY」の三種類のフォーマットを判別して、そのあとの0/1をきちんと判定できるようにしました。
 
現在はまだ一旦バッファに貯めた受信結果を解析しているので、PICでやるとなると割り込み処理で遅延なくやらないといけないので、そのあたりがちょっと難しそうですが、まぁフォーマット判定してデコードできるようになったのでかなりすすんだんじゃないかと思います。
 
以下はソニーのテレビの電源ボタンをポチッと押したときのものです。(実際には同じのが三発きます)
 
データ部は12ビットしかないので、実際のデータとしてはフォーマットとあわせても3バイトあれば十分、ということになります。
 
ゆるゆるとですが、このあとで細かい動作とか詰めつつ、PICに移行、移植して、最終的にGVCで赤外線リモコンモジュールとして対応したいと思います。
 
READY!
GO!
~~~~~~~~~~~~~~~~~~~~~~~______~~~~~~~~~~~______~~~~~~_____~~~~~~~~~~~~
_____~~~~~~______~~~~~~~~~~~~_____~~~~~~______~~~~~______~~~~~~~~~~~~
_____~~~~~~______~~~~~~_____~~~~~~______~~~~~~___________________________
 
CHECK!
SONY FORMAT
DATA = 1
DATA = 0
DATA = 1
DATA = 0
DATA = 1
DATA = 0
DATA = 0
DATA = 1
DATA = 0
DATA = 0
DATA = 0
DATA = 0
 

Raspberry Paiが到着しました

まだかまだかと待ちくたびれて忘れていた(うそです) Raspberry Pai が、昨日無事に届きました。

かなり軽くて小さいです。

コレだけでは何も出来ませんので、microUSB(700mA必要!)とHDMIケーブル(→DVI?)とSDカード(8GBもあればよい?SDHCとか認識してくれるのかな?)を買ってこないといけません。

 

OSC関西@京都に参加します #osckansai

OSC仙台のMyDNS.JP/GVC展示ブースにご来場いただきました皆さん、またセミナーにご参加いただきました皆さん、ありがとうございました。

さっそくですが、来月そうそうOSC関西@京都が開催されます。
展示では環境構築が間に合えばRaspberryPaiの実機デモを、またセミナーもやりますので、事前登録ともどもよろしくお願い致します。

====================================================================
「OSC2012 Kansai@Kyoto」 いよいよ来週(8/3-4)開催です![最新情報]
====================================================================

 オープンソースカンファレンス事務局です。
 8/3(金)4(土)に京都リサーチパーク(最寄り駅:JR丹波口駅)で開催の
 「OSC京都」にユーザ登録をいただきありがとうございます。

 いよいよ来週の開催です!
 イベントページ→ http://www.ospn.jp/osc2012-kyoto/

 新しく追加されたセミナーなどをイベントの最新情報をご案内します。

 開催中はセミナーが終日目白押しです。また多数の出展ブースでは最新情
 報を直接聞ける他、非売品のノベルティなどレアなグッズが手に入るかも!

 OSS初心者から上級者までお楽しみいただける多彩な企画が満載です。
 参加費は無料!皆様のご参加をお待ちしております。

 ★イベント参加表明Tweet歓迎! Twitterハッシュタグ #osckansai ★
=What’s New=
1.『会場内にイベントコンシェルジュを設置します』
 学生や女性をはじめとした一般の方々にも、楽しくソースコードに触れて
 いただくために、8ビットマイコン(Arduino互換のJapanino)や、レゴの
 マインドストームを用意し、デモを行います。ぜひお立ち寄りください。
 (コンシェルジュ代表:よしだともこ)
2.『スタンプラリー開催! ~OSPN.JP特製ポーチをGET~』
 展示ブースを見学しながら、ぜひご参加ください!
 [スタンプ設置場所:5ブース]
 日本マイクロソフト/日立製作所/Mozilla Project/Qt(キュート)
 お名前.comレンタルサーバー
3. 『展示ツアー 開催時間は間もなく発表です』
 できれば出展者といろいろ話を聞いてみたいけど、OSCは初参加なので
 何から聞いたらよいのかわからない・・・。そんなご来場者様のために
 ガイドがみなさんと一緒に展示会場を見て回り、出展者から各ブースの
 見所や最新のトピック等を紹介してもらいます。開催時間は調整中です。
──────────────────────────────────
□■□ –【オープンソースカンファレンス2012 Kansai@Kyoto】– □■□

★セミナー参加登録受付中!⇒⇒⇒ http://www.ospn.jp/osc2012-kyoto/

◆日時:8月3日(金)・4日(土) 10:00-17:00
◆入場:無料
◆会場:京都リサーチパーク(KRP) 東地区「アトリウム(総合受付)・1号館」
◆主催:オープンソースカンファレンス実行委員会

◆内容:オープンソース関連の最新情報提供 (展示・セミナー)
◆twitterハッシュタグ:#osckansai

──────────────────────────────────

 2004年から始まり、今回で77回目を迎える日本最大級のオープンソース
 総合イベント「オープンソースカンファレンス」

 オープンソース・IT 技術に関するイベントとして、多彩なセミナーと、
 オープンソースに触れられる展示で旬の最新情報をお届けします。
 セミナー・ブースでの展示は、全て無料でご参加いただけます。

 オープンソース最前線で活躍する人たちと気軽に出会えるのも、OSCなら
 ではの魅力!
 ここでしか得られない貴重な情報や人脈、ビジネスチャンスを探しに、
 ぜひご来場ください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

◆事前登録について

 聴講希望のセミナープログラムには、事前登録をお願いします。
 左側の「セミナー事前受付登録はこちら!」より、登録を行ってください。

★登録はこちらから → http://www.ospn.jp/osc2012-kyoto/

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

○セミナータイムテーブルはこちら↓

8月3日(金)・・・1日目
http://www.ospn.jp/osc2012-kyoto/modules/eventrsv/?id=1&noform=1

8月4日(土)・・・2日目
http://www.ospn.jp/osc2012-kyoto/modules/eventrsv/?id=2&noform=1

○展示一覧はこちら↓
http://www.ospn.jp/osc2012-kyoto/modules/article/article.php?articleid=1

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

赤外線モジュール追い込み中…

OSC仙台から帰ってきましたら、東京の暑いこと暑いこと!!
さすがにこれは尋常ならざる温度ですので、自宅でもエアコンを使うことにしました。

…で、エアコンを使うという事は赤外線リモコンを使うということなので、OSC仙台のモチベーションを維持している間に、少しでもGVCの赤外線モジュールの開発を先に進めようとがんばることにしました…いや、実際にはこの暑さでモチベーションはかなりダダ下がりなのですが。(^-^;;;

さっそくですが、赤外線には大きく分けて

・NECフォーマット
・家電協フォーマット
・SONYフォーマット

があります。

これらを区別しないと受信や(再)送信の処理が成り立たないので、まずはフォーマットを理解しないといけません。

で、実際に

http://d.hatena.ne.jp/hijouguchi/20101225/1293281541

を参考にして、リモコンデータを読んでみて、

http://elm-chan.org/docs/ir_format.html

を見てフレームの冒頭部分を解析してみました。(-/_は一つ当たり250usごと、のはず)

123456789012345678901234567890123456789012345678901234567890123456
Victor(NECフォーマット)
________________________________-----------------__------__------_…

TOYOTOMI(家電協フォーマット)
_____________------__-----__-__-__-----__-----_--__----__--_--__-_…

SONY(SONYフォーマット)
_________--_____--___--_____--__---____---__--___--_____--___--__-…

まずは冒頭のリーダー部の解析です。

Victorのを見ると、-/_の数が

32×250=8000us、17×250=4250us

となっています。NECフォーマットは冒頭が16T(8992us)、その次が8T(4496us)なので、だいたいあっているかな? 足りない分はArduinoそのものの処理時間でしょう。

次にTOYOTOMIを見てみると、

13×250=3250us、6×250=1500us

となっています。家電協フォーマットは冒頭が8Tでその次が4Tなのだけど、この1Tの時間が曲者で350~500usもあるらしい。長いほうで計算しても、8T=4000usにもなるのだが、一応割合的には合ってるみたい。

最後にSONYを見てみると、

9×250=2250us

SONYフォーマットはいきなり4T(2400us)のあとにデータが来るんですが、リーダー部としてはこれもだいたい合ってる。

ここで何をしないといけないかと言うと、各フォーマットごとにデータを表す単位『1T』が違うので、最初にフォーマットを判断して、その後はサンプリングデータ数をそれぞれの1Tで比較してビット判定をしないといけないという事です。

例えば家電協の8Tは最短で2800usなので、SONYの4T(2400us)と区別するには冒頭が2600us(?)よりも短かったらSONY、それよりも長いなら今度は4000usちょっとまでなら家電協、それよりも長くて9000us程度までならNEC、それら以外の場合には…どうする?みたいな。

信号のH/L(ここでいう-/_)のサンプリングは1Tが充分に判別くらい(四倍?)で計測しないといけないので、一番1Tが小さい家電協の350usをきちんとサンプリングするとなると、87.5usかそれよりも短い間隔でサンプリングしないといけませんね。

で、フォーマットを検知できたら、あとはそれぞれのフォーマットに従い、データ部分を解析することになります。

更に注意しないといけないのは、SONYはデータ部のH/L構成が、他の二つのフォーマットと異なるということです。

・NECと家電協は信号有り→無しで、1ビット
・SONYは信号無し→有りで、1ビット

これらを理解した上で、赤外線リモコンのデータ(フレーム)を

・データフォーマット
・実際のデータ

として分けて、データは01を寄せ集めてバイト変換することにより、PICでも扱えるだけのデータ量に収められれば言うこと無しなのですが…果たして如何に!?

TOYOTOMIのエアコンリモコンはホントにデータが長いけど、結果として0/1判定をバイトデータに変換できたら多分大丈夫なはず…たぶん。笑