[SOLUCIONADO]No entiendo este programa que mueve dos motores para un coche

Hola a todos,

Estoy empezando con esto y me lio un poco.

He comprado a mi hijo un tanque. Después de armarlo no entendemos el comportamiento de los dos motores que mueve las dos orugas.

Con este código va hacia delante y retrocede después. Y los motores no están sincronizados.

No soy capaz de entender nada, la verdad.

int E1 = 3; 
int M1 = 12;
int E2 = 11;
int M2 = 13; 
//int Led =3;

void setup()
{
  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);
  //pinMode(Led, OUTPUT);
}

void loop()
{
  //pinMode(Led,INPUT);
  digitalWrite(M1, HIGH);
  digitalWrite(M2, HIGH);
  analogWrite(E1, 200);   //PWM speed regulation
  analogWrite(E2, 200);   //PWM speed regulation
  delay(1000);
  //pinMode(Led,OUTPUT);
  digitalWrite(M1, LOW);
  digitalWrite(M2, LOW);
  analogWrite(E1, 200);   //PWM speed regulation
  analogWrite(E2, 200);   //PWM speed regulation
  delay(1000);
}

El robot en cuestión es este:
http://wiki.keyestudio.com/index.php/Ks0071_keyestudio_Mini_Tank_Robot

¿que hace este código?
Alguien me lo podría explicar.

Muchísimas gracias a todos

Hola,

No conozco el robot pero el codigo es sencillo. Primero define cuatros salidas. M1, M2, E1 y E2 y les asigna un numero. Abajo veras en el codigo por ejemplo DigitalWrite(M1,HIGH) Remplaza M1 por el valor 12 asignado al principio y tendras DigitalWrite(12,HIGH), eso quiere decir que al pin 12 se le asigna un estado alto. Es un pin digital solo puede estar en HIGH o en LOW.

Luego todo esta en un loop que se repite siempre. Veras que hace unas cosas, tiene un delay(1000) y luego hace otras con un nuevo delay(1000). Delay(1000) quiere decir que espere un segundo (1000 milisegundos).

Basado en lo que dices que hace entiendo que al al poner los dos motores en HIGH va hacia un lado y cuando estan el LOW va hacia el otro. AnalogWritre(pin,200) sera intensidad que le aplica al motor. A cada motor le llegaran dos pin, el M que lo usara para el sentido y el E que lo usara para la intendad. Cambia 200 por valores entre 0 y 255 y veras como afecta a la velocidad del motor.

Saludos.

Muchas gracias por la explicación.

El uso de variables si lo conozco.

cas6678:
Basado en lo que dices que hace entiendo que al al poner los dos motores en HIGH va hacia un lado y cuando estan el LOW va hacia el otro. AnalogWritre(pin,200) sera intensidad que le aplica al motor. A cada motor le llegaran dos pin, el M que lo usara para el sentido y el E que lo usara para la intendad. Cambia 200 por valores entre 0 y 255 y veras como afecta a la velocidad del motor.

Pues eso es lo que yo entiendo pero no es así:

Si quito la parte de LOW, entiendo que solo avanza peor no es asi.

Con este código

int E1 = 3; 
int M1 = 12;
int E2 = 11;
int M2 = 13; 
//int Led =3;

void setup()
{
 pinMode(M1, OUTPUT);
 pinMode(M2, OUTPUT);
 //pinMode(Led, OUTPUT);
}

void loop()
{
 //pinMode(Led,INPUT);
 digitalWrite(M1, HIGH);
 digitalWrite(M2, HIGH);
 analogWrite(E1, 200);   //PWM speed regulation
 analogWrite(E2, 200);   //PWM speed regulation
 delay(1000);
 //pinMode(Led,OUTPUT);

}

no hace nada.

Muchas gracias cas6678

Bueno, creo que ya se que pasa.

No hay nada como consultar el manual :-))

Te pego el código que viene. Modificando este ha he conseguido que haga algo mas:

#include <Servo.h> 
int pinLB = 12;     // define pin 12 
int pinLF = 3;     // define pin 3 
int pinRB = 13;    // define pin 13 
int pinRF = 11;    // define pin 11 
////////////////////////////////
int inputPin = 4;    // define pin for sensor echo
int outputPin =5;    // define pin for sensor trig

int Fspeedd = 0;      // forward speed
int Rspeedd = 0;      // right speed
int Lspeedd = 0;      // left speed
int directionn = 0;   // forward=8 backward=2 left=4 right=6 
Servo myservo;        // set myservo
int delay_time = 250; // settling time after steering servo motor moving B
int Fgo = 8;         // Move F
int Rgo = 6;         // move to the R
int Lgo = 4;         // move to the L
int Bgo = 2;         // move B
void setup()
{
 Serial.begin(9600);     // Define motor output pin 
 pinMode(pinLB,OUTPUT); // pin 12
 pinMode(pinLF,OUTPUT); // pin 3 (PWM)
 pinMode(pinRB,OUTPUT); // pin 13
 pinMode(pinRF,OUTPUT); // pin 11 (PWM) 
 pinMode(inputPin, INPUT);    // define input pin for sensor
 pinMode(outputPin, OUTPUT);  // define output pin for sensor   
 myservo.attach(9);    // Define servo motor output pin to D9 (PWM)
}
void advance()     // move forward
   { 
   digitalWrite(pinLB,LOW);    // right wheel moves forward
digitalWrite(pinRB, LOW);  // left wheel moves forward
   analogWrite(pinLF,255);   
   analogWrite(pinRF,255);
   }
void stopp()         // stop 
   {
    digitalWrite(pinLB,HIGH);
    digitalWrite(pinRB,HIGH);
    analogWrite(pinLF,0);
    analogWrite(pinRF,0); 
   }
void right()        // turn right (single wheel)
   {
  digitalWrite(pinLB,HIGH);  // wheel on the left moves forward
  digitalWrite(pinRB,LOW); // wheel on the right moves backward
  analogWrite(pinLF, 255);
  analogWrite(pinRF,255);   
   }
void left()         // turn left (single wheel)
   {
  digitalWrite(pinLB,LOW);  // wheel on the left moves backward
  digitalWrite(pinRB,HIGH); // wheel on the right moves forward
  analogWrite(pinLF, 255);
  analogWrite(pinRF,255);  
   }
 
void back()          // move backward
   {
    digitalWrite(pinLB,HIGH);  // motor moves to left rear
    digitalWrite(pinRB,HIGH);  // motor moves to right rear
    analogWrite(pinLF,255);  
    analogWrite(pinRF,255);     
   }
void detection()        // measure 3 angles (0.90.179)
   {      
     int delay_time = 250;   // stabilizing time for servo motor after moving backward
     ask_pin_F();            // read the distance ahead
    if(Fspeedd < 10)         // if distance ahead is <10cm
     {
     stopp();               // clear data 
     delay(100);
     back();                // move backward for 0.2S
     delay(200);
     }       
     if(Fspeedd < 25)         // if distance ahead is <25cm
     {
       stopp();  
       delay(100);             // clear data 
       ask_pin_L();            // read distance on the left
       delay(delay_time);      // stabilizing time for servo motor
       ask_pin_R();            // read distance on the right  
       delay(delay_time);      // stabilizing time for servo motor  
       
       if(Lspeedd > Rspeedd)   // if distance on the left is >distance on the right
       {
         directionn = Lgo;      // move to the L
       }
       
       if(Lspeedd <= Rspeedd)   // if distance on the left is <= distance on the right
       {
        directionn = Rgo;      // move to the right
       } 
        if (Lspeedd < 10 && Rspeedd < 10)   // if distance on left and right are both <10cm
       {
        directionn = Bgo;      // move backward        
       }}
     else                      // if distance ahead is >25cm     
     {
       directionn = Fgo;        // move forward      
     }}    
void ask_pin_F()   // measure the distance ahead 
   {
     myservo.write(90);
     digitalWrite(outputPin, LOW);   // ultrasonic sensor transmit low level signal 2μs
     delayMicroseconds(2);
     digitalWrite(outputPin, HIGH);  // ultrasonic sensor transmit high level signal10μs, at least 10μs
     delayMicroseconds(10);
     digitalWrite(outputPin, LOW);    // keep transmitting low level signal
     float Fdistance = pulseIn(inputPin, HIGH);  // read the time in between
     Fdistance= Fdistance/5.8/10;       // convert time into distance (unit: cm) 
     Fspeedd = Fdistance;              // read the distance into Fspeedd
   }  
void ask_pin_L()   // measure distance on the left 
   {
     myservo.write(5);
     delay(delay_time);
     digitalWrite(outputPin, LOW);   // ultrasonic sensor transmit low level signal 2μs
     delayMicroseconds(2);
     digitalWrite(outputPin, HIGH);  // ultrasonic sensor transmit high level signal10μs, at least 10μs
     delayMicroseconds(10);
     digitalWrite(outputPin, LOW);    // keep transmitting low level signal
     float Ldistance = pulseIn(inputPin, HIGH);  // read the time in between
     Ldistance= Ldistance/5.8/10;       // convert time into distance (unit: cm)
     Lspeedd = Ldistance;              // read the distance into Lspeedd
   }  
void ask_pin_R()   //  measure distance on the right 
   {
     myservo.write(177);
     delay(delay_time);
     digitalWrite(outputPin, LOW);   // ultrasonic sensor transmit low level signal 2μs
     delayMicroseconds(2);
     digitalWrite(outputPin, HIGH);  // ultrasonic sensor transmit high level signal10μs, at least 10μs
     delayMicroseconds(10);
     digitalWrite(outputPin, LOW);    // keep transmitting low level signal
     float Rdistance = pulseIn(inputPin, HIGH);  // read the time in between
     Rdistance= Rdistance/5.8/10;       // convert time into distance (unit: cm)
     Rspeedd = Rdistance;              // read the distance into Rspeedd
   }  
   void loop()
 {
 
    back(); 
    delay(800);                    //  go backward
    left() ;      
    delay(200);              // Move slightly to the left (to prevent stuck in dead end)
 
    back();
    delay(100);  
    right();  
    delay(600);                 // turn right
  
    back(); 
    delay(600);      
    left(); 
    delay(600);                  // turn left
   }

El uso de variables lo conoces pero el uso y aplicación de las normas no.
Por favor léelas y edita los dos posts usando etiquetas </>

Lo intente pero cuando respondo o cuando edito no me sale la barra (o no la veo) para poder poner las negritas, código, link, etc.

Lo edito para decir ya que ya esta hecho.

Modificando este ha he conseguido que haga algo mas:

que has logrado de mas?

Hola surbyte,

Pues que ande y viendo el código supongo que gire a los lados.

Digo supongo porque lo estoy haciendo con mi hijo y entre exámenes, amigos, minecraf y alguna cosa mas casi no avanzamos.

Saludos,