recherche electronicien pour création protorype

Portrait de neonavy

Bonjour,
Je n'ai aucune notion d'électronique aussi je recherche quelqu'un pour m'aider à réaliser un projet:
créer une carte permettant de lire des fichier audio (MP3 ou WAV) au "front montant" d'un signal d'entrée.
Par exemple: lorsque je coupe une barrière infrarouge ça lance la lecture d'une musique (et cette musique ne pourra être relue que sur une nouveau front montant à condition qu'elle ne soit pas déjà en train d'être lut).
Est ce que quelqu'un pourrait réaliser ce projet et si oui à quel tarif?
Merci d'avance.
cordialement,
Jean

Portrait de Chantale0

C'est relativement simple avec un module Arduino, un Shield audio une SD Card sur laquelle est enregistrée ta musique mp3 par exemple quelques fils, un chargeur de smartphone et un câble usb

Voir ici

https://fr.aliexpress.com/item/32782488336.html?spm=a2g0o.productlist.0....

Regarde la vidéo démo,  l'ensemble doit revenir entre 15 et 20 € je n'est pas fait le calcul.

La tablette peut avantageusement être remplacée par un PC.

Portrait de neonavy

SUPER, c'est (je crois) exactement ce qu'il me fallait!!! :-)

Par contre, je ne sais pas comment l'associer avec une carte Arduino (j'imagine qu'il y a un programme à mettre dans la carte Arduino, et un schéma de câblage... C'est fournit avec la carte?).

Portrait de Chantale0

Ne vous inquiétez pas je vais vous aider point par point !

Dans un premier temps il vous faut commander chez Aliexpress :

Carte Arduino UNO + Câble USB
https://fr.aliexpress.com/item/32831857482.html?spm=a2g0o.productlist.0....

Carte Arduino Audio
https://fr.aliexpress.com/item/32782488336.html?spm=a2g0o.productlist.0....

Fils Arduino Connecteurs Dupond
https://fr.aliexpress.com/item/32825083543.html?spm=a2g0o.productlist.0....

Chargeur USB
https://fr.aliexpress.com/item/4000459408990.html?spm=a2g0o.productlist....

Une carte mini SD Card si tu n'en possèdes pas déjà une !
https://fr.aliexpress.com/item/1005002352755236.html?spm=a2g0o.productli...

Comme la livraison prend une quinzaine de jour tu peux commencer à télécharger le programme
Arduino IDE et l'installer avec une aide ICI

Voilà, tu as déjà du boulot pour une première étape !

Tu peux aussi regarder d'autres vidéos pour comprendre le fonctionnement des modules Arduino

La suite au prochain épisode.

N.B: Pourrais tu me donner l'utilisation finale de ce montage ? (Circuit de train au passage à niveau ?)

Portrait de neonavy

La finalité d'utilisation est purement "geek"!!! :-)

En fait, je vais aménager un bureau à l'étage de ma maison, je compte y mettre une porte coulissante (une "porte à galandage" actionné par vérin pneumatique) peinte aux couleurs des portes de la série Star Trek NG et je compte y associer les bruits de la série (le bruit de la "sonnette" actionné par détecteur infrarouge, et le bruit de l'ouverture actionné par contact à galet à l'ouverture/fermeture de la porte).

Pour info: je suis automaticien (mais je n'ai encore jamais eu à travailler avec Arduino) :-)

Portrait de Chantale0

Puis que tu es automaticien tu vas comprendre rapidement comment fonctionne une carte arduino.

Tout d'abord il faut savoir quelle est construite autour d'un microcontroleur de divers type selon la carte choisie. Le soft Arduino IDE permet de programmer rapidement ce composant en langage évolué, ici le "C".

Les cartes comportent entre autre des pins numérotées 0 a 13 pour le UNO et 0 a 53 pour les Mega par exemple. Ces pins peuvent être déclarée en début de code comme des entrées ou des sorties, voire même en liaisons série pour certaines. Il existe encore des pins de A0 à A5 dans les cas le plus général qui sont des entrées analogiques (1024 points pour 0-5V voir une autre tension inférieure à 5 volts qui doit être soumise à l'entrée Vref ) 

Le code se compose de 3 grands pavés.

Tout en haut du code c'est la zone réservée aux déclarations. On défini ici les bibliothèques utilisées dans le code ( ceux sont des routines pré-écrites ) , puis les variables globales utilisées. (ce n'est pas exhaustif !)

Le deuxième pavé (le setup) encadré par "void setup() { et }" sert à paramètrer entre autre les pins en entrées ou en sorties, la vitesse du ou des ports série voire des objets utilisés par les "library" ( bibliothèques ). On peut aussi définir entre autre le niveau initial des sorties à l'état haut ou bas selon les besoins du programme. (ce n'est pas exhaustif !)

C'est deux premier pavé sont exécutés une seule fois au démarrage du code.

Le troisième pavé est une boucle infinie encadré par " void loop() { et  }"

C'est là en général que l'on écrit le code qui comme dans toute boucle se répète à la fin du code si rien ne l'interdit dans le code lui même.

On peux aussi utiliser des fonctions qui peuvent être appelées dans le loop() ou même dans d'autres fonctions elles mêmes !

Ces fonctions sont encadrées par "void MaFonction() { et }" par exemple puis appelée par la commande MaFonction()

La première partie de la définition des ces fonctions ici void défini le retour ces  fonctions

void pour aucun retour seul les variables globales peuvent être modifiées ainsi que les sorties.

int, char, string ... par exemple pour le retour d'un entier d'un caractère ou d'une chaîne.

Il est aussi possible de passer des variables entre parenthèses : void MaFonction( int (x), char( y ), String(Ma Chaine)). ( non exhaustif ) 

Voilà pour une explication rapide du principe de codage d'un programme.

En espérant d'avoir été la plus claire possible et sans trop d'erreurs !

Portrait de neonavy

Ca c'est de l'info riche et utile, MERCI BEAUCOUP!!!

Je n'ai jamais programmé en C (je suis surtout habitué au CONT/GRAPH), mais vos termes ne me sont effectivement pas inconnu pour autant :-)

" Tout en haut du code c'est la zone réservée aux déclarations. On défini ici les bibliothèques utilisées dans le code ( ceux sont des routines pré-écrites ) , puis les variables globales utilisées. (ce n'est pas exhaustif !) " => concrètement, sous quel format (de quelle manière? quel langage?) on défini cela?

" Le deuxième pavé (le setup) encadré par "void setup() { et }" sert à paramètrer entre autre les pins en entrées ou en sorties, la vitesse du ou des ports série voire des objets utilisés par les "library" ( bibliothèques ). On peut aussi définir entre autre le niveau initial des sorties à l'état haut ou bas selon les besoins du programme. (ce n'est pas exhaustif !) " => je croyais que le paramétrage des pins se faisait dans les déclarations?! Comment savoir de quelle librairie j'ai besoin?

" On peux aussi utiliser des fonctions qui peuvent être appelées dans le loop() ou même dans d'autres fonctions elles mêmes ! " => où déclare-t-on ces fonctions? dans la première partie?

" La première partie de la définition des ces fonctions ici void défini le retour ces  fonctions

void pour aucun retour seul les variables globales peuvent être modifiées ainsi que les sorties.

int, char, string ... par exemple pour le retour d'un entier d'un caractère ou d'une chaîne.

Il est aussi possible de passer des variables entre parenthèses : void MaFonction( int (x), char( y ), String(Ma Chaine)). " => désolé je n'ai pas comprit, avez vous un exemple?

Merci encore pour votre aide et vos explications.

Portrait de neonavy

que pensez vous de cette carte (qui me passerait de programmation si j'ai bien comprit):

https://fr.aliexpress.com/item/33015987040.html?spm=a2g0o.pay_result.pcr...

Portrait de Chantale0

Je ne connaissais pas cette carte, il faut savoir qu'il y en a énormément et il s'en crée très régulièrement, elle peu vous convenir effectivement mais ne la connaissant pas je ne saurai vous aider.

Portrait de Chantale0

Voici un exemple qui n'a pas vraiment d'intérêt électronique mais c'est pour vous faire comprendre :

On fait clignoter une Led sur la pin 13 toutes les secondes

#include <Arduino.h> /* Importation de la library elle est ici inutile
                        mais c'est pour l'exemple */
int PinLed = 13; /* Une led est raccordée entre la pin 13 et la masse
                 mais en utilisant une variable c'est plus pratique pour la suite */
int OnOff = 8 ;  // Un inter Marche/Arrêt est branché entre 8 et la masse
void setup() {
  Serial.begin(115200); // Ouverture du  port série à 115200 bauds
  pinMode(PinLed, OUTPUT); // Paramêtrage le la PinLed (pin 13) en sortie
  pinMode(OnOff , INPUT_PULLUP); /* Paramêtrage le la OnOff (pin 8) en entrée
  '_PULLUP'signifie au processeur de mettre virtuellement une résistance de rappel à l'état Haut*/
}

void loop() {
  if (digitalRead(OnOff) == LOW) { // si l'interrupeur est fermé donc la pin 8 passe à l'état bas
    ChangeEtatLed(); // Exécution ChangeEtatLed()
    delay(500); // Temporisation de 50 millisecondes
  }
  else { // sinon on arrête le clignotement et on étent la Led
    digitalWrite(PinLed, LOW); // On force PinLed à l'état bas
  }
} // Retour au début de la boucle loop()

void ChangeEtatLed() { // Définition de la fonction ChangeEtatLed()
  String Etat; // Déclaration d'une variable Etat en chaîne de caractères

  if (digitalRead(PinLed) == LOW) { // Si le port PinLed est à l'état bas
    Etat = "Eteinte"; /* On attribue la valeur 'Eteinte' à la
                     variable locale Etat */
  } // fin de la condition si
  else { // Sinon
    Etat  = "Allumee"; // on lui attribue la valeur 'Allumée'
  } // fin de la condition sinon
  digitalWrite(PinLed, !digitalRead(PinLed)); /* On attribue à la sortie PinLed
                    valeur inverse de celle qu'on litle '!' signifie inverse */
  Serial.println("La led est a l'état" + Etat); /*On ecrit sur le port série
                le texte entre guillemets + le contenu de la variable Etat*/
} /* Fin de la fonction ChangeEtatLed() et retour à la ligne juste en dessous
     de 'ChangeEtatLed();' dans le loop()*/

Portrait de neonavy

Ok, parfait, merci, cette exemple est déjà plus clair pour moi mais j'ai d'autres questions du coup!

"  #include <Arduino.h> /* Importation de la library elle est ici inutile mais c'est pour l'exemple */ "
=> comment savoir quelle librairie choisir pour mon besoin? pour charger une librairie il faut bien qu'elle soit dans la même mémoire?! Je peux comprendre qu'elle soit stockée dans le même répertoire que le programme et soit utulisé pour compiler le programme, mais une fois compilé pourquoi le programme appel encore la librairie (d'autant qu'elle n'est pas stockée dans la mémoire de l'Arduino)?

"Serial.begin(115200); // Ouverture du  port série à 115200 bauds"
=> pourquoi (pour cet exemple) ouvrir le port de communication? Ouvrir le port de communication ne dit pas comment l'utiliser (pour mon besoin).

" '_PULLUP'signifie au processeur de mettre virtuellement une résistance de rappel à l'état Haut*/"
=> vous voulez dire une "temporisation à la retombée"?

" if (digitalRead(OnOff) == LOW) { // si l'interrupeur est fermé donc la pin 8 passe à l'état bas "
=> pour moi un "interrupteur fermé" alimente l'entrée (et donc l'entrée passe à 1)?!...

" ChangeEtatLed(); // Exécution ChangeEtatLed() "
=> on utilise la fonction "avant" de l'avoir déclarée?!

" digitalWrite(PinLed, !digitalRead(PinLed)); /* On attribue à la sortie PinLed valeur inverse de celle qu'on litle '!' signifie inverse */ "
=> si on attribue à une sortie l'inverse de son état ne risque-t-on pas d'avoir juste un sintillement continu (à la fréquence de lecture de la boucle)?!

" Serial.println("La led est à l'état" + Etat); /*On ecrit sur le port série le texte entre guillemets + le contenu de la variable Etat*/ "
=> je comprends bien qu'on envoie du texte sur la sortie série mais sans déclaré quel est le type d'élément auquel est envoyé cette information, comment s'assurer qu'elle sera lut/compris correctement (donc que le format d'émission de l'information est le bon... j'imagine que l'envoie de cette information vers un afficheur ne se fera pas de la même manière que vers une autre carte Arduino)?

Portrait de Walter

Bonjour,

les instructions précédé d'un # sont des directives de compilations.
Cela veut dire que le compilateur (le linker en l'ocurence) va inclure le code de ta librairie dans ton programme compilé (binaire).
Lors de l'installation de l'IDE arduino, cela t'a installé le compilateur et un certain nombre de librairie de base.
L'IDE d'arduino te permet d'ajouter d'autre librairie produite par la communauté.

Pour savoir les librairies que tu as besoin, cela dépend des composants que tu va utiliser avec ton arduino.
Là sur la page du vendeur il ne l'indique pas, mais dans la vidéo il utilise une librairie "redmp3" qui se charge d'envoyer les commandes correspondant aux actions demandées(play, pause, nextSong) via le port série.
Tu peux aussi comme tu l'indique envoyé toi même les commandes sur le port série, mais c'est moins pratique qu'une librairie dédiée.
Il est possible via la librairie "SoftwareSerial.h" d'utiliser d'autre broche que celle prévus sur arduino, afin de garder celle-ci pour envoyer des informations de debug à la console série fournis avec l'IDE arduino, lorsque l'arduino est connecté par l'usb a ton PC.
C'est ce que fait d'ailleurs la librairie "redmp3".

Voila pour tes questions générales, je laisse Chantale0 décrire son code.

Portrait de Chantale0

Tu voulais un exemple, dans un exemple il n'y a pas toutes les fonctions ! je t'ai expliqué comment écrire un programme. Ce programme est loin d'être le plus concis ! comme ceci :

*******************************************************************

void setup() {
  pinMode(13, OUTPUT);
  pinMode(8, INPUT_PULLUP);
}
void loop() {
  if (digitalRead(8) == LOW) {
    digitalWrite(13, !digitalRead(13));
    delay(500);
  }
  else
    digitalRead(13) == LOW;
}

*******************************************************************

Pour en revenir à mon exemple :

Serial.begin(xxxx); on ouvre port comme à la vitesse xxxx.
Pour écrire sur ce port on utilise Serial.print("Mon Texte")
Pour lire des données  on utilise String Donnee  = Serial.readString() (non exhaustif )

Le complément "_PULLUP" de INPUT est utilisé pour forcer cette entrée à l'état haut si aucune tension n'est appliquée sur cette entrée cette dernière est  sinon libre de potentiel et peut prendre n'importe que valeur selon les rayonnements.

if (digitalRead(OnOff) == LOW) {  : relit les commentaires, l'interrupteur est entre l'entrée et la masse !!!!!!

digitalWrite(PinLed, !digitalRead(PinLed)); L'instruction ne s'exécute qu'une seule fois.

Serial.println("La led est à l'état" + Etat);  OU  Serial.println(2000);  sans distinction de type de donnée. Par contre sur la même ligne de commande on ne peut pas mélanger les types de données. Ceux sont soit des String ou variable String, ou char ou int ou long ou double ou etc... D'ailleurs c'est vrai pour tous les langages de programmation que je connais C, windev, python, visual basic, access, VBA etc... Une autre solution pour concaténer des données il faut toutes les convertir en chaîne ! On ne défini pas ici le ni nombre de bit de donnée, ni la parité, ni le nombre de bit de stop ni autre, c'est le compilateur qui détermine le type standard le plus courant.

Pour envoyer plusieurs type sur la même ligne :

Serial.print("Montant de la cotisation : ");
Serial.print("110.55");
Serial.println(" €"); // ici on utilise println et non print pour changer de ligne à la fin de l'instruction.

Pour finir ceci n'est pas un tuto mais un principe général. !!!!

Pour plus d'explication https://www.locoduino.org/ là c'est un tuto ! Ou encore sur ce site

http://les-electroniciens.com/videos?page=3

Les langages à Contact ou Grafcet utilisés sur les automates Télémécanique, April, Siemens ou autres sont conçu pour les éléctro-mécaniciens et non des électroniciens, ces langages simulent des matériels éléctromécaniques ou fonctionnant comme tel, ici ceux sont des composants électroniques avec des impédances très élevées !!!!!!!! Donc n'importe quel champs magnétiques peut engendrer de valeur illusoires !

Ici c'est de la programmation pas du schéma électomécanique.

Tiens encore plus concis

void setup() {  pinMode(13, OUTPUT); pinMode(8, INPUT_PULLUP);}void loop() {  if (digitalRead(8) == LOW) {digitalWrite(13, !digitalRead(13));delay(500); }else    digitalRead(13) == LOW;}

Portrait de neonavy

Bonjour,

Désolé du retard de ma réponse mais mon travail me laisse peu de temps (mise en service de machines à l'international), je suis en déplacement jusqu'en Octobre, je reprendrai cette échange à mon retour (j'aurai reçut les cartes d'ici là ce qui nous permettra de progresser).

Merci encore de votre aide.