2026年9月17日木曜日

Arduino手習い(TFTディスプレイを使う)

 以前、PICに繋げるつもりで買ってデッドストックになっていたTFTディスプレイ(ILI9341)はESP32に繋げられそうなので試してみた。このTFTディスプレイにはタッチパネル(MSP2807)が付いている。次のWEBを参考にした。

ESP32 TFT with LVGL: Display Temperature on Line Chart (BME280)

プログラムをコンパイルしESP32に書込むとプログラムは何事も無く動いた。コンパイルにあたり1つ注意が必要なのはlvglライブラリーが最新バージョンの9.6.0ではなく9.2.xを選ぶ必要がある事だ。そうでないとコンパイルエラーで先へ進めない。

 上の写真を撮った時点ではタッチパネルは未配線であるが問題なく動いた。タッチパネルを配線してみたらタッチした反応が得られようになったが座標が正常には認識されていなかった。これはプログラム中305行目付近にある次の行のパラメータを2から0に変更したら正常になった(この事はプログラム中のコメントに記載されている)。

    touchscreen.setRotation(2);

 

TFTディスプレイが動いたことに気をよくしてプログラム(ウェザーステーション)にも挑戦した。

  ESP32 TFT with LVGL: Weather Station

これはインターネットから気象データを取得し気温や天気をグラフィックに表示するものだが、こちらは 、

最大1310720バイトのフラッシュメモリのうち、スケッチが1853116バイト(141%)を使っています。

 というフラッシュメモリーが足りないというエラーが出て実行できなかった。

 参考までにESP32、TFT、BME280の接続関係は次図の通り。


 

 

 

2026年9月16日水曜日

フォノイコライザーを作る(その3)

 そうこうしている内に基板(PCB)の配達された。これまでの経験から、羽田で国内配送業者へ渡された翌日くらいには届く。

 早速、届いたPCBを組み立てた。

やはり220uFの電解コンデンサの大きさが際立っている。270Ωや270KΩはそのままの値が無かったので手持ちの抵抗を組み合わせて近い値を作った。

電源を入れ入力端子を解放したままで出力のレベルを測ると5mV程度出力がある。入力付近に指を近づけると出力が大きく増える。 一方入力端子を短絡すると出力は1mV以下まで下がる。入力回路にハムが乗っているようだ。

じっさい出力をオーディオアンプのAUX端子に入れ、入力側の10uFの無極性電解コンデンサの缶に触るとブーとハム音が出る。低周波のゲインが60dB近くあるので仕方ないが何とかしたい。シールドが必要だ。そこで0.2mm厚の銅板でシールドを作って入力部を覆うように組み付けた。


これにより無信号時のノイズレベルは1mV程度まで下がった。220uFのコンデンサを外してもDCのオフセットは0.1V程度だったので不要として取り外した。

とりえずこれで評価してもらおう。

 

 

 


 

 

 

 

 

 

2026年9月15日火曜日

Arduino手習い(WiFi WEBサーバ、気象データ(BME280)のグラフ表示)

 前回はBME280で測定した気象データ(気温、湿度、気圧)を数値で表示させたが、それらをグラフで表示させる事に挑戦した。参考にしたのは次のWEBページだ。

 ESP32/ESP8266 Plot Sensor Readings in Real Time Charts

 WEBページの指示通り予め表示用htmlファイルを作成し、ESP32 LittleFSファイルシステムアップローダ(ダウンロード&IDEへの追加が必要)を使ってESP32のフラッシュメモリーに書き込んだ。次にプログラム中にあるWiFiアクセスポイントのSSIDとパスワードを設定し、コンパイルすればそのまま動いた。 



 グラフはサーバ側ではなくアクセスしたクライアント側で作成されるのでアクセスした時点ではスケールしか描画されておらず30秒~1分程度待たなければグラフにならないが、その後は30秒毎にデータが更新され3つのグラフが更新されていく。

データは小数点下2桁まで表示され、実用上はそのような分解能は必要ないが描画する上ではグラフに動きが出て面白い。 カーソルをプロット上に持っていくとそのデータ値と時刻が表示される。

とても面倒だと思っていたグラフ描画を簡単に実行できたので拍子抜けした。今回のプログラムを解析すれば今後のプログラミングに役立つだろう。今のところ時刻がUTCなのは良しとしよう。

 

2026年9月13日日曜日

Arduino手習い(WiFi WEBサーバ、気象データ(BME280)の表示)

 動的なWEBサーバを構築するに当たって、リアルタイムデータが欲しい。ネットで事例を当たっていると1個で気圧・温度・湿度が図れるBME280というのセンサーが便利なようだ。そういえば似たようなセンサー昔秋月で買ったことがあるぞ、と過去の未完成基板を引っ張り出してみたら上手い具合にBME280モジュールが載っていた。

早速、簡単な事例を探して動かしてみたら必要なライブラリーのインクルードと若干の修正で簡単に動いた。

PCからアクセスすると次のような表示になる。 

この元となったブログは「すっさんぽ」さんの、ESP32とBME280で、温湿度計を作った、だ。

このプログラムはネット経由で時刻を取得するのでESP32スタンドアローンでは動かせないが、一方mDNSの機能を搭載し、IPアドレスではなくホスト名(esp32.local)でアクセスできる所が優れている。

データは1分毎に更新されるが、それはクライアント側からリロードのリクエストを出す事で実現されているので、最終的に目標としているPUSH型ではない。 

ちなみに、ソースコードの変更点は次の通り。

  • 漢字コードがShift-JISだったのでUTF-8に変更
  • HTMLの定義の中の 
    <title></title>

    <title>気温・湿度・気圧(BME280)</title>
    に変更(ブラウザのタブにタイトルが表示されるようになる)。
  • シリアル通信が初期化されていなかったので
    void setup() {
    の次の行に
    Serial.begin(115200);
    を挿入。
  •  setup()の最後に
    Serial.println("ESP32 Web Server(+BME280) Ready!");
    を挿入。   

 以上、

2026年9月12日土曜日

フォノイコライザーを作る(その2)

 基板が製作されている間に秋月へ部品を調達に行った。八潮店に一通りの部品は揃っていたが、2セット分を買ったので物によっては在庫数が少なく全部買い占めた物や足りない物もあった(数日中に補填されるようだが)。今回作る回路は次の通り(回路図にあるOPアンプはパターンを作るため適当に選んだもので実際には前回説明した物を使う)。

部品を買ってみて特に驚いたのはオーディオ用無極性電解コンデンサー220u25Vが思いのほか大きいことだ。直径が1cmと大きい事は基板設計時に分かっていたが高さも25mmあり設置条件に影響する。ひょっとしたら無極性にするために440uFを2個直列にしているのかな?次の写真は今回買ったもので左から10uF50V、220uF25V、470uF35V。10uFと220uFはオーディオ用無極性(MUSE・ES)、470uFは普通の電解コン。

ちなみにこの220uFのコンデンサーは直流ゲインを0dBに落とすための物なのでOPアンプのバランスが良ければ、或いは重低音を重視する場合は不要で空いた端子は短絡(ショート)すればよい。この場合、直流ゲインは60dB(1000倍)になる。ちなみにこのコンデンサと直列抵抗(270Ω)によるカットオフ周波数は約3Hzだ。

(続く)

 

 

2026年9月7日月曜日

フォノイコライザーを作る

 知人より、古いレコードプレーヤをオーディオアンプに繋ぎたいという相談が来た。オーディオアンプにはフォノ端子が付いていなくてLine入力に入れてボリュームを最大にしても小さな音しか出ないそうだ。音質に拘りは無く普通に音が出れば良いようだ。

レコードプレーヤをフォノ端子の無いオーディオアンプに繋ぐためにはRIAA特性を補正できるフォノイコライザーを入れる必要がある。中華製の安いフォノイコライザーを売っているサイトもあるが特性的に怪しく評価が低いそうだ。プレーヤの内部に組み込めるようなものを作って欲しいとの事なのでネットで回路を拾って基板を起こしてみた。

参考にした回路は次のWEBページだ。RIAA特性を構成するには中途半端な値の部品を使う場合が多いが次のWEBページでは出来るだけ普通の系列の値に合わせてある。

OPアンプやコンデンサには秋月で買える範囲で評判の良い部品を使うつもりだ。OPアンプにはMUSESシリーズが評判が良いようだが値段が張る。代わりに手頃な価格のNL8902ANを使う事とした。部品代を見積もってみたが電源込みで2千円を超える。それに今回からPCB製造料や送料が約2倍に跳ね上がっていた。
 
RIAAイコライザーは入力電圧が数mV程度であるうえに低音のゲインが60dB近くありハムノイズを拾い易い。FET入力でインピーダンスの高いOPアンプを使うので(NL8902ANはFET入力)なおさらだ。以前、オシロスコープのプローブを解放した状態で室内蛍光灯下に置いたら、それだけで数mVのノイズが観測できた。室内のノイズは思いのほか大きいようだ。
 
私がこれまでの制作した基板はデジタル系が主で殆どノイズを気にする必要は無かったが、今回初めてアナログ系の基板を設計した。今回設計したアナログ系は(デジタル系と違って)配線が短く簡単だった。配線を考える上ではGNDを分離するなどノイズにも気を使ったつもりだが結果は出来上がった基板を組み立てて音を出してみるまで分からない。いや、我が家にはレコードプレーヤは無いので誰かに評価してもらうか測定器で測る事しか出来ないが、結果はどうだろうか。

(続く) 

 

2026年8月30日日曜日

Arduino手習い(WiFi AP WEBサーバ)

 前回作ったプログラムはWiFiルータ経由でサーバとして機能するように出来ているので、1:1で直接携帯と通信する事は出来ない。そこを何とか出来ないかと調べてみた。そのようなサーバを構築するにはESP32がアクセスポイント(AP)として機能する必要があるとともにDHCPなど必要な機能を追加する必要がある。

何か良い例は無いかと探していたら「勝手な電子マン」さんのBlog「ESP32のアクセスポイント (つまりスタンドアローンWiFi-LAN)」を見つけた。

このBlogのsetup()部分を参考に、loop()は部分は前回のサーバプログラムを踏襲してプログラムを組んでみたら。ほとんど修正無く動いた。

使い方は、

  1. 先ずこのプログラムを書き込んだESP32を起動しサーバを立ち上げる。
  2. 次に携帯のWiFiの設定を開き、このプログラムで設定したSSID(ESP32-AP)に接続する(このときプログラム中で設定したパスワードが必要)。

  3. 携帯のブラウザを開きサーバのIPアドレスに接続すると前回と同じ画面が表示される。

 このとき携帯に割り振られるIPアドレスはサーバのIPアドレス+1だった。

とりあえず動いたので、setup()までのソースコードを紹介する。loop()部分は前回と同じなので省略した。 

/********************************************************
 * Original: Independent Access-Point - ESP32 simple example  
 *        Initial version V.00 Sept.26 2020
 *  https://a-tomi.hatenablog.com/entry/2020/09/27/212032
 *                                   by Akira Tominaga
 * Modified by MYcrosLip
********************************************************/
#include "WiFi.h"
const char ssid[]  = "ESP32-AP";  // *** set any ssid ***
const char pass[] =  "11223344";  // *** set any pw   ***
const IPAddress ip(192, 168, 11, 1);   // *** set any addr ***
const IPAddress subnet(255, 255, 255, 0);
WiFiServer server(80);
String header;

gpio_num_t LED = GPIO_NUM_5;
String output5State = "off";
const int output5 = 5;

unsigned long currentTime = millis();
unsigned long previousTime = 0;
const long timeoutTime = 2000;

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);  
  digitalWrite(LED, LOW);
   delay(100);
  WiFi.softAP(ssid, pass);
   delay(100);
  WiFi.softAPConfig(ip, ip, subnet);
  IPAddress myIP = WiFi.softAPIP();
  server.begin();
  Serial.print("SSID= ");
  Serial.println(ssid);
  Serial.print("Fixed IP addr= ");
  Serial.println(myIP);
  Serial.println("Server starting!");
}