Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sistema DAQ por FPGA con sensor de gas butano hacia software en
.NET con geolocalización por IP y almacenamiento en la nube
Se redacta a continuación la metodología seguida Fig. 2. Simulación del C.I. ADC0804 en modo
para el desarrollo del proyecto. automático
Device: XC3S200
Package: FT256
Speed Grade: -5
Se visualizan estos archivos fuente agregados El componente bcd, como se mencionó en párrafos
correctamente en el panel izquierdo Sources, anteriores, corresponde al convertidor de datos de 8
debajo de la fuente principal. bits hexadecimales hacia BCD. En tanto, el
componente reg_corr es el proyecto del que
depende la transmisión de datos por comunicación
serial para que ésta se lleve a cabo sin errores, pues
se trata del procedimiento para el corrimiento de
cada dato de envío.
Fig. 12. Proyectos vinculados Después de múltiples pruebas para concluir en este
procedimiento de resolución de este proyecto, se
determinó que este componente no debía dejarse de
Se accede con doble clic sobre la copia del primer lado, muy a pesar de tener las máquinas de estados
archivo fuente para copiar el código de la entidad necesarias para la transmisión de datos.
que le corresponde.
El código mostrado en la Fig. 13., es el del proyecto
de un convertidor de datos hexadecimales a datos
BCD (Binary-Coded Decimal).
Fig. 15.(c) Últimas señales auxiliares antes de begin, y Fig. 15. (e) Tercer proceso de la máquina de estados de
código del circuito diseñado después de begin. conversión hexadecimal a BCD e inicio de la máquina de
estados de transmisión del dato
digit_0 : out std_logic_vector( 3 downto 0);
digit_1 : out std_logic_vector( 3 downto 0);
digit_2 : out std_logic_vector( 3 downto 0);
digit_3 : out std_logic_vector( 3 downto 0)
);
end component;
---------------------------------------------------------------------
---------------------------------------------------------------------
Fig. 15. (f) Máquina de estados de transmisión de datos --Memoria de almacenamiento del tipo RAM
signal mem:
memoria:=("00000000","00000000","00000000","00000
El diseño final del circuito para este proyecto quedó de la 000","00100000");
siguiente manera: ---------------------------------------------------------------------
A1: bcd port map (entradaBcd, unidades, decenas, -- Guardando el dato convertido en la variable de salida
centenas, millares); del puerto
process(edopre)
begin
case edopre is
when s0 => aux_load <= '1';
when s1 => aux_load <= '1'; Fig. 16. Ventana de procesos
when s2 => aux_load <= '0';
when s3 => aux_load <= '0'; Para la visualizar el esquema del proyecto, en la
when s4 => aux_load <= '0'; ventana de procesos y al desplegar synthesize hacer
when others => aux_load <= '0'; clic derecho en “View RTL Schematic” dando clic a
end case; la opción de “Run”.
end process;
process(edopre,aux_rdy,cuenta)
begin
case edopre is
when s0 => edosig <= s1;
when s1 => edosig <= s2;
when s2 => edosig <= s3;
when s3 => if aux_rdy = '0' then
edosig <= s3;
else
edosig <= s4;
Fig. 17. Corriendo visualización del esquema
end if;
when s4 =>
if cuenta >= 9 then
edosig <= s0;
else
edosig <= s1;
end if;
when others =>
end case;
end process;
end Behavioral;
Para asignar los puertos de entrada y salida hacia II.8. Paso No. 8 Modulo iMPACT
pines físicos de la tarjeta se crea una nueva fuente;
en el panel superior izquierdo Sources se da clic
derecho sobre el archivo principal serstring.vhd y Para programar la tarjeta FPGA SPARTAN 3, en el
se selecciona el tipo de nueva fuente como panel inferior izquierdo Processes se acciona la
“Implementations Constraints File”. generación del archivo de programa con doble clic,
en la opción “Generate Programming File”.
Se asigna el nombre a la nueva fuente como pines,
que generará un archivo con extensión .ucf.
Fig. 27. Configuración del puerto Fig. 30. Prueba con el sensor, pt. 2.
II.10. Paso No. 10 Base de Datos en MySQL Para almacenar los datos de la instrumentación, se
planteó el siguiente esquema (Fig. 33.), dentro de
una base de datos instrumentacion (Fig. 32).:
A partir de este punto, la parte del Cloud
Computing de este proyecto se basa en el concepto
de la Arquitectura de Microservicios a fin de
evitar los inconvenientes de mantenimiento,
disponibilidad y accesibilidad a la información, que
la Arquitectura Monolítica representaba en el
pasado. De esta manera, con los microservicios se
impulsa el desarrollo y la capacidad de respuesta de
la aplicación.
CREATE DEFINER=`root`@`localhost`
PROCEDURE `deleteData`(IN `id` INT(10))
BEGIN
DELETE FROM sensadotiemporeal
WHERE id_reg = id;
END
Código C#:
namespace devWebApiRest.Controllers
{
[EnableCors(origins: "*", headers: "*", methods:
"*")]
public class SensorController : ApiController
{
string connDb =
ConfigurationManager.ConnectionStrings["dbConn
"].ConnectionString;
Fig. 42. SensorController.cs
//Consultar solo valor analogico con fecha y hr
En la Fig. 43. se muestra una vista previa al código
[HttpGet]
del archivo SensorController.cs, el cual es el que
[Route("ConsultarInstrumentacion")]
albergará todas las solicitudes HttpGet que
public IHttpActionResult
consultarán, insertarán o manipularán datos
ConsultarInstrumentacion()
directamente con la base de datos.
{
ServicePointManager.SecurityProtocol =
Para que este código funcione correctamente, se
SecurityProtocolType.Tls12;
instalaron los paquetes NuGet que se enlistan a
continuación:
using (MySqlConnection db = new
MySql.Data
MySqlConnection(connDb))
Dapper
{
System.Web.Http
var datos =
System.Net
db.Query<GraficarDatos>("CALL `getGasData`()",
new { }).ToList();
return Ok(datos);
}
}
//Consultar informacion
[HttpGet]
[Route("ConsultarTodo")]
public IHttpActionResult ConsultarTodo()
{
ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls12;
namespace devWebApiRest.Models
{
public class SensadoTiempoReal
Fig. 44. Modelos {
public int id { get; set; }
Código C# del modelo DatosPorFecha.cs, utilizado public int analogico { get; set; }
en el controlador SensorController, en el método public Double latitud { get; set; }
ConsultarDatosPorFecha public Double longitud { get; set; }
public string fecha_Hr_Reg { get; set; }
using System; }
using System.Collections.Generic; }
using System.Linq;
using System.Web; Los modelos sirven para organizar los datos de
consulta, como se observa en el link
namespace devWebApiRest.Models http://77.68.25.150/ConsultarInstrumentacion
{
public class DatosPorFecha
{
public int analogico { get; set; }
public Double latitud { get; set; }
public Double longitud { get; set; }
public string fecha_Hr_Reg { get; set; }
}
}
using System;
II.13. Paso No. 13 Aplicación de escritorio .NET using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
Se trata de una aplicación de escritorio desarrollada using System.Drawing;
como proyecto de tipo Aplicación de Windows using System.Linq;
Forms (.NET Framework). using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Device.Location;
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;
using System.IO.Ports;
Fig. 47. Aplicación de escritorio desarrollada sobre un
proyecto de tipo Aplicación de Windows Forms (.NET namespace devMonitorSerial
Framework) {
public partial class Form1 : Form
El diseño del formulario (Form1) quedó de la {
siguiente manera, englobando cada conjunto de Double latitud, longitud, lat, lon;
etiquetas y campos de texto respecto al valor que se static SerialPort _serialPort;
mostrará, con paneles. private void timer1_Tick(object sender, EventArgs
e)
{
//Mensaje predeterminado cuando no se ha
enviado informacion
label8.ForeColor = Color.FromArgb(0, 0, 0);
label8.Text = "Esperando enviar...";
private void Form1_Load(object sender, EventArgs Fig. 49. Captura de pantalla de la aplicación en ejecución
e) (panel derecho) y consulta de los datos registrados en la
{ API.
//cargar par de coordenadas de geolocalizacion
del dispositivo
GeoCoordinateWatcher oWatcher = new
GeoCoordinateWatcher();
oWatcher.PositionChanged += (S, E) =>
{
var oCoordinate = E.Position.Location;
latitud = oCoordinate.Latitude;
longitud = oCoordinate.Longitude;
Mejoras propuestas: