Aller au contenu


Photo
- - - - -

Communication UART OpenMV/Arduino


  • Veuillez vous connecter pour répondre
2 réponses à ce sujet

#1 Plasma-time

Plasma-time

    Nouveau membre

  • Membres
  • 2 messages

Posté 28 décembre 2022 - 06:31

Bonjour,

 

Je suis en train de faire un robot qui possède une OpenMV H7 Plus qui envoie à un Arduino UNO l'angle auquel se trouve une balle afin qu'il fasse tourner les moteurs pour s'y diriger. J'ai essayé d'utiliser de l'UART, sauf que les données que reçoit l'Arduino n'ont pas grand-chose à voir avec celles que transmet la caméra, et j'ai même l'impression que c'est complètement aléatoire.

Code de la caméra :
 

import pyb, sensor, image, time, math

# Initialisation du capteur
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
sensor.skip_frames(time=1000)
clock = time.clock()

# Seuil de couleur
threshold_index = 0
thresholds = [(0, 100, 18, 127, 13, 127)]

# UART
uart = pyb.UART(3, 9600, timeout_char=1000)


# Boucle principale
while(True):

    clock.tick()
    img = sensor.snapshot()

    for blob in img.find_blobs([thresholds[threshold_index]], pixels_threshold=40, merge=True):

        finalAngle = BallDetected()
        
        print(finalAngle)
        uart.write(str(finalAngle))

 

 



#2 Plasma-time

Plasma-time

    Nouveau membre

  • Membres
  • 2 messages

Posté 28 décembre 2022 - 06:38

J'ai envoyé le message alors que j'avais pas fini, désolé ^^'

Voilà le code de l'Arduino en rapport avec la communication :
 

void setup() {

  Serial.begin(9600);
  
} 


void loop() {

  Serial.println(Serial.read());
  MoveWheels(int(Serial.read()));

}

J'ai connecté le port P4 de la caméra au RX de l'Arduino. Quelqu'un aurait une idée de ce qui pose problème ?



#3 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 28 décembre 2022 - 08:33

Bonjour,

je penses que le problème est que tu envoie une chaine de caractères, et que coté arduino tu lis des octets en les considérant comme des nombres.

 

Par exemple, si tu essaye d'envoyer le nombre 142, ça devient la chaine de caractère "142", soit les 4 caractères '1', '4', '2', '\0'  (où '\0' est le caractère de fin de chaine). Ce qui converti en décimal donne 49, 52, 50, 0.

Donc coté arduino, tu vas lire 4 nombres : 49, puis 52, puis 50, puis 0

 

Si coté arduino tu lis principalement dés nombres entre 48 et 57, et des 0 de temps à autre (et peut-être du 46 si tu as des nombres à virgule), alors c'est probablement ça.

 

Dans ce cas, soit tu envoie directement tes angles sur un seul octet si ça te convient (donc entre 0 et 255, ou entre -128 et +127), soit tu dois lire la chaine de caractère coté arduino. Dans ce cas, je te suggère de regarder la fonction Serial.readString() pour récupérer la chaine de caractère en entier pour l'afficher (et ensuite il faudra voir pour la convertir : j'ai plus la fonction en tête, mais si tu cherches arduino convertir string en int, tu devrais trouver ton bonheur)


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users