arduino UNOでI2C
I2Cを使うと,二本の信号線でアドレスの異なる128個のICと通信できる.AVRやESP8266でI2Cを使ったことはあったが,arduino UNOでI2Cをやろうとしたら,少し間違えたので,その仕組みを調べてみた.
初期化はWire.begin()で行なう.
ICに命令を送るときには,Wire.beginTransmission(adrs)とWire.write(data)とWire.endTransmission()を使う.ソースを見てみると,beginTransmissionではアドレスを定義するだけで,実際には通信は行なわず.writeではバッファに書き込んで,ここでも通信は行なわない.実際に通信が行なわれるのは,endTransmissionのときで,twi_writeToというコマンドを使って,アドレスやデータが送られる.
一方データを読み込むときには,Wire.requestFrom(adrs,bytes)とWire.read()を使うのだが,最初はbeginTransmissionとreadなどでやろうとしてしまった.読み込みでも,アドレスの送信を行なうので,そう考えてしまった.しかし,実際には,requestFromのときにtwi_readFromというコマンドを使って一気にバッファに読み込んでおり,このコマンドが無いと読み込みは行なわれない.その後で使うreadでは,バッファから読み込んでいるだけなのである.
書き込みの時はコマンドを三つ使って,読み込みの時は二つなのは,対称性が悪いなと思っていたが,このように,コマンドの内容を理解すると,そうなってしまう必然性が分かった.
大容量のHDD
exfatをdebianで読むには
大容量のHDDを繋いだら、認識はするのだが、exfatは見つから無いというエラーが出て使えない。調べてみたら、exfat-fuseとexfat-utilsを入れれば使えるようになるようだ。実際aptitudeで入れたら、ファイラーからマウントして使えるようになった。
raspberry pi zero発売
待ちに待った発売
2017年の第一四半期に日本で発売と発表されて依頼、なかなか情報が出なかったraspberry pi zeroですが、やっと明日発売されるようです。税抜き650円と、A+の四分の一である。pi zeroを動かす上で問題になるのが、HDMIがminiである点だ。既に入手している人達は、結構値段のする変換アダプタを使っている人が多いようだが、百均でも売っているのを見つけて、すでに準備済である。しかし、発売されてもすぐに入手するのは困難だろうから、少し落ちつくのを待つことにしよう。
IoTで温度、湿度、気圧を記録
BME280とESP8266
esp8266を使って温度のログを取っていたが、ようやく温度、湿度、気圧の記録を取れるようになった。BME280からI2Cを使ってデータを取得して、それをwifiでuploadする、と書くと簡単そうだが、BME280を扱うのに、それなりに苦労した。途中で一つeps8266を殺してしまった。
I2Cの通信自体は、それほど難しく無いが、ピン番号を間違えていて、しばらく苦戦してしまった。次に苦労したのが、BME280から取得したデータの変換だ。BME280の中に、校正するためのパラメーターが入っていて、これらを用いて複雑な計算をすると、温度などの値が得られる。これらを内部であらかじめやってくれていると楽なのにと思うのだが、計算が大変だからか、自分で計算しないといけない。パラメータの格納の順序が、私の書いたサブルーチンと相性が悪く、その変換のために、プログラムが汚くなってしまった。また、32bitや64bitのsignedやunsignedの変数をいろいろと使った式で、かなり複雑な計算をする必要がある。最初は32bitの変数としてlongを使っていたが、おそらくこれが32bitでは無いようで、signedのときに変な挙動をした。あからさまにint32_tなどと書かないと負の数のときに、値が変になってしまう。
これらの苦労を経て、なんとか記録を開始することができた。今後、これらのデータを使って、いろいろと検討することができるだろう。