ESP32 で Sigfox をはじめる

ESP32 で Sigfox をはじめる

はじめに この記事では、ESP32 と Sigfox ブレイクアウトボード BRKLSM100A を使って、WiFiの届かない数キロメートル先の基地局へセンサーデータを送信する方法を解説します。Sigfox は年間1000円程度・アクセスポイント不要で使える LPWAN サービスで、ESP-NOW や BLE が届かない広域 IoT 通信に適しています。ATコマンドの設定手順から Sigfox クラウドの Callback 設定(Slack 通知)まで、実際に躓いた点も含めて紹介します。 Sigfox の具体的な設定方法や技術的な質問にはお答えできませんのでご了承ください。 Sigfoxとは Sigfox は、低消費電力の広域ネットワーク(LPWAN: Low Power Wide Area Network)技術の一つで、主に IoT デバイス向けに設計されています。LPWANは0G回線とも呼ばれています。Sigfox サービスを展開するのはフランスの会社ですが、日本では 京セラさんが代理店 として窓口に立ってくれています。なにか分からないことがあれば、京セラさんが丁寧にご回答してくれます。 https://www.kccs.co.jp/contact/sigfox/inquiry/ 以下、Sigfox の特徴をまとめておきます。 低消費電力 デバイスのバッテリー寿命が数年に渡ることが可能です。通信頻度が低く、消費電力が非常に少ない設計になっています。Sigfox デバイスを制御するには、UART の AT コマンドを使います。Arduino や ESP32、または PIC などでも制御できます。低消費電力の PIC であれば、Sigfox デバイスと組み合わせて太陽電池やリチウム電池で長期間運用も実現可能です。 広範囲カバー Sigfox デバイスから Sigfox 基地局(Sigfox ゲートウェイ)まで、数キロメートルから数十キロメートルにわたる広範囲の通信が可能です。都市部では数キロメートル、農村部では数十キロメートルの通信距離をカバーします。Sigfox GW(ゲートウェイ)は自前で用意する必要はありません。下記 URL に Sigfox 通信できるエリアが示されています。日本の首都圏で広く展開されており、山間部などの一部地方ではつながらない場合があります。 https://www.kccs.co.jp/sigfox/area/ 世界中の多くの国で利用可能で、国境を越えた通信が容易に行えます。Sigfox のネットワークオペレーターがインフラを提供します。 低データレート 1回の通信で最大12バイトのペイロードを送信できます。16進数2文字で1バイトなので、最大24桁の16進文字列(例: 0123456789ABCDEF01234567)まで送れます。センサ値をバイナリに詰めて16進文字列として送れば、12バイト内に複数の値を収められます。一日の送信回数に制限があり、通常は140回までです。 ...

公開: 2024年6月28日 · 更新: 2026年5月25日 · Toshihiko Arai
ダイソーのBluetoothリモコンシャッターをESP32でハックする

ダイソーのBluetoothリモコンシャッターをESP32でハックする

ダイソーで販売されている300円のBluetoothリモコンシャッター(Remote Shutter)を、ESP32側から BLE HIDデバイス として検出・接続し、ボタンが押されたタイミングで LED を点灯/消灯させてみました。スマホ用のシャッターリモコンを、自作IoTのトリガーとして再利用するイメージです。 この記事では、ESP32とリモコンシャッターをBLEで繋ぐ最小スケッチ、PlatformIO 側で踏みやすい arduino-esp32 のバージョン問題、そして同じ仕組みを使いやすくまとめた自作ライブラリ「BlueShutHacker」の使い方までを紹介します。ESP32でのBLE開発の流れを掴みたい方や、安価な市販Bluetoothデバイスを入力源として使い回したい方向けです。 実装にあたっては、下記の二つの記事をとても参考にさせていただきました。 https://wakwak-koba.hatenadiary.jp/entry/20181009/p1 https://lang-ship.com/blog/work/m5stickc-esp32-bluetooth-shutter-1-0-4/ 動画を再生 必要なもの 最小構成で動かす場合に用意したものは次の通りです。 ESP32 開発ボード(ESP32 DevKitC など、BLE対応のもの) ダイソーの Bluetooth リモコンシャッター(300円・ボタン電池付属) LED 1個と電流制限抵抗(330Ω 前後)、配線用ジャンパー線 PlatformIO(VS Code または CLion)または Arduino IDE ESP32 自体の最初の動作確認がまだの場合は、先に ESP32でLチカするまでの設定 で Arduino IDE からの書き込みまで通しておくと、本記事の内容に集中できます。 リモコンシャッターでLチカさせる ESP32をつかって、リモコンシャッターのボタンが押されたらLEDの点灯状態を変化させてみました。 ソースコード こちらがそのソースコードです: #include <Arduino.h> #include "BLEDevice.h" #define LED_PIN 13 static uint16_t GATT_HID = 0x1812; //static BLEUUID GATT_HID_REPORT((uint16_t) 0x2a4d); static BLEAddress *pServerAddress = NULL; class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks { void onResult(BLEAdvertisedDevice advertisedDevice) { if (advertisedDevice.haveServiceUUID() && advertisedDevice.getServiceUUID().equals(GATT_HID)) { advertisedDevice.getScan()->stop(); pServerAddress = new BLEAddress(advertisedDevice.getAddress()); Serial.print("found device:"); Serial.println(pServerAddress->toString().c_str()); // 2a:07:98:10:33:fa } } }; void updateLedState() { static boolean ledState = true; if (ledState == 0) { digitalWrite(LED_PIN, LOW); } else { digitalWrite(LED_PIN, HIGH); } ledState = !ledState; } static void notifyCallback(BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t *pData, size_t length, bool isNotify) { Serial.println("notifyCallback"); switch (pData[0]) { case 0x01: // Volume Up Serial.println("Volume Up"); updateLedState(); break; case 0x02: // Volume Down Serial.println("Volume Down"); updateLedState(); break; } } void setup() { Serial.begin(115200); pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, LOW); BLEDevice::init(""); BLEScan *pBLEScan = BLEDevice::getScan(); pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); pBLEScan->setActiveScan(true); pBLEScan->start(30); } void loop() { static boolean connected = false; if (pServerAddress != NULL && !connected) { BLEClient *pClient = BLEDevice::createClient(); pClient->connect(*pServerAddress); if(pClient->isConnected()) { Serial.println("connected"); } else { return; } //! arduino-esp32のバージョンによってはクラッシュするので注意 //! ver 2.0.2 だとここで落ちる → ver 2.0.14 または ver 3.20014.0 で動作確認済み BLERemoteService *pRemoteService = pClient->getService(GATT_HID); if (pRemoteService) { // BLERemoteCharacteristic *pRemoteCharacteristic = pRemoteService->getCharacteristic(GATT_HID_REPORT); // pRemoteCharacteristic->registerForNotify(notifyCallback); std::map<uint16_t, BLERemoteCharacteristic*>* mapCharacteristics = pRemoteService->getCharacteristicsByHandle(); for (std::map<uint16_t, BLERemoteCharacteristic*>::iterator i = mapCharacteristics->begin(); i != mapCharacteristics->end(); ++i) { Serial.print("connected to:"); Serial.println(i->second->getUUID().toString().c_str()); if (i->second->canNotify()) { Serial.println(" - Add Notify"); i->second->registerForNotify(notifyCallback); } } connected = true; } } delay(10); // 高負荷防止 } 注意点 ソースコードをアップロードするにあたって、注意点があります。PlatformIO を使う場合、arduino-esp32 のバージョンが古いとクラッシュします。ソースコード内のコメント注釈のとおり、version 2.0.2 だとダメでした。version 2.0.14 以降であれば問題なさそうです。 ...

公開: 2024年3月14日 · 更新: 2026年5月28日 · Toshihiko Arai

ESP32のマルチスレッドで複数のサーボモータを同時に動かす方法

ESP32とFreeRTOSのタスク(マルチスレッド)機能を使って、2つのサーボモータを同時に動かす方法をまとめます。delay 関数だけだと一方の処理待ちでもう一方が止まり、複数のサーボを別々のリズムで動かすのが難しいです。本記事では ESP32Servo ライブラリと xTaskCreate を組み合わせ、それぞれのサーボを独立したタスクで制御します。 必要なものはESP32ボード(ESP32 DevKitCなど)、SG90のようなサーボモータ2個、サーボ用の外部5V電源、Arduino IDEまたは PlatformIO のいずれかです。実際の動作は次の動画で確認できます。 動画を再生 なんの工夫もなしに delay 関数を使ってサーボモータを動かそうとすると、ひとつのサーボモータの処理が終わるまで待たなければならず、同時に動かすことが難しいです。非ブロッキングなポーリング処理(コルーチン)で動かすやり方も考えられますが、コーディングが複雑になり管理が難しいです。ESP32ならばFreeRTOSのタスク機能(マルチスレッド)が使えますので、簡単に複数のサーボモータを動かすことが可能です。 ソースコード 次のコードは、FreeRTOSのタスク利用してマルチスレッドで複数サーボモータを制御する例です: #include <Arduino.h> #include <ESP32Servo.h> #define SERVO_A_PIN 32 #define SERVO_B_PIN 33 Servo servoA, servoB; const int pulse_min = 544; // default 544us const int pulse_max = 2400; // default 2400us // プロトタイプ宣言 void taskServoA(void * parameter); void taskServoB(void * parameter); void setup() { Serial.begin(115200); servoA.attach(SERVO_A_PIN, pulse_min, pulse_max); servoB.attach(SERVO_B_PIN, pulse_min, pulse_max); servoA.write(5); // リセット servoB.write(5); // リセット delay(2000); // FreeRTOSを使用してタスクを作成 xTaskCreate(taskServoA, "TaskServoA", 10000, NULL, 1, NULL); xTaskCreate(taskServoB, "TaskServoB", 10000, NULL, 1, NULL); } void loop() { } void taskServoA(void * parameter) { for (;;) { for (int pos = 5; pos <= 180; pos += 1) { servoA.write(pos); vTaskDelay(2 / portTICK_PERIOD_MS); } vTaskDelay(700 / portTICK_PERIOD_MS); for (int pos = 180; pos >= 5; pos -= 1) { servoA.write(pos); vTaskDelay(2 / portTICK_PERIOD_MS); } vTaskDelay(700 / portTICK_PERIOD_MS); } } void taskServoB(void * parameter) { for (;;) { for (int pos = 5; pos <= 180; pos += 1) { servoB.write(pos); vTaskDelay(6 / portTICK_PERIOD_MS); } vTaskDelay(300 / portTICK_PERIOD_MS); for (int pos = 180; pos >= 5; pos -= 1) { servoB.write(pos); vTaskDelay(6 / portTICK_PERIOD_MS); } vTaskDelay(300 / portTICK_PERIOD_MS); } } 解説 サーボモータを、0度から180度へ行き来させるプログラミングです。サーボモータの制御は、ESP32Servo ライブラリを使用しました。 ...

公開: 2024年1月23日 · 更新: 2026年5月28日 · Toshihiko Arai

ESP32でBluetooth Classicを使ってAndroidと通信する

この記事では、 ESP32 から Android アプリへ Bluetooth Classic(SPP)で文字列を送信し、Android 側で表示する ところまでを最小構成で作ります。ESP32 側は Arduino IDE の BluetoothSerial、Android 側は Kotlin の BluetoothSocket を使い、UART のシリアル通信と同じ感覚で書ける構成です。 逆方向の BLE で iOS と通信する例や、BLE と Classic の住み分けを先に把握したい場合は、後半の関連記事 も合わせて参考にしてください。 先に要点 ESP32 側は BluetoothSerial で SerialBT.begin("デバイス名") するだけで、SPP のサーバ側が立ち上がります Android からは事前に OS の Bluetooth 設定でペアリングしておき、アプリ側では SPP 標準の UUID 00001101-0000-1000-8000-00805F9B34FB で BluetoothSocket を張ります Android 12 以降は BLUETOOTH_CONNECT のランタイム権限が必要なので、AndroidManifest.xml への記述だけでなくアプリ側でのリクエストも忘れずに行います BLE 通信側で iOS と Lチカしたい場合ははじめてのBLE通信、iOSからESP32のLチカ 、BLE で ESP32 から iOS にデータを送りたい場合はESP32からiOSへBLEでデータを送信する を参照してください ゴール 動画のように、ESP32からBluetooth Classic経由でAndroidアプリへデータを送信し、データを表示するまでをゴールとします。 ...

公開: 2024年1月20日 · 更新: 2026年5月29日 · Toshihiko Arai

Clion x PlatformIOでESP32(Arduino)開発

JetBrains製品の使いやすさに感心している中、ESP32(Arduino)のC++開発をClionで行うことに成功しました。これにより、「VS Code x PlatfromIO」から「Clion x PlatformIO」へ開発環境を変更できました。情報が少なかったため苦労しましたが、ChatGPTやGoogle検索を駆使して解決できました。この記事では、Clion x PlatformIOでのESP32(Arduino)開発環境の整え方を紹介します。 事前準備: PlatformIOプラグインのインストール VS Codeの拡張機能でPlatformIOをインストールしてましたが、VS Codeと密接してるためClionからは使えないようです。改めてPlatformIOを単体でインストールしました。 $ wget -O get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py $ python3 get-platformio.py その後シェルにパスを通します。例: ~/.zshrc export PATH="$PATH:/Users/xxxxx/.platformio/penv/bin" Clionのインストール JetBrainsの公式ウェブサイトからClionをダウンロードし、インストールします。有料ですが、仕事になるようであればVS Codeよりかなりオススメです。phpStorm初め、 まとめ買いできるプランもあるのでそちらを選ぶと割安 でした。(4000円/月くらい) ClionでPlatformIOを使えるようにする Clionを開きます。 「File」メニューから「Settings」を選択します。 「Plugins」セクションを開き、「Marketplace」タブで「PlatformIO」を検索します。 「PlatformIO for CLion」プラグインを見つけ、インストールします。 新しいPlatformIOプロジェクトの作成 すでにVScode x PlatformIOでのプロジェクトがある場合にも、まずはClionで新しいPlatformIOプロジェクトの作成をすることをおすすめします。 「File」メニューから「New Project」を選択します。 「PlatformIO」セクションからESP32のプロジェクトを選択します。 必要な設定を行い、「Create」をクリックしてプロジェクトを作成します。 このことにより、ESP32の標準プログラムがローカル環境へインストールされ、IDE上で標準クラスの定義へのジャンプが機能します。 ESP32開発ボードの設定 後は通常通り platformio.ini でビルド情報を書き換えて開発してください。以下は、私の開発環境の一例です。 [platformio] ;src_dir = lib/Adafruit_Seesaw/examples/soilsensor_example ;src_dir = lib/Adafruit_Seesaw/examples/with_display ;src_dir = lib/AE_TSL2572/examples/demo ;src_dir = lib/mhz19_uart/examples/demo ;src_dir = lib/DHT22/examples/demo ;src_dir = lib/Relay/examples/relay_test ;src_dir = lib/Relay/examples/solenoid_valve_demo ;src_dir = lib/Relay/examples/solenoid_valve_online ;src_dir = lib/TGS2450/examples/demo ;src_dir = lib/TGS2450/examples/arduino_uno ;src_dir = lib/TGS2450/examples/uno_debugger ;src_dir = lib/phMeter/examples/demo ;src_dir = lib/phMeter/examples/phMonitor ;src_dir = lib/DS18B20/examples/demo ;src_dir = lib/WS2812B/examples/simple ;src_dir = lib/WS2812B/examples/rainbow ;src_dir = lib/WS2812B/examples/demo ;src_dir = lib/SoilMoistureSensor/examples/demo ;src_dir = lib/ADS1115/examples/demo ;src_dir = lib/ML8511/examples/demo src_dir = lib/RFID_READER/examples/test_r200 ; プログラムのビルドアップロード -> $ pio run -e esp32 -t upload && pio device monitor ; クリーンビルド -> $ pio run --target clean [env:esp32] platform = https://github.com/platformio/platform-espressif32.git board = esp32dev framework = arduino monitor_speed = 115200 platform_packages = framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32#2.0.2 build_flags = '-DWIFI_SSID="hoge"' '-DWIFI_PASSWORD="fuga"' '-DDEBUG_MODE=1' [env:uno] platform = atmelavr board = uno framework = arduino monitor_speed = 115200 コーディング 通常はsrcフォルダ内にあるmain.cppでプログラムを記述しますが、先のビルド設定のように lib/xxxxx/examples/test 内のinoファイルを単体テストできたりします。C++ベースのライブラリを開発したい場合に便利です。 ...

公開: 2023年12月4日 · 更新: 2026年2月17日 · Toshihiko Arai

ESP32でADS1115を使う方法|配線図・I2Cアドレス・サンプルコード

はじめに この記事では、ADコンバータ ADS1115 を ESP32 で使うやり方をまとめています。 ADS1115 は 16ビット / 4チャンネル の A/D コンバータで、ESP32 と I2C で接続できます。ESP32 内蔵 ADC より分解能を上げたいときや、複数のアナログ入力を安定して読みたいときに使いやすいモジュールです。 この記事で分かることは次の3点です。 ESP32 と ADS1115 の基本配線 I2C アドレスの扱い 4チャンネル分のアナログ値を読むサンプルコード 先に要点 ESP32 では SCL = GPIO22、SDA = GPIO21 に接続すれば試しやすいです ADDR を GND に落とすと、I2C アドレスは 0x48 になります ADS1X15 ライブラリを使うと、4チャンネルの読み取りはかなり簡単です 配線を長く引くなら、I2C の安定性には少し注意が必要です つかうもの この記事で使ったものです。 ADS1115 ADS1115 は、I2C で扱える 4チャンネル 16ビットの AD コンバータです。配線が少なくて済み、PGA も使えるので、ESP32 の内蔵 ADC だけでは少し足りないときに便利です。 中華製品は安く買える反面、たまにはんだ不良で正常に動かない場合があります。私も 1ch と 2ch の信号線がショートしていて、トラブルになったことがありました。 ESP32 WayinTopさんから販売されている ESP32 を使用しました。技適マークも刻印されてますので、安心して国内で使えます。 ...

公開: 2023年7月4日 · 更新: 2026年4月20日 · Toshihiko Arai

ESP32でESP-NOWを使って通信してみよう

はじめに この記事では、M5StickC PLUS のボタンを押すと ESP32 のLEDが点滅するデモを通じて、ESP-NOWによるデバイス間通信の実装方法を解説します。ESP-NOWはWiFiアクセスポイント不要・相手のMACアドレスだけで通信できる手軽な無線プロトコルで、BLE(Bluetooth Low Energy) と比べてもコードがシンプルです。M5StickC PLUSとESP32開発ボードがあれば、この記事のコードをそのまま動かせます。 ESP-NOWとは ESP-NOWをもう少し詳しくみてみます。こちらにESP-NOWのドキュメントがありますので、目を通しておくと良いでしょう。 ESP-NOW ドキュメントを翻訳すると、ESP-NOWは次のように説明されています。 ESP-NOWは、Espressifによって定義されたコネクションレス型Wi-Fi通信プロトコルです。アプリケーションデータはベンダー固有のアクションフレームにカプセル化され、接続なしで1つのWi-Fiデバイスから別のWi-Fiデバイスへ送信されます。CBC-MACプロトコル(CCMP)を使用したCTRでアクションフレームを暗号化してセキュリティを確保します。スマートライト・リモコン・センサなどで広く使われています。 TCPのようなハンドシェイクがないためデータ到達の保証はありませんが、高速かつ省電力な通信を実現できます。単純な送受信であれば使う関数はわずかで、すぐに動かせます。 プログラミング M5StickC PLUSを送信機、ESP32を受信機として実装します。送信するには受信機のMACアドレスが必要なので、まず受信側のプログラムを書き込んでMACアドレスを確認してください。 受信側のプログラム(ESP32) Serial.println(WiFi.macAddress()); を実行することで、ESP32のMACアドレスをシリアルモニタへ表示します。表示されたMACアドレスをメモして下さい。 ESP-NOWを使ってデータを受信するには、esp_now_init() で初期化し、esp_now_register_recv_cb(onReceive) でデータ受信時のコールバックを登録します。WiFiモードは WIFI_STA(ステーションモード)を指定します。 #include <esp_now.h> #include <WiFi.h> const int LED_PIN = 13; bool ledState = false; void toggleLed() { if (ledState) { ledState = false; digitalWrite(LED_PIN, LOW); } else { ledState = true; digitalWrite(LED_PIN, HIGH); } } void onReceive(const uint8_t* mac_addr, const uint8_t* data, int data_len) { char macStr[18]; snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); Serial.println(); Serial.printf("Last Packet Recv from: %s\n", macStr); Serial.printf("Last Packet Recv Data(%d): ", data_len); for (int i = 0; i < data_len; i++) { Serial.print(data[i]); Serial.print(" "); if (data[i] == 222) { toggleLed(); } } } void setup() { Serial.begin(115200); pinMode(LED_PIN, OUTPUT); Serial.println(WiFi.macAddress()); // このアドレスを送信側へ登録します WiFi.mode(WIFI_STA); WiFi.disconnect(); if (esp_now_init() == ESP_OK) { Serial.println("ESP-Now Init Success"); } esp_now_register_recv_cb(onReceive); } void loop() { } 送信側のプログラム(M5StickC PLUS) slaveAddress を、受信機のMACアドレスに書き換えてください。esp_now_peer_info_t で送信先の情報を登録し、esp_now_register_send_cb(onSend) で送信完了イベントを登録します(不要なら省略可)。データの送信は esp_now_send(slaveAddress, data, sizeof(data)) だけです。 ...

公開: 2023年6月23日 · 更新: 2026年5月25日 · Toshihiko Arai
電磁弁とESP32で水道のオンオフを制御してみた

電磁弁とESP32で水道のオンオフを制御してみた

はじめに この記事では、12Vの電磁弁をESP32からオンオフする配線例をまとめます。リレーモジュールで電磁弁の電源を切り替え、USB 5VをDC-DCコンバータで12Vへ昇圧することで、テスト環境ではUSB電源ひとつで動かせました。 水道や散水まわりに使う場合は、GPIOの制御だけでなく、電磁弁の流向、12V側の電流、ケースの防水がつまずきやすいところです。ここでは、実際にホースをつないで動作確認した流れと、ケースに収めるときの注意点まで整理します。 先に要点 使った電磁弁は12Vで約500mA、つまり約6Wの負荷でした ESP32から直接電磁弁を動かさず、リレーモジュールで12V側をオンオフします USB 5Vから昇圧する場合は、ESP32、リレー、電磁弁を合わせた電流容量に余裕を見ます 電磁弁には水を流す向きがあり、IN側を蛇口側へつなぎます 屋外や水まわりで使う場合は、防水ケース、コネクタ、配線の引き込みまで別途対策が必要です 電磁弁の使い方 電磁弁を購入したは良いものの、説明や情報がほとんどなく困ったものでした。手探りで使い方を把握しました。 まず電磁弁の極性ですが、下の写真のように 「+」シールを貼ってある方にプラスを、反対はマイナスになるように12V電源をつないで ください。 こちらの動画にあります通り、電磁弁を通電させると 12V電圧で大体500mA程度の消費電流 になります。 動画を再生 ただし、電磁弁をオンオフさせても開閉音は鳴りません。上の動画のカチカチ音はリレーの音です。 電磁弁がちゃんと開閉されているかどうかは、実際にホースを繋いで水を流すことで確認するしかありません。 ここで 電磁弁へホースをつなぐ際に、水を流す方向があります のでご注意ください。下の写真の 黄色いテープで「IN」と書かれている方を蛇口側へつなぐ ようにします。電磁弁に電圧をかけていない場合は、止水されますのでノーマリークローズです。電磁弁を通電させると、左側から供給された水が流れるようになります。 ちなみに、動画で使っている安定化電源はこちらのものです。0V〜30Vまで10Aの出力で可変できます。出力用のオンオフスイッチも付いていて便利です。また、電流値がすぐに分かるのも安定化電源のメリットですね。 電磁弁のネジ穴はG1/2という規格なので、散水用ホースへつなぐには変換アダプタを用意しましょう。 電磁弁とESP32の配線 さて、ESP32を使って実際に電磁弁を制御してみました。電磁弁のオンオフはリレーモジュールを使うと簡単にできます。また、電磁弁とESP32の電源をUSBケーブルひとつで済ませたかったので、DC-DCコンバーターを使って5Vを12Vへ昇圧させることにしました。 電磁弁を動かすには、12V x 500mAで6W必要 なので、5V側では単純計算で1.2A以上が必要です。ここにESP32のWiFi動作、リレーモジュール、DC-DCコンバーターの変換ロスが乗るため、電源容量はギリギリにしない方が安心です。今回の動作テストでは、2.4AのUSB電源ひとつで動かすことができました。 配線は少し複雑ですが、役割を分けると分かりやすいです。 ESP32のGPIOは、リレーモジュールのINを制御する リレーモジュールは、電磁弁へ流す12Vをオンオフする DC-DCコンバーターは、USB 5Vを電磁弁用の12Vへ昇圧する リレーモジュール自体の端子やCOM/NO/NCの考え方を先に確認したい場合は、リレーモジュールの使い方 も合わせて読むと配線の意味を追いやすいです。 ESP32で電磁弁を制御するサンプルプログラム ESP32で電磁弁を制御するプログラム例です。配線は少しややこしかったですが、ソースコード自体はリレーモジュールを動かす要領ですので非常に簡単ですね! /** * @date 2022-11-25 * @author Toshihiko Arai * @copyright https://araisun.com * @brief リレーモジュールを使って電磁弁(12VDC)を制御するデモ */ #include <Arduino.h> /** * @brief 電磁弁 <--> Relay <--> ESP32 の配線 * DC+ <--> 5V * DC- <--> GND * IN <--> GPIO14 * 電磁弁+ <--> COM * 12VDC <--> NO */ #define TRG_PIN 14 void setup() { Serial.begin(115200); pinMode(TRG_PIN, OUTPUT); } void loop() { digitalWrite(TRG_PIN, HIGH); delay(2000); digitalWrite(TRG_PIN, LOW); delay(5000); } ESP32のWiFi機能を使えば、下の動画のように遠隔操作で電磁弁の制御ができます。植物の栽培などに活用できますね^^ ...

公開: 2022年11月26日 · 更新: 2026年5月12日 · Toshihiko Arai
ESP32へ書き込みエラー・MacBook 2022でconnectできない・自動書き込みに失敗したときの解決方法

ESP32へ書き込みエラー・MacBook 2022でconnectできない・自動書き込みに失敗したときの解決方法

はじめに 今までMacBookでESP32の開発を行ってきたのですが、Macbook Air 2022に乗り換えたらESP32への自動書き込みに失敗するようになってしまいました。BOOTボタンを押しながらスケッチをアップロードすれば成功するのですが、ESP32本体をケース内に収めたときにBOOTボタンを押せず、困ったことになります。この件に関して色々調べたところ解決しましたので、その方法をお伝えします。 Macbook Air 2022でESP32へ自動書き込みに失敗する解決方法 私はVisual Studio CodeにPlatformIO IDEを入れて、ArduinoやESP32をプログラミング&ビルド&アップロードしているのですが、MacBook Air 2022に乗り換えてから急に、ESP32へスケッチをアップロードできなくなりました。「古いMacBookでスケッチアップロードしなきゃならないのかよー」と嘆いていましたが、解決方法が見つかりました! ズバリ!、 ESP32のENとGNDの間に10uFの電解コンデンサを配線 すると解決します!下図のようにENピンに電解コンデンサのプラス極を繋げるようにしてください。 頻繁に使う場合は、下の写真のようにESP32の基板に直接コンデンサをはんだ付けしておくと便利です。電解コンデンサの耐圧は16Vあれば十分でしょう。 ESP32のSoC(チップ)の左上端子がGNDでしたので、下の写真のようにもっと攻めたはんだ付けも可能ですね!はんだ付けに自信のある方は試してみてください。 ちなみにENピンをLOWにするとESP32の電源がオフになり、HIGHになったら電源がオンなるそうです。なぜコンデンサを挟むと安定してスケッチがアップロードできるのか詳しいことは分かりませんが、とにかく同じお悩みの方はぜひ試してみてください!^^ 関連アイテム ESP32 DevKitC 10uF 電解コンデンサ USB Type-C データケーブル

公開: 2022年11月25日 · 更新: 2026年2月25日 · Toshihiko Arai

【ESP32】MH-Z19CセンサでCO2濃度を測定する

はじめに この記事では、ESP32 と MH-Z19C CO2センサ を UART で接続し、CO2濃度を読み取る方法をまとめます。配線、ライブラリ、サンプルコード、ゼロ点校正まで確認したあと、UART通信の基本も整理します。 MH-Z19C はUARTまたはPWMで値を取り出せますが、この記事ではライブラリを使ったUART方式で進めます。ESP32側ではハードウェアシリアル2を使い、センサの TX と RX の向きを間違えないことが重要です。 こんなことをやります。 CO2センサ(MH-Z19C)とESP32でCO2濃度の測定 CO2センサの校正 気象庁のCO2濃度データをグラフ化 MH-Z19Cで使われているUART(シリアル通信)の解説 先に要点 ESP32では、MH-Z19Cの TX を GPIO16 (RX2)、RX を GPIO17 (TX2) へつなぎます サンプルコードでは mhz19_uart ライブラリを使い、getCO2PPM() でCO2濃度を読みます ゼロ点校正は環境の影響を受けるため、やみくもに実行せず用途に合わせて扱います CO2濃度の話は換気の目安として扱い、この記事ではセンサの使い方と実験記録を中心にします つかうもの はじめに、この記事で使うものをご紹介します。 MH-Z19C 秋月電子通商で販売しているMH-Z19Cを使いました。 MH-Z19Cセンサは、 赤外線を使って空気中のCO2濃度を測定 します。MH-Z19Cセンサからデータを読み取るには、UART通信または、PWMで値を読み取る方法があります。本記事ではもっとも簡単な方法として、既存のライブラリを使ってUART方式でMH-Z19からCO2濃度を読み取る方法をご紹介いたします。 MH-Z19Cの概要 MH-Z19Cでは、UARTまたはPWM信号を読み取ってCO2濃度のデータを読み取ります。 今回はライブラリを使用しますが、ライブラリの仕組みとしてはUART通信でデータを読み取ってます。UARTについて記事の最後でくわしく解説してます。 MH-Z19Cの仕様 項目 値 電源電圧 5V 測定レンジ 400~5000ppm 消費電流 40mA以下、最大125mA インターフェース電圧 3.3V 出力 シリアルポート(UART、TTLレベル3.3V)、PWM MH-Z19Cライブラリのインストール MH-Z19CとUARTで簡単にやり取りできるライブラリを使用します。こちらの「nara256/mhz19_uart」を使わせてもらいました。 https://github.com/nara256/mhz19_uart 上記のページからzipでダウンロードして解凍してください。それをArduinoのライブラリディレクトリへ移動すればOKです。 私はPlatform IOで開発してますので、ディレクトリ構造は次のように配置しました。 . ├── include │ └── README ├── lib │ ├── README │ └── mhz19_uart │ ├── MHZ19_uart.cpp │ ├── MHZ19_uart.h │ └── examples │ └── demo │ └── demo.ino ├── platformio.ini ├── src │ └── main.cpp └── test └── README MH-Z19CだけでなくMH-Z19Bでも使えます。また、このライブラリはArduinoとESP32のどちらでも使うことができます。UART通信ですので、Arduinoの場合はソフトウェアシリアルを、ESP32の場合はハードウェアシリアルを使用します。配線だけ間違えないように注意してください。 ...

公開: 2022年5月21日 · 更新: 2026年4月29日 · Toshihiko Arai