Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

XBee Walkie Talkie

Komponen dan persediaan

Analog Goldilocks
Saat ini masih sebagai prototipe, tetapi fungsionalitas dapat dibuat ulang dengan MCP4822 DAC, Penguat Mikrofon, dan Penguat Headphone, bersama dengan Arduino Uno.
× 1
MAX9744
× 1
MAX9814
× 1
MCP4921 DAC
× 1
Arduino UNO
× 1
Arduino Wireless Shield (Xbee)
× 1

Tentang proyek ini

Saya sedang membangun tiruan Arduino canggih berdasarkan AVR ATmega1284p MCU dengan beberapa fitur khusus termasuk 12 bit DAC MCP4822, penguat headphone, 2x Memori SPI (SRAM, EEPROM), dan Kartu SD. Ada banyak aplikasi dunia nyata untuk output analog, tetapi karena platform Arduino tidak memiliki kemampuan DAC terintegrasi, sangat sedikit aplikasi yang diterbitkan untuk sinyal analog. Walkie Talkie adalah salah satu contoh penggunaan digital dan analog bersama-sama untuk membuat proyek yang sederhana namun sangat berguna.

Analog Goldilocks - Prototipe 3

Fungsi Walkie Talkie sebenarnya hanya beberapa baris kode, tetapi dibangun di atas dasar input analog (pengambilan sampel), output analog pada bus SPI ke MCP4822 DAC, rutinitas pengaturan waktu sampel, dan platform radio digital XBee. Mari kita mulai dari atas dan kemudian menggali lapisan-lapisannya.

Radio XBee

Saya menggunakan radio XBee Pro S2B, dikonfigurasi untuk berkomunikasi dari titik ke titik. Untuk XBee Pro perlu ada satu radio yang dikonfigurasi sebagai Koordinator, dan yang lainnya sebagai Router. Ada panduan konfigurasi di Internet.

Saya telah mengonfigurasi radio untuk menunggu waktu antar-karakter maksimum sebelum mengirim paket, yang menyiratkan bahwa paket hanya akan disetel saat penuh (84 byte). Ini memaksimalkan throughput radio. Throughput mentah adalah 250 kbit/dtk, tetapi kecepatan data pengguna aktual dibatasi sekitar 32 kbit/dtk. Hal ini berdampak pada laju pengambilan sampel dan oleh karena itu kualitas ucapan yang dapat ditransmisikan.

Dengan menggunakan sampel 8 bit, saya menemukan bahwa pengambilan sampel sekitar 3 kHz menghasilkan data sebanyak yang dapat ditransmisikan tanpa kompresi. Saya meninggalkan kompresi untuk proyek lain.

Radio XBee dikonfigurasi dalam mode AT, yang bertindak sebagai pipa serial transparan antara dua titik akhir. Ini adalah cara paling sederhana untuk menghubungkan dua perangkat melalui radio digital. Dan itu memungkinkan saya untuk melakukan pengujian sederhana, menggunakan kabel, sebelum mengkhawatirkan apakah platform radio berfungsi atau tidak.

Melihat penelusuran dari penganalisis logika, kita dapat melihat paket data XBee tiba di jalur (ungu) Rx dari port serial. Paket data yang diterima disimpan ke dalam ring buffer, dan dimainkan dengan kecepatan konstan. Saya telah mengizinkan hingga 255 byte dalam buffer ring penerima, dan ini akan cukup karena ukuran paket XBee adalah 84 byte.

Sampel yang akan ditransmisikan ke perangkat lain ditransmisikan pada jalur (biru) Tx, kurang lebih di setiap periode sampel meskipun buffer sebelum transmisi. Radio XBee menyangga byte ini hingga 0xFF periode antar-simbol (konfigurasi), dan hanya mentransmisikan paket ke titik akhir lain saat paket tersebut memiliki paket penuh.

Tingkat Pengambilan Sampel

Melihat anggaran bit untuk link transmisi, kita perlu menghitung berapa banyak data yang dapat ditransmisikan tanpa membebani platform radio XBee, dan menyebabkan hilangnya sampel. Karena kami tidak mengompresi sampel suara secara terang-terangan, kami memiliki sampel 8 bit dikalikan dengan pengambilan sampel 3.000 Hz atau 24 kbit/dtk untuk dikirim. Ini tampaknya bekerja dengan cukup baik. Saya telah mencoba pengambilan sampel 4 kHz, tetapi ini terlalu dekat dengan maksimum teoritis, dan tidak bekerja terlalu efektif.

Melihat penganalisis logika, kita dapat melihat kedatangan paket byte yang dimulai dengan 0x7E dan 0x7C pada baris Rx. Amplifier Mikrofon dan output DAC dibias sekitar 0x7F(FF), jadi kita dapat membaca bahwa level sinyal yang ditangkap dan ditransmisikan di sini sangat rendah. Kecepatan sampel yang ditampilkan adalah 3.000 Hz.

Pemrosesan Sampel

Saya telah menempatkan "ping" pada satu output untuk ditangkap ketika interupsi pengambilan sampel sedang diproses (kuning). Kita dapat melihat bahwa jumlah waktu yang dihabiskan dalam pemrosesan interupsi sangat kecil untuk aplikasi ini, relatif terhadap total waktu yang tersedia. Mungkin semacam kompresi data dapat diterapkan.

Selama interupsi pengambilan sampel, ada dua aktivitas utama, menghasilkan output audio, dengan menempatkan sampel ke DAC, dan kemudian membaca ADC untuk menangkap sampel audio dan mengirimkannya ke buffer USART.

Ini dilakukan oleh fungsi audioCodec_dsp, yang dipanggil dari kode dalam interupsi timer.

Saya menggunakan AVR 8 bit Timer0 untuk menghasilkan interval sampel reguler, dengan memicu interupsi. Dengan menggunakan frekuensi MCU FCPU yang merupakan kelipatan biner dari frekuensi audio standar, kami dapat menghasilkan kecepatan pengambilan sampel reproduksi yang akurat hanya dengan menggunakan timer 8 bit dengan clock prescaler 64. Untuk menghasilkan frekuensi audio aneh, seperti 44.100 Hz, 16 bit Timer1 dapat digunakan untuk mendapatkan akurasi yang cukup tanpa memerlukan clock prescaler.

ATmega1284p ADC diatur ke mode free-run, dan diperkecil ke 192 kHz. Meskipun ini mendekati kecepatan akuisisi maksimum yang didokumentasikan untuk ATmega ADC, ini masih dalam spesifikasi untuk sampel 8 bit.

Interupsi ini membutuhkan waktu 14 kita untuk menyelesaikannya, dan sangat singkat dibandingkan dengan 333 kita yang kita miliki untuk setiap periode sampel. Ini memberi kami banyak waktu untuk melakukan pemrosesan lain, seperti menjalankan antarmuka pengguna atau pemrosesan audio lebih lanjut.

Transaksi SPI

Pada tingkat detail terakhir, kita dapat melihat transaksi SPI yang sebenarnya untuk mengeluarkan sampel yang masuk ke MCP4822 DAC.

Karena saya telah membangun aplikasi ini di Goldilocks Analogue Prototype 2 yang menggunakan bus SPI standar, transaksinya normal. Prototipe saya selanjutnya menggunakan Mode Master SPI pada USART 1 dari ATmega1284p, yang sedikit mempercepat transaksi SPI melalui buffering ganda, dan membebaskan bus SPI normal untuk membaca atau menulis secara simultan ke Kartu SD atau Memori SPI, untuk streaming audio. Dalam aplikasi Walkie Talkie tidak perlu merekam audio, jadi tidak ada ruginya menggunakan prototipe lama dan bus SPI normal.

Selesai

Menggunakan beberapa alat yang sudah ada sebelumnya dan beberapa baris kode, dimungkinkan untuk dengan cepat membangun walkie talkie yang dienkripsi secara digital, yang mampu berkomunikasi (dapat dimengerti, tetapi tidak berkualitas tinggi) suara. Dan, tidak ada pengemudi truk CB yang akan mendengarkan percakapan keluarga selanjutnya.

Ini adalah tes untuk menambahkan input mikrofon berdasarkan MAX9814 ke Analog Goldilocks. Saya akan merevisi Prototipe 3 dan akan menambahkan sirkuit amplifikasi mikrofon untuk mendukung aplikasi yang memerlukan input audio, seperti contoh walkie talkie ini, atau pengubah suara, atau synthesizer musik kontrol vokal.

Dua prototipe Analog Goldilocks dengan radio XBee, dan amplifier Mikrofon.

Saya juga menjalankan perangkat ATmega1284p pada peningkatan frekuensi 24.576 MHz, di atas kecepatan standar 20 MHz. Frekuensi spesifik ini memungkinkan reproduksi sampel audio yang sangat presisi dari 48 kHz hingga 4 kHz (atau bahkan hingga 1.500 Hz). Siklus jam MCU ekstra per periode sampel sangat disambut baik dalam hal menghasilkan musik yang disintesis.

Kode seperti biasa di Sourceforge AVR freeRTOS Juga, hubungi Shuyang di SeeedStudio yang OPL-nya luar biasa, dan merupakan sumber dari banyak komponen dan PCB.


Kode

  • Kode
  • Kode
  • Kode
KodeC/C++
void audioCodec_dsp( uint16_t * ch_A, uint16_t * ch_B){ int16_t xn; uint8_t cn; /*----- Audio Rx -----*/ /* Dapatkan karakter berikutnya dari buffer ring. */ if( ringBuffer_IsEmpty( (ringBuffer_t*) &(xSerialPort.xRxedChars) ) ) { cn =0x80 ^ 0x55; // letakkan sinyal nulled A-Law pada output. } else if (ringBuffer_GetCount( &(xSerialPort.xRxedChars) )> (portSERIAL_BUFFER_RX>>1) ) // jika buffer lebih dari setengah penuh. { cn =ringBuffer_Pop( (ringBuffer_t*) &(xSerialPort.xRxedChars) ); // ambil dua sampel untuk mengejar, buang yang pertama. cn =ringBuffer_Pop( (ringBuffer_t*) &(xSerialPort.xRxedChars) ); } else { cn =ringBuffer_Pop( (ringBuffer_t*) &(xSerialPort.xRxedChars) ); // memunculkan sampel } alaw_expand1(&cn, &xn); // memperluas kompresi A-Law *ch_A =*ch_B =(uint16_t)(xn + 0x7fff); // pindahkan sinyal ke nilai positif, keluarkan sinyal di saluran A &B. /*----- Audio Tx -----*/ AudioCodec_ADC( &mod7_value.u16 ); // sampel adalah 10 bit yang dibenarkan. xn =mod7_value.u16 - 0x7fe0; // pusatkan sampel ke 0 dengan mengurangi rentang 1/2 10bit. IIRFilter( &tx_filter, &xn); // filter kereta sampel yang ditransmisikan alaw_compress1(&xn, &cn); // kompres menggunakan A-Law xSerialPutChar( &xSerialPort, cn); // kirimkan sampelnya}
KodeC/C++
ISR(TIMER0_COMPA_vect) __attribute__ ((hot, flatten));ISR(TIMER0_COMPA_vect){#if didefinisikan(DEBUG_PING) // tanda mulai - periksa awal interupsi - hanya untuk debugging (jejak kuning) PORTD |=_BV( PORTD7); // Ping IO line.#endif // Rutin transfer data MCP4822 // pindahkan data ke MCP4822 - dilakukan terlebih dahulu untuk keteraturan (mengurangi jitter). DAC_out (ch_A_ptr, ch_B_ptr); // rutinitas pemrosesan audio - lakukan pemrosesan apa pun pada input yang diperlukan - siapkan output untuk sampel berikutnya. // Aktifkan pengendali audio global yang merupakan fungsi panggilan balik, jika disetel. if (audioHandler!=NULL) audioHandler(ch_A_ptr, ch_B_ptr);#if didefinisikan(DEBUG_PING) // tanda akhir - periksa akhir interupsi - hanya untuk debugging (jejak kuning) PORTD &=~_BV(PORTD7);#endif} 
KodeC/C++
void DAC_out(const uint16_t * ch_A, const uint16_t * ch_B){ DAC_command_t tulis; if (ch_A !=NULL) { write.value.u16 =(*ch_A)>> 4; write.value.u8[1] |=CH_A_OUT; } else // ch_A adalah NULL jadi kita matikan DAC { write.value.u8[1] =CH_A_OFF; } SPI_PORT_SS_DAC &=~SPI_BIT_SS_DAC; // Tarik SS rendah untuk memilih DAC Analog Goldilocks. SPDR =tulis.nilai.u8[1]; // Mulai transmisi ch_A. while ( !(SPSR &_BV(SPIF)) ); SPDR =write.value.u8[0]; // Lanjutkan transmisi ch_A. if (ch_B !=NULL) // mulai memproses ch_B saat kita melakukan transmisi ch_A { write.value.u16 =(*ch_B)>> 4; write.value.u8[1] |=CH_B_OUT; } else // ch_B adalah NULL jadi kita matikan DAC { write.value.u8[1] =CH_B_OFF; } while ( !(SPSR &_BV(SPIF)) ); // periksa apakah kita sudah menyelesaikan ch_A. SPI_PORT_SS_DAC |=SPI_BIT_SS_DAC; // Tarik SS tinggi untuk membatalkan pilihan DAC Analog Goldilocks, dan kaitkan nilai ke DAC. SPI_PORT_SS_DAC &=~SPI_BIT_SS_DAC; // Tarik SS rendah untuk memilih DAC Analog Goldilocks. SPDR =tulis.nilai.u8[1]; // Mulai transmisi ch_B. while ( !(SPSR &_BV(SPIF)) ); SPDR =write.value.u8[0]; // Lanjutkan transmisi ch_B. while ( !(SPSR &_BV(SPIF)) ); // periksa apakah kita sudah menyelesaikan ch_B. SPI_PORT_SS_DAC |=SPI_BIT_SS_DAC; // Tarik SS tinggi untuk membatalkan pilihan DAC Analog Goldilocks, dan kaitkan nilai ke DAC.}
AVRfreeRTOS di Sourceforge
Repositori port AVR freeRTOS, termasuk file pengujian DAC.h dan Analog yang digunakan dalam proyek ini.JANGAN gunakan repositori github tertaut.Buka sourceforge untuk kode terbaru.https://sourceforge.net/projects/avrfreertos /https://github.com/feilipu/avrfreertos

Skema

Ini tidak sepenuhnya benar, karena menggunakan MCP4725 DAC (I2C) dan bukan MCP4822 DAC (SPI), tetapi Fritzing tidak memiliki papan breakout Adafruit yang tepat.

Juga, itu digambar dalam satu arah saja... (dengan pengecualian Rx dan Tx yang saling berhubungan).
Papan XBee hanya mengganti dua kabel yang menghubungkan Rx dan Tx. Perangkat radio apa pun yang dapat membawa data yang cukup akan berfungsi. Skema untuk keluaran DAC dan penguat Headphone.
Penguat input mikrofon akan ditambahkan pada prototipe 4.

Proses manufaktur

  1. Pertimbangan untuk Mesin Swiss Produksi Tinggi
  2. Panduan untuk Pembuatan Prototipe CNC
  3. Memahami Proses Pembuatan Poros
  4. Apa itu Pasif Stainless Steel?
  5. Membaca Sensor Analog Dengan Satu Pin GPIO
  6. Sensor Analog Pada Raspberry Pi Menggunakan MCP3008
  7. Cara Menghasilkan Bentuk Gelombang Presisi Tinggi Menggunakan DAC dan PCB Khusus
  8. Pengontrol Irigasi Win10 IOT dengan Sensor Kelembaban
  9. Nilai pengukuran analog
  10. Kabel Terlindung Untuk Sirkuit Sinyal (Bagian 2)