Go Down

Topic: proyecto : carro control de motores con led intermitente (Read 316 times) previous topic - next topic

ricardo97

 :D buenos dias estoy haciendo un proyecto escolar
y estoy haciendo un carro controlado por circuito l293d. el carro funciona con este codigo.
Code: [Select]


ARDUINO   L293D(Puente H)       
  5          10
  6          15
  9          7
  10         2
  5V         1, 9, 16
  GND        4, 5, 12, 13
 
  El motor 1 se conecta a los pines 3 y 6 del Puente H
  El motor 2 se conecta a los pines 11 y 14 del Puente H
 
  La fuente de alimentacion de los Motores se conecta a tierra y
  el positivo al pin 8 del puennte H. 

*/
int izqA = 5;
int izqB = 6;
int derA = 9;
int derB = 10;
int vel = 255; // Velocidad de los motores (0-255)

void setup()  {
  pinMode(derA, OUTPUT);
  pinMode(derB, OUTPUT);
  pinMode(izqA, OUTPUT);
  pinMode(izqB, OUTPUT);
 }
 
void loop()  {
    analogWrite(derB, 0);  // Detiene los Motores
    analogWrite(izqB, 0);
    delay (500);
    analogWrite(derA, vel);  // Frente 2 segundos
    analogWrite(izqA, vel);
    delay (2000);
   
    analogWrite(derA, vel);  // Derecha 0,5 segundos
    analogWrite(izqA, 0);
    delay (500);
   
    analogWrite(derA, 0);    // Izquierda 0,5 segundos
    analogWrite(izqA, vel);
    delay (500);
     
    analogWrite(derA, 0);    // Detiene los Motores
    analogWrite(izqA, 0);
    delay (500);
    analogWrite(derB, vel);  // Reversa 2 segundos
    analogWrite(izqB, vel);
    delay (2000);                     
}

lo que quiero que cambie es cuando de de reversa un led rojo oscile por un tiempo cuando de reversa
gracias :D


















surbyte

Hola ricardo97,


Code: [Select]

/*
  ARDUINO   L293D(Puente H)       
  5          10
  6          15
  9          7
  10         2
  5V         1, 9, 16
  GND        4, 5, 12, 13
 
  El motor 1 se conecta a los pines 3 y 6 del Puente H
  El motor 2 se conecta a los pines 11 y 14 del Puente H
 
  La fuente de alimentacion de los Motores se conecta a tierra y
  el positivo al pin 8 del puennte H. 

*/

#define TIME2SEG        2000

int izqA = 5;
int izqB = 6;
int derA = 9;
int derB = 10;
int ledRojo = 13;
int vel = 255; // Velocidad de los motores (0-255)

void setup()  {
  pinMode(derA, OUTPUT);
  pinMode(derB, OUTPUT);
  pinMode(izqA, OUTPUT);
  pinMode(izqB, OUTPUT);
 }
 
void loop()  {
    analogWrite(derB, 0);  // Detiene los Motores
    analogWrite(izqB, 0);
    delay (500);
    analogWrite(derA, vel);  // Frente 2 segundos
    analogWrite(izqA, vel);
    delay (2000);
   
    analogWrite(derA, vel);  // Derecha 0,5 segundos
    analogWrite(izqA, 0);
    delay (500);
   
    analogWrite(derA, 0);    // Izquierda 0,5 segundos
    analogWrite(izqA, vel);
    delay (500);
     
    analogWrite(derA, 0);    // Detiene los Motores
    analogWrite(izqA, 0);
    delay (500);
    analogWrite(derB, vel);  // Reversa 2 segundos
    analogWrite(izqB, vel);
    delayConLed(2000);                     
}

void delayConLed(int t) {
    for int i=0; i<t, i += 10) {
         digitalWrite(ledRojo, HIGH);
         delay(5);
         digitalWrite(ledRojo, LOW);
         delay(5);
    }
}





ricardo97

disculpa me puedes explicar estas partes del codigo   :)
Code: [Select]
#define TIME2SEG        2000

Code: [Select]
void delayConLed(int t) {
    for int i=0; i<t, i += 10) {
         digitalWrite(ledRojo, HIGH);
         delay(5);
         digitalWrite(ledRojo, LOW);
         delay(5);

gracias  :D

surbyte

Jaja, fue algo que pensé hacer de un modo y como vi que se complicaba lo dejé. Puedes borrarlo, no tiene sentido.
El tema es que la solución que te di esta digamos dentro de lo que te pide tu profesor.
Mi soluciòn que incluìa esa linea de còdigo, requeria de una màquina de estados. Que es una màquina de estados, pues es una secuencia ordenada de tareas o estados que se van dando. Cumplido uno se salta al siguiente y al siguiente.
Si miras tu programa, dice

  // Detiene los MB Motores B
  // Frente 2 segundos MA
  // Derecha 0,5 segundos MA
  // Izquierda 0,5 segundos MA
  // Detiene los Motores MA
  // Reversa 2 segundos MB Motores B

Entonces esos son tus estados.
DetenerB -> FMA -> DMA -> IZQMA -> DetenerMA -> ReversaMB y recomienzo con DetenerB

es simple Entonces defines con una instruccion que se llama enumerator o enumerador los estados

Code: [Select]
#define TIME2SEG        2000
#define TIME500MSG      500
enum estado = {DETENERMB=0, FMA, DMA, IZQMA, DETENERMA, REVERSAMB};

y luego en el loop haras algo asi

en el setup agregas esto

time = millis(); es una variable que recordará el estado del reloj interno


void loop () {
      switch (estado)
          case DETENERB:
                         analogWrite(derB, 0);  // Detiene los Motores
                         analogWrite(izqB, 0);
                         if (millis() - time > TIME500MSG) {
                            estado = FMA;
                         }
                         break;
          case FMA:
                         analogWrite(derA, vel);  // Frente 2 segundos
                         analogWrite(izqA, vel);
                         if (millis() - time > TIME2SEG) {
                            estado = DMA;
                         }
                         break;
          case DMA:
                         analogWrite(derA, vel);  // Derecha 0,5 segundos
                         analogWrite(izqA, 0);
                         if (millis() - time > TIME500MSG) {
                            estado = IZQMA;
                         }
                         break;

          case IZQMA:
                         analogWrite(derA, 0);    // Izquierda 0,5 segundos
                         analogWrite(izqA, vel);
                         if (millis() - time > TIME500MSG) {
                            estado = DETENERA;
                         }
                         break;
   

          case DETENERA:
                         analogWrite(derA, 0);    // Detiene los Motores
                         analogWrite(izqA, 0);
                         if (millis() - time > TIME500MSG) {
                            estado = REVERSAMB;
                         }
                         break;

          case REVERSAMB:
                        analogWrite(derB, vel);  // Reversa 2 segundos
                        analogWrite(izqB, vel);
                        digitalWrite(led, !digitalRead(led));  // aca parpadearà rapidamente no cada 5 mseg
                         if (millis() - time > TIME2SEG) {
                            estado = DETENERB;
                         }
                         break;

}


Todo el còdigo es parcial, requiere el resto de tu programa anterior. menos toda la parte del loop obviamente
El agregados en el setup y las variables distintas a las que ya tienes.
Puede haber algunos errores de sintaxis, falta de ; uso de ; cuando es , en fin.. yo uso muchos lenguajes y siempre hago como recuerdo y si me equivoco el compilador medice que esta mal.

ricardo97

muchas gracias :D nomas tengo una duda,el led solo se conecta en la pata 13 y gnd
o estoy mal? :-X

surbyte

Yo conecte el led al pin13 tu cambia la defnición por la que gustes
ahora dice esto
Code: [Select]
int ledRojo = 13;

di quisieras otro que no sean
Code: [Select]
int izqA = 5;
int izqB = 6;
int derA = 9;
int derB = 10;

por ejemplo el 12
usas esto
Code: [Select]
int ledRojo = 12;

motoreto

Hola ricardo, que voltaje estas usando para el carro?
¿ lo estas manejando a 12V. ?
Veo que solamente estas utilizando el modulo L293D, ¿verdad?.


Un saludo.


Gracias surbyte! un aporte génial,me arrodillo ante ti :smiley-cry:


PD: Me lo apunto, tengo un shield en el que tiene  2 L293D , y otro    74HC595N, es muy interesante y para un futuro  me va a venir de perlas.  

ricardo97

este nomas estoy utulizando 9v para todo el circuito,pero lo probe con 9 y creo que si voy a utilizar 12v.  :D
este disculpen. como se podria utilizar el arduino para controlar un servo motor del 180° y un motor dc de 12v para poder dar dirrecion y tracion.
(nomas digo esto para no crear otro post) :D

motoreto

Desde mi mas humilde opinion ricardo, estas contruyendo la casa por el tejado?
Me explico, yo deduzco que si preguntas por una secuecia de leds para tu carro. En teoría tienes tener ya el carro hecho, carro y Control Remoto, yo no puedo ayudarte en nada es mas yo mismo estoy con un post nuevo, pero antes de poner luces a nada me INTERESA, y repito interesa saber como funciona todo, si no despues no sabré aplicar estos conocmientos por mi solo.

Si eres noob como yo, primero descubre como funcionan los servos, si solamente buscas copair y pegar,jamas aprenderas.

Pero claro,supongo que todo esto ya te lo habra enseñado la escuela, verdad? sino que razon hay para pedir una secuencia de leds, para el carro "supuestamante ya funcionando"?   es mi duda.

Hechale un vistazo a mi post, un saludo amigo.

pd:Yo no se nada tengoa rduino desde hace 4 dias, pero llevo informandome 2 años aproximandamente pero aprender a programar y entender librrias y asi toma su tiempo y dedicacioón

surbyte

OJo que estos son motores y tu tienes servos o me equivoco motoreto?

motoreto

En el proyecto de momento manejo 2 servos, y 1 motor, lo que pasa que el motor aun no soy capaz de hacerlo mover con el joistick de PS2, haber si puedo buscar mas info al respecto

Quizas, yo entendi mal pero me parece que  pide  como conectar  1 servo, y un motor al arduino, vamos lo que va siendo  el coche en si, direccioón y tracción, y el receptor? y el transmisor? :S

Si yo entendí mal disculpame.

Go Up