Raspberry Piで電子工作:LEDの明るさを可変に:PWM(パルス幅変調)を行う

Raspberry Piは、電子工作用のデジタル入出力を行うインターフェイスであるGPIO(”汎用入出力”の意味があります)を持つ、安価で小型のコンピューターです。
今回はLEDの明るさを変える電子工作を例に、ScratchGPIOを使ってソフトウェアで擬似的にアナログ入出力を行う方法をご紹介します。

【目次】
1.序章
2.PWMとは…デジタルを擬似的にアナログにする方法
3.ScratchGPIOでのPWMのプログラミング
3.1.Raspberry PiにScratchGPIO(の最新版)をインストール
3.2.ScratchGPIOを起動
3.3.PWMを行うGPIO端子のための変数を用意
3.4.PWMを行うGPIO端子のための変数に値を代入
4.PWMのプログラミング例…動画
5.まとめ

1.序章

例えば、Raspberry PiでLEDを点けたり消したりする通称Lチカ(LEDチカチカ!)は、GPIOのデジタル信号のオンオフを制御することによって実現します。
一方、今回ご紹介するPWMは、デジタル入出力で、LEDをだんだん明るくしたり、だんだん暗くしたりする制御を行う方法です。

2.PWMとは…デジタルを擬似的にアナログにする方法

PWMは、Pulse Width Modulationの略で、日本語ではパルス幅変調といいます。
PWMは、デジタルを擬似的にアナログのような振る舞いに見せる手法です。
例えば、Raspberry PiのGPIOではデジタルの入出力しか扱えませんが、そこに作った回路のLEDの出力を、通常のオンのときの1/2の明るさで出力したいときなどに、PWMを使います。

Raspberry Piの電圧はオンのとき3.3V、オフのとき0Vです。
PWMでは、内部的には、次の考え方により擬似的にアナログ化を行い、例えば3.3Vの明るさを見かけ上1.65Vの明るさにします。

PWMで、LEDの明るさを実際の1/2に見える出力にするには、短い時間を1つの単位として、オンを単位時間の半分、オフを単位時間の半分、のオンオフ半々にして、この単位時間のパターンを繰り返すことで実現します。

Raspberry PiでPWMを実現するには、ソフトウェア的な方法とハードウェア的な方法があり、今回ご紹介するのは、ソフトウェア的な方法の中の、Scratchを使ってできる、ScratchGPIOを使用する方法です。

ScratchGPIOでのPWMのプログラミングでは、上記で説明した単位時間ごとの細かい処理を書く必要はなく、次に説明する流れでプログラミングしていきます。

3.ScratchGPIOでのPWMのプログラミング

スポンサーリンク

3.1.Raspberry PiにScratchGPIO(の最新版)をインストール

(1)Raspberry PiにScratchGPIO(の最新版)をインストールしておきます。
次のURLから、最新のScratchGPIOを無償で入手します。
インストール方法は、そのページ内に記載されています(英語)。
URL→http://simplesi.net/scratchgpio/scratch-raspberrypi-gpio/

3.2.ScratchGPIOを起動

(2)ScratchGPIOを起動します。
Raspberry PiにScratchGPIOをインストールすると、アイコン(Scratch猫のアイコン)が自動で作られるので、起動するときはそのアイコンを使用します。

3.3.PWMを行うGPIO端子のための変数を用意

(3)PWMを行うGPIO端子のための変数を用意します。
[変数]グループを選択し、そのときにブロックパレットに表示される[新しい変数を作る]ボタンをクリックして、変数名を「Power端子番号」(端子番号の部分は、GPIOの1~40までのどれかの使用する端子番号を半角で)にして、変数を用意します。

このサイトの他のScratchのブログ記事をご覧の方の中には、「[変数]グループ」というグループは初耳だという方も多いのではないでしょうか。
Raspberry Piでは、Scratch1.4が搭載されています。
現在、PC用として配布されている最新のScratchはScratch2.0で、さらに、Scratchコミュニティーサイトで保存や共有できるプログラム(Scratchではプログラムをプロジェクトと言います)もScratch2.0で作られたものです。
Scratch1.4で「[変数]グループ」と呼ばれるグループは、Scratch2.0の「[データ]グループ」と同じです。

3.4.PWMを行うGPIO端子のための変数に値を代入

(4)[変数]グループの[■を〇にする]ブロックで[■]を上記変数名に、[〇]を0~100(半角で)の間の数値にして、このブロックをスクリプトに追加します。
値は、0V(オフ)を0、3.3V(オン)を100として、見かけ上どの程度の入出力にしたいかを指定するためのもので、例えば、1/2にしたいときは、値を50にします。
この代入のブロックの実行で、デジタル入出力が擬似的にアナログ化されます。

4.PWMのプログラミング例…動画

動画では、上記手順の2,3,4をご覧いただけます。
動画で作るプロジェクトは、LEDをオフの状態から10段階でだんだん明るく、3.3V(100%オン)の明るさまでにしたら、そこから10段階でだんだん暗く、最後は0V(オフ)まで変えるものです。

LEDをだんだん明るくし、だんだん暗くするプロジェクト

動画では、配線図を紹介し、プログラミングし、実行して、プロジェクトを保存するところまで、順にお見せしています。

なお、この動画で使ったRaspberry Piの配線は、以下の配線図です。

Raspberry PiとLEDの配線図

この配線図は、次のブログ記事のLチカのときの配線と同じです。
Raspberry Pi(ラズベリーパイ):Lチカ(プログラムでLEDを点滅させる電子工作) 

また、上記ブログ記事の配線の詳しい説明は、次のブログ記事で行っています。
Raspberry Pi:ラズベリーパイを電源にしてLEDを点灯する

以下が、今回のPWMのプログラミング例の動画です。

参考:YouTube動画「Raspberry Pi(ラズベリーパイ)で電子工作: LEDの明るさを可変に: PWM(パルス幅変調)

5.まとめ

・PWM(Pulse Width Modulation:パルス幅変換)は擬似的なアナログ変換
・ScratchGPIOでは、基本的にすべてのGPIO端子でPWMが可能
・ScratchGPIOでは、PWMにする端子を、変数名「Power端子番号」(端子番号は回路で使用したGPIO端子番号に対応した半角の数字)の変数を用意して制御
・ScratchGPIOでは、[変数]グループの[■を〇にする]ブロックを次のように設定して、スクリプトに追加し、そのスクリプトが実行されると擬似的にアナログ化
設定は、[■]に変数「Power端子番号」を、[〇]に0(0V, オフ)~100(3.3V, オン)の間の数値を半角の数値を指定

参考サイト:
●Cymplecy (Simplesi)
ScratchGPIO – Installing
Using Motors

スポンサーリンク

コメント

スポンサーリンク