工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

XBee Walkie Talkie

コンポーネントと消耗品

Goldilocks Analogue
現在はプロトタイプのままですが、MCP4822 DAC、マイクアンプ、ヘッドフォンアンプを使用して機能を再現できます。 ArduinoUnoと一緒に。
× 1
MAX9744
× 1
MAX9814
× 1
MCP4921 DAC
× 1
Arduino UNO
× 1
Arduinoワイヤレスシールド(Xbee)
× 1

このプロジェクトについて

私は、12ビットDAC MCP4822、ヘッドフォンアンプ、2x SPIメモリ(SRAM、EEPROM)、SDカードなどのいくつかの特別な機能を備えたAVR ATmega1284pMCUに基づいて高度なArduinoクローンを構築しています。アナログ出力用の実際のアプリケーションはたくさんありますが、Arduinoプラットフォームには統合DAC機能がないため、アナログ信号用に公開されているアプリケーションはほとんどありません。トランシーバーは、デジタルとアナログを一緒に使用して、シンプルでありながら非常に便利なプロジェクトを作成する1つの例です。

Goldilocksアナログ-プロトタイプ3

実際のトランシーバー機能は実際には数行のコードですが、アナログ入力(サンプリング)、MCP4822 DACへのSPIバス上のアナログ出力、サンプルタイミングルーチン、およびXBeeデジタルラジオプラットフォームの基盤の上に構築されています。上から始めて、レイヤーを掘り下げていきましょう。

XBeeラジオ

ポイントツーポイントで通信するように構成されたXBeeProS2B無線を使用しています。 XBee Proの場合、一方の無線をコーディネーターとして構成し、もう一方をルーターとして構成する必要があります。インターネット上に構成ガイドがあります。

パケットを送信する前に最大文字間時間を待機するように無線を設定しました。これは、パケットがいっぱいになったとき(84バイト)にのみパケットが設定されることを意味します。これにより、無線スループットが最大化されます。生のスループットは250kbit / sですが、実際のユーザーデータレートは約32 kbit / sに制限されています。これは、サンプリングレートに影響を与えるため、送信できる音声の品質に影響を与えます。

8ビットのサンプルを使用すると、約3 kHzのサンプリングで、圧縮せずに送信できるデータとほぼ同じ量のデータが生成されることがわかりました。別のプロジェクトのために圧縮を残します。

XBee無線はATモードで構成され、2つのエンドポイント間の透過的なシリアルパイプとして機能します。これは、デジタルラジオを介して2つのデバイスを接続する最も簡単な方法です。また、無線プラットフォームが機能しているかどうかを心配する前に、ワイヤーを使用して簡単なテストを行うことができました。

ロジックアナライザのトレースを見ると、シリアルポートの(紫色の)Rxラインに到着するXBeeデータパケットを確認できます。受信したパケットデータはリングバッファに格納され、一定の速度で再生されます。受信リングバッファに最大255バイトを許可しましたが、XBeeのパケットサイズは84バイトであるため、これで十分です。

他のデバイスに送信されるサンプルは、送信前にバッファリングされていても、各サンプル期間で多かれ少なかれ(青の)Txラインで送信されます。 XBee無線は、これらのバイトを最大0xFFのシンボル間期間(構成)でバッファリングし、パケットがいっぱいになった場合にのみ、他のエンドポイントにパケットを送信します。

サンプリングレート

伝送リンクのビットバジェットを見ると、XBee無線プラットフォームに過負荷をかけたり、サンプルの損失を引き起こしたりすることなく、送信できるデータ量を計算する必要があります。音声サンプルをあからさまに圧縮していないため、送信する8ビットサンプルに3,000Hzサンプリングまたは24kbit / sを掛けたものがあります。これはかなりうまくいくようです。 4 kHzのサンプリングを試しましたが、これは理論上の最大値に近すぎて、あまり効果的に機能しません。

ロジックアナライザを見ると、Rxラインの0x7Eと0x7Cで始まるバイトのパケットの到着を見ることができます。マイクアンプとDAC出力はどちらも0x7F(FF)付近にバイアスされているため、ここでキャプチャおよび送信される信号レベルは非常に低いことがわかります。表示されているサンプルレートは3,000Hzです。

サンプル処理

サンプリング割り込みが処理されているときにキャプチャするために、1つの出力に「ping」を設定しました(黄色)。このアプリケーションでは、使用可能な合計時間に比べて、割り込み処理に費やされる時間が非常に短いことがわかります。おそらく、ある種のデータ圧縮を実装できます。

サンプリング割り込みの間、2つの主要なアクティビティがあります。DACにサンプルを配置することによってオーディオ出力を生成し、次にADCを読み取ってオーディオサンプルをキャプチャし、それをUSARTバッファに送信します。

これは、タイマー割り込みのコードから呼び出されるaudioCodec_dsp関数によって実行されます。

AVR 8ビットTimer0を使用して、割り込みをトリガーすることにより、通常のサンプル間隔を生成しています。標準の可聴周波数の2倍であるMCUFCPU周波数を使用することにより、64のクロックプリスケーラを備えた8ビットタイマーのみを使用して正確な再生サンプリングレートを生成できます。44,100Hzなどの奇数の可聴周波数を生成するには、16ビットTimer1を使用すると、クロックプリスケーラを必要とせずに十分な精度を得ることができます。

ATmega1284p ADCはフリーランモードに設定されており、192kHzにスケールダウンされています。これはATmegaADCで文書化されている最大取得速度に近いものですが、それでも8ビットサンプルの仕様の範囲内です。

この割り込みは完了するのに14usかかり、各サンプル期間の333usに比べて非常に短いです。これにより、ユーザーインターフェースの実行や追加のオーディオ処理など、他の処理を行うための十分な時間が与えられます。

SPIトランザクション

最終的な詳細レベルでは、着信サンプルをMCP4822DACに出力するための実際のSPIトランザクションを確認できます。

このアプリケーションは、標準のSPIバスを使用するGoldilocks Analogue Prototype 2で構築したため、トランザクションは正常です。私のその後のプロトタイプは、ATmega1284pのUSART 1でマスターSPIモードを使用しています。これは、ダブルバッファリングによってSPIトランザクションをわずかに加速し、オーディオストリーミングのためにSDカードまたはSPIメモリへの同時読み取りまたは書き込みのために通常のSPIバスを解放します。 Walkie Talkieアプリケーションでは、オーディオをキャプチャする必要がないため、古いプロトタイプと通常のSPIバスを使用することにマイナス面はありません。

まとめ

いくつかの既存のツールと数行のコードを使用して、(理解できるが高品質ではない)音声を通信できるデジタル暗号化トランシーバーをすばやく構築することができます。そして、今後家族の会話に耳を傾けるCBトラック運転手はいないでしょう。

これは、MAX9814に基づくマイク入力をGoldilocksアナログに追加するテストでした。 Prototype 3を改訂し、マイク増幅回路を追加して、このトランシーバーの例、ボイスチェンジャー、ボーカルコントロールミュージックシンセサイザーなど、オーディオ入力を必要とするアプリケーションをサポートします。

XBeeラジオとマイクアンプを備えた2つのGoldilocksアナログプロトタイプ。

また、ATmega1284pデバイスを、標準レートの20MHzを超える24.576MHzの周波数で実行しています。この特定の周波数により、48kHzから4kHzまで(または1,500 Hzまで)のオーディオサンプルを非常に正確に再生できます。シンセサイザー音楽の生成に関しては、サンプル期間ごとの追加のMCUクロックサイクルは大歓迎です。

Sourceforge AVR freeRTOSでいつものようにコーディングします。また、OPLが素晴らしく、多くのコンポーネントとPCBのソースであるSeeedStudioのShuyangに電話をかけます。


コード

  • コード
  • コード
  • コード
コード C / C ++
 void audioCodec_dsp(uint16_t * ch_A、uint16_t * ch_B){int16_t xn; uint8_t cn; / * ----- Audio Rx ----- * / / *リングバッファから次の文字を取得します。 * / if(ringBuffer_IsEmpty((ringBuffer_t *)&(xSerialPort.xRxedChars))){cn =0x80 ^ 0x55; // A-Lawヌル信号を出力に配置します。 } else if(ringBuffer_GetCount(&(xSerialPort.xRxedChars))>(portSERIAL_BUFFER_RX>> 1))//バッファが半分以上いっぱいの場合。 {cn =ringBuffer_Pop((ringBuffer_t *)&(xSerialPort.xRxedChars)); // 2つのサンプルをポップして追いつき、最初のサンプルを破棄します。 cn =ringBuffer_Pop((ringBuffer_t *)&(xSerialPort.xRxedChars)); } else {cn =ringBuffer_Pop((ringBuffer_t *)&(xSerialPort.xRxedChars)); //サンプルをポップします} alaw_expand1(&cn、&xn); // A-Law圧縮を展開します* ch_A =* ch_B =(uint16_t)(xn + 0x7fff); //信号を正の値に移動し、信号をA&Bチャネルに出力します。 / * ----- Audio Tx ----- * / AudioCodec_ADC(&mod7_value.u16); //サンプルは左寄せで10ビットです。 xn =mod7_value.u16-0x7fe0; // 1/2 10ビット範囲を減算して、サンプルを0の中央に配置します。 IIRFilter(&tx_filter、&xn); //送信されたサンプルトレインをフィルタリングしますalaw_compress1(&xn、&cn); // A-Lawを使用して圧縮xSerialPutChar(&xSerialPort、cn); //サンプルを送信します} 
コード C / C ++
 ISR(TIMER0_COMPA_vect)__ attribute __((hot、flatten)); ISR(TIMER0_COMPA_vect){#if defined(DEBUG_PING)//開始マーク-割り込みの開始を確認-デバッグ専用(黄色のトレース)PORTD | =_BV( PORTD7); // IO lineをpingします。#endif // MCP4822データ転送ルーチン//データをMCP4822に移動します-最初に規則性のために実行されます(ジッターの低減)。 DAC_out(ch_A_ptr、ch_B_ptr); //オーディオ処理ルーチン-入力に対して必要な処理を実行します-次のサンプルのために出力を準備します。 //設定されている場合、コールバック関数であるグローバルオーディオハンドラーを起動します。 if(audioHandler!=NULL)audioHandler(ch_A_ptr、ch_B_ptr); #if defined(DEBUG_PING)//終了マーク-割り込みの終了を確認-デバッグ専用(黄色のトレース)PORTD&=〜_BV(PORTD7);#endif} 
コード C / C ++
 void DAC_out(const uint16_t * ch_A、const uint16_t * ch_B){DAC_command_t write; if(ch_A!=NULL){write.value.u16 =(* ch_A)>> 4; write.value.u8 [1] | =CH_A_OUT; } else // ch_AはNULLなので、DACをオフにします{write.value.u8 [1] =CH_A_OFF; } SPI_PORT_SS_DAC&=〜SPI_BIT_SS_DAC; // SSをローに引いて、Goldilocks AnalogueDACを選択します。 SPDR =write.value.u8 [1]; //送信ch_Aを開始します。 while(!(SPSR&_BV(SPIF))); SPDR =write.value.u8 [0]; //送信ch_Aを続行します。 if(ch_B!=NULL)// ch_A送信中にch_Bの処理を開始{write.value.u16 =(* ch_B)>> 4; write.value.u8 [1] | =CH_B_OUT; } else // ch_BはNULLなので、DACをオフにします{write.value.u8 [1] =CH_B_OFF; } while(!(SPSR&_BV(SPIF))); // ch_Aが終了したことを確認します。 SPI_PORT_SS_DAC | =SPI_BIT_SS_DAC; // SSをHighにプルして、Goldilocks Analogue DACの選択を解除し、値をDACにラッチします。 SPI_PORT_SS_DAC&=〜SPI_BIT_SS_DAC; // SSをローに引いて、Goldilocks AnalogueDACを選択します。 SPDR =write.value.u8 [1]; //送信ch_Bを開始します。 while(!(SPSR&_BV(SPIF))); SPDR =write.value.u8 [0]; //送信ch_Bを続行します。 while(!(SPSR&_BV(SPIF))); // ch_Bが終了したことを確認します。 SPI_PORT_SS_DAC | =SPI_BIT_SS_DAC; // SSをハイに引き上げて、Goldilocks Analogue DACの選択を解除し、値をDACにラッチします。} 
SourceforgeのAVRfreeRTOS
このプロジェクトで使用されるDAC.hおよびアナログテストファイルを含む、freeRTOSのAVRポートのリポジトリ。リンクされたgithubリポジトリを使用しないでください。最新のコードについては、sourceforgeにアクセスしてください。https://sourceforge.net/projects/avrfreertos /https://github.com/feilipu/avrfreertos

回路図

MCP4822 DAC(SPI)ではなくMCP4725 DAC(I2C)を使用しているという点で、完全に正しいわけではありませんが、Fritzingには適切なAdafruitブレークアウトボードがありませんでした。

また、一方向にのみ描画されます...(相互接続されているRxとTxを除く)。
XBeeボードは、RxとTxを接続する2本のワイヤーを交換するだけです。十分なデータを伝送できる任意の無線機が機能します。 DAC出力とヘッドフォンアンプの回路図。
マイク入力アンプはプロトタイプ4に追加されます。

製造プロセス

  1. 高生産スイス加工に関する考慮事項
  2. CNCプロトタイピングガイド
  3. シャフト製造プロセスを理解する
  4. ステンレス鋼の不動態化とは何ですか?
  5. 1つのGPIOピンでアナログセンサーを読み取る
  6. MCP3008を使用したRaspberryPiのアナログセンサー
  7. DACとカスタムPCBを使用して高精度波形を生成する方法
  8. 水分センサーを備えたWin10IOT灌漑コントローラー
  9. アナログ測定の価値
  10. オシロスコープに何でも描画します
  11. 信号回路用シールドケーブル(パート2)