プログラミング

Arduino と Raspberry Pi(ラズパイ)を USB シリアル通信で接続し、温度湿度センサーのデータを取得してみる

adrp_top

先日 Arduino と Raspberry Pi を USB シリアル通信で連携しながら、温度湿度を取得するセンサーを作ってみました。今回はそこから得た知見を書いていきます。

開発環境

今回の開発で使用する環境は以下のようになります。

  • PC: MacBook Pro 2016
  • Arduino: UNO
  • Raspberry Pi: MODEL B+
  • 温度湿度センサー: DHT22

PC: MacBook Pro 2016

今回開発に使用したPCは「MacBook Pro 2016」。比較的に新しいこのタイプの Mac は、接続ポートが「USB-C」ポートのみのため、「USB-C」を「USB」に変換するケーブルが必要でした。

また、イーサネットポートも存在しないため、USB ポートとイーサネットポートの変換も必要になります。

Arduino: UNO

Arduino は開発に必要なツールが同梱されている「Arduino をはじめようキット」というセット商品を使用(以下に商品リンク)。

Raspberry Pi: MODEL B+

Raspberry Pi は「MODEL B+」と少し古いのですが、USB ポートが付いているので問題ありません。

温度湿度センサー: DHT22

温度湿度センサーは利用者の多い「DHT22」を使用。

以下、開発に使用したツール一覧。

開発の前に

この記事を読み進めるにあたって、Raspberry Pi に OS がインストールされていることを前提とします。開発に使用した OS は「Raspbian」です。

Arduino 側の準備

まずは、Arduino で温度湿度センサーを使ってデータを取得することから始めます。

Arduino 上で動作するプログラミング言語は「C言語」を使用します。

DTH22 の説明

DHT22 - Arduino Project Hub

image via: DHT22 – Arduino Project Hub

DTH22 を Arduino へ取り付けるために最低限知っておくこととして、各ピンの役割があります。

DTH22 は 4本のピンがあり、上記の画像を参照すると、1 が電源(VCC)、2 がデータ(data)、3 が不使用、4 が抵抗(GND)となっています。

接続例:MacBook Pro と Arduino

adrp02

接続例は各ツールを以下のように略して説明します。また、上記の「DTH22 の説明」を参考にしながら設定してください。

ブレッドボード:[BB]、Arduino:[A]

  1. [BB] の電源(VCC)は [A] のアナログの 5 Vへ
  2. [BB] の抵抗(GND)は [A] のアナログの GND へ繋ぎ
  3. [BB] のデータ(data)は、今回は [A] のデジタルの 2 へ繋ぐ

DTH22 のデータを取得するライブラリ「DHT-sensor-library」のインストール

DTH22 で感知した温度湿度のデータを容易に取得するために「DHT-sensor-library」というライブラリを使用します。

Arduino で外部のライブラリを使用するには「Arduino/libraries」ディレクトリにソースを置きます。

こうすることで、プログラムからライブラリをインポートできるようになります。

温度湿度のデータを取得するプログラムを書いていく

以下、温度湿度のデータを取得するプログラム。

温度、湿度どちらか一方でも取得ができなかった場合は処理を中断させています。

Arduino のシリアルモニタで確認動作を確認すると、以下のようにデータが取得できています。

adrp01

Raspberry Pi 側の準備

次は、Raspberry Pi で Arduino からのデータを受け取る準備です。

Arduino からのデータを処理するプログラミング言語は「Python」を使用します。

接続例:MacBook Pro と Raspberry Pi

adrp03

MacBook から Raspberry Pi へ SSH 接続する

ifconfig コマンドでローカル IP アドレスを確認します。

arp コマンドでイーサネット通信の設定を確認します。

今回は “192.168.2.2” が Raspberry Pi のローカル IP アドレスになります。

ssh コマンドで Raspberry Pi へログインします。パスワードは「raspberry」。

Raspberry Pi のシリアルポートの設定を行う

Arduino とシリアル通信をするために、raspi-config コマンドを実行しシリアルポートの設定を行います。

シリアルポートの設定方法は以下の記事の「シリアルポートの設定」が参考になります。

Python 製シリアル通信用ライブラリ「pySerial」のインストール

シリアル通信には利用者が多い「pySerial」を使用します。

「pySerial」をインストールするには「pip」が必要になるため、まずはそれのインストールから。

pip のインストール完了後に「pyserial」をインストールします。

Arduino からのデータを受け取るプログラムを書いていく

Arduino からのデータを出力するプログラムを記述します。

ファイル名は任意の名前で大丈夫です。

以下、Arduino からのデータを時刻と共に 1 秒毎に表示するプログラム。

Arduino と Raspberry Pi を USB で接続する

以上で Arduino で取得したデータを Raspberry Pi で受け取る準備は整いました。

あとは両端末を USB で接続し、シリアル通信を実行させれば完了です。

接続例:Arduino と Raspberry Pi

adrp04

Arduino と Raspberry Pi は直接繋ぐ必要があります。

USB ハブ経由で繋ぐと上手く動作しません。

Raspberry Pi と Mac をインターネット経由で接続する

Mac の「システム環境設定」->「共有」を選択します。

インターネット共有で「共有する接続経路」を「Wi-Fi」に、「相手のコンピューターが使用するポート」は今回はUSBで接続しているため「AX88179 USB…」を設定します。

USB 接続の確認

Arduino と Raspberry Pi が USB 接続できているかを確認します。

シリアル通信プログラム実行

Arduino からのデータを受け取るプログラムを書いていく」で書いたプログラムを実行します。

上手くデータが受け取れてますね。

停止させる場合は control + C で抜けます。

おわり

センサー自体、シンプルな構造でデータも簡易的な数値で扱いやすいですね。

今回の開発を通してセンサー、そして電子回路の理解が進みました。

取得したデータを外部に渡したい場合は、Raspberry Pi までデータを取得することができているので、あとは Python で HTTP 通信を使って外部のサーバーへ POST する仕組みを作れば実現できます。

取得したデータを蓄積したり、分析したり、データに応じて任意の端末に通知させたり、様々な使い道があります。

これは夢が広がりんぐ。

こちらからは以上です。

参考記事

ABOUT ME
maechan
ベンチャー、フリーランス、スタートアップを経験。 開発業務、人事業務に従事していました。 現在は農業系スタートアップ企業でエンジニアとして働いています。 リモートワークをしているノマドサラリーマンです。茶道とワークアウトが趣味です。
こんな記事もおすすめ

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です