Simple IP Transceiver with Arduino Due


                         7M4MON 2019/09/02


1.概要

12bitのDAC/ADCを持つ Arduino Due と W5500 を使って、シンプルなIPトランシーバーを作ってみました。



2.動作説明

PTTボタン押下で対向機に音声を送出します。
8kHzでタイマ割り込みをかけ、アナログポートからマイク入力を読み込みます。
マイク入力は12bitなので、これを8bitに圧縮しますが、その際、下位4bitを
そのまま切り捨ててしまうとダイナミックレンジが失われ、自然な音声通信は難しくなります。
そのため、国際電話等で使用している非線形圧縮方式、μ-law(符号込みで14bit) や A-law(符号込みで13bit) を
参考にして、符号込みで12bitとなる非線形圧縮方式A-law[改]を新たに作成しました。



上記の表に示した通り、性能はA-lawと同等です。



A-law[改]で圧縮された音声信号は1024バイトの送信バッファに貯められていき、
このバッファが一杯になったら、UDPパケットとしてW5500からネットワークに送出されます。

ネットワークからパケットを受信した場合は、8192(1.024秒分)バイトのリングバッファに貯められていき
受信データがこのバッファの半分まで達したら、8kHzのタイマで A-law[改] のデコードを行い12bitのDACにセットされます。
A-law[改] のデコードは単なるテーブル引きです。
DAC出力は正帰還型アクティブLPFを通ってオーディオアンプに送られ、スピーカーから音声が再生されます。

コードは github に公開していますのでご自由にどうぞ。

3.かかった費用

8,000円くらい

4.その他

最初は STM32F103 (BluePill)で作っていたのですが、W5500へSPIでパケットを転送しているときに
音声入力の割り込みがかかると、その部分のデータが欠けてしまうようでした。
DMAで転送すれば解決するかもしれないのですが、対向機として準備した Arduino Due (SAM3X8E) では
欠けがなかったので、Dueを2台準備することにしました。