Problema con serial.begin

Hola, como estan?

Bueno, estoy teniendo un problema en mi proyecto con arduino. El Carro robot de 4 ruedas que estoy haciendo tiene un problema; este tendria que actuar en base a los colores que tiene, por ejemplo si detecta negro avanza, si detecta blanco para. Para esto estoy usando 4 motores CC y un sensor RGB tcs3200.

Hay una linea de mi codigo que me esta impidiendo hacer la accion de leer los colores al mismo tiempo que avanzo, o leer los colores y luego avanzar. Esta linea es la 38 [Serial.begin(9600);], si la dejo el programa solo lee los colores y el robot no avanza, si la saco el robot no lee los colores pero avanza.

Yo quiero una forma de poder juntar estas cosas, asi le puedo dar ordenes como: mientras sea negro, avanzar, hasta que sea blanco o cosas asi

Desde ya muchas gracias!

#include <Servo.h>
#include <SoftwareSerial.h>

SoftwareSerial bluetooth(6, 7); // RX (pin 6) y TX (pin 7)
// Definición de pines
Servo servoMotor;
int S0 = 8;
int S1 = 9;
int S2 = 10;
int S3 = 11;
int salidaTCS = 12;
const int IN1 = 0;
const int IN2 = 1;
const int IN3 = 2;
const int IN4 = 3;

void GirarDerechaAdelante();
void GirarIzquierdaAdelante();
void Avanzar();

void setup() {
  // Configura los pines como salidas
  bluetooth.begin(9600);
  servoMotor.attach(11);
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(salidaTCS, INPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);

  digitalWrite(S0, HIGH);    // Establece la frecuencia de salida
  digitalWrite(S1, LOW);     // del módulo al 20 por ciento

  Serial.begin(9600);        // Inicializa el monitor serie a 9600 bps
}

void GirarDER()
{
    digitalWrite(IN3,0);
    digitalWrite(IN4,1);
}

void GirarIZQ()
{
    digitalWrite(IN1,0);
    digitalWrite(IN2,1);
}

void giro180(){
  digitalWrite(IN1,0);
  digitalWrite(IN2,1);
  digitalWrite(IN3,1);
  digitalWrite(IN4,0);
}

void Avanzar()
{
    GirarDER();
    GirarIZQ();
}

void Parar(){
  digitalWrite(IN1,0);
  digitalWrite(IN2,0);
  digitalWrite(IN3,0);
  digitalWrite(IN4,0);
}

void loop() {
  digitalWrite(S2, LOW);            // Establece fotodiodos con filtro rojo
  digitalWrite(S3, LOW);
  int azul = pulseIn(salidaTCS, LOW);  // Obtiene la duración del pulso de salida del sensor
  delay(200);

  digitalWrite(S2, HIGH);        // Establece fotodiodos con filtro verde
  digitalWrite(S3, LOW);
  int verde = pulseIn(salidaTCS, LOW);  
  delay(200);

  digitalWrite(S2, LOW);            // Establece fotodiodos con filtro azul
  digitalWrite(S3, HIGH);
  int rojo = pulseIn(salidaTCS, LOW);  
  delay(200);

  Serial.print("R:");            
  Serial.print(rojo);            

  Serial.print("\t");            

  Serial.print("V:");            
  Serial.print(verde);          

  Serial.print("\t");            

  Serial.print("A:");            
  Serial.println(azul);  
  
  Avanzar();
  }

Los pines 0 y 1 son del puerto serial, o los usas para IN1 e IN2 o los usas para el serial pero no para ambas cosas.
Mi sugerencia es que cambies los pines que usas para IN1 e IN2.

1 Like

Mil gracias amigo, al pasar in1 e in2 a los pines analogos A0 y A1 ya puedo detectar los colores al mismo tiempo que andan las ruedas

Muchisimas gracias!!!!

1 Like

Hola, como estan?

Se me esta complicando la creacion de un historial que me guarde los ultimos Colores

Mi proyecto se basa en un carro de 4 ruedas que hace diferentes acciones dependiendo el color que este sensando, como girarIZQ, girarDER, etc; estoy utilizando 4 motores CC y un tcs3200 como sensor RGB.

Este historial lo estoy intentando crear para poder realizar acciones combinadas como por ejemplo, si esta sensando AZUL y el ultimo color fue AMARILLO, girar ruedas hacia la derecha.

Esto no lo estoy pudiendo hacer ya que se me superpone el "UltimoColor", me explico, al sensar el negro, rapidamente pasa el mismo negro a ser el "UltimoColor" y deja atras el que realmente seria el ultimo como por ejemplo el AMARILLO.

Este es el codigo sin la parte de UltimoColor que seria lo que quiero agregar.
La prueba simple para el loop seria que si esta sensando negro y ultimo color fue amarillo gire a la izquierda

#include <Servo.h>
#include <SoftwareSerial.h>

SoftwareSerial bluetooth(6, 7); // RX (pin 6) y TX (pin 7)
Servo servoMotor;
int S0 = 8;
int S1 = 9;
int S2 = 10;
int S3 = 11;
int salidaTCS = 12;
const int IN1 = A1;
const int IN2 = A0;
const int IN3 = 2;
const int IN4 = 3;

void GirarDerechaAdelante();
void GirarIzquierdaAdelante();
void Avanzar();
void GirarDER();
void GirarIZQ();
void giro180();
void Parar();
void LeerColores();

bool BLANCO_COLOR = false;
bool NEGRO_COLOR = false;
bool ROJO_COLOR = false;
bool AZUL_COLOR = false;
bool VERDE_COLOR = false;
bool AMARILLO_COLOR = false;
bool VIOLETA_COLOR = false;

void setup() {
  bluetooth.begin(9600);
  servoMotor.attach(11);
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(salidaTCS, INPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);

  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
  Serial.begin(9600);
}

void GirarDER() {
    digitalWrite(IN3, 0);
    digitalWrite(IN4, 1);
}

void GirarIZQ() {
    digitalWrite(IN1, 0);
    digitalWrite(IN2, 1);
}

void Avanzar() {
    GirarDER();
    GirarIZQ();
}

void Parar() {
    digitalWrite(IN1, 0);
    digitalWrite(IN2, 0);
    digitalWrite(IN3, 0);
    digitalWrite(IN4, 0);
}

void LeerColores() {
    digitalWrite(S2, LOW);
    digitalWrite(S3, LOW);
    int azul = pulseIn(salidaTCS, LOW);
    delay(200);

    digitalWrite(S2, HIGH);
    digitalWrite(S3, LOW);
    int verde = pulseIn(salidaTCS, LOW);
    delay(200);

    digitalWrite(S2, LOW);
    digitalWrite(S3, HIGH);
    int rojo = pulseIn(salidaTCS, LOW);
    delay(200);

    Serial.print("R:");
    Serial.print(rojo);

    Serial.print("\t");

    Serial.print("V:");
    Serial.print(verde);

    Serial.print("\t");

    Serial.print("A:");
    Serial.println(azul);

    BLANCO_COLOR = (rojo >= 10 && rojo <= 50 && verde >= 5 && verde <= 30 && azul >= 30 && azul <= 60);
    NEGRO_COLOR = (rojo >= 370 && rojo <= 425 && verde >= 140 && verde <= 260 && azul >= 300 && azul <= 625);
    ROJO_COLOR = (rojo >= 0 && rojo <= 0 && verde >= 0 and verde <= 0 && azul >= 0 && azul <= 0);
    AZUL_COLOR = (rojo >= 60 && rojo <= 80 && verde >= 25 && verde <= 45 && azul >= 155 && azul <= 175);
    VERDE_COLOR = (rojo >= 0 && rojo <= 0 && verde >= 0 && verde <= 0 && azul >= 0 && azul <= 0);
    AMARILLO_COLOR = (rojo >= 140 && rojo <= 170 and verde >= 30 && verde <= 50 && azul >= 90 && azul <= 125);
    VIOLETA_COLOR = (rojo >= 0 && rojo <= 0 && verde >= 0 && verde <= 0 && azul >= 0 && azul <= 0);
}

unsigned long previousMillis = 0;
const long colorInterval = 200;
byte c = 0;

void loop() {
  unsigned long currentMillis = millis();

  if (bluetooth.available()) {
    c = bluetooth.read();
  }

  if (c == '1' && currentMillis - previousMillis >= colorInterval) {
    LeerColores();
    
    if (!NEGRO_COLOR) {
      Parar();
    } 
    else {
      Avanzar();
    }

    if (AZUL_COLOR) {
      GirarDER();
      delay(1700); 
      Parar();
      delay(1000);
      Avanzar();
      while (true) {
        LeerColores();
        if (AMARILLO_COLOR) {
          Parar();
          break;
        }
      }
    }

    previousMillis = currentMillis;
  }
}

Desde ya muchas gracias!

Agrega una variable donde guardar el último color leído antes de hacer una nueva lectura y luego los comparas.

pero como hago para llamarlo y que no se me sobreponga con el color que esta detectando

Antes de llamar a LeerColores() guardas el color actual en una variable.

Hola, como estan?

Estoy teniendo problemas para hacer que los motores vayan para adelante. Cuando lo ejecuto las ruedas se quedan quietas. Si dejo los jumpers en el l298n puestos en ENA y ENB si anda. Si saco los cables de ENA y ENB al arduino no funciona

// Definición de pines
const int IN1 = A1;
const int IN2 = A0;
const int IN3 = 2;
const int IN4 = 3;
const int ENA = 11;  // Pin para controlar la velocidad del motor A
const int ENB = 10;  // Pin para controlar la velocidad del motor B

void GirarDerechaAdelante();
void GirarIzquierdaAdelante();
void Avanzar();

void setup() {
  // Configura los pines como salidas
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
}

void GirarDER()
{
    digitalWrite(IN3, 0);
    digitalWrite(IN4, 1);
}

void GirarIZQ()
{
    digitalWrite(IN1, 0);
    digitalWrite(IN2, 1);
}

void giro180(){
  digitalWrite(IN1, 0);
  digitalWrite(IN2, 1);
  digitalWrite(IN3, 1);
  digitalWrite(IN4, 0);
}

void Avanzar()
{
    GirarDER();
    GirarIZQ();
    analogWrite(ENA, 255);  // Establece la velocidad máxima del motor A
    analogWrite(ENB, 255);  // Establece la velocidad máxima del motor B
}

void Parar(){
  digitalWrite(IN1, 0);
  digitalWrite(IN2, 0);
  digitalWrite(IN3, 0);
  digitalWrite(IN4, 0);
  analogWrite(ENA, 0);  // Detén el motor A
  analogWrite(ENB, 0);  // Detén el motor B
}

void loop() {
  Avanzar();
}

Gracias!


Moderador:
Por favor @tomasespinosa deja de crear hilos (conté 3 similares) con el mismo código haciendo preguntas distintas.
Lo que haces aunque no lo sepas es crear posteos cruzados.
Voy a entender que no lo sabías pero tienes una primer advertencia.
Muevo tu hilo al primer tema.
Cámbiale el título si así lo deseas.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.