20.07.2012

Płytka do .NET Micro Framework

Trenowanie na sucho nie sprawia jednak takiej frajdy jak uruchomienie programu w rzeczywistym systemie. Postanowiłem się rozejrzeć za czymś co pozwoli mi w prosty sposób testować programy na prawdziwym procesorze. 

Od razu odrzuciłem możliwość zmontowania samemu płytki, lutowania elementów itp. Wydaje mi się, że trzeba mieć trochę doświadczenia w konstrukcji układów mikroprocesorowych, aby samemu (nawet wg. schematów i plików z gotowymi PCB) wykonać taką płytkę. Lutowanie procesora w obudowie LQFP100 też na razie jest poza moim zasięgiem manualnym. Jedynym wyjściem pozostaje zakup gotowej płytki.

Gotowe płytki do NETMF posiada wiele firm w swojej ofercie. Po rozpoznaniu dostępności (zakup w Polsce), ceny (rozbudowane i drogie płytki ewaluacyjne odrzuciłem), popularności (przykłady i wsparcie na internecie) i możliwości (dużo portów, pamięci, jakieś gotowe diody czy przyciski) na polu boju zostały następujące pozycje:
Po głębszym rozpoznaniu tematu okazało się, że najlepsze według mnie pozycje to FEZ Cerberus i Netduino Go. Obydwie płytki działają na tym samym procesorze STM32F4. Na obu płytkach dla użytkownika dostępne jest około 300K FLASH na program (całość 1MB), około 100KB RAMu, dostępne interfejsy: USB, SPI, I2C, UART (port szeregowy), CAN, wejścia/wyjścia analogowe, PWM, OneWire itp. Możliwe jest również podłączenie modułów z interfejsem sieciowym. Zastanowiło mnie to, że obydwie płytki zbudowane są na procesorze STM32F4 (chyba nie bez powodu). Wówczas przypomniałem sobie, że gdzieś czytałem o STM32F4Discovery.

STM32F4Discovery to płytka testowa produkowana przez producenta procesorów STM32F4 - STMMicroelectronics. Na niej znajduje się dokładnie taki sam procesor jak na wyżej wspomnianych FEZ Cerberus i Netduino Go (ma tylko inny oscylator kwarcowy). Na płytce są już zamontowane (do wykorzystania): 4 diody led, jeden przycisk, czujnik położenia, mikrofon i przetwornik dźwięku. Do tego wszystkie porty wyprowadzone są na goldpiny i łatwo można się pod nie podłączać. Jeszcze mało? Cena to około 90 zł z przesyłką w Polsce, no i przede wszystkim na stronie netmf4stm32.codeplex.com specjalnie przygotowana wersja NETMF dla tej płytki! Myślę, że ta płytka będzie najbardziej sensowna, a jak coś nie wyjdzie to niewiele pieniędzy się zmarnuje. Jedyny mankament jaki widzę to brak gotowego portu ethernet, ale wszystko po kolei. Na to jeszcze przyjdzie czas...

Dodane po zakupie: do podłączenia płytki potrzebne są 2 kabelki USB. Jeden 'type A to mini-B' (u mnie spasował kabelek od aparatu cyfrowego) i drugi 'type A to micro-B' (ten musiałem dokupić). Bez tego ani rusz. Wtyki mini-B i micro-B lądują w gniazdach na płytce, a wtyki A (te tradycyjne USB) w komputerze.

30.06.2012

Pierwszy program NETMF

Aby rozpocząć programować w NETMF nie trzeba kupować od razu żadnej elektroniki, procesorów itp. Nie trzeba również umieć lutować (na razie). Po prostu ze strony NETMF ściągamy aktualny SDK, instalujemy i możemy napisać pierwszy program!. Na przykład coś takiego:

using System;
using System.IO.Ports;
using System.Text;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;

namespace MFConsoleApplication1
{
    public class Program
    {
        private const int Delay = 500;

        public static void Main()
        {
            Debug.Print("start");

            var led1 = new OutputPort((Cpu.Pin)3, false);

            using (var serial = new SerialPort("COM1"))
            {
                Debug.Print("open serial port");
                serial.Open();
                WriteHello(serial);
            
                while (true)
                {
                    ChangePort(led1, serial);
                }
            }
        }

        private static void WriteHello(SerialPort serial)
        {
            var sb = new StringBuilder("Hello ");
            sb.Append(SystemInfo.OEMString);
            sb.Append(" Version: ");
            sb.Append(SystemInfo.Version);
            sb.Append(" Model: ");
            sb.Append(SystemInfo.SystemID.Model);

            if (SystemInfo.IsEmulator)
                sb.Append(" running on emulator");

            sb.AppendLine(String.Empty);

            string msg = sb.ToString();
            Debug.Print(msg);

            byte[] msgBuff = Convert(msg);
            serial.Write(msgBuff, 0, msg.Length);
        }

        private static void ChangePort(OutputPort port, SerialPort serial)
        {
            bool nextState = !port.Read();
            port.Write(nextState);

            var sb = new StringBuilder("Port ");
            sb.Append(port.Id);
            sb.AppendLine(nextState ? " on" : " off");

            string msg = sb.ToString();
            Debug.Print(msg);

            byte[] msgBuff = Convert(msg);
            serial.Write(msgBuff, 0, msgBuff.Length);

            Thread.Sleep(Delay);
        }

        private static byte[] Convert(string message)
        {
            byte[] result = Encoding.UTF8.GetBytes(message);
            return result;
        }
    }
}

Program najpierw przedstawia się na porcie COM, a następnie w nieskończoność mruga (powiedzmy diodą) na porcie 3 procesora jednocześnie wysyłając informację na port szeregowy:

Hello Microsoft Copyright (C) Microsoft Corporation. All rig Version: 4.2.0.0 Model: 2 running on emulator

Port 3 on

Port 3 off

27.06.2012

Początki w .NET Micro Framework

Zapomniałem zupełnie, że kiedyś założyłem bloga. Teraz jest okazja żeby go użyć, bo potrzebuję miejsca do opisywania moich doświadczeń z mikro-kontrolerami i programowaniem w NETMF. A i może się komuś jeszcze przyda.

Kiedyś natrafiłem na jakąś stronę o .NET Micro Framework i jakież było moje zdziwienie, że nic o tym wcześniej nie słyszałem. Używam Visual Studio na co dzień i używam C#, ale programowanie mikro-kontrolerów to coś zupełnie nowego i niesamowitego. Jeśli mogę używać Visual Studio i Resharpera (Reflector na pewno też się przyda) do edycji i uruchamiania oprogramowania, które działa na jakiś płytkach elektronicznych to ja chcę to robić (czytaj: spróbować się pobawić)! A do tego pisać w C#, a nie w C/C++ czy asemblerze (przypomniały mi się czasy 8051). Oczywiście zdaję sobie sprawę z tego, że program będzie mniej wydajny niż napisany w C/C++, no ale coś za coś. Poza tym nie będą to jakieś systemy przemysłowe działające w czasie rzeczywistym. Do mrugania diodami lub do zrobienia sterownika grupy czytników RFID (tak mi teraz przyszło do głowy) chyba w zupełności wystarczy.

NETMF działa jednak tylko na mikro-kontrolerach (a może procesorach) ARM (ARM7, ARM Cortex M3, ARM Cortex M4, ARM9). Czyli o programowaniu w NETMF na mikro-kontrolery AVR (popularne AtmegiXXX) możemy zapomnieć. Ceny tych procesorów też są nie małe: około 60, 70zł za sztukę (np. za STM32F4), co w porównaniu do 5, 10 zł za AVRa jest sumą ogromną. Niemniej wydaje mi się że gra jest warta świeczki (dla lamera takiego jak ja). Również nie wszystkie ARM będą działały z NETMF. Muszą mieć odpowiednią pojemność pamięci RAM i Flash. Poniżej lista procesorów na których NETMF na pewno będzie działał (może będzie uzupełniana):

20.10.2011

Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas posuere pretium risus ut dictum. Maecenas congue, eros eget laoreet vulputate, sem nibh vulputate tellus, vitae pretium nisl diam et nulla. Nulla condimentum pretium augue vitae fringilla. Donec auctor ultrices imperdiet. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut id nisl turpis, sed congue metus. Nam pharetra leo at nisl pretium luctus. Aliquam commodo sapien augue, sed tempor sem. Nullam quis augue lacinia mauris volutpat imperdiet. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam non lorem nisl, id lacinia nunc. Aliquam ut condimentum lorem. Proin vitae risus id erat volutpat dignissim.

Etiam at nunc nibh, ut malesuada metus. Integer sed neque neque, nec tincidunt leo. Ut tellus lorem, porta et vehicula eget, volutpat at nisl. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque tortor ante, lacinia eget sodales et, tincidunt ac eros. Praesent sit amet dignissim arcu. Fusce eleifend volutpat quam et tempus. Duis fringilla massa sed odio semper ac venenatis lectus eleifend. Quisque vitae nibh arcu.

Test kolorowania
<?php>
//test
</?>

using System;

namespace SecondMVC.Models
{
    public class Card
    {
        public Card(string sid)
        {
            Sid = sid;
            CreatedDate = DateTime.Now;
        }

        public string Sid { get; set; }
        public DateTime CreatedDate { get; set; }
    }
}