raspi_and_3g
ラズベリーパイで3Gシールドを使ってみました
ラズベリーパイで3Gシールドを使ってみましたので報告します。
- 試してみたこと
ラズベリーパイに、温度センサと3Gシールドを接続して、温度の計測結果を定期的にIoTクラウドサービスxively.comへアップロードしました:

なお今回の実験では、Linux OSとして最新のraspbian(2014-01-07リリース)を使いました。バージョンによって、設定手順などが異なる場合がありますので、ご注意ください。
また、今回の実験では、ドライバやツール等をダウンロードしたり、更新する必要があります。そのため、設定する間だけはラズベリーパイ自体がインターネットに接続できる環境が必要です(有線またはWiFi)。
- 補足
ラズベリーパイでは、Linuxが動作します。
Linuxでは、Arduinoとは異なり、ちゃんとしたTCP/IP等のプロトコルスタックが実装されています。このプロトコルスタックで使用できる3G通信モジュール(例えば、3G通信用のUSBドングルやWiFi用のUSBドングル等)を使ってインターネットに接続すると、Linux上の豊富な機能やコマンドが利用できます。
しかし、今回の3Gシールドとの接続では、UART(シリアル)を介して部分的にインターネットに接続する方法と取りました。そのため、インターネットに接続できると言っても、利用できる機能はかなり限定的ですのでご注意ください。(今回の実装方法で出来ることと言えば、指定したサーバへデータをPOSTする程度です)
- 使用した温度センサ
ラズベリーパイは、ADCを持っていません。そこで、秋月電子で販売されているI2Cインタフェースの温度センサを使用しました。
なお、ラズベリーパイのI2Cピン(SDA/SCL)は、既に1kオームの抵抗でプルアップされていますので、外部でプルアップする必要はありません。
(DHT22等の定番の温湿度センサは、特殊な1-Wireインタフェースで、タイミングにシビアな読み取り処理が必要ですので、ラズベリーパイのようなLinuxでは制御が難しいです。SPIやI2Cのインタフェースで接続するセンサを採用するのが無難です)
- ラズベリーパイと3Gシールドをつなぐ
ラズベリーパイの26ピンコネクタを、Arduinoのピンに適当にマッピングするシールド?を作成しました。
UNOに準じて、下記のマッピングとしました。ただし、3GシールドはD4/D5をシリアルポートとして扱うので、トグルSWにてRX0/TX0をD0/D1またはD4/D5に切替できるようにしています。
Arduino | Raspi | 役割 |
D0 | GPIO15 | RX0 |
D1 | GPIO14 | TX0 |
D2 | GPIO04 | |
D3 | GPIO21 | |
D4 | - | (RX0) |
D5 | - | (TX0) |
D6 | GPIO24 | |
D7 | GPIO25 | |
D8 | GPIO107 | |
D9 | GPIO108 | |
D10 | GPIO08 | /CE0 |
D11 | GPIO09 | MISO |
D12 | GPIO10 | MOSI |
D13 | GPIO11 | SCLK |
A0 | - | |
A1 | - | |
A2 | - | |
A3 | - | |
A4 | GPIO00 | SDA |
A5 | GPIO01 | SCL |
3V3 | 3V3 | 電源 |
5V | 5V | 電源 |
GND | GND | グラウンド |
上記のマッピングとした場合、ラズベリーパイと3Gシールドは下記のように接続します:
Raspi | 3Gシールド | 説明 |
D4 | D4 | UART(RX) |
D5 | D5 | UART(TX) |
D6 | D6 | 電源制御 |
D7 | D7 | 電源制御 |
3V3 | 3V3 | |
GND | GND | |
- | VIN | ACアダプタ等で5~12V/1A以上を供給する |
- 3Gシールドに温度センサ(ADT7410)をつなぐ
秋月電子で販売されているADT7410モジュールを使う場合は、すべての半田ジャンパは開放(何もしない)のままで、下記の4ピンをジャンパ線等で3Gシールドに接続します:
ADT7410 | 3Gシールド | 補足 |
VDD | 3V3 | |
GND | GND | |
SDA | A4 | |
SCL | A5 |
ミニブレッドボード等に温度センサモジュールを差して、そこからジャンパ線で3Gシールドのソケットに接続すると楽です。
- ラズベリーパイでI2Cを使えるようにする
下記の操作を、rootユーザにて行ってください。
- blacklistからi2cを外す
下記のファイルにある「i2c-bcm2708」の行をコメントアウト(行の先頭に「#」文字を挿入)する。
/etc/modprobe.d/raspi-blacklist.conf
- ロードモジュールにi2c-devを追加する
下記のファイルに、「i2c-dev」と記載した行を追加する。
/etc/modules
- i2c-toolsをダウンロードしてインストールする
下記のコマンドでI2Cの利用で便利なツールをインストールする。
apt-get install i2c-tools
- 再起動する
ラズベリーパイを再起動します。
- 正しくドライバモジュールインストールできたかを確認する
rootユーザになって、lsmodコマンドで「i2c_dev」および「i2c_bcm2708」の2つが組み込まれていることを確認する。
また、2つのファイル「/dev/i2c-0」および「/dev/i2c-1」が作成されていることを確認する。
以上で、I2Cを使う準備は終わりです。
- ラズベリーパイでUARTを使えるようにする
- gettyをコメントアウトする
ファイル「/etc/inittab」にある下記の行の先頭に「#」文字を挿入して、コメントアウトする。
TO:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
- 再起動する
以上で、UART0を使う準備は終わりです。
- GPIO、I2C、UARTを簡単に使える関数を作る
GPIO(デジタル入出力)、I2C、UARTを簡単に使える関数群を定義してみました。main()関数を含むソースsample3g.cを含む、ソースファイル群をZIPで固めて下記に置きましたので、どうぞ自由に使ってください。
sample3g.zip
各関数の使い方は、sample3g.cで定義しているmain()関数を参照ください。
- 3Gシールドに命令を送る
今回の実験では、3Gシールドに対して、HTTP/POSTを発行する機能だけを使っています。
使い方は、sample3g.cのpostTemp()関数を参照してみてください。
postTemp()関数にある通り、3Gシールドは、UARTでコマンドを送出することで制御できます。その実行結果は、UARTからのレスポンスで受け取ることができます。
ただし、基本的にテキストデータとしてマイコン(今回はラズパイ)と3Gシールドはシリアル通信していますので、改行文字等の制御文字を送る時は、特殊な記法(例えば、$nなど)を使う必要があります。C言語では通常、\n等で表記しますが、3Gシールドでは円文字(\)の代わりにドル文字($)を使います。また、一度に送ることができるコマンド文字列は1KB以内となっています。
- 最後に
本ページの記事を作成するに当たり、下記の書籍を参考としました。
いろいろと為になることが記載されていますので、興味のある方はぜひ購入されて読んでみてください。
「お手軽ARMコンピュータ ラズベリーパイでI/O」、CQ出版社
- 最終更新:2014-03-01 23:05:04