プログラミング

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

adrp_top

ArduinoとRaspberry Piを使ったセンサーを開発する機会に恵まれ、ここ最近はずっと物理屋さんになってたmaechan(@maechan0410)です。

センサーに触れるのは初めての経験で四苦八苦しながら開発していました。

今回は「Arduino」と「Raspberry Pi」をUSBシリアル通信で連携しながら、温度湿度を取得するセンサーを開発して得た知見を書いていきます。

開発環境

今回の開発環境は以下になります。

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

Arduinoはスターターキットのものを使用。

Raspberry Piは「MODEL B+」と少し古いのですが、USBポートが付いているのでUSBでシリアル通信は可能なので問題ありません。

温度湿度センサーは「DHT22」を使用。

今回開発に使用したPCは「MacBook Pro」なのですが、接続ポートが「USB-C」ポートのみ存在します

そのため、「USB-C」を「USB」に変換するケーブルが必要です。

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

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

開発の前に

この記事を読み進めるにあたって、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

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

[BB]電源(VCC)は[A]アナログの5Vへ、[BB]抵抗(GND)は[A]アナログのGNDへ繋ぎ、[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をインストールする。

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

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

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

ファイル名は任意の名前でOKです。

以下、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
ベンチャー、フリーランス、スタートアップを経験。 開発業務、人事業務に従事していました。 現在は農業系スタートアップ企業でエンジニアとして働いています。 リモートワークをしているノマドサラリーマンです。茶道とワークアウトが趣味です。