Motor de passo bipolar + L293D + arduino

Boa tarde.

Gostaria de ajuda.

Estou com um motor de passo de DVD bipolar ligado em um L293D, consigo girar para um lado e para outro.

O problema esta quando tento faze-lo "andar" 1 passo para frente ou para trás, ou vários passo através de comando pelo Serial.read.

Gostaria de puder controlar passo a passo com um comando "s" (sobe) "d" (desce).

Por favor corrijam meu código.

Agradeço desde já.

Fernando

//
// Motor CD + L293d + serial
//

//
int IN1 = 10;
int IN2 = 11;
int IN3 = 12;
int IN4 = 13;

int x = 1;
int y = 1;
int tempo = 100;

void setup()

{
Serial.begin(9600); // Abre conexão serial e define a taxa de transmissão em 9.600kbps
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);

}

void loop(){

if (Serial.available() > 0) { // verifica serial
char data = Serial.read(); // lê o byte na serial

if (data == 'd') {

Para_Frente();
if (x == 4) {
x = 1;
}
x++;
}

if (data == 'e') {

Para_Traz();
if (y == 4) {
y = 1;
}
y++;
}

data = ' ';
delay(100);

}
}

//
void Para_Frente() {

if (x == 1) {
// Passo 1
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
digitalWrite(IN3, 0);
digitalWrite(IN4, 1);
delay(tempo);
}

if (x == 2) {
// Passo 2
digitalWrite(IN1, 0); //0
digitalWrite(IN2, 1); //1
digitalWrite(IN3, 0); //0
digitalWrite(IN4, 1); //1
delay(tempo);
}

if (x == 3) {
// Passo 3
digitalWrite(IN1, 0);
digitalWrite(IN2, 1);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
delay(tempo);
}

if (x == 4) {
// Passo 4
digitalWrite(IN1, 1); //1
digitalWrite(IN2, 0); //0
digitalWrite(IN3, 1); //1
digitalWrite(IN4, 0); //0
delay(tempo);
}

Serial.print(x);

}

//
void Para_Traz() {

// Passo 1
if (y == 1) {
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
delay(tempo);
}

// Passo 2
if (y == 2) {
digitalWrite(IN1, 0);
digitalWrite(IN2, 1);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
delay(tempo);
}

if (y == 3) {
// Passo 3
digitalWrite(IN1, 0);
digitalWrite(IN2, 1);
digitalWrite(IN3, 0);
digitalWrite(IN4, 1);
delay(tempo);
}

if (y == 4) {
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
digitalWrite(IN3, 0);
digitalWrite(IN4, 1);
delay(tempo);
}

Serial.print(y);
}

Qual é exactamente o problema? Qual foi o programa com que fez girar o motor para um lado e para o outro? Já agora, no fórum, utilize as code tags para postar o seu código:

olá amigo

Quero digitar "f" e o motor avançar 1 passo para frente ou "r" e o motor retroceder 1 passo para traz .

O código de origem (em italiano) está abaixo, ele move o motor para frete e para traz, mas vários passos.

Agradeço pela sua atenção.

Fernando

//
// Motor CD L293d
//


//declaration of PINS that connected the wire to motor
int nero    = 13;
int marrone = 12;
int arancio = 11;
int giallo  = 10;

//this is the time to wait in every single step
int delayTime = 100; // 100
                 
//set the pin for OUTPUT
void setup() {
  pinMode(nero, OUTPUT);
  pinMode(marrone, OUTPUT);
  pinMode(giallo, OUTPUT);
  pinMode(arancio, OUTPUT);
}

void loop() {
  forward(13);
  delay(100);
  backward(13);
}

void forward(int steps){
  for(int i=0;i<steps;i++){
// in every phase 2 wires is up and 2 is down
    digitalWrite(nero, LOW);
    digitalWrite(marrone, HIGH);
    digitalWrite(arancio, HIGH);
    digitalWrite(giallo, LOW);
    delay(delayTime);
  
    digitalWrite(nero, LOW);
    digitalWrite(marrone, HIGH);
    digitalWrite(arancio, LOW);
    digitalWrite(giallo, HIGH);
    delay(delayTime);
  
    digitalWrite(nero, HIGH);
    digitalWrite(marrone, LOW);
    digitalWrite(arancio, LOW);
    digitalWrite(giallo, HIGH);
    delay(delayTime);
  
    digitalWrite(nero, HIGH);
    digitalWrite(marrone, LOW);
    digitalWrite(arancio, HIGH);
    digitalWrite(giallo, LOW);
    delay(delayTime);}
}

void backward (int steps){
  for(int i=0;i<steps;i++){
    digitalWrite(nero, HIGH);
    digitalWrite(marrone, LOW);
    digitalWrite(arancio, HIGH);
    digitalWrite(giallo, LOW);
    delay(delayTime);
  
    digitalWrite(nero, HIGH);
    digitalWrite(marrone, LOW);
    digitalWrite(arancio, LOW);
    digitalWrite(giallo, HIGH);
    delay(delayTime);
  
     digitalWrite(nero, LOW);
     digitalWrite(marrone, HIGH);
     digitalWrite(arancio, LOW);
     digitalWrite(giallo, HIGH);
     delay(delayTime);
  
     digitalWrite(nero, LOW);
     digitalWrite(marrone, HIGH);
     digitalWrite(arancio, HIGH);
     digitalWrite(giallo, LOW);
     delay(delayTime);
  }

}

A função forward tem como parâmetro o numero de passos... Se trocares treze por um, ele dá só um passo.

Se quando receberes um f chamares a função forward(1), o teu problema fica resolvido.

Amigo muito obrigado.

Um feliz ano novo.