RaspberryPi ラズパイ(C言語) ラズパイ(初心者)

ラズパイでPWM制御(ハードウェア方式編)!

ラズパイでPWM制御(ハードウェア方式編)!

スポンサーリンク

こんにちは。駆け出しエンジニアのまっきーです。

今回はハードウェア方式のPWM制御を行っていきたいと思います。

ラズパイにはソフト側から制御するソフトウェア方式と、ハード側から制御するハードウェア方式がありましたね。詳しい説明は前回の記事をご覧ください。

前回は、LEDの照度を変化させましたが、今回は音を鳴らそうと思ます。

目的

スイッチを押すと、圧電ブザーから「ドレミ」を鳴らす(スイッチ一つで一音)

圧電ブザーとは

ブザーの中には、圧電セラミックスという電圧によって伸びたり縮んだりする特殊なセラミックスが入っています。

  1. 圧電ブザー内部の圧電セラミックスは電圧をかけると伸びる
  2. 貼り合わせた金属がそれにつられて曲がる
  3. 電圧をかけるのを辞めると、圧電セラミックスが元に戻り、貼り合わせた金属板も元に戻る
  4. ONとOFFを繰り返す事によって、圧電セラミックスと金属板を振動させることで音を鳴らす

引用元(https://thunderblog.org/2019/01/piezobuzzer.html)

上記のような仕組みで音が鳴ります。

準備

用意するもの

・RaspberryPi 3B+

・圧電ブザー(piezo buzzer)

・タクトスイッチ 3つ

・抵抗(1KΩ) 1つ

・ジャンパー線(オス・オス)5本

・ジャンパー線(オス・メス)4本

いつものように、すべてAmazonで購入しました。

https://amzn.to/34ViqLq

https://amzn.to/2DpI0No

今回の目的は、音階を鳴らすことなので周波数を変えなければいけません。

鳴らしたいドレミの周波数は次のようになっています。

・ド 523Hz

・レ 587Hz

・ミ 659Hz

そこで使用するのがPWM制御というわけです。

具体的な設定の仕方を説明します。

PWM制御(ハードウェア)の設定

以下の5つの手順で音を鳴らす(PWM信号を出す)ことができます。

  1.  ピンモードをPWM用にする
  2.  周波数に基づき、最小変化幅(分解能)を設定
  3.  階調の設定
  4.  モードの設定
  5.  音を鳴らす

一つずつ詳しく説明していきます。

1 ハードウェア方式のPWMには、2チャンネル(PWM0,PWM1)存在します。

 以下のピンと対応しています。

 PWM0 (GPIO12,GPIO18)

 PWM1 (GPIO13,GPIO19)

 今回は GPIO18を使用します。

 ピンの設定としてpinMode(pin,PWM_OUTPUT)関数を使用します

2 pwmSetClock(int divisor)で内部クロックの分周を設定します。

 divisorの値は、内部クロック*最小変化幅で求められます。 

 ラズパイ3/3B+の内部クロックは19.2MHz(4は54MHz)です、なので、最小変化幅を10㎲に設定したい場合はdivisorの値を19.2MHz*10μs=192と設定します。

3 pwmSetRange(range)で階調を設定します。この値は100で大丈夫です。

4 ハードウェア出力には2つのモードがありますマークスペースモードとバランスモードです。

 今回はマークスペースモードを使用します。

 pemSetMode(PWM_MODE_MS)

5 pwmWrite(pin番号,value(パルスONの値))でPWM信号を発生させます。

回路図

ブザーは種類によって極性のあるものとないものがあるみたいなので注意してください。

コード

拙いコードで申し訳ないですが、解説していきます。

1~11行目 ヘッダーファイルインクルード、変数の定義。最小変化幅(minwidth)は都度、変化させていきます。

14~31行目 ドレミの音を作る関数です。

T = 100us * range

f = 1 / T = 1 / 100us * range

という式を覚えていますか?それを少し変更して、

T = minwidth * 100

f = 1 / T = 1 / (minwidth * 100)

T    PWM信号の周期

f     PWM信号の周波数

range     階調(1周期を何個に分割するかを表す)

minwidth  最小変化幅

この式をもとにminwidthの値を求め、PWM信号を発生させています。

/2の部分は100/50でデューティ比50%の設定です。

35~44行目 スイッチの初期設定(プルアップorダウンの設定忘れずに!)

47~49行目 PWMの設定

51~63行目 押されたスイッチに対応して音が鳴るようにif文を設定しています。

少し音割れしていますが、ドレミの音を鳴らすことができました!

まとめ

・ハードウェア方式はソフトウェア方式よりも周波数を大きく設定できる

→自由に設定でき、ハード処理なのでほかのプロセスの影響を受けにくい

・ブザーの音は圧電セラミックスと金属を振動させることで音を鳴らすことができる

ハードウェア方式は、設定が少々大変ですが、自由に周波数を変えられるので汎用性が高そうですね!

練習のために、ハードウェア方式を用いたサーボモータの制御も今後行ってみたいと思います。

ありがとうございました。

参考書籍(C言語ではじめる RaspberryPi徹底入門)

https://amzn.to/2F05YyV

スポンサーリンク

-RaspberryPi, ラズパイ(C言語), ラズパイ(初心者)

© 2021 まきろぐ Powered by AFFINGER5