Go Down

Topic: Kit smart robot 4wd. Cómo hacerlo funcionar? (Read 157 times) previous topic - next topic

Eljuli79

Sep 22, 2017, 06:26 pm Last Edit: Sep 22, 2017, 07:51 pm by surbyte
Hola buenas tardes un saludo a todos.

Lo dicho en el titulo,"muy novato"

Resulta que por desgracia compre un kit de los chinos del smart robot 4wd,bien hasta ahí me falta de todo pero conseguí montarlo.

Placa pseudo arduino uno y yo le compre un driver de motores DC L298N (lo veia mas sencillo que el que traia el kit (igual me equivoco).
Servo.
Sensor ultrasonidos.
seguidor de lineas.
y receptor IR.

Hasta ahí ok.

Las conexiones y demas las entiendo,el problema (aunque trabajo con autómatas) es que no consigo hacer mucho mas de un barrido con el servo...He mirado manuales (que no termino de entender) he rebuscado en google y no avanzo,y todo esto con mis crios detras diciendome que vaya trasto he comprado,que no vale pa nada jajaj


Algun consejo de como volver a empezar?

Alguna forma "facil" de hacer que se mueva? (al menos para callar a los peques)

Me estoy empezando a desesperar!!!

Muchas gracias al que me pueda decir algo y el que no...se puede reir de mi todo que quiera por comprar donde no se debe!!!

Swift

Pues creo que seria recomendado que compartas las conexiones que tienes echas, el código que estas utilizando para poder entender cual es el problema.

Hector_A


Como dijo Swift. Si nos mandas el conexionado de todos los componentes del robot y lo que tengas ya programado, será más fácil ayudarte.

Quote
Muchas gracias al que me pueda decir algo y el que no...se puede reir de mi todo que quiera por comprar donde no se debe!!!
Y, personalmente, yo no creo que hayas comprado mal, tal vez tus propias modificaciones a los componentes originales te estén jugando en contra (o no), pero para eso hay que ver que tienes y como está conectado.

Abrazos!

Eljuli79

Pues ahora mismo nada de nada,he quitado todo con idea de volver a empezar desde cero.

Una de las ultimas veces que probé,cargando solo código para el servo y sensor ultrasonidos,(lo único que hice funcionar) se me quedaba encendido fijo el led de la placa RX?
Por que puede ser eso?

Algun manual recomendable (Español)

Programador algo mas grafico que el IDE? probé Mblock...pero no termino de entenderlo.

Eljuli79

Con esto es lo ultimo que estaba,no se si bien,mal,o peor. Seguramente desordenado.

El servo a Pin 7
Motores a 8,9,10 y 11 (In1,2,3,4)
trig al 12 y echo al 13


Code: [Select]

#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>

#include <Servo.h>

double angle_rad = PI / 180.0;
double angle_deg = 180.0 / PI;
float getDistance(int trig, int echo) {
  pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);
  return pulseIn(echo, HIGH, 30000) / 58.0;
}
Servo servo_7;
//#include <Servo.h>
int Left_motor = 8;
int Left_motor_pwm = 9;

int Right_motor_pwm = 10;
int Right_motor = 11;

int key = A2;
int beep = A3;
int LED = 7;

const int SensorRight = 3;
const int SensorLeft = 4;
const int SensorRight_2 = 5;
const int SensorLeft_2 = 6;

int SR_2;
int SL_2;

int SL;
int SR;
void setup()
{
  servo_7.attach(7); // init pin
  pinMode(13, INPUT);
  pinMode(7, OUTPUT);
}


pinMode(Left_motor, OUTPUT); // PIN 8 pwm
pinMode(Left_motor_pwm, OUTPUT); // PIN 9 pwm
pinMode(Right_motor_pwm, OUTPUT); // PIN 10 pwm
pinMode(Right_motor, OUTPUT); // PIN 11 pwm

pinMode(LED, OUTPUT); // PIN 7 LEd
pinMode(key, INPUT);
pinMode(beep, OUTPUT);
pinMode(SensorRight, INPUT);
pinMode(SensorLeft, INPUT);
pinMode(SensorLeft_2, INPUT);
pinMode(SensorRight_2, INPUT);
Serial.begin(9600);




//Marcha
void run()
{
  digitalWrite(Right_motor, LOW);
  digitalWrite(Right_motor_pwm, HIGH);
  analogWrite(Right_motor_pwm, 255); //0-255


  digitalWrite(Left_motor, LOW);
  digitalWrite(Left_motor_pwm, HIGH);
  analogWrite(Left_motor_pwm, 255);//0-255
  //delay(time * 100);
}

//void parada
void brake()
{
  digitalWrite(Right_motor_pwm, LOW);
  analogWrite(Right_motor_pwm, 0); // velocidad motor 0 parado derecho

  digitalWrite(Left_motor_pwm, LOW);
  analogWrite(Left_motor_pwm, 0); //vekolidad motor 0 motor parado izquierdo
  //delay(time * 100);
}

//void left(int time)
void left()
{
  digitalWrite(Right_motor, LOW);
  digitalWrite(Right_motor_pwm, HIGH);
  analogWrite(Right_motor_pwm, 150); //media velocidad motor derecho


  digitalWrite(Left_motor, LOW);
  digitalWrite(Left_motor_pwm, LOW);
  analogWrite(Left_motor_pwm, 0); //para motor izq.
  //delay(time * 100);
}

void spin_left()
{
  digitalWrite(Right_motor, LOW);
  digitalWrite(Right_motor_pwm, HIGH);
  analogWrite(Right_motor_pwm, 150);

  digitalWrite(Left_motor, HIGH);
  digitalWrite(Left_motor_pwm, HIGH);
  analogWrite(Left_motor_pwm, 150);
  //delay(time * 100);
}

void right()
{
  digitalWrite(Right_motor, LOW);
  digitalWrite(Right_motor_pwm, LOW);
  analogWrite(Right_motor_pwm, 0);


  digitalWrite(Left_motor, LOW);
  digitalWrite(Left_motor_pwm, HIGH);
  analogWrite(Left_motor_pwm, 150);
  //delay(time * 100);
}

void spin_right()
{
  digitalWrite(Right_motor, HIGH);
  digitalWrite(Right_motor_pwm, HIGH);
  analogWrite(Right_motor_pwm, 150);


  digitalWrite(Left_motor, LOW);
  digitalWrite(Left_motor_pwm, HIGH);
  analogWrite(Left_motor_pwm, 150);
  //delay(time * 100);
}

void back()
{
  digitalWrite(Right_motor, HIGH);
  digitalWrite(Right_motor_pwm, HIGH);
  analogWrite(Right_motor_pwm, 150);


  digitalWrite(Left_motor, HIGH);
  digitalWrite(Left_motor_pwm, HIGH);
  analogWrite(Left_motor_pwm, 150);

  void keysacn()
  {
    int val;
    val = digitalRead(key);
    while (!digitalRead(key))
    {
      val = digitalRead(key);
    }
    while (digitalRead(key))
    {
      delay(10); //10ms
      val = digitalRead(key);
      if (val == HIGH)
      {
        digitalWrite(beep, HIGH);
        while (!digitalRead(key))
          digitalWrite(beep, LOW)
        }
      else
        digitalWrite(beep, LOW);
    }
  }

  void loop()
  servo_7.write(getDistance(13, 12)); // servo
  _delay(1);
  if (digitalRead(13)) {
    _delay(2);
  }
  servo_7.write(getDistance(13, 12)); // servo
  _delay(1);
  if (digitalRead(13)) {
    _delay(2);
  }
  servo_7.write(getDistance(13, 12)); // servo
  _delay(1);
  if (digitalRead(9)) {
    _delay(2);
  }
  servo_7.write(getDistance(13, 12)); // sercvo
  _delay(1);
  if (digitalRead(9)) {
    _delay(2);
  }
  _delay(1);

  _loop();
}

void _delay(float seconds) {
  long endTime = millis() + seconds * 1000;
  while (millis() < endTime)_loop();
}
{
  keysacn();
  while (1)
  {
    //LOW bajo HIGHT alto
    SR = digitalRead(SensorRight);
    SL = digitalRead(SensorLeft);

    SR_2 = digitalRead(SensorRight_2);
    SL_2 = digitalRead(SensorLeft_2);

    if ( SL_2 == LOW || SR_2 == LOW )
    {
      brake();
      digitalWrite(beep, HIGH);
      digitalWrite(LED, HIGH);
    }
    else
    {
      digitalWrite(beep, LOW);
      digitalWrite(LED, LOW);
      if (SL == LOW && SR == LOW)
        run();
      else if (SL == HIGH & SR == LOW)
        spin_left();
      //left();
      else if (SR == HIGH & SL == LOW)
        spin_right();
      //right();
      else
        brake();

    }

  }
}


Eljuli79

Alguien me puede decir o corregir si voy por buen camino?
De momento solo para ultrasonidos y movimiento de los motores.
Me faltara el IR y seguidor de lineas para mas adelante.


Code: [Select]


#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>

#include "motor.h"#include <Servo.h>

double angle_rad = PI / 180.0;
double angle_deg = 180.0 / PI;
float getDistance(int trig, int echo) {
  pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);
  return pulseIn(echo, HIGH, 30000) / 58.0;
}
Servo servo_2;
MOTOR motor;

void setup() {
  Serial.begin(9600);
  servo_2.attach(2); // init pin
  pinMode(13, INPUT);
  pinMode(3, INPUT);
}

void loop() {
  servo_2.write(getDistance(13, 12)); // write to servo
  _delay(1.5);
  if (digitalRead(13)) {
    Serial.println("Detecc.");
    _delay(1);
    motor.motor_output(1, 1, 1, 255);
    motor.motor_output(2, 1, 1, 0);
  } else {
    Serial.println("Avanzo");
  }
  servo_2.write(getDistance(13, 12)); // write to servo
  _delay(1);
  if (digitalRead(13)) {
    Serial.println("Detecc");
    _delay(1);
  } else {
    Serial.println("Avanzo");
  }
  servo_2.write(getDistance(13, 12)); // write to servo
  _delay(1.5);
  if (digitalRead(13)) {
    Serial.println("Detecc");
    _delay(1);
  } else {
    Serial.println("Avanzo");
  }
  servo_2.write(getDistance(13, 12)); // write to servo
  _delay(1);
  if (digitalRead(13)) {
    Serial.println("Detecc");
    _delay(1);
  } else {
    Serial.println("Avanzo");
  }
  servo_2.write(getDistance(13, 12)); // write to servo
  _delay(1.5);
  if (digitalRead(3)) {
    Serial.println("Detecc");
    _delay(1);
  } else {
    Serial.println("Avanzo");
  }
  _loop();
}

void _delay(float seconds) {
  long endTime = millis() + seconds * 1000;
  while (millis() < endTime)_loop();
}

void _loop() {
}

Eljuli79

Hola buenos dias a todos,consegui hacerlo funcionar (muy basico) esquiva obstaculos y tal pero claro de una forma muy previsible,a veces se queda atascado y no sabe salir.
La pregunta,despues de intentarlo de varias formas,es como podria hacer que los movimientos sean aleatorios.
Por ejemplo si en el codigo con el sensor a 45 grados detecta algo el coche girara si o si a la derecha,no se si podria ser algo como que gire hasta que vea que a superado el obstaculo,no se,a ver si alguien me puede orientar un poco.
Gracias

Code: [Select]

#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <Servo.h>
double angle_rad = PI / 180.0;
double angle_deg = 180.0 / PI;
Servo servo_7;
int disparador = 12;   // Trigger
int entrada = 13;      // Echo
float distancia;
long tiempo;




void setup()
{

  servo_7.attach(7);            // Inicializa pin servo
  pinMode(entrada, INPUT);      // PIN ECHO ultrasonidos PIN(13)
  pinMode(disparador, OUTPUT);  // PIN Trigger ultrasonidos PIN(12)
  pinMode(11, OUTPUT);          // PWM Motor derecho
  pinMode(9, OUTPUT);           // Estado motor derecho HIGH,avanza,LOW Stop
  pinMode(10, OUTPUT);          // PWM Motor izquierda
  pinMode(8, OUTPUT);           // Estado motor izquierda HIGH avanza,LOW Stop
  pinMode(6, OUTPUT);           // Motor derecha atras
  pinMode(5, OUTPUT);           // Motor izquierda atras
  Serial.begin(9600);
}

void loop()

{

  //=======================================================================================================================================================================================
  //Sensor ultrasonidos
  //Lanza el pulso
  digitalWrite(disparador, HIGH);
  delayMicroseconds(10);        //Tiempo de pulso
  digitalWrite(disparador, LOW);
  //=====================================================================================

  // Mide la respuesta
  tiempo = (pulseIn(entrada, HIGH) / 2); // MIDE IDA Y VUELTA DEL PULSO
  //=====================================================================================

  // Conversion a CM
  distancia = float(tiempo * 0.0343);
  //=====================================================================================

  // Muestra en puerto serie la distancia cada dos segundos
  Serial.println("Distancia Obstaculo");
  Serial.print("CM");
  delay(2000);
  //=====================================================================================

  //Activar Pin13

  //Poner pin 13 a HIGH o a LOW
  if (disparador, entrada <= 15)    //Distancia de medicion obstaculos 15 centimetros
  {
    digitalWrite(13, HIGH);         //Si a menos de 15Cm "SI" detecta obstaculo Pin 13 HIGH
    delay(500);
  } else {
    digitalWrite(13, LOW);         //Si a menos de 15Cm "NO" detecta obstaculo Pin 13 LOW
    //====================================================================================
    //Posiciones servos ultrasonidos
    ///
    //Y funciones motores
    servo_7.write(45);            // Posicion servo 45 grados
    delay(0.5);                   //Se mantiene en esta posicion 0.5 segundos

    if (digitalRead(13)) {
      analogWrite(11, 0);        //Velocidad Motor PWM derecho
      digitalWrite(9, 0);        //Motor 0-1
      analogWrite(10, 250);      //Velocidad Motor PWM izquierdo
      digitalWrite(8, 1);        //Motor 0-1
    } else {
      analogWrite(11, 250);      //Velocidad Motor PWM derecho
      digitalWrite(9, 1);        //Motor 0-1
      analogWrite(10, 250);      //Velocidad Motor PWM izquierdo
      digitalWrite(9, 1);        //Motor 0-1
    }
    //===================================================================================
    servo_7.write(90);           // Posicion servo 90 grados
    delay(0.5);                  //Mantiene posicion 0.5 segundos

    if (digitalRead(13)) {
      analogWrite(11, 250);      //Velocidad Motor PWM derecho
      digitalWrite(9, 0);        //Motor 0-1
      analogWrite(10, 0);        //Velocidad Motor PWM izquierdo
      digitalWrite(8, 1);        //Motor 0-1
    } else {
      analogWrite(11, 250);      //Velocidad Motor PWM derecho
      digitalWrite(9, 1);        //Motor 0-1
      analogWrite(10, 250);      //Velocidad motor PWM izquierdo
      digitalWrite(9, 1);        //Motor 0-1

    }
    //====================================================================================
    servo_7.write(135);          // Posicion servo 135 grados
    delay(0.5);                  //Mantiene esta posicion 0.5 segundos

    if (digitalRead(13)) {
      analogWrite(11, 250);     //Velocidad Motor PWM derecho
      digitalWrite(9, 1);       //Motor 0-1
      analogWrite(10, 0);       //Velocidad motor PWM izquierdo
      digitalWrite(8, 0);       //Motor 0-1
    } else {
      analogWrite(11, 250);     //Velocidad Motor PWM derecho
      digitalWrite(9, 1);       //Motor 0-1
      analogWrite(10, 250);     //Velocidad Motor PWM izquierdo
      digitalWrite(9, 1);       //Motor 0-1
    }
    //====================================================================================
    servo_7.write(90);          //Posicion servo a 90 grados
    delay(0.5);                 //Mantiene esta posicion 0.5 segundos

    if (digitalRead(13)) {
      analogWrite(11, 0);       //Velocidad Motor PWM derecho
      digitalWrite(9, 0);       //Motor 0-1
      analogWrite(10, 250);     //Velocidad Motor PWM izquierdo
      digitalWrite(8, 1);       //Motor 0-1
    } else {
      analogWrite(11, 250);     //Velocidad Motor PWM derecho
      digitalWrite(9, 1);       //Motor 0-1
      analogWrite(10, 250);     //Velocidad motor PWM izquierdo
      digitalWrite(9, 1);       //Motor 0-1
    }
    //=====================================================================================
    delay(0.5);                 // Espera 0.5 segundos
    //=====================================================================================
    loop();                     //  Repite bucle
    //=======================================================================================
  }
}

Go Up