Bonjour à toutes et à tous, je travail sur un petit robot avec 3 servomoteurs permettant de déplacer un stylo sur les axes X Y et Z.
Sur la photo :
le servomoteur 1 : axe Z sur pin 6
le servomoteur 2 : axe Y sur pin 5
le servomoteur 3 : axe X sur pin 3
Les servomoteur sont en liaison pignon-crémaillère (3 fois la même)
Je voudrais faire un "M" :
Avec le code ci-dessous le M se fait correctement :
#include <Servo.h>
Servo servoX, servoY, servoZ;
const int servoXPin = 3; // Axe X
const int servoYPin = 5; // Axe Y
const int servoZPin = 6; // Axe Z
const int penUp = 120; // Position stylo relevé
const int penDown = 70; // Position stylo abaissé
const int startX = 90; // Position de départ (axe X, bas)
const int startY = 90; // Position de départ (axe Y, gauche)
const int topX = 150; // Position en haut (axe X)
const int centerY = 120; // Centre de "M" (axe Y)
const int centerX = 120; // Centre de "M" (axe X)
const int rightY = 150; // Droite de "M" (axe Y)
const int stepDelay = 20; // Délai entre chaque étape (ms)
const int stepSize = 1; // Incrément de déplacement (degrés)
void stylhaut() {
servoZ.write(penUp);
delay(1000);
}
void stylbas() {
servoZ.write(penDown);
delay(1000);
}
void moveTo(int targetX, int targetY) {
static int currentX = startX;
static int currentY = startY;
while (currentX != targetX || currentY != targetY) {
if (currentX != targetX) {
int stepX = (targetX > currentX) ? stepSize : -stepSize;
currentX += stepX;
if ((stepX > 0 && currentX > targetX) || (stepX < 0 && currentX < targetX)) {
currentX = targetX;
}
servoX.write(currentX);
}
if (currentY != targetY) {
int stepY = (targetY > currentY) ? stepSize : -stepSize;
currentY += stepY;
if ((stepY > 0 && currentY > targetY) || (stepY < 0 && currentY < targetY)) {
currentY = targetY;
}
servoY.write(currentY);
}
delay(stepDelay);
}
}
void setup() {
servoX.attach(servoXPin);
servoY.attach(servoYPin);
servoZ.attach(servoZPin);
moveTo(startX, startY);
}
void loop() {
stylhaut();
moveTo(startX, startY);
stylbas();
moveTo(topX, startY);
moveTo(centerX, centerY);
moveTo(topX, rightY);
moveTo(startX, rightY);
stylhaut();
moveTo(startX, startY);
while (true);
}
Mais j'aimerais alors modifier ce code pour faire un M plus grand mais lorsque je modifie mes valeur, 2 cas :
entre 90 et 180° pas de problème
mais si je descend une valeur en dessous de 90°, j'obtiens cette forme :
(startX et startY = 50°, centerX et centerY = 90°, topX et rightY = 130°)
je suis parti du principe que les point sont positionnés comme ceci : (le robot se trouve en centerY topX comme sur les photos des M)
_________startY_____centerY______rightY
startX____O___________O____________O
centerX__O___________O____________O
topX_____O___________O____________O
Auriez-vous une solution ?
PS : je suis débutant en arduino et je me suis beaucoup aidé de chatgpt... j'ai déchiffré chaque lignes du code et je pense le comprendre mais je bloque sur ce détail.
Merci de votre aide sur ce sujet qui est un peu long.