Bonsoir,
D'après la doc, le step motor 28BYJ-48 à 64 pas.
Mais avec ce code je mappe assez précisément la position du step motor avec "soi-disant" 2048 ou 4096 pas.
#include <AccelStepper.h>
//#define HALFSTEP 4 //--> 2048 step. Si Halfstep 8 --> 4096 pas
#define motorPin1 10 // IN1 on the ULN2003 driver 1
#define motorPin2 11 // IN2 on the ULN2003 driver 1
#define motorPin3 12 // IN3 on the ULN2003 driver 1
#define motorPin4 13 // IN4 on the ULN2003 driver 1
AccelStepper stepper(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
#define ANALOG_IN A0
int analog_in, positionX;
// the previous reading from the analog input
int previous = 0;
int positionVirtuelle;
void setup()
{
Serial.begin (115200);
stepper.setMaxSpeed(3000);// 15 rpm/ max?
stepper.setAcceleration(100);
}
void loop()
{
// Read new position
analog_in = analogRead(ANALOG_IN);
positionX= map ( analog_in, 0, 1027, 0, 2048); // halpstep 4
// positionX= map ( analog_in, 0, 1027, 0, 4096); // halpstep 8
}
stepper.setAcceleration(100);
// stepper.moveTo(positionVirtuelle);
stepper.moveTo(positionX);
stepper.setSpeed(3000);
stepper.runSpeedToPosition();
// remember the previous value of the sensor
previous = positionX;
Serial.print ( "A0: " ) , Serial.println ( analog_in );
Serial.print ( "posX: " ) , Serial.println ( positionX );
Serial.print ( "previous" ) , Serial.println ( previous );
}
Le moteur fait bien une revolution complète.
J'ai essayé de reprogrammé selon les conseils de J-M-L et j'ai changé les uint_8 par de simples int.
receiveData(); // receive data from Processing
// processingPosition= w4; // Jonathan
// positionX += computeDeltaPosition(processingPosition);
// JML
// analog_in= w4; //(position du moteur simulé dans PROCESSING allant de 0 à 4096 qui retourne à 0 au second tour)
// ON PEUT AUSSI DIRE DANS PROCESSING QUE LES POSITIONS DU MOTEUR VONT DE 0 à 4095 mais ça change rien.
// positionX= map ( analog_in, 0, 4096, 0, 2048);
positionX= w4; // conseil de J-M-L je ne re-mappe pas.
// previousX = positionX;
// Serial.print ( "posX" ) , Serial.println ( positionX );
// Serial.print ( "prevoiusX" ) , Serial.println ( previousX );
// propos de JML mal traduit?
// CAS 1
if (positionX > previousX) {
int i =+ (positionX-previousX);
stepper.moveTo(i);
//stepper.moveTo(positionX);
stepper.setAcceleration(10);
stepper.setSpeed(1000);
stepper.runSpeedToPosition();
Serial.print ( "Distance Positive: " ) , Serial.println (i );
Serial.print ( "previousX: " ) , Serial.println ( previousX );
previousX = positionX;
}
// CAS 2 // je suis à 4090 puis 4080
if ( previousX > positionX ) {
recule = previousX-positionX;
avance = (4096-positionX)+previousX;
if (recule < avance) {
int j =- recule;
stepper.moveTo(j);
stepper.setAcceleration(10);
stepper.setSpeed(1000);
stepper.runSpeedToPosition();
Serial.print ( "recule: " ) , Serial.println (recule);
Serial.print ( "previousX: " ) , Serial.println (previousX);
previousX = positionX;
}
}
// CAS 2 bis // je suis à 4090 puis à 2
if (previousX > positionX ) {
recule = previousX-positionX;
avance = (4096-previousX)+positionX; // avance de 6 (de 4090 à 4096) +3 (0 à 3) pas
if (avance < recule) {
int k =+ avance;
stepper.moveTo(k);
stepper.setAcceleration(10);
stepper.setSpeed(1000);
stepper.runSpeedToPosition();
Serial.print ( "avance: " ) , Serial.println (avance);
Serial.print ( "previousX: " ) , Serial.println (previousX);
previousX = positionX;
}
}
//cas 3
if (positionX == previousX) {
Serial.println ("doNothing");
previousX = positionX;
}
Serial.print ( "posX" ) , Serial.println ( positionX );
//***** MOTEUR FONCTIONNE sans les cas 1,2 et 3
stepper.moveTo(positionX);
stepper.setAcceleration(100);
stepper.setSpeed(1000);
stepper.runSpeedToPosition();
Malheureusement, ça n'a rien changé..