ISD1700チップにオーディオファイルを録音するためのソフトウェア
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
| ||||
|
このプロジェクトについて
最近のプロジェクトの1つで、短いテキストメッセージの音声を追加する必要がありました。 SDカードを備えたMP3モジュールのようなシールドは私には過度に思えました。Arduinoに人間の音声を再現するように「教える」とは、マイクロコントローラーのすべてのリソースをこのタスクにのみ費やすことを意味します。これは実際には補助的なものです。また、いずれにせよメモリが不足します。
簡単に検索すると、最大数分のメッセージを保存できる、SPI制御のISD1700シリーズの音声録音および再生チップが見つかりました。
音声メッセージは、個別のファイルの形式で事前に準備されていました。残った唯一の問題は、それらをICメモリに記録する方法でした。 ISD1700のプログラマーは広く普及しておらず、チップ自体よりもはるかに高額です。構築方法に関する情報はいくつかありましたが(https://laserwar.ru/sound_lasertag.html)、私はアマチュア無線ではなくプログラマーなので、標準のハードウェアを使用したかったのです。Arduinoボードはその役割に最適でした。
データシート(«ISD1700デザインガイド»)を調べた後、ファイルを記録できるアナログ入力があることに気付きました。そして、プロセスの自動化のために、特別なソフトウェアであるISD1700 RecordToolを作成することにしました。
ISD1700録音ツールを使用すると、Arduinoボードを介して一連のオーディオファイルをISD1700に録音できます。ソフトウェアは2つの部分で構成されています:Arduinoボードのスケッチ( ISD1700.ino )およびスタンドアロンWindowsアプリケーション( ISD1700.exe 。
ISD1700.ino のスケッチ ATMega328PベースのARUINOボード(ArduinoUnoおよびArduinoNanoでテスト済み)用に作成されていますが、おそらく他のボードでも動作する可能性があります。
サポートされているISD1700のリスト:
1)ISD1730;
2)ISD1740;
3)ISD1750;
4)ISD1760;
5)ISD1790;
6)ISD17120;
7)ISD17150;
8)ISD17180;
9)ISD17210;
10)ISD17240。
WindowsアプリケーションはBASSオーディオライブラリに基づいており、MP3、WAV、OGGなどの最も広く使用されている形式をサポートしています。
1.ハードウェア接続
ソフトウェア開発中、私は個別のISD1700ICの代わりに既製の記録モジュールを使用していました。他の可能な接続のバリエーションを試す前に、元のISD1700データシートを読むことを強くお勧めします。
図1-5に、私のハードウェアセットを示します。この場合、ARDUINONANOが使用されます。
<図>小さなブレッドボードに、オーディオ入力(左)とイヤホン(右)用の2つの3.5mmソケット(図2)を配置しました。
<図><図>
外部電源なしで多くの接続エラーが発生したため、Arduinoの5V出力を介してすべてのコンポーネントに電力を供給するのではなく、追加の電源ユニットを使用することをお勧めします。ただし、これはワイヤ接続の品質の低さなどが原因である可能性があります。
<図><図>
2.Arduinoの点滅
USB経由でArduinoボードをPCに接続し、 ISD1700.ino を開きます ADUINO IDEで、通常どおりスケッチをアップロードします(図6)。
<図>
3.アプリケーションのユーザーインターフェイス
ISD1700.exe を実行します 。各制御要素の説明を図7に示します。
<図>
4.一般的な操作シーケンス
図8は、Windowsアプリケーションの一般的な操作シーケンスを示しています。
<図>説明:
1.ISD1700に録音するオーディオファイルを開きます。マウスでドラッグするだけで並べ替えるか、必要に応じて不要なファイル(以前にチェック済み)を削除します。また、各ファイルを再生して音量レベルを調整することもできます。
2. ARDUINOボードが接続されているCOMポートを選択します(図9)。
<図>3.「ISD1700の検出」ボタンを押して、ISD1700のモデルが右側のボックスに表示されていることを確認します。
4.すべてのオーディオファイルの合計時間がISD1700の容量(秒単位)未満であることを確認します。そうしないと、録音を開始できません。
5.「記録開始」ボタンを押します。あなたはバーで進捗状況を見ることができます。必要に応じて「記録の停止」を押します。
6.処理が完了したら、すべてのトラックのアドレスをクリップボードにコピーできます。 10は、2つのオプションの違いを示しています。
<図>ISD1700録音モジュールを使用すると、録音プロセスが完了した直後に、イヤホンとオンボードボタンを使用してオーディオファイルを再生できます。
コード
- ISD1700ARDUINOコード
ISD1700ARDUINOコード C / C ++
// ISD1700レコードツールのArduinoコード//テスト済み:Arduino Uno、Arduino Nano(ATMega328P)// Copyright:Anton Tsaritsynskyy、August 2019 // E-mail:[email protected] //// Thisソフトウェアは「現状有姿」で提供され、いかなる保証もありません。//このソフトウェアの使用によって引き起こされる望ましくない影響については作成者は責任を負いません。//このソフトウェアの商用配布は許可されていません。//サードパーティのライブラリおよびコンポーネントはその所有物です。それぞれの開発者。 3007; const byte ISD_SS_PIN =8; boolean isdIsUp =false; boolean isdNotifyIfFull =true; boolean isdPowerUp(void){byte SR0B1 =1; SPI.beginTransaction(SPISettings(1000000、LSBFIRST、SPI_MODE3)); digitalWrite(ISD_SS_PIN、LOW); SR0B1 =SPI.transfer(0x01); SPI.transfer(0x00); digitalWrite(ISD_SS_PIN、HIGH); SPI.endTransaction(); return(SR0B1&1)!=1; } boolean isdPowerDown(void){SPI.beginTransaction(SPISettings(1000000、LSBFIRST、SPI_MODE3)); digitalWrite(ISD_SS_PIN、LOW); SPI.transfer(0x07); SPI.transfer(0x00); digitalWrite(ISD_SS_PIN、HIGH); SPI.endTransaction();} boolean isdReset(void){SPI.beginTransaction(SPISettings(1000000、LSBFIRST、SPI_MODE3)); digitalWrite(ISD_SS_PIN、LOW); SPI.transfer(0x03); SPI.transfer(0x00); digitalWrite(ISD_SS_PIN、HIGH); SPI.endTransaction(); delay(20);} void isdClrInt(void){SPI.beginTransaction(SPISettings(1000000、LSBFIRST、SPI_MODE3)); digitalWrite(ISD_SS_PIN、LOW); SPI.transfer(0x04); SPI.transfer(0x00); digitalWrite(ISD_SS_PIN、HIGH); SPI.endTransaction();} boolean isdIsReady(void){バイトSR1 =0; SPI.beginTransaction(SPISettings(1000000、LSBFIRST、SPI_MODE3)); digitalWrite(ISD_SS_PIN、LOW); SPI.transfer(0x05); SPI.transfer(0x00); SR1 =SPI.transfer(0x00); digitalWrite(ISD_SS_PIN、HIGH); SPI.endTransaction(); return(〜SR1&1)!=1; } void isdEnableAnaIn(void){バイトAPC [2]; SPI.beginTransaction(SPISettings(1000000、LSBFIRST、SPI_MODE3)); digitalWrite(ISD_SS_PIN、LOW); SPI.transfer(0x44); SPI.transfer(0x00); APC [0] =SPI.transfer(0x00); APC [1] =SPI.transfer(0x00); digitalWrite(ISD_SS_PIN、HIGH); SPI.endTransaction(); APC [0]&=〜B01010000; SPI.beginTransaction(SPISettings(1000000、LSBFIRST、SPI_MODE3)); digitalWrite(ISD_SS_PIN、LOW); SPI.transfer(0x45); SPI.transfer(APC [0]); SPI.transfer(APC [1]); digitalWrite(ISD_SS_PIN、HIGH); SPI.endTransaction();} byte isdDeviceID(void){byte ID; SPI.beginTransaction(SPISettings(1000000、LSBFIRST、SPI_MODE3)); digitalWrite(ISD_SS_PIN、LOW); SPI.transfer(0x09); SPI.transfer(0x00); ID =SPI.transfer(0x00); digitalWrite(ISD_SS_PIN、HIGH); SPI.endTransaction(); IDを返す;} boolean isdIsFull(void){byte SR0B1 =2; SPI.beginTransaction(SPISettings(1000000、LSBFIRST、SPI_MODE3)); digitalWrite(ISD_SS_PIN、LOW); SR0B1 =SPI.transfer(0x05); SPI.transfer(0x00); SPI.transfer(0x00); digitalWrite(ISD_SS_PIN、HIGH); SPI.endTransaction(); return(SR0B1&2)==2; } void isdRec(void){SPI.beginTransaction(SPISettings(1000000、LSBFIRST、SPI_MODE3)); digitalWrite(ISD_SS_PIN、LOW); SPI.transfer(0x41); SPI.transfer(0x00); digitalWrite(ISD_SS_PIN、HIGH); SPI.endTransaction(); delay(40);} void isdStop(void){SPI.beginTransaction(SPISettings(1000000、LSBFIRST、SPI_MODE3)); digitalWrite(ISD_SS_PIN、LOW); SPI.transfer(0x02); SPI.transfer(0x00); digitalWrite(ISD_SS_PIN、HIGH); SPI.endTransaction(); delay(100);} void isdErase(void){SPI.beginTransaction(SPISettings(1000000、LSBFIRST、SPI_MODE3)); digitalWrite(ISD_SS_PIN、LOW); SPI.transfer(0x43); SPI.transfer(0x00); digitalWrite(ISD_SS_PIN、HIGH); SPI.endTransaction(); while(!isdIsReady()){}} unsigned int isdReadRecordPointer(void){byte DB [2]; SPI.beginTransaction(SPISettings(1000000、LSBFIRST、SPI_MODE3)); digitalWrite(ISD_SS_PIN、LOW); SPI.transfer(0x08); SPI.transfer(0x00); DB [0] =SPI.transfer(0x00); DB [1] =SPI.transfer(0x00); digitalWrite(ISD_SS_PIN、HIGH); SPI.endTransaction(); return(DB [1] <<8)| DB [0];} unsigned int isdInit(void){while(!isdPowerUp()){} delay(100); isdClrInt(); while(!isdIsReady()){} isdEnableAnaIn(); 3000 + isdDeviceID();} void setup(){pinMode(ISD_SS_PIN、OUTPUT);を返します。 digitalWrite(ISD_SS_PIN、HIGH); Serial.begin(9600); SPI.begin(); } char cmd; void loop(){if(Serial.available()){cmd =Serial.read(); switch(cmd){case'D ':Serial.print(isdInit()); isdPowerDown(); isdIsUp =false;壊す;ケース 'E':isdInit(); isdErase(); Serial.print(ISD_ERASE_OK); isdIsUp =true; isdNotifyIfFull =true;壊す;ケース 'R':isdRec(); Serial.print(ISD_REC_OK);壊す;ケース 'S':isdStop(); Serial.print(isdReadRecordPointer());壊す;ケース 'X':isdReset(); Serial.print(ISD_RESET_OK); isdIsUp =false;壊す;ケース 'C':if(isdIsUp){isdStop(); isdReset(); Serial.print(ISD_CANCEL_OK); isdIsUp =false; } 壊す; }} if(isdNotifyIfFull &&isdIsUp){if(isdIsFull()){isdReset(); isdIsUp =false; Serial.print(ISD_FULL); isdNotifyIfFull =false; }}}
回路図
製造プロセス