Buscar este blog

Información semanal de las clases de electrónica y las sucesivas prácticas realizadas por Guillermo Cayetano Espejo alumno del Ciclo de Grado Superior de Manteniemintos Electronicos de 2º Curso del CIFPN1 (Peñacastillo,Santander) Dpto:Electricidad y Electrónica

jueves, 8 de diciembre de 2016

Practica 3 Arduino Ethernet

Introducción:
El objetivo de esta  práctica es crear un servidor web con arduino a través de su placa complementaria de Ethernet (Ethernet Shield), y visualizarlo desde fuera de una red local. Además en la página, debe leerse un sensor, previamente colocado en arduino, de temperatura (LM35) y visualizar la temperatura con un refresco de tiempo continuo.

Desarrollo:
Lo primero que hice fue desarrollar un programa de lectura de temperatura, el LM35 es un chip que lee temperatura en  y ofrece una salida de 10 mV por grado centígrado. Por ello lo que haremos será colocar el chip LM35 a un pin analógico de arduino, en mi caso al 4, y hacemos una conversión para que nos muestre el valor directamente en grados centígrados.  Si  10 mV es un grado centígrado y el pin analógico abarca un rango de valores entre 0 y 1024, primero hay que convertir el valor leído por el pin a mili voltios, dado que 5 v es la tensión máxima, 5000 mv corresponde a 1023 el valor máximo analógico, si tenemos l valor analógico que lee el pin aplicando una regla de tres podemos sacar el valor en mili voltios que corresponde al valor analógico en cada momento:



Con el valor en mili voltios, tan lo hay que dividirlo entre 10 para sacar el valor en grados centígrados ya que 1 grado eran 10 mV para el sensor.
Programa temepratura:
…………………………………………………………………………………….
float tempC;
int tempPin =4; // Definimos la entrada en pin A0

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:
   tempC = analogRead(tempPin);
    Serial.println(tempC);

    // Convierte el valor a temperatura
    tempC = (5* tempC * 100.0)/1023.0;

    // Envia el dato al puerto serial
  
    Serial.println(tempC);
    Serial.println(" grados Celsius\n");

    // Espera cinco segundo para repetir el loop
    delay(3000);

}
…………………………………………………………………………………..
El programa principal es donde integraremos el servidor web, para ello utilizaremos las librerías Ethernet y SPI la primera la utilizaremos para configurar ll servidor web (IP,MAC…) la segunda es para comunicarnos por el BUS SPI con la placa de Ethernet de Arduino.

Para poder realizar esta práctica con éxito debemos abrir un puerto en nuestro router para permitir conectarse nuestro servidor ya que alojaremos el servidor en mi red local y si quiero acceder desde la red pública e de abrir un puerto.



Como se puede apreciar en la imagen superior, abrí el puerto 80 en mi router para una IP específica (192.168.1.30) que es la que por programación le he dado a mi servidor web.
De este modo introduciendo esa IP como URL en un red pública, el router lo detecta y lo renvía al puerto abierto para esa IP, el 80 en mi caso.
A continuación muestro el programa final, con explicaciones básicas de cada comando, excepto el código HTML que es el que he usado para formar la página, ya que he usado un formato estándar de programación y no tengo conocimiento suficiente para dar una explicación detallada.
Programa Principal:
…………………………………………………………………………………………….

/*
/////////////////////////////////////////////////////////////////////////////
// Autor: Guillermo Cayetano Espejo               23/11/2016//
/////////////////////////////////////////////////////////////////////////////
// Programa:Servidor Web con sensor de temoeratura        Version: 1.0
// Dispositivo:Atmel 328                                  Compilador:AVR
// Entorno IDE: 1.6.12                                    Simulador: Vitronic
// Tarjeta de aplicacion:  Arduino                        Debugger:
////////////////////////////////////////////////////////////////////////////
//Consista en leer la entrada analogica de un sensor de temperatura       //
// analogica de un sensor de temperatura y subirla a un servidor web.     //
////////////////////////////////////////////////////////////////////////////
*/
/////////////////LIBRERIAS//////////////////////////////////////////////////
#include <SPI.h> //Definimos la libreria de la comunicacion SPI (#include es una directiva que le dice al compilador que busque
//la libreria escrita).
#include <Ethernet.h> // Definimos la libreria Ethernet


byte mac[]={0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // Escribimos la MAC de nuestra shield de Ethernet ( suele venir escrita por debajo).
IPAddress ip(192,168,1,30);  // Asignamos la IP a Arduino (Va entre comas) ponemos la //Privada que le queremos asignar , ya que lo usaremos como servidor de la página web que //creemos debemos tener cuidado ya que nuestro router puede tener el protocolo DCHP //activado y cambiar esta IP de vez en cuando, si ocurre esto podemos desactivar el servicio //DHCP en el router o asignar un dominio a la IP, aunque lo mejor es fijar una IP por dirección //MAC en el router así para esa MAC siempre le da la misma IP Privada, también debemos //abrir un puerto para que al entrar desde fuera de la red local nos re direccione a nuestra IP. //En el router abro el puerto 80 y le asigno la IP local que he puesto.



EthernetServer server(80);  //Creamos un servidor web en el puerto 80 que es el puerto HTTP por defecto
/////////////////Variables Globales/////////////////////////////////////////

float tempC;
int tempPin =4; // Definimos la entrada en pin A0

/////////////////Funciones//////////////////////////////////////////////////

/////////////////Configuración(SETUP)/////////////////////////////////////////   
void setup()
 {
  // Abre puerto serial y lo configura a 9600 bps (baudios por segundo)
   Serial.begin(9600);
   Ethernet.begin(mac,ip); // Comienza la connexion
   server.begin();
 }

 /////////////////Principal (LOOP)///////////////////////////////////////////
void loop()
 {
   EthernetClient client=server.available(); // Creamos el objeto cliente de la clase //EthernetClient cuando se ejecute la función "available" del objeto server que creamos para //la clase EthernetServer, la función se ejecutara ( y por tanto el objeto client se creara) //cuando se  detecte un cliente a través de una petición HTTP.
    if (client){
        Serial.print(" Cliente Nuevo: ");
        boolean currentLineIsBlank=true; // Las peticiones HTTP acaban con una línea en blanco, //así que creamos una variable booleana para esa línea.
        while (client.connected()){// Mientras el cliente este conectado....
              if(client.available()){ // Si el cliente está disponible...
                  char c=client.read(); // Leemos la petición HTTP carácter por carácter.
                  Serial.write(c); // Visualizamos la petición HTTP en el monitor serie.
                  if (c == '\n' && currentLineIsBlank){  // Al recibir línea en blanco la petición HTTP ha //terminado, ahora mandaremos la respuesta en HTML.
                       // Enviamos al cliente una respuesta HTTP
                       // Escribimos el código HTML
                       client.println("HTTP/1.1 200 OK");
                       client.println("Content-Type: text/html");
                       client.println("Connection: close");  // La conexión se cerrara después de //completar la respuesta
                       client.println("Refresh: 5");  // Refresca la página cada 5 segundos
                       client.println();
                   
                       //Cabezera:
                      client.println("<!DOCTYPE html>");          // Envía la página Web
                      client.println("<html>");
                      client.println("<head>");
                      client.println("<title>Sensor De Temperatura</title>");
                      client.println("</head>");
                      client.println("<body background=http://www.hdfondos.eu/pictures/2014/0412/1/outer-space-dark-stars-images-155548.jpg"); // Defines una imagen de fondo de pantalla
                      client.println("<B>");//Escritura en negrita a partir de aquí
                      client.println("<FONT FACE=arial SIZE=5 COLOR=YELLOW >"); // Define el tipo de //letra el tamaño y el color
                      client.println("<h1>LM35</h1>");
                      client.println("<p>Sensor de temperatura por Guillermo Cayetano.</p>");
                      client.println("<form method=\"get\">");              
                     
                      
                       //Se muestra el valor de la entrada analógica:
                        tempC = analogRead(tempPin);
                        // Convierte el valor a temperatura
                        tempC = ((5* tempC * 100.0)/1023.0)-8; //LM35 indica mide en mv/C (mili voltios //entre Grados Centígrados) por eso debemos multiplicar por 100.
                        client.print("La temperatura en mi casa es:  ");
                        client.print(tempC);
                        client.print(" grados centígrados  <br>");
                        client.println("</B>");//Cerramos escritura en negrita
                        client.println("</FONT>");//Cerramos el formato de escritura abierto antes
                        client.print("<IMG SRC=http://4.bp.blogspot.com/-mIRoj-lZlZY/UJzqh4UfshI/AAAAAAAAJgw/kJZ1Z2kisoE/s1600/b2bdeca50ad5715437373cd170ffaa4d_article.png>"); //Establece una imagen
                        client.println("</form>");
                        client.println("</body>");
                        client.println("</html>");



                       
                       

                       
                    break;  
                  }
                       if (c== '\n'){
                            currentLineIsBlank=true; 
                       }
                       else if (c !='\r'){
                            currentLineIsBlank=false;
                       }
               }
         
         }
         delay(100);
         client.stop();// Cierra la conexión con cliente.
      }
  
    boolean lineaenblanco=true; // Las peticiones HTTP acaban con una línea en blanco, así que //creamos una variable booleana para esa línea.
   // Lee el valor desde el sensor
    tempC = analogRead(tempPin);
    Serial.println(tempC);

    // Convierte el valor a temperatura
    tempC = ((5* tempC * 100.0)/1023.0)-8;

    // Envía el dato al puerto serial
  
    Serial.println(tempC);
    Serial.println(" grados Celsius\n");

    // Espera cinco segundo para repetir el loop
    delay(3000);
 }


………………………………………………………………………………….


Compilamos y subimos el programa a Arduino, y lo conectamos al router además de alimentarlo. Hay que tener en cuenta que el servidor se encuentra en el mismo Arduino, por lo tanto este debe estar alimentado y conectado a la Red para poder visualizar la página Web.

Archivos fuente en el siguiente enlace:
Ethernet 

martes, 6 de diciembre de 2016

Practica 2: RTC


Introducción:
En esta  práctica lo que vamos a hacer es imprimir la fecha y hora en una pantalla LCD (Liquid Crystal Dislay) ofrecida por un módulo RTC (Real time clock) todo ello dirigido por un dispositivo a Arduino, mediante comunicación I2C.

Desarrollo:
Lo primero que debemos conocer es cómo funciona el BUS I2C, a grandes rasgos es un BUS en el que la comunicación se establece en dos hilos (tres contando GND), uno será SDA que es el de datos y otro es el SCL que es el reloj para sincronizar la comunicación. (Bus explicado extensamente en este mismo blog en la entrada:(Bus I2C).
La pantalla viene con un chip integrado (Expansor remoto de I/O a I2C), con lo que la comunicación con este chip ya se hace en I2C.
El módulo RTC (DS1307), viene integrado con el cristal y ofrece su salida en I2C, además lleva una pila integrada para mantener la hora después de apagarse.
La conexión es sencilla por un lado, se conectan las salidas de la pantalla y el RTC del bus I2C (SDA y SCL) a las entradas del Arduino del mismo nombre los cuales físicamente son los pines analógicos 4 y 5. Seguidamente se alimenta la pantalla y el RTC a 5 voltios desde la salida de 5 voltios del arduino.
Después de realizar el montaje solo queda hacer el programa, yo le he hecho en Proteus para poder hacer un esquemático del montaje, pero como había conflicto con algunas libreris cargue el programa desde el IDE de arduino.


En mi caso he utilizado dos librerías: virtuabotixRTC y LiquidCrystal_I2C, la primera la utilizo para establecer la hora del RTC por primera vez, y para crear el objeto RTC. La segunda la utilizo para printar en la pantalla LCD.
El Programa:
/*
////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: Guillermo                                              Octubre/2016
////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:    Practica2 RTC             VERSIÓN:       1.3
//   DISPOSITIVO: ATMEL 328                            COMPILADOR:    AVR
//   Entorno IDE:   1.6.12                              SIMULADOR:     VIRTRONIC
//   TARJETA DE APLICACIÓN: ARDUINO                    DEBUGGER:    
////////////////////////////////////////////////////////////////////////////////////
Printar en pantalla LCD la hora y la fecha establecidos por un RTC.
////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
// LIBRERÍAS //////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
//
*/
// Declaramos las librerías
#include <Wire.h>
#include <virtuabotixRTC.h>
#include <LiquidCrystal_I2C.h>
// include--> es una directiva que le dice al compilador donde buscar la librería
//"<>" Con esas instrucciones le dices al compilador que busque las librerías en el lugar por defecto.
virtuabotixRTC RTC(2,3,4); // Instancias la clase virtuabotixRTC y creas el objeto RTC y como   //demanda la librería virtuabotix le asignamos los pines que corresponden en orden al reloj, datos
// y reset del RTC(DS1302).
LiquidCrystal_I2C lcd(0x27,16,2); // Instancias la clase LiquidCrtistal y creas el objeto lcd y se le //asigna la dirección y los pines que corresponden en orden a: dirección, columnas y filas.

///////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
int start=0; // Inicializamos la Variable global de tipo int 2 bytes (65536).



////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////
// CONFIGURACIÓN ///////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void setup()
{

Wire.begin(); // Inicializamos las funciones de I2C de arduino (Que es lo que hace la librería Wire)
//RTC.setDS1302Time(0,9,10,4,11,11,2016);  // Activas la función de la librería virtuabotix para el //objeto RTC, Esta función le metes la fecha y hora y se la asigna al rtc, solo sería necesario hacerlo //la primera vez, luego esa línea se podría comentar. Los parámetros son n orden: seg, min, hora, //diadelasemana, diadelmes, mes, año.


lcd.begin(16,2); //Inicializamos el LCD con 16 columnas y 2 filas.
lcd.backlight(); // Establece la retroiluminación en nuestro objeto lcd.
}
////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void loop()
{

   if (start==0){
   lcd.print("Buenos Días"); // Al empezar start vale 0 y nos da un mensaje de Buenos Días.
   delay(1000);
   }
start++; // Incrementa la variable global start en uno.
RTC.updateTime(); // Esta función pertenece a la librería virtuabotix y lo que hace es subir el //tiempo del reloj al objeto RTC.



lcd.setCursor(0,0); //Esta función sitúa el cursor (por llamarlo de alguna forma) en la posición que  //le des, en este caso es 0,0 por lo tanto lo siguiente que se escriba en el LCD empezara a partir de //la columna 0 y fila 0.

// lcd.print("Hora ");
   if (RTC.hours<10){// Si el valor de la hora es menor de 10 pone un "0" delante
      lcd.print("0");
      lcd.print(RTC.hours);
   }
   else{
      lcd.print(RTC.hours);
   }

lcd.print(":");
   if (RTC.minutes<10){
      lcd.print("0");
      lcd.print(RTC.minutes);
   }
   else{
      lcd.print(RTC.minutes);
   }

lcd.print(":");
   if (RTC.seconds<10){
      lcd.print("0");
      lcd.print(RTC.seconds);
   }
   else{
      lcd.print(RTC.seconds);
   }


lcd.setCursor(0,1);
switch (RTC.dayofweek){ // la librería virtuabotix asigna a los días de la semana como números //del 1 al 7 con este switch asigno los días a su equivalente en nombre de día de la semana.

       case 1:
                               lcd.print("Lunes");
                               break;
       case 2:
                               lcd.print("Martes");
                                break;
       case 3:
                               lcd.print("Miercoles");
                               break;
       case 4:
                                lcd.print("Jueves");
                               break;
       case 5:
                                lcd.print("Viernes");
break;
       case 6:
                                lcd.print("Sabado");
                                break;
       case 7:
                                lcd.print("Domingo");
                                break;
      }
delay(3000); // Espera 3 segundos hasta seguir con el programa.
lcd.clear(); // Limpia la pantalla de nuestro lcd.
lcd.setCursor(0,0);
lcd.print("Fecha ");
lcd.print(RTC.dayofmonth);
lcd.print("/");
lcd.print(RTC.month);
lcd.print("/");
lcd.print(RTC.year);
delay(1000);
lcd.clear();
//lcd.función ()à a la izquierda del punto tenemos el objeto y a la derecha la función que se //aplicara //a ese objeto, dentro del paréntesis introduciríamos los parámetros que necesita la //función.

}
Archivo fuente en el siguiente enlace:
RTC

Practica 1: Placa Arduino Nano


Introducción:
Esta  práctica , consiste en crear una placa de circuito impreso semejante a la del Arduino Nano ya que seguiremos su esquema de montaje. Para llevarla a cabo podríamos dividir la practica en tres secciones, la primera seria el diseño en un CAD (Proteus) de la placa en si, colocando todos los componentes, vías, pistas según queramos, teniendo en cuenta el esquema del arduino Nano. La segunda parte seria imprimir esa placa que hemos diseñado, se utilizara una CNC, que mediante una placa de cobre rellena de aislante, lo que hace es, al rallar el cobre con una fresa deja al aire el aislante pudiendo separar las pistas entre sí. Una vez realizada la placa la última parte seria soldar los componentes previamente adquiridos en cualquier tienda de componentes o por Internet.

Desarrollo:
Lo primero que hacemos es abrir y entender el esquema del arduino Nano ya que es en el que nos vamos a basar:

Descomponiendo ese esquema podemos diferenciar 3 partes fundamentales la primera y más importante es el microcontrolador (Atmega 328-P) que es como coloquialmente nos referimos como el cerebro de la placa ( el chip del centro). Para hacer nuestra placa seguiremos la misma disposición en cuanto a los pines que hay en el esquema en relación al microcontrolador. Según se observa tiene varios componentes conectados directamente, bien uno de ellos es un interruptor que corresponde con el botón de Reset que podemos encontrar en la mayoría de las placas de Arduino. Los condensadores que tiene conexionados son los condensadores de BYPASS, estos condensadores se ponen en cada pin de tensión y GND de la mayoría de los chips integrados y sirven para eliminar los efectos parásitos que se generan en todos los componentes. También observamos que hay un oscilador conectado al Atmega 328-P, este es el que marcara la frecuencia del micro-controlador y se pone lo más cerca posible a este.
El segundo bloque que se encuentra a la derecha en el esquema de antes, es el chip Integrado FT232RL, se utiliza para conectar el microcontrolador al puerto USB y poder conectar este a un PC vía UART y establecer una comunicación RS232. El componente que tiene conectado por debajo a la derecha es el conector USB a través del cual podemos conectar nuestro ordenador a la placa e introducirle los programas. También tiene condensadores de BYPASS y dos diodos led de control.
En el tercer y último bloque quedarían recogidos todos los demás componentes como el ICSP, el regulador de tensión y el auto selector.
-El ICSP es el acrónimo de la frase en ingles In Circuit Serial Programing (Programación seria en circuito), posibilita la reprogramación de los PIC (familia de microcontroladores del tipo RISC) sin necesidad de extraerlos del mismo circuito.
-Regulador de tensión: Recibe una tensión a la entrada y devuelve una tensión a la salida de menor valor pero constante y sin picos, en este caso devuelve una tensión de 5 voltios.

Una vez entendido el esquema y sus componentes pasamos a diseñarlo en el Proteus, primeros haremos el esquemático quedando de la siguiente forma:


Cada componente tiene su coste y código (de RS) real excepto la base que esa es la que haremos nosotros en la CNC. Usamos la librería personal que nos dio el profesor para encontrar algunos componentes que no estaban en las librerías por defecto de Proteus. Otros en cambio tuvimos que modificarlos para poder escribir su precio y su código, el proceso era algo complejo pero a grandes rasgos lo que había que hacer era coger el componente y descomponerlo. Aparece un texto debajo del componente en el que pinchando dos veces acedemos a un documento de texto en donde están todas las características del componente, lo que hacemos es añadir en una line en blanco el código y el coste siguiendo el mismo formato que tiene otras líneas.

Una vez realizado el esquemático podemos pasar a hacer el diseño (Layout), en el mismo programa y proyecto en la barra de herramientas esta la opción de hacer el diseño a partir del esquemático (un botón rojo).
En el diseño ten os el mismo problema que en el esquemático hay algunas huellas de los componentes que no están en por defecto en las librerías de Proteus o no estan como las queremos nosotros, para nuestro proyecto hemos elegido componentes SMD de 1206 de tamaño (3.2x1.6x0.5mm), asi que algunas huellas que modificar para nuestros intereses. Para ello cojimaos un componente con una huella parecida, los descomponíamos y le añadíamos o quitábamos lo que quisiéramos cambiar, después le seleccionábamos y pinchábamos la opción “Make a Package”, no salían una seria de ventanas de configuración y para guardarlo (nosotros los guardábamos en la librería personal en sub-categoría personal) y ya estaba hecho.
El diseño quedo de la siguiente forma:
TOP




BOTTOM





Con el diseño echo, generamos los archivos Gerber/Excellon para imprimirla en la CNC, y la imprimimos siguiendo los pasos cuidadosamente.(Ver entrada: “Pasos CNC” en este mismo blog)


Placa Impresa y “casi-remachada”(Dos caras)":




  

Con la placa impresa, lo siguiente que debemos hacer es poner las vías pero sin remacharlas ya que si no podríamos estropear las pistas. En mi caso me salieron 30 vías con lo que puse 30 vías, deben ser “casi-remachadas” todas por el mismo lado que debe ser el mismo lado por donde se soldaran los headers, según el diseño de las imanes de arriba ese lado correspondería a la TOP (Rojo). Una vez “casi-remachadas” todas las vías, debemos soldarlas con cada pista que llega a ellas por ambos lados teniendo especial cuidado con la soldadura en no echar demasiado estaño o que la soldadura que dé en punta, es recomendable practicar antes con alguna placa que haya salido mal. Una vez soldadas todas las vías solo queda soldar los componentes en sus respectivos Paths teniendo especial cuidado en no soldar dos Paths juntos. Después de esto solo quedaría probarla y verificar su funcionamiento.

Asi quedria la placa despues de remacharla y soldar los componenetes: