Bonjour, je travaille sur un projet de scanner 3D et j'ai à réaliser une interface graphique en python. J'aimerai donc qu'il y ai sur cette interface plusieurs boutons qui lancent des fonctions arduino.
Par exemple, un bouton "Lancer l'acquisition" enverrai une valeur sur le port série et Arduino de son côté s'occuperait de lancer le scan si la bonne donnée est reçue. Je ne sais pas trop comment m'y prendre, voici mon code:
#include <Arduino.h>
#include "BasicStepperDriver.h"
#include "MultiDriver.h"
#include "SyncDriver.h"
// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
#define MOTOR_STEPS 200
// Target RPM for X axis motor
#define MOTOR_X_RPM 750
// Target RPM for Y axis motor
#define MOTOR_Y_RPM 2000
// Y motor
#define DIR_Y 48
#define STEP_Y 46
#define SLEEP_Y 62
#define ENDSTOP_Y 18
// X motor
#define DIR_X 55
#define STEP_X 54
#define SLEEP_X 38
#define ENDSTOP_X 3
#define MICROSTEPS 2
int Capteur_distance = A5;
int x=0;
int y=0;
int DemandeScan = 0;
BasicStepperDriver stepperX(MOTOR_STEPS, DIR_X, STEP_X, SLEEP_X);
BasicStepperDriver stepperY(MOTOR_STEPS, DIR_Y, STEP_Y, SLEEP_Y);
void setup() {
stepperX.begin(MOTOR_X_RPM, MICROSTEPS);
stepperY.begin(MOTOR_Y_RPM, MICROSTEPS);
stepperX.setEnableActiveState(LOW);
stepperY.setEnableActiveState(LOW);
Serial.begin(9600);
pinMode(ENDSTOP_X, INPUT_PULLUP);
pinMode(ENDSTOP_Y, INPUT_PULLUP);
}
void loop() {
Serial.println("-------Bienvenue-------");
delay(2000);
Serial.println("-------Calibrage en cours-------");
int EtatX=digitalRead(ENDSTOP_X);
int EtatY=digitalRead(ENDSTOP_Y);
if(EtatX == HIGH){
retourX();
}
if(EtatY == HIGH){
retourY();
}
Serial.println("-------Calibrage effectué-------");
Serial.println("-------En attente de scan-------");
delay(2000);
while(DemandeScan ==0){
delay(50);
}
scan();
}
void retourX(){
stepperX.setEnableActiveState(LOW);
stepperX.enable();
while(digitalRead(ENDSTOP_X) == HIGH)
{
stepperX.move(MOTOR_STEPS*MICROSTEPS);
}
stepperX.move(-MOTOR_STEPS*MICROSTEPS*4);
stepperX.disable();
stepperX.setEnableActiveState(HIGH);
x=0;
}
void retourY(){
stepperY.setEnableActiveState(LOW);
stepperY.enable();
while(digitalRead(ENDSTOP_Y) == HIGH){
stepperY.move(MOTOR_STEPS*MICROSTEPS);
}
stepperY.disable();
stepperY.setEnableActiveState(HIGH);
y=0;
}
void scan(){
Serial.println("-------Scan debuté-------");
for (int i = 0; i < 31; i=i+1){
for (int i = 0; i < 31; i=i+1){
float volts = analogRead(Capteur_distance) * 0.0048828125;
float distance = ((2.31584292213234-volts)/0.034554240563698);
Serial.print("X= ");
Serial.print(x);
Serial.print(" Y= ");
Serial.print(y);
Serial.print(" Z=");
Serial.println(distance);
stepperX.setEnableActiveState(LOW);
stepperX.enable();
stepperX.move(-MOTOR_STEPS*MICROSTEPS);
stepperX.disable();
stepperX.setEnableActiveState(HIGH);
delay(500);
x=x+1;
}
retourX();
stepperY.setEnableActiveState(LOW);
stepperY.enable();
stepperY.move(-MOTOR_STEPS*MICROSTEPS*536);
stepperY.disable();
stepperY.setEnableActiveState(HIGH);
delay(500);
y=y+1;
}
retourY();
DemandeScan =0;
Serial.println("-------Scan fini-------");
}
La fonction sendReply() envoie une commande à l'ARDUINO.
Tout en bas, le code pour ouvrir la ligne série.
Si tu es sous Windows remplace '/dev/ttyUSB1' par 'COMX', X étant le numéro du port.