mikroBUS meet NETMF

Is that the Mountaineer Prime firmware ?

I bet it is. :slight_smile:

Congratulations to the parents :clap:

Hereā€™s the first child of a (soon) growing family.

I was invited to the baptism and took some videos and pictures :

Wine was excellent, guests were very kind and they promised more to come :whistle:

4 Likes

Cool.

yes, yes it is isnā€™t it.

Is the Mountaineer Prime firmware open-source? If not, how did it get on this board?

@ Bec a Fuel - Great progress!

Does MicroE make that board ? Is that a beta ? I dont see listed on the site :slight_smile:

This one will be even more cool, I think.

Childbitrh is expected very soon :whistle:

1 Like

Hmmā€¦ :think:

Maybe a real working board would be better.

:whistle:

2 Likes

This is cool stuff, and I see that the Gadgeteer plug is there as well. I wonder how many hardware interface standards needs to be built before someone builds an audio module THAT WORKS?? :open_mouth:

@ Bec a Fuel - Nice!

OT:

@ njbuch - You can help me build the driver for the VS1063 chip. Audio quality is descent and the codec support is good on the chip. Plugins are also supported.

Moving to new threadā€¦

Thanks !

But Iā€™m not the only one involved in this project. I can tell Justin is in, as you may expect.
I donā€™t know yet if I can reveal the others :-[

Very soon you will be able to (easily) use the MikroElektronika Click boards with C#/NETMF, thanks to Oberon and MikroE, to name a few.
Here are the Click boards : Click Boards - MIKROE

Drivers templates, applications templates, opensource code, many IOs, integrated Flash ram, USB host, stackable Click boards are some of the great features of this MikroBus.Net board. :dance:

1 Like

Here are some news about this project, which is now very close to be released !

First, I will thank all of the people that have been and are still involved in it :

  • MikroElektronika
  • Cuno, from Oberon microsystems, Inc.
  • Niels (njbuch), for his diplomatic talents :wink:
  • and of course, last but not least, our Justin for his abilities in building boards

This project has started as a private project for astronomers but soon derivated to a more general board. I wanted to use Click boards because I (personnaly) think they are very good boards and suit my need better than Gadgeteer. Many here know that about me, btw.

So the challenge finally was : build a board that would easily accept MikroE Click boards and that can be programmed in C# using NETMF.

Itā€™s been a little time before the Rev-A prototype went out of the Justin Factory and everything after that went ā€œquicklyā€ : drivers coding, dev environment setup, ā€œbetterā€ board with 4 slots instead of 2, website designing, and so onā€¦

While we were at it, we didnā€™t forget Gadgeteer users : Justin has created a G-board that can accept a Gadgeteer module, as you can see in the latest video published.

Now, what will happen ? Very soon, the website will be public (time for last reviews and domain name attached to it) and you will be able to see the work done and also know how you can participate in this effort if you want to.

Iā€™m posting this here because the MBN boards will be able to drive Gadgeteer boards and some persons may be interested, this is not spam nor it is intented to criticize anything.

MikroElektronika has been very kind by providing some Click board so that we can propose drivers when we launch the project. And they even publish a nice article on us :

Again, thanks to everyone involved in this and thanks to everyone that may want to join !


Christophe

8 Likes

@ Bec a Fuel - Congratulations to you and everybody involved!

@ Architect : thank you very much ! This is really an exciting project.

One last demo, this time with the Quail mainboard (4 MikroBus sockets) and 5 Click boards on it :
Relay (basic I/O)
Led8x8 (SPI)
Pressure (IĀ²C)
BarGraph (SPI)
CapSense (IĀ²C)

Pressure is stacked on the Led8x8. This is possible because they donā€™t use the sames pins on the MikroBus slot.

What is not visible on the video is the Pressure Click board data (see attached screenshot).

Also, hereā€™s the source code for the demo running :

using System;
using System.Threading;
using Microsoft.SPOT;
using MikroBusNet;
using MikroBusNet.Exceptions;

namespace Examples
{
    public class Program
    {
        static Led8x8Click Leds;
        static BarGraphClick Bars;
        static CapSenseClick Cap;
        static PressureClick Pres;
        static RelayClick Relay;

        static Byte[][] Digits, InvertedDigits;
        static Boolean DeviceOK, RState;
        static Thread TCheck;
        static UInt16 NbBars;

        public static void Main()
        {
            Hardware.Led1.Write(true);
            InitDigits();

            try
            {
                DeviceOK = false;
                RState = false;
                while (!DeviceOK)
                {
                    try
                    {
                        Pres = new PressureClick(Hardware.SocketOne, 0xBA >> 1, 100);
                        DeviceOK = true;
                    }
                    catch (DeviceInitialisationException)
                    {
 #if DEBUG
                        Debug.Print("Init failed, retrying...");
 #endif
                    }
                }
                Leds = new Led8x8Click(Hardware.SocketOne);
                Bars = new BarGraphClick(Hardware.SocketTwo);
                Relay = new RelayClick(Hardware.SocketThree);
                Cap = new CapSenseClick(Hardware.SocketFour, 0x00, 100);
                
                TCheck = new Thread(_TCheck);
                TCheck.Start();

                Cap.SliderDataChanged += Cap_SliderDataChanged;
                Cap.ButtonPressed += Cap_ButtonPressed;

                Leds.Brightness = 1;
                Leds.Display(true);

                Leds.Clear();
                Thread.Sleep(1000);

                NbBars = 1;

                Hardware.Led1.Write(false);
                while (true)
                {
                    Bars.Bars(NbBars);
                    DemoDigits();
                    NbBars++;
                    if (NbBars > 10) { NbBars = 1; }
                    Hardware.Led2.Write(!Hardware.Led2.Read());
 #if DEBUG
                    Debug.Print("Temperature : " + Pres.Temperature.ToString("F2") + "Ā°, Pression = " + Pres.Pressure.ToString() + " mbar");
 #endif
                }
            }
            catch (Exception ex)
            {
                Debug.Print("Exception : " + ex.Message);
            }
            Thread.Sleep(Timeout.Infinite);
        }

        private static void _TCheck()
        {
            while (true)
            {
                Cap.CheckButtons();
                Cap.CheckSlider();
                Thread.Sleep(100);
            }
        }

        static void Cap_ButtonPressed(object sender, MikroBusNet.Events.ButtonPressedEventArgs e)
        {
            Cap.LedBottom = e.ButtonBottom;
            Cap.LedTop = e.ButtonTop;
            Relay.Relay1 = e.ButtonTop;
            if (e.ButtonBottom)
            {
                RState = !RState;
                Relay.SetRelay(0,RState);
                Bars.Brightness = RState ? 1.0 : (Double)0.01;
            }
            
        }

        static void Cap_SliderDataChanged(object sender, MikroBusNet.Events.SliderEventArgs e)
        {
            if (e.FingerPresent) { Leds.Brightness = (Byte)(e.SliderValue / 5); }
        }

        private static void DemoDigits()
        {
            for (Byte i = 0; i < 10; i++)
            {
                Leds.SendArray(Digits[i], true);
                Thread.Sleep(100);
            }
            for (Byte i = 10; i > 0; i--)
            {
                Leds.SendArray(InvertedDigits[i - 1], true);
                Thread.Sleep(100);
            }
        }

        private static void InitDigits()
        {
            Digits = new Byte[10][];
            Digits[0] = new Byte[8] { 0x00, 0x3E, 0x7F, 0x49, 0x45, 0x7F, 0x3E, 0x00 };
            Digits[1] = new Byte[8] { 0x00, 0x40, 0x44, 0x7F, 0x7F, 0x40, 0x40, 0x00 };
            Digits[2] = new Byte[8] { 0x00, 0x62, 0x73, 0x51, 0x49, 0x4F, 0x46, 0x00 };
            Digits[3] = new Byte[8] { 0x00, 0x22, 0x63, 0x49, 0x49, 0x7F, 0x36, 0x00 };
            Digits[4] = new Byte[8] { 0x00, 0x18, 0x18, 0x14, 0x16, 0x7F, 0x7F, 0x10 };
            Digits[5] = new Byte[8] { 0x00, 0x27, 0x67, 0x45, 0x45, 0x7D, 0x39, 0x00 };
            Digits[6] = new Byte[8] { 0x00, 0x3E, 0x7F, 0x49, 0x49, 0x7B, 0x32, 0x00 };
            Digits[7] = new Byte[8] { 0x00, 0x03, 0x03, 0x79, 0x7D, 0x07, 0x03, 0x00 };
            Digits[8] = new Byte[8] { 0x00, 0x36, 0x7F, 0x49, 0x49, 0x7F, 0x36, 0x00 };
            Digits[9] = new Byte[8] { 0x00, 0x26, 0x6F, 0x49, 0x49, 0x7F, 0x3E, 0x00 };

            InvertedDigits = new Byte[10][];
            InvertedDigits[0] = new Byte[8] { 0xFF, 0xC1, 0x80, 0xB6, 0xBA, 0x80, 0xC1, 0xFF };
            InvertedDigits[1] = new Byte[8] { 0xFF, 0xBF, 0xBB, 0x80, 0x80, 0xBF, 0xBF, 0xFF };
            InvertedDigits[2] = new Byte[8] { 0xFF, 0x9D, 0x8C, 0xAE, 0xB6, 0xB0, 0xB9, 0xFF };
            InvertedDigits[3] = new Byte[8] { 0xFF, 0xDD, 0x9C, 0xB6, 0xB6, 0x80, 0xC9, 0xFF };
            InvertedDigits[4] = new Byte[8] { 0xFF, 0xE7, 0xE7, 0xEB, 0xE9, 0x80, 0x80, 0xEF };
            InvertedDigits[5] = new Byte[8] { 0xFF, 0xD8, 0x98, 0xBA, 0xBA, 0x82, 0xC6, 0xFF };
            InvertedDigits[6] = new Byte[8] { 0xFF, 0xC1, 0x80, 0xB6, 0xB6, 0x84, 0xCD, 0xFF };
            InvertedDigits[7] = new Byte[8] { 0xFF, 0xFC, 0xFC, 0x86, 0x82, 0xF8, 0xFC, 0xFF };
            InvertedDigits[8] = new Byte[8] { 0xFF, 0xC9, 0x80, 0xB6, 0xB6, 0x80, 0xC9, 0xFF };
            InvertedDigits[9] = new Byte[8] { 0xFF, 0xD9, 0x90, 0x86, 0x86, 0x80, 0xC1, 0xFF };
        }
    }
}

1 Like

@ Bec a Fuel - Have you tried Etherrnet click board?
I think you can use without any problem (with eth firmware). Iā€™m successfully using it on a Mikromedia + for STM32f4.

@ dobova : I donā€™t have this Click board, so no, I didnā€™t try.

Iā€™ve used the Wifi+, though, which I find very good. Existing driver (for MBN board) only lacks Ad-Hoc mode and TCP server features. I personnaly didnā€™t need those features, hence their absence :-[
But this board was ā€œeasyā€ to use, thanks to the integrated TCP/IP stack :wink: The ETH Click code sample, on the other hand, seems to rely on an Ethernet lib, which source code is not public (I didnā€™t find it, that is). So it would require extra work for us, I think.

@ Bec a Fuel - I understand your point.
I see that you are working on 4.3 netmf which really Iā€™ve not yet touched, so I donā€™t know if lwip can be integrated as it is in 4.2, but I think that can be done. Note that Enthernet click board is an ENC28 board so I donā€™t see a big issue. Using STM32F4 internal Eth is a different stuff, but I think the guys at Mountaneer have just done firmware for that.