liaison série usb sur différents modèles

Bonjour,

je travaille actuellement sur une gestion de sonneriee de clochee avec un raspberry pilotant un aduino uno.
J’avais un vieux modèle R3 qui doit dater de 6 ans peut-être et que je traîne avec moi !
Tout marche bien, la liaison avec phpserial se fait sans problème.
J'ai acheté une nouvelle carte et là, la connexion se fait bien mais visiblement les caractères ne sont pas reconnus.

Y a-t-il une nouveauté de ce côté, soit sur le codage à envoyer soit sur le décodage en réception ?

Merci
Gérard

ma boule de cristal est cassée....

clarifiez: qui envoie quoi et comment à qui ? un peu de code aiderait aussi... (avec les balises)

Bonjour,

c’est vrai j’aurais dû être plus précis.
J’ai un programme en php sur un raspberry qui depuis un calendrier génère des programmes de sonnerie de cloches : 3 cloches en volée et 3 marteaux pour les tintements. Suivant les heures et les jours, il y a pas mal de combinaisons utilisées.
Le raspberry envoi sur la carte arduino, via le port usb, un code de 3 caractères qui commandera les cloches voulues au travers d’optocoupleurs. J’utilise pour cela phpSerial qu’on trouve par exemple ici PHP-Serial.
mes paramètres d'envoi sur le raspberry sont :
$code étant la variable récupérée en GET

    $serial->deviceSet(/dev/ttyACM0);
    $serial->confBaudRate(9600);
    $serial->confParity("none");
    $serial->confCharacterLength(8);
    $serial->confStopBits(1);
    $serial->deviceOpen();
    sleep(2); //Unfortunately this is nessesary, arduino requires a 2 second delay in order to receive the message
    $serial->sendMessage($code);
    $serial->deviceClose();

Cela marche très bien sur ma vieille carte arduino et cela ne marche pas sur la nouvelle… La connexion se fait bien mais pas d'action.
Y aurait-il un changement sur le "mode de transmission", ce phpserial datant de 2014 ?
Merci

le chip interface usb >> mega328 entre cartes uno ancienne et nouvelle est sans doute différent ?
je ne sais pas si çà joue un role

La connexion se fait bien mais pas d'action.

La connexion ? Tu veux parler de l'ouverture du port, c'est çà dire $serial->deviceOpen(); ?

Un truc me titille quand même :

    $serial->deviceSet(/dev/ttyACM0);

Quand je connecte une UNO récente sur un port USB je vois plutôt un /dev/ttyUSBX :
Connecte ta UNO et tape la commande dmesg

dmesg
....
[ 1372.969515] usb 2-1.1.1: new full-speed USB device number 12 using ehci-pci
[ 1373.062605] usb 2-1.1.1: New USB device found, idVendor=1a86, idProduct=7523
[ 1373.062608] usb 2-1.1.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[ 1373.062609] usb 2-1.1.1: Product: USB2.0-Serial
[ 1373.062883] ch341 2-1.1.1:1.0: ch341-uart converter detected
[ 1373.064540] usb 2-1.1.1: ch341-uart converter now attached to ttyUSB2

@+

Le code PHP n'est pas très propre.

Je suppose deviceSet ou deviceOpen lèvent une exception en cas de problème ...
Exception que tu as peut-être catchée sans traitement approprié.

Oui regardez si c’est le bon port

Vérifiez aussi si ce n’est pas un Arduino chinois avec un CH340 comme composant série

Le driver CH340 créera des devices /dev/ttyUSB0, /dev/ttyUSB1, etc.

désolé pour le retard de la réponse, pas de connexion ce matin.
Le port est bon et c'est bien /dev/ttyACM0, sinon il y a les erreurs php.
Quand je dis qeu la connexion est bonne, c'est que je n'ai pas d'erreur php, la led de l'arduino clignote mais sur la nouvelle carte, l'action prévue ne s'effectue pas alors qu'elle se fait sur l'ancienne.
C'est bien un arduino made in Italy.

Exception que tu as peut-être catchée sans traitement approprié.

je n'ai pas compris le sens de cette phrase...
Merci

vous avez chargé comment le code dans l'arduino? est-il toujours branché à l'IDE et la console est-elle ouverte? (parce que pour répondre à la question, ça devrait fonctionner pareil)

Bonjour fgland,

Il faudrait communiquer les références du composant interface USB/Série des deux arduino et le code des arduinos

Cordialement,
bidouilleelec

Le port est bon et c'est bien /dev/ttyACM0, sinon il y a les erreurs php.

OK si le port est bien /dev/ttyACM0, ce n'est pas un clone à base de CH340, mais bien une carte équipée d'un ATMEGA16U2.

Exception que tu as peut-être catchée sans traitement approprié.
je n'ai pas compris le sens de cette phrase...

Si tu as bien des erreurs PHP quand tu remplaces /dev/ttyACM0 par un port inexistant, /dev/ttyUSB0 par exemple, c'est que les exceptions remontent bien. pas de soucis de ce côté là.

Il ne reste plus que le code ARDUINO à inspecter.

@+

Bonjour

Quelle distribution Linux est en place ? Raspbian ? quelle est sa version ?

Pour info j'ai eu récemment des pb de /ttyACMx avec Ubuntu 18.10 (sur PC pas sur Raspberry)

-sous Arduino : deux cartes Leonardo
-sous Energia (fork d'Arduino) : une carte Launchpad MSP430FR4133 (firmware écrasé, galère pour remettre la carte en état de fonctionnement)

Dans les deux cas il s'est avéré que l'outil modemanager , que je n'utilise pas, 'cause' désormais à tous les /ttyACMx rencontrés , avec comme conséquence des dysfonctionnements de ceux-ci qui reçoivent des données 'parasites'.

Je n'ai pas fait dans la dentelle (udev...), pour aller au plus pressé j'ai désinstallé paquet modemanager

merci pour votre attention.
Je referai des tests demain sur la nouvelle carte qui est actuellement en service.
Je ne sais si mon projet pourrait rentrer dans la catégorie adéquate car elle ne se limite pas à arduino.
J’aurais quand même besoin d’un peu d’aide pour la gestion de “sécurité”.

Arduino est piloté

  • soit par un clavier de 10 boutons sur une entrée analogique
  • soit par des boutons sur le clavier tactile du raspberry
  • soit par le programme javascript/jquery des gestion des jours

Je ne suis ni informaticien, ni électronicien ni programmeur, seulement autodidacte ce qui donne pas mal de lacunes. Je vous donne mon code de réception des données.
Il y a toujours 3 caractères envoyés >= 48(0) et <= 125(}).
Je les mets dans un tableau pour les traiter ensuite

void loop() {

  if (Serial.available() > 0) { // si des données entrantes sont présentes
    commandeRecue = Serial.read();

    //on récupère seulement les valeurs supérieur à 47 : 0=48
    if ( commandeRecue > 47) {
      tabRC[i] = commandeRecue;
      i++;      
    }

    if ( i == 4) { //----------------traitement des données

      digitalWrite(enCours, HIGH);//début led programme en cours

      if (tabRC[2] > 115) {
        poussoir = tabRC[2] - 105;
        cloche = tabRC[3] - 67;
      } else {
    }
    ...
}

très basique comme vous voyez…
Comment peut-on connaître les composants utilisés ?

Je fais mes tests sous Fedora29, le raspberry est sur la dernière version de raspbian.
Je n’ai pas trouvé d’outils de développement dans le navigateur Epiphany du raspberry, les tests sont donc plus laborieux …

S'il n'y a pas de séparateur et que vous prenez la communication en cours de route, comment allez vous faire pour vous synchroniser?

avec phpserial, la communication est réinitialisé à chaque fois.
Donc mon i redémarre toujours à 1

votre arduino reboot aussi à chaque fois que vous ouvrez la communication alors

exactement mais ce n'est pas toutes les minutes !
cela pose-t-il un problème ?

Non - mais si votre arduino est un peu lent à se réveiller et que de l'autre côté votre PC a déjà commencé à balancer du contenu vous allez rater le premier octet et être ensuite décalé

dans votre code d'origine vous aviez d'ailleurs 2 secondes d'attente sans doute pour le réveil

    sleep(2); //Unfortunately this is nessesary, arduino requires a 2 second delay in order to receive the message
    $serial->sendMessage($code);

essayez avec 8

Bonjour,
j'ai fait quelques essais sur la vieille carte car j'ai vu que je pouvais récupérer le code reçu avec
var_dump($serial->readPort());
mais j'ai du mal à interpréter.
Avec un sleep(1), le résultat est vide
avec 2 et au dessus, le résultat est identique

J'ai simplement mis dans l'arduino

void setup() {
  Serial.begin(9600);
}
void loop() {
  if (Serial.available() > 0) {
    Serial.println(Serial.read());
  }
}

voici le résultat pour l'envoi de :
1
2
3
}
2}

string(88) "49 52 57 13 10 13 10 53 50 13 10 13 10 53 55 13 10 13 10 49 51 13 "
string(88) "50 53 48 13 10 13 10 53 51 13 10 13 10 52 56 13 10 13 10 49 51 13 "
string(88) "51 53 49 13 10 13 10 53 51 13 10 13 10 52 57 13 10 13 10 49 51 13 "
string(89) "125 49 50 53 13 10 13 10 52 57 13 10 13 10 53 48 13 10 13 10 53 51 "
string(92) "50 125 53 48 13 10 13 10 49 50 53 13 10 13 10 53 51 13 10 13 10 52 56 "

seul le ou les premiers sont significatifs, que sont les autres ?
Je vais regarder plus tard comment réagit l'autre carte
Merci