Σελίδα 1 από 3 1 2 3 ΤελευταίαΤελευταία
Εμφάνιση αποτελεσμάτων : 1 έως 10 από 24

Θέμα: Πρόβλημα με θόρυβο σε speaker συνδεδεμένο σε digital pin του Arduino

  1. #1
    Μέλος Το avatar του χρήστη nanobot
    Όνομα
    Χρήστος
    Εγγραφή
    Dec 2015
    Περιοχή
    Λαμία
    Μηνύματα
    41

    Προεπιλογή Πρόβλημα με θόρυβο σε speaker συνδεδεμένο σε digital pin του Arduino

    Καλησπέρα.

    Φτιάχνω ένα ψηφιακό ρολόι χρησιμοποιούντα Arduino Pro Mini.
    Στο πλακετάκι του arduino έχω συνδέσει ένα module με 4 ψηφιά LED και driver για τις ενδείξεις της ώρας και των λεπτών, ένα σπικεράκι μικρό κατευθείαν στο digital pin 7, ένα DS1307 AT24C32 Real Time Clock module και ένα UART TTL CP2102 module για να επικοινωνεί ο microcontroller με τον υπολογιστή που χρησιμοποιώ και σαν τροφοδοσία.

    breadbord1.jpg

    Το πρόβλημα είναι με το speaker, το όποιο βγάζει θόρυβο όπως μπορείτε να δείτε και στο video παρακάτω, που υποθέτω ότι είναι ίσως από τις πολλές καλωδιώσεις που έχει γύρο το breadboard και από τα πολλά διαφορά κυκλώματα που μοιράζονται το ίδιο ground και την ίδια τροφοδοσία.



    speaker2_fritzing.png
    Κώδικας:
    int piezoPin = 7;
    
    
    void setup() {
     
    }
     
    void loop() {
     
      /*Tone needs 2 arguments, but can take three
        1) Pin#
        2) Frequency - this is in hertz (cycles per second) which determines the pitch of the noise made
        3) Duration - how long teh tone plays
      */
      tone(piezoPin, 5000, 500);
      delay(1000);
     
    }

    Δοκίμασα να βάλω αντίσταση 100Ω αναμεσά στο ground και στο speaker και πυκνωτή φακή από λίγα nF μέχρι και ηλεκτρολυτικό 220uF παράλληλα στο speaker. Με την αντίσταση μειώνετε κάπως ο θόρυβος, αλλά μειώνετε και η ένταση του beep. Με τον 220 uF to speaker δεν ακούγετε σχεδόν καθόλου και με μικρότερες τιμές δεν παρατηρώ κάποια διαφορά.

    Να σημειώσω εδώ, ότι το Arduino σκέτο μόνο με το speaker συνδεδεμένο, δεν βγάζει κανένα θόρυβο.
    Μετρώντας την τάση με το digital pin που έχω το speaker στο LOW, παρατηρώ ότι είναι στα 0.20 με 0.24 vDC, που αυτό είναι και ο θόρυβος υποθέτω.

    pin_low_voltage.jpg

    Τι μπορώ να κάνω για να εξαλείψω τον θόρυβο; Όταν θα το φτιάξω σε κανονικό πλακετάκι εκτός breadboard και θα έχουν φύγει τα περισσότερα καλώδια, θα μειωθεί ο θόρυβος;

    0 Not allowed! Not allowed!
    There are two rules for success:
    1) Never tell everything you know.

    Workstation: Xeon E5-2620V3 X2 | Asus Z10PE-D8 WS | Samsung 32GB 2133MHz X2 | Samsung 950 Pro 512GB M.2 | Asus GTX1080 8GB | EVGA Supernova P2 PSU 1600W

  2. #2
    Μέλος Το avatar του χρήστη nanobot
    Όνομα
    Χρήστος
    Εγγραφή
    Dec 2015
    Περιοχή
    Λαμία
    Μηνύματα
    41

    Προεπιλογή

    Μετά από αρκετό ψάξιμο, βρήκα μια λύση μέσω software.

    Υπάρχει ένα library που είναι πολύ πιο ευέλικτο από το internal function tone() του Arduino και κάνει αυτό ακριβώς που θέλω και πλέον δεν υπάρχει καθόλου θόρυβος στο speaker.
    Με αυτό το library, το piezo speaker δεν χρησιμοποιεί καθόλου το ground, αλλά 2 συγκεκριμένα digital pins. Για Arduino UNO και Pro Mini, είναι τα digital pins 9 και 10.
    Το μόνο μειονέκτημα που έχει, είναι ότι δεν έχει internal delay και χρειάζεται να καλέσουμε την delay για να καθορίσουμε την διάρκεια του ηχητικού σήματος και στη συνέχεια να το μηδενίζουμε για να σταματήσει η αναπαραγωγή.

    Πρόκειται για το lib toneAC:

    http://playground.arduino.cc/Code/ToneAC

    Κώδικας:
    #include <toneAC.h>
     
    void setup() {} // Nothing to setup, just start playing!
     
    void loop() {
      for (unsigned long freq = 150; freq <= 15000; freq += 10){  
        toneAC(freq); // Play the frequency (150 Hz to 15 kHz).
        delay(1);     // Wait 1 ms so you can hear it.
      }
      toneAC(0); // Turn off toneAC, can also use noToneAC().
     
      while(1); // Stop.
    }

    0 Not allowed! Not allowed!
    There are two rules for success:
    1) Never tell everything you know.

    Workstation: Xeon E5-2620V3 X2 | Asus Z10PE-D8 WS | Samsung 32GB 2133MHz X2 | Samsung 950 Pro 512GB M.2 | Asus GTX1080 8GB | EVGA Supernova P2 PSU 1600W

  3. #3
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    Χωρίς βιβλιοθήκες, απλά και μόνο με μια συνάρτηση δύο μεταβλητών που μπορείς να καλείς όποτε θες (εκτός διακοπών) και που δεν καθυστερεί καθόλου, χρησιμοποίησε
    και δοκίμασε το παρακάτω:

    Κώδικας:
    *2
    void beepBuzzer(unsigned long hz, unsigned long ms) 
    { 
      unsigned long us = (750000 / hz);  
      unsigned long rep = (ms * 500L) / us; 
    
    
      for (int i = 0; i < rep; i++) 
      {  
        digitalWrite(BUZZER_PIN, HIGH);  
        delayMicroseconds(us);  
        digitalWrite(BUZZER_PIN, LOW);  
        delayMicroseconds(us);  
      }
    }
    Η unsigned long hz μεταβλητή καθορίζει τη συχνότητα του beep. Για να βρείς τη συχνότητα που ο buzzer σου συντονίζεται τέλεια και αποδίδει το μεγαλύτερο όγκο σε ένταση,
    πρέπει να βρείς την ιδιοσυχνότητα του αντηχείου του. Αυτό το κάνεις εύκολα με ένα μικρό κομμάτι κώδικα που θα δείς παρακάτω. Τα κλασσικά buzzers του τύπου

    102239705-40.jpg
    ...έχουν μια ιδιοσυχνότητα περί τα 6KHz.
    Η unsigned long ms καθορίζει το χρόνο που θα διαρκέσει το beep και εκφράζεται σε ms.
    Θα πρέπει να καθορίσεις επίσης το pin του μ/Ε που θα οδηγεί το buzzer. Μπορεί να είναι οποιοδήποτε γενικής χρήσης:

    Κώδικας:
    *1
    #define BUZZER_PIN   5 //Το digital pin D5
    pinMode(BUZZER_PIN, OUTPUT);
    digitalWrite(BUZZER_PIN,LOW);
    Παράδειγμα:

    Κώδικας:
    ...bla-bla-bla...
    
    beepBuzzer(6250,80);
    
    ...bla-bla-bla...
    Θα ακουστεί ένα beep διάρκειας (περίπου) 80ms (οι ακρίβειες εδώ είναι πολυτέλεια).

    Τώρα, για να καταλάβεις που συντονίζει καλύτερα ο buzzer σου, μπορείς να κάνεις ένα ανεξάρτητο σκετσάκι και με τη βοήθεια του σειριακού τερματικού
    να δείς ποιά περίπου συχνότητα χρειάζεσαι. Σου πρόσθεσα ένα μπουτόν (pin 6 και γή) που θα έχεις στο χέρι αν βαριέσαι να διαβάζεις που όταν το πατήσεις μόλις ακούσεις
    τον δυνατό ήχο που χρειάζεσαι θα πάρεις ένα μήνυμα στο terminal που θα λέει:
    "Your best fitting frequency is xxxx Hz. The program will be terminated here."

    Κώδικας:
    #include <Wire.h>
    
    
    #define BUZZER_PIN            5
    #define HIT_SWITCH           6
    //=======================================================================
    void setup() 
    {
      Serial.begin(9600); 
      pinMode(BUZZER_PIN, OUTPUT);  digitalWrite(BUZZER_PIN,LOW);
      pinMode(HIT_SWITCH, INPUT_PULLUP);
    }
    //=======================================================================
    void loop()
    {
      for(int i = 100; i<10000; i=i+100)//παραπάνω απο τα 10KHz δεν χρειάζεται, μόνο οι νυχτερίδες θα ακούνε το beep (απο τα 20KHz για να είμαστε ακριβείς).
      {
        beepBuzzer(i, 100);//Ο buzzer θα κάνει ένα beep διάρκειας 100ms σε αυξανούμενη συχνότητα των 100Hz
        Serial.print("FREQUENCY="); Serial.print(i); Serial.println("Hz"); Serial.println();
        if(digitalRead(HIT_SWITCH == LOW))
        {
          Serial.print("Your best fitting frequency is "); Serial.print(i); Serial.println("Hz"); 
          Serial.println();
          Serial.print("The program will be terminated here.");
          while(1);
        }
        delay(200);// καθυστέρηση για να προλαβαίνεις να σημειώνεις στο άκουσμα.
      }
    }
    //=======================================================================
    void beepBuzzer(unsigned long hz, unsigned long ms) 
    { 
      unsigned long us = (750000 / hz);  
      unsigned long rep = (ms * 500L) / us; 
    
    
    
    
      for (int i = 0; i < rep; i++) 
      {  
        digitalWrite(BUZZER_PIN, HIGH);  
        delayMicroseconds(us);  
        digitalWrite(BUZZER_PIN, LOW);  
        delayMicroseconds(us);  
      }
    }
    //=======================================================================

    3 Not allowed! Not allowed!

  4. 2 μέλη ευχαρίστησαν τον manolena για αυτό το χρήσιμο μήνυμα:

    finos (29-08-16), her (29-08-16)

  5. #4
    Μέλος Το avatar του χρήστη her
    Όνομα
    Ηρακλής
    Εγγραφή
    Jun 2007
    Περιοχή
    Αργυρούπολη
    Μηνύματα
    1.121

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από manolena Εμφάνιση μηνυμάτων
    Η unsigned long hz μεταβλητή καθορίζει τη συχνότητα του beep. Για να βρείς τη συχνότητα που ο buzzer σου συντονίζεται τέλεια και αποδίδει το μεγαλύτερο όγκο σε ένταση,
    πρέπει να βρείς την ιδιοσυχνότητα του αντηχείου του.
    Είσαι κορυφή ρε Μάνο. Όλο αυτό που έκανες εσύ σε 20 γραμμές κώδικα εγώ ΑΝ θα τα κατάφερνα θα το έκανα με 200! Και έχει μεγάλη σημασία αυτό.
    Αυτός ο βέλτιστος ήχος που μπορείς να ακούσεις θα είναι είναι ίδιος αν τον τροφοδοτήσεις με DC (χωρις καθόλου κώδικα) και όχι με AC;

    0 Not allowed! Not allowed!

  6. #5
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    To buzzer πρέπει να οδηγείται (σε τέτοιες κατασκευές) απο 5V μέσω transistor για καθαρό ήχο. Δεν βλέπω το νόημα για να οδηγηθεί απο AC.

    0 Not allowed! Not allowed!

  7. #6
    Μέλος Το avatar του χρήστη SProg
    Όνομα
    Σάββας
    Εγγραφή
    Mar 2014
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    2.612

    Προεπιλογή

    Αφου το συνδεεις στο D6 , στο κωδικα γιατι αρχικοποιεις το D7;

    0 Not allowed! Not allowed!

  8. #7
    Μέλος Το avatar του χρήστη her
    Όνομα
    Ηρακλής
    Εγγραφή
    Jun 2007
    Περιοχή
    Αργυρούπολη
    Μηνύματα
    1.121

    Προεπιλογή

    Μα με τον κώδικα που έχεις φτιάξει δεν παράγεις τετραγωνικούς παλμούς; έχει κάποια Hz. Δεν είναι DC που έχει 0Hz. Η ερώτηση μου είναι αν του προσφέρεις τάση 5V DC ο ήχος θα είναι διαφορετικός με σχέση τους τετραγωνικούς παλμούς; Δεν ξέρω αν στο εξήγησα καλά.

    0 Not allowed! Not allowed!

  9. #8
    Μέλος Το avatar του χρήστη SProg
    Όνομα
    Σάββας
    Εγγραφή
    Mar 2014
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    2.612

    Προεπιλογή

    Ηρακλη εχεις μπερδεψει τον ορο DC.

    Εαν δεν υπαρχει συχνοτητα,δεν θα ακουσεις κατι.

    Υ.Γ

    Επισης τι ρευμα τραβαει το I/0 χωρις αντισταση... 5V/Beep_resistor... αντε με την 50% κυματομορφη να παει στο μισο.Δες την αντισταση του.Δεν εχει σχεση με το προβλημα που σου παρουσιαζει απλα το αναφερω.

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη SProg : 29-08-16 στις 22:09

  10. #9
    Μέλος Το avatar του χρήστη manolena
    Όνομα
    Μάνος
    Εγγραφή
    Dec 2006
    Περιοχή
    Ελευσίνα
    Μηνύματα
    2.709

    Προεπιλογή

    Οπως τα λέει ο Σάββας. Εδώ λαμβάνουμε μια πάντα σταθερή στάθμη (5V DC) και την αναγκάζουμε να διακόπτεται και να επανέρχεται με κάποια συχνότητα. Αυτή η συνεχής διακοπή-αποκατάσταση της DC τάσης 5V, ακούγεται στα αυτιά μας σαν ήχος.

    0 Not allowed! Not allowed!

  11. #10
    Μέλος Το avatar του χρήστη her
    Όνομα
    Ηρακλής
    Εγγραφή
    Jun 2007
    Περιοχή
    Αργυρούπολη
    Μηνύματα
    1.121

    Προεπιλογή

    Σάββα μου δεν τον έχω μπερδέψει τον όρο. Μάλλον δεν το εξήγαγα καλά.
    Λέω τι διαφορά έχει στον ηχο αυτο :
    buzzercircuitreal.jpg

    με σχεση
    400px-Arduino_Sidekick_Music.jpg

    Παράθεση Αρχικό μήνυμα από manolena Εμφάνιση μηνυμάτων
    Εδώ λαμβάνουμε μια πάντα σταθερή στάθμη (5V DC) και την αναγκάζουμε να διακόπτεται και να επανέρχεται με κάποια συχνότητα.
    Συμφωνώ απόλυτα αλλά αν δεν την διακόπταμε και του δίναμε ΜΟΝΙΜΑ 5V;

    0 Not allowed! Not allowed!

Σελίδα 1 από 3 1 2 3 ΤελευταίαΤελευταία

Παρόμοια Θέματα

  1. digital clock - arduino
    By irenedur in forum Μικροελεγκτές
    Απαντήσεις: 181
    Τελευταίο Μήνυμα: 22-12-13, 18:49
  2. Digital Potensiometer on Arduino
    By arnestis in forum Μικροελεγκτές
    Απαντήσεις: 1
    Τελευταίο Μήνυμα: 05-11-13, 19:36
  3. Απαντήσεις: 6
    Τελευταίο Μήνυμα: 02-03-13, 20:08
  4. Απαντήσεις: 2
    Τελευταίο Μήνυμα: 02-09-12, 18:59
  5. επεξηγηση των pin του MIDI!
    By pit21 in forum Εξαρτήματα & Datasheets
    Απαντήσεις: 2
    Τελευταίο Μήνυμα: 18-03-08, 22:35

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας