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.
/*
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();
}
#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();
}