見出し画像

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

先日 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」を使用しました。

開発ツール一覧

以下、開発に使用したツール一覧です(DHT22はAmazonでリンク切れだったため、今回の実験で使用したブランドとは別のものになります)。

開発の前に

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

Arduino 側の準備

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

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

DTH22 の説明

画像1

Image via: DHT22 – Arduino Project Hub

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

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

接続例:MacBook Pro と Arduino

画像2

接続例は各ツールを以下のように略して説明します。また、上記の「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」ディレクトリにソースを置きます。

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

/// Shell

$ cd ~/Documents/Arduino/libraries
$ git clone https://github.com/adafruit/DHT-sensor-library.git DHTxx
$ cd ~/Documents/Arduino/libraries
$ git clone https://github.com/adafruit/DHT-sensor-library.git DHTxx

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

以下、温度湿度のデータを取得するプログラムです。温度、湿度どちらか一方でも取得ができなかった場合は処理を中断させています。

/// C Language

#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

void setup() {
 Serial.begin(9600); 
 Serial.println("Starting DHT22 Test!"); 
 
 dht.begin();
}

void loop() {
 delay(2000);
 
 float h = dht.readHumidity();
 float t = dht.readTemperature();
 
 if (isnan(h) || isnan(t)) {
   Serial.println("Failed to read from DHT sensor!");
   return;
 }
 
 String postData = "{humidity:";
 postData.concat(h);
 postData.concat(",temperture:");
 postData.concat(t);
 postData.concat("}");
 Serial.println(postData);
}

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

画像3

Raspberry Pi 側の準備

次は、Raspberry Pi で Arduino からのデータを受け取る準備です。Arduino からのデータを処理するプログラミング言語は「Python」を使用します。

接続例:MacBook Pro と Raspberry Pi

画像4

MacBook から Raspberry Pi へ SSH 接続する

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

/// Shell

$ ifconfig
# ブリッジ接続のこいつ
bridge100: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	options=3<RXCSUM,TXCSUM>
	ether f6:0f:24:73:f1:64 
	inet 192.168.2.1 netmask 0xffffff00 broadcast 192.168.2.255
	inet6 fe80::f40f:24ff:fe73:f164%bridge100 prefixlen 64 scopeid 0xf 
	Configuration:
		id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
		maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
		root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
		ipfilter disabled flags 0x2
	member: en4 flags=3<LEARNING,DISCOVER>
	        ifmaxaddr 0 port 14 priority 0 path cost 0
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect
	status: active

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

/// Shell

$ arp -a
? (192.168.2.2) at b8:27:eb:c3:93:59 on bridge100 ifscope [bridge] # ブリッジ接続のこいつ
? (192.168.3.1) at 30:f7:72:ab:ee:2b on en0 ifscope [ethernet]

今回は “192.168.2.2” が Raspberry Pi のローカル IP アドレスになります。ssh コマンドで Raspberry Pi へログインします。パスワードは「raspberry」。

/// Shell

$ ssh pi@192.168.2.2
The authenticity of host '192.168.2.2 (192.168.2.2)' can't be established.
ECDSA key fingerprint is SHA256:MHppVC6NR6cbyJQIH7mclTf0fI5/gus2CNX3T9T5Htc.
Are you sure you want to continue connecting (yes/no)? yes # yesを入力する
Warning: Permanently added '192.168.2.2' (ECDSA) to the list of known hosts.
pi@192.168.2.2's password: # デフォルトのパスワードは「raspberry」
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Aug  8 15:42:04 2017 from 192.168.4.1
SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.
pi@raspberrypi:~ $ # ログイン成功!

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

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

/// Shell

$ sudo raspi-config

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

Raspberry Pi シリアルポート経由でArduinoと連携 – kosakalab

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

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

シリアル通信用ライブラリ「pySerial」

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

/// Shell

$ sudo apt-get install python-pip

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

/// Shell

$ pip install pyserial

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

Arduino からのデータを出力するプログラムを記述します。ファイル名は任意の名前で大丈夫です。

/// Shell

$ nano serial-arduino.py

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

/// serial-arduino.py

import serial
import time

if __name__ == '__main__':
   gpio_seri = serial.Serial('/dev/ttyACM0', 9600, timeout=10)
   print(gpio_seri.portstr)
   time.sleep(3)
   while 1:
       gpio_seri.write('get')
       time.sleep(1)
       data = gpio_seri.readline()
       print(data)

Arduino と Raspberry Pi を USB で接続する

以上で Arduino で取得したデータを Raspberry Pi で受け取る準備は整いました。あとは両端末を USB で接続し、シリアル通信を実行させれば完了です。

接続例:Arduino と Raspberry Pi

画像5

Arduino と Raspberry Pi は直接繋ぐ必要があります。USB ハブ経由で繋ぐと上手く動作しません。

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

画像6

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

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

USB 接続の確認

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

/// Shell

$ dmesg |grep ttyACM0
[275.767302] cdc_acm 1-1.4:1.0: ttyACM0: USB ACM device

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

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

/// Shell

$ python serial-arduino.py
/dev/ttyACM0
Starting DHT22 Test!
{humidity:64.50,temperture:29.90}
{humidity:64.40,temperture:29.80}
{humidity:64.50,temperture:29.90}
{humidity:64.60,temperture:29.90}
{humidity:64.70,temperture:29.90}
{humidity:64.70,temperture:29.80}

上手くデータが受け取れてますね。停止させる場合は「control + C」で抜けます。

おわり

センサー自体、シンプルな構造でデータも簡易的な数値で扱いやすいですね。今回の開発を通してセンサー、そして電子回路の理解が進みました。

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

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

こちらからは以上です。

参考記事

Raspberry Pi 3を外付けモニター・キーボードなしでセットアップする – Qiita
Raspberry Pi | viより直感的!標準エディタ”nano”の使い方ガイド – たぷん日記
ArduinoでDHT11デジタル温度センサーをAdafruitライブラリから使う – Qiita
raspberry Pi A+ と Arduinoでシリアル通信 – 素人がつくってみた
Raspberry PiとArduino間でUSB経由のシリアル通信 – karaage
RaspberryPiとArduinoを連携する【USBシリアル編】 – uepon日々の備忘録
MacとRaspberry piをインターネット共有でつないでみる – Qiita


この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

うれしい〜〜〜!!!
ソフトウェアエンジニア | ものづくりが好きです・ものづくりしている人も好きです | 夢は自分の茶室と果樹園も作ること | Profile: https://profiee.com/i/maechan
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。