Bonjour à tous,
Je suis sur un projet de pilotage d'un véhicule à faible vitesse qui aura les fonctions suivantes :
- Arrêt du véhicule.
- Relance en avant du véhicule.
- Variation de la vitesse d'avancement.
Ce post porte essentiellement sur la partie variation de vitesse car le reste fonctionne déjà bien.
Le véhicule fonctionne avec un encodeur d'une tension de 5V sur deux canaux. A chaque cran de molette, je change ma tension de 0.13V.
J'ai réalisé un tableau qui répertorie les tensions du canal 1 / canal 2 sur un cycle entier. J'ai converti ces tensions afin d'obtenir les valeurs correspondantes à injecter sur deux DAC 4725.
Lorsque j'allume mon arduino UNO sur ce véhicule via un contacteur, je bascule la variation de vitesse sur mon programme qui prend le relai.
J'aimerais pouvoir rentrer dans les deux tableaux ( canal1 / canal2 ) que j'ai créer à un endroit précis qui correspond aux valeurs que le véhicule comprend dans la fonction :
arretDuVehiculeAuDemarrageDuProgramme();
Et pouvoir lors de l'appel des fonctions simpleClickMonterVitesse(); simpleClickDescenteVitesse(); faire les choses suivantes :
- Monter de 5 valeurs les deux canaux avec la monter de vitesse.
- Descendre de 5 valeurs les deux canaux avec la descente de vitesse.
- Avoir un système qui sait à n'importe quel moment ou il en est.
J'ai commencé à intégrer des éléments tableau et deux boucle For mais je ne pense pas que la syntaxe soit bonne ni le process.
Pouvez vous me donner quelques pistes à exploiter ?
Voici le programme :
#include "OneButton.h"
//------------------ Déclaration du DAC ---------------------------------------
const float tensionVoulueEnSortieCanalUn = 4.95; // Tension souhaitée en sortie du MCP4725, exprimée en volts (entre 0 et 5V)
const float tensionVoulueEnSortieCanalDeux = 4.99; // Tension souhaitée en sortie du MCP4725, exprimée en volts (entre 0 et 5V)
#define adresseI2CduMCP4725CanalUn 0x60
#define adresseI2CduMCP4725CanalDeux 0x61
#define memorisationTensionDeSortieUn false // Si "false", le DAC ajustera sa tension de sortie sans la mémoriser ; si "true", cette valeur sera dispo, même après coupure de courant
#define memorisationTensionDeSortieDeux false // Si "false", le DAC ajustera sa tension de sortie sans la mémoriser ; si "true", cette valeur sera dispo, même après coupure de courant
#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dacSignalUn;
Adafruit_MCP4725 dacSignalDeux;
OneButton boutonMonterVitesseVehicule;
OneButton boutonDescenteVitesseVehicule;
OneButton boutonArretVehicule;
OneButton boutonRelanceVehicule;
const int relaisMonterDescente = 7;
const int relaisInverseur = 2;
const int relaisCanal_A_B_PedaleAccelerateur = 12;
const int relaisParking = 13;
const int valeurFilVertInverseur = 8;
const int valeurFilBlancInverseur = 3;
const int valeurFilBleuInverseur = 4;
const int valeurCanal_A = 5;
const int valeurCanal_B = 6;
// ---------------- Déclaration du tableau de valeur des DAC un et deux ----------------
const int tabeauValeurCanalUn[33] = {400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400, 3500, 3600};
const int tableauValeurCanalDeux[33] = {3600, 3500, 3400, 3300, 3200, 3100, 3000, 2900, 2800, 2700, 2600, 2500, 2400, 2300, 2200, 2100, 2000, 1900, 1800, 1700, 1600, 1500, 1400, 1300, 1200, 1100, 1000, 900, 800, 700, 600, 500, 400};
// _______________________________________________________ SETUP ___________________________________________________________
void setup() {
Serial.begin(115200);
// ------------------ Initialisation des boutons ---------------------
boutonMonterVitesseVehicule.setup(9, INPUT); // PullUp installé sur les quatre boutons
boutonDescenteVitesseVehicule.setup(10, INPUT);
boutonArretVehicule.setup(11, INPUT);
boutonRelanceVehicule.setup(1, INPUT);
boutonMonterVitesseVehicule.attachClick(simpleClickMonterVitesse);
boutonDescenteVitesseVehicule.attachClick(simpleClickDescenteVitesse);
boutonArretVehicule.attachClick(simpleClickArretVehicule);
boutonRelanceVehicule.attachClick(simpleClickRelanceVehicule);
// ------------------ Initialisation des DAC(s) ---------------------
dacSignalUn.begin(0x60); // Démarrage du DAC externe Canal un (le MCP 4725)
dacSignalDeux.begin(0x61); // Démarrage du DAC externe Canal deux (le MCP 4725)
pinMode(relaisMonterDescente, OUTPUT);
pinMode(relaisInverseur, OUTPUT);
pinMode(valeurFilVertInverseur, OUTPUT);
pinMode(valeurFilBlancInverseur, OUTPUT);
pinMode(valeurFilBleuInverseur, OUTPUT);
pinMode(relaisCanal_A_B_PedaleAccelerateur, OUTPUT);
pinMode(relaisParking, OUTPUT);
pinMode(valeurCanal_A, OUTPUT);
pinMode(valeurCanal_B, OUTPUT);
arretDuVehiculeAuDemarrageDuProgramme();
}
// ___________________________________________________________ LOOP _______________________________________________________________________
void loop() {
boutonMonterVitesseVehicule.tick();
boutonDescenteVitesseVehicule.tick();
boutonArretVehicule.tick();
boutonRelanceVehicule.tick();
}
// _________________________________________________________________ FONCTION(S) _____________________________________________________________
void simpleClickMonterVitesse() {
for ( int i = 0; i <= 5; i++ ) {
delay(250);
dacSignalUn.setVoltage(tabeauValeurCanalUn[], true);
dacSignalDeux.setVoltage(tabeauValeurCanalDeux[], true);
}
}
void simpleClickDescenteVitesse() {
for ( int i = 0; i <= 5; i-- ) {
delay(250);
dacSignalUn.setVoltage(tabeauValeurCanalUn[], true);
dacSignalDeux.setVoltage(tabeauValeurCanalDeux[], true);
}
}
void simpleClickArretVehicule() {
analogWrite(valeurCanal_A, 205);
analogWrite(valeurCanal_B, 50);
delay(2000);
digitalWrite(relaisParking, HIGH);
delay(500);
digitalWrite(relaisParking, LOW);
}
void simpleClickRelanceVehicule() {
digitalWrite(relaisInverseur, HIGH);
digitalWrite(valeurFilVertInverseur, LOW);
digitalWrite(valeurFilBlancInverseur, LOW);
digitalWrite(valeurFilBleuInverseur, HIGH);
delay(1000);
digitalWrite(relaisInverseur, LOW);
delay(500);
analogWrite(valeurCanal_A, 205);
analogWrite(valeurCanal_B, 50);
delay(200);
analogWrite(valeurCanal_A, 175); //analogWrite(Valeur_canal_A, 175);
analogWrite(valeurCanal_B, 80); //analogWrite(Valeur_canal_B, 80);
}
void arretDuVehiculeAuDemarrageDuProgramme() {
digitalWrite(relaisInverseur, LOW);
analogWrite(valeurCanal_A, 205);
analogWrite(valeurCanal_B, 50);
digitalWrite(relaisCanal_A_B_PedaleAccelerateur, HIGH);
dacSignalUn.setVoltage(tabeauValeurCanalUn[23], true); // Valeur par défault au démarrage du système ( valeur 2700 du tableau )
dacSignalDeux.setVoltage(tabeauValeurCanalDeux[5], true); // Valeur par défault au démarrage du système ( valeur 3100 du tableau )
digitalWrite (relaisMonterDescente, HIGH);
digitalWrite(relaisParking, HIGH);
delay(2000);
digitalWrite(relaisParking, LOW);
}
Merci par avance pour votre aide.
