Dans le cadre de ce projet : Exemple montrant comment préparer une voiture de course pour la toulouse robot race
Parmi les différents capteurs de distances qu'on peut trouver, j'ai utilisé le capteur TF Mini plus
Il s'agit d'un capteur de distance résistant à l'eau, compact, léger, très robuste et économe en énergie, capable de mesurer jusqu'à 12m, Bref il est parfaitement adapté pour une activité en extérieur comme la toulouse robot race.
Ce module est alimenté en 5V mais communique avec un microcontrôleur type Arduino ou compatible via une liaison UART avec un niveau logique de 3.3V. Pour le faire fonctionner avec mon arduino méga fonctionnant en niveau logique 5V, j'ai utilisé un convertisseur de niveaux logique .
Fils pour les connexion :
Rouge V+ connecté au 5V de l'arduino
Noir GND connecté au GND de l'arduino
Bleu/Vert TFMINI plus TX connecté au RX1 de l'arduino
Blanc TFMINI plus RX connecté au TX1 de l'arduino (optionnel )
Note : Il devrait être possible de connecter directement le TX du TF Mini plus sur le RX1 de l'arduino mega sans passer par le convertisseur de niveau logique, le 3.3V devant être suffisant pour être considérer comme un 1 logique sur un niveau logique 5V mais la moindre erreur pourrait endommager votre capteur... Donc la prudence est de mise...
Le projet du code de test utilisé :
Ce projet vous montre un exemple de code pour lire les distance avec le capteur TF Mini Plus et de manière plus générale, comment faire un décodage de trame uart avec une machine à état via un switch case=)
En espérant que cela vous soit utile N'hésitez pas à poser des questions ou faire des remarques.
Copie de sauvegarde au cas où l'accès à arduino cc ne serait pas disponible :
/** * * Simple sketch to test the TF Mini PLUS from Benewake * TF Mini plus is connected to serial 1, * Computer display received value using Serial * Code made by Mike118 from Robot Maker * Note : Delay are used only for display convenience in tests sketch * => do not use delay functions in real project * **/ uint16_t count = 0; uint16_t error = 0; void setup() { Serial.begin(115200); Serial1.begin(115200); } void loop() { uint16_t distance = readTFMini1(); Serial.print(F("Time : ")); Serial.println(millis()); Serial.print(F("Count : ")); Serial.println(count); Serial.print(F("Error : ")); Serial.println(error); Serial.print(F("Distance : ")); Serial.println(distance); Serial.println(""); delay(1000); } uint16_t readTFMini1() { uint8_t current; static uint8_t n = 0; static uint8_t sum = 0; static uint16_t distance = 0; static uint16_t distanceOut = 0; while(Serial1.available()) { current = Serial1.read(); switch(n) { case 0: if(current == 0x59) { sum += current; n++; } break; case 1: if(current == 0x59) { sum += current; n++; } else n = 0; break; case 2: distance = current; sum += current; n++; break; case 3: distance += current << 8; sum += current; n++; break; case 4: sum += current; n++; break; case 5: sum += current; n++; break; case 6: sum += current; n++; break; case 7: sum += current; n++; break; case 8: if(sum == current) { if(distance != 65535) { distanceOut = distance; // We get a new measure chose what you want to do here count++; // I choose to increment a global value ... } } else { // Error occured, choose what you want to do here ... error++; // I choose to increment a global value ... } sum = 0; n = 0; break; } } return distanceOut; // Allways return the latest good value }