mbrossett's Content - Netduino Forums
   
Netduino home hardware projects downloads community

Jump to content


The Netduino forums have been replaced by new forums at community.wildernesslabs.co. This site has been preserved for archival purposes only and the ability to make new accounts or posts has been turned off.

mbrossett's Content

There have been 46 items by mbrossett (Search limited from 25-April 23)


By content type

See this member's


Sort by                Order  

#57038 Device driver implementation for PCA9539 I/O Expander...

Posted by mbrossett on 23 March 2014 - 10:16 PM in General Discussion

My goal was to create an easy to use device driver for the PCA9539 16-bit GPIO expander IC. However, I also wanted to make it generic so that could be used with other future gpio expander driver implementations.

 

I created a simple interface that each device driver class (i.e. PCA9539) shall implement. I also created a generic Gpio class used to interface with the device driver(s).

 

I chose to do it this way to to make it easy to use in the main routine. I am not a software engineer by trade, so any advice would be much appreciated. Any thoughts, comments, ideas to improve?

 

Attached Files




#57066 Help on I2C

Posted by mbrossett on 25 March 2014 - 01:45 AM in Netduino 2 (and Netduino 1)

What is the part number of the LCD you are using. This may help us help you. If it is a Newhaven Display serial LCD then you need to install an on-board jumper to configure it in I2C mode. Your fix probably isn't that easy but just thought I'd throw that out there. Also, if you give me the part number I could write you a simple piece of test code.



#57097 Help on I2C

Posted by mbrossett on 25 March 2014 - 01:51 PM in Netduino 2 (and Netduino 1)

I cannot find that display. Can you send me a link to the website you bought it from?




#57099 LM75 (I2C temperature sensor)

Posted by mbrossett on 25 March 2014 - 02:09 PM in General Discussion

Can you describe what is happening? ...are you seeing "LM75 is not responding..." printed out, or are you getting an exception thrown, or is the temperature reading not right? As gismo said verify pull-up resistors and also check the address of the device (is A0 pulled HIGH, and A1, A2 pulled LOW?).




#57101 Help on I2C

Posted by mbrossett on 25 March 2014 - 02:52 PM in Netduino 2 (and Netduino 1)

Ok, I looked at that display for a bit and it uses a parallel type display with a I2C gpio expander. Also, it is a 5V display so you would need to ensure that you are powering it from 5V and that the I2C pull-ups are to 5V. If you are new to METMF and Netduino I would suggest going with a true I2C serial display such as one of these...

 

http://www.newhavend...lays-c-253.html

 

Although the Arduino library can be ported to NETMF, you will be better off going with one of the displays I have pointed you to. With NETMF not being a real-time environment you might run into issues with the timing on this display anyway, especially in a multi-threaded application, but I'm not for sure. Another option is to use an Arduino instead of a Netduino. Sorry I couldn't be more helpful, maybe someone with a little more free time and ambition will come by and port it over for you.




#57115 LM75 (I2C temperature sensor)

Posted by mbrossett on 25 March 2014 - 08:23 PM in General Discussion

I have used all address combination

A0, A1 and A2 are not soldered, so i think the address if 49, but i have tried last address 4F, because i wasnt sure..so it must be the last or first address.

 

Ah, I believe that is your problem. See page 4 of the datasheet...

 

http://datasheets.ma.../en/ds/LM75.pdf

 

It states that the address pins A0, A1, and A2 should "not be left unconnected". Tie them all to ground and set the address of the device to be 0x48. Hopefully that will work for you.

 

As far as the pull-ups go, you are probably fine if the pull-up resistors exist somewhere on the bus...i.e. on the LCD module. Especially since the I2C bus is working for the LCD.

 

Keep us posted.




#57116 Help on I2C

Posted by mbrossett on 25 March 2014 - 08:29 PM in Netduino 2 (and Netduino 1)

These are 5V displays, too. Therefore, you will need 5V pull-ups on the I2C lines. When you get the display you will need to solder a 0 Ohm resistor or something (piece of wire or bridge it with solder like I do) across R1, see page 4 of the datasheet...

 

http://www.newhavend...Z-FL-GBW-V3.pdf

 

And yes I will post some code tonight for this display. I have a driver for it on my PC at home. Will post it tonight.




#57117 Help on I2C

Posted by mbrossett on 25 March 2014 - 08:32 PM in Netduino 2 (and Netduino 1)

Btw, there are pull-up resistors (10k) installed on the LCD so you shouldn't need them, but you may want to put a little stronger pull-ups on the bus (4.7k, 3.3k, or 2.2k) just in case.




#57124 Help on I2C

Posted by mbrossett on 25 March 2014 - 11:56 PM in Netduino 2 (and Netduino 1)

As promised here is your driver and test code for the Newhaven Display I2C serial displays. Enjoy and keep us posted on the progress.

using System;
using System.Text;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;

namespace NewhavenDisplay
{
    // For use with newhaven I2C displays
    // I2C protocol:
    // To enter the I2C mode, place a jumper on R1.  
    // SDA and SDK have pull?up resistors (10K Ohm) on R7 and R8.
    // The default I2C address is 80 (50 hex).  The I2C address can be changed to any 8?bit value by command function, with
    // the exception that the LSB (least significant bit) must always be ‘0’.  Once the I2C address has been changed, it will be
    // saved in the system memory, and it will revert back to the default address if either RS232 or SPI protocol is selected.
    // The I2C interface is capable of receiving data at up to 100KHz?clock rate.
    // See http://www.newhavendisplay.com/specs/NHD-0216K3Z-FL-GBW.pdf

    public class SerialLCD
    {
        private static I2CDevice.Configuration _config = new I2CDevice.Configuration(0x50 >> 1, 100); 

        public SerialLCD()
        {
        }

        public void Write(I2CDevice device, string sText)
        {
            device.Config = _config;
            var xActions = new I2CDevice.I2CTransaction[1];
            byte[] buf = Encoding.UTF8.GetBytes(sText);                 // Convert the string to array
            xActions[0] = I2CDevice.CreateWriteTransaction(buf);
            device.Execute(xActions, 1000);
        }

        public void DisplayOn(I2CDevice device)
        {
            device.Config = _config;
            var xActions = new I2CDevice.I2CTransaction[1];
            xActions[0] = I2CDevice.CreateWriteTransaction(new byte[] { 0xFE, 0x41 });
            device.Execute(xActions, 1000);
        }

        public void DisplayOff(I2CDevice device)
        {
            device.Config = _config;
            var xActions = new I2CDevice.I2CTransaction[1];
            xActions[0] = I2CDevice.CreateWriteTransaction(new byte[] { 0xFE, 0x42 });
            device.Execute(xActions, 1000);
        }

        public void SetCursor(I2CDevice device, byte Position)
        {   // 0x00 = line 1 column 1
            // 0x40 = line 2 column 1
            device.Config = _config;
            var xActions = new I2CDevice.I2CTransaction[1];
            xActions[0] = I2CDevice.CreateWriteTransaction(new byte[] { 0xFE, 0x45, Position });
            device.Execute(xActions, 1000);
        }

        public void Clear(I2CDevice device)
        {
            device.Config = _config;
            var xActions = new I2CDevice.I2CTransaction[1];
            xActions[0] = I2CDevice.CreateWriteTransaction(new byte[] { 0xFE, 0x51 });
            device.Execute(xActions, 1000);
        }

        public void SetContrast(I2CDevice device, byte ContrastLevel)
        {   // Value between 0 and 50, default is 40
            device.Config = _config;
            var xActions = new I2CDevice.I2CTransaction[1];
            xActions[0] = I2CDevice.CreateWriteTransaction(new byte[] { 0xFE, 0x52, ContrastLevel });
            device.Execute(xActions, 1000);
        }

        public void SetBrightness(I2CDevice device, byte BrightnessLevel)
        {   // Value between 1 to 8 
            device.Config = _config;
            var xActions = new I2CDevice.I2CTransaction[1];
            xActions[0] = I2CDevice.CreateWriteTransaction(new byte[] { 0xFE, 0x53, BrightnessLevel });
            device.Execute(xActions, 1000);
        }

        public void Firmware(I2CDevice device)
        {
            device.Config = _config;
            var xActions = new I2CDevice.I2CTransaction[1];
            xActions[0] = I2CDevice.CreateWriteTransaction(new byte[] { 0xFE, 0x70 });
            device.Execute(xActions, 1000);
        }

    }
}
using System;
using System.Threading;

using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;

using NewhavenDisplay;

namespace Serial_Display_Test
{
    public class Program
    {
        public static void Main()
        {
            // Create an I2C device with no device configuration
            I2CDevice i2cDevice = new I2CDevice(null);

            SerialLCD display = new SerialLCD();

            display.DisplayOn(i2cDevice);

            // Write to display
            display.Clear(i2cDevice);
            display.SetCursor(i2cDevice, 0x00);
            display.Write(i2cDevice, "Hello");

            // Wait indefinitely
            Thread.Sleep(Timeout.Infinite);
        }
    }
}



#57125 Problem: Analog Temperature Sensor KY-013

Posted by mbrossett on 26 March 2014 - 12:03 AM in General Discussion

See this post. It seems you are correct and the pins are labelled wrong...

 

http://forum.arduino...c,209133.0.html




#57127 Analog Output

Posted by mbrossett on 26 March 2014 - 01:38 AM in Netduino Plus 2 (and Netduino Plus 1)

You could also interface with and SPI or I2C DAC device like this one (MCP4821)...

http://ww1.microchip...eDoc/22244B.pdf

Or better yet (if you are looking for cheap and easy)...

http://www.adafruit....CFSISMwodvSgAZQ



#57128 Analog Output

Posted by mbrossett on 26 March 2014 - 01:42 AM in Netduino Plus 2 (and Netduino Plus 1)

Btw, the MCP48xx family have internal voltage references and the MCP4725 references it's supply voltage. Each has its advantages and disadvantages just depends on what you need the DAC for.



#57153 LM75 (I2C temperature sensor)

Posted by mbrossett on 26 March 2014 - 09:20 PM in General Discussion

Awesome, glad I could help! Also, please mark this topic as "answered" if you can.




#57273 Help on I2C

Posted by mbrossett on 01 April 2014 - 05:34 PM in Netduino 2 (and Netduino 1)

Yes, pin 1 of each connector is marked with a square solder pad, as opposed to the round pad.




#57332 Netduino 2 / 2 Plus bootloader pins

Posted by mbrossett on 03 April 2014 - 07:58 PM in Netduino 2 (and Netduino 1)

Does anyone know the significance of having BOOT0, PB11, and PC14 tied together? I understand why BOOT0 is pulled low and has a switch, but why PB11 and PC14? Do they just need to be pulled low when unused?




#57333 Netduino 2 Firmware v4.2.2 (update 2)

Posted by mbrossett on 03 April 2014 - 09:33 PM in Netduino 2 (and Netduino 1)

Can you provide all the files needed to load a custom board with Netduino firmware / bootloader. When I load this DFU in the STM32F405 and reset the board, I cannot access the device through MFDeploy. Is there another file I need to load?...tinybooter, tinyclr, or something?




#57373 Netduino 2 Firmware v4.2.2 (update 2)

Posted by mbrossett on 06 April 2014 - 01:16 PM in Netduino 2 (and Netduino 1)

Thanks Chris. So if I use the same crystal frequency on the Netduino board I shouldn't need to recompile anything, right? I was able to successfully use the STDFU to program my hardware. And when it powers up I know it is doing something as the LED will turn off after a few seconds. However, windows will not recognize the MCU when I plug it in unless it is in the bootloader. Can you provide the Tinybooter and Tinyclr files for the Netduino? Thanks again for your help!




#57375 Netduino 2 Firmware v4.2.2 (update 2)

Posted by mbrossett on 06 April 2014 - 03:47 PM in Netduino 2 (and Netduino 1)

I found all three of the files (tinybooter, flash, and config) in the NetduinoUpdater zip folder.




#57379 Adding to Cpu.Pin enumeration

Posted by mbrossett on 06 April 2014 - 09:22 PM in Netduino 2 (and Netduino 1)

Can someone tell me how to add STM32F4 pins (i.e. PA4, PA5, PC8, PC9, ...) to the Cpu.Pin enumeration and use these I/O? Obviously it would require physical access to these pins, for example a custom Netduino board.

 

I am guessing it would require a modification to the Netduino firmware and a rebuild. Has anyone done this?




#57380 Adding to Cpu.Pin enumeration

Posted by mbrossett on 06 April 2014 - 09:26 PM in Netduino 2 (and Netduino 1)

Rather, I would like to add to the Netduino.Pins enumeration.




#57383 Adding to Cpu.Pin enumeration

Posted by mbrossett on 06 April 2014 - 09:53 PM in Netduino 2 (and Netduino 1)

Let me try to clear up any confusion...

 

There are pins on the STM32F405RG that are unused in the Netduino design (i.e. PA4, PA5, PC8, PC9,...). I wish to wire up to these pins, however, they are not defined in the Netduino.Pins enumeration and therefore I have no way to control those pins. Does anyone know how I can modify the software/firmware to get access to those STM32F4 pins?




#57398 Adding to Cpu.Pin enumeration

Posted by mbrossett on 07 April 2014 - 01:25 PM in Netduino 2 (and Netduino 1)

Thank you very much CW2! Also, I have attached a simple class that defines the STM32F405RG pins.

using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;

namespace STM32F4
{
    public static class Pin
    {
        public static Cpu.Pin PA0 { get { return (Cpu.Pin)(0); } }
        public static Cpu.Pin PA1 { get { return (Cpu.Pin)(1); } }
        public static Cpu.Pin PA2 { get { return (Cpu.Pin)(2); } }
        public static Cpu.Pin PA3 { get { return (Cpu.Pin)(3); } }
        public static Cpu.Pin PA4 { get { return (Cpu.Pin)(4); } }
        public static Cpu.Pin PA5 { get { return (Cpu.Pin)(5); } }
        public static Cpu.Pin PA6 { get { return (Cpu.Pin)(6); } }
        public static Cpu.Pin PA7 { get { return (Cpu.Pin)(7); } }
        public static Cpu.Pin PA8 { get { return (Cpu.Pin)(8); } }
        public static Cpu.Pin PA9 { get { return (Cpu.Pin)(9); } }
        public static Cpu.Pin PA10 { get { return (Cpu.Pin)(10); } }
        public static Cpu.Pin PA11 { get { return (Cpu.Pin)(11); } }
        public static Cpu.Pin PA12 { get { return (Cpu.Pin)(12); } }
        public static Cpu.Pin PA13 { get { return (Cpu.Pin)(13); } }
        public static Cpu.Pin PA14 { get { return (Cpu.Pin)(14); } }
        public static Cpu.Pin PA15 { get { return (Cpu.Pin)(15); } }
        public static Cpu.Pin PB0 { get { return (Cpu.Pin)(16 + 0); } }
        public static Cpu.Pin PB1 { get { return (Cpu.Pin)(16 + 1); } }
        public static Cpu.Pin PB2 { get { return (Cpu.Pin)(16 + 2); } }
        public static Cpu.Pin PB3 { get { return (Cpu.Pin)(16 + 3); } }
        public static Cpu.Pin PB4 { get { return (Cpu.Pin)(16 + 4); } }
        public static Cpu.Pin PB5 { get { return (Cpu.Pin)(16 + 5); } }
        public static Cpu.Pin PB6 { get { return (Cpu.Pin)(16 + 6); } }
        public static Cpu.Pin PB7 { get { return (Cpu.Pin)(16 + 7); } }
        public static Cpu.Pin PB8 { get { return (Cpu.Pin)(16 + 8); } }
        public static Cpu.Pin PB9 { get { return (Cpu.Pin)(16 + 9); } }
        public static Cpu.Pin PB10 { get { return (Cpu.Pin)(16 + 10); } }
        public static Cpu.Pin PB11 { get { return (Cpu.Pin)(16 + 11); } }
        public static Cpu.Pin PB12 { get { return (Cpu.Pin)(16 + 12); } }
        public static Cpu.Pin PB13 { get { return (Cpu.Pin)(16 + 13); } }
        public static Cpu.Pin PB14 { get { return (Cpu.Pin)(16 + 14); } }
        public static Cpu.Pin PB15 { get { return (Cpu.Pin)(16 + 15); } }
        public static Cpu.Pin PC0 { get { return (Cpu.Pin)(32 + 0); } }
        public static Cpu.Pin PC1 { get { return (Cpu.Pin)(32 + 1); } }
        public static Cpu.Pin PC2 { get { return (Cpu.Pin)(32 + 2); } }
        public static Cpu.Pin PC3 { get { return (Cpu.Pin)(32 + 3); } }
        public static Cpu.Pin PC4 { get { return (Cpu.Pin)(32 + 4); } }
        public static Cpu.Pin PC5 { get { return (Cpu.Pin)(32 + 5); } }
        public static Cpu.Pin PC6 { get { return (Cpu.Pin)(32 + 6); } }
        public static Cpu.Pin PC7 { get { return (Cpu.Pin)(32 + 7); } }
        public static Cpu.Pin PC8 { get { return (Cpu.Pin)(32 + 8); } }
        public static Cpu.Pin PC9 { get { return (Cpu.Pin)(32 + 9); } }
        public static Cpu.Pin PC10 { get { return (Cpu.Pin)(32 + 10); } }
        public static Cpu.Pin PC11 { get { return (Cpu.Pin)(32 + 11); } }
        public static Cpu.Pin PC12 { get { return (Cpu.Pin)(32 + 12); } }
        public static Cpu.Pin PC13 { get { return (Cpu.Pin)(32 + 13); } }
        public static Cpu.Pin PC14 { get { return (Cpu.Pin)(32 + 14); } }
        public static Cpu.Pin PC15 { get { return (Cpu.Pin)(32 + 15); } }
        public static Cpu.Pin PD2 { get { return (Cpu.Pin)(48 + 2); } }
    }
}



#57408 Help on I2C

Posted by mbrossett on 07 April 2014 - 08:48 PM in Netduino 2 (and Netduino 1)

Here's a few things to check...

 

1) Is there a jumper / short across R1? (R2 should be left open)

2) Measure the voltages of SDA and SCL while the bus is idle...are they pulled up to 5V?

3) Try adding a delay at the beginning of your code to ensure LCD is up and configure ("Thread.Sleep(1000);")

4) Step through the code using the debugger and ensure the "device.Execute(...);" functions are returning a non-zero value. You will need to change the code slightly... "int ret = device.Execute(...);"

5) Try setting the brightness and contrast..."display.SetBrightness(0x07);" ... "display.SetContrast(0x30);"

 

The Netduino should be capable of providing the 250mA to the display, but you can verify this by measuring the voltage at the display when it is plugged in. If the voltage is above 4.7V it is fine.




#57410 Help on I2C

Posted by mbrossett on 07 April 2014 - 09:15 PM in Netduino 2 (and Netduino 1)

Since the "device.Execute(...)" is returning zero, that tells you the LCD is not acknowledging the I2C commands. Double check that the SCL and SDA lines aren't crossed. Also verify that the power to the LCD from the Netduino is greater than 4.7V. If it is not you will need to power the LCD from its own supply/regulator.




#57413 Help on I2C

Posted by mbrossett on 07 April 2014 - 09:24 PM in Netduino 2 (and Netduino 1)

For the [latest versions of] Netduino 2 and 2 Plus you should connect the I2C lines to "SC" and "SD" as you are doing. What is the voltage to the LCD?





home    hardware    projects    downloads    community    where to buy    contact Copyright © 2016 Wilderness Labs Inc.  |  Legal   |   CC BY-SA
This webpage is licensed under a Creative Commons Attribution-ShareAlike License.