No hace mucho que mis clases de Dispositivos Programables empezamos a trabajar con una nueva tarjeta por lo menos para mí, no es que sea compleja realmente comparada con otras básicamente se programa en C++ y es bastante dinámica, como yo muchos al toparse con ella tienen dudas así que hoy este breve tutorial será sobre como poder configurar y empezar a programar la tarjeta Freedom KL25Z desarrollada por NXP. ¿Qué vamos a aprender aquí? Como dije anteriormente el objetivo es configurar nuestra tarjeta freedom para poder programar en ella esto haciéndolo desde la plataforma online mbed.com (No, no necesitas descargar e instalar nada de nada).
Tutorial paso a paso
1. Muy bien, lo primero será ir a la web de mbed.com y registrarnos de forma común y corriente o puedes ir al formulario de registro directamente dando click por aquí.
2. Por supuesto es obvio que ya debemos tener por ahí en la mesa nuestra tarjeta pero aún no la conectaremos, una vez hemos completado el formulario de registro ¡Tarea fácil! los logueamos ahora sí como se ve en la imagen:
Te dejo una cuenta de prueba:
Ya tiene la tarjeta configurada puedes checar y mirar lo que gustes y luego crear la tuya.
USUARIO: reymundo28894@mailbox52.ga
CONTRASEÑA: 52b927635
3. Una vez dentro nos volverá a cargar el home del portal de mbed ahora vamos a seleccionar nuestra tarjeta para empezar a programarla vamos darle donde dice "Compiler":
4. Nos abrirá por aparte nuestro entorno de Desarrollo o también llamado "Workspace Management" no explicaré cada parte del entorno ya que el objetivo es seleccionar la tarjeta y dejarla lista así que iremos donde dice "No device selected":
5. Este es el punto clave ahora daremos donde dice "Add board" y luego buscaremos la que dice "FRDM-KL25Z" veamos el siguiente GIF:
Click sobre la imagen para ampliar
6. Luego de ver algunas características sobre nuestra tarjeta simplemente daremos donde dice "Add to your Mbed Compiler"
7. Luego volveremos a nuestro "Workspace" y actualizamos con F5 para finalmente ver nuestra tarjeta seleccionada y lista nos saldrá automáticamente la posibilidad de crear un nuevo programa:
El anterior programa precargado se trata del famoso "Hola mundo" o hacer titilar un led , luego, nos creará los archivos necesarios para trabajar en nuestro código y de allí todo lo haremos en el archivo "main.cpp":
Click en la imagen para ampliar
8. Ahora simplemente crearás tu código o puedes cargar ese que ya hay de prueba para ello conecta tu tarjeta en tu puerto USB y luego da en compile:
9. Nos creará un archivo con extensión ".bit" y lo descargará a nuestro equipo generalmente en la carpeta descargas o escritorio lo que haremos será con la tarjeta ya conectada (Que fue reconocida como un dispositivo de almacenamiento USB) copiar el archivo dentro de ella como si fuera una USB común y corriente:
10. Observa tu tarjeta y como el led RBG empieza a titilar ¿Lo hace? felicidades ya puedes empezar a usar tu tarjeta sin problema alguno con cuánto código se te ocurra. En conclusión, como vimos configurar esta tarjeta es bastante fácil y preferí hacerlo paso a paso para que alguien por más nuevo que sea no se pierda, la ventaja de todo esto es que no es necesario instalar nada en nuestro equipo ya que el entorno de programación está en la nube al ser la plataforma "mbed.com" espero les haya gustado este breve tutorial.
Este proyecto es desarrollado en Assembler al final del post puedes descargar todo el proyecto + código + simulación
¡Un post más! Un buen SkullTraper sabe que aquí ponemos excelentes proyectos para motivarte, el día de hoy traemos un proyecto hecho en el lenguaje "Assembler" antes que nada quiero agradecer a +Juanita triana y +Nathan Bromberg que me facilitó su proyecto yo hice algunos vídeos y pequeñas modificacionessobre su proyecto ya que son compañeros de la Universidad.
¿DE QUE TRATA EL PROYECTO?
Te dejo un vídeo del Proyecto funcionando ;)
Este proyecto tiene como objetivo realizar un cronómetro pero en lenguaje ensamblador (Este no es en C como los otros proyectos 😧), más exactamente el planteamiento dice lo siguiente:
Tomando como referencia el diagrama que se ilustra en la figura, se desea diseñar e implementar un cronómetro cuyo conteo esté dado en décimas de segundo (0.0 - 0.1 - 0.2 --- 9.8 - 9.9 - 0.0 --). Un pulsador permite iniciar o continuar el conteo, otro permite detener y otro borrar.
DESARROLLO COMPLETO DEL PROYECTO
Como siempre y es sagrado de inicio aclaro que el proyecto fue realizado en MPLAB "El viejo confiable para proyectos con PIC" no se hizo uso de librerías especiales añadidas, para simulación proteus como siempre, como tal el proyecto es sencillo y fácil de entender al final podrás descargar todo el contenido de este proyecto 😄:
1. MATERIALES Y COMPONENTESEn este proyecto fue necesario el siguiente uso de componentes:
- x1 Programador de PICS (Pickit2) - x1 PIC16F877A - x2 Displays 7 segmentos - x3 leds pequeños - x3 pulsadores normales - x3 resistencias de 220 ohms - x2 Capacitores de 15pF - Jumpers o puentes de conexión - x1 Protoboard - x1 fuente de voltaje, 5V está bien para trabajar - x1 Cristal de Cuarzo de 4MHz - x2 resistencias de 330 ohms - x1 resistencia de 10k ohms - x1 capacitor de 0,1uF
¡Listo! con esto podremos iniciar el proyecto sin problema alguno.
1.1. Cálculos de resistencias y demás
Este paso es opcional pues prácticamente más arriba di los números precisos de cada componente, pero, si deseas saber como se hizo aquí te lo explico, este paso es para determinar a exactitud que valor de resistencias usar para los leds y displays, ¡Vamos que si llevan por seguridad!
Resistencias de los LEDS, sabemos que la máxima corriente de salida de los puertos del microque usamos, es decir, el PIC es de 25mA, pero, en este caso sólo se usará 15mA. El voltaje promedio son 5Vy en los leds irán 3,5Vusarán los leds, ahora, por ley de ohm nuestro pequeño despeje queda:
Resistencias para los displays, aplicamos el mismo principio anterior, ley de Ohm, entonces nos da:
Retardo en mS, para el retardo incialmente se había propuesto 100mS, pero, después del retardo siguen algunas instrucciones antes de volver a incrementar, se propone un retardo de 45mS aproximadamente:
2. SIMULACIÓN PROTEUS
La simulación como siempre hecha en Proteus todo normal y fácil de entender es apenas algo así:
3. CÓDIGO COMPLETO, PROGRAMA PIC
El código del proyecto no es muy largo y de hecho es bastante fácil de entender "siempre y cuando domines el lenguaje" no se hizo necesario el uso de alguna librería personalizada o similar:
Como es siempre sagrado el montaje final del proyecto en una foto, aunque este proyecto no lo montó ningún miembro del equipo de SkullTrap damos la foto de como debería quedar similar:
Es todo en este proyecto, como siempre digo que en la publicación de proyectos no profundizamos mucho en explicaciones ya que seguro si buscas un proyecto de este calibre es porque entiendes la gran mayoría de cosas. De igual forma si tienes dudas puedes comentar libremente, seguro te la podemos resolver de ser posible.
ACTUALIZACIÓN 22/11/2018: He hecho algunas mejoras al código por problemas con el teclado y mostrar valores que no correspondían, además detallaré mejor la explicación del proyecto y su simulación.
¡Hola SkullTraper! Bienvenidos a un nuevo artículo "Publicación de un proyecto" Donde Vamos a ver un proyecto 100% funcional lo hemos desarrollado con unos compañeros de la Universidad en algunos 3 o 4 días tuvimos algunos líos de manejo de teclado con el PIC pero todo bien.
¿DE QUÉ TRATA EL PROYECTO?
Mira el funcionamiento del proyecto en este vídeo ;)
El Proyecto como el título lo indica se trata de controlar temperatura con un LM35 pero más a fondo el problema planteado es el siguiente:
Se desea implementar un sistema regulador de temperatura, que adquiera y visualice en una pantalla LCD el valor de temperatura registrado por medio de un LM35, y lea por un teclado matricial valores de alarma de temperatura alta y baja. Si los valores límites son alcanzados debe mostrarse en la pantalla mensajes que así lo indiquen. En la pantalla debe mostrarse siempre la temperatura leída, y un mensaje que indique si está baja, normal o alta.
DESARROLLO COMPLETO DEL PROYECTO
Aclaro de inicio como siempre se usó MPLAB y PIC C para ejecutar archivos, además se hizo uso de librerías para LCD y el teclado es importante que no modifiques nada de las librerías salvo que seas excelente manejando C, si no mueves nada y lo haces tal cuál el proyecto te funcionará:
1. Materiales y componentes
Para este proyecto los materiales y componentes a precisión fueron los siguientes:
- x1 Programador de PICS (Pickit 2 el que usamos).
- x1 PIC16F877A.
- x1 LCD 16x2.
- x1 teclado matricial 4x4.
- x1 fuente de voltaje, 5 voltios está bien para trabajar.
- Jumpers o puentes de cable UTP para conexiones.
- x1 Potenciometro de 10k.
- x1 LM35 para sensar la temperatura.
- x1 Cristal de Cuarzo de 4MHz.
- x1 Protoboard (Ahí cabe todo el proyecto).
¡Listo!con esto iniciamos el proyecto sin problema alguno.
2. Simulación Proteus
La simulación en Proteus aunque es una captura apenas, sería algo así, recuerden que al final del post dejaré el link para descargar el proyecto completo si lo desean:
2.1. ¿Cómo probar el código en la simulación? Muchos me han escrito para probar la simulación en proteus antes de montar el circuito con el PIC, para hacerlo es muy fácil, cuando descargues el proyecto al final del post, abrirásla carpeta simulación > templm35, esto será un archivo proteus que se verá como la imagen anterior, luego daremos doble click sobre el PIC y nos saldrá la siguiente ventana:
Carga de archivo .hex en el pic en proteus
- Daremos click en la carpeta de "Program file" y buscaremos luego el archivo con extensión (.HEX) luego click en abrir:
Una vez cargado el archivo procedemos a simular nuestro proyecto y comprobar el funcionamiento de forma correcta como se ve en la siguiente imagen todo pinta bien al ver en el display el mensaje "HOLA USUARIO BIENVENIDO":
Simulación funcionando
Si ves que todo está OK sólo queda que realices el montaje y montes el archivo finalemente en el pic de forma física.
3. Código completo, programar PIC
En el proyecto completo están incluídas las librerías las cuales son "DriverTec4x4.c" y "LCD.c" no hace falta modificarlas en lo absoluto ¡No lo hagas!.
El código del proyecto en sí completo (Hay que tener en cuenta las librerías de teclado y LCD) es el siguiente:
#include <16F877A.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
//LIBRERÍAS AÑADIDAS *NO MODIFICAR LIBRERÍAS*
#include <lcd.c>
#include <DriverTec4x4.c>
int8 dig1,min0,dig2,min3,imprime,dig3,atencion,dig,max0,max3;
int1 detector;
int16 ayuda,temperatura,temp,Tmax,Tmin,min1,max1;
lcd_init();
void EjecuConversor(){
setup_adc(ADC_CLOCK_INTERNAL); // Configura el conversor
setup_adc_ports(AN0); // Entrada RA0 como analógica
set_tris_A(0xFF); // Todo el PortA como entrada
set_adc_channel(0); // Seleccionar un canal (en este caso Canal 0)
delay_us(10); // Retardo necesario entre la selección de canal y la adquisición.
}
void DescomponerDigitos(int16 Dato){
int16 aux;
Dig1= Dato/1000;
Dig2= (Dato%1000)/100;
aux= Dato%100;
Dig3= aux/10;
}
void ProcesarSenal(){
int32 Read;
Read= ayuda;
temperatura=(100)*((Read*5.0)/1023.0)*(100);
//temperatura=*100;
DescomponerDigitos(temperatura);
Dig1+= '0';
Dig2+= '0';
Dig3+= '0';
}
// Esta función ejecuta la acción requerida por cada pulsador del teclado.
void ProcesarTeclado(){
switch (atencion){
case 0: //TECLA 1
imprime="1";
dig=1;
detector=1;
break;
case 1: //TECLA 2
imprime="2";
dig=2;
detector=1;
break;
case 2: //TECLA 3
imprime="3";
dig=3;
detector=1;
break;
case 3: //TECLA A
imprime="A";
break;
case 4: //TECLA 6
imprime="6";
dig=6;
detector=1;
break;
case 5: //TECLA 5
imprime="5";
dig=5;
detector=1;
break;
case 6: //TECLA 4
imprime="4";
dig=4;
detector=1;
break;
case 7: //TECLA B
imprime="B";
break;
case 8: //IMPRIME 7
imprime="7";
dig=7;
detector=1;
break;
case 9: //TECLA 8
imprime="8";
dig=8;
detector=1;
break;
case 10: //TECLA 9
imprime="9";
dig=9;
detector=1;
break;
case 11: //TECLA C
imprime="C";
break;
case 12: //TECLA ASTERISCO
imprime="x";
break;
case 13: //TECLA CERO
imprime="0";
dig=0;
detector=1;
break;
case 14: //TECLA NUMERAL
imprime="X";
break;
case 15: //TECLA D
imprime="D";
}
if(atencion!=16){ // Si se oprimió algún pulsador se
delay_ms(150); // elimina rebote.
}
}
void VisualizarLCD(){
lcd_gotoxy(1,2);
lcd_putc("Temp: ");
lcd_putc(Dig1);
lcd_putc(Dig2);
lcd_putc(".");
lcd_putc(Dig3);
lcd_putc(" ");
}
//===========EJECUCIÓN DEL PROGRAMA
void main() {
lcd_init();
EjecuConversor();
set_tris_B(0x0F);
port_b_pullups(TRUE);
while(TRUE){
lcd_gotoxy(13,1);
lcd_putc("fHOLA USUARIO");
lcd_gotoxy(1,2);
lcd_putc("BIENVENIDO");
delay_ms(4000);
lcd_putc("fIngresar limites");
lcd_putc("nTmin: ");
while(TRUE){
atencion=LeerTeclado(); //Lee la funcion teclado
ProcesarTeclado();
min1=dig;
lcd_gotoxy(7,2);
lcd_putc(imprime);
delay_ms(150);
if(detector==1){
break;
}
}
imprime=" ";
detector=0;
while(TRUE){
atencion=LeerTeclado();
ProcesarTeclado();
min0=dig;
lcd_gotoxy(8,2);
lcd_putc(imprime);
delay_ms(150);
if(detector==1){
break;
}
}
imprime=" ";
detector=0;
while(TRUE){
atencion=LeerTeclado();
ProcesarTeclado();
min3=dig;
lcd_gotoxy(9,2);
lcd_putc(".");
lcd_putc(imprime);
delay_ms(150);
if(detector==1){
break;
}
}
imprime=" ";
detector=0;
Tmin=(min1*100)+(min0*10)+min3;
lcd_putc("fIngresar limites");
lcd_putc("nTmax:");
while(TRUE){
atencion=LeerTeclado();
ProcesarTeclado();
max1=dig;
lcd_gotoxy(7,2);
lcd_putc(imprime);
delay_ms(150);
if(detector==1){
break;
}
}
detector=0; //DETECTA MI PULSACIÓN DE TECLA ANTES DE DAR
// UN SALTO AL SIGUIENTE DIGITO O TEMP
imprime=" ";
while(TRUE){
atencion=LeerTeclado();
ProcesarTeclado();
max0=dig;
lcd_gotoxy(8,2);
lcd_putc(imprime);
delay_ms(150);
if(detector==1){
break;
}
}
detector=0;
imprime=" ";
while(TRUE){
atencion=LeerTeclado();
ProcesarTeclado();
max3=dig;
lcd_gotoxy(9,2);
lcd_putc(".");
lcd_putc(imprime);
delay_ms(150);
if(detector==1){ //SI EL DETECTOR SE ACTIVA PASA AL
//SIGUIENTE REGISTRO LUEGO DE LEER LOS DATOS
break;
}
}
Tmax=(max1*100)+(max0*10)+max3;
lcd_putc("fmin=");
if(min1==0)
{min1="0";
}else
{
min1=min1+'0';
}
min0=min0+'0';
lcd_putc(min1);
lcd_putc(min0);
if(min3==0){
min3=" ";
}else{
min3=min3+'0';
lcd_putc(".");
}
lcd_putc(min3);
lcd_gotoxy(9,1);
lcd_putc("max=");
if(max1==0)
{max1=" ";
}else
{
max1=max1+'0';
}
max0=max0+'0';
lcd_putc(max1);
lcd_putc(max0);
if(max3==0){
max3=" ";
}else{
max3=max3+'0';
lcd_putc(".");
}
lcd_putc(max3);
while (true){
delay_ms(200);
ayuda= read_adc(); // Adquisición de la señal
ProcesarSenal(); // Función encargada de procesar el dato adquirido
temp=temperatura/10;
if(temp<=Tmin)
{
lcd_gotoxy(1,2);
VisualizarLCD();
lcd_gotoxy(13,2);
lcd_putc("Bajo");
}else if(temp>Tmin && temp<Tmax) //COMPARACION BOOLEANA !!!!importante!!!!
{
VisualizarLCD();
lcd_gotoxy(13,2);
lcd_putc(" :)");
}else if(temp>=Tmax)
{
lcd_gotoxy(1,2);
VisualizarLCD();
lcd_gotoxy(13,2);
lcd_putc("Alto");
}
//============INICIO MANEJO DE ERRORES
if(Tmax==Tmin){
lcd_gotoxy(13,1);
lcd_putc("fLOS LIMITES NO");
lcd_gotoxy(1,2);
lcd_putc("DEBEN SER IGUAL");
delay_ms(4000);
lcd_gotoxy(13,1);
lcd_putc("fINGRESE DATOS");
lcd_gotoxy(1,2);
lcd_putc("VALIDOS DE NUEVO");
delay_ms(5000);
break;
}
if(Tmax<Tmin){
lcd_gotoxy(13,1);
lcd_putc("fTMin NO DEBE SER");
lcd_gotoxy(1,2);
lcd_putc("MAYOR QUE TMax");
delay_ms(4000);
lcd_gotoxy(13,1);
lcd_putc("fINGRESE DATOS");
lcd_gotoxy(1,2);
lcd_putc("VALIDOS DE NUEVO");
delay_ms(5000);
break;
}
//=============FIN MANEJO DE ERRORES
}
}
}
4. Montaje final proyecto
El montaje final no siempre es el más estético y no todos deben parecerse jajaja después de todo son proyectos un poquito apresurados pero funcionan al 100 de 100 entonces algo así a los afanes el montaje nos quedó como vemos todo en una sola protoboard:
Es todo el contenido de este proyecto si notas algún error o problema puedes comentar estamos para resolver dudas recuerda visitar nuestra tienda para adquirir nuestros productos.