お父にゃんの電子工作 -24ページ目

お父にゃんの電子工作

暇なおじさんが、電子工作(主にラジオ製作)をして勝手な感想を書く

今回も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時間くらい寝てるよね!?