Proyecto en c# para Raspberry pi


 

En efecto , aunque hemos hablado en muchísimas ocasiones de múltiples ejemplos en c# usando la plataforma Netduino  es poco frecuente ver aun ejemplos que usen la plataforma de desatollo de Microsoft de IoT  en otros entornos.

Precisamente  en el siguinte  ejemplo  de como implementar  una estación  meteorológica  en una Raspberry Pi , se demuestra cómo aprovechar la potencia de Windows 10 IO Core, y crear una estación meteorológica con  un escudo de Sparkfun(Sparkfun DEV-12081)  en una Raspberry pi que corre Windows 10 (puede ser la versión  2 o también la  3).

Este proyecto forma parte de la iniciativa de Microsoft llamada  Hack the Home , que proporciona componentes de código abierto para minimizar  el esfuerzo en la creación de  interfazes con los dispositivos y servicios a  usar para enfrentarse a sus hogares.

Antes de describir   como lo han hecho en el vídeo podemos ver  una introducción a la plataforma de windows IoT;

 

El nuevo espacio de nombres Windows.Devices de las API de Windows Plataforma universal (UWP) en Windows 10, permite a los desarrolladores aprovechar la potencia de Windows  en la interacción con el mundo real a través de sensores y actuadores utilizando el bus I2C y los puertos de uso general de entrada / salida (GPIO) disponibles en el Raspberry Pi 2, para crear una estación meteorológica conectada a Internet utilizando la protección contra la intemperie Sparkfun.

Las instrucciones proporcionadas darán un desarrollador de primera mano la configuración del hardware requerida junto con la escritura y depuración de Windows recientemente disponible en  windows 10 llamada UWP Windows.Devices API’s.

En este ejemplo,  también se demostrará cómo agregar sus datos en la nube utilizando el Azure Event Hub y  ConnectTheDots API.

Para  empezar , lo primero es conexionar   los  pines desde la Raspberry Pi 2 a la placa Sparkfun(Sparkfun DEV-12081)

Este es el conector de la Raspberry Pi 2:

GPIO esquemática (pata 1 está marcada con una almohadilla de soldadura cuadrada)

El diagrama de conexiones de  la Raspberry Pi  hacia la placa de Sparkfun   es el siguiente:

  •  GND (negro) —— GND
  • 5V (rojo) ——— VIN
  • 3V3 ——- (marrón) —— 5V (escudo truco; no es un error)
  • GPIO2 —– (amarillo) —- SDA
  • GPIO3 —- (naranja) —- SCL
  • GPIO5 —– (verde) —– D8
  • GPIO6 —– (azul) ——- D7

Cableado de cerca del carril exterior (negro, rojo)

 

Con la placa Weather Shield es muy fácil de hacer funcionar con Arduino  ofreciendo  de por sí la presión barométrica, humedad relativa, luminosidad y temperatura. También hay conexiones para sensores opcionales tales como la velocidad del viento, dirección, pluviómetro y GPS para la ubicación.

Utiliza el sensor de humedad HTU21D, de presión barométrica MPL3115A2, un sensor de luz ALS-PT19 y se basa en la librería HTU21D y MPL3115A2 para Arduino. Dispone de dos posiciones para soldar conectores RJ11 (para sensores opcionales de lluvia y viento) y un conector GPS de 6 pines (para conectar un GPS opcional). Puede funcionar desde 3.3V hasta 16V y tiene un regulador de voltaje integrado.

 

En cuanto al sw de  la estación meteorológica  en realidad se compone de  dos aplicaciones:

  • La primera es una bucle largo por tiempo indefinido, que trabaja  de fondo leyendo el estado de los sensores y actúando como un servidor de estación meteorológica.
  • La segunda, una interfaz de usuario que realiza una solicitud al puerto 50001 del servidor mostrando los datos. La aplicación de interfaz de usuario es universal y se puede implementar en cualquier dispositivo Windows desde el Raspberry Pi 2 hasta el final a un PC de escritorio – y en cualquier lugar en el medio!

Es necesario encontrar la siguiente línea en el archivo `Mainpage.xaml.cs` del proyecto` build2015-tiempo-station`, y vuelva a colocar el nombre del equipo, “MINWINPC”, en la dirección URL con el nombre de su dispositivo IO.

//TODO: On the following line, replace "minwinpc" with the computer name of your IoT device (ie "http:// :50001").

private Uri weatherUri = new Uri("http://minwinpc:50001");

 

1-Seleccione la rama “lab_ConnectTheDots”, si desea aprender a utilizar connectthedots y completar el código manualmente

2-Abrir “WeatherStation \ WeatherStation.sln” en Visual Studio 2015

3-Vaya a “WeatherStationTask.cs” en el panel “Explorador de soluciones”

4-Utilice la “Lista de tareas” para saltar a cada “TODO //:” y escribir el código necesario

Los archivos AppSettings, ConnectTheDotsSensor, y ConnectTheDotsHelper son parte del código creado para ayudarle a utilizar la interfaz connectthedots al Hub Evento Azure.

AppSettings: Guarda los ajustes para la conexión al hub de eventos

Esta información se puede encontrar bajo su ServiceBus en Azure.

5-Vaya a su “* ns” instancia ServiceBus -> Evento Ejes -> ehdevices -> Información de conexión -> Busca el SAS “D1”

6-Copiar la cadena de conexión que debe tener este aspecto (Contiene información para sus AppSettings)

"Endpoint=sb://iotbuildlab-ns.servicebus.windows.net/;SharedAccessKeyName=D1;SharedAccessKey=iQFNbyWTYRBwypMtPmpfJVz+NBgR32YHrQC0ZSvId20="

  • servicio de espacio de nombres de autobús (Ej: “iotbuildlab-ns”)
  • nombre del evento cubo (Ej: “ehdevices” – siempre usar esto)
  • nombre de la clave (Ej: “D1”)
  • clave (Ej: “iQFNbyWTYRBwypMtPmpfJVz + NBgR32YHrQC0ZSvId20 =”)
  • nombre de visualización (Ej: “WeatherStation1” – Esto le da un nombre a los datos del dispositivo)
  • organización (Ej: “Construir la IO Lab” – Cambio de personalizar)
  • ubicación (Ej: “EE.UU.” – Cambio de personalizar)

ConnectTheDotsSensor: Contiene la información de un sensor

  • GUID
  • mostrar nombre
  • organización
  • ubicación
  • nombre de la medida
  • unidad de medida
  • hora de creación
  • valor

ConnectTheDotsHelper: Las funciones auxiliares para inicializar el Hub de eventos

  • establece la conexión
  • crea los tokens de autenticación

Si desea iniciar su propio concentrador de sucesos de servicios de fondo, siga las instrucciones del connectthedots GitHub repositorio:https://github.com/msopentech/connectthedots/blob/master/Azure/AzurePrep/AzurePrep.md

.

7-Una vez que haya que desplegado, debe iniciar el envío de datos al cubo evento y los datos debe ser visible en http://iotbuildlab.azurewebsites.net/ o en su propio sitio web.

 

Fuente  aqui

Anuncios

Implementar un watch-dog con Netduino


¿Qué pasa si usted crea su propia aplicación Netduino, y un error lo  detiene de forma inesperada?
Primera respuesta: no hay problema, estoy en frente del depurador, y voy a tener el seguimiento de la pila completa de la excepción.
Segunda respuesta: es una pesadilla! Estoy en vacaciones de fin de semana, y mi sistema de rociadores basado en  Netduino se ha colgado de modo que tengo que pedirle  a mi vecino que resetee mi Netduino

Obviamente estamos interesados ​​en la segunda respuesta, o-mejor-la forma de evitar, como situación.

Cuando el hardware está dañado o el software está libre de errores, no hay muchas maneras de rescatar el control de la placa. Sin embargo, hay muchas, muchas situaciones donde nuestra placa funciona perfectamente (tal vez por semana) sin ningún problema en absoluto y tn pronto se mueve “en el lugar”, el primer problema que ocurre…
Dado que ninguno de utilización gustaría ser despertar a las 3 am para una parada del sistema, u obligarnos a volver a casa porque el rociador basado con Netduino no funciona correctamente, entonces podríamos hacer cumplir la fiabilidad mediante la adición de un así llamado “perro guardián”.
Es una forma muy sencilla de proteger el sistema de paradas no deseadas y  nos resuelve toda esta problematica pues  una buena práctica de programación, junto con un buen hardware, es el deber-tiene redundancia para la mayoría de la fiabilidad de cualquier sistema.

WatchDog externo

No sé quién inventó este nombre WatchDog … “perro guardián” … pero suena claro (al menos para mí) que hay dos temas diferentes:
  • el perro, que es el controlador;
  • la casa está vigilada por el perro.
Ahora, el sistema que falla potencial es la casa, y el perro vive respeto “externa” de la casa.
Eso es obvio, ya que si el sistema se bloquea se podría hacer la misma en el rescate?
Es tan obvio, que muchas personas están pidiendo una solución de software pura, tal vez usando un hilo separado como un controlador.
Hay taaaan muchas situaciones que pueden obtener un MCU para colgar, que llevarían a alguien de inmediato a una solución externa.
Algunos ejemplos:
  • sub o sobre-temperatura;
  • picos de tensión (tanto por encima de la oferta y por debajo del suelo);
  • fuerte ruido en general (especialmente cuando los cables largos están conectados directamente a los pernos de MCU);
  • errores de software;
  • la inestabilidad de hardware (por ejemplo, el cristal se detiene oscilante);
  • muchos otros.
Podría haber usado un chip personalizado para un perro guardián. El chip Atmel del Netduino incrusta un perro guardián, pero no ha sido impulsado por el firmware.
En su lugar, me gustaría mostrar un circuito muy simple diseñado por Mario Vernari , cuyo objetivo es principalmente intentar resolver este problema en particular.

Usaremos un simple contador: el 74HC4060 . Es un contador binario de 14 etapas, que incrusta también un oscilador RC básica. Todo esto para obtener una re-activable, de largo periodo del temporizador.
La palabra “timer” llama inmediatamente en mi mente la increíble ” 555 “chip: una obra maestra en el diseño del hardware de los ’70. BTW, tenemos un tiempo de reacción relativamente largo: al menos varios segundos.Eso es porque el Netduino tarda un par de segundos para completar el proceso de restablecimiento completo, entonces debemos tener en cuenta la lentitud del programa. Un organismo de control normales reacciona en milésimas de segundo, mientras que aquí estamos considerando docena de segundos, tal vez más. Durante un largo tiempo como el 555-temporizador normal no es confiable, porque se basa en la carga de los condensadores. Además, necesitaríamos un gran condensador bonita.
El 74HC4060 es mucho más simple para tiempos largos. Me desconecté el oscilador de frecuencia de alrededor de 60 Hz, que es el uso de:
  • Rt = 2.7k
  • Ct = 100n
Nota: consulte las 74HC4060 especificaciones.
Entonces, opté por la salida de la 10 ª etapa (es decir, Q9) como “tiempo de espera de señal”, que desencadena el reinicio Netduino después de unos 10 segundos. Ahora, diez etapas binarias producen una división de frecuencia de 1024 (= 2 ^ 10), ¿por qué 60 Hz dividido por 1024 no cede 10 segundos, pero 20?
Debido a que el reinicio ocurre tan pronto la salida Q9 resulta alta, que es después de sólo la mitad del tiempo total.

Así que, ¿cuál es el papel de la Netduino, tener miedo de poner a cero desde el 74HC4060?
Bueno, sí … el programa se ejecuta en el Netduino debe “refrescar” constantemente el contador, por lo que no será nunca llegar al Q9 alta. Básicamente tenemos que cualquiera de las salidas Netduino generando un impulso positivo a corto, que tiene que reiniciar el contador. Hasta la aplicación Netduino está funcionando correctamente, el pulso se mantendrá el contador en un valor relativamente bajo, y Q9 nunca le des alta. Por cierto, cuando el programa se cuelga, no hay generación de impulsos más reset, y el contador se puede ejecutar para alcanzar el Q9 alta. Esa señal se restablecerá la Netduino.

Un programa de prueba simple.

El programa siguiente se utiliza como una prueba para el organismo de control.
Esto hace que el LED intermitente durante un período determinado, a continuación, genera una excepción. Eso es un “bug” simulado, que en realidad cuelga todo el tablero. Bajo tales circunstancias, usted tiene sólo dos opciones: pulsar el botón “reset”, o desconecte y conecte la alimentación nuevamente. Dado que ninguno de ellos es adecuado funcionamiento para un contexto remoto, nos introducimos un poco de “ayuda”, que “presione el botón de reinicio para nosotros”.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;
namespace NetduinoWatchdog
{
    public class Program
    {
        public static void Main()
        {
            //define the led port
            var led = new OutputPort(Pins.ONBOARD_LED, false);
            //just a long loop to make the led blinking
            for (int i = 0; i < 1000; i++)
            {
                //call the critical section
                Freezer(i);
                //wait for a while, then toggle the led status
                Thread.Sleep(100);
                led.Write(
                    !led.Read()
                    );
            }
        }
        static void Freezer(int count)
        {
            //this is just to simulate an unexpected event
            if (count == 20)
                throw new Exception();
            //keep the dog awaken
            Watchdog();
        }
        //define the watchdog port
        static OutputPort wdt = new OutputPort(Pins.GPIO_PIN_A5, false);
        static void Watchdog()
        {
            //generate a positive pulse to reset the external counter
            wdt.Write(true);
            wdt.Write(false);
        }
    }
}

Esta claro que el código, se centra principalmente el circuito externo mediante el 74HC4060 por lo que una fuente similar colgará cada vez que se inice este programa por lo que no tiene sentido en un contexto real. Una aplicación más realista debería ser mucho más “a prueba de excepción-libre”, y tal vez ser capaz de “corregirse” en un cierto fracaso. Por ejemplo, considere la posibilidad de su aplicación está escribiendo un archivo en la tarjeta SD, pero el usuario saque la tarjeta. Es un poco difícil de escribir un procedimiento a prueba de balas que escribe los datos sin ninguna excepción. Sin embargo, una vez que el Netduino se ha restablecido, puede analizar la presencia en SD, y evitar cualquier operación relacionada

Fuente  Mario Vernari

Licencia Creative Commons
solo-electronicos por Carlos Rodriguez Navarro se encuentra bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 3.0 Unported.