TP1 - Cordoba
TP1 - Cordoba
TP1 - Cordoba
__________________________
__________________________
__________________________
Para el ejercicio se usará, además de las placas de desarrollo Raspberry Pi Pico y/o Raspberry Pi Pico W,
LED’s, presets o potenciómetros, pulsadores, resistencias necesarias y un protoboard donde conectar
todo.
Informe
• Archivo editado con la carátula debidamente completada con los integrantes del grupo.
• Foto o escaneo de esta hoja firmada con el visto del docente cuando corrobora que lo implementado
funciona como se pidió.
• Un diagrama o circuito eléctrico del armado donde se especifiquen valores de componentes y
terminales utilizados en las placas de desarrollo.
• El código implementado para la solución y una breve descripción de lo que hace cada parte.
Enunciado
El siguiente puntos debe estar resuelto aplicando, cuando sea pertinente, interrupciones de GPIO, demora
anti-rebote por software y utilizando el systick para medir los tiempos necesarios. Es conveniente armar el
sistema completo para luego poder desarrollar el punto pedido.
1. Se pide elaborar un sistema que al recibir por UART (115200, 8N1) el valor de la entrada
analógica de la placa 1 cambie la intensidad del brillo del LED de la placa 2 y esta última deberá
enviarle por UART a la placa 1 el porcentaje de brillo que deberá ser visualizado por algún
método (leds, display 7 segmentos, display LCD…).
Visto: __________________
2 de 8
Condiciones
En grupos de 3 o 4 alumnos deberán realizar el sigu íente trabajo, la entrega del informe se realizará
individualmente en formato digital por la plataforma TEAMS o por el Campus Virtual según sea habilitado.
Materiales
Para el ejercicio se usará, además de las placas de desarrollo Raspberry Pi Pico y/o Raspberry Pi Pico W,
LED's, presets o potenciómetros, pulsadores, resistencias necesarias y un protoboard donde conectar todo.
Informe
Enunciado
El siguiente puntos debe estar resuelto aplicando, cuando sea pertinente, interrupciones de GPIO, demora
anti-rebote por software y utilizando el systick para medir los tiempos necesarios. Es conveniente armar el
sistema completo para luego poder desarrollar el punto pedido.
l. Se pide elaborar un sistema que al recibir por UART (115200, SN 1) el valor de la entrada
analógica de la placa 1 cambie la intensidad del brillo del LED de la placa 2 y esta última deberá
enviarle por UART a la placa 1 el porcentaje de brillo que deberá ser visualizado p r algún
método (leds, display 7 segmentos, display LCD ... ).
2 de 5
Esquema eléctrico
3 de 8
Código:
Pico 1:
#include <stdio.h>
#include "pico/stdlib.h"
#include "stdlib.h"
#include "systick.h"
#include "hardware/adc.h"
#include "hardware/pwm.h"
#include "hardware/uart.h"
#include "string.h"
void lcd_port(int a); // Funciones para el manejo del LCD 20x2 a 4 bit
void lcd_cmd(int com);
void lcd_putchar(char a);
void lcd_putstr(char a[]);
void lcd_move_to(int col, int row);
int escalado(int a);
int main(){
frec_adc = get_systick(); // Asigna valores de systick para definir el periodo de ejecicion de cada funcion
frec_lcd = get_systick();
frec_uart = get_systick();
4 de 8
lcd_port(0x00); // Inicializa el LCD
sleep_us(20000);
lcd_cmd(0x03);
sleep_us(5000);
lcd_cmd(0x03);
sleep_us(11000);
lcd_cmd(0x03);
lcd_cmd(0x02);
lcd_cmd(0x02);
lcd_cmd(0x08);
lcd_cmd(0x00);
lcd_cmd(0x0C);
lcd_cmd(0x00);
lcd_cmd(0x06);
lcd_cmd(0x00);
lcd_cmd(0x01);
sleep_us(5000);
lcd_putstr("Intensidad:");
while(1){
if(cont_muestras == cant_muestras){ // Filtro del valor ADC. toma 5 valores y los promedia
frec_uart += 10;
dato_tx[1] = cuentas & 0x00ff; // Pasa el Valor de la variable Cuentas de 16 bit al vector
dato_tx[2] = (cuentas & 0xff00) >> 8; // dato_tx a 2 valores de 8 bit
//printf("Inicio = %c, Dato tx 1 = %i, Dato tx 2 = %i, Fin = %c \r\n",dato_tx[0], dato_tx[1], dato_tx[2], dato_tx[3]);
dato_rx[0] = uart_getc(UART_ID);
dato_rx[1] = uart_getc(UART_ID);
dato_rx[2] = uart_getc(UART_ID);
dato_rx[3] = uart_getc(UART_ID);
if(dato_rx[3] == 'F'){
}
}
}
if(frec_lcd <= get_systick()){ // Actualiza el LCD cada 100 ms Con el Valor recibido de la UART
frec_lcd += 100;
lcd_putstr(" ");
lcd_move_to(11,0);
utoa(escalado(dato_16),cuentas_char,10);
lcd_putstr(cuentas_char);
lcd_putchar('%');
lcd_move_to(11,0);
5 de 8
}
}
}
return;
}
gpio_put(lcd_rs_pin,false);
lcd_port(com);
gpio_put(lcd_en_pin,true);
sleep_us(4000);
gpio_put(lcd_en_pin,false);
return;
}
//printf("%i\r\n",a);
int temp = a & 0x0f;
int y = a & 0xf0;
gpio_put(lcd_rs_pin,true);
y = y >> 4;
lcd_port(y);
gpio_put(lcd_en_pin,true);
sleep_us(40);
gpio_put(lcd_en_pin,false);
lcd_port(temp);
gpio_put(lcd_en_pin,true);
sleep_us(40);
gpio_put(lcd_en_pin,false);
sleep_us(40);
return;
}
int i=0;
while(a[i] != '\0'){
lcd_putchar(a[i]);
i++;
}
return;
}
void lcd_move_to(int col, int row){ // Funcion para posicionar el cursor en el LCD
if (row == 0){
6 de 8
int temp = 0x80 + col;
int z = temp >> 4;
int y = temp & 0x0f;
lcd_cmd(z);
lcd_cmd(y);
}
return;
}
int escalado(int a){ // Funcion para el escalado del recibido del UART a % para mostrar en el LCD
return salida;
Pico 2:
#include <stdio.h>
#include "pico/stdlib.h"
#include "stdlib.h"
#include "systick.h"
#include "hardware/uart.h"
#include "hardware/pwm.h"
#include "string.h"
int main(){
gpio_set_function(led_pwm,GPIO_FUNC_PWM);
uint slice = pwm_gpio_to_slice_num(led_pwm);
uint chan = pwm_gpio_to_channel(led_pwm);
pwm_set_clkdiv_int_frac(slice,15,4);
pwm_set_wrap(slice,4095);
pwm_set_enabled(slice,true);
gpio_set_function(UART_TX_PIN, GPIO_FUNC_UART);
gpio_set_function(UART_RX_PIN, GPIO_FUNC_UART);
frec_uart = get_systick();
while(1){
frec_uart += 10;
7 de 8
for(int i = 0; i <=3; i++){
dato_rx[0] = uart_getc(UART_ID);
dato_rx[1] = uart_getc(UART_ID);
dato_rx[2] = uart_getc(UART_ID);
dato_rx[3] = uart_getc(UART_ID);
if(dato_rx[3] == 'F'){ // Si el último dato Leído es F, considera la cadena como valida y realiza conversión
}
}
}
}
8 de 8