【ESP32】BLE通信、ESP32からiOSでデータ受信

はじめに 今回は BLE通信を使って、ESP32から送られたデータをiOS端末で受信 します。ESP32をペリフェラル、iOSをセントラルとして扱い、ESP32側で読み取った値を Notify で送る構成です。 この形にしておくと、ESP32につないだセンサの値をiPhoneアプリ側で受け取り、画面に表示できます。Wi-Fiを使わずに近距離で値を渡したいときの入口として、前回のLチカ記事と合わせて読むと流れを追いやすいです。 先に要点 ESP32側は BLE Server としてサービス、キャラクタリスティック、Notify を用意します iOS側は CoreBluetooth で対象サービスをスキャンし、キャラクタリスティックを見つけて通知を登録します 値を受け取る処理は didUpdateValueFor characteristic で行います UUID が一致しないと接続後に値を受け取れないので、ESP32側とiOS側で同じ値を使います 前回のおさらい はじめに前回のおさらいです。BLE通信をはじめるには、 アドバタイジング で目的の サービス を持つ ペリフェラル を見つけ、 キャラクタリスティック を取得する必要がありました。よってペリフェラルの サービスUUIDとキャラクタリスティックUUIDの2つ以上が必要 になります。 前回は、iOSからESP32へデータを送信してLチカを実現させました。よってキャラクタリスティックの属性には Write が必要でした。 今回は、ESP32のデータをiOSで受信したいので Notify属性を使ってデータを受信 します。 ところで、この記事で扱うiOSとESP32は次のような関係になります。混乱しないよう気をつけてください。 iOS ESP32 セントラル ペリフェラル マスタ スレイブ クライアント サーバ ESP32のUUIDをそれぞれ次のように決めました。 項目 値 SERVICE UUID 4fafc201-1fb5-459e-8fcc-c5c9c331914b CHARACTERISTIC UUID beb5483e-36e1-4688-b7f5-ea07361b26a8 これらの値はESP32のサンプルの値を使用してます。必要あればこちらのジェネレータでUUIDを生成して書き換えてください。 https://www.uuidgenerator.net/ BLE通信でESP32のデータをiOSで受信するプログラム 概要 ESP32のGPIO32へ可変抵抗を取り付け、読み取ったアナログ値をiOSでBLE経由で受信する プログラムを作っていきます。 可変抵抗は両側をGNDと3.3Vに接続し、真ん中の端子をGPIOへ繋いでください。BLE通信を開始したらNotify通知を設定し、抵抗値をiOSで受け取りUILabeで表示させます。 ESP32(ペリフェラル) ESP32(ペリフェラル)のArduinoで書いたプログラムです。前回のBluetooth Lチカとそれほど変わりません。ESP32でデータを通知するにはキャラクタリスティックにデータをセットして通知します。 pCharacteristic->setValue(str); pCharacteristic->notify(); なお、ここでは文字列をセットしましたが、int型などもセットできるようです。 ...

公開: 2021年7月14日 · 更新: 2026年4月29日 · Toshihiko Arai
においセンサ(TGS2450)で匂いを数値化するArduinoプロジェクト、基板も作ったよ

においセンサ(TGS2450)で匂いを数値化するArduinoプロジェクト、基板も作ったよ

はじめに においセンサTGS2450とESP32、M5StickC Plusを使って、匂いを数値化するプロジェクトです。TGS2450はメチルメルカプタンやアルコールに反応しやすいアナログガスセンサです。 この記事では、TGS2450をマイコンで扱えるようにする回路、Arduinoとの配線、ヒーターパルス制御、簡易的に0〜100点へ換算する流れをまとめます。アナログ値を読むため、Raspberry Piで使う場合はADコンバータが必要です。 動画を再生 においセンサモジュールの製作 秋月電子通商さんで販売されているTGS2450(においセンサ)ですが、そのままではArduinoなどのマイコンで扱うことができません。トランジスタを使ったちょっとした回路を組まなければならないのです。 そこでPCB基板を発注してにおいセンサモジュールを作ってみました。基板サイズは約44mmx28mmです。回路については後ほど説明します。 このにおいセンサモジュールは、ArduinoをはじめESP32やM5でも動作可能です。お好みのボードでお使いください。もちろんRaspberry Piでも扱うことは可能ですが、Raspberry Pi Pico以外の場合は アナログ電圧値を読み取るためのADコンバータが必要 となりますのでご注意ください。 センサーモジュールの販売は終了となりましたm(_ _)m TGS2450が感知できるガス TGS2450は空気中に含まれるガスの濃度に応じて抵抗値が変化するアナログセンサ です。検知しやすいガスは次の通りで、 硫黄化合物系ガスに対して好感度です。 ◎ メチルメルカプタン ◎ 硫化水素 ○ アルコール ○ アンモニア アルコールに対してかなり敏感に反応します。また、玉ねぎスライスに近づけるとさらに反応します。「必ずしも人間にとって臭いもの」に反応するとは限らないのですが、大まかに「におう」ものに反応していることは間違い無いです。 口臭チェッカーや硫黄化合物系ガス検知器、空気清浄器や換気扇コントロールなどへ応用 できます。 次のグラフはフィガロ技研さんが出している TGS2450のデータシート です。 Rsはセンサ抵抗値でガスによって変化します。Roは清浄大気中のセンサ抵抗値で一定です。Rsのセンサ抵抗値が低くなればなるほど、ガス濃度ppmが高くなっていることが分かります。また左側のグラフほど、においセンサ(TGS2450)で反応しやすいガスということになります。 実際ににおいセンサーで測定してみると、意外と部屋の中が臭うということに気づきます。人間の嗅覚は慣れてしまうので、他人はすぐに気づいても自分には分からないものです。一人暮らしの方は、匂いチェッカーとして活用してみてはいかがでしょうか?(笑)他にもアイデア次第で楽しいことができそうです♪ においセンサモジュールの回路図 下図はTGS2450をArduinoなどで使えるようにするための回路図です。私が製作したにおいセンサモジュールの回路も同様のものとなります。ご自身で製作する場合はこの回路図を参考になさってみてください。 回路図中のJ1はArduinoなどのマイコンボードへ、Q2はTGS2450のガスセンサーへ繋ぎます。 TGS2450は4ピンのセンサデバイスで、役割はそれぞれ次のとおりです。3番、4番ピンの制御をマイコン側で行うことになります。 ピン番号 名称 備考 1 Common GNDへ繋ぐ 2 N.C. 何も接続しない 3 Sensor electrode ガス濃度に応じて5.62Ω〜56.2kΩで変化 4 Heater パルスで1.6Vの電圧を印加する 先ほどの回路図を元に、TGS2450内部構造も合わせて表現したものが次の図を見た方が分かりやすいかもしれません。 ...

公開: 2021年7月5日 · 更新: 2026年5月2日 · Toshihiko Arai

【Arduino】非接触温度センサ(GY-906)を使う

はじめに この記事では、非接触温度センサGY-906(MLX90614)をArduinoから読み取り、対象物の温度と外気温を取得する方法をまとめます。基本のArduino配線から、M5StickC Plusでの表示、手ブレやノイズを抑えるためのメディアンフィルタまで扱います。温度計の代わりに厳密な測定をするというより、触れないものの温度変化を手軽に見る用途に向いたセンサです。 準備 GY-906ライブラリのインストール Arduino IDEをお使いの場合は、ライブラリマネージャで「Adafruit MLX90614」検索し 「Adafruit-MLX90614-Library」のバージョン1.1.x をインストールします。最新の2.0.0を使うと、本記事のプログラムでは動かない可能性があります。 https://github.com/adafruit/Adafruit-MLX90614-Library Arduinoで非接触温度センサGY-906を使う Arduinoで非接触温度センサGY-906を使ってターゲットの温度と、外気温を取得してみます。 ArduinoとGY-906の配線 ArduinoとGY-906の配線図です。 Arduinoの3.3Vをセンサモジュールへ供給し、SCLとSDAをそれぞれつなぎます。GY-906センサモジュールは、プルアップ抵抗が内蔵されているのでそのまま繋ぐことが可能です。 ソースコード(Arduino版) こちらがGY-906を使った基本的なプログラムになります。 #include <Arduino.h> #include <Wire.h> #include <Adafruit_MLX90614.h> Adafruit_MLX90614 mlx = Adafruit_MLX90614(); void setup() { Serial.begin(9600); mlx.begin(); } void loop() { Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC()); Serial.print("*C\tObject = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C"); // Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempF()); // Serial.print("*F\tObject = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F"); Serial.println(); delay(1000); } ソースコードの解説 プログラム中のObjectが「対象物の赤外線から得た温度」です。Ambientは環境温度、つまり外気温を意味します。センサ自体が熱せられてしまうと、外気温も上がってしまうので注意しましょう。 プログラムでは摂氏温度を取得しましたが、華氏温度で取得したい場合は、readObjectTempFを使ってください。 ...

公開: 2021年1月24日 · 更新: 2026年4月30日 · Toshihiko Arai

ESP32でLチカするまでの設定

はじめに この記事では、Arduino IDEでESP32の開発ができるようにし、最初の動作確認としてLチカ(LED点滅)まで進めます。ESP32のボードURL追加、Boards Managerでのインストール、LEDと抵抗の配線、Board/Portの選択を順番に確認します。はじめてESP32を触る場合は、まずこの手順で「書き込める状態」を作っておくと、その後のセンサ実験やBluetooth通信へ進みやすくなります。 開発環境 私の開発環境はこちらになります。Windowsでもほとんど同じ内容でできますので、適宜読み替えてください。 項目 バージョン ESP32ボード ESPRESSIF ESP32-WROOM-32D(ESP32 DevkitC V4) Arduino IDE Version 2.1.2-nightly-20230815 パソコン macOS Ventura 13.5 ESP32とは、上海に拠点を置く Espressif Systems社が開発したSoC(チップ) になります。下の写真の銀色の四角部分とWiFiアンテナ部分が本来のESP32になります。それ以外の部分は各社で自由に作られてます。 またESP32は Wi-FiとBluetoothの無線通信を標準で備えて ます。 クロックス周波数も240MHzと高速 で、ハイスペックながら低価格で購入できるマイコンボードです。ちなみにArduino Uno R3のクロック周波数が16MHz、Raspberry Pi Pico W が133MHzです。 ESP32はESP-IDFというツールで開発することができますが、 Arduino IDEを使ってArduino言語でも開発が可能 となってます。Arduinoをやったことある人でしたら、ESP32の開発もすんなりできるはずです。ここら辺がESP32が人気な理由でもあるでしょう。 さて、Amazonなどで検索しますとESP32のボードは種類が豊富でどれを選べば良いか分からないという方も多いと思います。結論から言いますと、 技適が通っていて38ピンある「ESP32 DevkitC」をおすすめ します。下記の製品どちらも技適が通っていてESP32 DevkitCとして開発できるのでトラブルが少ないと思います。実際私の仕事でも多用しているボードです。 Arduino IDE のインストール それでは実際にESP32の開発を進めていきましょう。Arduino IDEをお持ちでない場合は、下記ページからダウンロードします。184.3MBのdmgファイルでした。 https://www.arduino.cc/en/software 上記のページから macOS(Version 10.14: “Mojave” or newer, 64 bits) をダウンロードしました。Arduino IDEはWindowsやLinuxでも動かすことができます。ダウンロードする際に寄付画面が出てきますが、 無料でダウンロードする場合には「JUST DOWNLOAD」を選択 すれば大丈夫です。 Arduino IDEの設定 はじめにArduino IDEでESP32を開発するために、いくつかの設定が必要になります。難しそうに思うかもしれませんが、手順通り進めれば大丈夫ですので頑張りましょう。 ...

公開: 2021年1月5日 · 更新: 2026年4月30日 · Toshihiko Arai
【Arduino】Pro Microと静電容量式タッチセンサ(TTP223)

【Arduino】Pro Microと静電容量式タッチセンサ(TTP223)

はじめに この記事では、Arduino Pro Micro と 静電容量式タッチセンサ TTP223 をつないで、タッチでLEDを点灯させるところまで試します。TTP223 はジャンパ設定で出力の動きが変わるため、先にモードの意味を押さえてから配線すると迷いにくいです。 タッチセンサは機械的なスイッチと違い、押し込む部品がありません。壊れにくく、ケース越しに反応させやすいので、自作機器の操作ボタンとしても扱いやすいセンサです。 先に要点 TTP223 は、タッチされたときに HIGH または LOW を出力できる静電容量式タッチセンサです AHLB と TOG のジャンパ設定で、モーメンタリ/オルタネイトと出力極性を切り替えられます 今回は、タッチしている間だけ HIGH になるモーメンタリ設定で Lチカします Pro Micro 側では digitalRead() で状態を読むだけなので、最初のセンサ確認に向いています タッチセンサ「TTP223」の使い方 このタッチセンサの 電源電圧は、2V〜5.5V の範囲で使用できます。 タッチセンサには「223B 9NNH」というICチップが搭載されてます。このおかげで、 ジャンパピンによってタッチセンサのモードを次の通り変えることができます。 TOG(B) AHLB(A) 動作・機能 0 0 モーメンタリ タッチされたらHIGHを出力 0 1 モーメンタリ タッチされたらLOWを出力 1 0 オルタネイト 電源オン時にLOWの状態 1 1 オルタネイト 電源オン時にHIGHの状態 モーメンタリとは、タッチしている間だけオンになる動作 オルタネイトとは、タッチするたびにON・OFFが切り替わる動作 基板のAジャンパは「AHLB」、Bジャンパは「TOG」へ配線されているので注意しましょう。 今回は、タッチしている間だけONになるモーメンタリを使用します。また、タッチされたらHIGHの信号が出力されるモードに設定します。センサに触れている間だけ反応させたいなら、この設定から試すのが分かりやすいです。 ▼ 「223B 9NNH」データシート https://datasheet.lcsc.com/szlcsc/TTP223-BA6_C80757.pdf ArduinoとタッチセンサでLチカ それでは実際にタッチセンサを使ってみましょう。タッチセンサとArduinoでLチカをやっていきます。 タッチセンサとArduinoの配線 まずは、次の通りタッチセンサとArduinoを配線してください。 LEDのアノードをA10につなぎ、1kΩ程度の抵抗を介してGNDへ落とします。 タッチセンサ Arduino Vcc 5V I/O A9 GND GND タッチセンサでLチカするプログラム こちらの動画のように、タッチセンサでLチカするプログラムをArduinoに書き込みます。 ...

公開: 2021年1月3日 · 更新: 2026年4月29日 · Toshihiko Arai

【Arduino】シリアルLED(WS2812B)を制御する

はじめに この記事では、ArduinoでシリアルLED(WS2812B)を動かす方法をくわしく解説いたします。 シリアルLEDは、電流の許す限りいくつもの同じ シリアルLEDを数珠つなぎで増設 できるLEDです。中でもテープ状になっているシリアルLEDがよく使われます。好きな長さにカットして使うことができるので、広告看板や室内の装飾、クリスマスや小規模なプロジェクトにもお使いいただけます。シリアルLEDのライブラリを使って、Arduinoから簡単に色や明るさを制御できます。 動画を再生 シリアルLEDの制御に必要なデータ通信線はたったの1本です。ひとつのArduinoで数百個のシリアルLEDを制御するなんてことも不可能ではありません。しかも、各シリアルLEDは独立してRGBフルカラーで点灯可能です。 シリアルLEDとは シリアルLEDは、もともと中国のWorldSemi社が開発したもので「NeoPixel」と呼ばれてます。 Neo PixelのシリアルLEDは、ひとつひとつの単品でも購入可能ですが、テープの形のものや、マトリックスになっているものが便利です。 とくに、テープ状になっているシリアルLEDは、ハサミで好きな長さにカットして使用できます。表面は柔らかい透明な樹脂でコーティングされており、裏面には両面テープが貼られてます。 本記事では紹介するのは「WS2812B 」のシリアルLEDの制御方法となります。ご購入の際は、「WS2812B」という名前がついているものをお選びください。 開発環境 本記事でおこなった実験の開発環境は次の通りです。 項目 バージョン Arduinoデバイス Seeeduino XIAO シリアルLED BTF-LIGHTING WS2812B LEDテープライト 1m Arduino IDE 1.8.10 パソコン macOS Big Sur 11.0.1 ▼ 今回購入したBTF-LIGHTINGのLEDテープライトです。WS2812B LEDテープ のシリアルLEDが60個ついてます。 WS2812B の検索結果から選ぶときは、5V、WS2812B / NeoPixel互換、LED密度(30個/m、60個/m など)、防水コーティングの有無を見ます。工作で切ったりはんだ付けしたりするなら、防水なしのテープの方が扱いやすいです。60個を白で全点灯させると電流が大きくなるので、電源容量にも余裕を見てください。 シリアルLEDの仕組み ここではシリアルLEDの仕組みを簡単に説明します。 シリアルLEDの構造 シリアルLED「WS2812B」を拡大した写真をご覧ください。 ...

公開: 2020年12月20日 · 更新: 2026年7月10日 · Toshihiko Arai

リレーモジュールの使い方|Raspberry Pi・Arduino(ESP32)

はじめに この記事では、リレーモジュールをRaspberry Pi、Arduino、ESP32から制御する方法をまとめます。最初は豆電球やLEDのような低電圧の負荷で、COM、NO、NCの動きとGPIO制御を確認します。リレーモジュールが使えるようになると既存機器のIoT化へ応用できますが、 初めてのリレーモジュールでいきなりコンセントのAC100Vを扱うのは大変危険です。 ここではまず、事故の起きにくい電子部品を使ってリレーモジュールを扱ってみます。 この記事で使うもの リレーモジュール Raspberry Pi ESP32 DevKitC ブレッドボード ジャンパーワイヤ まずは リレーモジュール と マイコンボード、それから ブレッドボード と ジャンパーワイヤ があれば試せます。いきなりAC100V機器をつながず、最初はLEDや豆電球で確認するのが安全です。 リレーモジュールを検索結果から選ぶときは、まず 5V駆動、1ch、High/Lowトリガーの仕様、フォトカプラ有無、端子台の形を確認します。Raspberry Pi で使う場合は GPIO が 3.3V なので、IN 端子が 3.3V 信号で反応するか、別電源の 5V と GND 共通で使えるかも見ておくと安心です。AC100Vを扱う用途では、リレー接点の定格だけでなく、ケース、絶縁、ヒューズ、端子処理まで別途考える必要があります。 リレーを動かしてみよう 図のように配線を組んで、実際にリレーを動かしてみました。皆さんも回路を組んで実際に遊んでみることをおすすめします。 スイッチを通じてプラス5Vを、リレーモジュールのINへ繋ぐ DCマイナスは電源のマイナス端子へ繋ぐ DCプラスは直接プラス5Vを繋ぐ 上記のように配線したら、スイッチのオンオフを切り替えてみましょう。スイッチを切り替えるたびに、ウィンカーみたいなカチカチ音が聞こえたでしょうか?これはリレーのスイッチが切り替わる音です。この音が聞こえればリレーは正しく動作できてます。次はこの回路に豆電球を取り付けて光らせてみましょう。 豆電球をリレーで光らせよう 次に豆電球を用意して、リレー制御で光らせてみましょう。図のように電池と豆電球をリレーモジュールに繋ぎました。 COMとNOに豆電球を繋いだ場合、 スイッチをオンにすると豆電球が光り、スイッチをオフにすると消灯します。 つまり、スイッチをオンにすることでリレーモジュールのCOMとNOが導通します。 それでは、COMとNCに豆電球を繋ぎ変えてみましょう。今度は スイッチをオンにすると豆電球は消灯し、スイッチをオフにすると光る ようになりました。 ここまでの動作から次のことがまとめられます。 COM(コモン)共通の端子 NO(ノーマリーオープン)は、リレーコイルに電流が流れていない時にCOMとの間が開いている NC(ノーマリークローズ)は、リレーコイルに電流が流れていない時にCOMとの間が閉じている Raspberry Piでリレーモジュールを使う それではこれから Raspberry Pi を使って リレーモジュール を動かしていきます。 トリガーの仕様 今回使用したリレーモジュールのトリガー(IN)へ流す電流は、 5mA 程度あれば十分です。また電圧は 3〜5Vの範囲 で入力が可能です。 Raspberry Piの GPIOは1つあたり10mA程度 まで電流を出力できます。そして 全体で30mA程度 までとなります。また、 GPIOの出力電圧は3.3V です。 たくさんのリレーを繋ぐときは消費電流に気をつけましょう。今回はひとつだけの実験ですので、GPIOを直接リレーモジュールのトリガーへ繋ぎました。 ちなみに今回使用したリレーモジュールはジャンパピンが存在し、Low側にするとトリガー電圧を0〜1.5Vに変更できるようになっていました。 ...

公開: 2020年12月15日 · 更新: 2026年7月10日 · Toshihiko Arai
【Raspberry Pi】ADコンバータMCP3425の使い方

【Raspberry Pi】ADコンバータMCP3425の使い方

はじめに Raspberry Pi にはアナログ入力がないので、電圧のような連続した値を読むには外付けのADコンバータ が要ります。ここで使う MCP3425 は、差動入力・16ビットまで対応の小さなADCで、I2C 2本の線でつなげます。 この石を使ううえでの肝は、ゲインや分解能といった設定が、コンフィギュレーションレジスタに書き込む1バイトにすべて詰まっているという点です。逆に言えば、この8ビットに何を立てるかさえ決まれば、あとは値を読むだけ。まずはラズパイ側でI2Cを有効にしておいてください。 Raspberry PiとMCP3425の配線 今回は動作確認が目的なので、センサは使わず、分圧抵抗でつくった一定のアナログ電圧を読ませます。3.3Vはラズパイから取り、10kΩ2本で半分に分けているので、Vin+には約1.65Vが現れます。 MCP3425は差動入力ですが、話を簡単にするためVin−をGNDに落とし、Vin+だけを使います。使ったのはRaspberry Pi Zero WHですが、I2Cが使えれば他のラズパイでも同じです。 配線は次のとおりです。 MCP3425 役割 Raspberry Pi接続先 ラズパイ物理ピン 1 Vin+ 分圧抵抗へ – 2 Vss GND 6番 3 SCL GPIO3 5番 4 SDA GPIO2 3番 5 Vdd +3.3V 1番 6 Vin− GND – ラズパイ側のI2Cは、SDAがGPIO2、SCLがGPIO3に割り当てられています。ピンヘッダの物理位置と信号名は取り違えやすいので、下のGPIO配置図で確認しながら結線すると安心です。 MCP3425が認識されているか確認する 配線ができたら、i2cdetect でラズパイからMCP3425が見えているかを確かめます。正しくつながっていれば、アドレス0x68が表示されます。 $ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- もしアドレスが出てこないときは、まずラズパイを再起動してみてください。MCP3425はVin+とVin−がどちらも未接続だとアドレスを返さないことがあるので、入力側の結線も合わせて見直します。 ...

公開: 2020年12月14日 · 更新: 2026年7月3日 · Toshihiko Arai
超音波センサHC-SR04の使い方|ArduinoとRaspberry Piで解説

超音波センサHC-SR04の使い方|ArduinoとRaspberry Piで解説

はじめに この記事では、超音波センサ HC-SR04 を使って距離を測る方法をまとめます。Arduino での基本配線とサンプルコード、Raspberry Pi で使うときの電圧変換、サーボモータと組み合わせた物体追跡の実験まで扱います。 最初に大事なのは、HC-SR04 の Echo ピンからは 5V 信号が返ることです。Arduino UNO のような5V系ボードなら扱いやすいですが、Seeeduino XIAO や Raspberry Pi のような3.3V入力へ直結しないよう注意してください。 先に要点 HC-SR04 は、超音波を出して戻ってくるまでの時間から距離を計算します Arduino では Trigger を10マイクロ秒だけ HIGH にし、Echo の HIGH 時間を pulseIn() で読みます 3.3V系マイコンや Raspberry Pi では、5Vの Echo を分圧やレベル変換で下げてから入力します サーボモータと組み合わせると、距離変化を使った簡単な追跡実験にも発展できます 超音波センサの仕組みを解説 なんで超音波で距離が測定できるの? 超音波で距離が測定できる仕組みを説明しますね。 そもそも超音波とは、人間の耳には「聞こえない」または「聞こえにくい」音域の音のことです。とはいえ聞こえないだけであって音にはかわりありません。 超音波も音も、空気を振動させて遠くへ広がっていきます。そして、その 音の速さは決まっている のです。(ココ大事) 音の速さは、気温や気圧によっても変化しますが、たとえば 1気圧で20度のときでは「秒速343.7m/s」 であることが知られてます。 よって、音の速さが分かっているのであれば「音を出してからその音が戻ってくるまでの時間」を測れば距離が測定できます。 つまり距離の計算式は次のようになります。 $$ 距離 = 音速 \times \frac{往復時間}{2} $$ 音速の定義 また、音の速さを正確に知りたい場合は、次式で計算できます。ただし、この式は「1気圧で空気が乾燥している」という条件が付きます。また、tは摂氏温度、音速の単位はm/sです。 $$ 音速 = 331.5 + 0.61t$$ ...

公開: 2020年12月12日 · 更新: 2026年4月29日 · Toshihiko Arai

【Raspberry Pi】ECMで音センサつくってみた

はじめに こんなこと、やります。 エレクレットマイク(ECM)を使って音センサの制作 交流信号を直流信号へ変換する ADコンバータを使ってRaspberry Piで音を認識させる 音量に合わせてLEDを点灯させる Raspberry Piで音が感知できるように実験してみました。この記事では音センサの作り方をメインにご紹介します。音センサは交流回路の勉強にもなって楽しいので、ぜひ挑戦してみてください。 こちらの動画のように、Raspberry Piと自作のECMマイクを使って、 音量に合わせてLEDを点灯させるサウンドレベルインジケーター のようなことやっていきます! 音センサの概要 音センサを実現するための概要を説明します。 音センサの仕組み 今回製作した音センサの仕組みは次のようになります。 マイクロフォン(ECM)で音声を集音 アンプ回路で音声を増幅 音声の交流信号を直流信号に変換 直流信号をADコンバータでデジタル変換 SPI通信でデジタル信号をRaspberry Piで読み取る エレクレットマイク(ECM) 音を感知するためのECMマイクは、以前に自作したものを使用します。 作るのが面倒な方は、ECMとアンプがモジュール化されたものを使うと便利です。 また、Raspberry Piはお好きなものをお使いください。 マイクアンプの製作 ECMで集音した信号は、電圧が数十mV程度と小さすぎます。よって、そのままでは使えないのでアンプを通して十分大きな信号に変換してあます。 非反転増幅回路 オペアンプを使って、非反転増幅回路でマイク信号を増幅させます。この回路では、1kΩと470kΩの抵抗によって470倍の信号増幅が可能です。 今回は音質に拘らないので、NJM4558やTL072などの安価なオペアンプで十分です。 増幅回路の波形を観察 ファンクションジェネレータでサイン波を鳴らし、マイクで集音して増幅回路に通してみました。その時の入力側と出力側の波形のようすです。 写真のように10mVp-p程度だったECM出力の電圧が、アンプを通したことで4Vp-p程度まで増幅されました。ただし、過増幅のために波形は歪んでいます。人間の耳で聞けば割れた音になってますが、センサの用途ですのでこれで問題ありません。あくまで音を感知できればいいので、音質は気にしなくて良いです。 発振器のすすめ ところで、こういった低周波の実験には「発振器」があると便利です。発振器は「ファンクションジェネレータ」や「オシレーター」とも呼ばれます。 ファンクションジェネレータは自作することも可能です。 交流信号を直流信号に変換する(AC-DC) マイクアンプで増幅された信号は、GNDの0Vを中心にプラスマイナスへ振れる交流信号です。よって、このままではADコンバータに入力できません。そこで、交流信号を直流信号に変換するAC-DCコンバータを作っていきます。 作ると言っても、とても簡単です。つぎのように半波整流回路を利用します。 AC-DCコンバータの回路 このAC-DCコンバータの回路の仕組みはつぎのとおりです。 0Vを中心に上下する交流信号の「プラス側の信号のみ」をダイオードで取り出す ダイオードを通過した信号は、1uのコンデンサに蓄電され、そして100kΩの抵抗へ流れていく 出力が3.3V以上の電圧にならないよう、ツェナーダイオードでリミッターをかける AC-DC変換後の波形はこんな感じのものになります。 ダイオードとツェナーダイオードは、小信号用のものをお使いいただけます。 なお、ダイオードを通過した信号はOUTへも流れますが、OUT先の入力抵抗(入力インピーダンス)は非常に高いと想定しているため、1uに蓄えられた電荷のほとんどが100kΩの抵抗へ流れることになります。このことは、インピーダンスについて学ぶと理解できますので、詳しく学びたい方はこちらの書籍をおすすめします。(私のバイブルです) AC-DCコンバータの実際 こちらの写真はマイクアンプから出力された信号と、「ダイオードのみ」を通した時の信号をオシロスコープで観察したものです。 ダイオードを通すと、プラス側の信号のみを取り出すことができます。またダイオードの向きを反対にすれば、マイナス側の信号のみを取り出せます。 ダイオードでは順方向電圧があり、ダイオードを通った信号は0.6Vほど電圧が低くなります。上の写真からもそのようすが観察できます。 つまり、0.6V以上の入力信号でないとこの回路は動作しません。ですから、アンプ回路でECMの微弱信号を大きな電圧に増幅する必要があったのですね。 もしも0Vから動作させたい場合は、理想ダイオード回路を使って実現できます。 ...

公開: 2020年11月29日 · 更新: 2026年3月13日 · Toshihiko Arai