今回もRaspberry Pi Zero 2 Wをいじって、基本的な使い方を調べたい。
で、今回のテーマは
・定期タイマー割込み
・LCDバックライト調整用PWM出力
の2つを試してみたい
①定期タイマー割込み
まず、ChatGPTに、定期タイマー割り込みのサンプルをお願いしたのだが
「 Raspberry Pi Zero ではマイコンのように「ハードウェアタイマ割り込み」を直接使うことはできません。」
とのこと。
その代わりに、2つのやり方があるらしい。
方法① signal.setitimer を使う(割り込みに近い動作)
ポイント
●signal.setitimer(signal.ITIMER_REAL, 初回遅延, 周期)
→ 今回は 0.5, 0.5 なので 0.5秒ごとにシグナルが発生。
●ハンドラ (handler) が呼び出されると、メインループが止まっていても実行されます。
●Raspberry Pi Zero の Linux 環境ではこれが「割り込みっぽい」動作になります。
と、言うことらしい
サンプルコードをコピペして動かしてみる
にゃるほど・・・
方法② スレッド+threading.Timer を使う
もし「シグナルを使うのはちょっと不安」という場合は、threading.Timer を使う方法もあります。こちらは完全な割り込みではありませんが、実際には十分使えます。
🔹 threading.Timer は新しいスレッドを作って処理を呼び出します。
🔹 正確さは signal の方が上ですが、こちらは他のモジュールと干渉しにくいです。
と、言うことらしい
また、サンプルコードをコピペして動かしてみる
にゃるほど、こっちの方がシンプルで良いではないか。今後どっちを使うかは考える。
②PWM出力を試す
次にLCDバックライト調整用PWM出力を試す。
バックライト調光では少なくとも200Hz以上は必要で、目の疲れを軽減するには2KHz以上が望ましいらしい。なので、2KHz以上でのPWM出力とする
で、またChatGPTに訊いてみると、また2つのやり方があるらしい。
方法①標準の RPi.GPIO ライブラリを使う
・GPIO.setmode(GPIO.BCM) → BCM番号指定 (例: GPIO18)。BOARDモードでもOK。
・GPIO.PWM(pin, 周波数) で PWM オブジェクト生成。
・pwm.start(デューティ比) で開始。
・pwm.ChangeDutyCycle(x) でデューティ比を変更 (0〜100)。
・pwm.ChangeFrequency(f) で周波数も変更可能。
注意点は、「ソフトウェアで実装されているためジッター(ぶれ)が大きく、LEDのフェードくらいなら問題ないですが、サーボやモーターなど正確さが必要な用途では安定しません。」
とのこと
と、いうことで簡単なプログラムを走らせてみる。
2KHzでDuty 50%に設定しただけ
GPIO18にLEDを付けて動かしてみる
格安中華オシロで波形を見ると、かなり不安定なことが分かる。
LEDの光り方もちらちらして、バックライトには不向きだと思われるので、却下。
方法② pigpio を使う
特徴は
・ハードウェアPWM対応ピン (GPIO12, GPIO13, GPIO18, GPIO19) なら、
ハードウェアPWMを生成できて非常に正確。
・Duty比は 0〜255 の範囲で指定。
・周波数も正確に制御可能。
ただ、pigpioを使うにはpigpioを起動しておく必要がある。
これを実行して、電源投入時に自動で起動するように設定
sudo systemctl enable pigpiod
sudo systemctl start pigpiod
起動したら、また簡単なプログラムを走らせてみる。
2KHzでDuty 50%に設定しただけ
GPIO18にLEDを付けて動かしてみる
今回は非常に安定している。
ハードウェアPWMなのでLEDの光り方も安定してちらつきが無い。
やはりハードウェアPWMに勝るものは無いのである。
ああ、ここまでは特に迷うことなく順調だった。
今後も、こんな感じで進められれば良いのだが・・・
「順調なようぢゃな、では寝るとするニャ」
また寝るんかい! 1日23時間くらい寝てるよね!?






