IoTCap
ラズパイマガジンの10月号(2018)をたまたま購入してみたのだが、これにはIoTCapというIoT拡張基盤が付属されていたので、 作ってみることにした。
部品
ただ、付属しているのは「基盤」のみで、部品は付属していない。そして部品はP52に部品表が書いてあるが、aitendo/マルツ/秋月/廣杉と、いろいろと入手先が分かれており、困難。 しかしマルツを見てみると、 「IoTCAP基板 部品セット」として、 一式販売していたので、購入しみた。

しかし部品が到着して、愕然とした。ほぼすべて表面実装部品であり(つまり小さい)、これらを手はんだで取り付けなければいけない。 初級者には難しいよと記載はあったが、かなりの上級者向けなセットであった。やばい!

表面実装
そのうちのひとつのチップ抵抗がこれ。1608サイズとのことなので、長い辺が1.6mmで、短い辺が0.8mmの四角形。 床に落としたら一瞬で無くすサイズ。床の板の隙間に入ったら終わりだ。

作成
チップ抵抗
愕然としつつも、やれるところまでチャレンジしてみようと、作成に取り掛かる。 最初はチップ抵抗。1608とかなり小さいサイズで、すべての作業は天眼鏡必須。そしてピンセットを使って調整が必要。 チップ抵抗をよさそうな場所に配置したら、テープで仮止め。この状態ではんだ付けを行う。その右側にあるR2も同様に。

次は基盤右上にあるR3とR4。こちらも同サイズのチップ抵抗。2つとも配置して、一気にテープ止め。 若干コツをつかんだかも。はんだこてのこて先を尖らすのは必須だ。

R7はちょっと大き目なチップ抵抗。6331なので約6mm x 3mm。通常はちょっと難しいと思うレベルだが、 先ほどの1608をやった後だと、ものすごく楽ちんに感じる。余裕~

チップコンデンサー
さて次は、チップコンデンサー。チップ抵抗と大差ないが、こちらは厚みが少しあり、テープ止めが少し難しい。 テープをうまく貼り付けないと、チップが浮いてしまう。

チップLED
次はLED。LEDには極性があり+側のA(アノード)とマイナス側のK(カソード)を間違えないように取り付ける必要がある。チップLEDの裏側に三角マークが書いてあるので、 それをみて、左右どちらがアノード/カソードなのかをチェックしてから、取り付ける。 下の写真はチップLEDを裏返して、裏に記載の図柄を見ているところ。かなり倍率を上げないと見えない。

チップLEDを2つ取付完了。上側が青色で、下側が白色のはず。動作させるまで色はわからない。 また、極性が間違っていないかも、動かしてみないとわからない。でも失敗していたら、やり直しは厳しいな。

トランジスタほか
つぎはトランジスタ。赤外線LED向けのドライバなのだろう。スペック見ると800mAまでOKとのこと。 しかしモノはかなり小さい。トランジスタなので、足は3本ある。

次にI2Cリピータというものを取り付ける。何者なのかはよくわからないが、リピータなのでI2C信号をつないでくれるんだろう。 I2C接続機器として、LCDとBME280があるので、信号劣化させないように、挟んであるのかもしれない。

ICチップ表面の丸印を探して1番ピンを特定。それを基板上の丸印と合わせて、方向を決定。 最初はんだ多めに取り付けてブリッジしても気にせず、はんだ吸い取り線で余分なはんだを吸い上げる作戦で何とか取付成功。

液晶画面ほか
次にLCDの取り付け。 足が多く、足の間も狭いので、隣の足とショートさせないように取り付けないといけない。

次は赤外線LED。足の長さでアノードとカソードを区別する。切り取るとどっちがどっちかわからなくなり、 通電させて点灯しても赤外線なので見えないのでチェックもできない。あらかじめきちんと確認して、穴に差し込んでおく。

赤外線受信部分は、あらかじめ足を90度に折ってから差し込む。 受光部が上を向くように足を折る。これで、基板の穴にさせば受光部が正面を向くようになる。

次にスイッチを2つ付ける。これらはそれなりの大きさなので、そんなに難しくは無い。 穴位置で縦横がわかるので、きちんと刺さる方向に差し込んではんだ付けする。

次にBME280を取り付けるピンコネクタを取り付ける。BME280は温度測定を行うが、 基板に近いとラズパイやほかの機器の温度に影響されやすくなるので、少し離すためにコネクタをつけるようだ。 垂直になるようにテープでまずは固定して、簡単にはんだ付けして最終調整してから、本付けする。 斜めになるとかっこ悪いので、ちゃんとまっすぐ取り付けよう。

40ピンコネクタ
基板の最後は、ラズパイとの接続用40ピンコネクタの取り付け。 それなりにピン間隔は空いているが、数が多いので、全てきれいにはんだ付けするには集中力が必要。 最後頑張ってはんだ付けしよう。

それなりにきれいにはんだ付けできたように思う。かなり細かい作業をしてきたので、これくらい余裕があると、 なんだか普段よりうまくいった気がする。はんだ付けも練習あるのみだな。

BME280
最後のはんだ付けが残っていた。BME280のオスピン付けだ。直角に気を付けながら、ちゃちゃっと仕上げて完成。

これではんだ作業はすべて終了。見た目では何とかはんだ付けできた気がするけど、 実際に使ってみないとうまくくっついているかは、わからない。頼むよ~。

とりあえずハード完成。
IoTCapソフトウェア
ソフトも準備されているので、使用してみる。ラズパイの状態は以下
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.4 (stretch)
Release: 9.4
Codename: stretch
IoTCapソフト
出来上がったIoTCAPをラズパイゼロWHに接続。これを動かす手順については、雑誌(ラズパイマガジン2018/10月号)のほうを参照する。 各種動作アプリがネットにあるようなので、これを持ってくる。
wget http://einstlab.web.fc2.com/RaspberryPi/IoTCAP.tar
取得したら解凍する。
tar xvf IoTCAP.tar
何かセットアップが必要らしいので、実行する。
cd IoTCAP
./setup.sh
どうやらいろんな初期設定類を行ってくれている様子。 I2Cの有効化とか、シリアルを使えるようにしておくとか、必要なライブラリを取得しておくとか。(多分) いろいろと、初心者に優しいセットアップをしてくれている。はんだ付けは上級者向けだったけど、 ソフトは優しいのかも。
セットアップが終わったら、いったん再起動。
sudo reboot
動作検証1(led/switch)
まずは、認識されているかを確認。
cd IoTCAP
./check.sh
チェック処理を動かしてみる。
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- 76 --
本の説明と同じく、3eにLCDがあり、76にBME280が見えた。 それぞれのI2Cデバイスはきちんとつながって見えているようだ。 よかった。
次はLED。2つ接続されており、上段(写真右)にある青のLEDがGPIO5に接続されているとのこと。 点灯させてみる。gpioコマンドで行うようだ。
gpio -g mode 5 out
gpio -g write 5 1
gpio -g write 5 0
青いLEDを点灯させたり、消灯させることが出来た。

もう一つの下段(写真左)にある白のLEDはGPIO6に接続されているとのこと。 こちらも点灯させてみる。
gpio -g mode 6 out
gpio -g write 6 1
gpio -g write 6 0
白いLEDを点灯させたり、消灯させることが出来た。

次はスイッチ。これも2つある。上段側のスイッチ(緑)がgpio22で、下段のスイッチ(黄)がgpio23らしい。 まずは上段の緑のスイッチを試してみる。
gpio -g mode 22 in
gpio -g mode 22 up
gpio -g read 22
最後のコマンドで現在の状態を読み取る。 通常は「1」が返ってきて、ボタンを押した状態でコマンドを投げると、「0」が返ってくる。 プルアップ接続なので、0/1は反転している。 以下のコマンドを実行すると、1⇒0(falling)になるのを待つらしい。
gpio -g wfi 22 falling
これで、しっかりとgpio22が反応していることがわかる。
では、もう一つのスイッチ(黄)を試してみる。
gpio -g mode 23 in
gpio -g mode 23 up
gpio -g read 23
最後のコマンドで現在の状態を読み取る。こちらも同様に、 通常は「1」が返ってきて、ボタンを押した状態でコマンドを投げると、「0」が返ってくる。 待機コマンドも試してみると、
gpio -g wfi 23 falling
同様に、ボタンを押すと、待機状態が解除される。
動作検証2(IR)
次は、赤外線LED関連。getIR2で赤外線の受信ができるようなので、やってみる。
sudo ./getIR2
sudo: ./getIR2: コマンドが見つかりません
エラーになった。あれ?本に書いてある通りなんだけどな? 本をよく読むと、事前にコンパイルを実施する必要があるようだ。 シェルとpythonはスクリプト系なので、コンパイル不要だが、C言語プログラムはコンパイルをしておく必要がある。 コンパイルするシェルも用意してあるので、これを実行しよう。
./compile.sh
そのあとで、あらためて赤外線受信を実行してみる。
sudo ./getIR2
部屋のシーリング電灯の点灯
AEHA 40 44 82 9 45 36
部屋のシーリング電灯の消灯
AEHA 40 44 82 9 47 38
では、逆に赤外線LEDから発光させてみる。
sudo ./setIR2 AEHA 40 44 82 9 47 38
無反応。デジカメ越しに見てみると、一応LEDは点灯しているようなので、 うまく信号が出ていないか、パワーが弱いのだろうか?
こちらの記事を見て、 ソースを少し修正。(44,45行目)
nano setIR2.c
#define IR_LIMITS 64 // bytes buffer = IR_LIMITS x8 bits //#define AEHA 21 #define AEHA 17 #define NEC 23 #define SONY 25
上記のように、AEHAの値を少し変更。そして、コンパイル。
gcc -o setIR2 setIR2.c -l wiringPi
これで、同様に実行すると、うまく動作した。 どうやら、元のソースのバグのようだ。
なぜ、当初の21ではなく17が正解なのか考えてみたい。 リモコン自体搬送波は38kHzが標準で、ここに規格の違いは無い。 ではたぶん動作すると思われるNECの動作を見ると、
NECのT(変調単位)は562us。1Tを23ループで送信しようとしているので、 1ループは24.4us(40kHz相当)の設定(実測値ではない)
Sony設定はT(変調単位)は600usのところ、1Tを25ループとしているので、 1ループは24.0us(41kHz相当)の設定(実測値ではない)
では、AEHA設定はというと、T(変調単位)は425usのところを最初は1Tを21ループで送信しようとしているので、 1ループは20.2us(49kHz相当)の設定(実測値ではない)少し早い気がする。
では、修正した結果は、T(変調単位)は425usを1T17ループで送信しようとしているので、 25.0us(40kHz)となり、上記と近い値となった。 逆に考えて、1ループが40kHzの25usの前提で21ループさせると、1Tが525us設定となる。 この1Tの値を間違えて、425usが正解を525usが正解と考えてしまい、 ループ数計算を間違えたのかも。
とはいえ、雑誌に掲載するものなので、校正と同様に検証もしておくべきなのでは? せっかくリモコン替わりになることろを、これでは対象家電によってはうまく動作しないので、 がっかりする人続出だ。(まあ基盤をちゃんと作れるような人なら、これくらいは解析するかも)
あと、17の設定が正しいのかも計算してみよう。
| 設定値 | 1ループ時間(計算値) | 周波数(計算値) |
|---|---|---|
| 16 | 26.6us | 37.6kHz相当 |
| 17 | 25us | 40kHz相当 |
| 18 | 23.6us | 42.3kHz相当 |
ということで、最適値は17が一番よさそうだ。 本来ならLEDの点滅をオシロスコープなので計測してしまうと一番楽なのだが、 残念ながらオシロなんてシロモノはうちにはない。そしてあったとしても、使い方がよくわからない。
動作検証3(LCD)
次はLCD(キャラクタ液晶)だ。本の手順に従って動かしてみよう。
./initLCD.sh
./locateLCD.sh 0 1
./printLCD.sh “abc”
これで、下の行に「abc」の文字が表示された。 コンパイルが終わっていないと、printLCDでエラーになるので注意。

座標としては、左上が(0,0)で、横に8文字表示可能、縦には2行表示可能。なので右下は(7,1)の位置となる。 あまりたくさんの表示はできないが、ちょっとした情報表示は可能だ。
動作検証4(BME280)
BME280のセンサーがついており、温度、湿度、気圧が測定可能。 コンパイルが通っていれば、すぐに実行可能。
./getBME
26.97C,101632Pa,43.38%,-26.63m
少し温度が高いかな。湿度は部屋の空気清浄機の表示が40%(10%刻み)なので、だいたい一致しているようだ。 気圧に関しては、ほかに比較するものがないので、何とも言えないが、まあ一致しているんだろう。
あと、パラメータを入れると個別のデータ取得ができるようで、
./getBME -t
26.91C
./getBME -p
101615Pa
./getBME -h
43.75%
等が可能。また、
./getBME -a
-24.80m
とすることで、高度(標高)が出てくる。しかしこれは気圧から出しているようで、 数値だけ見ると現在地下24mらしい。
応用編
では、応用編のプログラムを動かしてみる。まずは「clock.sh」時計として動作すると思われる。 では、実行してみる。
./clock.sh
./clock.sh: 行 15: /home/pi/IoTCAP/printLCD: そのようなファイルやディレクトリはありません ./clock.sh: 行 14: /home/pi/IoTCAP/locateLCD: そのようなファイルやディレクトリはありません ~
エラーが連続して出てくる。うまく動作しない。 ソースを見てみると、「initLCD、「locateLCD」と「printLCD」を呼び出しているが、 そのpathが絶対パスで指定されている。しかしその想定されたパスとは少し違う場所に展開したので、 うまく動かないようだ。では、少し修正を加える。(下記6,7行目)
#!/bin/bash # for IoTCAP # (C)Copyright 2018 All rights reserved by Y.Onodera # http://einstlab.web.fc2.com #base=/home/pi/IoTCAP base=. ~
6行目のpath指定部分を絶対パスから相対パスに変更。 これでうまく動作した。

「demo.py」というのがあるので、動かしてみる。pythonスクリプトなので、
python demo.py
で動かす。ソースを見ると、ボタンを検知してLEDを1秒光らせるようだ。 実行してボタンを押すと、上段ボタンの緑を押せば、上段の青色LEDが1秒点灯し、消える。 下段ボタンの黄を押せば、下段LEDの白が点灯し、1秒後に消えた。 連続して押すと、少しだけはバッファが効いているような動作をした。
実行権限がついていたので、以下でも動作した。
./demo.py
完成
サンプルプログラムは一通り動作したので、物理的な作成ミスはなかったと思われる。かなり初心者には難易度の高いはんだ付けだったが、うまく取り付けできていたようで良かった。
サンプルプログラムで、いろいろな入出力を行っているので、gpioを操作するのによい勉強になりそうだ。