[UWP] 初心者目線でWindows 10 IoT:005 圧電スピーカーを鳴らす

金曜日 , 27, 5月 2016 Leave a comment

 これまでAmazonで購入したキット付属の部品を試してきました。その最後の一つがこれです。

Cjb8-xSUgAEl6-a

 今回は、プログラムはほとんど無いので、入門者(というか私)がどのくらいわかっていないのかを示し、先達の方々にそれを踏まえて入門者向け記事を書く参考にしてもらえるように進めます。

 

模索フェーズ

 

 一際、大きなフォルム。

 部品一覧の写真付きパーツではないので、それ以外のどれかに違いないのですが、初心者はまず「これが何か」から開始します。なぜ、これだけ脚の部分にダンボールが付いているのかも疑問点。

 ダンボールは深く考えずに引き剥がしました。

 

 これまで幾つかの部品を触ってきたので、その僅かな経験則から「こういう場合は秋月電子通商で確認!!」します。

 上記、リンクは圧電スピーカーですが、まずは商品一覧から似たような外見の物を探しました。

 

圧電スピーカー

 

 名前からしてスピーカーなんだろう。ピンは二本で長さは同じ、形も円形なので向きやプラス、マイナスも無さそう。というわけで、えいやっとLEDと付け替えて通電(こんなことやったら危ないのかもしれないが・・・)。

 ビーというような音がなるのを期待したのですが、音はなりません(実はこのとき、すでに音がなっていたのですが小さく短い音だったので気がついていませんでした・・・)。

 もうちょっと、補足すると[UWP] 初心者目線でRaspberry Pi+WindowsでIoT:001のLEDの部分を圧電スピーカーに差し替えただけです。プラスとマイナスの違いは無いので、ピンはどちらがプラスで、どちらがマイナスでもOK。

 

 音の鳴らし方が、わからないので調べてみます。

 

(参考)ツール・ラボ 第25回 回路図にブザーを追加する

 

 ふむふむ、ただ通電すれば音がなるタイプか、特定の信号を鳴らして音階などを調整できるものがあるのか。

 これはどっちだ? 通電してもダメだったんだから特定の信号送るタイプなんだろうと推測。

 

 圧電って言うからには電圧によって音が変わるんじゃないか説を打ち立てましたが、Twitterで違うと教えてもらいました。

 入門記事のハードルは高いけど、聞くと丁寧に教えてくれる界隈という気がします(プログラマーよりググレカス率が低い? ググっても答えが見つけ辛いから?)。

 最初、電圧スピーカーだと思っていのは、内緒にしてくれ!!

 

 音を鳴らすサンプルはいくつか見つかりましたがC++でwiringPi.hとかsoftTone.hをインクルードして鳴らしているサンプルが多い。

 C#だと、ちょっと見つからないですが、信号の周波数で音の高さを変えれる模様。

 

 ThreadとかDelayは厳密に一定間隔で動かせるわけではないので、ちゃんと制御しようとするとダメだろうなぁと思いつつも、適当な間隔で通電してみると・・・

 

カチッ、カチッ、カチッ

 

 おっ、なんか鳴っている!!

 スクーターのウィンカーみたいな音がしていることにようやく気が付きました。

 コードはこんな感じ。

 

    public sealed partial class MainPage : Page
    {
        /**
         * GPIOピン
         */
        private GpioPin pin;

        private GpioPinValue currentValue = GpioPinValue.High;

        public MainPage()
        {
            this.InitializeComponent();

            var gpio = GpioController.GetDefault();

            if (gpio == null)
            {
                pin = null;
                return;
            }
            // GPIOの5番を取得
            pin = gpio.OpenPin(5);

            // GPIOピンの値をHighに設定(HighとLowの二種類あります。Highで消灯、Lowで点灯します)
            pin.Write(GpioPinValue.Low);
            
            pin.SetDriveMode(GpioPinDriveMode.Output);
        }

        /**
         * ボタンクリックで点灯消灯を切り替える
         */
        private void button_Click(object sender, RoutedEventArgs e)
        {

            if (this.currentValue == GpioPinValue.Low)
            {
                pin.Write(GpioPinValue.High);
                this.currentValue = GpioPinValue.High;

                // 連続して切り替えてみる
                this.loopAlarm();
            }
            else if (this.currentValue == GpioPinValue.High)
            {
                pin.Write(GpioPinValue.Low);
                this.currentValue = GpioPinValue.Low;
            }
        }

        async private void loopAlarm()
        {
            for (var i = 0; i < 100; i++)
            {
                if (this.currentValue == GpioPinValue.Low)
                {
                    pin.Write(GpioPinValue.High);
                    this.currentValue = GpioPinValue.High;
                }
                else if (this.currentValue == GpioPinValue.High)
                {
                    pin.Write(GpioPinValue.Low);
                    this.currentValue = GpioPinValue.Low;
                }
                await Task.Delay(100);
            }
        }
    }

 

 これを更に間隔を狭めればいいのかな。

 

 2khzって、秒間2000回とか?

 マイクロ秒単位でギリ足りないのかな・・・。

 というわけで、音階とかはまた今度。

 

 今回は、機器が何なのかわかって、音が鳴ったので良しとします。

 

 皆様、初心者はこんなレベルでわかってないので、優しい解説をお願いいたしますw

 


Please give us your valuable comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください