Efficiënte ISD1700 Audio-opname Software & Arduino Handleiding
Onderdelen en benodigdheden
| Arduino Nano R3 | × | 1 |
| Experimenteerbord (standaard) | × | 2 |
| ISD1760 Spelopname- en afspeelmodule | × | 1 |
| USB-A naar Mini-USB kabel | × | 1 |
| Telefoon audio connector, 3.5mm | × | 2 |
| 9V 1A Schakelvoeding | × | 1 |
| Experimenteerbord voeding 5V | × | 1 |
| Draadbruggen (standaard) | × | 1 |
Apps en online services
- ISD1700 Record Tool - Archief met ISD1700 Record Tool met zowel de code voor Arduino als Windows-applicatie
- Arduino IDE
Over dit project
In een van mijn recente projecten moest ik korte tekstberichten vertalen naar spraak. Shields zoals een MP3-module met SD-kaart leken me overkill, en het 'leren' van Arduino om menselijke spraak te reproduceren zou alle middelen van de microcontroller op deze taak alleen verspillen, wat in feite een hulpfunctie is. Daarnaast zou ik in elk geval het geheugen vol lopen.
Een korte zoektocht onthulde spraakopname- en afspeelchips van de ISD1700-serie, SPI-gestuurd, in staat om berichten van enkele minuten op te slaan.
Spraakberichten waren van tevoren klaar als aparte bestanden. De enige vraag was hoe die in het IC-geheugen te krijgen. Programmeurs voor ISD1700 zijn niet wijd verspreid en kosten veel meer dan de chips zelf. Er was informatie over hoe er een te bouwen (link), maar ik ben meer programmeerder dan radio-amateur, dus wilde ik standaardhardware gebruiken – Arduino-boards waren daar uitstekend voor geschikt.
Na bestudering van de datasheet ("ISD1700 Design Guide") realiseerde ik me dat er een analoge ingang was waarmee de bestanden opgenomen konden worden. En voor procesautomatisering besloot ik speciale software te schrijven - ISD1700 Record Tool.
ISD1700 Record Tool stelt je in staat om een set audiobestanden in de ISD1700 op te nemen via een Arduino-board. De software bestaat uit twee delen: een sketch voor het Arduino-board (ISD1700.ino) en een zelfstandige Windows-applicatie (ISD1700.exe).
De sketch in ISD1700.ino is geschreven voor ATMega328P-gebaseerde Arduino-boards (getest op Arduino Uno en Arduino Nano), maar werkt waarschijnlijk ook op andere boards.
Lijst van ondersteunde ISD1700's:
- ISD1730
- ISD1740
- ISD1750
- ISD1760
- ISD1790
- ISD17120
- ISD17150
- ISD17180
- ISD17210
- ISD17240
De Windows-applicatie is gebaseerd op de BASS-audiobibliotheek, die de meest gebruikte formaten ondersteunt: MP3, WAV, OGG, etc.
1. Hardware-aansluiting
Tijdens de softwareontwikkeling gebruikte ik een kant-en-klaar opname-module in plaats van een losse ISD1700 IC. Voordat je andere mogelijke aansluitvarianten probeert, raad ik ten zeerste aan de originele ISD1700-datasheet te lezen.
Afbeeldingen 1-5 tonen mijn hardware-opstelling. In dit geval wordt een ARDUINO NANO gebruikt.

Op een klein experimenteerbord plaatste ik twee 3.5mm sockets (Fig. 2) voor audio-invoer (links) en oortjes (rechts).


Ik raad aan een extra voeding te gebruiken in plaats van alle componenten via de 5V-uitgang van de Arduino te voeden, omdat ik veel verbindingsfouten had zonder externe voeding. Dit kan echter ook door slechte kwaliteit van de draadverbindingen of iets anders.


2. Arduino flashen
Sluit het Arduino-board aan op je PC via USB, open ISD1700.ino in de Arduino IDE en upload de sketch zoals gebruikelijk (Fig. 6).

3. Applicatie gebruikersinterface
Start ISD1700.exe. De beschrijving van elk bedieningselement is weergegeven in Fig. 7.

4. Typische operationele volgorde
Fig. 8 toont de typische operationele volgorde in de Windows-applicatie.

Beschrijving:
- Open de audiobestanden die je wilt opnemen op de ISD1700. Sorteer ze door te slepen met de muis, of verwijder ongewenste bestanden (na ze te hebben gecontroleer) indien nodig. Je kunt elk bestand afspelen en het volumenniveau aanpassen.
- Selecteer de COM-poort waaraan het Arduino-board is verbonden (Fig. 9).
- Druk op de knop "Detect ISD1700" en controleer of het model van de ISD1700 in het vakje rechts wordt weergegeven.
- Zorg ervoor dat de totale duur van alle audiobestanden minder is dan de capaciteit van de ISD1700 in seconden; anders kun je de opname niet starten.
- Druk op de knop "Start record". Je kunt de voortgang op de balk zien. Druk op "Stop record" indien nodig.
- Na afloop van het proces kun je de adressen van alle tracks naar het klembord kopiëren. Fig. 10 toont het verschil tussen de twee opties.


Het gebruik van de ISD1700-opnamemodule maakt het mogelijk om audiobestanden direct na het opnameproces af te spelen met behulp van oortjes en de onboard-knoppen.
Code
ISD1700 ARDUINO code C/C++
// Arduino code for ISD1700 Record Tool // Getest: Arduino Uno, Arduino Nano (ATMega328P) // Copyright: Anton Tsaritsynskyy, Augustus 2019 // E-mail: tsaritsynskyy.a.a@gmail.com // // Deze software wordt "as is" geleverd zonder enige garanties. // Auteur is niet verantwoordelijk voor ongewenste effecten door gebruik van deze software. // Commerciële distributie van deze software is niet toegestaan. // Derdenbibliotheken en componenten zijn eigendom van hun respectieve ontwikkelaars.
#include <SPI.h>
const unsigned int ISD_ERASE_OK = 3002;
const unsigned int ISD_REC_OK = 3003;
const unsigned int ISD_STOP_OK = 3004;
const unsigned int ISD_RESET_OK = 3005;
const unsigned int ISD_CANCEL_OK = 3006;
const unsigned int ISD_FULL = 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) {
byte 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) {
byte 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();
return 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();
return 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;
break;
case 'E':
isdInit();
isdErase();
Serial.print(ISD_ERASE_OK);
isdIsUp = true;
isdNotifyIfFull = true;
break;
case 'R':
isdRec();
Serial.print(ISD_REC_OK);
break;
case 'S':
isdStop();
Serial.print( isdReadRecordPointer() );
break;
case 'X':
isdReset();
Serial.print(ISD_RESET_OK);
isdIsUp = false;
break;
case 'C':
if (isdIsUp) {
isdStop();
isdReset();
Serial.print(ISD_CANCEL_OK);
isdIsUp = false;
}
break;
}
}
if (isdNotifyIfFull && isdIsUp) {
if (isdIsFull()) {
isdReset();
isdIsUp = false;
Serial.print(ISD_FULL);
isdNotifyIfFull = false;
}
}
}
Schema's

Productieproces
- Draagbare pulsoximeter voor noodgebruik tijdens COVID-19
- Een audio-reactieve bureaulamp bouwen met Arduino Nano
- Realtime Weerstation met Arduino & ThingSpeak IoT
- Automatische Keyer voor Radiopeiling – Precisie, Gemak en Betrouwbaarheid
- Precisie joystick-controller voor MeArm-robot – Coördinaten opnemen & afspelen met Arduino Uno
- Health Band: slimme weerebare assistant voor senioren
- ISO 26262 Certificering Bereiken voor Automotive Software Componenten
- AI-chip startups stabiliseren naarmate industrie focus verplaatst naar in-house oplossingen
- Hoogpresterende tungsten-titanium legering targets voor geavanceerde halfgeleiderchips
- Ultra-hoge-zuiverheid tungsten targets: sleutel tot geavanceerde halfgeleider dunne lagen
- Hexion Inc. vraagt bescherming onder Chapter 11 aan tijdens herstructurering