Go Down

Topic: ATtiny85 - Lautsprecher brummt/ vibriert (Read 186 times) previous topic - next topic

Smurl

Dec 09, 2018, 11:53 pm Last Edit: Dec 10, 2018, 12:06 am by Smurl
Hallo zusammen,

ich habe hier so einen mini Lautsprecher, der mit einem ATtiny85 gekoppelt, das Harry Potter Theme abspielen soll.
Dazu nutze ich untenstehenden code.
Über meinem Arduino Uno klingt der sound sauber.

Am ATtiny85 habe ich mit dem Anspielen der Töne jedoch immer ein vibrieren/ brummen im Hintergrund, was den sound versaut.

Ich habe bereits probiert mit den Werten im code zu spielen, was aber dahingehend nichts verändert hat.
Ich sehe im code auch nichts, was dieses brummen verursachen könnte.
Der Lautsprecher ist direkt an den ATtiny angeschlossen. Ob Pin1 oder 2 (PWM/ keine PWM) macht auch keinen Unterschied.

Würde mich sehr freuen, wenn hier jemand nen Tipp hat :)

Viele Grüße

Code: [Select]
// Harry Potter Theme arranged by Dodo le Guitariste

// TONES  ==========================================
#define  Bb    2146
#define  b     2024
#define  c     1912     
#define  db    1805 
#define  d     1703   
#define  eb    1608
#define  e     1517     
#define  f     1432     
#define  gb    1351     
#define  g     1276     
#define  ab    1233
#define  a     1136
#define  bb    1073 
#define  B     1012
#define  C     956
#define  Db    902
#define  D     851


// Define a special note, 'R', to represent a rest
#define  R     0

// SETUP ============================================
// Set up speaker on a PWM pin (digital 9, 10 or 11)
int speakerOut = 2;

void setup() {
  pinMode(speakerOut, OUTPUT);
 
  }


// MELODY and TIMING  =======================================
//  melody[] is an array of notes, accompanied by beats[],
//  which sets each note's relative length (higher #, longer note)
int melody[] = {  b,  e,  g, gb,  e,  B,  a, gb,  e,  g, gb, eb,  f,  b,  b,  e,  g,  gb,  e,  B,  D,  Db,  C,  ab,  C,  B,  bb,  gb,  g,  e,   g,  B,  g,  B,  g,  C,  B,  bb,  gb,  g,  B,  bb,  Bb,  c,   B,  g,  B,  g,  B,  g,  D,  Db,  C,  ab,  C,  B,  bb,  gb,  g,   e, R };
int beats[]  = { 32, 64, 16, 32, 64, 32, 64, 64, 64, 16, 32, 64, 32, 64, 32, 64, 16,  32, 64, 32, 64,  32, 64,  32, 64, 32,  64,  32, 32, 128, 32, 64, 32, 64, 32, 64, 32,  64,  32, 64, 16,  32,  64, 32, 128, 32, 64, 32, 64, 32, 64,  32, 64,  32, 64, 32,  64,  32, 32, 128, 8 };
int MAX_COUNT = sizeof(melody) / 2; // Melody length, for looping.

// Set overall tempo
long tempo = 10000;
// Set length of pause between notes
int pause = 120;
// Loop variable to increase Rest length
int rest_count = 125; //<-BLETCHEROUS HACK; See NOTES

// Initialize core variables
int tone_ = 0;
int beat = 0;
long duration  = 0;

// PLAY TONE  ==============================================
// Pulse the speaker to play a tone for a particular duration
void playTone() {
  long elapsed_time = 0;
  if (tone_ > 0) { // if this isn't a Rest beat, while the tone has
    //  played less long than 'duration', pulse speaker HIGH and LOW
    while (elapsed_time < duration) {

      digitalWrite(speakerOut,HIGH);
      delayMicroseconds(tone_ / 2);

      // DOWN
      digitalWrite(speakerOut, LOW);
      delayMicroseconds(tone_ / 2);

      // Keep track of how long we pulsed
      elapsed_time += (tone_);
    }
  }
  else { // Rest beat; loop times delay
    for (int j = 0; j < rest_count; j++) { // See NOTE on rest_count
      delayMicroseconds(duration); 
    }                               
  }                                 
}

// LET THE WILD RUMPUS BEGIN =============================
void loop() {
  // Set up a counter to pull from melody[] and beats[]
  for (int i=0; i<MAX_COUNT; i++) {
    tone_ = melody[i];
    beat = beats[i];

    duration = beat * tempo; // Set up timing

    playTone();
    // A pause between notes...
    delayMicroseconds(pause);


    }
  }



uwefed

Wie versorgst Du den ATtiny85 mit Strom?

volvodani

Hast du den Lautsprecher direkt am Ausgang angeschlossen?
Welche Impedanz hat der Lautsprecher 4 oder 8 Ohm oder mehr?
Es kann ein Problem der Spannungsversorgung sein.
Gruß
DerDani
"Komm wir essen Opa!" - Satzzeichen retten Leben!

postmaster-ino

Hi

Erschwerend könnte hinzukommen, daß der ATtiny auch nur mit 1MHz/8MHz läuft, ist also mindestens den Faktor 2 langsamer als der Uno.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Smurl

Danke für die Antworten.
Ich versorge den ATtiny über den 5V Ausgang vom Uno.
Wieviel Ohm der Lautsprecher hat kann ich nicht sagen. Habe den irgendwo ausgebaut und da steht leider nichts drauf.
Dass der ATtiny langsamer läuft hat doch nur Auswirkungen auf die Tonhöhe oder?
Habe es mit einem anderen Code ausprobiert, der für ATtiny geschrieben ist. Da klangen die Töne normal.

Code: [Select]
/* TinyTone for ATtiny85 */

// Notes
const int Note_C = 239;
const int Note_CS = 225;
const int Note_D = 213;
const int Note_DS = 201;
const int Note_E = 190;
const int Note_F = 179;
const int Note_FS = 169;
const int Note_G = 159;
const int Note_GS = 150;
const int Note_A = 142;
const int Note_AS = 134;
const int Note_B = 127;
const int Note_S = 255;
const int Note_b = 253;

int Speaker = 1;

void setup()
{
pinMode(Speaker, OUTPUT);
}

void loop()
{
playTune();
delay(100);
}

void TinyTone(unsigned char divisor, unsigned char octave, unsigned long duration)
{
TCCR1 = 0x90 | (8-octave); // for 1MHz clock
//TCCR1 = 0x90 | (11-octave); // for 8MHz clock
OCR1C = divisor-1; // set the OCR
delay(duration);
TCCR1 = 0x90; // stop the counter
}

// Play La Cucaracha
void playTune(void)
{
TinyTone(Note_B, 4, 400);
TinyTone(Note_S, 1, 10);
TinyTone(Note_E, 4, 800);
TinyTone(Note_S, 1, 10);
TinyTone(Note_G, 4, 200);
TinyTone(Note_S, 1, 10);
TinyTone(Note_GS, 4, 400);
TinyTone(Note_S, 1, 10);
TinyTone(Note_E, 4, 800);//xxx
TinyTone(Note_S, 1, 10);
TinyTone(Note_b, 4, 400);
TinyTone(Note_S, 1, 10);
TinyTone(Note_A, 4, 800);
TinyTone(Note_S, 1, 10);
TinyTone(Note_GS, 4, 800);
TinyTone(Note_S, 1, 10);
TinyTone(Note_E, 4, 800);
TinyTone(Note_S, 1, 10);
TinyTone(Note_G, 4, 200);
TinyTone(Note_S, 1, 20);
TinyTone(Note_GS, 4, 400);
TinyTone(Note_S, 1, 10);
TinyTone(Note_FS, 4, 800);//XXX
TinyTone(Note_S, 1, 10);
TinyTone(Note_DS, 4, 800);
TinyTone(Note_S, 1, 10);
TinyTone(Note_F, 4, 200);
TinyTone(Note_S, 1, 10);
TinyTone(Note_B, 4, 1200);
TinyTone(Note_S, 1, 10);
TinyTone(Note_G, 4, 400);
TinyTone(Note_S, 1, 100);
TinyTone(Note_B, 4, 400);
}

Go Up