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
//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
#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
#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.