Bonjour à tous,
Voici mon projet : créer un bras robot avec 5 servos moteurs ainsi qu'un moteur pas à pas, le tout controllé par un joystick et des boutons.
Problème : le code ne fonctionne pas.
J'ai vérifié les branchements et cela ne semble pas être le problème.
Je pense que le soucis se situe dans l'utilisation de la librairie Adafruit_PWMServoDriver mais étant novice, je ne sais pas le détecter.
Je me permets de préciser que pour l'utilisation de cette dernière j'ai utiliser du code trouvé sur le net (Source), notamment pour les variables pulse_wide et pulse_width et que je comprends pas vraiment ce qu'elles font, surtout pour pulse_width.
Je précise que j'utilise 4 servos moteurs MG996 et un micro servo SG90, le tout controllé avec un PCA9685.
Pour le moteur pas à pas, c'est un Nema 17 avec un DRV8825.
La carte est une Arduino Mega.
Voici mon code (je me doute que j'aurais pu le simplifier en créant une fonction mais ce n'est pas la question) :
#include <AccelStepper.h>
#include <Adafruit_PWMServoDriver.h>
#include <Wire.h>
// Déclaration des broches pour le moteur pas à pas :
#define STEP_PIN 2
#define DIR_PIN 3
// Sensibilité du joystick :
#define JOYSTICK_THRESHOLD 50
#define MIN_PULSE_WIDTH 650
#define MAX_PULSE_WIDTH 2350
#define FREQUENCY 50
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// Déclaration des broches pour le Joystick :
const int joystick_XPin = A0; // Broche analogique pour l'axe X du joystick
// Déclaration des broches pour les boutons
const int joystick_bouton_corpsPin = 8; // Broche numérique pour le bouton du joystick
const int bouton_epaulePin = 9;
const int bouton_coudePin = 10;
const int bouton_poignetHBPin = 11;
const int bouton_poignetGDPin = 12;
const int bouton_mainPin = 13;
bool joystick_bouton_corps_Precedent = HIGH; // État précédent du bouton joystick_bouton_corps_Precedent
bool bouton_epaule_Precedent = HIGH;
bool bouton_coude_Precedent = HIGH;
bool bouton_poignetHB_Precedent = HIGH;
bool bouton_poignetGD_Precedent = HIGH;
bool bouton_main_Precedent = HIGH;
// Déclaration du moteur
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
void setup() {
Serial.begin(9600); // debug
pwm.begin(); // début de la communication
pwm.setPWMFreq(FREQUENCY);
// Mise à l'origine des servos :
pwm.setPWM(0, 0, 0);
pwm.setPWM(1, 0, 0);
pwm.setPWM(2, 0, 0);
pwm.setPWM(3, 0, 0);
pwm.setPWM(4, 0, 0);
// moteur pas à pas, réglages :
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
stepper.setMaxSpeed(1000);
stepper.setAcceleration(500);
// Configuration des boutons
pinMode(joystick_bouton_corpsPin, INPUT_PULLUP);
pinMode(bouton_epaulePin, INPUT_PULLUP);
pinMode(bouton_coudePin, INPUT_PULLUP);
pinMode(bouton_poignetHBPin, INPUT_PULLUP);
pinMode(bouton_poignetGDPin, INPUT_PULLUP);
pinMode(bouton_mainPin, INPUT_PULLUP);
}
void loop() {
int x_data = analogRead(joystick_XPin);
int pulse_wide = map(x_data, 0, 1023, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
int pulse_width = int(float(pulse_wide) / 1000000 * FREQUENCY * 4096);
// Lecture de l'état actuel des boutons
bool etat_joystick_bouton_corps = digitalRead(joystick_bouton_corpsPin);
bool etat_bouton_epaule = digitalRead(bouton_epaulePin);
bool etat_bouton_coude = digitalRead(bouton_coudePin);
bool etat_bouton_poignetHB = digitalRead(bouton_poignetHBPin);
bool etat_bouton_poignetGD = digitalRead(bouton_poignetGDPin);
bool etat_bouton_main = digitalRead(bouton_mainPin);
// ########################## Controle du moteur pas à pas : #######################################
// Vérification si le bouton corps a été cliqué
if (etat_joystick_bouton_corps == LOW && joystick_bouton_corps_Precedent == HIGH) {
// Determine the direction based on the joystick position
if (x_data < 512 - JOYSTICK_THRESHOLD) {
stepper.setSpeed(500); // Set speed for one direction
} else if (x_data > 512 + JOYSTICK_THRESHOLD) {
stepper.setSpeed(-500); // Set speed for the opposite direction
} else {
stepper.setSpeed(0); // Stop the motor if joystick is centered
}
// Step the motor one step
stepper.runSpeed();
// You can add a delay here to control the speed of the motor
delay(10);
}
// #################################################################################################
// ########################## Controle du servo épaule : ###########################################
// Vérification si le bouton épaule a été cliqué
if (etat_bouton_epaule == LOW && bouton_epaule_Precedent == HIGH) {
pwm.setPWM(0, 0, pulse_width);
}
// #################################################################################################
// ########################## Controle du servo coude : ############################################
// Vérification si le bouton coude a été cliqué
if (etat_bouton_coude == LOW && bouton_coude_Precedent == HIGH) {
pwm.setPWM(1, 0, pulse_width);
}
// #################################################################################################
// ########################## Controle du servo poignet Haut/Bas : #################################
// Vérification si le bouton poignet Haut/Bas a été cliqué
if (etat_bouton_poignetHB == LOW && bouton_poignetHB_Precedent == HIGH) {
pwm.setPWM(2, 0, pulse_width);
}
// #################################################################################################
// ########################## Controle du servo poignet Gauche/Droite : ############################
// Vérification si le bouton poignet Gauche/Droite a été cliqué
if (etat_bouton_poignetGD == LOW && bouton_poignetGD_Precedent == HIGH) {
pwm.setPWM(3, 0, pulse_width);
}
// #################################################################################################
// ########################## Controle du servo main : #############################################
// Vérification si le bouton main a été cliqué
if (etat_bouton_main == LOW && bouton_main_Precedent == HIGH) {
pwm.setPWM(4, 0, pulse_width);
}
// #################################################################################################
// Mise à jour de l'état précédent des boutons
joystick_bouton_corps_Precedent = etat_joystick_bouton_corps;
bouton_epaule_Precedent = etat_bouton_epaule;
bouton_coude_Precedent = etat_bouton_coude;
bouton_poignetHB_Precedent = etat_bouton_poignetHB;
bouton_poignetGD_Precedent = etat_bouton_poignetGD;
bouton_main_Precedent = etat_bouton_main;
delay(50); // Délai pour éviter les rebonds des boutons
}
Voici une représentation de mes branchements :