8. Picoの制御ソフトと総合テスト

 前回までで基本的なハードウェアは完成しました。しかし、電圧低下に伴うシャットダウンやポップノイズの除去、電源のON/OFFなどの機能はまだ備えていません。なんとなく電子回路でもできそうなのですが、Pi Picoの力を借りると簡単かつ確実に実現することができます。
 最終章ではPi Picoに制御プログラムを組み込んで、ハードと一体化した制御をさせることにします。

 ※ソースコードと関連ファイルは右側の[Download]ボタンでダウンロードしてください。   


1.Raspberry Pi Picoについて

 PicoはOSを搭載した今までのRaspberry Piと違って、ハードウェア制御に特化したワンボードマイコンです。乱暴な説明になりますが、マイコンは機械語に翻訳したプログラムをメモリーに書き込むと、それを記憶して実行し続けます。リセットしたり電源を入れ直すと、記憶しているプログラムを再び最初から実行し続けます。永遠に繰り返し処理を実行し続けるコンピューターと言えます。
 価格はわずか4ドルですが、そのスペックは下記のように素晴らしいものです。また今年6月30日には、Wi-Fi機能を搭載したRspberry Pi Pico Wが6ドルで発売されています。
・コントローラー:RP2040
・SoC:デュアルコアArm Cortex-M0+プロセッサ(133MHz駆動)
・SRAM:264KB
・GPIO:26(アナログインプット3)
・入出力:UART×2、SPIコントローラー×2、I2Cコントローラー×2、PWMチャンネル×1
・USBポート:USB 1.1×1
・電源:1.8~5.5V DCをサポート
・その他:温度センサー内蔵
・サイズ:21mm × 51mm

 またソフトウェア面では、A-Dコンバータ、D-Aコンバータ、GPIO、\(I^{2}C\)インターフェースなど、ハードウェアを制御するライブラリーが揃っているので、センサーやモーターなどのペリフェラルを容易に制御できるのも特長です。


2.開発環境の準備

 Raspberry Piの開発元であるラズベリーパイ財団は、Picoのプログラミング開発用としてPythonを推奨しています。さらに開発環境としては、Python言語専用の統合開発環境“Thonny”を推奨しています。MicroPythonというコンパイル不要の方式なので、初めての学習で簡単なプログラムを実行をするには便利なのですが、処理速度が遅いので実用面では問題があります。
 開発環境についてはすでに第1章「5.Raspberry Pi Picoの開発環境」でもふれましたが、ここでは開発言語としてC/C++言語を使用します。また、さまざまなOS上での豊富な開発環境が存在しますが、準備が簡単で大変使いやすいことから、Arduino IDE(Integrated Development Environment))を採用します。この統合開発環境はArduinoの各種ボードのために作成されましたが、ESP32やM5Stack、Pi Picoなど多数のマイコンボードにも対応しています。
 また手元ではWindows10搭載のノートPCを使いますが、Mac/Linuxにも対応しています。

○Arduino IDEのインストール

 まず、以下のようにIDEのダウンロードとインストールを行います。
 ①Download the Arduino IDEにアクセスする。
 ②最新の Arduino 1.8.19が表示されているので、リンク[Windows ZIP file]をクリックしてダウンロードする。
 ③ダウンロードされた arduino-1.8.19-windows.zipを適当な場所へコピーして解凍する。
    arduino-1.8.19フォルダーが作成される。
 ④フォルダー内の arduino.exeを実行する。
    C:\User\{user_name}\AppData\Local配下に Arduino15フォルダーが作成されて、ライブラリや
    パッケージが配置される。
 ⑤ワンクリックでIDEを起動できるよう、Arduino15フォルダー内のarduino.exeのショートカットを作成する。


○Raspberry Pi Pico用の準備

 次の手順で、Pi Picoが使えるようにするために、「追加のボードマネージャのURL」を設定します。
 ①arduino.exeを起動して、[ファイル]→[環境設定]を選択する。
 ②環境設定ダイアログが開くと「追加のボードマネージャのURL」を選択する。
 ③「追加のボードマネージャのURL」ダイアログが開くので、次のURLを入力する。
    
 ④入力したURLが設定されていることを確認して[OK]ボタンをクリックする。


○ボードパッケージのインストール

 次にPi Pico用のボード情報をインストールします。
 ①[ツール]→[ボード]→[ボードマネージャ]と選択すると「ボードマネージャ」画面が開くので、
  「タイプ」に「pico」と入力する。

  次の3種類が表示されたので上の2つをインストールしました。
   ・Arduino Mbed OS RP2040 Boards Version 3.1.1 (by Arduino)
   ・Raspberry Pi Pico/RP2040 Version 2.0.3 (by Earle F. Phillhower, Ⅲ)
   ・[DEPRECATED - Please install standalone package] Arduino Mbed OS Boards Version 3.1.1

 ②[ツール]→[ボード]→[Raspberry Pi RP2040 Bords(2.0.3)]→[Raspberry Pi Pico]を選択する。

 ③もう一度[ツール]を開いてボードの設定情報を確認する。シリアルポートが選択されてないことに注意!

 以上で開発環境の設定は完了です。


○動作確認

 開発環境とPi Picoの動作を確認するために、サンプルプログラムBlink(Lチカ)を動かしてみましょう。
 ①HAT22のベッドにセットしたPi Picoを外して、USBケーブルで
  Windows PCに接続する。
    [ツール]を選択すると、シリアルポートが選択されて
    いるのがわかる。
 ②Arduino IDEで[ファイル]→[スケッチ例]→[01.Basics]
  →[Blink]を選択する。
 ③丸に[→]のアイコン、「マイコンボードに書き込む」ボタンを
  クリックする。
    コンパイルが進行してボードへの書き込みが始まる。
    書き込みが終わるとPi Picoに実装されたLEDが点滅する。

 ④続いて[ファイル]→[スケッチ例]→[rp2040]→[Temperature]を選択する。
 ⑤③と同様に「マイコンボードに書き込む」ボタンをクリックする。
    書き込みが終わるのを待つ。
 ⑥[ツール]→[シリアルモニタ]を選択する。
    シリアルモニターに内蔵温度センサーの温度が表示される。

 以上で開発環境とPi Picoの動作が確認できました。ボードへの書き込みができない場合は、[ツール]を開いてシリアルポートが正しく選択されているか確認してください。選択できてなければ、Windows10ならコントロールパネルのデバイスマネージャーを開いて、「ポート(COMとLPT)」でUSBシリアルデバイスの状態を調べてください。また、Pi Picoが認識されない場合は、いったんUSBケーブルを抜いて、Pi PicoのBOOTSEL(白いボタン)を押したままUSBケーブルを差し込んでみましょう。


○Arduino IDEでのプログラムスタイル

 先に動作確認をしたサンプルプログラムBlinkのコードを見てみましょう。

 このArduino IDEで開発するプログラムはスケッチと呼ばれます。記述できるコードはC/C++に準拠しているのですが、独特のスタイルになっています。おなじみのmain()関数がなくて、
  ・void setup()
  ・void loop()
という2つの関数だけです。C/C++と同じように他の関数を書くことはできますが、骨格となるのはこの2つです。
 実はこの2つの関数を実行する親の関数があって、そこから次のように呼び出されているのです。
    

 このカラクリが分かれば、スケッチはそのままC/C++プログラムであることが納得できますね。

 新たなプログラムを作成する場合は、[ファイル]→[新規ファイル]を選択すると、void setup()とvoid loop()関数が記載されたテンプレートが表示されます。プログラムを入力して[ファイル]→[名前をつけて保存]で保存します。特に指定しなければ、ドキュメントホルダー(C:\User\{user_name}\Documents)配下にプログラム名のフォルダーが作成され、その中に'プログラム名.ino'と言う名前でソースコードが書き込まれます。
 ついでながら、使いなれたエディターを使いたい場合は、[ファイル]→[環境設定]で「外部のエディタを使用する」にチェックを入れると、Arduino IDEのエディターは使えなくなります。別のエディターで'プログラム名.ino'を編集して書き込み、Arduino IDEに戻ると編集結果が反映されています。
 なお、「検証・コンパイル」と「マイコンボードに書き込む」は[スケッチ]を開いて指示することもできますが、メニューバーの「チェック印がある○」と「右矢印がある○」をクリックするのが便利です。どちらも、編集結果は自動的にもとのファイルに反映されます。


3.プログラムの処理要件

 Pi Picoのコードを書く前に、処理要件を明らかにしておきましょう。
①電池電圧低下時の動作停止

・タイマー割り込みを利用して、所定の時間間隔でオーディオユニットに供給する電源電圧を測定する。
・回路の異常発振を回避するため、所定の閾値を割り込むと電池切れを通知する。

②押しボタンによる起動・停止制御

・外部割り込みを利用して押しボタンの押下を検知する。
・オーディオユニットの動作状態に応じて、起動または停止処理を行う。

③オーディオ開始処理

・電源制御リレーをONにして所定の時間だけ待つ。
・ミュート制御リレーをONにして(ミュートをOFFにして)青色LEDを点灯する。

④オーディオ停止処理

・ミュート制御リレーをOFFにして(ミュートをONにして)所定の時間だけ待つ。
・電源制御リレーをOFFにして青色LEDを消灯する。

⑤常時異常監視処理

・電池切れを常時監視して、動作中に通知を受けると停止処理を行って赤色LEDを点灯、青色LEDを消灯する。
・すでに停止中なら所定の時間だけスリープさせる。


4.GPIO、定数、グローバル変数の定義

 プログラム全体はとてもシンプルで、細かいコメントを記述しているので多くの説明は必要ないでしょう。ただ、Pi Picoを手がけるのは今回が初めてであったこと、アナログ制御をどのように行えばよいかの検討が必要であったことなどから、全体のコードを作成する前にいくつものテストを行いました。結果的に急がば回れが功を奏して、全体のコードは短時間に書き上げることができました。参考までに事前に行った個々のテストを掲げておきます。
 ・電圧計測用の分圧回路作成と計測処理
 ・タイマー割り込みによる計測処理
 ・外部割り込みの動作確認
 ・押しボタンのチャタリング防止
 ・シグナルによるリレー制御
 ・sleep_ms()関数を使ったリレー制御

○インクルードファイル

 C言語の記述では標準ライブラリーを使用することから、stdio.hは習慣的に書くことになります。Raspberry Pi Picoには豊富なライブラリーが用意されていますが、その内容の詳細をまだ理解できていません。したがって、どのようなヘッダーファイルをインクルードすべきかわからないので、最大公約数的に12~14行の3行を記述しておきます。そして、ここではアナログ入力ライブラリーを使用するので15行目を追加します。12~14行はコメントアウトしても問題ありませんが、15行目を省くとコンパイルエラーが発生します。
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/binary_info.h"
#include "hardware/adc.h"
 ちなみに、これらのヘッダーファイルは、ユーザー名フォルダーの次のフォルダー配下に収納されています。
    \AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\2.0.3\pico-sdk\src
 adc.hはその下の\rp2_common\hardware_adc\include\hardwareにあり、Analog to Digital Converter (ADC) APIの関数が記述されています。その中で、さらに\hardware/structs/adc.hをインクルードしていて、そこには自動生成されたIDE_用のREG_マクロが定義されています。なおその中でもhardware/regs/adc.hがインクルードされ、大量のdefineマクロが記述されています。
 このように、Pi PicoのC/C++開発環境はかなり複雑な構成になっていますが、これらを読みこなすと面白いことができそうです。
 ついでながら、13行目の"pico/stdlib.h"は\common\pico_stdlib\include\picoに収納されていますが、その中では
   #include "pico.h"
   #include "pico/stdio.h"
   #include "pico/time.h"
   #include "hardware/gpio.h"
   #include "hardware/uart.h"
と記述されていて、これをインクルードすることでな基本的なプログラムを実行するために必要なものはすべて揃うようです。


○GPIOと状態制御のdefineマクロ

 前回の「ボード間配線」でPi Picoの使用ピンを説明しましたが、プログラムをわかりやすくするために、ピンに対応した名前を定義しておきます。
 25行目からは、HAT22がどのような状態にあるかを表すために処理状態を定義します。休止状態と動作状態の2種類の他に、念のために、状態の切り替え処理を行っている最中に割り込み処理が発生した場合に混線しないように、無効状態を定義しています。
// Target GPIO definition
#define GPIO_LED_BLUE       8   // 青色LED(11ピン:通音時点灯) 
#define GPIO_LED_RED        9   // 赤色LED (12ピン:電圧不足時点灯)
#define GPIO_PUSH_BUTTON   10   // 押しボタン感知端子(14ピン:GNDは13ピン)
#define GPIO_POWER_CONTROL 12   // パワー制御端子(16ピン:GNDは18ピン)
#define GPIO_MUTE_CONTROL  13   // ミュート制御端子(17ピン:GNDは18ピン)
#define GPIO_MEASUREMENT   27   // 電圧計測用アナログ入力端子(32ピン:GNDは33ピン)

// Process status definition
#define PROCESS_IDLE    1       // 休止状態
#define PROCESS_RUN     2       // 動作状態
#define PROCESS_IGNORE  0       // 無効状態


○関数とグローバル変数定義

 30行からは関数のプロトタイプ定義、36行から処理条件設定の定数を定義しています。
 電源をONにしてからミュートを解除するまでの時間は5秒としました。電源OFFを指示されると必要な処理をして、1秒後に停止させます。また電圧の計測は10分ごとに行って計測値が、2.50V(電池電圧が7.50V)を割り込むとオーディオユニットを停止させます。
 グローバル変数は3つで、repeating_timer_tはタイマー割り込み用に必要なものです。process_statusはHAT22の処理状態を保持する変数で、初期値は、先に定義した休止状態としています。bOutOfBatteryは電池切れになるとtrueに設定されます。
// Function prototype
void  gpio_callback(uint, uint32_t);
bool  timer_callback(repeating_timer_t*);
void  startAudioProcess(void);
void  stopAudioProcess(void);

// Control constants
const int WAITE_POWER_ON_SEC  = 5;    // パワーオンからの待ち時間(秒)
const int WAITE_POWER_OFF_SEC = 1;    // パワーオフまでの待ち時間(秒)
const int INTERVAL_SEC = 600;         // 電圧計測時間間隔(秒)
const float VOLTAGE_THRESHOLD = 2.50; // 電池電圧閾値(7.50V相当の3.3V換算値)

// Global data
int   process_status = PROCESS_IDLE;  // 処理状態
static repeating_timer_t timer;       // タイマー割り込み用
bool  bOutOfBattery = false;          // 電池電圧低下状態


5.処理関数の作成

 全体の処理は、Arduino IDEの基本スタイルであるsetup()とloop()の他に、2つの割り込み処理関数と2つの一般処理関数で構成しています。
○割込処理関数1:外部割り込み処理

 押しボタンスイッチのクリックで呼び出される関数です。所定の引数を受けますがここでは使いません。
 HAT22の状態が「休止状態」であれば、クリックが起動指示であると解釈します。割込の重複を避けるために状態を「無効状態」にしてオーディオ開始処理関数startAudioProcess()を実行し、「動作状態」に切り替えます。
 もし「動作状態」なら、クリックが停止指示であると解釈して、状態を「無効状態」にします。オーディオ停止処理stopAudioProcess()を実行してから、状態を「休止状態」に切り替えます。
 このようにして押しボタンスイッチで動作を切り分けます。
/*
 * 押しボタン押下割り込み処理
 */
void gpio_callback(uint gpio, uint32_t events) {
  // 処理状態に対応してオーディオ処理を開始・停止する
  if (process_status == PROCESS_IDLE) {
    process_status = PROCESS_IGNORE;
    startAudioProcess();
    process_status = PROCESS_RUN;
  }
  else if (process_status == PROCESS_RUN) {
    process_status = PROCESS_IGNORE;
    stopAudioProcess();
    process_status = PROCESS_IDLE;
  }
}


○割込処理関数2:タイマー割り込み処理

 INTERVAL_SECが示す時間経過によって呼び出される関数です。所定の引数を受けますが使いません。
 呼び出されると、アナログ入力ライブラリー関数adc_read()で計測値を読み込みます。ADC分解能は12bitで基準電圧が3.3Vなので、入力値を電圧に変換します。これが電圧閾値VOLTAGE_THRESHOLDを割り込んでいれば、電池切れ状態bOutOfBatteryを「真:true」に設定します。
 タイマー割り込みではその他の処理は何もしません。
/*
 * 電圧計測タイマー割り込み処理
 */
bool timer_callback(repeating_timer_t*)
{
  // 計測電圧を3.3Vにスケール変換して、閾値より小さければ電池電圧低下状態(電池切れ)とする
  const float conversion_factor = 3.3f / (1 << 12);
  uint16_t result = adc_read();
  float voltage = result * conversion_factor;
  if (voltage < VOLTAGE_THRESHOLD)
    bOutOfBattery = true;
  return true;
}


○定型処理1:準備処理

 外部割り込みとタイマー割り込みの設定を行い、使用するGPIOを初期化します。
 外部割り込みの設定は、まずgpio_init()とgpio_set_dir()で対象とするGPIOと入力ピンとして使うことを指示します。次にgpio_pull_up()で、指定したピンの内蔵プルアップを有効にします。そして外部割り込みを設定します。引数で指定するパラメータの意味は次の通りです。
  gpio_set_irq_enabled_with_callback(GPIO_PUSH_BUTTON, GPIO_IRQ_EDGE_FALL, true, gpio_callback);
    GPIO_PUSH_BUTTON: 対象のGPIO
    GPIO_IRQ_EDGE_FALL: GPIOがLOWレベルに落ちた時に割り込みを発生させる
    true: この関数を実行直後から割り込みを可能にする
    gpio_callback: 割り込み対象のコールバック関数
 次のタイマー割り込みでは、adc_init()とadc_gpio_init()でアナログ入力と対象GPIOを初期化した後、ここではADC入力としてADC1を選択しました。そしてタイマー割り込みを設定します。パラメータの意味は次の通りです。
  add_repeating_timer_ms(INTERVAL_SEC * 1000, &timer_callback, NULL, &timer);
    INTERVAL_SEC * 1000: 割り込み間隔をmSecで指定
    &timer_callback: 割り込み対象のコールバック関数
    NULL: データの受け渡しはしない
    &timer: repeating_timer_t型の変数へのポインター
 続いて、青色・赤色LEDのGPIOの初期化と出力指定を行い、両方のLEDを消灯状態にします。
void setup() {
  // 初期状態を設定して
  process_status = PROCESS_IDLE;
  bOutOfBattery = false;

  // 押しボタン押下の外部割り込み処理を準備する
  gpio_init(GPIO_PUSH_BUTTON);
  gpio_set_dir(GPIO_PUSH_BUTTON, GPIO_IN);
  gpio_pull_up(GPIO_PUSH_BUTTON);
  gpio_set_irq_enabled_with_callback(GPIO_PUSH_BUTTON, GPIO_IRQ_EDGE_FALL, true, gpio_callback);

  // 電圧計測タイマー割り込み処理を設定して
  adc_init();
  adc_gpio_init(GPIO_MEASUREMENT);
  adc_select_input(1);  // Select ADC1 (GPIO27)
  add_repeating_timer_ms(INTERVAL_SEC * 1000, &timer_callback, NULL, &timer);
  
  // 必要なGPIOを初期化する
  gpio_init(GPIO_LED_BLUE);
  gpio_init(GPIO_LED_RED);
  gpio_set_dir(GPIO_LED_BLUE, GPIO_OUT);
  gpio_set_dir(GPIO_LED_RED, GPIO_OUT);
  digitalWrite(GPIO_LED_BLUE, LOW);
  digitalWrite(GPIO_LED_RED, LOW);
}


○定型処理2:反復処理

 電圧計測タイマー割り込み関数によって、電池切れ状態bOutOfBatteryがtrueになるのを監視します。
 電池切れになると、「動作状態」であればオーディオ停止処理を行って「休止状態」とし、青色LEDを消して赤色LEDを点灯します。電源を切って再起動しない限り、HAT22は反応しなくなります。
void loop() {
  // 電池電圧が閾値を下回っていればオーディオ処理を停止する
  if (bOutOfBattery) {
    if (process_status == PROCESS_RUN) {
      stopAudioProcess();
      process_status = PROCESS_IDLE;
      digitalWrite(GPIO_LED_BLUE, LOW);
      digitalWrite(GPIO_LED_RED, HIGH);
    }
    sleep_ms(INTERVAL_SEC * 1000);
  }
}


以上に続いて。オーディオ処理の2つの関数を記述しています。
○オーディオ開始処理

 二組のリレーが接続されたGPIOを初期化します。
 まず、電源制御リレーが接続されたGPIOをHIGHにして、オーディオユニットの電源をONにします。ミュート制御リレーはまだOFFなので、ミュートが効いた状態になっています。したがってポップノイズは出力されません。その状態で所定の時間だけ待ちます。
 オーディオユニットの安定を待ってミュート制御リレーのGPIOをHIGHにします。ミュートが解除されてマイクからの音声が出力されるので、青色LEDを点灯します。
/*
 * オーディオ開始処理
 */
void startAudioProcess() {
  // リレーユニットを初期化する
  gpio_init(GPIO_POWER_CONTROL);
  gpio_set_dir(GPIO_POWER_CONTROL, GPIO_OUT);
  gpio_init(GPIO_MUTE_CONTROL);
  gpio_set_dir(GPIO_MUTE_CONTROL, GPIO_OUT);

  // パワースイッチをONにして所定の時間だけ待つ
  gpio_put(GPIO_POWER_CONTROL, HIGH);
  sleep_ms(WAITE_POWER_ON_SEC * 1000);

  // ミュートをOFFにして青色LEDを点灯する
  gpio_put(GPIO_MUTE_CONTROL, HIGH);
  digitalWrite(GPIO_LED_BLUE, HIGH);
  digitalWrite(GPIO_LED_RED, LOW);
  bOutOfBattery = false;
}


○オーディオ停止処理

 ミュート制御リレーのGPIOをLOWにします。停止指示と同時にミュートが有効になり、音声が出力できなくなります。
 わずかな時間だけ待って、オーディオユニットへの電源を遮断して、青色LEDを消します。ミュートが効いているので、電源OFFによるポップノイズは出力されません。
/*
 * オーディオ停止処理
 */
void stopAudioProcess() {
  // ミュートをONにして、わずかに待ってパワースイッチをOFFにする
  gpio_put(GPIO_MUTE_CONTROL, LOW);
  sleep_ms(WAITE_POWER_OFF_SEC * 1000);
  gpio_put(GPIO_POWER_CONTROL, LOW);
  digitalWrite(GPIO_LED_BLUE, LOW);
}


 以上のようにPi Picoのコードはとてもシンプルです。電源投入時のポップノイズの回避だけであれば、コンデンサーとトランジスターを使ったスイッチング回路とリレーで、つまりアナログ回路で実現することもできます。しかし、その他の要件をアナログで対応するのは簡単ではありません。
 今回の処理要件は電圧の測定、状態の把握、異常の監視であり、それらの変化に対応したアクションを実行させることでした。Pi Picoを使えば、これらを明確な手順に沿って確実に動作させることが可能で、時間や閾値の設定・変更など、アナログではパーツ交換やハンダ付けを伴うことも簡単にできてしまいます。Raspberry Pi Picoとのコラボレーションがいかに威力を発揮するかがおわかりいただけたと思います。


6.評価と今後の課題

○テストと評価

 プログラムの書き込みが終わったRaspberry Pi PicoをUSBケーブルから外して、HAT22のベッドに取り付けます。マイクとイヤフォンをミニジャックに差し込み、続いて、モバイルバッテリーをUSBケーブルで接続します。モバイルバッテリーの種類によって異なりますが、手元のAnker PowerCore 10000では側面にある電源ボタンを押します。同時に電池残量のLEDが点灯します。
 次に、HAT22を起動するために前面の押しボタンスイッチを押します。約5秒で青色LEDが点灯するので、イヤフォンを耳につけます。前章のボード間の配線に間違いがなければ、第5章「5.イコライザーの製作②」で動作確認と調整をした時と同様の音声が聞こえてくるはずです。繰り返しになりますが、スッキリとした良質の音声には嬉しくなります。
 この状態で押しボタンを押すと音声が消えて青色LEDも消灯します。もう一度押すと、5秒ほど待って音声が聞こえてきます。ポップノイズはまったく気になりません。以後は、さらに自然に聴こえるよう、自分の耳に合うように、根気よくイコライザーを調整するだけです。
 ついでながら、扇風機やサーキュレータがマイクの近くにあると、風切り音が邪魔になります。ピンマイクを付けて外出する時も、風の音が気になります。これを防ぐため(緩和するため?)には、ウィンドスクリーンまたはウインドジャマーといったアクセサリーを使用します。スポンジ状あるいは毛皮のようなモコモコしたキャップのようなものです。Web上には自作の記事もあるようなので参考にしてください。


○今後の課題

 完成度の高いものができたと喜んでいますが、実は衝撃音に対応できないという問題を残しています。
 例えば、近くでガラス器などを床に落とすと爆音を聞くことになります。音量によっては、これは危険を伴います。デジタル方式のHAT21では、フィルター処理ライブラリー内で異常な音量にはリミッターを適用していました。デジタル音声信号処理ではプログラム上で簡単に対応できるのですが、現時点のアナログ版HAT22には対策が講じられていません。大きな衝撃音が発生する場所では、事前に押しボタンでオーディオユニットへの電源を遮断するかイヤフォンを外すほかありません。
 この点については、引き続きALC(Automatic Level Control)によるリミッターの実現を検討する予定です。マイクアンプの再製作や、それに伴う収納サイズの問題など課題は多いのですが、できるだけ早い時期に結果をレポートできればと考えています。


 
Copyright (C) 2011-2024 Marchan, All rights reserved.