写真を撮影するときに影の出ない照明が欲しい時がある。そんな時に便利なのがスタンド付きリングライト照明装置である。と、家電ショップで探していると、Vlog_Starter_Kit_α(ETSUMI、\3,960)を見つけた。製品はスタンドにネジでカメラを固定でき、スマホ固定アダプタが付属し、カメラ用スタンドとしても利用できる(abc840でも使用)。コールドシューも付いているので撮影用フラッシュも取り付け可能である。自立でカメラアングルも自由に設定できるので、自撮りやセルフタイマー撮影にも使え、収納サイズも小さく、持ち運びにも便利。
収納サイズはコンパクト | 自立型照明スタンド |
I2C(Inter-Integrated Circuit)は、フィリップス社が提唱した周辺デバイスとのシリアル通信の方式で、主にEEPROMメモリICなどとの高速通信用でしたが、2線でデバイス間の通信が実現できることから、低速な周辺機器をマザーボードへ接続したり、組み込みシステム、携帯電話などで使われている。
I2Cマスターにはabc839の回路(PIC16F1459)を流用し、I2CスレーブにはPIC16F18325を用いた。
スレーブのMCC設定は、I2C(MSSP)設定をI2C、slaveとする他はabc838とほぼ同じとした。また、スレーブのLEDはRA5(=LED)、AD入力はRA4(=AVr4)を使用(ピン設定、ADC設定はabc838を参考)。
マスターはTMR2、USBとI2CのLCDも同時に使うので、abc840のスケッチを流用した。プロジェクトの流用は、projectでコピーしたいプロジェクトを選び右クリック、Copyを選び、新プロジェクト名を入力するとコピーが作成される。マスターではTimer2.cの割り込み処理でtmFlg=1を追加することも忘れずに(abc838参照)。
マスターはI2C_master_example.cの関数で、スレーブアドレス、レジスタ、データを順に送ることができるが、これらの関数を使う場合は、スレーブ側でその対策が必要。特にレジスタ付きRead関数は、最初にアドレスが送信(W)モードで送り出され、その後、受信(R)モードとなり、スレーブ側では最初のアドレス受信時に受信か送信かの判断ができないので、マスターの受信はI2C_ReadNByte関数のみを使うことにした。
スレーブのI2C通信スケッチはMCCで作成されたI2Cライブラリのみでも実現できそうだが、ライブラリの解析・確認に時間がかかりそうなので、その一部を利用し、送受信の基本関数と専用処理を含む独自スケッチ(i2c_slave_do_isr.c)を作成した。
スレーブはマスターからの要求を割込によって認知し、処理を開始するので、スレーブの割込ハンドラー処理関数 i2c1_my_Isr() に実行関数を直接記述し、I2C_Open関数内の割り込みハンドラーを変更した。
当初、スレーブのBFビット=0(空)で「送信完了」かどうか確認していたが、マスターに同じデータが2度送信され、「書き込み衝突」(送信終了前にバッファーに書込→次データが書き込まれない)が発生しているようなので、WCOLビットで衝突を確認することにしたところ、正常にデータが送信された
スレーブ回路図 | I2C通信テスト風景(M-S) |
ピン設定(RA4=AVr4、RA5=LED) | I2C設定(slaveアドレスを設定) |
|
|
|
|
|
|
◆◆◆◆◆◆ おまけ ◆◆◆◆◆
I2CはPICでもよく使われ、I2Cマスターの利用・報告例は多いが、I2Cスレーブの利用例は少ない。
そこで、I2Cシーケンスについておさらいする(Microchip社のPIC16F1764 日本語DataSheetより)
【I2Cで使われる主なレジスタ】
===<7ビットアドレスでの送受信シーケンス>===
【 Master:代表的な送信シーケンス】 M−(data)ー>S
【 Master:代表的な受信シーケンス 】 Mー>S−(data)ー>M
【 Slave:代表的な送信シーケンス 】 Mー>S−(data)ー>M
【 Slave:代表的な受信シーケンス 】 M−(data)ー>S
【slave:AHENとDHENを使う7ビット受信】 (アドレスホールド機能)