開発ノート (91)

川内 康雄

Raspberry PiでIoTなシステム開発:圧電振動子(ピエゾスピーカー)の昇圧ドライブ

バイクジムカーナのタイム計測機を作ろうとすると、スタートシグナルを鳴らす方法を考えないといけません。簡単な方法としては、音声出力にアンプとスピーカーをつなぐことなのですが、発想は簡単でも実装は大変です。バイクの爆音の中でヘルメットをしているライダーに音を伝えようとすると、相当なワット数のアンプが必要です。電源電圧が5Vに制限されていると、4Ωのスピーカーを使って出せる出力は理論上の最大でも5Wぐらい、実際に入手可能なD級アンプモジュールだと2wぐらいです。これではライダーにスタートシグナルを伝えることができません。そこで思いついたのが、防犯ブザーでよく使われている圧電振動子を昇圧して鳴らせる方法。ネットで検索するとそれほど多くは無いですがいくつか回路が出てきます。ただ受動素子の定数が合いませんので、トライアンドエラーで試してみます。電源電圧は5Vで試しました。コードは最初はWiringPiのソフトウェアPWMライブラリを使いました。 #include #include #include int main(void){ wiringPiSetup(); pinMode(7,PWM_OUTPUT); softPwmCreate(7,5,11); int i = 0; while(1){ softPwmWrite(7,10); sleep(2); /* for (i=0;i<=11;i++) { printf(""rate is %d\n"",i); softPwmWrite(7,i); sleep(1); }*/ }} が、このライブラリは、途中でデューティ比を変えられるものの、PWM周期を変えられないことが判明。この昇圧回路の場合、デューティー比を変えるとインダクタへのチャージ量が変わりそれで音量調整ができるので、便利です。が、音程が変えられないとシグナルにならないので断念。出力を2本使う方法も有りだと思いますが、それは今度試して見ます。で、やむを得ずソフトウェアトーンライブラリで書いたのがこちら。 #include #include #include int main(void){ wiringPiSetup(); pinMode(7,OUTPUT); softToneCreate(7); int i = 0; while(1){/* softToneWrite(7,446);//446で実際の出力が439.98Hz usleep(500000); softToneWrite(7,0); usleep(500000);…

Continue reading...
川内 康雄

Raspberry PiでIoTなシステム開発:WiringPiはプログラムを終了させてもピンモードがそのままになるのでシグナルを捕捉してINPUTに戻す

WiringPiを使ってトーンやPWMを扱っていると、プログラムが終了した後も、GPIOがハイのままになっていることがありました。マイコン開発の感覚からすると違和感がありますが、汎用OS上で開発していると、GPIOの設定はそのままになるのが自然な流れのようですね。ただこれだと接続した先の回路が導通したままになり、LED点きっぱなし、モーター回りっぱなし、インダクタチャージしっぱなしになります。アウトになっているとちょっとしたことでショートさせてしまいそうで怖いです。それでは気持ち悪いので、プログラムの終了時に自動的にIOをインプットに戻すべく、シグナルの捕捉を実装します。参考にしたのはこちら。シグナル処理関数(シグナルハンドラ)を登録する | C言語入門講座 #include #include #include #include #include void setSignal(int p_signame);void signalHandler(int p_signame);int main(void){ setSignal(SIGINT); wiringPiSetup(); pinMode(7,OUTPUT); softToneCreate(7); while(1){ softToneWrite(7,446);//446で実際の出力が439.98Hz usleep(500000); softToneWrite(7,0); usleep(500000); softToneWrite(7,446);//446で実際の出力が439.98Hz usleep(500000); softToneWrite(7,0); usleep(500000); softToneWrite(7,446);//446で実際の出力が439.98Hz usleep(500000); softToneWrite(7,0); usleep(500000); softToneWrite(7,904);//904で実際の出力が879.56Hz usleep(1000000); softToneWrite(7,0); usleep(500000); }}//シグナルの設定void setSignal(int p_signame){ if (signal(p_signame, signalHandler) == SIG_ERR) { //エラー…

Continue reading...
川内 康雄

Raspberry PiでIoTなシステム開発:ハードウェアPWM

Raspberry Pi歴3年目にして今頃ですがハードウェアPWMが備わっていることに気づきました。今までWiringPiのソフトウェアPWMを無理して使っていて音程のズレとか雑音に悩まされていたのですが、これで一挙解決できそうです。参考にしたのはこちら。RaspberryPiとWiringPiでサーボを動かす – Qiitaたしかに本家の記述は簡潔すぎてわかりにくいですね。百分率で設定する方が比率がわかりやすいのでRangeを100に決め打ちすると、周波数計算は以下の通りとなります。 clock = 192000 / freq 早速コードを書いてみます。 #include #include #include #include void setSignal(int p_signame);void signalHandler(int p_signame);int main(void){ setSignal(SIGINT); wiringPiSetup(); pinMode(1,PWM_OUTPUT); // pwmSetMode (PWM_MODE_BAL); pwmSetMode (PWM_MODE_MS); pwmSetRange(100);//百分率がわかりやすいので100 pwmSetClock(218);//Rangeが100の場合、192,000÷目標の周波数 int i = 0; while(1){ for(i=0;i<=100;i++) { pwmWrite(1,i); usleep(30000); } /* for(i=100;i>0;i--) { pwmWrite(1,i); usleep(100000);…

Continue reading...
川内 康雄

Raspberry PiでIoTなシステム開発:圧電スピーカーを昇圧ドライブするときの最適なインダクタとパルス幅の選定

Raspberry PiでハードウェアPWMができることが分かったところで、本格的に昇圧ドライブの実験をする事にします。今回の主役は千石電商で買ったチョークコイル達です。50mHでそれなりの音量が得られたので、ここは他のインダクタンスの実験をしたいと思います。防犯ブザーを買ってきて中のコイルを引っこ抜く方が安いと思いますが、インダクタンスが分からないので、ここは素直に購入しました。先日の回路を使い、それぞれのチョークコイルに差し替えて、音量、消費電流を測定します。音量測定に使用したのはiPhoneのアプリ。正確では無いと思いますが、そもそもそれほどの正確性が必要な訳では無いので、これでよしとします。測定条件を揃えるため、iPhoneの裏にペンを貼り付けてスピーカーとマイクの距離を揃えました。測定の結果は以下の通り。50mH 26.5mA/440Hz 61.4mA/880Hz 80-84db100mH 19.1mA/440Hz 27.1mA/880Hz 82db200mH 7.2mA/440Hz 9.9mA/880Hz 77-78db500mH 1.9mA/440Hz 8.8mA/880Hz 69-74db意外ですがインダクタンスが低い方が音量が大きいという結果になりました。磁力を蓄積できる量よりも、電流量の影響が大きいということでしょうか。そういえばラジコンのモーターもターン数が小さい方がパワーが出ますね。この結果からすると100mHが電流と出力とのバランスが良いので、これを使うことにします。次はパルス幅を変えて実験します。ハードウェアPWMなので細かく設定できるのが良いです。コードはこちら。 #include #include #include #include void setSignal(int p_signame);void signalHandler(int p_signame);int main(void){ setSignal(SIGINT); wiringPiSetup(); pinMode(1,PWM_OUTPUT); // pwmSetMode (PWM_MODE_BAL); pwmSetMode (PWM_MODE_MS); pwmSetRange(100);//百分率がわかりやすいので100 int i = 0; pwmSetClock(436);//Rangeが100の場合、192,000÷目標の周波数 while(1){ for(i=1;i<=9;i++){ pwmWrite(1,i*10); printf(""now %d%%\n"",i*10); usleep(3000000); }…

Continue reading...
川内 康雄

IONIC2体験

Announcing Ionic Framework 2 Beta | The Official Ionic Blogionic2が無事ベータリリースになったようなので、チュートリアルを体験してみました。が、英語なのとionic1やAngularが分かっていないと戸惑う部分が多いように思われました。そこでチュートリアルの流れを日本語で解説し、本家で触れられていない点についていくつか補足します。なおハイブリットアプリをWindowsで作る人はそういないと思いますのでMacが前提です。 チュートリアルそのものとは関係が無いのですが、ionicは「イオニック」ではなく、「アイオニック」です。ゴルフをやっていたときのグリップの影響か、今でもついイオニックと呼んでしまいますが。 公式通りに進めてください。ただし必ず4系を使うこと。ES6の事もあるのでそのうちNode5に対応するのだとは思いますが、今のところnumber of issesが発生するようです。 nodeをインストーラーを使ってインストールした場合には、npmコマンドが一緒にインストールされています。npmコマンドはnode.jsのパッケージ管理に使うコマンドです。ionicはnpmを使用してインストールします。Macだと-gオプション(グローバルインストール:どのユーザーでも使えるようにする)を使うにはsudoが必要です。コマンド実行時に管理者権限のあるユーザーで実行してパスワードを入力してください。 $ sudo npm install -g ionic@beta これによりionicコマンドがインストールされます。ionicを引数なしで実行するとコマンドのマニュアルが表示されます。私が使っているのはbeta17のようです。 ``` kawauchiyasuo-no-MacBook-Pro:project2 yasuo$ ionic _ _ () () _ ___ _ __ _ ___ | |/ _ | ’_ | |/ __| |…

Continue reading...