autobed et niveau automatique

bonjour,
un projet inutile donc indispensable, une fois de plus :slight_smile:
le but étant pour une cnc d'avoir un plateau à l'horizontal et pouvoir usiner ne pièce non plate.
au lieu d'utiliser un axe couplé pour ce genre de pièce, car infaisable, j'ai pensé a faire un montage DIY.

composants
un uno
un gyro GY-521
un capteur sharp IR
un shield sainsmart motor
2 moteurs de récup imprimante.

reste a faire tout le montage, mais cela fonctionne
d'autres modifs vont arriver

décomposition du programme :
initialisation des composants
mise à l'horizontale du plateau
usinage
mise à distance de la pièce en permanence

le programme, un peu crade, vite fait

#include <MPU6050.h>
#include <I2Cdev.h>
#include "Wire.h"
#include <AFMotor.h>

AF_Stepper motor(48, 2); // M3-M4
AF_Stepper motor1(48, 1); // M1-M2

MPU6050 mpu;

int16_t ax, ay, az;
int16_t gx, gy, gz;

MPU6050 accelgyro;

int val;
int prevVal;
#define sonde A0

void setup()
{
  Wire.begin();
  Serial.begin(115200);

  Serial.println("Initialize MPU");
  mpu.initialize();
  Serial.println(mpu.testConnection() ? "Connected" : "Connection failed");
  motor.setSpeed(200);  // 10 rpm  
  motor1.setSpeed(200);  // 10 rpm  
  pinMode(sonde, INPUT);
  
  // initialisation du gyro pour vérif
  for (int i=0; i!=10;i++){
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    ax = map(ax, -32767, 32767, -255, 255);
    ay = map(ay, -32767, 32767, -255, 255);
    az = map(az, -32767, 32767, -255, 255);
    Serial.print("X : ");
    Serial.print(ax);
    Serial.print(" Y : ");
    Serial.println(ay); 
    delay(500);
  }
  Serial.print("Calibration horizontale");
  horizontal();;

}

void loop()
{
int sonde1 = analogRead(sonde);
Serial.println(sonde1);
if(sonde1 < 700) {
  Serial.println("Descend");
  motor1.step(1, FORWARD , SINGLE);
}
if(sonde1 > 720) {
    Serial.println("Monte");
    motor1.step(1, BACKWARD , SINGLE);

}
  delay(100);
}

// mise a niveau du plateau
void horizontal(){


    while(ax!=0 || ay!=0){ 
  accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  ax = map(ax, -32767, 32767, -255, 255);
  ay = map(ay, -32767, 32767, -255, 255);
  az = map(az, -32767, 32767, -255, 255);
  Serial.print(ax); 
  Serial.print("\t");
  Serial.print(ay); 
  Serial.print("\t");
  Serial.print(ay); 
  Serial.print("\t");
  Serial.print(az); 
  Serial.print("\t");
  Serial.print(gx); 
  Serial.print("\t");
  Serial.print(gy); 
  Serial.print("\t");
  Serial.print(gz); 
  Serial.print("\t\n"); 
 
  if (ay < -1)     motor1.step(1, BACKWARD, INTERLEAVE); 
  if (ay > 1)     motor1.step(1, FORWARD, INTERLEAVE); 

  if (ax < -1)     motor.step(1, BACKWARD, INTERLEAVE); 
  if (ax > 1)     motor.step(1, FORWARD, INTERLEAVE); 
delay(100);
  }
}

amusez vous :wink:

J'ai lu à plusieurs endroits que ces gyros sont très sensibles. J'ai un ADXL345 (ça et je capte les pas de ma copine tout près.. :sunglasses:

Est-ce que les vibrations de l'outil affectent la précision?

pour mes tests, j'ai pris en main le gyro, bon je tremble pas, mais ils sont un peu sensibles, mais ca gère.
j'avais déjà fait la même chose pour un début de projet pour mettre un télescope en station mise à niveau, mais faute de temps, laissé à l'abandon pour le moment.
si tu as remarqué, j'ai fait une sorte hystérie en prenant une fourchette de -1 à 1 en strict donc -2 +2.
ca me permet de stabiliser et d'arrêter le moteur sans problème.

de plus, la mise à niveau se fait avant le début usinage, donc moteur éteint.
dis à ta copine de changer de chaussures :slight_smile: et mettre des charentaises au lieu de talon compensé :slight_smile: :wink:

"en strict"..? :roll_eyes: Est-ce la différence ( >700 / <720) de la "précision" dudit "point 0"?.. C'est.. euh, ça cause une.. voyons, j'arrive pas à formuler ma question.. :stuck_out_tongue_closed_eyes:

Je croyais que le gyro servait à définir la position du plan de travail par-rapport à la position (x0,y0,z0) de l'outil pendant le travail et que l'outil était fixe, que le plan de travail bougeait dans les 3 axes..

Je garde cet exemple pour explorations ultérieures.. en voler quelques bribes et désingénieuriser tout ça afin d'avoir une façon (de plus) d'interpréter et de traiter les données du gyro et de tranposer ça en contrôle moteur!

:cold_sweat: ...je saute des étapes, je sais.. !!

Oh et pour ses talons, je dirais que le trouble vient du soutif.. Mais svp, sachez qu'est loin de moi l'idée de m'en plaindre..

c'est l'objet a usiner qui bouge sur les axes en plus de l'outil qui bouge aussi sur ses axes :slight_smile:
le but étant de pouvoir travailler une pièce qui n'est pas forcément ronde, auquel cas, j'aurai utilisé le 4eme axe couplé à X ouY de l'outil.
la marge 700-720 est là uniquement pour éviter des mouvements en permanence des moteurs de l'objet qui pourrait partir en vrille à un moment :wink:

tu peux prendre ce que tu veux dans le code, c'est là pour ca.
prochaine étape, rajouter des boutons pour mettre automatiquement après appuie, l'objet dans la bonne position et définir le point zéro en gros.

achète lui des élastiques qui ne lachent pas quand elle marche :slight_smile: