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 ?
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
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
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)
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à.
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 …
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);
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