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

Como crear musica gracias a machine learning con Raspberry Pi


La tecnología siempre ha desempeñado un papel en la creación de nuevos tipos de sonidos que inspiran a los músicos, desde los sonidos de distorsión hasta los sonidos electrónicos de los sintetizadores,sin embargo gracias a los avances en el aprendizaje automático y las redes neuronales han abierto nuevas posibilidades para la generación de sonido  como los demuestra el  grupo Magenta de Google que es el que ha creado NSynth Super,   basandonase en una Raspberry Pi 3  y utilizando Machine Learning con TensorFlow para explorar nuevos sonidos y melodías a músicos y artistas(TensorFlow es una biblioteca de código abierto para aprendizaje automático a través de un rango de tareas, y desarrollado por Google para satisfacer sus necesidades de sistemas capaces de construir y entrenar redes neuronales para detectar y descifrar patrones y correlaciones, análogos al aprendizaje y razonamiento usados por los humanos).

 

El proyecto es  totalmente abierto y «cualquiera» familiarizado con  la electronica debería podérselo construir en su propia casa o en el taller, aunque esto es la teoría pues en la practica todos los componentes son SMD ,lo cual complica las cosas bastante a la hora de ponerse a soldar los diferentes componentes que  constituyen ese proyecto.

Usando TensorFlow , han   construido herramientas e interfaces que permiten a artistas y músicos utilizar el aprendizaje automático en su trabajo. El algoritmo NSynth Super AI usa redes neuronales profundas para investigar el carácter de los sonidos y luego construye nuevos sonidos basados ​​en estas características en lugar de simplemente mezclar los sonidos.

Usando un autoencoder, extrae 16 características temporales definitorias de cada entrada. Estas características se interpolan linealmente para crear nuevas incrustaciones (representaciones matemáticas de cada sonido).

Estas nuevas incrustaciones se decodifican en nuevos sonidos, que tienen las cualidades acústicas de ambas entradas (se pueden encontrar más detalles en la página NSynth: Neural Audio Synthesis ).

 

Open NSynth Super luego toma el audio generado y proporciona una interfaz física o instrumento con:

    • Entrada MIDI para conectar un teclado de piano, un secuenciador o una computadora, etc.
    • Cuatro codificadores giratorios utilizados para asignar instrumentos a las esquinas del dispositivo
    • Pantalla OLED para el estado del instrumento y la información de control
    • Controles finos para:
      • La posición estableciendo la posición inicial de la onda.
      • Attack establece el tiempo necesario para el inicio inicial del nivel.
      • Decay establece el tiempo necesario para el posterior agotamiento.
      • Sustain establece el nivel durante la secuencia principal del sonido.
      • Release establece el tiempo necesario para que el nivel disminuya desde el nivel de sostenido a cero.
      • El volumen establece el volumen de salida.
    • Interfaz táctil para explorar las posiciones entre los sonidos.

Obviamente la Rasbpeberry   es usada  para  administrar las entradas físicas y esto se programa antes del primer uso.

 

 

El equipo publica todos los diseños de hardware y software que son parte de su investigación en curso bajo licencias de código abierto, lo que le permite  que cuaqluiera  que tenga los medios adecuados  puedas construirse  su propio sintetizador usando esta tecnlogia .

 

Utilizando estas herramientas de código abierto, Andrew Black ha producido su propia NSynth Super, mostrada en el video anterior.

La lista de materiales de construcción de Andrew incluye:

    • 1x Raspberry Pi 3 Model B (896-8660)
    • 6x Alps RK09K Series Potentiometers (729-3603)
    • 4x Bourns PEC11R-4315F-N0012 Rotary Encoders
    • 2x Microchip AT42QT2120-XU Touch Controller ICs (899-6707)
    • 1x STMicroelectronics STM32F030K6T6, 32bit ARM Cortex Microcontroller (829-4644)
    • 1x TI PCM5122PW, Audio Converter DAC Dual 32 bit (814-3732)
    • 1x Adafruit 1.3″ OLED display

 

El equipo de Magenta también proporciona archivos de Gerber para que se  pueda fabricar la placa de circuito impreso , de modo que una vez se haya fabricado, se pueda comenzar con el soldado de componetes  em la PCB (incluye una tabla de contenidos para agregar componentes)

Como adelantabmos ,laa construcción no es trea fácil: requiere habilidades de soldadura o acceso a alguien que pueda ensamblar PCB pues la mayoría de los componentes son SMT de modo que el paso de componentes se reduce a alrededor de 0,5 mm, que aun se se pueden soldar a mano si se tiene cuidado. Sin embargo, aunque algunos podrían argumentar que no es absolutamente necesario, es aconsejable tener un microscopio estéreo y una estación de aire caliente disponibles también. ¡Y no hace falta decir que también debería tener suficiente flujo y mecha de soldadura!

Para probar  este diseño , descargamos un archivo MIDI de Internet y luego lo reproducimos a través de una computadora portátil Linux y una interfaz USB / MIDI usando el comando «aplaymidi». Efectivamente, el NSynth Superarrncara  y  ya podremos asignar instrumentos a cada esquina y luego interpolar a través de la maravilla del aprendizaje automático para crear nuevas, hasta ahora desconocidas, 

 

Puede echar un vistazo a la publicación de blog de Andrew y al informe oficial de NSynth GitHub para ver si está preparado para el desafío.

Aquí información útil para montarlo:https://www.rs-online.com/designspark/building-the-google-open-nsynth-super