CopyButton

2026年4月29日水曜日

SwitchBot × IFTTT で帰宅前にエアコンを自動 ON【GPS トリガー連携版】

※Claude Codeで記事の自動更新お試し中

この記事は、「帰宅前に自動でエアコンを付けたい」「外部サービスと連携したい」方向けです。IFTTT と SwitchBot を組み合わせることで、GPS 位置情報・天気・時刻など SwitchBot アプリ単体では使えないトリガーでエアコンを操作できます。

3つのアプローチ比較

同じことを実現する方法は3つあります。この記事では IFTTT × SwitchBot の連携方法を解説します。

(1) Raspberry Pi
+ cron
(2) SwitchBot
オートメーション
(3) IFTTT
連携
(本記事)
追加ハードRaspberry Pi 必要不要不要
セットアップPython 実装
+ cron 設定
アプリのみ
(最も簡単)
IFTTTアカウント
+アプレット設定
トリガー制限なし
(Python で自由に)
温度・時刻・
在宅検知など
GPS・天気・
他サービス連携が強み
コストPi の電気代のみ
(約1〜2W)
無料無料プランは
2アプレットまで
ロジックの複雑さヒステリシス・ログ・
拡張など自由
AND/OR 程度IF→THEN の
単純なルール
クラウド依存SwitchBot API のみSwitchBot
クラウドのみ
IFTTT +
SwitchBot クラウド

「アプリだけで済ませたい」なら SwitchBot オートメーション版、「複雑なロジックを書きたい」なら Raspberry Pi 版も参照してください(記事末のシリーズ一覧)。

この記事でできること

  • IFTTT と SwitchBot を連携してエアコンを操作できる
  • 「自宅から 500m 圏内に入ったらエアコン ON」のような GPS トリガーが作れる
  • 天気・時刻・他サービスなど SwitchBot アプリ外のトリガーが利用できる

使ったもの

  • SwitchBot ハブ2(Amazonで確認)— Hub シリーズが IFTTT 連携に対応
  • IFTTT アカウント(無料プランで可、ただし後述の制限あり)
  • スマートフォン(iOS / Android)

注意:IFTTT 無料プランは有効化できるアプレット数が2つまでです。3つ以上使う場合は有料プラン(Pro、月額約600円〜)が必要になります。

事前準備:SwitchBot アプリでエアコンを登録する

Hub 2 でエアコンを操作するには、まずアプリでエアコンの赤外線コードを学習させます。

  1. SwitchBot アプリ → ホーム右上の「+」→「赤外線リモコンを追加」
  2. 「エアコン」→ メーカーを選択(プリセットにあればそのまま使用)
  3. プリセットにない場合は「学習リモコン」で実機リモコンの信号を取り込む
  4. アプリからオン・オフできることを確認する

この操作でエアコンが SwitchBot クラウドに「仮想赤外線リモコン」として登録されます。どの方法でもこの準備は共通で必要です。

IFTTT と SwitchBot の連携手順

1. IFTTT アカウントを作成する

IFTTT の公式サイトでアカウントを作成します。Google アカウントでのサインアップが手軽です。

2. SwitchBot サービスを連携する

IFTTT の検索で「SwitchBot」を探し「Connect」→ SwitchBot アカウントでログインして連携を承認します。

3. アプレットを作成する(例:帰宅前エアコン ON)

「Create」→「If This」→「Location」→「You enter an area」で自宅周辺の円を設定(半径 500m 以上推奨)。「Then That」→「SwitchBot」→「Control your device」でエアコンを ON に設定します。

4. エアコンを OFF にするアプレットも作成する

「You exit an area(エリアから出たら)」または「温度が下がったら」など、状況に応じた OFF ルールを別途作ります。IFTTT 無料プランの2アプレット枠はこれで埋まります。

GPS トリガーの精度について

IFTTT の位置情報トリガーはスマートフォンの GPS を使うため、精度は 100〜500m 程度です。設定エリアの半径を 500m 以上にしておくと誤作動が減ります。また、応答に1〜5分程度の遅延が発生することがあります。「帰宅15分前に ON」を狙うなら半径を 2〜3km にするのが現実的です。

IFTTT 連携の制限

  • 無料プランはアプレット2つまで(ON/OFF で2つ使い切る)
  • IF→THEN の単純なルールのみ(AND/OR 条件は Pro プラン)
  • SwitchBot の IFTTT 連携は Hub シリーズのみ対応(Hub Mini・Hub 2 は対応、独立したセンサー系は不可)
  • IFTTT サービス障害時は動作しない(クラウド依存が2重になる)

※本記事の手順・コードは執筆時点(2026 年 4 月)で動作確認していますが、ライブラリやハードのバージョンが変わるとそのままでは動かない場合があります。動かない場合は コメント欄でお知らせください。

まとめ

IFTTT × SwitchBot で、GPS 位置情報をトリガーにした「帰宅前エアコン自動 ON」が手軽に作れます。SwitchBot アプリ単体では対応できない外部サービス連携が必要な場合に選ぶ方法です。ただし無料プランの2アプレット制限と応答遅延は事前に把握しておくことをおすすめします。

この記事が役に立ったら X(Twitter)でシェアしてもらえると喜びます。

参考

このシリーズの記事

SwitchBot のオートメーションで室温連動エアコン制御をアプリだけで設定する【ノーコード版】

※Claude Codeで記事の自動更新お試し中

この記事は、プログラミングなしでエアコンを温度連動で自動制御したい方向けです。SwitchBot Hub 2 のアプリ内「オートメーション」機能だけで、室温が設定温度を超えたらエアコンを自動でオン・オフする設定が5分で完結します。

3つのアプローチ比較

同じことを実現する方法は3つあります。この記事では SwitchBot アプリのオートメーション機能 を使う方法を解説します。

(1) Raspberry Pi
+ cron
(2) SwitchBot
オートメーション
(本記事)
(3) IFTTT
連携
追加ハードRaspberry Pi 必要不要不要
セットアップPython 実装
+ cron 設定
アプリのみ
(最も簡単)
IFTTTアカウント
+アプレット設定
トリガー制限なし
(Python で自由に)
温度・時刻・
在宅検知など
GPS・天気・
他サービス連携が強み
コストPi の電気代のみ
(約1〜2W)
無料無料プランは
2アプレットまで
ロジックの複雑さヒステリシス・ログ・
拡張など自由
AND/OR 程度IF→THEN の
単純なルール
クラウド依存SwitchBot API のみSwitchBot
クラウドのみ
IFTTT +
SwitchBot クラウド

「GPS や外部サービス連携」なら IFTTT 版、「複雑なロジックを Python で書きたい」なら Raspberry Pi 版も参照してください(記事末のシリーズ一覧)。

この記事でできること

  • SwitchBot アプリだけで温度連動エアコン自動制御が設定できる
  • Raspberry Pi・プログラミングは一切不要
  • 設定時間は5分以内、スマートフォン1台で完結

使ったもの

  • SwitchBot ハブ2(Amazonで確認)— 温湿度センサー内蔵の赤外線ハブ。これ1台で完結します
  • エアコン(赤外線リモコン対応であればメーカー不問)
  • スマートフォン(iOS / Android)

事前準備:SwitchBot アプリでエアコンを登録する

Hub 2 でエアコンを操作するには、まずアプリでエアコンの赤外線コードを学習させます。

  1. SwitchBot アプリ → ホーム右上の「+」→「赤外線リモコンを追加」
  2. 「エアコン」→ メーカーを選択(プリセットにあればそのまま使用)
  3. プリセットにない場合は「学習リモコン」で実機リモコンの信号を取り込む
  4. アプリからオン・オフできることを確認する

この操作でエアコンが SwitchBot クラウドに「仮想赤外線リモコン」として登録されます。どの方法でもこの準備は共通で必要です。

オートメーションの設定手順

1. オートメーション画面を開く

SwitchBot アプリ下部メニューの「オートメーション」タブをタップします。右上の「+」で新規作成します。

2. 条件(IF)を設定する — エアコンをONにするルール

「条件を追加」→「デバイスの状態」→「Hub 2」→「温度」→「28℃ 以上」を選択します。

3. アクション(THEN)を設定する

「アクションを追加」→「デバイスを制御」→「エアコン」→「電源オン」を選択します。必要であれば設定温度・モードも指定できます。

4. オートメーションを保存・有効化する

名前(例:「暑くなったらエアコンON」)を入力して保存し、トグルをオンにします。

5. OFFにするルールも追加する

上記と同じ手順で「25℃ 以下になったらエアコンOFF」のルールを別途作成します。ON だけでは永久に動き続けるため、必ずセットで設定してください。ON / OFF の温度に差をつけることで(ヒステリシス)、温度がしきい値付近でエアコンが頻繁にオン・オフするのを防げます。

応用:時間帯制限を加える

深夜に動作させたくない場合は、条件に「時刻:8:00〜23:00」を AND 条件で追加します。「デバイスの状態」と「時刻」を両方条件に入れると、両方が満たされたときだけ動作します。

SwitchBot オートメーションの制限

  • 条件は AND/OR の組み合わせまで。複雑な分岐や計算はできない
  • 動作ログは「アクティビティ履歴」で確認できるが、CSV 出力などはできない
  • GPS 位置情報トリガーは非対応(帰宅前に自動 ON したい場合は IFTTT 版を参照)

※本記事の手順・コードは執筆時点(2026 年 4 月)で動作確認していますが、ライブラリやハードのバージョンが変わるとそのままでは動かない場合があります。動かない場合は コメント欄でお知らせください。

まとめ

SwitchBot オートメーションは追加費用・追加ハードなしで温度連動エアコン制御が実現できる最もシンプルな方法です。まずここから始めて、物足りなくなったら IFTTT や Raspberry Pi の方法に移行するのがおすすめです。

この記事が役に立ったら X(Twitter)でシェアしてもらえると喜びます。

参考

このシリーズの記事

SwitchBot API × Raspberry Pi 5 で部屋のエアコンを自動制御する【2026年版】

※Claude Codeで記事の自動更新お試し中

この記事は、SwitchBot Hub 2 でエアコンを温度連動で自動制御したいエンジニア向けです。Python スクリプトと cron を使って、室温に応じてエアコンを自動でオン・オフする仕組みを Raspberry Pi 5 上に構築します。

3つのアプローチ比較

同じことを実現する方法は3つあります。この記事では Raspberry Pi + Python + cron の方法を解説します。

(1) Raspberry Pi
+ cron
(本記事)
(2) SwitchBot
オートメーション
(3) IFTTT
連携
追加ハードRaspberry Pi 必要不要不要
セットアップPython 実装
+ cron 設定
アプリのみ
(最も簡単)
IFTTTアカウント
+アプレット設定
トリガー制限なし
(Python で自由に)
温度・時刻・
在宅検知など
GPS・天気・
他サービス連携が強み
コストPi の電気代のみ
(約1〜2W)
無料無料プランは
2アプレットまで
ロジックの複雑さヒステリシス・ログ・
拡張など自由
AND/OR 程度IF→THEN の
単純なルール
クラウド依存SwitchBot API のみSwitchBot
クラウドのみ
IFTTT +
SwitchBot クラウド

「アプリだけで済ませたい」なら SwitchBot オートメーション版、「GPS 連動や外部サービス連携」なら IFTTT 版も参照してください(記事末のシリーズ一覧)。

この記事でできること

  • SwitchBot API v1.1 を Python から叩いてデバイスを操作できる
  • Raspberry Pi 5 上で室温を5分ごとに取得し、条件分岐でエアコンを制御できる
  • ヒステリシスつきの温度制御で、頻繁なオン・オフを防げる

使ったもの

構成の概要

Raspberry Pi 自体には赤外線モジュールは不要です。Pi は SwitchBot API に HTTPS でコマンドを送るだけで、実際に赤外線を飛ばすのは SwitchBot Hub 2 が担います。

Raspberry Pi 5

HTTPS(SwitchBot API v1.1)
SwitchBot Hub 2

赤外線
エアコン

事前準備:SwitchBot アプリでエアコンを登録する

Hub 2 でエアコンを操作するには、まずアプリでエアコンの赤外線コードを学習させます。

  1. SwitchBot アプリ → ホーム右上の「+」→「赤外線リモコンを追加」
  2. 「エアコン」→ メーカーを選択(プリセットにあればそのまま使用)
  3. プリセットにない場合は「学習リモコン」で実機リモコンの信号を取り込む
  4. アプリからオン・オフできることを確認する

この操作でエアコンが SwitchBot クラウドに「仮想赤外線リモコン」として登録されます。どの方法でもこの準備は共通で必要です。

事前準備②:SwitchBot API トークンの取得

SwitchBot アプリのバージョン表示を 10回タップ するとデベロッパーオプションが開きます。

  1. SwitchBot アプリ → プロフィール → 設定
  2. 「アプリバージョン」を10回タップ
  3. 「開発者向けオプション」→「トークンを取得」
  4. Token と Client Secret をメモする
export SWITCHBOT_TOKEN="your_token_here"
export SWITCHBOT_SECRET="your_secret_here"

デバイス一覧の取得

エアコンは通常の deviceList ではなく infraredRemoteList に入っています。まず両方を確認します。

import hashlib, hmac, base64, time, uuid, requests, os

TOKEN  = os.environ["SWITCHBOT_TOKEN"]
SECRET = os.environ["SWITCHBOT_SECRET"]

def get_headers():
    t   = str(round(time.time() * 1000))
    n   = str(uuid.uuid4())
    msg = TOKEN + t + n
    sig = base64.b64encode(
        hmac.new(SECRET.encode(), msg.encode(), hashlib.sha256).digest()
    ).decode()
    return {
        "Authorization": TOKEN,
        "t": t, "nonce": n, "sign": sig,
        "Content-Type": "application/json",
    }

r = requests.get("https://api.switch-bot.com/v1.1/devices", headers=get_headers())
body = r.json()["body"]

print("--- 物理デバイス(Hub 2 等)---")
for d in body["deviceList"]:
    print(d["deviceId"], d["deviceName"], d["deviceType"])

print("--- 赤外線リモコン(エアコン等)---")
for d in body["infraredRemoteList"]:
    print(d["deviceId"], d["deviceName"], d["remoteType"])

出力例:

--- 物理デバイス ---
YYYYYYYY  リビングHub2        Hub 2

--- 赤外線リモコン ---
XXXXXXXX  リビングのエアコン   Air Conditioner

室温の取得

def get_temperature(device_id):
    url = f"https://api.switch-bot.com/v1.1/devices/{device_id}/status"
    r = requests.get(url, headers=get_headers())
    body = r.json()["body"]
    return body["temperature"], body["humidity"]

temp, hum = get_temperature("YYYYYYYY")  # Hub 2 のデバイスID
print(f"室温: {temp}℃  湿度: {hum}%")

エアコンの操作

def control_ac(device_id, command):
    url = f"https://api.switch-bot.com/v1.1/devices/{device_id}/commands"
    payload = {
        "command": command,       # "turnOn" or "turnOff"
        "parameter": "default",
        "commandType": "command",
    }
    r = requests.post(url, headers=get_headers(), json=payload)
    return r.json()["statusCode"]

AC_ID    = "XXXXXXXX"   # infraredRemoteList で確認したエアコンの ID
HUB_ID   = "YYYYYYYY"   # deviceList で確認した Hub 2 の ID
ON_TEMP  = 28
OFF_TEMP = 25

temp, _ = get_temperature(HUB_ID)
if temp >= ON_TEMP:
    control_ac(AC_ID, "turnOn")
    print(f"{temp}℃ → エアコン ON")
elif temp <= OFF_TEMP:
    control_ac(AC_ID, "turnOff")
    print(f"{temp}℃ → エアコン OFF")

ON_TEMP と OFF_TEMP に差をつける(ヒステリシス)ことで、28℃ をまたいだだけでエアコンが連続オン・オフするのを防いでいます。

cron で自動実行する

$ crontab -e

# 5分ごとに室温チェック
*/5 * * * * /usr/bin/python3 /home/pi/ac_control.py >> /home/pi/ac_control.log 2>&1

※本記事の手順・コードは執筆時点(2026 年 4 月)で動作確認していますが、ライブラリやハードのバージョンが変わるとそのままでは動かない場合があります。動かない場合は コメント欄でお知らせください。

まとめ

SwitchBot Hub 2 があれば Raspberry Pi に赤外線モジュールは不要で、Python から API を叩くだけでエアコンを自動制御できます。ヒステリシス・ログ・時間帯制限など SwitchBot アプリでは難しいロジックが自由に実装できるのが最大のメリットです。

この記事が役に立ったら X(Twitter)でシェアしてもらえると喜びます。

参考

このシリーズの記事

2023年1月9日月曜日

SDカードサイズ液晶のゲーム機を作る

Raspberry Pi W と同じサイズの液晶&ジョイスティックの基板を使って、1.4インチ液晶のコントローラー一体型ファミコンを作ってみました。
こんな感じ。



ボードを買ったら取説も何もないし取説通りやってもゲーム画面出てこないし、、、とまぁまぁ試行錯誤したので上手くいく方法をメモします。

大まかな流れは次の通り。
  1. SDカードにゲームエミュレータ(Retropie)同梱の OS(Raspbian)をインストール
  2. WiFi & SSH を設定してRaspberry Pi Zero W に接続
  3. 液晶のドライバをインストール
  4. 液晶基板に付いているジョイスティックを有効化
  5. 遊ぶ

材料

Amazonで確認
Pi Zero でも良いのですが WiFi 付いていた方が作業が楽です。
Amazon は無茶苦茶ぼったくりの値段になっていることがあるので要注意。

Amazonで確認
今回のメインのパーツです。
Amazon の説明には取説付きと書いてありますが一切ついておらず、チップの種類も不明。
何も情報なしでぶつかると手も足も出なくて詰みます。

そのほか、SDカードとかモバイルバッテリー、USBケーブルは適当に。

Raspberry Pi に Retropie をインストールする

Raspberry Pi の公式サイトからOS Imagerをダウンロードして PCにインストールします。
Imager の使い方は非常にわかりやすいので説明を省略します。

ここでインストールするOSは普通の Raspbian ではなくてこれです。
Emulation and game OS → Retropie → Retropie 4.8 (RP 1/Zero)

WiFi & SSH を有効化する

SDカードにOSを書き込んだら自動でアンマウントされるので、SDカードを抜き差しして再度PCにマウントします。
  1. 「boot」フォルダがマウントされるので、フォルダ直下にwpa_supplicant.confという名前のファイルを作成し、以下の内容をコピペ。
    country=JP
    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    network={
            ssid="{SSID}"
            psk="{平文のWiFiパスワード}"
    }
  2. 「boot」フォルダ直下に「ssh」という名前の空のテキストファイルを作成。
    これでRaspberry Pi の初回起動時に SSH が有効化されます。

Raspberry Pi Zero W に SSH 接続する

SDカードを Raspberry Pi Zero W に挿入してモバイルバッテリーを接続。
液晶の表示は真っ白ですがこの時点では気にしなくてOKです。

WiFi の設定が上手くいっていれば、しばらくして PCから「retropie.local」というホスト名に ping を打つと応答が返ってきます。
ping retropie.local
さらにその後、SSH が起動すれば「pi@retropie.local」にSSH接続するとログインできます。
デフォルトパスワードは「raspberry」ですね。

液晶モニタのドライバをインストール

Waveshare のマニュアルに沿ってドライバを入れていきます。
https://www.waveshare.com/wiki/1.44inch_LCD_HAT
  1. raspi-config でSPI Interfaceを有効化
    sudo raspi-config
    「Interfacing Options > SPI > Yes」を選択
    sudo reboot
    
  2. BCM2835ライブラリをインストール
    wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz
    tar zxvf bcm2835-1.71.tar.gz
    cd bcm2835-1.71/
    sudo ./configure && sudo make && sudo make check && sudo make install
    
  3. wiringPiライブラリをインストール
    sudo apt-get install wiringpi
    wget https://project-downloads.drogon.net/wiringpi-latest.deb
    sudo dpkg -i wiringpi-latest.deb
    gpio -v
    # v2.5.xのバージョンが表示されればOK
    
    git clone https://github.com/WiringPi/WiringPi
    cd WiringPi
    ./build
    gpio -v
    # v2.6かv2.7が表示されればOK
マニュアルではこの後で Python のライブラリをインストールしていますが、今回は不要です。


FBCPドライバをインストール

フレームバッファーの制御をするドライバらしいですがよく分かりません。
この手順を実行するとようやく画面にコンソールが表示されます、、、が、あまりに文字が小さすぎて全く読めません。
  1. ドライバをビルド
    cd ~
    sudo apt-get install cmake -y
    sudo apt-get install p7zip-full -y
    wget https://www.waveshare.com/w/upload/f/f9/Waveshare_fbcp.7z
    7z x Waveshare_fbcp.7z -o./waveshare_fbcp
    cd waveshare_fbcp
    mkdir build
    cd build
    cmake -DSPI_BUS_CLOCK_DIVISOR=20 -DWAVESHARE_1INCH44_LCD_HAT=ON -DBACKLIGHT_CONTROL=ON -DSTATISTICS=0 ..
    make -j
    sudo ./fbcp
  2. 起動時に読み込まれるように設定
    sudo cp ~/waveshare_fbcp/build/fbcp /usr/local/bin/fbcp
    sudo nano /etc/rc.local
    # rc.local 末尾の「exit 0」の手前に「fbcp &」を追記
  3. 画面解像度を設定
    /boot/config.txt の末尾に設定を追記。
    Raspberry Pi 4 の場合は追加の設定が必要なので適宜 Waveshare のマニュアルに従ってください。
    hdmi_force_hotplug=1
    hdmi_cvt=300 300 60 1 0 0 0
    hdmi_group=2
    hdmi_mode=87
    display_rotate=0
  4. 再起動
    sudo reboot


Retropie の画面を液晶に表示する

ここまでの手順で液晶にコンソールは表示されるのですが、Retropie (emulation station)の画面は表示されません。
そこで、raspi-config で「Advanced > GL Driver」から「Fake KMS」を有効化します。
うまくいかない場合は「Full KMS」でもいいらしいです。
設定後に再起動するとemulation stationの起動画面が出るようになるはず。

ところが、コントローラーの設定画面になってしまい、ジョイスティックが認識されていないために何もできません。
もしUSB接続のコントローラーが手元にあるようなら、Raspberry Pi Zero W の Micro USB に接続すると操作できます。


ジョイスティックを有効化する

emulation station にジョイスティックを認識させるのに地味に手間取ったのですが、このページが参考になりました。
てきとうにブログ 〜 ラズパイZEROのたとえ(例)

curl -O https://raw.githubusercontent.com/adafruit/Raspberry-Pi-Installer-Scripts/master/retrogame.sh
sudo bash retrogame.sh
# よくわからないけど「3」を選択
再起動後に「/boot/retrogame.cfg」に次のように記載します。
LEFT 5 # Joypad left
RIGHT 26 # Joypad right
UP 6 # Joypad up
DOWN 19 # Joypad down
LEFTCTRL 13 # 'A' button JOY PRESS
LEFTALT 16 # 'B' button BTN3
Z 20 # 'X' button BTN2
X 21 # 'Y' button BTN1
ESC 13 16 # Exit ROM JOY + BTN3
この記載内容はここからパクりました。
MELTWATER's RASPBERRY PI HARDWARE
実際には再起動後にジョイスティックとボタンが動作するようになり、改めてキーアサインを設定する画面が表示されるので後から変更可能です。


遊ぶ

retropie.local をファイル共有で参照し「roms」フォルダに ROM ファイルをコピーします。
サンプルの ROM は retropie のイメージなどに入っていることがあるのでそれを使うのが手っ取り早いです。
手持ちのファミコンカセットから抜く方法は他のサイトをご参照。

出来上がるとこんな感じに。




2020年4月18日土曜日

液晶モニタを1,500円で石膏ボードに壁掛けする

在宅勤務になってリビング脇で仕事していたら、家族が気を遣うと言うことで追い出されることに。
寝室の片隅に机を入れたものの、奥行きが無いので液晶モニタの壁掛けに挑戦。

Amazonで確認
・・・と思ったのですが、普通にamazonで調べると、石膏ボード用の壁掛け金具は1万円オーバー。
もうちょっと安上がりにならないかと調べたところ1,500円で実現できました。
必要なものはこの2つだけ。

四角い留め具は貧相に見えますが、金属製のパンチングボードを固定するもので耐荷重が20kgもあります。
液晶モニタは24インチで5kg前後なので余裕で支えられます。
石膏ボード用のピンで固定するため壁にもほとんど痕が残りません。

液晶モニタはVESA規格であれば何でもOK。
VESA規格対応のモニタは背面に4つネジ穴が開いています。

で、出来上がりはこんな感じ。
おしまい。

2019年3月3日日曜日

NOOBS+Raspberry PiにRaspbian+Node-REDを入れてDHT11で温度測定

NOOBSがSDカードにプリインストールされているRaspberry Piのキットが売られているようです。
これを使ってRaspbian、Node-REDをセットアップします。
さらにNode-RED上でDHT11の値を取得してクラウドにデータを送るところまでやってみます。

材料

Amazonで確認
Raspberry Pi 3B+ に NOOBS プリインストール SD カードがセットになっているスタータキット。
ハードウェア的には一通り揃っていますが、OS (Raspbian) が動くようにするまで一手間かかります。

Amazonで確認
激安の小型ブレッドボード。
6個も何に使うんだよ、という気もしますが。

Amazonで確認
DHT11 温湿度センサ。
A/Dコンバータが内蔵されているのでとりあえずセンサを扱いたい時におすすめ。
ただし、Node-REDを使う場合はライブラリを別途入れる必要があります。

Amazonで確認
発光ダイオードの5色セット。100個入り!
電光掲示板でも作るつもりかよ、と言いたくなる量ですが、少量で買っても別に安くならないのでまとめ買い推奨。
DHT11とは関係ないですがGPIOの動作確認用。

Amazonで確認
各種抵抗600本入り!
多いことは美しい。

NOOBSとは?

NOOBSをSDカードにファイルとして書き込んでおくことで、初回起動時にRaspbianのインストーラが起動します。
Raspbian以外のOSもインストールできるようですが、Raspbianであればネットワーク不要でインストールできます。
NOOBSのオリジナルファイルはここからダウンロードし、WindowsやMacであらかじめSDカードに書き込んでおきましょう。
(キットを購入した場合は書き込み済み。)

NOOBSからRaspbianをインストールする際は1時間くらい掛かるので要注意。

NOOBSでRaspbianをインストール

あらかじめSDカードに設定を書き込んでおくと、Raspbianのインストールをヘッドレス(モニタなし)でできます。
やり方はこのあたりのブログで詳しく説明されています。
Tom's Hobby「【ラズパイ】Raspberry Pi NOOBS Wifi設定、VNCインストールなど事前設定しておく【インストール】」

NOOBSからRaspbianをインストールする方法はこのあたりを参照。
このステップでかなり時間がかかります。
第56回「改めましてラズベリーパイの基本!(1) Raspberry Pi NOOBSインストール 2017年度版」

WiFi設定してSSHを有効化する

Raspbianセットアップが済んだSDカードにMacやWindowsから設定ファイルを書き込んでおくと、Raspberry Piにモニタをつながなくても続きの作業ができるようになります。

●Macで設定する場合
「Raspberry Pi Zero W をヘッドレスでWiFi対応セットアップする」

●Windowsで設定する場合
Macの場合と同様に次の2つのファイルを書き込めばOKです。

(1) {SDカードのドライブ名}¥boot¥wpa_supplicant.conf
通常は設定済みのRaspberry Piから/etc/wpa_supplicant/wpa_supplicant.confをコピーするのが簡単です。
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="{SSIDを書く}"
        #psk="{WiFiパスワード}"
        psk=暗号化したWiFiパスワード
}
(2) {SDカードのドライブ名}¥boot¥ssh
このファイル名で空ファイルを置きます。

●セットアップ中のRaspberry Piにモニタを繋いで設定する場合
「Raspberry Pi3 に液晶モニタを付けて一体型 PC に」
SSHは「sudo raspi-config」コマンドから「5 Interfacing Options」でSSHを有効化すれば使えるようになります。

WindowsからSSH接続する

まず、Raspberry PiのIPアドレスを調べます。
Raspberry Piのターミナル上で次のコマンドを打てばIPアドレスがわかります。
$ ifconfig

WindowsでSSHを頻繁に使う場合はTeraTermをインストールします。
一時的にSSH接続したいだけの場合はDOSプロンプトでも大丈夫です。

Windows上で次のように進めるとWindowsからRaspberry PiにSSH接続できます。
(1) WindowsでDOSプロンプトを開く。(タスクトレイで「DOS」と検索すると出てきます。)
(2) 次のコマンドを実行。
ssh pi@{Raspberry PiのIPアドレス}
(3) 初回は何か質問されるのでYESを答える。 (4) piユーザのデフォルトパスワードは「raspberry」

パスワードを変更する

デフォルトパスワードのまま公衆WiFiなどに接続するとあっさり乗っ取られます。
(そもそもRaspberry Piで公衆WiFiにつなぐなよ、という気もしますが。。。) 次のコマンドでパスワードを変更。
$ passwd

Node-REDをセットアップする

ここまででようやくRaspberry Piをコマンドラインで操作できるようになりました。
Node-REDをセットアップして、ブラウザからRaspberry Piの動作を定義できるようにします。
最近はRaspbianに標準でインストールされていますが、バージョンが古いなど問題がある場合はアップデートした方が良いかもしれません。

Node-REDのセットアップについては過去記事、、、と言いたいところですが、以下のコマンドをSSHで実行するだけです。
$ bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

Node-REDでLチカ

Node-REDとGPIOの動作確認としてLチカさせます。
※Lチカ=LEDをチカチカさせること。ソフトウェアで言うところの「Hello World」みたいなもの。
世の中には詳しいブログがたくさんあるのでそっちを見てください。
oh-maker「Raspberry PiとNode-REDでLチカ」

Node-REDでDHT11をつかえるようにする

Node-REDでGPIOを使えることが分かったので、DHT11と繋ぎます。
DHT11から値を取得するには、SSH接続(もしくはローカルのターミナル)で少し準備が必要です。
設定方法はこのブログが分かりやすいです。
EPIPE「Raspberry Pi + Node-RED + DHT11 で温度・湿度取得」

ノードのつなぎ方はここを参考に。
ラズパイで始めるIoTハンズオン

ちなみに、GPIOのピン番号はRaspberry Piの公式サイトにドキュメントがあります。
GPIO - Raspberry Pi Documentation

Node-REDで取得した温度をクラウドに飛ばす

Node-RED のノードリストの「ソーシャル」にある email ノードを使うと簡単にメールを飛ばせます。
デフォルトで Gmail の SMTP サーバ(メール送信サーバ)が指定されているので、自分のGoogleアカウントの情報を設定するだけです。

もう少し頑張りたい場合は Twitter に飛ばすこともできますが、事前にTwitter API keyを取得しておく必要があります。
Qiita Twitter のAPIキーの取得方法が変わった

Node-REDからTwitterにダイレクトメッセージを飛ばす方法はここで解説されています。
Qiita「Node-RED で Twitter ダイレクト・メッセージ を送る場合の備忘録」

2019年1月16日水曜日

光を追いかける自動走行車:(2)A/D変換とは?

Raspberry Pi でアナログセンサの値を取得するために、前回掲載したA/Dコンバータを使います。

arduinoをよく使う人は、ここで「あれ?」と思うかもしれません。
と言うか、私は思いました。

Arduino UNOなどのアナログ入力ピンは、A/Dコンバータ(ADC)なしでアナログセンサを接続することができます。
実は、Arduino UNOなどに使われているマイコンチップ ATmega328P は、チップにADCが埋め込まれているので
アナログ入力ピンに繋ぐといきなりA/D変換後の値を取得できます。

ところで、ハードウェア屋さんにとってはA/D変換は常識ですが、IT屋さんは、
A/D変換というのを分かっているようで分かっていないことが多いです。
そもそも、「アナログ」と「デジタル」の違いも実は怪しい人が少なくありません。
と言うか、私は分かっていませんでした。

と言うわけで、今回はA/D変換について。
  1. 材料を揃える
  2. A/D変換とは?(今回)
  3. コンバータからSPI通信で値を取得する
  4. Raspberry PiのPWMで擬似アナログ出力する
  5. モータドライバでモータ制御する
  6. 光センサからの入力とモータ制御を連動させる

アナログ値とデジタル値とA/D変換

意外とよくあるのが「実数値=アナログ値」という勘違いです。
プログラム中で値を参照できている時点でそれは全て「デジタル値」です。

また、「アナログ入力から取得した値は連続値が取れる」という勘違いもよくあります。
アナログ値がA/D変換された時点で実数の離散値になります。

さらに厄介なのが「A/D変換後の値は工学値ではない」という罠。
当然ですが、デジタル値 20(0x14) は温度20度ではありません。

ざっくり絵で描くとこんな感じ。
(1) センサの役割
大抵のアナログセンサは環境変化によって抵抗値が変化します。
この変化の仕方はセンサの特性として決まっていて、非線形なことが多いようです。
例えば、明るさが2倍になっても抵抗が2倍や0.5倍になるわけではありません。
ここまでがアナログセンサのお仕事。

(2) A/Dコンバータの役割
次に、アナログセンサをA/Dコンバータに繋いでA/D変換します。
センサの抵抗値が変わると言うことは、その両端での電圧の値が変わります。
A/Dコンバータはそれを決められたビット数に量子化します。
例えば、最大5Vの8bit A/Dコンバータなら0〜5Vを256分割。(たぶん)
本当はもっと賢いことをやっているらしいのですがイメージとしてはそんな感じ。

(3) 工学値変換の役割
最終的に摂氏などの工学値が欲しい場合はデジタル値を工学値に戻します。
センサ特性が非線形なので工学値変換も非線形になります。
また、(2)の時点で離散値になっているので、変換した工学値も離散値です。

多くの場合、A/D変換後の値をソフトウェア的に変換してやる必要がありますが、この工学値変換曲線を作るのが結構難しいと思います。
モジュール化して売られているアナログセンサの中にはは、メーカーから配られているライブラリを使うと(1)〜(3)をまとめてやってくれるものもあるようです。(温湿度センサのDHT11など)

小学生に説明してみた

A/D変換について小学四年生に説明してみました。
どこまで伝わったかは謎。



A/D変換の話が長くなってしまったので、A/Dコンバータの使い方はまた次回。
次回はSPI通信を使ってA/Dコンバータから値を取得します。