home castoo
chapitre electronique
Electronique enter text on oled sd1306

Le servo moteur
un support de caméra
une vanne de ventilation

mars 2024

Je viens de recevoir ma nouvelle imprimante 3D, une "Bambu Lab X1 C" oui je sais, j'ai de la chance !
Alors je me lance dans des idées d'impression que j'avais en tête depuis un moment.

Un support pour une caméra d'environ 500 grammes
qui permet des déplacements horizontaux et verticaux
(esp8266-12).
Une vanne d'aération
avec commande à distance
(esp8266-1).
Support de caméra orientable à distance Vanne d'aération commandée à distance
Les fichiers STL nécéssaires à l'impression de ces deux projets sont disponibles dans la partie Impression 3D du site.
Un esp8266-12 un circuit pour la gestion de la batterie avec la possibilité de charge soit par USB soit par un petit panneau solaire 5volts, 2 condensateurs chimique de 100 microfarad et 2 servo-moteur (perso j'ai utilisé des modèles costaud MG995 All Métal 15kg). Un esp8266-1 un circuit pour la gestion de la batterie avec la possibilité de charge soit par USB soit par un petit panneau solaire 5volts, 1 régulateur 3v3 pour alimenter esp1, 1 condensateurs chimique de 100 microfarad et 1 servo-moteur (perso j'ai utilisé un modèle costaud MG995 All Métal 15kg). Un programmateur comme celui de la photo plus bas est préférable pour l'esp1.
Schéma du support de caméra orientable à distance Schéma vanne d'aération commandée à distance
CI du support de caméra orientable à distance CI vanne d'aération commandée à distance

Le code pour le support de caméra : Pour utiliser ce programme modifier le SSID et le mot de passe avec ceux de votre box.
Connectez vous sur l'adresse IP inscrite dans le code du setup (192.168.1.89) dans cet bexemple.

/*
Gestion des déplacements d'un support de camera à l'aide de deux servos moteur.
Création 1er version Jean Michel Castille mars 2024 / https://castoo.fr

En cas de compilation avec l'IDE Arduino il faut changer le nom "main.cpp" en "truc.ino"
	et installer le fichier dans un rep "truc"

Cette bibliothèque est un logiciel libre;
Vous pouvez la redistribuer et ou la modifier.
Cette bibliothèque est distribuée dans l'espoir qu'elle sera utile,
mais SANS AUCUNE GARANTIE, sans même la garantie implicite de
QUALITÉ MARCHANDE ou ADÉQUATION À UN USAGE PARTICULIER. 

Pour utiliser ce programme modifier le SSID et le mot de passe de la box lignes 15 et 16
Connectez vous sur l'adresse IP inscrite dans le code du setup (192.168.1.89) dans cet bexemple.
*/
#include <Arduino.h> // Déclaration propre à Visual Studio Code
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#define ssid "xxxxxxxxxx" // SSID de la box
#define password "yyyyyyyyyyyyyyyyyyy" // Pass de la box
#define Servo_x D2 // servo de l'axe X
#define Servo_y D3 // servo de l'axe Y
ESP8266WebServer server(80); // Port IP par defaut du serveur HTML
const int max_haut = 2200; // Valeur max du servo en hauteur
const int max_bas = 100; // Valeur min du servo en bas
const int max_gauche = 100; // Valeur maxdu servo à gauche
const int max_droite = 2200; // Valeur max du servo à droite
const int pas_deg = 10; // Pas pour 1 degré = 10 microsecondes à modifier pour déplacement plus fluide
int memo_h = 1060; // Mémo positions horizontale
int memo_v = 940; // Mémo positions verticale
String pos_cam; // Commande gestion mouvement camera
bool depl_rapide = false; // Accelerateur vitesse de déplacement

// Construction de la page HTML
String page_html(){
	String b_0, b_1, b_2, b_3, b_4;
	if (pos_cam == "↹") { b_0 = "checked"; }
	if (pos_cam == "⬆") { b_1 = "checked"; }
	if (pos_cam == "⬇") { b_2 = "checked"; }
	if (pos_cam == "⬅") { b_3 = "checked"; }
	if (pos_cam == "⮕") { b_4 = "checked"; }
	String page = "<!DOCTYPE html><html dir='ltr' lang='fr'><head><meta http-equiv='content-type' content='text/html; charset=UTF-8'>";
	page += "<title>Gestion support de camera</title>";
	page += "<style> body { background-color: grey; font-family: Sans-Serif; Color: orange; }</style>";
	page += "</head><body><div align='center'><h1>Gestion du support de caméra</h1>";
	page += "<form action='/' method='POST'><INPUT type='submit' name='vit_rap' value='";
	if(depl_rapide) page += "Passer en vitesse de déplacement lente."; else  page += "Passer en vitesse de déplacement rapide.";
	page += "' /></div><table align='center'>";
	page += "<tr><td align='center' width='10'></td><td align='center' width='10'><INPUT type='submit' name='direction' value='⬆' " + b_1 + " /></td><td align='center' width='10'></td></tr>";
	page += "<tr><td align='center' width='10'><INPUT type='submit' name='direction' value='⬅' " + b_3 + " /></td><td align='center' width='10'><INPUT type='submit' name='direction' value='↹' " + b_0 + " /></td><td align='center' width='10'><INPUT type='submit' name='direction' value='⮕' " + b_4 + " /></td></tr>";
	page += "<tr><td align='center' width='10'></td><td align='center' width='10'><INPUT type='submit' name='direction' value='⬇' " + b_2 + " /></td><td align='center' width='10'></td></tr>";
	page += "</table><p align='center'>Pos. Vert. : " + String(memo_v) + " Pos. Hor. : " + String(memo_h) + "</p></body></html>";
	return page;
}

// Génére un etat haut pendant le temps passé en parametre sur le servo x
void deplace_servo(int v_servo, char v_sens, int new_pos){
	int p_temp;
	if(v_sens=='h'){
	p_temp = memo_h;
	if(memo_h < new_pos){
		while(p_temp < new_pos){
		p_temp++;
		for(int i=0; i<20; i++) {
			digitalWrite(v_servo, HIGH);
			delayMicroseconds(p_temp);
			digitalWrite(v_servo, LOW);
		}
		}
	}else{
		while(p_temp > new_pos){
		p_temp--;
		for(int i=0; i<20; i++) {
			digitalWrite(v_servo, HIGH);
			delayMicroseconds(p_temp);
			digitalWrite(v_servo, LOW);
		}
		}
	}
	}else{
	p_temp = memo_v;
	if(memo_v < new_pos){
		while(p_temp < new_pos){
		p_temp++;
		for(int i=0; i<20; i++) {
			digitalWrite(v_servo, HIGH);
			delayMicroseconds(p_temp);
			digitalWrite(v_servo, LOW);
		}
		}
	}else{
		while(p_temp > new_pos){
		p_temp--;
		for(int i=0; i<20; i++) {
			digitalWrite(v_servo, HIGH);
			delayMicroseconds(p_temp);
			digitalWrite(v_servo, LOW);
		}
		}
	}   
	}
}

// Gere les deplacements de la caméra
void modif_pos_servo(){
	int pos;
	if(pos_cam == "↹") { // Retour en position initiale
	deplace_servo(Servo_y, 'v', 940);
	memo_v = 940;
	deplace_servo(Servo_x, 'h', 1060);
	memo_h = 1060;
	} else if(pos_cam == "⬆") { // vers le haut
	if(depl_rapide) pos = memo_v + (pas_deg * 5); else pos = memo_v + pas_deg;
	if(pos <= max_haut){
		deplace_servo(Servo_y, 'v', pos);
		memo_v = pos;
	}
	} else if(pos_cam == "⬇") { // vers le bas
	if(depl_rapide) pos = memo_v - (pas_deg * 5); else pos = memo_v - pas_deg;
	if(pos >= max_bas){
		deplace_servo(Servo_y, 'v', pos);
		memo_v = pos;
	}
	} else if(pos_cam == "⬅") { // vers la gauche
	if(depl_rapide) pos = memo_h - (pas_deg * 5); else pos = memo_h - pas_deg;
	if(pos >= max_gauche){
		deplace_servo(Servo_x, 'h', pos);
		memo_h = pos;
	}
	} else if(pos_cam == "⮕") { // vers la droite
	if(depl_rapide) pos = memo_h + (pas_deg * 5); else pos = memo_h + pas_deg;
	if(pos <= max_droite){
		deplace_servo(Servo_x, 'h', pos);
		memo_h = pos;
	}
	}
	pos_cam = "0";
}

// Gestion du dialogue avec la page HTML
void gestionPage(){
	if ( server.hasArg("vit_rap") ) {
	if(server.arg("vit_rap")=="Passer en vitesse de déplacement rapide.") depl_rapide=true; else  depl_rapide=false;
	modif_pos_servo();
	}
	if ( server.hasArg("direction") ) {
	pos_cam = server.arg("direction");
	modif_pos_servo();
	}
	server.send ( 200, "text/html", page_html() );
}

void setup(){
	pinMode(Servo_x, OUTPUT);
	pinMode(Servo_y, OUTPUT);
	IPAddress ip(192, 168, 1, 89); // Declaration adr IP fixe
	IPAddress dns(192,168,1,254);
	IPAddress gateway(192,168,1,254);
	IPAddress subnet(255, 255, 255, 0);
	WiFi.config(ip, dns, gateway, subnet);
	WiFi.begin ( ssid, password );
	while ( WiFi.status() != WL_CONNECTED ) { delay ( 500 ); }
	server.on ( "/",  gestionPage );
	server.begin();
}

void loop(){
	server.handleClient();
}
	


Le code pour la vanne d'aération : Pour utiliser ce programme modifier le SSID et le mot de passe avec ceux de votre box.
Connectez vous sur l'adresse IP inscrite dans le code du setup (192.168.1.88) dans cet bexemple.

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>                      
//#include <Servo.h>   
#define ssid "yyyyyyyyyyyyy"
#define password "xxxxxxxxxxxxxxxxxxxxx"              
#define pinServo 2 // IO 2 sur esp8266-1
ESP8266WebServer server(80);
//Servo servo1;
const int angleMin_time  = 544;
const int angleMax_time = 1500;
const int pas_deg = 10; // Pas pour 1 degré = 10 microsecondes
String pos_vanne = "ouvert";
int pos_deb;

String page_html(){
	String b_1, b_2, b_3;
	if (pos_vanne == "ferme") { b_1 = "checked"; }
	if (pos_vanne == "moy_ouver") { b_2 = "checked"; }
	if (pos_vanne == "ouvert") { b_3 = "checked"; }
	String page = "<!DOCTYPE html><html dir='ltr' lang='fr'><head><meta http-equiv='content-type' content='text/html; charset=UTF-8'>";
	page += "<title>Gestion de l'ouverture de la vanne</title>";
	page += "<style> body { background-color: #fffff; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style>";
	page += "</head><body><h1>Gestion de l'ouverture de la vanne</h1>";
	page += "<form action='/' method='POST'>";
	page += "<h3>Position de la vanne : " + String(pos_deb) + " </h3><p>";
	page += "<table><tr><td align='center' width='200'>Fermée</td><td align='center' width='200'>Ouverte à moitié</td><td align='center' width='200'>Ouverte</td></tr><tr>";
	page += "<td align='center'><INPUT type='radio' name='position' value='ferme' " + b_1 + " /></td>";
	page += "<td align='center'><INPUT type='radio' name='position' value='moy_ouver' " + b_2 + " /></td>";
	page += "<td align='center'><INPUT type='radio' name='position' value='ouvert' " + b_3 + " /></td>";
	page += "</tr></table></p><INPUT type='submit' value='Lancer'>";
	page += "</body></html>";
	return page;
}

// Test le servo en generant un etat haut pendant le temps passé en parametre
void test_Servo(int delai_servo)
{
	for(int i=0; i<100; i++) {
	digitalWrite(pinServo, HIGH);
	delayMicroseconds(delai_servo);
	digitalWrite(pinServo, LOW);
	}
}

void modif_pos_servo(){
	int pos_fin;
	if(pos_vanne == "ferme") { pos_fin = angleMax_time; }
	if(pos_vanne == "moy_ouver") { pos_fin = 1000; }
	if(pos_vanne == "ouvert") { pos_fin = angleMin_time; }
	if (pos_deb != pos_fin) {
	if(pos_deb < pos_fin){
		while(pos_deb < pos_fin){
		pos_deb += pas_deg;
		test_Servo(pos_deb);
		delay(5);
		}
	}else{
		while(pos_deb > pos_fin){
		pos_deb -= pas_deg;
		test_Servo(pos_deb);
		delay(5);
		}
	}
	pos_deb = pos_fin;
	//delay(50);
	}
}

void gestionPage(){
	if ( server.hasArg("position") ) {
	pos_vanne = server.arg("position");
	modif_pos_servo();
	}
	server.send ( 200, "text/html", page_html() );
}

void setup(){
	pinMode(pinServo, OUTPUT);
	//servo1.attach(pinServo);
	IPAddress ip(192, 168, 1, 88); // Declaration adr IP fixe 192.168.1.88
	IPAddress dns(192,168,1,254);
	IPAddress gateway(192,168,1,254);
	IPAddress subnet(255, 255, 255, 0);
	WiFi.config(ip, dns, gateway, subnet);
	WiFi.begin ( ssid, password );
	while ( WiFi.status() != WL_CONNECTED ) { delay ( 500 ); }
	server.on ( "/",  gestionPage );
	server.begin();
}

void loop(){
	server.handleClient();
}
		


accueil electronique

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