Étape 3: Algorithme pour la réception et de transmission de données
Afin de transmettre des données, j’ai écrit deux fonctions pour mener à bien ce processus, ils sont : send_data(int num) et completion_Scan().
J’ai affecté des variables avec le code correspondant à ma table pour les 2 premiers scénarios appelé à droite et à gauche. Pour cet exemple, nous nous concentrerons uniquement sur la communication que la balle est sur le côté gauche ou droit. Lorsque l’emplacement de la balle est déterminé, la valeur est envoyée à la fonction de send_data où l’entier est divisé en un tableau et les valeurs high(1) pulsé ou low(0). Lorsque toutes les valeurs sont pulsés, la fonction completion_Scan() est appelée et sort uniquement lorsqu’un signal de fin est envoyé de l’Arduino original qui a reçu le message.
Pseudo-code :
int right=10100; int left = 10010; if (ball is on left side){ send_data(right); completion_Scan(); } if (ball is on the right side){ send_data(left); completion_Scan(); }
Lorsque send_Data est appelé, l’entier passé est haché dans un tableau de 5 bits en utilisant l’algorithme suivant :
int send_data(int num){ data[4] = num % 10; data[3] = (num % 100 - data[4])/10; data[2] = (num % 1000 - data[3] - data[4])/100; data[1] = (num % 10000 - data[2] - data[3] - data[4])/1000; data[0] = (num % 100000 - data[1] - data[2] - data[3] - data[4])/10000;
En utilisant le modulo fonction, j’ai créé un algorithme pour stocker les bits individuels dans une position de choix unique nommée data. Par exemple, si 10100 est envoyé à send_data, puis données [4] vont stocker le reste de 10100 divisé par 10.
données [4] = (10100 mod 10) = 0 ;
données [3] = ((10100 mod 100) - 0) / 10 = 0
données [2] = 1
données [1] = 0
Data [0] = 1
Le tableau d’ensemble des données est traité par une instruction « for » et chaque fois qu’une valeur de 1 est détectée, un signal élevé est pulsé à travers les barbelés pour 200ms. À l’inverse, lorsqu’une valeur de 0 est détectée, un signal faible est pulsé à travers les barbelés pour le même laps de temps.
for (y=0; y<5; y++){ //send high or low if (data[y]==1){ turn PC5 HIGH } else{ turn PC5 LOW } delay(200); }
Afin de recevoir des données, le récepteur Arduino est toujours en attente d’un signal initial élevé. Immédiatement après qu’il est détecté, le message envoyé est stocké dans un tableau d’une manière similaire. Le code final est ensuite comparé pour déterminer la sortie désirée.
J’ai inclus le code complet pour les Mechbot et les EVShield. La seule différence est que j’ai inclus les Serial.prints pour le débogage, boutons pour envoyer ou interrompre la communication et un témoin clignotant pendant la transmission. Remarque : vous pouvez télécharger les deux fichiers ou faites un clic droit et sélectionnez « Ouvrir dans un nouvel onglet » pour afficher le code.