#1 Le 26/09/2019, à 17:54
- terfa
Script valeurs du moniteur série arduino
Bonjour, je suis nouveau sur le forum donc excusez moi d'avance si je ne suis pas dans la bonne rubrique du forum.
J'utilise un capteur tactile relié à une carte arduino, elle même reliée à mon ordinateur. Lorsque je touche une fois le capteur j'affiche 1 sur le moniteur série, deux fois 2 et 3 fois 0; voici le code :
int i = 0;
int lastCtsValue = 0;
int ctsValue = 0;
void setup()
{
Serial.begin(9600);
pinMode(2, INPUT);
}
void loop()
{
ctsValue = digitalRead(2);
if (ctsValue == HIGH)
{
i++;
switch (i)
{
case 0:
Serial.println(0);
break;
case 1:
Serial.println(1);
break;
case 2:
Serial.println(2);
break;
case 3:
i = 0;
Serial.println(0);
break;
}
}
delay(350);
}
Ainsi, je récupère les valeurs du moniteur série afin de les enregistrer dans une variable. Je compare cette variable avec 0; 1 et 2 afin de lancer des instructions précises (ultérieurement, ce sera un allumage de lumière).
#!/bin/bash
gg=0
while [ $gg -eq 0 ]
do
var=$(tail -n 1 /dev/ttyACM0)
case $var in
0)
echo "OK 0"
;;
1)
echo "OK 1"
;;
2)
echo "OK 2"
;;
esac
done
Le problème c'est que lorsque j'appuie plusieurs fois sur le capteur, alors qu'il est censé afficher l'ensemble du texte (OK0 OK1...), il me les affiche 1 fois sur 10.
Merci de votre aide !
Dernière modification par terfa (Le 26/09/2019, à 19:49)
Hors ligne
#2 Le 26/09/2019, à 20:08
- pingouinux
Re : Script valeurs du moniteur série arduino
Bonsoir,
Je ne connais pas arduino, mais voici deux remarques au sujet de ton script bash :
1) Tu ne sortiras jamais de la boucle si tu ne modifies pas gg dans cette boucle.
2) Si /dev/ttyACM0 se comporte comme un fichier, tu n'en lis que la dernière ligne à chaque itération, et suivant la durée de la boucle, tu peux sauter des lignes ou lire plusieurs fois la même.
Tu peux tenter ceci, sans garantie :
while read var
do
case "$var" in
0)
echo "OK 0"
;;
1)
echo "OK 1"
;;
2)
echo "OK 2"
;;
esac
done </dev/ttyACM0
Hors ligne
#3 Le 26/09/2019, à 20:46
- Watael
Re : Script valeurs du moniteur série arduino
ouaip, c'est pas hyper clair.
que contient le fichier ? le contenu est-il écrasé (n'y a-t-il toujours qu'une seule ligne ?) lors de l'appui sur le capteur ?
le script doit-il s'exécuter en continu ? ou est-il lancé après chaque appui sur le capteur ?
...
?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 26/09/2019, à 20:47
- terfa
Re : Script valeurs du moniteur série arduino
Bonsoir, merci de vos réponses !
pingouinux :
Ce que je veux c'est utiliser les dernières valeurs du moniteur série (/dev/ttyACM0), les lires en temps réel afin de savoir si elles sont égales à 0 1 ou 2 (les valeurs correspondent au nombre fois ou je touche le capteur) est donc d'afficher OK1 ou OK2....
D'ailleurs j'ai pas bien compris à quoi fait référence la variable var dans ton script ?
Watael :
Le fichier contient des 0 des 1 et des 2. Le contenu n'est jamais écrasé, et je n'avais pas pensé à lancer le script à chaque pression sur le capteur, du coup les deux solutions sont bonnes, même si ici le script est éxecuté en continu.
Dernière modification par terfa (Le 26/09/2019, à 20:53)
Hors ligne
#5 Le 26/09/2019, à 21:00
- Watael
Re : Script valeurs du moniteur série arduino
on reprend :
tu as une boîte noire avec un bouton.
tu appuies n fois sur le bouton.
la boîte ajoute le nombre n dans un fichier (/dev/ttyACMO)
tu exécutes le script shell
le script shell retourne une chaîne prédéfinie correspondant à la dernière valeur enregistrée dans le fichier /dev/ttyACMO
mais ça fonctionne 1 fois sur 10, c'est ça ?
alors, que retourne
cat -A /dev/ttyACMO
Dernière modification par Watael (Le 26/09/2019, à 22:52)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 26/09/2019, à 21:28
- terfa
Re : Script valeurs du moniteur série arduino
Les valeurs affichées correspondent bien aux pressions effectuées sur le capteur :
0^M$
1^M$
2^M$
0^M$
1^M$
2^M$
0^M$
1^M$
2^M$
0^M$
Dernière modification par terfa (Le 26/09/2019, à 21:43)
Hors ligne
#7 Le 26/09/2019, à 21:30
- Watael
Re : Script valeurs du moniteur série arduino
il y a des gens comme ça, tu leur demandes un truc, ils te répondent systématiquement juste à côté.
moi, là, je passe la main.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 26/09/2019, à 21:34
- terfa
Re : Script valeurs du moniteur série arduino
Ne t'inquiète pas j'ai rectifié
Dernière modification par terfa (Le 26/09/2019, à 21:36)
Hors ligne
#9 Le 26/09/2019, à 21:55
- Watael
Re : Script valeurs du moniteur série arduino
je reprends, donc.
lastValue=$(tail -1 /dev/ttyACMO) #stocke un nombre : 0,1, ou 2
# on contrôle le nombre
case $lastValue in
0) echo "OK 0"
;;
1) echo "OK 1"
;;
2) echo "OK 2"
;;
*) echo "Err: la donnée ne correspond pas." >&2 #message d'erreur stderr
exit 1
;;
esac
tu appuies sur le bouton un certain nombre de fois.
tu exécutes le script shell.
tel quel, ça doit fonctionner à chaque fois.
montre-nous un copier/coller de l'exécution jusqu'à reproduire la défaillance.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 26/09/2019, à 22:04
- terfa
Re : Script valeurs du moniteur série arduino
OK 0
Err: la donnée ne correspond pas.
Err: la donnée ne correspond pas.
OK 2
Err: la donnée ne correspond pas.
Err: la donnée ne correspond pas.
Err: la donnée ne correspond pas.
OK 1
Err: la donnée ne correspond pas.
Err: la donnée ne correspond pas.
Err: la donnée ne correspond pas.
Err: la donnée ne correspond pas.
Err: la donnée ne correspond pas.
Err: la donnée ne correspond pas.
Err: la donnée ne correspond pas.
Err: la donnée ne correspond pas.
Err: la donnée ne correspond pas.
OK 1
En appuyant en continue.
Hors ligne
#11 Le 26/09/2019, à 22:51
- Watael
Re : Script valeurs du moniteur série arduino
grr, j'aurais dû faire afficher le contenu de la variable dans le message d'erreur :
*) echo "Err: la donnée \"$lastValue\" ne correspond pas." >&2
visiblement, la boîte noire ne retourne pas que les nombres prévus...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#12 Le 26/09/2019, à 22:56
- Watael
Re : Script valeurs du moniteur série arduino
ah !
0^M$
je n'avais pas vu ton message.
la lecture du fichier est gênée par le format non-UNIX des lignes : ^M comme Microsoft.
l'Arduino est sous Linux, le shell est sur Linux, pourquoi le fichier est-il au format DOS ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 26/09/2019, à 23:00
- Postmortem
Re : Script valeurs du moniteur série arduino
Salut,
Moi je m'étonne que ça marche de temps en temps étant donné que la valeur sensée être récupérée dans la variable lastValue est 0, 1 ou 2 suivi de \r (^M).
Comment est déclenché le script ? Manuellement ? Dès qu'on a appuyé sur le bouton ?
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#14 Le 27/09/2019, à 06:02
- terfa
Re : Script valeurs du moniteur série arduino
Retour de la commande :
OK 2
Err: la donnée "" ne correspond pas.
" ne correspond pas.
" ne correspond pas.
OK 0
" ne correspond pas.
" ne correspond pas.
/dev/ttyACM0, ne se comporte pas vraiment comme un fichier mais plutôt comme un terminal si je n'abuse pas du langage. Après pour le format, je ne sais pas.
Le script est déclenché manuellement.
Hors ligne
#15 Le 27/09/2019, à 06:20
- Compte supprimé
Re : Script valeurs du moniteur série arduino
Bonjour,
Essaie en ajoutant une pause de 0.2 s dans le script bash entre la lecture du port série et ton case
(je pars du principe que ton script arduino est valide..)
https://forum.ubuntu-fr.org/viewtopic.php?id=2027471
#16 Le 27/09/2019, à 09:18
- Postmortem
Re : Script valeurs du moniteur série arduino
Et dans le script de Watael, je ferais ce petit changement :
lastValue=$(sed -n '$s/.$//p' /dev/ttyACMO) #stocke un nombre : 0,1, ou 2
sed -n '$s/.$//p' permet de retirer ^M en fin de ligne.
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#17 Le 27/09/2019, à 12:23
- Watael
Re : Script valeurs du moniteur série arduino
je corrigerais plutôt l'origine de ce comportement.
soit en configurant l'environnement d'exécution pour que les retours de lignes soient au format UNIX,
soit en changeant de commande d'affichage (println() -> print()) pour mieux contrôler les retours à la ligne.
Dernière modification par Watael (Le 27/09/2019, à 12:24)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#18 Le 27/09/2019, à 12:42
- Postmortem
Re : Script valeurs du moniteur série arduino
T'as raison, autant corriger la source.
Par contre, je ne m'explique toujours pas pourquoi ça marche une fois de temps en temps.
Enfin, je suppose que c'est quand on cherche à récupérer la valeur alors que la ligne n'est pas totalement écrite (et donc qu'il n'y a pas le ^M)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#19 Le 27/09/2019, à 13:08
- Watael
Re : Script valeurs du moniteur série arduino
il y a toujours ^M à la fin de chaque ligne d'un fichier au format DOS.
je ne saurais pas expliquer ce qu'il se passe au moment de la lecture sur UNIX.
j'ai simplement observé que ce caractère de contrôle a des effets imprévisibles, parfois ça "mange" des morceaux de lignes, et parfois en intervertit certaines.
¿ ça induit une différence entre le nombre de caractères lus et le nombre de caractères à afficher ?
comme, en bash, avec printf lorsqu'il y a des indications de couleurs, ou autre introduit par une séquence d'échappement (^[)...
Dernière modification par Watael (Le 27/09/2019, à 13:10)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#20 Le 27/09/2019, à 17:07
- terfa
Re : Script valeurs du moniteur série arduino
pseudofab :
Le problème n'est quand même pas résolue avec un
sleep .2
Postmortem :
Comme je l'ai dit précédemment /dev/ttyACM0 ne se comporte pas comme un fichier donc les sed ne fonctionnent pas.
Watael :
Avec un
print()
les valeurs retournées se suivent et je ne sais pas comment faire un retour à la ligne (ou un espace si je peux comparer des valeurs espacées) sans sed. Si jamais tu connais une alternative je suis preneur
Du coup grâce à vos réponses j'ai un script fonctionnel :
#!/bin/bash
gg=0
while [ $gg -eq 0 ]
do
cat /dev/ttyACM0 > data.txt
var=$(tail -1 data.txt)
case $var in
0)
echo "OK 0"
;;
1)
echo "OK 1"
;;
2)
echo "OK 2"
;;
esac
done
J'enregistre /dev/ttyACM0 dans un .txt sans enregistrer les valeurs (comme ça aucun retour à la ligne).
Du coup le retour :
0OK 0
1OK 1
2OK 2
0OK 0
Je sais pas si c'est "cat" qui retourne les valeurs du moniteur série avant les OK, même si c'est pas si génant que ça.
Merci de vos réponses ça fait plaisir de voir autant d'activité sur le forum !
Hors ligne
#21 Le 27/09/2019, à 18:38
- Postmortem
Re : Script valeurs du moniteur série arduino
Postmortem :
Comme je l'ai dit précédemment /dev/ttyACM0 ne se comporte pas comme un fichier donc les sed ne fonctionnent pas.
Qu'est ce qui te fait dire ça ?
La commande sed que je t'ai donnée ne modifie pas /dev/ttyACM0, elle affichait la dernière ligne et supprimait le dernier caractère de cette ligne afin de faire sauter le "^M".
Et si tail était capable de lire /dev/ttyACM0, je me demande pourquoi sed ne serait pas capable ?
Et je me demande comment ton script peut fonctionner car si tu n'as pas supprimer ces ^M, ils sont toujours là.
Et je comprends pas pourquoi tu rentres dans une des conditions du case.
Enfin,le principal est que ça fonctionne, mais ça m'intrigue !
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#22 Le 27/09/2019, à 19:57
- Watael
Re : Script valeurs du moniteur série arduino
print("%d\n",nombreVariable)
ou
print("0\n") #par exemple
?
on ne sait même pas de quel langage il s'agit.
si tu ne règles pas ton problème de format de fins de ligne, tu n'auras pas de script fonctionnel.
@Postmortem : mais ça ne fonctionne pas !
enfin si... des fois ça marche (1/10), des fois, la plupart du temps, ça marche pas.
Dernière modification par Watael (Le 27/09/2019, à 19:59)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#23 Le 02/10/2019, à 13:44
- terfa
Re : Script valeurs du moniteur série arduino
Autant pour moi, je me suis trompé de caractère, le sed fonctionne correctement, mais ne résout pas le problème.
Et en effet, le script ne fonctionne qu'une fois sur 10. Le lendemain, en rallumant mon ordinateur le script ne fonctionnait plus. Donc j'ai attendu avant de confirmer le fonctionnement du print("chiffre\n) :
int i = 0;
int lastCtsValue = 0;
int ctsValue = 0;
void setup()
{
Serial.begin(9600);
pinMode(2, INPUT);
}
void loop()
{
ctsValue = digitalRead(2);
if (ctsValue == HIGH)
{
i++;
switch (i)
{
case 0:
Serial.print("0\n");
break;
case 1:
Serial.print("1\n");
break;
case 2:
Serial.print("2\n");
break;
case 3:
i = 0;
Serial.print("0\n");
break;
}
}
delay(350);
}
J'aurai du suivre cette méthode d'analyse d'erreur dès le début Watael. Merci beaucoup !
Hors ligne