Sprechender Stormtrooper

Kern ist ein Seeduino Xiao, der wav-Dateien von der SD-Karte liest und über seinen D/A-Port ausgibt


xiao

fritzing

fritzing

fritzing

fritzing

fritzing

//#include <Arduino.h>

/*
  Lib SAMD21Audio

  von AloyseTech, die abgeleitet ist von BriscoeTech
*/

#include <SdFat.h>
//SdFat SD;
//#include <SPI.h>
#include <SamdAudio.h>
long r;
long lastrandom = 0;
String sample;
const char *file;
SamdAudio AudioPlayer;

int trigger=2; 
int echo=1; 
long dauer=0; 
long entfernung=0;
int sounds;


#define NUM_AUDIO_CHANNELS 4 //could be 1,2 or 4 for sound

// which Serial you prefer, for information.
#define SERIAL SerialUSB
//#define SERIAL Serial

// SD chip select pin (with ethernet shield : 4)
#define YOUR_SD_CS 3//10

//indicate sample rate here (use audacity to convert your wav)
const unsigned int sampleRate = 22050;

bool state = true;

uint32_t timer = 0, updatetimer = 0;

void stop()
{
  AudioPlayer.stopChannel(0);
  SERIAL.println(" stop");

}

int NumberofFiles()
{
  File file;
  File root;
  int rootFileCount = 0;

  if (!root.open("/")) {
    SERIAL.print("open root");
  }

  while (file.openNext(&root, O_RDONLY)) {
    if (!file.isHidden()) {
      rootFileCount++;
    }
  }

  file.close();
  return rootFileCount;
}




void setup()
{

  pinMode(trigger, OUTPUT); 
  pinMode(echo, INPUT);



  // debug output at 115200 baud
  SERIAL.begin(115200);



  // setup SD-card
  SERIAL.print("Initializing SD card...");
  if (AudioPlayer.begin(sampleRate, NUM_AUDIO_CHANNELS, YOUR_SD_CS) == -1) 
  {
    SERIAL.println(" failed!");
    return;
  }
  SERIAL.println(" done.");

  sounds = NumberofFiles();

  }

void loop()
{
  digitalWrite(trigger, LOW); 
  delay(5); 
  digitalWrite(trigger, HIGH); 
  delay(10);
  digitalWrite(trigger, LOW);
  dauer = pulseIn(echo, HIGH); 
  entfernung = (dauer/2) * 0.03432; 
  if (entfernung < 100 ) 
  {
    do
    {
      r = random(1,sounds);
      SERIAL.println (r);
      SERIAL.println (lastrandom);
    } while (r == lastrandom);
    lastrandom = r;
    sample = String(r );
    sample = sample +".wav";
    file = sample.c_str();
    AudioPlayer.play(file, 0, stop);
    //AudioPlayer.play("silence.wav", 1);
    SERIAL.println( entfernung );
    SERIAL.print( sample );
    SERIAL.println (sounds);
    delay(3000);
  }

}

Die Dateien müssen als 8 Bit Mono in 22050Hz vorliegen. Zum Konvertieren dient WavePad. Mit Audacity funktioniert das nicht zuverlässig. Allerdings sind die Samples aus dem Film mit Audacity extrahiert. Die Audiospur wurde mit VLC extrahiert.

Die Bibliothek habe ich per git clone unter libs des Projektordners in VSC abgelegt. Zusätzlich benötigt das Projekt noch die SD-Lib. Installiert man über “PIO Home” Libraries

die platoformio.ini:

[env:seeed_xiao]
platform = atmelsam
board = seeed_xiao
framework = arduino
lib_extra_dirs = C:\Users\******\Documents\PlatformIO\Projects\SAMD21Sound\lib\SamdAudio
lib_deps = 

    greiman/SdFat@^2.0.2

fritzing

Links zum Projekt

https://learn.adafruit.com/adafruit-micro-sd-breakout-board-card-tutorial/arduino-wiring

https://github.com/BriscoeTech/SamdAudio

https://github.com/hydronics2/SamdAudio

https://wiki.seeedstudio.com/Seeeduino-XIAO/#analog-input-and-output

https://files.seeedstudio.com/wiki/Seeeduino-XIAO/img/Seeeduino-XIAO-pinout.jpg