Huerto controlado por raspberry


Carolina Herrero nos propone un sistema de un sistema automatizado para riego  que  ademas  no precisa de conexión a Internet porque todas las medidas se  gestionan de forma interna y por tanto no precisan ningún servicio de IoT  para su  funcionamiento ( como por ejemplo Cayenne.com del que  hemos hablado numerosas ocasiones en este blog)

 

La idea principal de Carolina era construir un sistema de riego automático, controlado por diferentes tipos de sensores, de forma que el sistema tomase decisiones de modo automático  guiándose  en función de las condiciones del ambiente y la necesidad de riego que tiene la tierra según el grado de humedad  de modo que cuando las condiciones fuesen óptimas comenzase el riego(, siempre y cuando exista agua en el depósito)
Además su creadora  también quería que los datos se almacenaran de forma periódica en una base de datos local  mySQL  , y a través de una aplicación Web, con sus  credenciales poder acceder y ver un histórico gráfico de las mediciones de los sensores .
Para conseguir esto básicamente   ha utilizado:
  • Varios  Sensores
  • Una placa  Microcontroladora
  • Un Servidor local

Sensores

El sistema utiliza diferentes tipos de sensores, porque se requiere  controlar diversos valores como son :
  • Valores de la humedad de la tierra para lo que se usa un sensor conocido como YL-69, que consiste en dos picas que se encuentran enterradas en tierra de manera que controlando la resistencia de la tierra se puede conocer la humedad.Esta es una herramienta indispensable para un jardín conectado  pues por si mismo nos puede  recordar que debe regar las plantas de interior o para monitorear la humedad del suelo en su jardín . Se alimenta a: 3.3V-5V   y el modo de módulo de salida dual, salida digital, salida analógica más precisa

  • Para recoger los valores de humedad y temperatura ambiente se utiliza un  simple sensor DHT11 (si bien  un DHT22 hubiese sido  mas recomendable por su mayor precisión , aunque es cierto que su coste es algo mayor)                                                   
  • De la temperatura del suelo se encarga el DS18B20, un sensor sumergible y resistente a la humedad, que se usará para controlar la temperatura de la tierra. 
  • Por seguridad, y para evitar que las bombas funcionen en vacío, y puedan dañarse, es imprescindible controlar el nivel de agua que hay en el depósito, y estos se consigue con un sensor de nivel .Estos sensores pueden medir humedad entre el 10% -90% sin condensación con un consumo de menos de 20mA y ofreciendo una salida analógica con  un área de detección de 40mmx16mm
  •  Por último controlar si hay luz o no, para evitar el riego de noches se ha usado un sensor de luz, también conocido como resistencia LDR.

Arduino

El encargado de recoger todos los  valores  procedentes de los sensores descritos y tomar las acciones necesarias es una placa  sistema Arduino  que ha sido programado para recoger datos, actuar en función de los valores de dichos datos, y en última instancia se encarga de mandarlos a un servidor ( una Raspberry Pi) para su seguimiento estadístico  de modo que en principio si no nos interesa seguir esa traza perfectamente el proyecto quedaría únicamente con esta placa   y sus sensores .

Aquí su autora comparte  una parte del código encargado de recoger los datos, y enviarlos por el puerto serie.

//Función que se encarga de leer datos de todos los sensores
void leer_datos_sensores(){
  valor_ha = dht.readHumidity();             //Se lee la humedad en el ambiente
  valor_ta = dht.readTemperature();          //Se lee la temperatura en el ambiente
  valor_ht1 = analogRead(hum_tierra1);       //Se lee humedad en tierra en la zona1
  valor_na = analogRead(nivel_agua);         //Se mide el nivel de agua existente en el depósito
  valor_luz = analogRead(luz_ldr);           //Se lee la luz
  DS18B20.requestTemperatures();             //Prepara el sensor para la lectura
  valor_tt1 = DS18B20.getTempCByIndex(0);    //Se lee la temperatura en tierra en la zona 1        
}
//Función para enviar valores de los sensores por el puerto serie
void enviar_datos(){
  Serial.print(valor_ha);Serial.print(“,”);
  Serial.print(valor_ta);Serial.print(“,”);
  Serial.print(valor_ht1);Serial.print(“,”);
  Serial.print(valor_na);Serial.print(“,”);
  Serial.print(valor_luz);Serial.print(“,”);
  Serial.print(valor_tt1);Serial.print(“,”);
}

Servidor web y BBDD

Como servidor no podía ser de otra manera que optar  por una Raspberry PI conRaspbian, basada en Debian  y que  hace  de servidor  Base de Datos, y además también de de Servidor Web.
Como servidor web se usa el Servidor Web Apache funcionando junto con MySQL como servidor de BBDD.
Además para que Arduino y Raspberry se comuniquen entre sí, se requiere un script en Python, que se encarga de recibir los datos por el puerto Serie que Arduino está enviando de forma constante .
Básicamente este script recibe los datos de Arduino  , se conecta con la  BBDD MySql  e inserta los datos.
#!/usr/bin/python
#-*- coding: UTF-8 -*-
 
import MySQLdb
import serial
 
# Establecemos la conexión con la base de datos
bd = MySQLdb.connect(“host”,“user”,“pass”,“db” )
# Preparamos el cursor que nos va a ayudar a realizar las operaciones con la base de datos
cursor = bd.cursor()
 
#Inicia la comunicación con el puerto serie
PuertoSerie= serial.Serial(‘/dev/ttyACM0’, 9600)
#Lectura de datos
sArduino = PuertoSerie.readline()
#Separa la cadena en valores, cada valor hasta la coma es almacenado en una variable
sHumAmbiente,sTempAmbiente,sHumTierra1,sNivelAgua,sLuz,sTempTierra1=sArduino.split(“,”)
 
ha = float(sHumAmbiente)
ta = float(sTempAmbiente)
ht1 = int(sHumTierra1)
na = int(sNivelAgua)
luz = int(sLuz)
tt1 = float(sTempTierra1)
zona1 = 1
 
 
#Almacenamos los valores en tabla datos de la base de datos huerto
sql1=“INSERT INTO datos_huerto(hum_ambiente,temp_ambiente,hum_tierra,nivel_agua,luz,temp_tierra,id_zona) VALUES (%f,%f,%d,%d,%d,%f,%d)” % (ha,ta,ht1,na,luz,tt1,zona1)
 
try:
   # Ejecutamos el comando
   cursor.execute(sql1)
   bd.commit()
except:
   print “Error”
   bd.rollback()
 
# Nos desconectamos de la base de datos
bd.close()
Para se hacer esto  de forma periódica pero no constante, puede usarse  la herramienta Cron integrada en Raspbian, de manera que cada “X” minutos se ejecute el script en Python.
Para la parte de  visualización de los datos la autora opto  por o una aplicación Web sencilla, programada n Php, junto con pequeñas funciones en Javascript para controlar y validar ciertos campos. En el aspecto visual uso  el framework Bootstrap, asi como la  librería HighCharts para la creación de gráficas y así conseguir visualización de los datos muy atractiva.
arduino.png
Es muy importante que si le damos salida a internet a La Rasberry PI  nos cercioremos de que está segura. Para ello es interesante :
  • Modificar el archivo de configuración de Apache, para que ante un ataque muestre la mínima información posible sobre el servido
  • Encriptar el tráfico entre cliente y servidor mediante certificados SSL
  • Forzar para que el acceso siempre sea seguro vía peticiones del tipo  HTTPS.
 Finalmente esta es la lista de componentes utilizados para el sistema:
  • Arduino Mega 2560 Rev.3 x1
  • Raspberry Pi x1
  • Sensor de humedad de tierra YL-69 x 2
  • Sensor de temperatura y humedad ambiente DTH-11 x1
  • Sensor de luz LDR x1
  • Sensor de temperatura de tierra  SD18b20 x2
  • Sensor de nivel de agua x1
  • Placa de 4 relés 5V-220Vx1
  • Bombas de agua x2
  • Protoboard x1
  • Resistencias de pull-up de diferentes valoresx 12
  • Cableado y conectores –
  • Leds de diferentes colores x15
  • Bandeja de plástico x1
  • Piezas de policarbonato x2
  • Recipientes para depósito de agua y electrónica x2
  • Tarjeta SD  para Raspberry PI x1
  • Tubos de goteo x2
  • Plantasx 6
  • Fuente de alimentación 220V x1

Le damos nuestra mas sincera enhorabuena a Laura por su sistema que animamos a que siga perfeccionando así como compartiendo con la comunidad todos sus progresos

Anuncios

Sistema de detección de carril con opencv


Kemal Ficici     nos demuestra  con su proyecto escrito en  python,  que por cierto  ha publicado con su código completo en  github,   como es posible usando la librería  OpenCv    construir un detector de carril   que  incluso  maneja carriles con  curvas.

A pesar del gran avance , sin embargo el autor  reconoce  que la salida de su sistema  todavía se ve afectada por sombras y drásticos cambios en la textura de la carretera  lo cual invalida en gran parte su resultado ,  lo cual  le hace  pensar en futuras actualizaciones de su proyecto  haciendo  uso de técnicas de aprendizaje automático para llegar a desarrollar un sistema de detección de vehículo e increíblemente robusto carril.

En el siguiente video podemos ver el resultado de su trabajo:

En cualquier escenario de conducción, las líneas de carril son un componente esencial de lo que indica el flujo de tráfico y donde se debe conducir un vehículo  así  que también es un buen punto de partida en el desarrollo de  niveles de automatismos de ayuda a la conducción ( Sistemas ADAS).
En un proyecto anterior de detección de carril  Kemal  había implementado un sistema de detección de carril  que funcionaba decentemente en perfectas condiciones, sin embargo no detectaba curvas carriles con precisión y no era robusta a obstrucciones y sombras, de modo que  esta nueva versión mejora su   primera propuesta puesto que ha implementado  detección de lineas  curvas en los carriles , de modo que   funciona mucho mejor y es más robusto para entornos exigentes.

El sistema de detección de carril ha sido  escrito en Python usando la librería OpenCV y ha seguido resumidamente las siguientes etapas en el  procesamiento de imagen:

  • Corrección de distorsión
  • Deformación de la perspectiva
  • Filtro de Sobel
  • Detección de picos del histograma
  • Búsqueda de ventana deslizante
  • Ajuste de curvas
  • Superposición de carril detectado
  • Aplicar el resultado a  la salida  al vídeo

Respecto al hardware utililizado :

  • Nvidia Jetson TX2×1
  • Raspberry Pi 3 Model B×1

 

 

Corrección de distorsión

Las  lentes de las cámaras distorsionan la luz entrante al  enfocarla en el sensor de la cámara o CCD . Aunque esto es muy útil porque nos permite capturar imágenes de nuestro entorno, a menudo terminan distorsionando la luz ligeramente de forma imprecisa lo cual  puede ofrecernos medidas inexactas en aplicaciones de visión por ordenador . No obstante  fácilmente podemos corregir esta distorsión calibrando la imagen de un objeto conocido ( por ejemplo  tablero de ajedrez asimétrico,)y generando un modelo de distorsión que represente las distorsiones de la lente.

La cámara utilizada en la prueba video  fue utilizada para tomar 20 imágenes de un tablero de ajedrez, que fueron utilizados para generar el modelo de distorsión.El autor comenzó por convertir la imagen a escala de grises y  entonces aplico la  función cv2.findChessboardCorners .Como sabemos que este tablero de ajedrez es un objeto tridimensional  con líneas rectas exclusivamente podemos aplicar algunas transformaciones a las esquinas detectadas para alinearlos correctamente utilizando cv2.CalibrateCamera()  obteniendo así  los coeficientes de distorsión y la matriz de cámara  de modo que  así  ya estaba calibrada la cámara

Realizado el proceso anterior se puede utilizar  cv2.undistort()  para corregir el resto de sus datos de entrada.

Como demostración en la imagen se puede ver la diferencia entre la imagen original del tablero de ajedrez y la imagen corregida a continuación:

ajedrez

Aquí está el código exacto que usó el autor para esto:

def undistort_img():
    # Prepare object points 0,0,0 ... 8,5,0
    obj_pts = np.zeros((6*9,3), np.float32)
    obj_pts[:,:2] = np.mgrid[0:9, 0:6].T.reshape(-1,2)
    # Stores all object points & img points from all images
    objpoints = []
    imgpoints = []
    # Get directory for all calibration images
    images = glob.glob('camera_cal/*.jpg')
    for indx, fname in enumerate(images):
        img = cv2.imread(fname)
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        ret, corners = cv2.findChessboardCorners(gray, (9,6), None)
        if ret == True:
            objpoints.append(obj_pts)
            imgpoints.append(corners)
    # Test undistortion on img
    img_size = (img.shape[1], img.shape[0])
    # Calibrate camera
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, img_size, None,None)
    dst = cv2.undistort(img, mtx, dist, None, mtx)
    # Save camera calibration for later use
    dist_pickle = {}
    dist_pickle['mtx'] = mtx
    dist_pickle['dist'] = dist
    pickle.dump( dist_pickle, open('camera_cal/cal_pickle.p', 'wb') )
def undistort(img, cal_dir='camera_cal/cal_pickle.p'):
    #cv2.imwrite('camera_cal/test_cal.jpg', dst)
    with open(cal_dir, mode='rb') as f:
        file = pickle.load(f)    mtx = file['mtx']
    dist = file['dist']
    dst = cv2.undistort(img, mtx, dist, None, mtx)
    return dst
undistort_img()
img = cv2.imread('camera_cal/calibration1.jpg')
dst = undistort(img) # Undistorted image

Y ahora podemos ver  la corrección de distorsión aplicada a una imagen de la carretera.

imagencorregida.png

Solo se puede notar  diferencias leves, pero esto como veremos puede tener un impacto enorme en el tratamiento de la imagen.

Deformación de la perspectiva

La detección de carriles con trazados curvas  en espacios de la cámara espacio no es uan tarea  fácil asi que la idea es  conseguir una vista de pájaro de las pistas , lo cual se e puede hacer aplicando una transformación de perspectiva en la imagen. Aquí es lo que parece:

carril

Como vemos nos es nada espectacular debido a que el carril esta sobre una superficie plana en 2D, asi  que podemos encajar un polinomio que puede representar fielmente el carril en el espacio del carril

Puede aplicar estas transformaciones a cualquier imagen usando la función cv2.getPerspectiveTransform()  para obtener la matriz de transformación, y  aplicar la función cv2.warpPerspective() a una imagen.

Aquí está el código que uso el autor para ello:

def perspective_warp(img,
                     dst_size=(1280,720),
                     src=np.float32([(0.43,0.65),(0.58,0.65),(0.1,1),(1,1)]),
                     dst=np.float32([(0,0), (1, 0), (0,1), (1,1)])):
    img_size = np.float32([(img.shape[1],img.shape[0])])
    src = src* img_size
    # For destination points, I'm arbitrarily choosing some points to be
    # a nice fit for displaying our warped result
    # again, not exact, but close enough for our purposes
    dst = dst * np.float32(dst_size)
    # Given src and dst points, calculate the perspective transform matrix
    M = cv2.getPerspectiveTransform(src, dst)
    # Warp the image using OpenCV warpPerspective()
    warped = cv2.warpPerspective(img, M, dst_size)
    return warped

Filtro de Sobel

En otras versiones una opción era filtrar las líneas de carril con el color peor sin embargo, esto no siempre es la mejor opción. Si el camino utiliza luz de color concreta en lugar de asfalto, el camino pasa fácilmente a través del filtro de color, y esta la percibirá como una línea de carril blanco, pero  eso no es correcto.

En su lugar, podemos utilizar un método similar al detector de borde, esta vez para filtrar hacia fuera de la carretera. Las líneas de carril suelen tienen un alto contraste en  la carretera, por lo que podemos utilizar esta peculiaridad para nuestro beneficio. La funcion detector de borde  Canny utilizado anteriormente  hace uso de Operador de Sobel , para obtener el gradiente de una función de la imagen. La documentación de OpenCV tiene una fantástica explicación sobre cómo funciona asi que utilizaremos esto para detectar zonas de alto contraste para las marcas de carril filtro e ignorar el resto del camino .

Todavía utilizaremos el espacio de color HLS nuevamente, esta vez para detectar cambios en la saturación y la ligereza. Los operadores de sobel se aplican a estos dos canales, y extraemos el gradiente con respecto al eje x y añadiremos los píxeles que pasan nuestro umbral de degradado a una matriz binaria que representa a los píxeles de nuestra imagen. Aquí está como se ve en cámara espacio y lane

blancoynegro.PNG:

Tenga en cuenta que las partes de la imagen que estaban más lejos de la cámara no conserven su calidad muy bien. Debido a las limitaciones de resolución de la cámara, datos de los objetos más lejos son muy borrosos y ruidosos  pero no necesitamos concentrarnos en la imagen, para que podamos utilizar sólo una parte de esta.

Detección de picos del histograma

Ahora aplicaremos un algoritmo especial llamado Sliding Window Algorithm ( algo asi como algoritmo  Desplazamiento de Ventana )para detectar nuestras líneas de carril. Sin embargo, antes de que lo podemos aplicar, debemos determinar un buen punto de partida para el algoritmo pues este funciona bien si comienza en un lugar donde haya píxeles de lineas  presentes, pero ¿cómo podemos detectar la ubicación de estos píxeles de carril en primer lugar?

Estará recibiendo un histograma de la imagen con respecto al eje X. Cada parte del histograma siguiente muestra píxeles blancos en cada columna de la imagen. Entonces tomamos los picos más altos de cada lado de la imagen, uno para cada línea de carril y tendríamos resulto esta parte

Aquí vemos como  el histograma parece, al lado de la imagen binaria:

histograma

Búsqueda de ventana deslizante

Ahora  necesitamos  utilizar el algoritmo de ventana deslizante para distinguir entre los límites del carril de la izquierda y derecha para que podemos caber dos curvas diferentes que representan los límites del carril.

El algoritmo sí mismo es muy simple. A partir de la posición inicial, la primera ventana mide cuántos píxeles se encuentran dentro de la ventana. Si la cantidad de píxeles alcanza un cierto umbral, desplaza la siguiente ventana a la posición lateral media de los píxeles detectados. Si no se detectan los suficientes píxeles, comienza la siguiente ventana en la misma posición lateral.

Esto continúa hasta que las ventanas alcanzan el otro borde de la imagen .Asimismo los píxeles que corresponden a las ventanas reciben un marcador.

En las imágenes de abajo, los píxeles marcados azules representan el carril derecho, y los rojos representan la izquierda:

lineas

Ajuste de curvas

El resto del proyecto es ya mas fácil. Aplicamos la regresión polinomial para los pixeles rojos y azules individualmente usando np.polyfit() , y entonces el detector se hace  sobre todo

Esto es lo que parecen las curvas:

 

Superposición de carril detectado

Ya estamos en la parte final del sistema de detección: la interfaz de usuario. Simplemente creamos una superposición que llena en la parte detectada del carril, y luego  finalmente lo aplicamos al vídeo.

Este es el resultado final

 

 

!Sin duda un resultado  realmente espectacular que puede servir de partida para proyectos  mas ambiciosos!

Mas información en www.hackster.io

 

Como instalar AirMirror sin ser Root


Airdroid   es una potente herramienta que  permite controlar un  terminal Android desde otro terminal Android  , permitiendo  hacer cosas muy interesantes como  por ejemplo transferir archivos entre estos   o usar uno de los terminales como cámara de seguridad . Este programa  ,que por cierto también esta disponible  para PC y Mac  , es   complementado por una nueva aplicación con la que acceder de móvil a móvil: AirMirror .Por cierto lo de Mirror  o e “espejo” viene  porque a distancia  Air  ( por el aire)  tenemos la posibilidad de gestionar otro móvil como si lo estuviera tocando.

Si  bien AirMirror  es una utilidad muy interesante , hay un pequeño problema :se requería hasta hace poco que el terminal  estuviese rooteado ,pero afortunadamente desde la versión v3.1.6 desde AirDroid de Android, AirDroid Mac v3.2.1, v3.2.2 AirDroid para Windows  o  Android  ya se puede  utlizar AirMirror sin  tener  permisos de   root (siempre que los  terminales Android sean superiores a 4.1).

 

AirMirror con terminales rooteados

Para los afortunados  usuarios que tengan permisos de  root con Android 4.1 en adelante pueden  controlar su móvil remotamente a través de AirMirror  fácilmente  pero para ellos  necesitara autorizar AirDroid.

En primer lugar  iniciar AirMirror en el dispositivo que desea controlar  y después  haga clic en el icono de AirDroid Windows/Mac, pulsar GRANT cuando aparezca  la  ventana que autorizan en su Android.

Otras  opción es ir a la aplicación de gestión de permiso de root (como SuperSU) y  conceder manualmente AirDroid el permiso necesitado.

Para que no sea necesario tener que conceder el  permiso para AirDroid cada vez después de actualizar / reinstalar AirDroid, simplemente ir a configuración de la aplicación de gestión de permiso de root (como SuperSU) y  pulsar la opción de re-autenticación para desactivarla

AirMirror en terminales que no dispongan  permisos de  root

También es  fácil usar Airmirror en terminales que no  son root,para ello haga  clic AirMirror  pulse a la izquierda  en el icono  no-root

Ahora siga las instrucciones para conectar los dispositivos al ordenador  a través de USB cable y asegúrese de que modo de conexión es MTP y habilitar la “depuración USB”

Si no ve un pop up en el terminal para habilitar la depuración USB, vaya a Setting( configuración) > “About phone”(teléfono) > “Build number”    y pulse sobre  este  al menos 7 veces para activar “Opciones del desarrollador”.


Ahora  vuelva hacia atras   y vera  “Opciones de desarrollador” > alli Activar “depuración USB”.

En el caso de que su  teléfono sea Xiaomi, también debería permitir USB debugging (security settings) es decir configuración de seguridad  para depuración USB   para que pueda controlar su teléfono desde el PC.


Después de terminar este proceso , conecte el dispositivo a su ordenador y haga clic en configuración completada.

¡Ahora ya debería de poder e utilizar AirMirror para acceder a sus dispositivos en cualquier momento y en cualquier lugar  !

Lamentablemente  una  pega importante de este proceso es que necesitara restablecer la depuración USB, si reinicia el dispositivo.

 

Por cierto si el dispositivo tiene permisos de  root  pero el permiso fue denegado para AirDroid, por favor, trate de usar AirMirror con no-root   como hemos comentado mas arriba…

 

 

Mas información  y ayuda  en http://forums.airdroid.com/

Actualización de un viejo radiocasete


Esta claramente   de moda la reutilización  de electrónica antigua a nuevos tiempos acoplando   uno de los elementos mas versátiles que existen como son los smartphones

En este caso se trata de  conversión de  viejas pletinas analógica   donde se instala un smartphone que también puede ser reciclado o desuso   en el hueco originalmente destinado a la cinta de casete.

Para  dar mas  realismo ,mientras el reproductor está en funcionamiento sobre la pantalla del smartphone se muestra la imagen animada de una cinta de casete en movimiento sobre la que ademas podemos interactuar.

En realidad puede parecer ingenioso la conversión ,  pero el proceso  no es demasiado complejo sobre todo si  no se tiene nostalgia de mantener la parte mecánica del casete pues esta no sera útil  , pero  haciendo por tanto el proceso irreversible

 

 

Cada pletina actualizada con este sistema  está llena de posibilidades:

  •  Reproductor de MP3 y FLAC con simulación de casete animado
  •  Radio Internet
  • Reproductor  de Spotify, Tidal, Deezer, Pandora etc.
  •  Radio FM
  •  Carga y administración de música inalámbrica
  •  Control táctil
  •  Almacenamiento interno para archivos de música

 

En realidad como se comentaba ,los pasos para la conversión no son demasiado complejos:

Paso 1 :Elección de la pletina

El primer paso es encontrar una pletina grabadora que sea adecuada para la modificación y luego imaginar y planificar con precisión el efecto final.

Debido a la construcción sólida y duradera y la simplicidad, las pletinas  mecánicas vintage  con amplificador HIFI  incorporado son una de las  opciones preferidos   pues le daremos una segunda oportunidad  al menos a  la parte de BF y de paso recordaremos tiempos pasados.

Algunas grabadoras no son adecuadas para el procesamiento debido a su diseño mecánico y eléctrico. Las viejas y simples cubiertas vintage con teclas mecánicas son una opción favorita para la conversión .La cubierta destinada a la conversión debe ser eléctricamente funcional. Los circuitos de audio, las entradas / salidas, los medidores de nivel, las regulaciones, los interruptores, etc. deberían funcionar correctamente.

El motor, las correas y los engranajes no son importantes, pueden estar rotos o dañados.

 

Obviamente para poder partir de algo sobre lo que montar el smartphone al menos la parte de BF ( es decir la etapa de audio ) debería funcionar para poder continuar la conversión , aunque si esta parte  no funciona también podemos optar por reemplazar la vieja etapa de audio por un amplificador clase D ya montado, pues no ocupan nada de espacio y son realmente económicos .

 

 

Paso 2 Software

El corazón del sistema es un teléfono inteligente con pantalla táctil con software dedicado.

El teléfono debe estar equipado con suficiente memoria incorporada   a ser posible con una tarjeta de memoria adicional para almacenar música.

Es ademas necesario  un cargador adecuado  y  cables de audio de jack de 2 1/2″ stereo a dos conectores macho RCA

En cuanto al software  el abanico es inmenso,como pueden ser Casse-o-player, Cassete Tapes, Easy Music Player, etc

Uno de los mas realistas es Delitape   una app nº 1 para iPhone ahora disponible también para Android. Esta app  rememora el sentimiento de los viejos tiempos y convierte cualquier smartphone moderno en un walkman clásico

 

cintas

Esta app vintage de musica le devuelve a los viejos tiempos. Deslízese por las cintas más elegantes, hechas con pasión por los detalles. Durante la reproducción de los temas, la app simula la forma en que se reproducían las cintas de antes.

Esta app ademas tiene  Soporte de radio de Internet con más de 1000 de las mejores estaciones de radio del mundo web!

Otro app necesaria es Airdroid   pues esta app permite acceder y manejar su teléfono o tableta Android desde Windows, Mac o la web, sin cables, y de forma gratuita.

Cada platina sin cinta ofrece muchas posibilidades: reproductor MP3 / FLAC con animación de cassette, radio por Internet y radio FM (algunos modelos). Si lo desea, puede instalar cualquier aplicación de Android, por ejemplo, su servicio favorito de transmisión de música: Tidal, Spotify, Dezeer, Pandora … o lo que sea que necesite.

 

Paso 3 Montaje

Es hora de ensamblar y combinar componentes, incluidos trabajos mecánicos de precisión .

Lo más difícil es poner el teléfono inteligente en el compartimiento del casete  sin romper nada lo cual necesitara grandes dosis de paciencia  e ingenio

Durante el procesamiento, muchas partes mecánicas se eliminan para siempre, por lo que ya no podrá usar las casetes siendo la conversión irreversible.

Respecto a la electrónica , debemos conectar con cable estero apantallado  desde un jack macho stereo de 2 1/2″ hacia la entrada de auxiliar de la pletina ( bien con conectores RCA o bien soldando a la placa de BF).

Obviamente tampoco debemos olvidarnos de alimentar  al smartphone por lo  que situaremos el cargador en el interior de la pletina tomando  la alimentación de ca directamente desde esta (por ejemplo a la salida de interruptor mecánico de power que este tipo de equipos llevan)

La batería se cargara automáticamente cuando se encienda la plataforma. Si no usa la plataforma durante un período prolongado, recuerde apagar el teléfono para evitar descargar la batería por completo. En caso de que la batería esté descargada, simplemente encienda la plataforma y espere un momento hasta que el teléfono muestre signos de vida. Luego encienda el teléfono nuevamente.

Para  operar el teléfono dentro de la plataforma se hará al igual que un teléfono estándar, con una excepción, ya que el teléfono está integrado en la plataforma y el conmutador de encendido / apagado es de difícil acceso, por lo que  lo  “correcto” seria  conectarlo  eléctrica mente a una de las teclas de la plataforma y así funcionaria de la misma manera que el original.

El resultado como se podía  esperar  es bastante impresionante  dependiendo mucho de como seamos capaces de disimular el smartphone dentro de la pletina :

 

Finalmente, el dispositivo se ve y actúa como una platina de cinta real, que incluye una fascinante animación de casete, medidores de nivel de trabajo, señal de salida ajustable, etc. Hermosa pieza de artesanía hecha a mano. Además, cada TapeLess Deck MP3 es un dispositivo único y artesanal, el único en el mundo.

 

Paso 4: Subir y administrar música…

Para preparar  el smartphone , conecte  el  WiFi del smartphone e inicie sesión en su red doméstica. Recuerde que sin cubierta y ordenador  deben trabajar en la misma red.
 
Haga clic en el icono de AirDroid y espere pacientemente a la siguiente pantalla. En el primer uso toma algún tiempo…
Encuentre y haga clic en el icono azul de la AirDroid Web. A veces puede ser cubierto por los anuncios, así que mire con atención…
Espere al respuesta del servidor y escriba dado la dirección exactamente para el navegador de su ordenador.
Vaya a su ordenador  e introduzca  la url citada en un navegador .Ahora verá una página web generada por AirDroid. Contiene algunas informaciones útiles acerca de los teléfonos sin cubierta, como memoria disponible o estado de la batería y mucho mas
 
Haga clic en el icono de archivos y localize la carpeta MUSIC en la tarjeta SD o tarjeta SD externa (dependiendo de la configuración del teléfono). Es el momento para cargar música del ordenador a la memoria del smartphone:Abra la carpeta con la música en su ordenador  seleccione los archivos y sólo tiene que arrastrar a la! Ventana _MUSIC. Espere a que la transferencia hasta el final.

 

 

 

Por cierto esta idea se puede extender no solo a una pletina hifi, también  radiocasete , equipos compactos , etc ¿tiene alguno  de estas viejas leyendas en el trastero  y no sabe que hacer con estas pues con un viejo smartphone le puede dar otra nueva vida?

 

 

Fuente  http://www.mp3tapelessdeck.pl/

Control de terminales Android


Family Link de  Google puede ayudar a configurar determinadas reglas básicas sobre el uso de la tecnología pues tenga en cuenta que las aplicaciones de Google no se han diseñado teniendo en mente a los menores,  de modo que si quiere ayudar a su  hijo a tomar decisiones acertadas cuando utilice su dispositivo  Android , esta app  que vamos a ver , y  que ya esta disponible en España ,sin duda es una interesante opción , aunque  debe  saber    que el tutor o padre es quien decide finalmente las aplicaciones y los servicios que puede utilizar el menor.

 

 

 

En efecto desde hace unos  días ya esta disponible en España ( y pronto en el resto de países  que usan la lengua española  )    la  app para instalar en nuestros terminales Google Family Link, una   aplicación  de control parental oficial de Google  disponible  gratuitamente  en Google Play que permite a los padres supervisar el uso que los menores   hacen de sus terminales móviles  o tabletas.

 

Con Family Link se puede crear una cuenta de Google para un menor similar a la suya, con acceso a la mayoría de los servicios de Google, y, al mismo tiempo, establecer algunas normas básicas sobre la experiencia digital de su familia:

  •  Gestionando las aplicaciones que puede usar el menor: aprobando o bloqueando las  apps  que quiera descargar de Google Play Store.
  •  Controlando el tiempo de conexión permitiendo consultar cuánto tiempo usa el menor  sus aplicaciones favoritas mediante los informes de actividad semanal o mensual, y configurando  límites de tiempo de conexión diarios.
  •  Configurando  horas para  dormir en el dispositivo: con esta función puede bloquear los dispositivos de manera remota cuando sea la hora de dormir o de hacer un descanso.

 

bloqueo.PNG

Ademas una de las características clave de Google Play Family (razon por las que nos pide  una tarjeta de credito al instalar la app por primer a vez ) es es que podremos compartir apps y contenidos,  que hayamos comprado, con nuestra familia ( hasta un grupo de seis personas)

Ademas de las apps  es  extensible a las películas  y música  que compramos, que podrán ser descargadas y utilizadas por los otros cinco componentes del plan, por lo que nos ahorraremos mucho dinero con determinadas aplicaciones o juegos que, en lugar de tener que comprar todos, podremos comprar solo una única vez.

Para poder usar Family Link  se necesita :

  • Un dispositivo Android compatible para el menor con  Android 7.0 (Nougat) o versiones posteriores. Algunos dispositivos con Android 5.0 y 6.0 (Lollipop y Marshmallow) también puedan ejecutar Family Link.

  • Una cuenta de Google para el menor  que se gestione con Family Link: No deja usar cuentas ya creadas porque  los menores en  cada  país  tienen una política de privacidad distinta, así que hay que aceptarla y generar un usuario nuevo. La  edad mínima para usar YouTube  en USA es 13 años razón por la que no  deja instalar esta app pero para usar otras aplicaciones de redes sociales lógicamente  también existe una edad mínima en este caso de 14 años, aunque también depende del país. Todo esto viene en el disclaimer, aviso legal de la app cuando la instalas. En algo tan serio como a que se exponen nuestros hijos en Internet creo que merece la pena leerte por una vez lo que estas aceptando.

  • Para los padres, madres y tutores  un dispositivo Android 4.4 (Kit Kat) o versiones posteriores, o  un  iPhone con iOS 9 o versiones posteriores.

  • Una cuenta de Google

  • Encontrarse  en un país donde la aplicación esté disponible:en Estados Unidos, México, Argentina, Chile o Brasil, Europa, y los usuarios españoles pueden empezar a utilizarla desde hoy.

 

Como vemos un  gran inconveniente  es que  se requiere  un terminal muy actual pues se recomienda un android 7.0  para los menores,  mientras  que el del tutor   puede ser  uno mas antiguo(Android 4.4)   o incluso un Iphone

La  app  es técnicamente  gratuita pero es posible que Google verifique su tarjeta de crédito para confirmar que estás dando su consentimiento como padre, madre o tutor al crear una cuenta de Google para su hijo o hija aunque donan todos los fondos de estas transacciones a una organización para la protección de los niños.

Su gran limitación , ademas de la versión de Android para los menores, es como puede suponerse, que requiere  cuentas  de gmail  para los menores   nuevas , es decir no sirven cuentas facilitadas en el trabajo o centro educativo u otras que se tengan  pues  Family Link solo funciona con cuentas de Google creadas a través de esta aplicación para niños menores de 13 años (o la edad que corresponda según la legislación vigente en su jurisdicción). Cuando el niño cumpla esta edad, podrá seguir utilizando Family Link si quiere

 

 

Pasos para Instalar y configurar Google Family link

En el terminal paterno ,lo primero es descargar desde Google Play Store  desde el link oficial  ( o buscando Google Family Link)

También es posible instalar la aplicación paterna de control en un terminal iOS ( para los menores por el momento no , es decir solo Android 7)

Rápidamente  le aparecerá un breve asistente para guiarle en el  proceso completo   que solo tiene  tres  pasos:

Enseguida nos va  a preguntar la cuestión  principal sobre el terminal del menor ya que se aconseja este  sea Android 7.0 (Nougat) o versiones posteriores.

Algunos dispositivos con Android 5.0 y 6.0 (Lollipop y Marshmallow) también puedan ejecutar Family Link. pero no esta asegurado su funcionamiento

 

 

 

Ahora   tendremos que aceptar las condiciones contractuales si estamos de acuerdo  , por  lo que debemos que aceptar esta pantalla  vinculando la nueva cuenta que se cree al menor  con la cuenta del tutor

 

Ahora   ya lo siguientes  toca crear la cuenta del menor por  lo que tendremos que darle nuevamente a siguiente

Vamos por el segundo paso,  así que   volveremos a  dar a  siguiente:

 

Finalmente desde la propia app nos va a permitir crear la cuenta del menor

 

Ahora ya solo tenemos que seleccionar el nombre  y apellidos del hijo

 

 

Lo siguiente que nos pedirá es a la  fecha de nacimiento del menor así como  un nombre de usuario para su cuenta de Gmail (que debe ser único ) y una contraseña.

 

 

Finalmente de cara al terminal del tutor  tendrá que facilitar los datos de una  tarjeta bancaria ( se recomienda de delito   y a ser posible virtual o de prepago)    para otorgar el consentimiento parental para crear la cuenta.

 

Una vez configurado la app toca ir al terminal Android del menor   donde tendremos  que introducir la cuenta que se  haya creado para él de modo que  Android identificará que este forma parte de Family Link  asi que que tendremos que introducir las credenciales de tutor para avanzar en la configuración del terminal del menor

En este el proceso puede restringir las aplicaciones que no se quiere  que pueden utilizar y el asistente  irá guiando por los distintos pasos.

 

Revise detenidamente las aplicaciones del dispositivo de su hijo e inhabilite aquellas que no quiera que use. En  muchos casos   es posible que no pueda inhabilitar algunas aplicaciones preinstaladas en determinados terminales.

Se puede asimismo en este paso personalizar los controles de Google Play, crear filtros de contenido y de búsqueda, ver qué aplicaciones ha instalado y restringir las que no  parezcan apropiadas, ver su ubicación en tiempo real y configurar el tiempo en pantalla.

 

 

 

La actividad de algunas aplicaciones, como las de reproducción de música y las de mensajería que se ejecutan en segundo plano, no se registra por completo en los informes de actividad semanal o mensual.

Aunque Family Link  ayuda a gestionar las compras y las descargas de los menores, este no necesitará la  aprobación del tutor para instalar actualizaciones de aplicaciones (incluidas aquellas que amplían permisos), las aplicaciones que haya aprobado anteriormente ni las que se hayan compartido en la colección familiar,  así que los padres, madres o tutores deben revisar de manera periódica qué aplicaciones tiene instaladas su hijo y los permisos de las aplicaciones en Family Link.

 

 

 

Open sw para analítica y monitorizacion


En efecto vamos  a   hablar de Grafana ,un software de  código abierto, rico en muchas características, potente, elegante ideal par analytics  y monitorizacion  que se puede ejecutar en Linux, Windows y MacOS.

Tal es su aceptación  que de hecho es un software de facto para el análisis de datos,  utilizado  en DStack overflow, eBay, PayPal, Uber y Digital  Ocean – sólo por mencionar algunos.

Soporta más  de 30 código abierto así como fuentes de datos bases de datos comerciales incluyendo MySQL, PostgreSQL, Graphite, Elasticsearch, OpenTSDB, Prometheus y InfluxDB . Le permite  digerir profundamente en grandes volúmenes de datos en tiempo real, datos operativos; visualizaciones, consultas, establecer alertas y obtener ideas de sus métricas desde ubicaciones de almacenamiento diferentes.

Es de destacar  que, Grafana permite la creación de múltiples configuraciones   independientes  teniendo su propio entorno de uso (administradores, fuentes de datos, paneles y usuarios).

Grafana Analytics Monitoring Software

Algunas características de Grafana

  • Elegantes gráficos para visualización de datos.
  • Gráficos rápidos y flexibles con muchas opciones.
  • Cuadros de mando dinámicos y reutilizables.
  • Es altamente extensible en cientos de paneles de control y plugins de la biblioteca oficial.
  • Ayudas de alimentación las preferencias del usuario.
  • Soporta multi tenancy, configuración de múltiples organizaciones independientes.
  • Compatible con la autenticación via LDAP, Google Auth, Grafana.com y Github.
  • Soporta notificaciones via Slack, PagerDuty y mas
  • Apoya notable colaboración que permite compartir datos y cuadros de mando a través de equipos y mucho más.
  • Una demostración en línea está disponible para probar antes de instalar Grafana en tu distribución Linux.: Demo URL: http://play.grafana.org/

 

En este post vamos a explicar cómo instalar software Grafana – visualización de datos y monitoreo en las distribuciones CentOS, Debian y Ubuntu .

Instalar Grafana en sistemas Linux

1. Vamos a instalar Grafana desde sus repositorios YUM o APT para que usted pueda actualizar con su administrador de paquetes predeterminado.

Instalar Grafana en Debian y Ubuntu

$ echo "deb https://packagecloud.io/grafana/stable/debian/ stretch main" | sudo tee -a /etc/apt/sources.list
$ curl https://packagecloud.io/gpg.key | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install grafana

Instalar Grafana en RHEL, CentOS y Fedora

# echo "[grafana]
name=grafana
baseurl=https://packagecloud.io/grafana/stable/el/7/$basearch
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packagecloud.io/gpg.key https://grafanarel.s3.amazonaws.com/RPM-GPG-KEY-grafana
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt" | sudo tee /etc/yum.repos.d/grafana.repo
# yum install grafana

2. Después de instalar Grafana, puede encontrar archivos importantes en las siguientes ubicaciones:

  • El Binario se instala en /usr/sbin/grafana-server
  • Instala el script de Init.d para /etc/init.d/grafana-server
  • Crea archivo predeterminado (entorno vars) a /etc/default/grafana-server
  • Instala el archivo de configuración para /etc/grafana/grafana.ini
  • Instala servicio systemd service  grafana-server.service
  • La configuración predeterminada establece el archivo de registro en /var/log/grafana/grafana.log
  • La configuración predeterminada especifica un db de sqlite3 en /var/lib/grafana/grafana.db
  • Instala JS/HTML/CSS y otros archivos de Grafana en /usr/share/grafana

3. A continuación, iniciar el servicio Grafana , y  comprobar si esta levantado  y funcionando, habitándolo  para el inicio automático en el arranque siguiente. De forma predeterminada, el proceso se ejecuta como el usuario grafana (creado durante el proceso de instalación) y escucha en el puerto HTTP  3000.

Iniciar servidor de Grafana (a través de Systemd)

# systemctl daemon-reload
# systemctl start grafana-server
# systemctl status grafana-server
# systemctl enable grafana-server

Iniciar servidor de Grafana (a través de init.d)

# service grafana-server start
# service grafana-server status
# sudo update-rc.d grafana-server defaults  [On Debian/Ubuntu]
# /sbin/chkconfig --add grafana-server      [On CentOS/RHEL/Fedora]

4. Si su sistema tiene un firewall activado por defecto, necesita abrir el puerto 3000 en el firewall para permitir las solicitudes de cliente para el proceso de grafana.

-----------  [On Debian/Ubuntu] -----------
$ sudo ufw allow 3000/tcp
$ sudo ufw reload
-----------  [On CentOS/RHEL/Fedora] -----------  
# firewall-cmd --permanent --add-port=3000/tcp
# firewall-cmd --reload

5. Ahora utilice la siguiente URL para acceder a la Grafana, que le redirigirá a la página de inicio de sesión, las credenciales de usuario como username: admin y contraseña: admin)

http://Your-Domain.com:3000
OR
http://IP-Address:3000

Grafana Admin Login

6. Después del inicio de sesión, usted accederá a la consola casera, como se muestra en la imagen de abajo.

Grafana Home Dashboard

7. A continuación, agregar un origen de datos o base de datos, haga clic en “Agregar origen de datos“. Por ejemplo vamos a añadir una base de datos MySQL ; especificar los parámetros de nombre, tipo y conexión de fuente de datos. Haga clic en Guardar y probar.

Add Grafana Data Source

Se le notificará si la conexión de base de datos es exitosa o ha fracasado, como se muestra en la captura de pantalla.

Luego volver a la consola Inicio para añadir un panel nuevo.

Grafana Data Source Connection

8. En el panel de Inicio , haga clic en tablero de instrumentos nuevo para añadir un nuevo panel para visualizar parámetros de origen de datos.

Add Grafana New Dashboard

Desde aquí, puede agregar más fuentes de datos, dashboards, invitar a los miembros de su equipo, instalar aplicaciones y plugins para extender las funcionalidades por defecto y hacer más.

Puede encontrar más información de la Grafana Homepage: https://grafana.com/

 

Fuente tecmint.com

Datalogger de posicionamiento con Raspberry Pi y Azure


CÓDIGO

AzureIoTRegistryManagerApp C #
Este es el código de acceso y gestión Azure Registro Hub IO, haciendo uso de la clase RegistryManager.
////The MIT License(MIT)
////Copyright(c) 2016 BardaanA

////Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

////The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

////THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

using System;
using System.Threading.Tasks;

// These are the Microsoft's recommended libraries to access
// and make changes to Azure IoT Hub's Registry
using Microsoft.Azure.Devices;
using Microsoft.Azure.Devices.Common.Exceptions;

// This namespace which also dictates the name of the Assembly can be anything you desire.
namespace AzureIoTRegistryManagerApp
{
    class Program
    {
        // RegistryManager object which is going to do most of the work for our application
        static RegistryManager registryManager;
        // This here is the Connection String that you copied from the IoT Hub Shared Access Policies > iothubowner > Shared access keys; remember??
        static string connectionString = "Don't forget to replace this with your own connection string";
        // Keeps track of the registry access status
        static string registryAccessStatus = "";

        static void Main(string[] args)
        {
            try
            {
                // Let's try and create a Registry Manager using our connection string, shall we?
                registryManager = RegistryManager.CreateFromConnectionString(connectionString);
                registryAccessStatus = "Successfuly connected to the IoT Hub registry"; // Yay!
            }
            catch(Exception ex)
            {
                Console.WriteLine("Registry access failed!  {0}",ex.Message);  // Bummer!!
            }
            // Check if RegistryManager was created successfully
            if(registryManager != null)
            {
                Console.WriteLine("*****************************************************");
                Console.WriteLine("===== Welcome to the Azure IoT Registry Manager =====");
                Console.WriteLine();
                Console.WriteLine("++ {0} ++",registryAccessStatus);
                Console.WriteLine();
                int menuSelection = 0;
                while(menuSelection != 3)  // Loop to keep you going...
                {
                    Console.WriteLine("  1) Add device into registry");
                    Console.WriteLine("  2) Remove device from the registry");
                    Console.WriteLine("  3) Close this application");
                    Console.WriteLine("------------------------------------");
                    Console.Write("Enter your selection: ");
                    menuSelection = int.Parse(Console.ReadLine());
                    Console.WriteLine();
                    switch(menuSelection)
                    {
                        case 1:
                            Console.Write("Enter device name that you want to register: ");
                            string deviceName = Console.ReadLine();
                            Console.WriteLine();
                            if(deviceName.Length > 0 && !deviceName.Contains(" "))  // Weak validation :)
                            {
                                // Calling method that actually adds the device into the registry
                                AddDevice(deviceName).Wait();
                            }
                            else
                            {
                                Console.WriteLine("---");
                                Console.WriteLine("Enter valid name!");
                                Console.WriteLine("---");
                            }
                            break;
                        case 2:
                            Console.Write("Enter name of the device to be removed: ");
                            string deviceRemoveName = Console.ReadLine();
                            Console.WriteLine();
                            if(deviceRemoveName.Length > 0 && !deviceRemoveName.Contains(" "))  // Weak validation :(
                            {
                                // Calling method that actually removes the device from the registry
                                RemoveDevice(deviceRemoveName).Wait();
                            }
                            else
                            {
                                Console.WriteLine("---");
                                Console.WriteLine("Enter valid name!");
                                Console.WriteLine("---");
                            }
                            break;
                        case 3:
                            // Breaks out of the loop
                            break;
                        default:
                            Console.WriteLine("---");
                            Console.WriteLine("Choose valid entry!");
                            Console.WriteLine("---");
                            break;
                    }
                }
                // Closes the RegistryManager access right before exiting the application
                registryManager.CloseAsync().Wait();
            }
        }

        // Method used to add device into the Registry, takes in a string as a parameter
        private static async Task AddDevice(string deviceId)
        {
            // A Device object
            Device device;
            try
            {
                // Lets try and create a Device into the Device Registry
                device = await registryManager.AddDeviceAsync(new Device(deviceId));
                if(device != null)
                {
                    Console.WriteLine("Device: {0} added successfully!",deviceId); // Hooray!
                }
            }
            catch(DeviceAlreadyExistsException)  // What?
            {
                Console.WriteLine("---");
                Console.WriteLine("This device has already been registered...");// When did I do that??
                Console.WriteLine("---");
                device = await registryManager.GetDeviceAsync(deviceId);
            }
            Console.WriteLine();
            Console.WriteLine("Generated device key: {0}",device.Authentication.SymmetricKey.PrimaryKey);  // Now you're talking!
            Console.WriteLine();
        }

        // Method used to remove a device from the Device Registry, takes a string as a parameter
        private static async Task RemoveDevice(string deviceId)
        {
            try
            {
                // Lets try and get rid of the Device from our registry, using the device id.
                await registryManager.RemoveDeviceAsync(deviceId);
                Console.WriteLine("Device: {0} removed successfully!",deviceId);  // Yup!
            }
            catch(DeviceNotFoundException)
            {
                Console.WriteLine("---");
                Console.WriteLine("This device has not been registered into this registry!");  // Are you sure??
                Console.WriteLine("---");
            }
        }
    }
}

Fuente aqui