Aller au contenu


Bacab

Inscrit(e) (le) 20 mai 2018
Déconnecté Dernière activité août 02 2020 05:34
-----

Sujets que j'ai initiés

Se débarasser d'un "HUM" sur un projet audio

24 avril 2020 - 06:49

Bonjour,

 

Je prépare pour faire une surprise à un ami une boîte à musique sur la base d'une Arduino Uno, d'un Shield Wave d'Adafruit (https://www.adafruit.com/product/94), d'un amplificateur (https://www.velleman...ts/view?id=9181) et d'un haut-parleur. Le tout est alimenté par une pile 9V.

 

Le principe est que lorsque mon ami appuiera sur un bouton, la boite jouera un morceau de musique ou un son qui a une signification particulière pour lui.

 

J'ai reçu, assemblé et testé le montage aujourd'hui et ça marche parfaitement à l'exception d'un "hum" audible même lorsque le shield n'envoie plus de musique à l'amplificateur. J'ai analysé le spectre du "hum" en question et voila ces caractéristiques :

Fichier joint  spectro.png   13,09 Ko   9 téléchargement(s)

On a donc des raies à :

- 172.5 Hz (3x57.5 Hz)

- 345 Hz (6x57.5 Hz)

- 517.5 Hz (9x57.5 Hz)

- 690 Hz (12x57.5 Hz)

je pense que vous voyez la logique.

 

Je suppose que le 57.5 Hz provient du réseau électrique : ais-je raison ou tord ?

Si oui comment puis-je protéger mon circuit (mes premiers essais avec de l'alu semblent améliorer la situation mais c'est pas Byzance) ?

 

Je vous remercie par avance pour vos réponses, conseils...


Problème avec un multiplexeur analogique et l'ADC de l'Arduino

25 janvier 2020 - 12:54

Bonjour,

 

Il y a quelques temps j'ai finis de fabriquer une "boîte à boutons" que je souhaiterais utiliser avec mes simulateurs d'avions sur mon ordinateur. La boîte comporte 16 boutons et 6 axes. Grâce au projet Unojoy j'ai pu reprogrammer mon Arduino pour la faire reconnaître comme un joystick par mon ordinateur et cela fonctionne très bien.

 

Fichier joint  DSC_0032.JPG   95,42 Ko   17 téléchargement(s)

 

Pour avoir 16 entrées numériques et 6 entrées analogiques j'ai utilisé un shield DFRobot qui utilise un multiplexeur géré par I2C. Par conséquent 2 entrées analogiques (A4 et A5 si je ne dis pas de bêtise) ne sont pas accessible et j'ai ajouté un multiplexeur analogique CD4051B pour quand même avoir mes six axes. L'entrée A1 de l'Arduino est donc toujours celle qui est lue. Comme les potentiomètres sont des 100k linéaires (erreur de ma part à la commande) j'ai mis 2 lectures consécutives de l'ADC et je ne garde que la seconde pour laisser le temps au condensateur de l'ADC de se charger (à ma connaissance il n'est pas possible de ralentir l'ADC de l'Arduino au delà de la valeur par défaut puisque le prescaler a 128 pour valeurs max.).

 

Je rencontre néanmoins un problème lorsque certains axes sont dans certaines positions. J'ai remarqué que si je mets un des axes à sa position maximum (1023 sur l'ADC) un autre axe se met à contrôler tous les axes en même temps. Autre bizarrerie : si je mets tous les axes à ~50% les lectures deviennent complètement erratiques (variation des valeurs lues très rapide entre 0 et 1023).

 

J'ai, en premier lieu, suspecté un court-circuit mais je ne le trouve pas. Est-ce qu'il y a une autre piste à explorer ?

 

Je vous remercie par avance pour votre aide.

 

Le code :

#include <clsPCA9555.h>
#include "UnoJoy.h"

int time_delay = 10;
int i = 0;
int prev_value[6] = {128,128,128,128,128,128};
PCA9555 ioport(0x20);

void setup()
{
  setupPins();
  setupUnoJoy();
}

void loop()
{
  delay(time_delay);
  // Always be getting fresh data
  dataForController_t controllerData = getControllerData(i, prev_value);
  prev_value[0] = controllerData.x_axis;
  prev_value[1] = controllerData.y_axis;
  prev_value[2] = controllerData.z_axis;
  prev_value[3] = controllerData.r_x_axis;
  prev_value[4] = controllerData.r_y_axis;
  prev_value[5] = controllerData.r_z_axis;
  setControllerData(controllerData);
  
  i++;
  if(i==6)
  {
    i=0;
  }
}

void setupPins(void)
{
  ioport.begin();
  ioport.pinMode(ED0, INPUT);
  ioport.pinMode(ED1, INPUT);
  ioport.pinMode(ED2, INPUT);
  ioport.pinMode(ED3, INPUT);
  ioport.pinMode(ED4, INPUT);
  ioport.pinMode(ED5, INPUT);
  ioport.pinMode(ED6, INPUT);
  ioport.pinMode(ED7, INPUT);
  ioport.pinMode(ED8, INPUT);
  ioport.pinMode(ED9, INPUT);
  ioport.pinMode(ED10, INPUT);
  ioport.pinMode(ED11, INPUT);
  ioport.pinMode(ED12, INPUT);
  ioport.pinMode(ED13, INPUT);
  ioport.pinMode(ED14, INPUT);
  ioport.pinMode(ED15, INPUT);
  pinMode(A0, OUTPUT);
  pinMode(A1, INPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
}

dataForController_t getControllerData(int axis_to_read, int* data_to_save)
{
  dataForController_t controllerData = getBlankDataForController();
  controllerData.x_axis   = data_to_save[0];
  controllerData.y_axis   = data_to_save[1];
  controllerData.z_axis   = data_to_save[2];
  controllerData.r_x_axis = data_to_save[3];
  controllerData.r_y_axis = data_to_save[4];
  controllerData.r_z_axis = data_to_save[5];
  switch(axis_to_read)
  {
    case(0):
      // cas 0 = 000
      digitalWrite(A0, LOW);
      digitalWrite(A2, LOW);
      digitalWrite(A3, LOW);
      analogRead(A1);
      controllerData.x_axis = analogRead(A1)>>2;
      break;
    case(1):  
      // cas 1 = 001
      digitalWrite(A0, HIGH);
      digitalWrite(A2, LOW);
      digitalWrite(A3, LOW);
      analogRead(A1);
      controllerData.y_axis = analogRead(A1)>>2;
      break;
    case(2):
      // cas 2 = 010
      digitalWrite(A0, LOW);
      digitalWrite(A2, HIGH);
      digitalWrite(A3, LOW);
      analogRead(A1);
      controllerData.z_axis = analogRead(A1)>>2;
      break;
    case(3):
    // cas 4 = 100
      digitalWrite(A0, LOW);
      digitalWrite(A2, LOW);
      digitalWrite(A3, HIGH);
      analogRead(A1);
      controllerData.r_x_axis = analogRead(A1)>>2;
      break;
    case(4):
      // cas 5 = 101
      digitalWrite(A0, HIGH);
      digitalWrite(A2, LOW);
      digitalWrite(A3, HIGH);
      analogRead(A1);
      controllerData.r_y_axis = analogRead(A1)>>2;
      break;
    case(5):
      // cas 7 = 111
      digitalWrite(A0, HIGH);
      digitalWrite(A2, HIGH);
      digitalWrite(A3, HIGH);
      analogRead(A1);
      controllerData.r_z_axis = analogRead(A1)>>2;
      break;
  }
  
  controllerData.btn_01 = !ioport.digitalRead(ED0);
  controllerData.btn_02 = !ioport.digitalRead(ED1);
  controllerData.btn_03 = !ioport.digitalRead(ED2);
  controllerData.btn_04 = !ioport.digitalRead(ED3);
  controllerData.btn_05 = !ioport.digitalRead(ED4);
  controllerData.btn_06 = !ioport.digitalRead(ED5);
  controllerData.btn_07 = !ioport.digitalRead(ED6);
  controllerData.btn_08 = !ioport.digitalRead(ED7);
  controllerData.btn_09 = !ioport.digitalRead(ED8);
  controllerData.btn_10 = !ioport.digitalRead(ED9);
  controllerData.btn_11 = !ioport.digitalRead(ED10);
  controllerData.btn_12 = !ioport.digitalRead(ED11);
  controllerData.btn_13 = !ioport.digitalRead(ED12);
  controllerData.btn_14 = !ioport.digitalRead(ED13);
  controllerData.btn_15 = !ioport.digitalRead(ED14);
  controllerData.btn_16 = !ioport.digitalRead(ED15);
  
  return controllerData;
}

Le schéma du montage (je n'ai mis que la partie analogique) :

Fichier joint  schema_electrique.JPG   87,65 Ko   20 téléchargement(s)

 

Contrairement à ce qui est affiché sur le schéma c'est bien un CD4051 que j'utilise (pas trouvé de schéma pour Spice donc j'ai mis un circuit équivalent). Le voltmètre avec la résistance d'un Meg en parallèle représente l'ADC de l'Arduino Uno.


Comment utiliser une pince à sertir

25 août 2019 - 04:00

Tout est dans le titre j'en ai peur : j'ai acheté une pince à sertir pour réaliser mes propres câbles et je n'arrive pas à m'en servir. Mes connecteurs sont de ce type :

Fichier joint  DSC_0105.JPG   46,24 Ko   27 téléchargement(s)

Et j'essaye de les attacher à un fil avec ça :

Fichier joint  DSC_0107.JPG   39,46 Ko   28 téléchargement(s)

Comment suis-je censé faire ? J'ai essayé de juste positionner le fil dans le connecteur et de serrer mais la pince ne replie pas les espèces d'ailes qui se trouvent au bout du connecteur (qui tombe donc).


Besoin d'explications sur un circuit (pré-amplificateur audio)

14 avril 2019 - 02:30

Bonjour,

 

Dans le cadre du projet dont je parlais ici j'ai décidé d'utiliser le pré-amplificateur suivant : https://www.velleman...s/view/?id=8897

Comme je le disais dans mon précédent topic je ne connais pas bien les caractéristiques du circuit. J'ai donc décidé de le modéliser avec Eagle pour connaître ces caractéristiques. Voici le schéma que j'obtiens :

Fichier joint  circuit_preamp.PNG   228,48 Ko   39 téléchargement(s)

 

Si je comprends bien le circuit (ce qui n'est pas garanti n'hésitez pas à me le dire si vous voyez une erreur) :

- le premier AOP est monté comme un filtre passe haut inverseur de gain unitaire, Fc=0.16Hz;

- le second AOP est monté comme un un filtre passe haut inverseur de gain R8/R7 (sur le véritable circuit R8 est variable mais pour la simulation je l'ai remplacé par une résistance fixe) et Fc=16Hz;

- le filtre RC formé par C5 et R4 est un passe haut qui filtre la composante continue en sortie de l'amplificateur (probablement pour se débarrasser d'un biais DC ajouté par l'AOP ?);

 

En revanche je n'ai aucune explication pour la présence de R5 (limiteur de courant ?) et le montage de C4 et R2, pouvez vous m'expliquer ?

 

Par avance merci pour vos réponses.


Besoins de conseils : construction d'un enregistreur sous-marin

13 janvier 2019 - 02:09

Bonjour à tous et à toutes !

 

Avant de travailler sur mon sous-marin j'ai réalisé un hydrophone à base d'un disque piézo-électrique et d'un pré-amplificateur. Il marche bien mais je voudrais pousser un peu le concept et enregistrer plutôt qu'écouter en direct. Pour se faire je pense acquérir une carte Adafruit et la connecter à une Arduino (en suivant ce tutoriel).

 

Cependant, et c'est la que j'aurais besoin de vos conseils avisés, il y a assez peu d'information dans la datasheetdu codec sur la chaîne d'enregistrement :  de ce que je comprends il n'y a aucun filtre antialiasing intégré, ni de filtre passe-haut pour supprimer la composante continue. Il n'y a pas non plus de protection contre les surtensions.

Trois solutions s'offrent donc à moi :

  1. La solution des riches : j'ajoute un pré-ampli INA217avec un filtre passe bas (comme celui-ci), mais il faut faire un circuit à part, et je branche le résultat sur l'entrée ligne ;
  2. La solution de l'inconnu : j'utilise mon pré-ampli mais j'ignore ses caractéristiques détaillées (si ça se trouve il est moins bien que celui intégré dans le CODEC) et je connecte la sortie à l'entrée ligne;
  3. Je branche directement l'hydrophone sur l'entrée MIC IN en suivant les conseils de branchements de la datasheets et qui vivra verra;

Par ailleurs : comment je passe d'une tension alternative (et donc avec des valeurs négatives) à une tension purement positive comme celle que l'entrée ligne accepte ?

 

Je vous remercie par avance pour vos réponses.