Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。2008/11/28C組込みポスト前回に引き続き、今回はデバイスドライバのプログラムを見ていきます。ダウンロードしたソースプログラムを見ながら読み進めてください。全体がわかったところで、最後に改造に挑戦してみましょう。sound.c10行目から12行目には、音の検出にかかわるハードウェア資源を#defineを使って別名定義しています。しておくことで、接続ポートが変わったり、音を検出するときの信号レベルが逆になったりしても、ここだけ修正してビルドし直せばよくなります。26行目からは音を待つ関数WaitSound()があります。基本は28行目のwhile文です。これで、対応ポート(PORT_SOUND)がINACTIVE(未検出)の間、ループして待ちます。引数chktimeにCHECK_TIMEが指定されたときは(29行目)、30行目でReadTimer()を呼んでタイマ値をチェックし、TIME_LIMIT時間を経過していたら音待ちを中断してERRORで帰ります。TIME_LIMITは別途timeruser.hで定義しています。50行目からは、無音状態を検出(確認)するための関数WaitInactive()です。基本的な動作である53行目から59行目のwhileループは、チェックするポートのレベルが逆なだけでWaitSound()と同じです。大きく異なるのは、それら全体がさらにdo~whileのループにあるところです。53行目からのループを実行して無音を検出します。その後、61行目で5ミリ秒待って、63行目のwhile文の条件で再度無音かどうかをチェックしています。無音であればdo~while()を抜けてOKで戻りますが、63行目でACTIVEレベルが検出された場合は、もう一度最初から処理をやりなおします。このようなことをしているかというと、スプーンは打ち付けると激しく振動するために、回路での波形整形で補正しきれずに写真1のように汚い波形になってしまうことがあるためです。一瞬無音レベルに戻ったと認識されても、実はまだ振動が続いているということがあります。その状態で次の音待ちに進んでしまうと、振動による波形を次の音と勘違いして誤動作してしまいます。そのため、少し(ここでは5ミリ秒)待って再度ポートをチェックすることで、この問題を回避しようとしています。これでも完全ではありませんが、実用上は十分です。一般の組込みソフトウェアでも、スイッチの読み取りなどでは、やはり同様の処理を行っています。スイッチも、内部では金属の板を接点にぶつける構造になっているものがあり、床でボールが弾むのと同じように振動してノイズ波形を出してしまいます。このような現象をチャタリングといいます。スイッチなど機械部品を使う組込みソフトウェアでは必ず登場する言葉なので覚えておきましょう。プチ解説スプーンをたたいた音は超音波センサで電気信号に変換しますが、この変換したての波形は写真2のような形をしています。写真2:スプーン音の生波形これは比較的きれいに音が鳴った場合の波形で、約40KHzの振動がだんだん減衰していっています。このような信号をマイコンで(ソフトウェアで)直接読みとるのはかなり難しいです。振動しているので、たまたまポートを読みに行ったときに音信号が来ていても0か1かが判定しにくいのです。そこでマジカルボックスでは、波形を整形する回路を通すことで、写真1のような比較的きれいな波形にしてマイコンに伝えています。76行目からは、サンプリングのときに使う関数IsHit()があります。これはいたって簡単、SampleTimeで与えられる一定時間内にスプーン音が検出されればON(84~85行目)を返します。注意ポイントは、途中で音を検出したからといって、そこでループを中段したりはしない点です。SampleTime分の時間この関数にとどまります。所属開発ツールのソフトウェア開発を経て組込みソフトウェア開発に従事。プライベートにも半田ごては手放さない。若い世代に物を作る楽しさを伝えていきたい。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。12:00法務担当者、6割超が今後業務で「生成AIを使用したい」と回答。NEW新着記事一覧を見るイベント今後の予定を見るCodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。