TIPE - stabiliser une planche

Bonjour,

Je suis étudiant et dans le cadre du TIPE je dois réaliser une planche qui se stabilise sur un pied de table (répartition de masse), sur un seul axe. Pour cela, il y a un guidage linéaire à l'intérieur et un système pignon crémaillère alimenté par un moteur. La carte Arduino est associée à un moteur shield pour faire tourner le moteur dans les deux sens.

L'angle entre la table et le pied est donné par un accéléromètre (modèle ADXL355), et comme l'on fait que sur un axe, on n'a besoin que de l'etude de l'axe z (n'est ce pas?).

Toutefois, depuis quelques semaines, on bloque sur le programme... En effet, le programme pour faire tourner le moteur dans un sens ou l'autre est opérationnel, mais lorsque l'on souhaite l'associer à la variation de l'angle à l'aide de "if", cela ne fonctionne plus...

Le problème vient donc surement soit du branchement, soit du programme final mais introuvable..

C'est pour cela que je suis ici car le TIPE approche très vite, et on bloque à mort.. donc toute lumière pouvant nous éclairer est bienvenue ! :slight_smile:

Merci !
Timothée.

PS : ci-joint schéma du branchement, du montage électronique, le programme pour faire tourner le moteur avant/arrière (opérationnel), et le programme final ou l'on bloque.

Sketchfinal.ino (1.78 KB)

Testsensmoteur.ino (829 Bytes)

1 ER CODE : test du sens du moteur

void setup() {
  
  //Setup Channel A
  pinMode(12, OUTPUT); //Initiates Motor Channel A pin
  pinMode(9, OUTPUT); //Initiates Brake Channel A pin
  
}

void loop(){
  
  //forward @ full speed
  digitalWrite(12, HIGH); //Establishes forward direction of Channel A
  digitalWrite(9, LOW);   //Disengage the Brake for Channel A
  analogWrite(3, 123);   //Spins the motor on Channel A at half speed
  
  delay(3000);
  
  digitalWrite(9, HIGH); //Eengage the Brake for Channel A

  delay(1000);
  
  //backward @ half speed
  digitalWrite(12, LOW); //Establishes backward direction of Channel A
  digitalWrite(9, LOW);   //Disengage the Brake for Channel A
  analogWrite(3, 123);   //Spins the motor on Channel A at half speed
  
  delay(3000);
  
  digitalWrite(9, HIGH); //Eengage the Brake for Channel A
  
  delay(1000);
  
}

2E CODE : PROGRAMME FINAL

// constantes pour les broches
const int groundpin = 18;             
const int powerpin = 19;              
const int xpin = A3;                  // axe x
const int ypin = A2;                  // axe y
const int zpin = A1;                  // axe z

// constantes pour le moteur
const int 
PWM_A   = 3,
DIR_A   = 12,
BRAKE_A = 9;

void setup() {
  // configuration de la sortie A
  pinMode(BRAKE_A, OUTPUT);  // broche de frein : canal A
  pinMode(DIR_A, OUTPUT);    // broche de direction : canal A

  // commencer les communications en série
  Serial.begin(9600);
}

void loop() {
  // affichage des valeurs du senseur (x, y pas utiles)
  Serial.print(analogRead(xpin));
  // afficher un onglet entre les valeurs:
  Serial.print("\t");
  Serial.print(analogRead(ypin));
  // afficher un onglet entre les valeurs:
  Serial.print("\t");
  Serial.print(analogRead(zpin));
  Serial.println();
  // delai avant reactualisation (1000=1s):
  delay(100);

  // creation de la boucle "while":
  if (Serial.print(analogRead(zpin) < 0))
  { //en avant
  digitalWrite(BRAKE_A, LOW);  // Regler le frein en LOW empêche le frein du moteur    
  digitalWrite(DIR_A, HIGH);   // Regler la direction sur HIGH fait tourner le moteur vers l'avant

  analogWrite(PWM_A, 123);     // Reglage de la vitesse du moteur (max = 255)


  }
  if (Serial.print(analogRead(zpin) > 0))
  { //en arrière
  digitalWrite(BRAKE_A, LOW);  // Configurer le train en LOW pour empecher le frein du moteur
  digitalWrite(DIR_A, LOW);    // Regler la direction sur LOW fait tourner le moteur vers l'arriere

  analogWrite(PWM_A, 123);     // régler la vitesse du moteur

  }
  else
  { //arrêt
  analogWrite(PWM_A, 0);       // eteindre le moteur
  }
  digitalWrite(9, HIGH); //Eengage the Brake for Channel A

  while(1);  
}

Bonjour,

Déjà, il faut supprimer l'instruction "while(1);" qui fait entrer le programme dans une boucle infinie.
Loop() contient déjà un while() qui est masqué, si tu rajoute un while(1), ta loop ne sera exécutée qu'une seule fois.

Ah effectivement, je n'avais pas prêté attention à ce détail. Merci!

Que dois-je corriger d'autre?

Quoi corriger?

A mon avis le système sera instable (pompage) il faudra peut-être envisager l'utilisation d'un asservissement de type PID.

Pour optimiser ton programme dans un premier temps je te conseille d'augmenter la vitesse de transmission sur le port série ( 115200) pour diminuer la perte de temps.
Faire une seule acquisition par boucle des entrées analogiques (inutile de répéter analogRead()).
Ensuite voir comment répond le système et analyser les résultats.

Merci pour ces reponses !

Toutefois j'ai qques petits autres détails à régler : l'utilisation du "if" est elle bien celle a utiliser ou bien devrais je faire une boucle while? while if?

Et ne faut il pas que j'initialise l'accéléromètre au début ou autre chose? J'ai mis 0 mais je suis sûr que la position initiale de l'accéléromètre n'est pas à (0,0,0)...

Merci !