Comment s'assurer que le Rx fonctionne correctement ?

Bonjour à tous !

Voilà plusieurs jours que je galère a essayer de trouver une solution à mon problème.. Mais je ne comprends toujours pas.

Je voudrais établir une liaison avec le protocole MIDI via la connexion série Rx. J'ai donc placé un optocoupleur, comme sur le schéma suivant :

Mais rien ne se passe. Quand j'envoie des signaux à la borne Rx, la led témoin de l'activité de la liaison reste éteinte et rien ne se passe dans le programme (j'ai bien réglé le taux de transfert à 31250 bauds). Cette led devrait s'allumer au moindre signal qu'il reçoit, non ?

J'ai bien testé indépendamment la sortie MIDI et l'optocoupleur, tout fonctionne correctement... Est-ce que le problème pourrait venir de l'arduino ? Ou bien j'aurais oublié un détail pour que ça fontionne ?

J'espère vous pourrez m'aider et que je puisse enfin avancer :stuck_out_tongue:

Bonjour,

Code ?
Tu émets depuis l'arduino ou tu reçoit ? J'ai pas tout compris ...

Petite précision : les LED sur arduino ms à part la LED sur le pin 13 sont raccordées au FT232 qui gère la gestion série avec le PC. Donc si pas d'interface avec le PC = pas de LED qui clignote

J'ai appliqué exactement ce qui se passe sur le premier schéma. J'envoie à partir de ma carte son (qui a une sortie MIDI) des octets à la borne Rx.

Voici un code d'exemple pour tester :

#include <MIDI.h>  // Add Midi Library

#define LED 13    // Arduino Board LED is on Pin 13

// Below is my function that will be called by the Midi Library
// when a MIDI NOTE ON message is received.
// It will be passed bytes for Channel, Pitch, and Velocity
void MyHandleNoteOn(byte channel, byte pitch, byte velocity) {
  digitalWrite(LED,HIGH);  //Turn LED on
  if (velocity == 0) {//A NOTE ON message with a velocity = Zero is actualy a NOTE OFF
    digitalWrite(LED,LOW);//Turn LED off
  }
}

void setup() {
  pinMode (LED, OUTPUT); // Set Arduino board pin 13 to output
  MIDI.begin(MIDI_CHANNEL_OMNI); // Initialize the Midi Library.
// OMNI sets it to listen to all channels.. MIDI.begin(2) would set it
// to respond to channel 2 notes only.
  MIDI.setHandleNoteOn(MyHandleNoteOn); // This is important!! This command
  // tells the Midi Library which function I want called when a Note ON command
  // is received. in this case it's "MyHandleNoteOn".
}

void loop() { // Main loop
  MIDI.read(); // Continually check what Midi Commands have been received.
}

La led 13 est sensée s'allumer à chaque fois que l'arduino reçoit un signal de note MIDI. Or il ne se passe rien et la led témoin de Rx ne réagit pas quand j'envoie les notes.. J'en déduis donc que l'arduino ne reçoit rien...
J'ai bien pris soin de débrancher le cable USB après le transfert du programme.

B@tto : ça veut dire que led led Tx et Rx ne sont pas raccordées aux bornes 0 et 1 de la UNO ?

Tu as bien croisé ton câble midi : Tx carte son -> Rx arduino ?

B@tto : ça veut dire que led led Tx et Rx ne sont pas raccordées aux bornes 0 et 1 de la UNO ?

Elles sont relié au chipset usb/série mais pas directement au port série, sinon ça poserai des problèmes d'ordre électrique.

Ah d'accord ! Donc je ne pouvais pas me fier de ces LED pour savoir si un signal passe dans la borne RX.

Oui oui, j'ai bien croisé le cable. J'ai essayé en inversant pour être sûr mais ça ne donne rien non plus :slight_smile:

Dans ce cas ça semble hardware. Photo ?

Je ne sais pas si ça aidera, je suis sûr et certain de mon câblage... :stuck_out_tongue:

Est-ce que mon code pour vérifier si l'entrée Rx est active est bon ?

int incomingByte = 0;   
int L1 = 7;

void setup() {
        Serial.begin(31250);     
}

void loop() {

        
        if (Serial.available() > 0) {
                /
             
                digitalWrite (L1, LOW);
        }
}

kevo:
Je ne sais pas si ça aidera, je suis sûr et certain de mon câblage... :stuck_out_tongue:

Et est tu sûr et certain de ton optocoupleur ? :wink:
Si ça ce trouve c'est lui qui est grillé ou juste pas de la bonne référence/câblage.

Sûr et certain, je l'ai testé indépendamment en mettant le collecteur du transistor sur une entrée logique de l'Arduino. Voici le schéma que j'ai fait pour tester :

Donc quand je ferme l'interrupteur, le courant passe dans la diode, donc le transistor devient passant et à ce moment là la broche de l'arduino détecte bien un 0 logique. Si je ne me trompe pas :grin:

Cet optocoupleur n'est pas le plus conseillé pour le transfert de signaux midi (vitesse limitée) mais j'ai cependant vu des gens qui s'en servaient et qui n'avaient pas de problème.

En passant,une petite question: l'optocoupleur étant cablé comme ça, le signal est normalement inversé.. Pourquoi est-ce qu'on l'inverse, au juste ?

J'ai découvert hier la bibliothèque SoftwareSerial qui permet d'utiliser n'importe quelle broche digitale pour la communication en série. Et ça fonctionne, l'arduino reçoit bien les signaux midi et je peux les exploiter. Ca prouve que mon câblage et mon optocoupleur fonctionnent correctement. :smiley:

J'en conclus donc que ma broche 0 a un sérieux souci... Quelle perte de temps -_-

Enfin merci à vous pour votre aide, je reviendrai pour d'autres problèmes :wink:

kevo:
J'en conclus donc que ma broche 0 a un sérieux souci... Quelle perte de temps -_-

Si tu relis D0 et D1 et que tu envois quelque chose dans le Serial Monitor est-ce que tu as un echo ?
C'est aussi peut être un problème du aux résistances qui relie l'ATmega et le chipset série/usb.
Et qui, sous certaines conditions, forment un pont diviseur de tension avec le montage relié sur D0/D1.

Un écho, c'est à dire ? Je dois aussi faire un Serial.read pour tester ?

kevo:
Un écho, c'est à dire ? Je dois aussi faire un Serial.read pour tester ?

Non tu envois un code bidon n'utilisant pas Serial comme "blink" par exemple puis tu envois du texte dans le serial monitor.
Avec D0 et D1 reliés tu devrais voir le texte s'afficher en retour dans le serial monitor.

Bonjour
Tu dis:

J'ai bien pris soin de débrancher le cable USB après le transfert du programme.
Mais, as-tu débranché la liaison entre l'optocoupleur et l'Arduino, c'est à dire le Rx pendant le transfert du sketch ?
Si non, tu as peut-être bloqué ton entrée Rx
çà m'est arrivé, et j'ai bien galéré ! (merci Skywodd )
Amicalement
Papyduino

skywodd:

kevo:
Un écho, c'est à dire ? Je dois aussi faire un Serial.read pour tester ?

Non tu envois un code bidon n'utilisant pas Serial comme "blink" par exemple puis tu envois du texte dans le serial monitor.
Avec D0 et D1 reliés tu devrais voir le texte s'afficher en retour dans le serial monitor.

Je ne comprends toujours pas.. :grin: Si Rx et Tx sont reliés, comment c'est possible de s'assurer que ça fonctionne sans Serial.read ?

PapyDuino:
Bonjour
Tu dis:

J'ai bien pris soin de débrancher le cable USB après le transfert du programme.
Mais, as-tu débranché la liaison entre l'optocoupleur et l'Arduino, c'est à dire le Rx pendant le transfert du sketch ?
Si non, tu as peut-être bloqué ton entrée Rx
çà m'est arrivé, et j'ai bien galéré ! (merci Skywodd )
Amicalement
Papyduino

Oui j'ai bien pris soin de faire ça aussi, je l'ai découvert quand une erreur s'affichait à la fin du transfert, j'ai tout de suite compris que c'était ça. Merci :wink:

kevo:
Je ne comprends toujours pas.. :grin: Si Rx et Tx sont reliés, comment c'est possible de s'assurer que ça fonctionne sans Serial.read ?

En envoyant un sketch bidon sans Serial.begin() le port série de l'arduino reste muet.
Donc quand tu envois quelque chose sur le serial monitor ça te revient en echo via le fils entre Rx et Tx (sans être altéré par un possible problème du port série de l'ATmega).
Le but c'est de tester la partie usb/série marche, pour la partie série à proprement parlé de l'ATmega c'est une autre histoire.
Maintenant que tu sait que l'usb n'est pas en cause il te faut chercher plus loin du côté ATmega en lui même.