SSブログ

dsPIC33 FFT変換とデータ表示・保存装置

 「dsPIC33 AD変換データ表示・保存装置」でdsPIC33FJ64G802を使ったAD変換装置を作りましたが、今回はそのハードウェアでAD変換したデータをFFT変換して表示・データ保存をするソフトウェアを作りました。

FFT.jpg

 ADCの変換周波数は 8kHzで 64サンプル(ピンポンバッファの片方分)をバッファ交互にFFT変換します。
バッファの読み取り間隔は 8mS (1/8kHz x 64sample)でFFT変換時間は 0.4mS(実測)以下ですのでFFTデータ表示処理が7.6mS以内であれば連続処理が可能なのですが、MSP2807グラフィックLCDの表示処理が遅いので間に合いませんでした。
そこで128フレーム(8mS x 128 = 約1秒)の連続FFTデータを取得後グラフィックLCDに表示するようにしました。 (グラフ画面128フレームを表示するのに約18秒と少々時間がかかります。)
 dsPIC33FJ自体はFFTのリアルタイム処理ができデータ転送にも時間的余裕があるので、高速表示処理のできる表示デバイス(装置)があれば連続的にリアルタイムでFFT結果を見ることができると思います。

 FFTの周波数分解能を上げる場合はDMAバッファや配列変数のサイズを大きくしたり回転因子リストの変更等が必要になります。
ADCのクロックを変える場合は使用方法を参照してください。

ソフトウェア、使用方法などの資料は以下でダウンロード・参照できます。
ソフトウェア (dsPIC33FJ64G802用、MPLAB X IDE (v5.50) & XC16 (v1.70))
プログラミングノート (プログラム時読んでください)
使用方法
<2023.10.02記>「PICライター(PICerFT)の製作」でPICライターの自作方法を紹介しています。


参考にした記事 「Starter Kit for dsPIC でFFTを作る


===== 関連記事 =====
PICでグラフィックLCDとSDカードを使う
dsPIC33 AD変換データ表示・保存装置
音検知式 TV消音リモコン


>> ブログ記事一覧へ
nice!(0) 
共通テーマ:趣味・カルチャー

dsPIC33 AD変換データ表示・保存装置

 音声入力でテレビにリモコンの消音コマンドを送る装置(消音リモコン - 経緯は「赤外線リモコン実験機」参照)を検討するために、音声入力をAD変換したデータを保存することが必要でしたので作ってみました。
ハードウェアは 「PICでグラフィックLCDとSDカードを使う」 で作ったものをベースにPICをdsPIC33FJ64G802に変更してアナログ入力、トリガー入力、ボタン入力を追加した図1に示すものと、図2に示すマイクアンプ及びトリガー回路とボタン回路で構成されます。

図1 ADC & データ表示・保存部回路
dsPIC33_ADC回路図1.jpg

図2 操作ボタン回路とアナログ信号回路例
dsPIC33_ADC回路図2.jpg


ソフトウェア、使用方法は以下で参照、ダウンロードできます。
ソフトウェア (dsPIC33FJ64GP802用)
ソフト修正内容 <2022.05.27追加>
<2022.05.25> XC16 v2.00 コンパイラではGFX_Libraryでエラーが生じました。解決できない場合はXC16 v1.70をお使いください。
<2023.10.02記>「PICライター(PICerFT)の製作」でPICライターの自作方法を紹介しています。

使用方法
Excelでのグラフ表示方法

 音声データは2秒間分ぐらい保存したいのですが、dsPIC33FJ64G802のデータメモリーは 16kBしかないのでサンプリング周波数を まずは1kHzにして2048個(必要なメモリーはx2 Byte)のデータをキャプチャーするようにしてみました。
サンプリング周波数はTimer3の設定を変えれば変更できますが、今回のソフトウェアではキャプチャー数は2048個で固定なので周波数を上げるとキャプチャー時間は短くなります。 
20kHz, 40kHzでも動作しましたが得られるのはそれぞれ約100ミリ秒、50ミリ秒分のデータです。 (データメモリーにはまだ余裕があるようなのでキャプチャー数を2048個より増やすことが可能だと思います。)

 ADCデータは12bitで、1KBのDMA(Direct Memory Access)バッファ2つにピンポンモードでデータを512個(1KB)ずつ交互に入れて行きます。
(仕様上DMAバッファは最大2KB なので1つのバッファあたりは1KBとなり、ADCデータはワードデータなのでバッファには最大512個の変換データを入れることができます。 
A、Bの2つのバッファでそれぞれ2回ずつ満杯にすれば2048個の変換データが得られることになります。)

 DMAピンポンモードなのでCPUはADCによる書き込みの行われていない方のバッファにアクセスしてデータを処理できます。
バッファを512個のデータで満たすのに必要な時間(ピンポンの切り替え時間)はサンプリング周波数によって異なり、例えば 1kHz, 20kHz, 40kHz の場合それぞれ512mS, 25.6mS, 12.8mSかかります。
今回は1kHz仕様なので512mSで、その間にグラフ表示用の配列にDMAバッファからデータ転送しています。
(この転送時間はデバイス動作クロックFcy (18.425MHz = 1/2 Fsoc) に依存して決まり、サンプリング周波数に関わらず約500uSでした。)
将来的にはこの時間にFFTなどの処理ができればいいなあと思うのですが、経験がなくてFFTにどのくらい時間がかかるのかわからないので可能かどうかは分かりません。
またこの間に外部メモリーにデータ転送できれば継続的なデータキャプチャーができるのですが、SDカードでは遅くて使えませんでした。(SPIのクロック周波数を上げても処理が追いつきそうにありません。)

次はFFT処理に挑戦します。


===== 関連記事 =====
PICでグラフィックLCDとSDカードを使う
dsPIC33 FFT変換とデータ表示・保存装置


>> ブログ記事一覧へ
nice!(0) 
共通テーマ:趣味・カルチャー

赤外線リモコン実験機(ソニー製品用)

 定年退職後はテレビを見る時間が増えました。地デジは若者向けなのか 私にとってはあまり面白い番組がないので専らBSやCSを見ているのですが、限られた数のコマーシャルが何度も流れて しかもテンションが高くうるさいものが多くて辟易しています。
コマーシャルが流れるたびにリモコンで消音することが多いのですが、頻度が多いので消音ボタンがへたってきました。
そこで「消音」とか「ミュート」と発声すればテレビに赤外線リモコンの消音コードを送る装置を作ろうと考えましたが、簡単な音声認識をするにしてもハードルが高く時間がかかりそうなので、まずはボタンを押して「消音」コードを送る装置を作り当面はこれで対処しようと思います。

図1 赤外線リモコン送信機回路
赤外線リモコン送信回路(実験用).jpg

回路は図1に示す通り至ってシンプルなものです。
PIC12F1840用のソフトウェアはこちらからダウンロードしてください。
<2023.10.02記>「PICライター(PICerFT)の製作」でPICライターの自作方法を紹介しています。

・ソースコードには「消音」コード送信用のデータが書き込んであり、スイッチボタンを押すとリモコンの赤外線で「消音」コードを送信します。
書き込むデータを変えれば他のリモコンコマンドも送信できますが、現在は一つのコマンドしか送信できません。 
テレビの番号ボタンコードを書き込んで送るとチャンネル設定3桁のうちの1桁になります。 実用的にするにはボタンや送信コード種類を増やすことが必要ですが、そのためのソフト改造は さほど難しい事ではないと思います。

・ソニー製品用リモコンコードは 12bit, 15bit, 20bit と3種類あるようで、ソフトはこれら全てに対応できるよう作ったつもりですがテレビ用の12bitの4種類のコードしか確認しておりませんので動作しないコードがあるかもしれません。

・IR LEDをドライブするのに以前汎用トランジスタを試したところhFEが低く電流波形が鈍ってしまいました。 そこでFETに替えたところ電流のON/OFF特性が良かったのでそれ以来はFETを使っています。但し、低い電圧でONできるタイプであることが必要です。

・リモコンの信号はPWMを使ってキャリア信号を発生し、データの0, 1によってキャリア透過時間を変えて変調をかけています。 しかし、ここで問題が起きました。データ間のブランク時間にはIR LEDは発光しない状態でなければなりませんが、この期間の状態が安定しておらず発光したりしなかったりするという事です。
これはPWM信号がHighの時に透過時間が終わるか、 Lowの時に終わるかの違いによるものと思います。
仕様書を見たところPWM出力はTRISレジスタで出力状態と入力状態(ハイインピーダンス)が切り替えられるので、キャリアの透過の開始時に出力状態にして終了時に入力状態にするように制御して対策しました。 ただ、ハイインピーダンス状態になった時FETのゲート容量や回路の浮遊容量によって電圧がシャープに落ちなかったので10kΩの抵抗でプルダウンしました。

・始め リモコンコードはスイッチボタンを押すごとに1回のみ送信していましたがTVは稀にしか受信していませんでした。 インターネットで調べていたら「赤外線リモコンの通信フォーマット」という記事に1回のボタンが押されたら45mS間隔で5回(5フレーム)送信している図があったので、そのようにソフトを変更したところ動作が確実になりました。 

今回以下の記事を参考にさせていただきました。ありがとうございました。
PICを使った小型赤外線学習リモコン
赤外線リモコンの通信フォーマット
ソニーの赤外線リモコンコードを調べてみた

次はいよいよ難関の音声認識にチャレンジしようと思います。
PICは高機能なものを使う必要があるのでリモコン送信部も移植に伴ってまたソフトを変更しなければなりませんが、基本的な処理方法は今回勉強できたので良かったと思います。

(追記)
消音コードの送信トリガーは音声認識をしなくても 例えば手を2回連続して叩いて行うことも可能であると思います。
その場合、マイク出力をADコンバータに入力しておいて ある閾値を超える音の入力があったら0.1~0.2秒(手をたたく間隔による)待ってからまた閾値を超える入力があるかどうかで連続拍手の有無が判断できると思います。 誤検知の可能性もありますが、意外と可能性は高いかもしれません。
これでしたら、PICもPIC12F1840で行けると思います。
音声認識が難しそうであったらトライしたいと思います。 興味のある方はやってみてはいかがでしょうか。
=> (2022.06.20記) この方式を「音検知式 TV消音リモコン」で試みましたが誤検知が頻繁に起き、単にトリガーを2回検知する方法だけではうまく行きませんでした。 結局FFTのデータも加味して判断することでほぼ実用化しました。


===== 関連記事 =====
音検知式 TV消音リモコン


>> ブログ記事一覧へ
nice!(0) 
共通テーマ:趣味・カルチャー

LEDストリング害獣撃退実験機の製作

 青色のLEDストリングライトを使って夜間における動物撃退効果を実験するための装置を作りました。
撃退効果の有無については未だ分かりませんが、他用途への転用もできるかもしれませんので紹介いたします。 <2023.11.14 最後部に結果を追記>

図1に示すように動物センサー子機を畑から数mから30m程度離れたところに設置し(複数設置可)、動物を検知したら畑の周囲に設置したLEDストリング点灯機(複数設置可)に無線で検知信号を送りフラッシングや点滅を行って威嚇するというものです。

図1 LEDストリングを使った害獣撃退装置
LEDストリング害獣撃退.jpg

ストリングの場合「LED動物撃退器の製作」で作ったもののようなフラッシング光のインパクトはないですが、発光体の繋がりで広がりを持たせることができるので大きな敵のように見せかけた威嚇効果があるのではないかと期待しています。

LED点灯機回路はソーラー電源を使っていて、日中は無線回路をOFFして電力消費を抑えるようにしてあります。(子機は検知信号を送信しますが点灯機は受信しないのでLEDストリングは発光しません。)
点灯機は、5m 100球のLEDストリングを2本取り付けたもの(Type A)と 10m 100球を2本取り付けたもの(Type B)の2組作りました。 
Type AはLEDストリングの発光制御をPICで行い、点灯仕様はプログラムで決まります。 一方 Type Bは既存のイルミネーション製品を改造したもので、内蔵の専用ICで特別な点灯仕様が決まっています。
Type A はType Bより明るいですがLEDの点灯消灯の時間を変える事しかできません。 Type Bでは一つ置きに点灯するモードや明るさの強弱もあります。
PICのプログラムでは、Type Aの発光仕様はLED ON時間とOFF時間の設定パターン(4モードある)を設定した時間で切り替えており、Type Bの場合は7つある決まった発光仕様から4つを選択してそれを設定した時間で切り替えています。

センサー子機とLED点灯機の対応は4グループまで持つことができ、グループ内で複数のセンサー子機、LED点灯機を持つことができます。
グルーピング方法に関してはこちらを参照してください。

無線システムはMONO TWELITEを使用し、基本的には購入時インストール済みの標準アプリと設定値でセンサー子機、LED点灯機共に使用できます。 ただし、混信があって通信チャネルを変えたいようなことがあると専用ツールを使った設定変更が必要です。

回路図・製作資料、PICソフトウェアは以下で参照・ダウンロードできます。
<2023.10.02記>「PICライター(PICerFT)の製作」でPICライターの自作方法を紹介しています。

子機回路図・製作資料
v2子機回路図・製作資料 <2022.12.06追加>
 「PaPIRs焦電センサーを使った無線子機の製作(最新仕様)」の方法でも作れます。<2023.01.18追記>
LED点灯機回路図・製作資料
PICソフトウェア (PIC12F1840)

<2022.12.04 追記>
上記資料の内容に対し、改善のため次の変更を適用してください。
LED点灯機回路図・構造(v2)
PICソフトウェア (v2)
<追記終わり>

子機は電池寿命(1年以上を目標)の点から単三乾電池を並列に接続することがありますが、メーカー・型名(できれば生産ロットも)が同じで、電圧が揃ったものを使ってください。 使い古したものを混在させると危険です。
また、電池の向きを間違えると過熱して危険ですので十分注意して装填してください。

焦電センサーは、ちょっと高いですが電池用仕様のEKMB130xxxxK タイプを使うと2本直列で使え、且つ電池寿命を長くすることができるので並列にする必要がなくなるかもしれません。
EKMC160xxxx タイプを使って電池を並列にしたくない場合は、ケースサイズにもよりますが単二乾電池を使う方法もあります。
使用するPaPIRsセンサーについては「猿検知装置用センサーの代替品」をご覧ください。 改造が必要になることがあります。 但し猿検知装置用センサーと使用法が異なり、レンズのマスキングはせずに使用します。

<2022.12.06追記>
EKMC160xxxx タイプのセンサーを乾電池2本で動作させるv2子機を作りました。
資料は上記資料リストに追加。  <追記終わり>

LED点灯機 Type B に使ったイルミネーション製品は赤外線リモコンかタクトスイッチで制御するようになっています。 これを組み込むに付き、タクトスイッチ回路を使ったのでは確実な点灯のON/OFFができないので赤外線リモコンを使うことにし、リモコンのボタンを押したときにショートさせる電極間をアナログスイッチでショートするようにしました。 これを制御するためにPIC12F1840のDOが3bit必要になったので元々3Vレギュレーターの出力制御に使っていたDOをその一つに充て、レギュレーター出力制御はCdS電圧をコンパレータで比較してその出力で直接行うことにしました。


(製作後記)
 初めはLEDを夜間ずっと光らせることも考えましたが、場所によっては目障りになるのではないとか思いました。
また常時光っていると動物も慣れてしまって気にしなくなってしまうのではないかと考え、それより近づくと光る方が警戒感を持たせられると思い、費用はかかりますが検知時のみ発光させるようにしました。
 今回は畑の縁に沿ってLEDストリングを設置しましたが、動物や人をかたどった形状に作ったらどうなるかということも興味深いところです。

 使用したイルミネーション LEDストリングは値段が約1,000円と安かったのですが 店によっては同じ物が3,000円以上したりしていて、品質がちょっと心配になりまず1個買ってみました。
届いたものを動作させたら問題はなかったので追加で発注した次第です。コストパフォーマンスは良いと言えるでしょう。
それにしても、5mm程度のチップ1個でリモコン信号の処理とLED発光制御ができてしまうのですから便利になったものです。安く作れるのも当然かもしれません。


(実験結果)<2023.11.14追記>
 実際に設置してみた結果、横に張ったLEDストリングは鹿が突っ込んで何度か切られてしまったりして撃退する効果はありませんでした。
LEDストリングを横に広げて張ると発光があまりインパクトがなく、鹿は大して警戒しないのかもしれません。
横に広く張るよりむしろ縦横1mぐらいの範囲内に張り巡らせた方が発光インパクトがあると思うので、今後それを試みたいと思います。


>> ブログ記事一覧へ
nice!(0) 
共通テーマ:趣味・カルチャー

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。