### 4.3.4 Smart Noise Tester #### 4.3.4.1 概要 ![Img](./media/top1.png) スマート騒音テスター(サウンドレベルメーター、デシベルメーターとも呼ばれる)は騒音を検出するための装置です。騒音は強度に応じていくつかのレベルに分類され、micro:bit のマイクは周囲の音の強度をリアルタイムで検出します。強度に基づいて、micro:bit はいくつかの等級に分けます。 このプロジェクトでは、OLED 表示が現在の騒音レベルをリアルタイムに表示し、5×5 LED マトリクスが騒音レベルに応じて一部の LED を点灯/消灯します。 この種の装置は騒音監視の技術的ハードルとコストを大幅に下げたため、環境騒音監視、労働安全衛生、建設現場、娯楽施設などで広く応用されています。 ![Img](./media/bottom1.png) #### 4.3.4.2 部品の知識 ![Img](./media/2top.png) **Microbit マイク** ![Img](./media/j1101.png) micro:bit V2 ボードには音やオーディオ信号を検出するマイクが搭載されています。マイクは基板の上部に配置されており(小さな穴が周囲の音を拾う部分で、その横に LED インジケータがあります)。マイクを制御・処理するチップは基板の裏側にあります。 使用時は、単に micro:bit 基板を表向きに置いてください。 ![Img](./media/j1113.png) 基板が音を検出すると、マイクの LED インジケータが点灯します。 ![Img](./media/j1112.png) ![Img](./media/2bottom.png) #### 4.3.4.3 必要な部品 | ![Img](./media/microbitV2.png)| ![Img](./media/ExpansionBoard.png) |![Img](./media/OLED.png) | | :--: | :--: | :--: | | micro:bit V2 main board ×1 | micro:bit shield ×1 | OLED display ×1 | |![Img](./media/usb.png) |![Img](./media/4pin.png)|![Img](./media/batterycase.png)| | micro USB cable ×1 | 4 pin wire ×1 | battery holder ×1 | |![Img](./media/AAbattery.png)| | | |AA battery(**self-prepared**) ×6| | | #### 4.3.4.4 配線図 ⚠️ **配線する際は、ワイヤーの色に注意してください。** | OLED display | wire color | micro:bit shield pin | micro:bit board pin | | :----------: | :--------: | :------------------: | :-----------------: | | GND | black | G | G | | VCC | red | V2 | V | | SDA | blue | 20 | P20 | | SCL | green | 19 | P19 | ![Img](./media/couj4.png) #### 4.3.4.5 コードの流れ ![Img](./media/flow-chart-04.png) #### 4.3.4.6 テスト用コード ⚠️ **ヒント1: Microbit ボードにコードをダウンロードする前に、ライブラリファイル “oled_ssd1306\.py” をインポートしてください。参照: ** “[Import Library on MU](https://docs.keyestudio.com/projects/KS4050/en/latest/docs/MicroPython/MU_development_environment.html#import-library-on-mu)” . ![Img](./media/WPSA1.png) **完全なコード:** ```Python # 関連ライブラリをインポート from microbit import * from oled_ssd1306 import * # OLED を初期化してクリア initialize() # initialize oled clear_oled() # clear oled # 任意の範囲の数値を別の範囲にマッピングする関数 def map(value, fromMin, fromMax, toMin, toMax): fromRange = fromMax - fromMin toRange = toMax - toMin valueScaled = float(value - fromMin) / float(fromRange) return toMin + (valueScaled * toRange) # シンプルな棒グラフ用の画像セット graph5 = Image("99999:""99999:""99999:""99999:""99999") graph4 = Image("00000:""99999:""99999:""99999:""99999") graph3 = Image("00000:""00000:""99999:""99999:""99999") graph2 = Image("00000:""00000:""00000:""99999:""99999") graph1 = Image("00000:""00000:""00000:""00000:""99999") graph0 = Image("00000:""00000:""00000:""00000:""00000") allGraphs = [graph0, graph1, graph2, graph3, graph4, graph5] # 最初の音レベル読み取りを無視 # soundLevel = microphone.sound_level() # sleep(100) while True: # 画像選択のために音レベルを 0-255 から 0-5 にマップする soundLevel = int(map(microphone.sound_level(), 0, 255, 0, 5)) display.show(allGraphs[soundLevel]) clear_oled() # OLED をクリア add_text(0, 0, "Acoustic Sound Level:") # OLED の該当位置に文字列を表示 add_text(0, 2, str(microphone.sound_level())) # OLED の該当位置に soundLevel を表示 sleep(200) ``` ![Img](./media/line1.png) **簡単な説明:** ① microbit と oled_ssd1306 のライブラリをインポートします。 ```Python from microbit import * from oled_ssd1306 import * ``` ② OLED のピクセルを初期化し、OLED をクリアします。 ```Python initialize() # initialize oled clear_oled() # clear oled ``` ③ 任意の数値範囲を別の範囲にマップする map サブ関数を定義します。 ```Python def map(value, fromMin, fromMax, toMin, toMax): fromRange = fromMax - fromMin toRange = toMax - toMin valueScaled = float(value - fromMin) / float(fromRange) return toMin + (valueScaled * toRange) ``` ④ シンプルな棒グラフ用の画像セットを定義します。 ```Python graph5 = Image("99999:""99999:""99999:""99999:""99999") graph4 = Image("00000:""99999:""99999:""99999:""99999") graph3 = Image("00000:""00000:""99999:""99999:""99999") graph2 = Image("00000:""00000:""00000:""99999:""99999") graph1 = Image("00000:""00000:""00000:""00000:""99999") graph0 = Image("00000:""00000:""00000:""00000:""00000") allGraphs = [graph0, graph1, graph2, graph3, graph4, graph5] ``` ⑤ 音の値の範囲 0-255 を、表示するグラフ画像のインデックス 0-5 にマップします。 ```Python soundLevel = int(map(microphone.sound_level(), 0, 255, 0, 5)) display.show(allGraphs[soundLevel]) ``` ⑥ 検出した値を読み取り、OLED に表示します。 ```Python clear_oled() # clear OLED add_text(0, 0, "Acoustic Sound Level:") # Display the character string in the corresponding position of OLED add_text(0, 2, str(microphone.sound_level())) # Display soundLevel in the corresponding position of OLED sleep(200) ``` #### 4.3.4.7 テスト結果 ![Img](./media/4top.png) 配線を行い、micro USB ケーブルで電源を入れた後、外部電源(単6電池×6)を接続して十分な電源供給を確保し、 「Flash」 をクリックしてコードを micro:bit ボードにダウンロードしてください。 ![Img](./media/A126.png) テストコードをアップロードしたら、micro:bit の裏面にあるリセットボタンを押してください。 ![Img](./media/A455.png) micro:bit 基板のマイクに向かって息を吹きかける(または非常に大きな音を出す)と(⚠️ **特別な注意: 息を吹きかけるとより明確な効果が得られます**)、OLED 表示は息を吹きかけた(または騒音)強度に関連するリアルタイム情報を表示し、ユーザーは息の強さ(または騒音の強さ)を直感的に理解できます。同時に、micro:bit 基板上の 5×5 LED ドットマトリクスは、息の強さ(または騒音)に応じて画面上の点灯する行数を増減し、息(または騒音)の強度を知らせる効果を実現します。 ![Img](./media/dongtu-4.gif) ⚠️ **注意: 実験に使用するブロック類はこのキットには含まれていません。** (**Tip:** 結果が表示されない場合は、micro:bit ボードのリセットボタンを押してください。) ![Img](./media/4bottom.png)