2025年8月12日火曜日

超音波センサ HC-SR04 を使ったリアルタイム距離測定と OLED 表示

  HC‑SR04 超音波距離センサを Raspberry Pi Pico から制御し、OLED(SSD1306 128×64)にリアルタイム表示するデモを MicroPython で作成します。センサが発した超音波が物体で反射し戻るまでの往復時間を計測し、Pico 内蔵温度センサで取得した気温を用いて音速を補正することで、測定精度を高めます。

配線(GPIO ピンアサイン)

機能デバイスPico GPIO
SDAOLED (I²C id 0)GP16
SCLOLED (I²C id 0)GP17
TRIGHC‑SR04GP14
ECHOHC‑SR04GP15

この構成で、約 0.3 秒ごとに “気温・距離” を更新しながら OLED に表示する MicroPython サンプルを実装します。

BME280センサーの値をOLEDディスプレイにリアルタイム表示

 Raspberry Pi Pico W に BME280(温度・湿度・気圧センサー)と OLED(SSD1306) を I²C でつなぎ、センサーで測った値をLCDに表示します。

測定したデータはリアルタイムに画面に表示され、室内の環境の変化がすぐにわかるようになります。

1. 配線

両方とも I²C を使うので、SDA と SCL の 2 本を共通でつなぎます。

機能Pico WBME280OLED(SSD1306)
SDA  GP16SDASDA
SCL  GP17SCLSCL
3V33V3(OUT)VCCVCC
GND  GNDGNDGND

ポイント

  • Pico W の I²C0(GP16/17)を使う例です。ほかのピンでも OK。

  • 配線ミスがあると画面がつかないので、色付きジャンパー線で整理すると安心です。

SDカードの BMP を ST7789 LCD (SPI) に表示

 Raspberry Pi Pico や Pico W などのマイコンでは、カラー画像の表示も意外と簡単に行えます。今回は、SPI接続のフルカラーLCD(ST7789) に、SDカードから読み込んだ BMP画像を表示してみます。

📁 SDカードに保存した画像ファイル(BMP形式)を読み取り、📺 ST7789ディスプレイに転送して表示するという構成です。
小さなディスプレイにお気に入りのイラストやロゴ、写真などを表示できるようになります!

🔌 SPI通信ってなに?

ST7789 ディスプレイとは、SPI(Serial Peripheral Interface)通信を使ってやり取りを行います。

SPIとは、以下のような特徴をもった高速なシリアル通信方式です:

  • 1対1 または 1対多 で使える

  • 複数本の信号線(通常4本)で構成される

    • MOSI(Master Out Slave In):データ送信

    • MISO(Master In Slave Out):データ受信(今回は使わない)

    • SCLK(Serial Clock):クロック信号

    • CS(Chip Select):通信相手の選択

  • フルデュプレックス通信(送受信同時)にも対応(今回は片方向のみ)

📷 今回は、Picoが「マスター」、ST7789が「スレーブ」として動作し、画像データを高速に転送していきます。

microSDモジュールを使ってデータを読み書き

 今回は、microSDカード用の「AE-MICRO-SD-DIP」モジュールを使って、

MicroPythonでmicroSDカードにデータを読み書きする方法を紹介します。
公式ライブラリを使い、SPI通信で簡単にデータを書き込みます。

🔄 SPI通信とは?

SPI(エスピーアイ)通信は、マイコン(例:Raspberry Pi Pico W)と周辺の電子部品(SDカード・液晶など)をつなぐための「データのやりとり方法」の一つです。

かんたんに言えば…

📡 SPIは、“マイコンと部品が会話するためのルール” です。

💬 どんなふうに通信するの?

SPI通信では、4本の線を使ってやりとりします。

信号線の名前はたらきPico W の例
SCK(クロック)データのタイミングを決める時計のようなものGP18 など
MOSI(モジー)マイコンから部品へデータを送るGP19 など
MISO(ミソー)部品からマイコンへデータを返すGP16 など
CS(チップセレクト)どの部品と通信するかを選ぶスイッチGP17 など

📝 MOSI = 「Master Out / Slave In」
📝 MISO = 「Master In / Slave Out」
👉 マスター(=Pico)がデータを出す/受け取る方向を表しています。

SSD1306 OLED:I²C接続で表示

 Raspberry Pi Pico W に 0.96 インチ I²C 接続 OLED(128 × 64 ドット)をつないで、表示テストをしてみましょう。

この OLED は SSD1306 というコントローラ IC で動いており、I²C アドレスは 0x3C です。
自分でレジスタを叩くこともできますが、今回は初心者でも扱いやすい SSD1306 用ライブラリ を使って手早く動かしてみます。

  1. Thonny IDE を起動
    Pico を USB でつないだら、Thonny のメニューから
    [ツール] → [パッケージを管理...] を選びます。



I2C接続のLCD「AM1602」に文字を表示

 今回は、Raspberry Pi Pico W を使って、**「AM1602」**という小型のI2C接続LCDディスプレイに文字を表示する方法をご紹介します。

AM1602は、「16文字 × 2行」のテキストを表示できる液晶ディスプレイです。I2C通信に対応しているモデルを使えば、配線が少なくて済み、初心者でも扱いやすいのが特長です。

このガイドでは、MicroPythonというシンプルでわかりやすいプログラミング言語を使って、「Hello, World!」などのメッセージをLCDに表示します。MicroPythonでI2C通信の仕組みを学ぶことが目的なので、あえてライブラリは使わず、自分でプログラムを組んでいきます(※専用ライブラリの有無は未確認です)。

MicroPythonでのI2C設定について

MicroPythonでは、I2Cは次のようにして初期化します:

from machine import I2C, Pin

i2c = I2C(id, freq=400_000, scl=Pin(...), sda=Pin(...))

idを指定するだけでも使えますが、その場合は以下のようなデフォルト設定になります:

  • id = 0 → SCL = GP9、SDA = GP8(周波数 400kHz)

  • id = 1 → SCL = GP7、SDA = GP6(周波数 400kHz)

また、Raspberry Pi Pico Wでは、以下の12通りのピンの組み合わせでI2C通信が可能です:

idSDAピンSCLピン
0GPIO0GPIO1
1GPIO2GPIO3
0GPIO4GPIO5
1GPIO6GPIO7 ※デフォルト
0GPIO8GPIO9 ※デフォルト
1GPIO10GPIO11
0GPIO12GPIO13
1GPIO14GPIO15
0GPIO16GPIO17
1GPIO18GPIO19
0GPIO20GPIO21
1GPIO22GPIO23
この中から、自分の回路に合わせて都合のよいピンを選んで使えます。

I2C接続1602キャラクタLCD(HD44780+PCF8574A)の操作

 前回は、1602 LCD をビットパラレルモード(4ビットデータ通信)で直接制御しました。これは LCD の各制御線(RS、EN、D4〜D7など)を Raspberry Pi Pico W の GPIO に1本ずつ接続して動かす方法で、仕組みを理解するにはとても勉強になります。

しかし、この方法では接続に使うピンが多くなり、GPIOの数が限られている小型マイコンでは少し不便に感じることもあります。

そこで今回は、**PCF8574A という I/O エクスパンダ(拡張チップ)**を使って、I²C(アイ・スクエアド・シー)通信で LCD を制御する方法を紹介します。この方法を使うと、LCD の操作に必要な信号を **わずか2本の通信線(SDA と SCL)**にまとめられるため、配線がとてもスッキリし、他のセンサーやデバイスとの接続も簡単になります。

初心者の方でも、I²C の基本を学びながら、LCD 表示の実用的な使い方にステップアップできる内容になっています。マイコンの入出力ピンを節約しつつ、LCD にメッセージを表示したい方にぴったりの方法です。

PCF8574A と I²C って何?

PCF8574A
PCF8574A は NXP 製の “I/O エクスパンダ” と呼ばれる IC で、

  • 8 本の GPIO を I²C でまとめて増設できる

  • 各ピンは入力にも出力にも使える “擬似オープンドレイン” 方式

  • アドレスピン(A2–A0)の組み合わせで 0x38 – 0x3F の 8 通りの I²C アドレスを選択可能

今回の 1602 LCD では、PCF8574A の 8 本を下図のように割り当てるのが定番です。

PCF8574A ピンLCD 信号役割
P0RSデータ/コマンド切替
P1RW読み書き切替(通常は GND = 書き込み専用)
P2ENイネーブルパルス
P3BLバックライト ON/OFF
P4–P7D4–D74 ビットデータバス

I²C(Inter‑Integrated Circuit)
I²C は 1980 年代に Philips(現 NXP)が開発した 2 線式のシリアル通信規格で、

  1. SDA(データ線) と SCL(クロック線) だけで通信

  2. 7 ビットまたは 10 ビットの アドレスでデバイスを識別

  3. マスター(Pico W) がクロックを生成し、スレーブ(PCF8574A など) に読み書き要求を出す

  4. 複数デバイスを同じ SDA/SCL に “バス” でぶら下げられる(プルアップ抵抗が必須)

初心者が最初につまずきやすいポイントは「プルアップ抵抗がないと信号が正しく High にならない」ことですが、多くの市販 I²C‑LCD モジュールには 4.7 kΩ 付近の抵抗が実装済みなので安心です。

Google Spread Sheetの利用

  以前に ESP32 で作っていたものを、Raspberry Pi Pico W + MicroPythonで再現してみました。 1.Googleスプレッドシートの設定 1.Google Drive → 右クリック → Google スプレッドシート 2.作成して共有をクリック