Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/09/2019, à 18: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, à 20:49)

Hors ligne

#2 Le 26/09/2019, à 21: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, à 21: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, à 21: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, à 21:53)

Hors ligne

#5 Le 26/09/2019, à 22: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, à 23:52)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 26/09/2019, à 22: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, à 22:43)

Hors ligne

#7 Le 26/09/2019, à 22: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, à 22: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, à 22:36)

Hors ligne

#9 Le 26/09/2019, à 22: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, à 23: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, à 23: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, à 23: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 27/09/2019, à 00: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, à 07: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, à 07: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, à 10: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, à 13: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, à 13:24)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#18 Le 27/09/2019, à 13: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, à 14: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, à 14:10)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#20 Le 27/09/2019, à 18: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 smile

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, à 19:38

Postmortem

Re : Script valeurs du moniteur série arduino

terfa a écrit :

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 ! tongueroll


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#22 Le 27/09/2019, à 20: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, à 20:59)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#23 Le 02/10/2019, à 14: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