この記事は、IchigoJam Advent Calendar 2017 8日目の記事です。
1. はじめに
LPC1114版 IchigoJam にあって ラズパイ版にないものはけっこうあります。
- ディスプレイ関連機能 (VIDEO/SWITCH コマンド)
- サウンド関連機能 (BEEP/PLAY/TEMPO/SOUND コマンド)
- マシン語関連機能 (USR コマンド)
- 省電力機能 (SLEEP コマンド)
- アナログ入力 (ANA コマンド)
その中でもとくに重要なアナログ入力ですが、今後も本体への実装は厳しそうなので、
回避策をご紹介したいと思います。
今回は、I2C通信対応のADコンバータを外部接続し、
ラズパイ版の IchigoJam BASIC でアナログ入力を実現してみます。
とはいえ、アナログ入力が使えないという課題自体は、Raspbian などのOSで
Raspberry Pi を利用している人にも共通しているため、ネット上にたくさんの情報がありました。
特にこちらの記事がとてもわかりやすく参考になりました。
http://kinokotimes.com/2017/02/02/python-mcp3425-16bits/
2. 準備物
Raspberry Pi本体
今回はPi3で試しました。
ADコンバータ
MCP3425というADコンバータのDIP化モジュールを秋月電子さんで購入しました。
http://akizukidenshi.com/catalog/g/gK-08018/
アナログセンサ
弊社によく転がっているシャープ製 測距センサ GP2Y0A02YK を使いました。
http://akizukidenshi.com/catalog/g/gI-03158/
3. ADコンバータの仕様
I2Cアドレス
上位4bit がデバイスアドレスで 0b1101
下位3bit は発注時に指定がなければ 0b000
ということなので、普通に購入した場合、0b1101000 = 0x68 になります。
設定の書き込み
1バイト送信して設定を行います。
bit7: 1に固定
bit4: (1:設定後、連続して読み取り可能; 0: 読み取りのたびに設定必要;)
bit3,2: (0b00:12ビット値を取得; 0b01:14ビット値を取得; 0b10:16ビット値を取得;)
今回は連続読み取り、12bitモードを試しました。(0b10010000)
電圧の読み取り
2バイト受信して読み取ります。(コマンドは0x00)
0バイト目: 上位8bit(右詰め)
1バイト目: 下位8bit
12bit,14bit,16bit の各先頭のビットは符号ビットなので、
実際の数値は 11bit, 13bit, 15bit マスクして取得するようです。
4. 配線
下記の接続でうまくいきました。(あとで図を載せたいです!)
測距センサ
VDD — RPi(5V)
VSS — RPi(GND)
VO — ADC(VIN+)
ADコンバータ
VIN+ — センサー(VO)
VIN- — RPi(GND)
VSS — RPi(GND)
VDD — RPi(3.3V)
SCL — RPi(SCL)
SDA — RPi(SDA)
5. BASIC コード
下記のコードで、なんとなくそれらしい値が取得できました。
10 POKE #700,`10010000 20 POKE #701,#00 30 R=I2CW(#68,#700,1) 40 R=I2CR(#68,#701,1,#702,2) 50 ?((PEEK(#702)<<8)|PEEK(#703))&`11111111111 60 WAIT5:GOTO40
6. 今後の課題
- 14bitモードや16bitモードも試してみましたが、うまくいきませんでした。
- 下位3bitのI2Cアドレスを指定できれば、切り替えて複数アナログ入力もできるかもしれません。