home castoo
chapitre robotique
Bricolage

Testeur ultrason SR04 et servo-moteur

Janvier 2019

En robotique deux questions reviennent souvent, y a t-il un obstacle devant moi et comment effectuer un mouvement.

Pour détecter les obstacles un composant est régulièrement utilisé par les amateurs. Le capteur à ultrason SR04 permet de mesurer la distance entre votre robot et les obstacles sur son chemin, il est donc très utilisé en robotique amateur son prix étant très abordable. Techniquement son utilisation avec un microprocesseur est très simple, il suffit d'envoyer une impulsion de 10 µs en entrée et il retourne une largeur d'impulsion proportionnelle à la distance.
Pour le problème des mouvements du robot le composant le plus utilisé est sans nul doute le servo moteur. Il permet simplement de réaliser des mouvements à 180° précisément et sans complication technique. Il suffit avec un microprocesseur d'utiliser la PWM (commande par largeur d'impulsion).
Bien que l'utilisation de ces deux technologies soit simple il est primordial de connaitre les valeurs précises nécessaires à l'utilisation envisagée afin de réaliser un code de programmation fiable. J'ai donc développé le petit montage suivant qui m'indique sur un petit cadran LCD les valeurs qui conviennent à mes montages. Si la réalisation de ce genre de montage vous intéresse je vais tenter de vous faire gagner un peu de temps...


Le code (perfectible je n'en doute pas !) à modifier selon vos besoins :


// Castoo
// Module de tests
// Affichage délai en microsecondes des parametres d'un servo moteur en test
// Affichage distance d'un capteur SR04 en test
// Sur ecran LCD

#include "LiquidCrystal.h"

const boolean test_serie = LOW; // Pour test avec sortie sur interface serie HIGH (A passer à LOW avant compilation definitive)
const int bt_typ_mesur = 11; // Bouton choix type de mesure
const int servo_a_tester = 2; // Broche S du servo a tester sur broche 2
const int potar_servo = 0; // Potentiometre de 10K pour faire varier le delai entre deux tests d'impulsion
const int trigPin = 8; // Broche du triger du capteur sr04
const int echoPin = 7; // Broche echo du capteur sr04
const float v = 331.5+0.6*20; // Calcul de la vitesse en seconde du son en fonction d'une temperature de 20 degres
LiquidCrystal lcd(9,10,3,4,5,6); // LCD avec liaison 4 bits de données
int v_potar; // Valeur analogique de lecture du potar du servo
char message[16] = ""; // Variable affichage sur ecran LCD 16 caracteres

void setup(){
	if (test_serie == HIGH) Serial.begin(115200); // Test
	lcd.begin(16,2); // Initialisation de l'écran
	pinMode(bt_typ_mesur, INPUT); // Bouton choix type de mesure
	digitalWrite(bt_typ_mesur, HIGH);	// mode pull-up sur bouton
	pinMode(trigPin, OUTPUT); // Broche triger en sortie
	pinMode(echoPin, INPUT); // Broche echo en entree
	pinMode(servo_a_tester, OUTPUT);
}

// Mesure de la distance et convertion en cm
float distanceM(){
	// Genere une impulsion de 10 microsecondes sur la broche triger
	digitalWrite(trigPin, LOW);
	delayMicroseconds(3);
	digitalWrite(trigPin, HIGH);
	delayMicroseconds(10);
	digitalWrite(trigPin, LOW);
	float tUs = pulseIn(echoPin, HIGH); 	// Lecture du temps alle/retour de l'onde en microsecondes
	float t = tUs / 1000.0 / 1000.0 / 2; 	// Conversion en secondes et div par deux (seulement le retour de l'onde)
	float d = t*v; 							// calcul de la vitesse en m/s
	return d*100; 							// convertion en cm pour affichage
}

// Test le servo en generant un etat haut pendant le temps passé en parametre
void test_Servo(int servo_a_tester, int test_delai_servo)	// <1>
{
	digitalWrite(servo_a_tester, HIGH);	// <2>
	delayMicroseconds(test_delai_servo);	// <3>
	digitalWrite(servo_a_tester, LOW);	// <4>
}

void loop(){
	// Affichage distance sur LCD
	lcd.clear();
	lcd.home(); // Replace le curseur en haut a gauche
	if(digitalRead(bt_typ_mesur) == HIGH){
		// Mesure de distance
		lcd.print("Mesure distance");
		// Appel fonction de lecture de la distance
		int d=distanceM();
		// Affichage distance sur console serie
		if (test_serie == HIGH) Serial.println(d, DEC); // Test
		if(d > 286 or d < 1){
			//si la distance est > a 2m86, l'onde est perdue
			lcd.setCursor(0,1);
			lcd.print(" Echec  mesure");
		}else{
			sprintf(message, "Dist : %5d cm", d);
			lcd.print(message);
		}
		delay(200); // ms
	}else{
		// mesure de servo moteur
		for (int i=300; i<=3000; i = i + 2) {
			test_Servo(servo_a_tester, i);
			v_potar = analogRead(potar_servo); // Lecture du potar du servo
			v_potar = map(v_potar, 0, 1023, 0, 150); // Convertion lecture du potar servo vers valeur entre 0 et 150
			if (test_serie == HIGH) Serial.println(v_potar); // Test
			delay(v_potar); // permet la lecture des valeurs sinon ca va trop vite
			if (test_serie == HIGH) Serial.println(i); // Test
			sprintf(message, "MicroSec: %5d", i);
			lcd.clear();
			lcd.home();
			lcd.print("Mesure Servo");
			lcd.setCursor(0,1);
			lcd.print(message);
			if(digitalRead(bt_typ_mesur) == HIGH) i=3001; // Si bouton choix mesure changé on sort boucle for
		}
	}
}
	

Retour accueil Robotique

Bricolage Robotique Informatique Peinture Voyage
Téléc. portail Le robot "mécano" Astuces informatique Henri Bertrou Auvergne
Bat. Iphone 6S Le robot "solaire" Réseau couche app. Jean-Michel Castille Floride
Robot piscine Servo et IR" Réseau Les couches New York
Xiaomi M365 Le robot "thymio" Réseaux Outils L'Ouest américain
Mac Mini Le robot "Rovio" Unités grandeur inf. L'Ile Maurice
Putty SSH Windows L'Italie / Venise
Bases Raspberry Tunisie
Termius IPhone/IPad Grece
Le vieux ZX 81
...
Navigation La Rochelle CNC / Imp3D Electronique Programmation
Rencontre dauphins Les Minimes Construction CNC Alim. TPL 5110 Doc. programme
Analyse NMEA 0183 Le Vieux port CNC du commerce Carte ESP8266 Indent programme
graph. NMEA 0183 L'Ile de Ré Martyr CNC ESP8266 1 relai Prog. objet
Analyse trames AIS A visiter Réa. imp. 3D ESP8266 Alarme Prog. procédurale
Analyse AIS TCP-IP Cura impression 3D ESP8266 MQTT
Sortie en ketch Plateau CR10 ESP8266 Temp.
Echange GPS C80 Anémomètre.
HP Sun-Odyssey CNC / 3D en vrac MCP9808 Librairie
LCD yanmar Saisie Oled
Testeur nmea esp1 i2c