Problème time.sleep() Raspberry Pi -> Arduino

Bonjour à tous,

Je débute dans le monde d'Arduino, et je me retrouve face à un souci que je ne parviens pas à résoudre.

J'utilise : - Raspberry Pi 3 B => Raspbian Stretch, IDE Arduino 1.8.5, Pyserial 3.4

  • Arduino Mega 2560

  • Liaison USB entre la Pi et l'Arduino

Ce que je cherche à faire (objectif final) : du tracking d'objet en envoyant des données chiffrées (la position du barycentre d'une tâche colorée par exemple) à l'Arduino pour contrôler des servo moteurs. Les données sont récupérées à l'aide d'un traitement d'image effectué par la Pi.

Là où j'en suis : envoyer à l'Arduino l'information "compteur" pouvant prendre la valeur 1 ou 2. Cette action est réalisée par un code python sur la Pi, avec comme objectif de contrôler la LED 13 de l'Arduino (1 => la led s'allume & 2 => la led s'éteint).

Ce qui me pose problème : le time.sleep(x) ... Pour x >= 1, il n'y a aucun souci, l'Arduino m'affiche avec le bon délai l'information envoyé par la Pi, la led s'allume / s'éteint quand elle le doit, et les leds Rx et Tx clignotent toutes les deux.

Toutefois, je vois mal le bon déroulement du tracking avec la nouvelle position du barycentre envoyée seulement chaque seconde ... J'ai donc essayé de mettre x < 1, et là, la led 13 ne s'allume plus et rien ne s'affiche dans le moniteur série :confused:

Ai-je oublié une chose importante ? Ai-je mal codé ? Est-ce seulement possible de passer sous la barre de 1 seconde ?

Bref, je suis coincé malgré avoir passé pas mal de temps à chercher une solution (peut-être suis-je passé à côté), et c'est pour cela que j'aimerais savoir si vous auriez des éléments de réponses à me proposer.

Ci-dessous vous trouverez mes codes Python et Arduino, ainsi que 2 images reflétant les 2 situations décrites ci-dessus.

Code python

import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600)
compteur = 1

while True:
    if compteur < 2:
        compteur = compteur + 1
    else:
        compteur = 1
    ser.write(str(compteur).encode())
    time.sleep(1)

Code Arduino

int message = 0;

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);  
}

void loop() {  
  if(Serial.available() > 0){
    message =   Serial.read() - '0';
    Serial.println(message);

    switch(message){
      case 1:
        digitalWrite(13, HIGH);        
        break;
      case 2:
        digitalWrite(13, LOW);
        break;
    }
  }
}

Est-ce seulement possible de passer sous la barre de 1 seconde ?

Bien sûr, rien ne s'oppose en PYTHON à écrire time.sleep(0.5)

Je peux essayer ton code ce soir.

@+

hbachetti:
Bien sûr, rien ne s'oppose en PYTHON à écrire time.sleep(0.5)

J'ai déjà testé des codes python avec des time.sleep() inférieur à 1 seconde, de même qu'en Arduino j'ai testé le code Blink avec des delay(300) sans problèmes.

Mais dans le cadre de la communication entre une Pi et une Arduino, je vois juste qu'en mettant moins d'1 sec, rien ne fonctionne. Les quelques codes que j'ai pu trouver concernant cette même communication emploient eux-aussi le time.sleep(1).

hbachetti:
Je peux essayer ton code ce soir.

Nice, j'attends ton retour avec impatience dans ce cas :slight_smile:

J'ai essayé ton code avec 0.1 s. Tout marche très bien.

la led 13 ne s'allume plus et rien ne s'affiche dans le moniteur série

Bien évidemment comme tu utilises déjà la ligne série pour ta communication avec la RASPBERRY PI, tu t'interdis l'utilisation du moniteur Série.
C'est soit l'un soit l'autre.
Ou alors tu communiques avec la RASPBERRY PI avec deux autres pins et SoftwareSerial, plus un convertisseur USB / Série.

@+

J'ajoute ceci :

En utilisant le câble USB pour communiquer avec ta RASPBERRY PI, pendant le chargement du programme dans l'ARDUINO, ton logiciel PYTHON doit être stoppé.
En bref, l'utilisation d'une ligne série est exclusive.

@+

Salut, je te remercie beaucoup d'avoir pris le temps de tester mon code et de me répondre :slight_smile:

Je crois comprendre ce tu me dis concernant la liaison et l'utilisation du moniteur, mais sans être certain de bien saisir.

Pour résumer mon premier post :

1 - Je n'ai pas de problèmes avec time.sleep(1) ou plus => code python tourne sur la PI en continu + le moniteur série m'affiche alternativement "1" et "2" + la led 13 s'allume et s'éteint en synchronisation avec les "1" et les "2".

2 - J'ai un problème avec time.sleep(x) où 0 < x < 1 => code python tourne en continu sur la PI + le moniteur série ne m'affiche plus rien + la led 13 ne s'allume plus

Tu me dis que de ton côté, le même code fonctionne avec time.sleep(0.1), et je te crois. Mais de mon côté ça ne fonctionnait pas, et j'ai préféré réinstaller l'IDE Arduino avec le module pour la Teensy 3.6.

Et tout fonctionne correctement :slight_smile: Je laisse la Arduino de côté, j'ai dû zapper un truc avec, mais comme je réalise ce que je veux avec la Teensy , ça me va.

Merci encore de m'avoir répondu et peut-être à une prochaine :wink: