Para el siguiente experimento simularemos un sistema Stream y Pull. Cuando usamos el modo Stream los datos de un potenciómetro y PWM se leerán en tiempo real, mientras podemos ingresar el valor de un PWM nuevo para ser enviado al Arduino. En caso del modo Pull, el dato del potenciómetro puede ser pedido cuando desee el usuario, y de la misma manera que con el PWM.
Los únicos pines que pueden usar la función de salida PWM en el caso del Arduino UNO de manera nativa son:
# 11
# 10
# 9
# 6
# 5
# 3
La conexión es la siguiente:
# PIN D11 : Arduino UNO => Resistencia => LED : Ánodo
# PIN A0 : Arduino UNO => Potenciómetro : Pin central
# 5V : Arduino UNO => Potenciómetro : Extremo
# PIN A0 : Arduino UNO => Potenciómetro : Pin central
# 5V : Arduino UNO => Potenciómetro : Extremo
# GND : Arduino UNO => LED: Cátodo => Potenciómetro : Extremo
El programa usado para el Arduino es el que se muestra:
/* PROGRAMA DE PRUEBA DE COMUNICACION SERIAL
CONEXION:
Arduino (D11) : Anodo del led (pin positivo)
Arduino (GND) : Catodo del led (pin negativo), extremo del potenciometro
Arduino (A0) : Pin central del potenciometro
Arduino (5V) : Extremo del potenciometro
El siguiente programa nos ayuda a enviar una trama ingresada por puerto serial para ser leida por el Arduino y
ser convertida en el valor del PWM de 0 a 100% (0 - 255 bits) y lee a la vez el potenciometro que va
al pin A0 de Arduino y lo convierte de 0 a 5V. Con dos modos: Stream y pull mode
NOTA: Los pienes que poseen salida PWM son 3, 5, 6, 9, 10 y 11
Autor: Renato Hurtado
http://beetlecraft.blogspot.pe/
El siguiente programa es de uso publico, cualquier modificacion o mal uso del mismo que pudiera ocasionar el mal
funcionamiento de la plataforma de uso de la misma no es responsabilidad del autor
*/
const int led = 11; // Variable asignada al pin led
int data, mod = 0, pwm = 0; // Variable de almacenamiento del dato por puerto serial, pwm y seleccion de modo
int det = 0; // Determinante para desentascamiento
void setup() {
pinMode(led, OUTPUT); // Configuracion del pin led como salida
Serial.begin(9600); // Comunicacion serial a 9600 bps
}
void loop() {
if(Serial.available()) { // Lectura del puerto mientras sigue abierto
if (Serial.peek() == 'S'){ // Detecta la letra S para ingresar al modo Stream
mod = 1; // Flag de seleccion de modo
delay(10);
}
else if(Serial.peek() == 'P'){ // Detecta la letra P para ingresar al modo Pull
mod = 2; // Flag de seleccion de modo
delay(10);
}
while (Serial.available() > 0){Serial.read();} // Rutina de limpieza del buffer del puerto serial
}
modos(); // Ingreso a la funcion de modos
}
void modos(){ // Funcion de modos Stream y Pull
switch (mod){
case 1: // Caso 1: Modo Stream
while (mod == 1){ // Mantiene en el modo Stream
lectura_pot(); // Funcion de lectura de potenciometro
envio_pwm(); // Funcion de lectura y envio de PWM
delay(100);
if (Serial.peek() == 'P'){ // Deteccion de cambio a modo Pull
mod = 2; // Flag de seleccion de modo
delay(10);
}
desentascamiento(); // Algoritmo de desentascamiento
}
break;
case 2: // Caso 2: Modo Pull
while (mod == 2){ // Mantiene en el modo Pull
envio_pwm(); // Funcion de lectura y envio de PWM
if (Serial.peek() == 'l'){ // Deteccion para funcion de lectura de potenciometro
lectura_pot(); // Funcion de lectura de potenciometro
break; // Salto para evitar bucle infinito
}
if (Serial.peek() == 'S'){ // Deteccion de cambio a modo Stream
mod = 1; // Flag de seleccion de modo
delay(10);
}
desentascamiento(); // Algoritmo de desentascamiento
}
break;
}
}
void lectura_pot(){
int pot = analogRead(A0); // Lectura del potenciometro
Serial.println(pot); // Envio del dato por puerto serial
}
void envio_pwm(){
if (Serial.peek() == 'p'){ // Deteccion de la letra p para ingresar valor de PWM
data = Serial.parseInt(); // Extraccion del integer del dato leido
pwm = map(data, 0, 100, 0, 255); // Cambio de formato del dato de 0 - 100%, a 0 - 255
analogWrite(led, pwm); // Salida PWM en el led de 0 a 255
}
}
void desentascamiento(){ // Algoritmo de desentascamiento
if (Serial.available() > 0){det++;} // Deteccion de caracteres en el buffer
else {det = 0;} // Reseteo del contador de deteccion
while (det > 1) { // Limpieza del buffer por entascamiento
Serial.read();
if (Serial.available() == 0){det = 0;} // Reseteo del contador de deteccion
}
}
El programa en Processing es el siguiente:/* PROGRAMA DE PRUEBA DE COMUNICACION SERIAL
El siguiente programa nos ayuda a enviar el valor pwm de 0 a 100% a un Arduino y recibimos en
contraparte el valor de un potenciometro usando dos modos, uno Stream y otro Pull.
Autor: Renato Hurtado
http://beetlecraft.blogspot.pe/
El siguiente programa es de uso publico, cualquier modificacion o mal uso del mismo que pudiera
ocasionar el mal funcionamiento de la plataforma de uso de la misma no es responsabilidad del autor
*/
import controlP5.*; // Importacion de la libreria controlP5
ControlP5 cp5; // Creacion del objeto cp5 para el ControlP5
String[] cabeceraBSP = {"Stream", "Pull"}; // Cabecera de los botones
String pwm = "0", data, val_mod = "0"; // Dato de almacenamiento del cuadro de texto, envio y auxiliar
float val; // Variables de lectura
PFont fuente; // Creacion del objeto fuente
import processing.serial.*; // Inicio de la comunicación serial
Serial puerto; // Crea el puerto serial
void setup() {
size(340, 260); // Porte de la pantalla ancho, alto
background(0); // Color de fondo
String ArduinoPuerto = Serial.list()[0]; // Encuentra el primer puerto serial para iniciar la comunicacion
puerto = new Serial(this, ArduinoPuerto, 9600); // Inicio de la comunicacion con el primer puerto encontrado
fuente = createFont("arial", 15); // Tamano de la fuente y tipo
cp5 = new ControlP5(this); // Inicializacion de la funcion cp5
int x = 20, espaciamiento = 100; // Variables de almacenamiento de coordenada y espaciamiento
// Construccion de los botones Stream y Pull
for(String nombre: cabeceraBSP){
cp5.addBang(nombre) // Nombre del boton
.setPosition(x, 20) // Ubicacion del boton en la ubicacion x, y
.setSize(80, 40) // Tamano del boton ancho, alto
.setFont(fuente); // Fuente del texto
x += espaciamiento; // Espaciamiento para el siguiente campo de texto
}
// Construccion del envio del valor PWM, campo de texto y boton
cp5.addTextfield("PWM") // Nombre del cuadro de texto
.setPosition(20, 100) // Ubicacion del boton en la ubicacion x, y
.setSize(200, 40) // Tamano del boton ancho, alto
.setFont(fuente) // Fuente del texto
.setAutoClear(false); // No se limpia el campo de texto con "Enter"
cp5.addBang("Enviar") // Nombre del boton
.setPosition(240, 100) // Ubicacion del boton en la ubicacion x, y
.setSize(80, 40) // Tamano del boton ancho, alto
.setFont(fuente); // Fuente del texto
// Construccion del boton recepcion en caso de Pull mode
cp5.addBang("Recibir") // Nombre del boton
.setPosition(240, 180) // Ubicacion del boton en la ubicacion x, y
.setSize(80, 40) // Tamano del boton ancho, alto
.setFont(fuente); // Fuente del texto
}
void draw () {
lectura(); // Funcion de lectura del potenciometro
campo_texto_lectura(); // Campo de texto de lectura del potenciometro
}
void lectura(){
String mensaje = puerto.readStringUntil('\n'); // Lee la cadena hasta encontrar un enter
if (mensaje != null) {
mensaje = trim(mensaje); // Se quita los espacios en blanco:
val = float(mensaje); // Convierte en flotante el String leido
val = map(val, 0, 1023, 0, 5); // Convierte el dato en la altura de salida
val = 1000 * val; // Conversion de voltios a milivoltios
val_mod = nf(val, 4, 2); // Limita los digitos a la derecha, izquierda
println("Voltaje: " + val_mod + " mV"); // Muestra el dato en el puerto serial
}
}
void campo_texto_lectura(){
// Creacion de la etiqueta
textFont(fuente); // Fuente de la letra
fill(255, 255, 255); // Valor de rojo, verde y azul de la letra
text("VOLTAJE", 20, 240); // Texto, coordenada en x, coordenada en y
// Muestra del dato por pantalla
fill(255, 255, 255); // Valor de rojo, verde y azul del cajetin
rect(20, 180, 200, 40); // Creacion del cajetin para dato coordenada x, y, ancho, alto
textFont(fuente); // Fuente de la letra
fill(0, 102, 153); // Valor de rojo, verde y azul de la letra
text(val_mod + " mV", 30, 210); // Texto de presentacion del dato, coordenada en x, coordenada en y
}
void Stream() { puerto.write('S'); } // Envio de la letra "S" al apretar el boton "Stream"
void Pull() { puerto.write('P'); } // Envio de la letra "P" al apretar el boton "Pull"
void Recibir(){ puerto.write('l'); } // Envio de la letra "l" al apretar el boton "Recibir"
void Enviar() {
// Lectura del valor obtenido del campo de texto
pwm = cp5.get(Textfield.class, "PWM").getText();
data = 'p' + pwm; // Armado de la data de envio
puerto.write(data); // Escritura del valor del PWM (envio de data al Arduino)
// Mensaje de confirmacion de envio del PWM
println("PWM enviado: " + pwm); println("Dato enviado: " + data);
// Borra el cuadro de texto despues de apretar el boton
cp5.get(Textfield.class, "PWM").clear();
}
Los resultados son los siguientes:Autor:









No hay comentarios:
Publicar un comentario