Archivo de la categoría: MicroFramework

MicroFramework

Net Microframework – Volver a Empezar

Después de un periodo de sombra… parece ser que el tirón de IoT vuelve a poner en escena  a Microframework y Gadgeteer.

Para los que sintáis curiosidad os dejo un enlace a un «overview» en ch9 posteado hace poquitas horas.

Para los asiduos y seguidores mas que sorprenderos, vale la pena escuchar a Salvador Ramírez (microframework team), creo que aclara direcciones y planes de futuro.

NET-Micro-Framework

Que lo disfrutéis!

PepLluis,

Back on the road : Microframework SDK 4.3-R2 (Beta)

En los últimos macro-eventos de Microsoft hemos sido testigos de grandes anuncios, compromisos y cambios de orientación que la compañía promete introducir en un futuro casi  inmediato. Los primeros discursos de Satya Nadella dejaron definidas de forma clara las líneas que marcan la nueva orientación, y que dicho de paso generan buenas expectativas para un gran numero de desarrolladores deseosos de explorar nuevos horizontes.

Si recopilamos alguno de los mensajes muchas de estas iniciativas están directamente relacionadas con palabras que giran en torno al Cloud, Open Source y obviamente cualquier cosa relacionada con el IoT o el “Internet of yours things”.

Simultáneamente asistimos a una decidida apuesta por “Windows on Devices” integrando plataformas diversas entorno a “SoC’s” con Intel Atom o Quark. Sin duda una ventana enorme para los que apuestan por el internet de las cosas, como uno de los escenarios más propicios para generar potentes oportunidades de tecnología, innovación y negocio.

Muchos de los que seguimos de cerca la progresión de MicroFramework hemos estado durante meses esperando “alguna noticia” que despejara las dudas que se estaban generando sobre los planes que el equipo de MS tenía en su Roadmap. La gran explosión de IoT con WindowsOnDevices y los futuros Azure Intelligent System Services, sumados al hecho de que MicroFramework no estaba soportado en Visual Studio 2013 ponía en tela de juicio cualquier comentario sobre los planes más optimistas.

Pues bien como siempre el silencio y la calma no es más que el preludio de un gran revuelo. Hace pocas horas el equipo de NetMF anunciaba la disponibilidad en BETA del SDK-R2 de MicroFramework para Visual Studio 2013.

Es una gran noticia para la comunidad de NetMF que además viene respaldada por una renovada filosofía… de nuevo grandes cambios, grandes retos! 🙂

El proyecto ha sido asignado al equipo OpenTech de Microsoft  : http://msopentech.com/

NetMF se renueva en su site : http://www.netmf.com/

Beta para el SDK-R2 de MicroFramework 4.3 : http://netmf.codeplex.com/releases/view/133285

En cuanto pueda os posteare otro corto con las características que se añadirán a este R2. Saludos, PepLluis,

Netduino 1 – C# – timer

Hablando con un amigo, salió el tema de que tenia un netduino de los antiguos y recordaba un ejemplo que les dieron en un taller donde lo compraron, pero argumentaba que era un poco precario pues en la demo encendían/apagaban el led de la placa con «thread.Sleep»… rápidamente me puse a reír y le explique que como en sus hermanos mayores también dispone de timers!

Tengo un ejemplo posteado en VB, pero tal y como me comprometí en la conversación lo posteo en C# aunque estoy seguro que existen 101 ejemplos que explican lo mismo, pues este es solo un «hola mundo» para microframework.

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
 
namespace NetduinoApplication1
{
    public class Program
    {
        static OutputPort onboardLed = new OutputPort(Pins.ONBOARD_LED, false);
        static Timer firstTimer = new Timer(new TimerCallback(tictac), null, 250, 250);
 
        public static void Main()
        {
            Thread.Sleep(Timeout.Infinite);
        }
 
        static Boolean onOff;
        public static void tictac(object status)
        {
            onboardLed.Write(onOff);
            onOff = !onOff;
        }
    }
}

Aunque es de lo mas básico, espero que ayude algún que otro rezagado.
Saludos,
PepLluis,

Cerbuino y el módulo ENC28

Si estas intentando obtener una IP de un DHCP de tu router y no lo estas consiguiendo… existe un “gapo conocido” con el lwip compilado en la versión de GHI 4.2.6.2, asi que no pierdas el tiempo pues no podrás obtener ninguna IP del DHCP de algunos routers.

Solo te queda la opción de configurar una IP estática.

Por otra parte debes tener en cuenta que el evento “networkAddressChanged” solo se levanta una vez al iniciarse el procesador, por lo que si se cambia la IP de “forma manual” deberás seguirlo de “forma manual”.

Os dejo un pequeño ejemplo como punto de entrada para experimentar reacciones.

Como ya sabéis el firmware del Cerbuino es de comunidad i la parte del ENC28 está basada en la aportación de comunidad, espero que entre todos podamos pulir la próxima liberación.

 

No dudéis pedirlo en VB si lo necesitais 🙂

Saludos,

using System;
using Microsoft.SPOT;
 
using Microsoft.SPOT.Net.NetworkInformation;
using GT = Gadgeteer;
 
Namespace GadgeteerApp1
{
 
    Partial Public Class Program
    {
        NetworkInterface miEth;
        GT.Timer tmr = new GT.Timer(30000);
 
        void ProgramStarted()
        {
            miEth = NetworkInterface.GetAllNetworkInterfaces()[0];
            miEth.PhysicalAddress = miMac;            
            Debug.Print("Program Started... wait for an IP");
            NetworkChange.NetworkAddressChanged += NetworkChange_NetworkAddressChanged;            
            tmr.Tick += tmr_Tick;
            tmr.Start();
        }
 
        Boolean tictac;
        string lastIP;
        void tmr_Tick(GT.Timer timer)
        {
            if (lastIP != miEth.IPAddress.ToString())
            {
                lastIP = miEth.IPAddress.ToString();
                Debug.Print("Current Ip : " + lastIP);
            }
 
            if (miEth.IPAddress == "0.0.0.0")
            {
                Mainboard.SetDebugLED(true);
                Debug.Print("No DHCP server response :-(");
                miEth.EnableStaticIP("192.168.1.50", "x.x.x.x", "y.y.y.y");
            }
            else
            {
                Mainboard.SetDebugLED(tictac);
                tictac = !tictac;
                if (tmr.Interval.Milliseconds > 1000) tmr.Interval = new TimeSpan(0, 0, 1);
            }
        }
 
        void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)
        {
            Debug.Print("Nueva IP : " + miEth.IPAddress.ToString());
        }
    }
}

Controlando un robot con WinRT, WinForms y Surface Pro

Tal y como os contábamos en noviembre, la BCNCONDEV fue un buen escenario para sacar ese tiempo extra que nos hace falta para juguetear con alguno de esos artilugios que nos chiflan.

Tuvimos la suerte de compartir cancha con Pablo, para darnos la suficiente cuerda y retarnos a mover el Magic Robot con los sensores de la Surface… para los incrédulos hemos recuperado este video como muestra de nuestra gesta!

Gracias Pablo! por tu aportación.

Enlaces relacionados:

http://msmvps.com/blogs/peplluis/archive/2013/11/20/pete-brown-s-gadgeteer-robot-from-a-windows-form.aspx

http://msmvps.com/blogs/peplluis/archive/2013/11/09/the-barcelona-developers-conference-is-back.aspx

http://msmvps.com/blogs/peplluis/archive/2013/11/12/barcelona-developers-con-retro-makers-y-robotics.aspx

Pete Brown’s Gadgeteer Robot from a Windows Form.. :-)

Talking about the Pete Brown’s Gadgeteer robot, several people ask me how to do a simple winform listener because they have the limit of express versions or simply don’t have developer licence to test app’s for the store.

Just in five minuts… everybody can jump driving a winform app and the Magic Robot using the Gadgeteer!

using System.Net;
using System.Net.Sockets;

namespace RobotServiceSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            StartListener();
 
            button1.MouseLeave += MouseLeave;
            button2.MouseLeave += MouseLeave;
            button3.MouseLeave += MouseLeave;
            button4.MouseLeave += MouseLeave;
            button5.MouseLeave += MouseLeave;

            button1.MouseEnter += Move_right;
            button2.MouseEnter += Move_left;
            button3.MouseEnter += Send_Stop;
            button4.MouseEnter += Move_backward;
            button5.MouseEnter += Move_forward;
        }

        private TcpListener _listener;
        private Thread _listenerThread;
        private void StartListener()
        {
            _listenerThread = new Thread(RunListener);
            _listenerThread.Start();
        } 

        TcpClient client;
        private void RunListener()
        {
            _listener = new TcpListener(new IPAddress(new byte[] {192,168,1,101}), 5150);
            _listener.Start();

            textBoxLog.Text += «listening at : « + _listener.LocalEndpoint.ToString()+«\n\r»;
            while (true)
            {
                client = _listener.AcceptTcpClient();
                this.Invoke(
                    new Action(
                        () =>
                        {
                            textBoxLog.Text = «»;
                            textBoxLog.Text += string.Format(«New robot from {0} \n\r», client.Client.RemoteEndPoint);
                        }
                    )); ;
                ThreadPool.QueueUserWorkItem(ProcessClient, client);
            }
        }

        private void ProcessClient(object state)
        {
            TcpClient client = state as TcpClient;
        }

        void MouseLeave(object sender, EventArgs e)
        {
            sendStream(Encoding.ASCII.GetBytes(«/panic»));
        }

        private void Move_right(object sender, EventArgs e)
        {
            sendStream(Encoding.ASCII.GetBytes(«/right»));
        } 

        private void Move_left(object sender, EventArgs e)
        {
            sendStream(Encoding.ASCII.GetBytes(«/left»));
        }

        private void Send_Stop(object sender, EventArgs e)
        {
            sendStream(Encoding.ASCII.GetBytes(«/stop»));
        }

        private void Move_backward(object sender, EventArgs e)
        {
            sendStream(Encoding.ASCII.GetBytes(«/backward»));
        }

        private void Move_forward(object sender, EventArgs e)
        {
            sendStream(Encoding.ASCII.GetBytes(«/forward»));
        }

         void sendStream(byte[] bytes)
        {
            NetworkStream stream = client.GetStream();
            stream.Write(bytes, 0, bytes.Length);
        }

    }
}

You can find the complete post in 10Rem at : http://10rem.net/blog/2012/09/10/controlling-a-netmf-gadgeteer-robot-from-a-windows-8-app

Enjoy!!
PepLluis,

PS: No doubt in ask if you need the same code for VB

Barcelona Developers Con : Retro, Makers y Robotics

Os dejo un pequeño testimonio de mi paso por el BcnDevCon13, donde muchísima gente se acercó amablemente al stand, para ver i trastear con el Gadgeteer… “esto empieza a ser un clásico” J También tuvimos ocasión de compartir un particular “Hackathon” con los chicos de Microsoft (en concreto Pablo) y nuestro MagicRobot dirigiéndolo desde el giroscopio de una Surface… espero que podamos colgar el video y como no un post en MSDN.

Crónica 🙂
El pasado domingo se cerró la tercera edición del BcnDevCon (Barcelona Developers Conference). El éxito de las últimas ediciones ha impulsado el evento incluyendo nuevas fórmulas para propiciar un espacio común uniendo diferentes comunidades entorno a un fin común. El “do it by your self” toma forma en un espacio donde los “retro” los “makers” y los “robotics” juegan en una misma cancha para compartir el ingenio que produce objetos increíbles y actividades repletas de imaginación.

Sin duda es un gran espacio a tener en cuenta en el futuro, pues sin duda es el caldo de cultivo para que muchos creativos puedan intercambiar inquietudes y socializar iniciativas que de otra forma caerían en baúl de sastre.

En esta ocasión, el evento ha ocupado tres días (Viernes, Sábado, Domingo) y ha cambiado de ubicación: El Design Hub es un excelente espacio en la plaza de las Glorias, las anteriores ediciones ocuparon «Les Drassanes”; a gustos… pero a mi que soy clásico estas últimas me parecían más “in”. :-))

En mi opinión las futuras ediciones deberían mejorar la organización y dinamización de conferencias y charlas dirigidas, pues creo que un tanto por ciento de temas deberían trabajarse desde la organización para de esa forma dirigir mínimamente la temática, que de otra forma aparece como muy dispersa para el público en general.

Bueno espero que el año que viene podamos reunirnos de nuevo durante unos días.

Gracias a la organización, sponsors y participantes!!
Happy Haking

The Barcelona Developers Conference is back!

Este fin de semana, se celebra la BcnConDev de este 2013, además de una excelente zona «retro» disponemos de una sensacional área para «Robotics» y markers.

Segunda convocatoria 🙂 Si aun no conoces la «GadgetoMania»… vente mañana a la Design Hub de la plaza de las glorias en Barcelona y trastea con un montón de gadgets que traeré conmigo para que podamos montarnos algún que  otro desafío, por supuesto con la ayuda de nuestro portátil y visual Studio.

Por de pronto… a primera hora de la mañana nos las compondremos para mover a nuestro «carricoche» particular con los sensores de una Surface o de un Wndows Phone… si te mola, te estaremos esperando!

 

Y para que no falte, un poco de código que resuelve la comunicación y asi puedas concentrarte en la parte de los sensores.

        private TcpListener _listener;
        private Thread _listenerThread;
        private void StartListener()
        {
            _listenerThread = new Thread(RunListener);
            _listenerThread.Start();
        } 

        TcpClient client;
        private void RunListener()
        {
            _listener = new TcpListener(new IPAddress(new byte[] {192,168,1,101}), 5150);
            _listener.Start(); 
            while (true)
            {
                client = _listener.AcceptTcpClient();
                this.Invoke(
                    new Action(
                        () =>
                        {
                            // string.Format(«Nueva Conexion desde {0} \n\r», client.Client.RemoteEndPoint);
                        }
                    )); ;
                ThreadPool.QueueUserWorkItem(ProcessClient, client);
            }
        } 

        private void ProcessClient(object state)
        {
            TcpClient client = state as TcpClient;
        } 

        void Panic(object sender, EventArgs e)
        {
            sendStream(Encoding.ASCII.GetBytes(«/panic»));
        } 

        private void Atras(object sender, EventArgs e)
        {
            sendStream(Encoding.ASCII.GetBytes(«/backward»));
        } 

        private void Adelante(object sender, EventArgs e)
        {
            sendStream(Encoding.ASCII.GetBytes(«/forward»));
        } 

        void sendStream(byte[] bytes)
        {
            NetworkStream stream = client.GetStream();
            stream.Write(bytes, 0, bytes.Length);
        }

Hasta Mañana!!
PepLluis,