Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Rédacteur

    PWM et Duty Cycle (répulseur de chat avec un ESP32-Arduino)
    Bonjour,

    Il m'est venu à l'idée d'essayer d'écrire un répulsif de chat avec mon ESP32 et un de mes Buzzer.
    Cela semble sortir de bonnes fréquences et j'ai essayé jusqu'à 24kHz.
    Pour les chats il faudrait quelque chose comme 19.5KHZ-24.5KHZ et éventuellement adapter le logiciel pour les fouines ou souris.

    Ayant déjà un certain âge, je n'entends plus vraiment les fréquences dépassant 17kHz.
    J'ai dans le jardin deux répulsifs de chats, je peux voir leurs spectres avec mon application Android Spectroid et aussi vérifier la sortie du buzzer.
    Encore une remarque: nos voisins ont 7 chats qui vivent dans le salon de leur villa. Imaginez les odeurs.
    Oui, je connais les soucis possibles pour ne pas gêner d'autres voisins et surtout leurs enfants.
    Je vais sans doute ajouter aussi un capteur de mouvements pour faire "joli" et propre.

    Encore une remarque sur mes deux répulsifs du commerce: un a une fréquence fixe (choisir la bête avec un régulateur) et l'autre bouge autour d'un rang de fréquences (sans doute un bon choix).

    Les instructions Arduino sont typiquement la fréquence:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    Serial.println("freq: 14000");
    ledcWriteTone(channel, 14000);

    et pour le Duty Cycle:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    ledcWrite(channel, dutyCycle);

    qui concerne ma question.
    J'ai utilisé la valeur de 127 pour la plupart de mes tests.

    En consultant https://en.wikipedia.org/wiki/Duty_cycle je n'arrive pas à savoir comment l'utiliser et si cela a un impact sur la fréquence.
    On dirait que pour certaines valeurs apparaissent alors d'autres fréquences, des diviseurs! Ou alors c'est une réaction du buzzer.
    Pour moi, le mieux serait d'avoir un signal propre, le plus fort possible et de faire varier la fréquence par logiciel et dans le rang désiré.

    Je ne suis pas encore arrivé à https://www.google.ch/imgres?imgurl=...mrc&uact=8

    Merci d'avance aux électroniciens!

  2. #2
    Responsable Arduino et Systèmes Embarqués

    Salut,

    C'est peut-être plus un problème de physique...

    Un son pur est une sinusoïde dans le domaine temporel, et en représentation fréquentielle tu as une harmonique fondamentale (une "raie") à la fréquence de la sinusoïde :


    Si tu analyses un signal carré, voilà le spectre obtenu :

    Avec un buzzer parfait, il y aurait des harmoniques impaires parasites (fréquences 3f, 5f, 7f, etc.) mais fortement atténuées. Compte-tenu de la réponse du buzzer, le son obtenu ressemble encore à un son pur.

    Maintenant avec un signal rectangulaire et un rapport cyclique petit :

    On s'éloigne du son pur

    Ce n'est donc pas tellement étonnant d'obtenir un son à peu près pur avec un signal carré (ou PWM avec rapport cyclique=50%)...

  3. #3
    Modérateur

    Alors là !

    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  4. #4
    Rédacteur

    Oui, ..., la réponse, ..., c'est la classe. Merci.

    Je viens d'essayer avec une fréquence de 500Hz.
    Il y a effectivement plein d'harmoniques et sans doute provenant du buzzer.
    C'est bien visible sur le graphique de mon application Android Spectroid.

    Par contre, le Duty Cycle avec 127 semble me donner plus de "puissance" sur le buzzer, qu'un 255.
    Mais ce n'est pas vrai. Android Noise Meter me donne 2 dB de plus.
    Ce 255 me montre plus d'harmonique sur Spectroid et dans les aigus.

    Je vais sans doute garder le 255, car un buzzer n'est pas très puissant à la base et je varierai la fréquence par logiciel.

    Si on met un Dutty Cycle de 1 ou 3, le son est évidemment trop faible et difficile d'identifier des harmoniques.

    C'est de la physique, c'est clair, mais pas si simple.
    Si Noise Meter me donne 50dB (il fait donc quelques calculs, mais pas pour les chats), cela ne peut servir à rien si le ou un des chats (il y en a un qui s'en fout ou est trop vieux) n'entend pas cette fréquence. Ma femme m'a proposé de mettre un haut-parleur car ces chats détestent MES Pchht!
    Un Pchht avec un buzzer, ou du mp3 sur un buzzer, il faudrait s'accrocher!

  5. #5
    Rédacteur

    Bonjour,

    Je ferme la discussion, cela marche bien.
    Ici du code rapidement bricolé ce matin sur un ESP32 où je viens d'y mettre un PIR:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    #include <WiFi.h>
    #include <HTTPClient.h>
     
    //13.5KHZ-19.5KHZ : Efficace pour repousser les animaux comme les souris, les rats, les chiens, les renards, les martres (belette) etc.
    //19.5KHZ-24.5KHZ : Efficace pour repousser les animaux tels que les chats, les ratons laveurs, les blaireaux, les mouffettes etc.
     
    int freq = 2000;
    int channel = 0;
    int pinPir = 13;
    int resolution = 8;
     
    const char* ssid = "...";
    const char* pwd  = "...";
     
    void setup() {
      Serial.begin(9600);
     
      Serial.print("Connexion à ");
      Serial.println(ssid);
      WiFi.begin(ssid, pwd);
      while (WiFi.status() != WL_CONNECTED) {
        delay(200);
        Serial.print(".");
      }
      //Montre l'adresse IP
      Serial.println("");
      Serial.println("WiFi connecté!");
      Serial.println("Adresse IP: ");
      Serial.println(WiFi.localIP());
     
      ledcSetup(channel, freq, resolution);
      ledcAttachPin(12, channel);
     
      pinMode(pinPir,INPUT);
    }
     
    void loop() { 
      bool isDetected = digitalRead(pinPir);
     
      if (isDetected){
        Serial.println("Présence detectée");
     
        HTTPClient Post;
        Post.begin("http://192.168.1.143:8001/beep"); 
        Post.addHeader("Chat", "text/plain");  
        Post.POST("");
     
        ledcWriteTone(channel, 14000); //14 kHz
        ledcWrite(channel, 255);
     
        delay(1000);
        ledcWriteTone(channel, 0);
      }
     
      delay(500);
    }


    Je n'entends pas le 14kHz émit par le buzzer (à mon âge) pendant 1 sec, quand je passe devant le PIR, mais je le vois sur mon application Android Spectroid.
    Sur un Raspberry Pi 4, j'ai écrit rapidement un serveur Web en Java (192.168.1.143 fixe dans mon routeur) et lancer au démarrage, pour recevoir le POST beep pour activer un "horrible" son sur le même type de buzzer sur le Pi, lors d'un passage quelconque devant le PIR de l'ESP32.
    Cela marche aussi sur mon PC (sans buzzer, mais un script Python de remplacement qui pourrait aussi bien jouer un fichier mp3): mais le Pi peut rester allumer .... sauf la nuit ... sinon ma femme .....

    Il me reste à mettre la chose dehors, sous abris, un délais entre la détection du PIR et la génération de l'ultrason .... pour me précipiter sans bruit à la fenêtre.
    Ensuite varier les fréquences, vérifier si le Web serveur répond (pour le prochain POST() (ping est difficile)), faire un peu plus pro, etc (mais pas détecter lequel des 7 chats de mon voisin, évidemment, ..., pour l'instant)!
    Je ne sais pas si j'arriverais à intégrer un capteur ultrasonique pour identifier si le chat s'enfuit effectivement!

    Je m'amuse vraiment et cela pourrait donner des idées.