2025年8月12日火曜日

IRリモートでRGBLED点灯

 今回は Raspberry Pi Pico W を使って、赤外線リモコンの信号を受信し、RGB LED を光らせる実験に挑戦してみましょう。

テレビのリモコンなどに使われている赤外線(IR)リモコンは、ボタンを押すと「特定のパターンの信号」を赤外線で送信しています。この信号を、赤外線受信モジュール(たとえば VS1838B など)で受け取り、Pico W に接続して解析します。

リモコンのボタンによって異なる信号が届くので、受信したパルスの長さや間隔を読み取り、「どのボタンが押されたか」を判定できます。今回は、その判定結果に合わせて RGB LED の色を変える のが目標です。たとえば

  • 1ボタンを押すと白色

  • 2ボタンで赤色

  • 3ボタンで緑色

  • 4ボタンで青色

というように、ボタンごとに LED の色が変わるようにします。

RGB LED は赤・緑・青の 3 つの LED が 1 つにまとまった部品で、それぞれの色を ON/OFF(あるいは明るさを変える)ことで多彩な色を作れます。まずは 「IR 信号を受け取って LED を光らせる」 という基本動作ができれば OK。慣れてきたら、次のステップとしてなめらかな PWM 制御やグラデーション発光などにも挑戦してみましょう。

DCモータを動かす(PWM)

 今回は DCモーターの制御 に挑戦します。

モーターの回転速度を調整するには、一般的に PWM(パルス幅変調) という方法を使います。PWMとは、電源のONとOFFをとても速いスピードで切り替えることで、モーターに流れる電流の平均量をコントロールする技術です。

  • ONの時間が長いほど、モーターは速く回転します。

  • OFFの時間が長くなると、回転はゆっくりになります。

PWMの大きな利点は、常に最大電圧をかけながらも回転速度を調整できる点です。これにより、低速でも**高いトルク(回す力)**を維持することができます。

今回の回路は「まずモーターを動かしてみる」ことを目的としたシンプルな構成にしています。

PWM(パルス幅変調)とは?

用語意味モーター制御での役割
パルス (Pulse)デジタルの ON(High)/OFF(Low) 信号モーターへ「電圧をかける/切る」の合図
幅 (Width)ON 状態が続く時間(Duty)幅が長いほど平均電圧↑=回転速↑
変調 (Modulation)幅を変えて平均値を調整幅を短くすれば平均電圧↓=回転速↓

周波数
1 kHz と設定すれば 1 秒間に 1,000 回 ON/OFF を繰り返す。
周波数そのものは速度に大きく影響せず「どれだけ細かく刻むか」を決めるパラメータ。

Duty(デューティ比)
0 %=常時 OFF、100 %=常時 ON。
例: 1 kHz で 50 % Duty → 1 ms 中 0.5 ms ON / 0.5 ms OFF。
平均電圧が Vin × Duty になるイメージで、DC モーターは平均電圧に比例して回転速度が変わる。

サーボモーターを動かしてみよう(SG90制御入門)

 回は**ラジコンサーボ(RCサーボ)**を動かしてみます。

ロボットを作るときや、センサーと組み合わせて何かを動かしたいときなど、RCサーボはとてもよく使われる部品です。小さなモーターにギアや制御回路が内蔵されていて、指定した角度まで正確に動かせるのが特徴です。

そこで今回は、代表的なサーボモーター「SG90」を使って、サーボを動かす基本的な仕組みや制御方法を学んでいきましょう。

🌀 そもそも「PWM」ってなに?

**PWM(Pulse Width Modulation:パルス幅変調)**とは、
デジタル信号(ONかOFFだけ)を工夫して「出力の強さ」や「角度」を調整する方法です。

  • サーボモーターは 50Hz の PWM信号(1秒間に50回)で角度を決めます。

  • 「ONにしている時間(パルス幅)」を変えると、サーボの角度が変わります。

パルス幅(ON時間)おおよその角度
約0.5ms(ミリ秒)左端(0度)
約1.5ms真ん中(90度)
約2.5ms右端(180度)

💡 PWMの周期は「20ms(=1秒 ÷ 50Hz)」で、
その中の 0.5〜2.5ms の間だけピンをONにします。

回路


SG90の線接続先(Pico)説明
赤(VCC)5V(VSYSや外部5V)電源(強い電流)
茶(GND)GNDマイナス(共通)
橙(PWM)GP16(ピン21)PWM信号(制御)

シリアル通信(発光ダイオードの点灯・消灯)

 前回は、シリアル通信を使って送られてきたデータをそのまま送り返す「オウム返し」のプログラムを作成しました。今回はその応用として、シリアル通信を使って発光ダイオード(LED)の点灯と消灯を制御するプログラムを作ってみましょう。

基本的な通信の仕組みは前回と同じですが、今回は次の3つの点が異なります。

1つ目は、回路に発光ダイオードが追加されている点です。
2つ目は、受信したデータに応じてLEDを点灯または消灯する点です。
そして3つ目は、受信したデータをパソコン側へ送り返さない点です。

これらの違いを除けば、基本的な構成や使い方は前回と共通しています。前回の内容を参考にしながら、今回の制御も確認してみましょう。

シリアル通信(オウム返し)

 Raspberry Pi Pico Wは単体で使うのも便利ですが、パソコンや他のマイコンなど、さまざまな機器と通信できるとさらに活用の幅が広がります。

そこで今回は「シリアル通信」について紹介します。

まずは、パソコンから送られてきたデータをPico Wが受け取り、同じデータをそのままパソコンに送り返す、いわゆる「オウム返し(エコー)」を実装してみましょう。

シリアル通信とは?

シリアル通信は、マイコンとパソコンや他の機器がデータを1ビットずつ順番に送受信する通信方式です。Raspberry Pi Pico WではUART(Universal Asynchronous Receiver/Transmitter)というハードウェアを使って実現します。

接続回路


 id      TX       RX        baudrate     parity    stopbit
 0  GPIO0 GPIO1   9600  なし  1
 1  GPIO4 GPIO5   9600  なし  1

今回はUART1(GPIO4:TX、GPIO5:RX)を使用します。

タイマーで発光ダイオード(LED)を1秒ごとに点滅させる

 ここでは、前回作成した「スイッチで発光ダイオード(LED)を点灯・消灯させる回路」を活用し、LEDを1秒ごとに点灯と消灯を繰り返すプログラムを作成します。回路図などの詳細は「スイッチで発光ダイオード(LED)を点灯・消灯させる」をご参照ください。

タイマーの種類と説明

1.ONE_SHOT:タイマーが一度だけ動作し、指定時間後に処理を実行する。

2.PERIODIC   :指定した周期で繰り返しタイマー割り込みが発生する。

1. ONE_SHOTモード(1回だけ処理)

from machine import Pin, Timer

led = Pin(15, Pin.OUT)
led.value(1)  # LEDを点灯しておく

def one_shot_callback(timer):
    led.value(0)  # 一度だけLEDを消灯
    print("ONE_SHOT: LEDを消灯しました")

timer = Timer()
timer.init(period=3000, mode=Timer.ONE_SHOT, callback=one_shot_callback)
# 3秒後に一度だけコールバック関数を呼ぶ

while True:
    pass  # メインループは空




>>> %Run -c $EDITOR_CONTENT

MPY: soft reboot
ONE_SHOT: LEDを消灯しました

スイッチで発光ダイオード(LED)を点灯・消灯させる

 スイッチを使って発光ダイオード(LED)を制御してみましょう。今回は、スイッチをオンにすると LED が点灯し、オフにすると消灯するように動作させます。もちろん、スイッチと LED を直接接続するのではなく、適切な回路を介して制御します。

1.回路


GPIO16 はデジタル入力として使用し、内部プルアップを有効にします。GPIO15 は出力として設定します。なお、接続には 1kΩ(1キロオーム)の抵抗を使用します。

Google Spread Sheetの利用

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