Go Down

Topic: Selección opcion de menú, control de tensión y de un servomotor por Puerto Serie (Read 222 times) previous topic - next topic

Guayota

Hola a todos,

resulta que tengo un pequeño problema, tengo que hacer un programa que por un lado controle un nivel de tensión para crear una tensión de referencia que va a un circuito integrado (lo he logrado, lo he hecho con PWM en el pin9). Por otro lado, tengo que controlar un servomotor (que también he logrado hacer). La cosa es que por separado funciona como se espera, pero cuando lo uno en el mismo archivo no funciona.

En el archivo unificado, se imprime en el Puerto Serial un menú de dos opciones (0 y 1) para seleccionar lo que que se quiere controlar, pero luego no deja controlar los ni el nivel de tensión ni el servo. posteo tanto los códigos individuales como juntos.

CONTROL DE TENSIÓN
Code: [Select]
//Programa más cercano al que buscamos (05/04/2018).

//Arpoximadamente la tensión de la salida puede variar 0.05V
//para que la tensión de referencia se note un cambio.
//Esto es debido a que en la salida la tensión va desde los 5V
// hasta los 21V y en la referencia desde 1V hasta 4.2V, provocando
// que un leve cambio en la salida no se refleje un cambio de tensión
// en la referencia.

float resolucion=0.01953125; // 5/256. Valor de tensión de un nivel de tension

//Definimos valores
float TensionRef;
float TensionSalida;

void setup()
{
  //Abrimos conexión Serial con una tasa de transmisión de datos
  // de 9600 baudios.(este valor es importante porque depende del
  //equipo con el que se vaya a comunicar)
   Serial.begin(9600);
  Serial.println(" ");
  Serial.print("Introduzca tension a la salida: ");
}
 
void loop()
{
   if (Serial.available() > 0)
   {
     //Se captura valor desde el teclado y se transforma a float
      String str = Serial.readStringUntil('\n');
      float TensionSalida = str.toFloat();
     
     //A continuacion se muestra una condicion con
     // el fin de despreciar tensiones fuera de nuestro rango
     if(TensionSalida<5)
       TensionSalida=5;
     if(TensionSalida>21)
       TensionSalida=21;
     
     //Mapea entre 51 (1V) y 214 (4.2V) niveles de PWM
     //Se ha eliminado la función de mapeado por problemas
     //Se introduce expresión de proporcionalidad.
   
     TensionRef=(214*TensionSalida)/21;
     analogWrite(9, TensionRef);
   
     //Se muestra valor que queremos
     Serial.println(TensionSalida);
     Serial.print("Tension de Referencia: ");
     Serial.println(TensionRef*resolucion);
     Serial.print("Nivel de tension: ");
     Serial.println(TensionRef);
     Serial.println("  ");
     
     Serial.print("Introduzca tension a la salida: ");
   }
 
}


CONTROL DEL SERVOMOTOR
Code: [Select]
#include <Servo.h>

int posicion = 0;    // Se declara y se inicializa la variable posición a cero.

Servo myservo;       // create servo object to control a servo Se crea el objeto servo para el control de este


int pos = 0;         // variable to store the servo position Variable para almacenar la posición del Servo Motor

void setup() {
  Serial.begin(9600);         //Iniciamos la comunicación serie
  myservo.attach(10);          // attaches the servo on pin 9 to the servo object
  Serial.println("Escribe el angulo (0 - 180):  "); // Imprimimos en la pantalla el rótulo para el ingreso del ángulo
}

void loop() {

  if (Serial.available() > 0) {   // Se comprueba si la conexión es posible, envía datos si los recibe
    String grados = "";           //
    do {
      grados =  grados + (char)Serial.read(); //Grados toma el valor anterior y el valor de Serial.read()
      //Serial.println(grados); //Aqui ya tenemos el valor del angulo
      delay(5); 
    }
    while (Serial.available() > 0);  // Mientras haya conexión, hace el bucle
   
    Serial.println("Movido a la posición: " + (String)grados);
    posicion = grados.toInt();
    myservo.write(posicion);
    Serial.println("Escribe el angulo (0 - 180)");
  }
}


PROGRAMA ENTERO
Code: [Select]
#include <Servo.h>
int eleccion;

//Inicialización tensión
float resolucion=0.01953125; // 5/256. Valor de tensión de un nivel de tension

//Definimos valores
float TensionRef;
float TensionSalida;

//Inicialización variables servomotor
int posicion = 0;    // Se declara y se inicializa la variable posición a cero.
Servo myservo;       // create servo object to control a servo Se crea el objeto servo para el control de este
int pos = 0;         // variable to store the servo position Variable para almacenar la posición del Servo Motor

void setup() {
  Serial.begin(9600);
  pinMode(9, OUTPUT);
  myservo.attach(10);          // attaches the servo on pin 9 to the servo object
  Serial.println("");
  Serial.println("CONTROL");
  Serial.println("0. ServoMotor ");
  Serial.println("1. Tension");
  Serial.println(" ");
}
void loop() {
 
   while (!Serial.available() > 0); // Observa el ; al final es una instrución vacía, es decir, permanece bloqueado mientras no haya dato disponible
   eleccion = Serial.parseInt();
   Serial.println(eleccion);
   
 
  if(eleccion==0)
  {
    Serial.print("Introduzca angulo: ");
  if (Serial.available() > 0) {   // Se comprueba si la conexión es posible, envía datos si los recibe
    String grados = "";           //
    do {
      grados =  grados + (char)Serial.read(); //Grados toma el valor anterior y el valor de Serial.read()
      //Serial.println(grados); //Aqui ya tenemos el valor del angulo
      delay(5); 
    }
    while (Serial.available() > 0);  // Mientras haya conexión, hace el bucle
   
    Serial.println("Movido a la posición: " + (String)grados);
    posicion = grados.toInt();
    myservo.write(posicion);
   
      Serial.println("CONTROL");
      Serial.println("0. ServoMotor ");
      Serial.println("1. Tension");
      Serial.println(" ");
      }
  }
 
 
  if(eleccion==1) //OPCION TENSION
  {
    Serial.print("Introduzca tension a la salida: ");
    if (!Serial.available() > 0)
   {
     //Se captura valor desde el teclado y se transforma a float
      String str = Serial.readStringUntil('\n');
      float TensionSalida = str.toFloat();
     
     //A continuacion se muestra una condicion con
     // el fin de despreciar tensiones fuera de nuestro rango
     if(TensionSalida<5)
       TensionSalida=5;
     if(TensionSalida>21)
       TensionSalida=21;
     
     //Mapea entre 51 (1V) y 214 (4.2V) niveles de PWM
     //Se ha eliminado la función de mapeado por problemas
     //Se introduce expresión de proporcionalidad.
     
     TensionRef=(214*TensionSalida)/21;
     analogWrite(9, TensionRef);
   
     //Se muestra valor que queremos
     Serial.println(TensionSalida);
     Serial.print("Tension de Referencia: ");
     Serial.println(TensionRef*resolucion);
     Serial.print("Nivel de tension: ");
     Serial.println(TensionRef);
     Serial.println("  ");
     
       Serial.println("CONTROL");
     Serial.println("0. ServoMotor ");
     Serial.println("1. Tension");
       Serial.println(" ");
   }
  }
   
  if(eleccion!=0 && eleccion!=1)
    {
     Serial.println("ERROR");
     Serial.println();
   
    Serial.println("");
    Serial.println("CONTROL");
    Serial.println("0. ServoMotor ");
    Serial.println("1. Tension");
    Serial.println(" ");
     }
   
 }


Muchas gracias de antemano, espero que alguien me pueda ayudar
Un saludo.

surbyte

Si tienes un problema o una duda, por que publicas en DOCUMENTACION donde van los tutoriales?

Ahora me dirás que eres nuevo, y con eso se excusan todos. Bueno, ya lo sabemos eres nuevo pero hay que prestar un poco la atención.

La sección Proyectos es un laboratorio de ensayos, no de consultas. Si tu llegas a una escuela vas a aula y no vas al Laboratorio hasta tener alguna base para hacerlo no? Acá pasa lo mismo.

Ahora estas en la sección adecuada. Lee las normas por favor.

Go Up