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.

Coding Smackdown

Member Since 25 Aug 2010
Offline Last Active Jun 07 2013 03:36 AM
-----

Topics I've Started

Adafruit 20x2 Character VFD (Vacuum Fluorescent Display) - SPI interface - 20T202DA2JA

19 September 2012 - 12:44 AM

I picked up an Adafruit 20x2 Character VFD (Vacuum Fluorescent Display) - SPI interface - 20T202DA2JA

http://www.adafruit.com/products/347

I was hoping to use it an one of my controller projects. I based my driver off of the MicroLiquidCrystal Shifter74Hc595LcdTransferProvider and the LCD class. I made changes based on the datasheets, but I'm having to send data and commands twice in order to get the controller to recognize what I'm sending.

I'm thinking maybe my SPI configuration is setup incorrectly, but I haven't been able to find too much about how to configure the SPI port.

I've included the code below, in case anyone can figure it out.

Thanks!

using System;
using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;

//
// SPI Vacum Flouresent Display Driver
// Based on the SPI_VFD Arduino Library
// Created by AdaFruit
//
namespace CodingSmackdown.Drivers
{
// When the display powers up, it is configured as follows:
//
// 1. Display clear
// 2. Function set:
// N = 1; 2-line display
// BR1=BR0=0; (100% brightness)
// 3. Display on/off control:
// D = 0; Display off
// C = 0; Cursor off
// B = 0; Blinking off
// 4. Entry mode set:
// I/D = 1; Increment by 1
// S = 0; No shift
//
// Note, however, that resetting the Arduino doesn't reset the LCD, so we
// can't assume that its in that state when a sketch starts (and the
// SPI_VFD constructor is called).
public class SPI_VFDisplay : IDisposable
{
// commands
private const byte VFD_CLEARDISPLAY = 0x01;
private const byte VFD_RETURNHOME = 0x00;
private const byte VFD_ENTRYMODESET = 0x04;
private const byte VFD_DISPLAYCONTROL = 0x08;
private const byte VFD_CURSORSHIFT = 0x10;
private const byte VFD_FUNCTIONSET = 0x30;
private const byte VFD_SETCGRAMADDR = 0x40;
private const byte VFD_SETDDRAMADDR = 0x80;

// flags for display entry mode
private const byte VFD_ENTRYRIGHT = 0x00;
private const byte VFD_ENTRYLEFT = 0x02;
private const byte VFD_ENTRYSHIFTINCREMENT = 0x01;
private const byte VFD_ENTRYSHIFTDECREMENT = 0x00;

// flags for display on/off control
private const byte VFD_DISPLAYON = 0x04;
private const byte VFD_DISPLAYOFF = 0x00;
private const byte VFD_CURSORON = 0x02;
private const byte VFD_CURSOROFF = 0x00;
private const byte VFD_BLINKON = 0x01;
private const byte VFD_BLINKOFF = 0x00;

// flags for display/cursor shift
private const byte VFD_DISPLAYMOVE = 0x08;
private const byte VFD_CURSORMOVE = 0x00;
private const byte VFD_MOVERIGHT = 0x04;
private const byte VFD_MOVELEFT = 0x00;

// flags for function set
private const byte VFD_2LINE = 0x08;
private const byte VFD_1LINE = 0x00;

private const byte VFD_SPICOMMAND = 0xF8;
private const byte VFD_SPIDATA = 0xFA;

private byte _linemode;
private byte _brightness;
private byte _displaycontrol;
private byte _shiftmode;
private byte _incrementmode;
private byte _displaymode;
private byte _cursormode;
private byte _blinkmode;

private byte _initialized;

private byte _numlines;
private byte _currline;

private readonly SPI _spi;
private readonly OutputPort _latchPort;
readonly byte[] _writeBuf = new byte[1];

public enum Brightness
{
VFD_BRIGHTNESS25 = 0x03,
VFD_BRIGHTNESS50 = 0x02,
VFD_BRIGHTNESS75 = 0x01,
VFD_BRIGHTNESS100 = 0x00
}

public SPI_VFDisplay(SPI.SPI_module spiBus, Cpu.Pin latchPin, Brightness brightness)
{
var spiConfig = new SPI.Configuration(
Cpu.Pin.GPIO_NONE, //latchPin,
false, // active state
0, // setup time
0, // hold time
false, // clock idle state
true, // clock edge
1000, // clock rate
spiBus);

_spi = new SPI(spiConfig);

_latchPort = new OutputPort(latchPin, true);

//default to 2x20 display (SAMSUNG 20T202DA2JA)
begin(20, 2, brightness);
}

public void begin(byte columns, byte lines, Brightness brightness)
{
// set number of lines
if (lines > 1)
_linemode = VFD_2LINE;
else
_linemode = VFD_1LINE;
// save off for address translation
_numlines = lines;

// turn the display on with no cursor or blinking default
_displaycontrol = VFD_DISPLAYON;
_cursormode = VFD_CURSORON;
_blinkmode = VFD_BLINKOFF;
_shiftmode = VFD_ENTRYLEFT;
_incrementmode = VFD_ENTRYSHIFTDECREMENT;
// init the display
display();

//catch bad values
if (brightness > Brightness.VFD_BRIGHTNESS25)
_brightness = (byte)Brightness.VFD_BRIGHTNESS100;
else
_brightness = (byte)brightness;
// set the brightness and push the linecount with VFD_SETFUNCTION
setBrightness(brightness);

// set cursor shift for romance lnaguages
leftToRight();

// clear the display
clear();
// set starting address to column 0, row 0
home();
}

public void setBrightness(Brightness brightness)
{
// set the brightness (only if a valid value is passed
if (brightness <= Brightness.VFD_BRIGHTNESS25)
{
_brightness = (byte)brightness;

command((byte)(VFD_FUNCTIONSET | _brightness | _linemode));
}
}

public byte getBrightness()
{
// get the brightness
return (byte)(_brightness);
}

public void clear()
{
command(VFD_CLEARDISPLAY); // clear display, set cursor position to zero
}

public void home()
{
command(VFD_SETDDRAMADDR | 0x00); // set cursor position to zero
}

public void setCursor(byte col, byte row)
{
int[] row_offsets = { 0x00, 0x40, 0x14, 0x54 };

if (row > _numlines)
{
row = (byte)(_numlines - 1); // we count rows starting w/0
}
// we only have 20 columns even though there are 40 cols addressable
if (col > 20)
{
col = 20;
}

int address = col + row_offsets[row];

command((byte)(VFD_SETDDRAMADDR | address));
}

// Turn the display on/off (quickly)
public void noDisplay()
{
_displaycontrol = VFD_DISPLAYOFF;
command((byte)(VFD_DISPLAYCONTROL | _displaycontrol | _cursormode | _blinkmode));
}

public void display()
{
_displaycontrol = VFD_DISPLAYON;
command((byte)(VFD_DISPLAYCONTROL | _displaycontrol | _cursormode | _blinkmode));
}

// Turns the underline cursor on/off
public void noCursor()
{
_cursormode = VFD_CURSOROFF;
command((byte)(VFD_DISPLAYCONTROL | _displaycontrol | _cursormode | _blinkmode));
}

public void cursor()
{
_cursormode = VFD_CURSORON;
command((byte)(VFD_DISPLAYCONTROL | _displaycontrol | _cursormode | _blinkmode));
}

// Turn on and off the blinking cursor
public void noBlink()
{
_blinkmode = VFD_BLINKOFF;
command((byte)(VFD_DISPLAYCONTROL | _displaycontrol | _cursormode | _blinkmode));
}

public void blink()
{
_blinkmode = VFD_BLINKON;
command((byte)(VFD_DISPLAYCONTROL | _displaycontrol | _cursormode | _blinkmode));
}

// These commands scroll the display without changing the RAM
public void scrollDisplayLeft()
{
command((byte)(VFD_CURSORSHIFT | VFD_DISPLAYMOVE | VFD_MOVELEFT));
}

public void scrollDisplayRight()
{
command((byte)(VFD_CURSORSHIFT | VFD_DISPLAYMOVE | VFD_MOVERIGHT));
}

// This is for text that flows Left to Right
public void leftToRight()
{
_shiftmode = VFD_ENTRYLEFT;
command((byte)(VFD_ENTRYMODESET | _shiftmode | _incrementmode));
}

// This is for text that flows Right to Left
public void rightToLeft()
{
_shiftmode = VFD_ENTRYRIGHT;
command((byte)(VFD_ENTRYMODESET | _shiftmode | _incrementmode));
}

// This will 'right justify' text from the cursor
public void autoscroll()
{
_incrementmode = VFD_ENTRYSHIFTINCREMENT;
command((byte)(VFD_ENTRYMODESET | _shiftmode | _incrementmode));
}

// This will 'left justify' text from the cursor
public void noAutoscroll()
{
_incrementmode = VFD_ENTRYSHIFTDECREMENT;
command((byte)(VFD_ENTRYMODESET | _shiftmode | _incrementmode));
}

// Allows us to fill the first 8 CGRAM locations
// with custom characters
public void createChar(byte location, byte[] charmap)
{
location &= 0x7; // we only have 8 locations 0-7
command((byte)(VFD_SETCGRAMADDR | (location << 3)));
for (int i = 0; i < 8; i++)
{
write(charmap[i]);
}
}

// spool string data to the display
public void print(string data)
{
byte[] output = System.Text.Encoding.UTF8.GetBytes(data);
for (int i = 0; i < output.Length; i++)
{
write(output[i]);
}
}

/*********** mid level commands, for sending data/cmds, init */

private void command(byte value)
{
_latchPort.Write(false);

_writeBuf[0] = VFD_SPICOMMAND;
_spi.Write(_writeBuf);
_writeBuf[0] = value;
_spi.Write(_writeBuf);

_latchPort.Write(true);

Thread.Sleep(1);

_latchPort.Write(false);

_writeBuf[0] = VFD_SPICOMMAND;
_spi.Write(_writeBuf);
_writeBuf[0] = value;
_spi.Write(_writeBuf);

_latchPort.Write(true);

Thread.Sleep(1);
}

private void write(byte value)
{
_latchPort.Write(false);

_writeBuf[0] = VFD_SPIDATA;
_spi.Write(_writeBuf);
_writeBuf[0] = value;
_spi.Write(_writeBuf);

_latchPort.Write(true);

Thread.Sleep(1);

_latchPort.Write(false);

_writeBuf[0] = VFD_SPIDATA;
_spi.Write(_writeBuf);
_writeBuf[0] = value;
_spi.Write(_writeBuf);

_latchPort.Write(true);

Thread.Sleep(1);
}

public void Dispose()
{
_spi.Dispose();
_latchPort.Dispose();
}
}
}

Need Help with LCD Display Board

22 June 2012 - 06:07 PM

I recently have been putting together a replacement controller for an Electric Turkey Fryer. I had everything working just perfectly with all of the circuits on a breadboard and had even brewed 5 batch of beer with the entire setup. I had created two circuit boards to put in an enclosure with the Netduino, one was a shield that held all of the power conversion, relay driver and button connections, the other was a daughter board that attaches to a 16 x 2 LCD Display using the same circuit in Simon's post over at http://geekswithblog...id_crystal.aspx I sent the board out to BatchPCB.com to be made and finally got them back. I spent a couple days assembling the boards and when I went to test everything my LCD Display is not working. At first I thought maybe my connector from the shield to the daughter board was messed up, but I checked it and I have connectivity to everything as expected along with +5V and Ground. What I am not seeing is +5V at the LCD Display, I'm only seeing +1.8V. At first I thought there was a short some place, but I cannot find anything wrong. I went back to re-wiring the daughter board on the breadboard and now I'm getting the same results coming off the shield. It looks as if the signals to drive the 595 chip are not coming across. The connector I'm using is about 6 inches in length, which was about the same length as the jumpers I used when originally wired up the circuit. What I'm seeing now is a bunch of garbage on the display and a lot of strange flashing and the back light going on and off as the Netduino sends data to the display. I've attached pictures of the schematics and pc boards for you to take a look at in hopes someone can spot my issue. The boards are double sided with the red traces on the top and the blue traces on the bottom. Hopefully someone can point me in the right direction. Thanks

Brewing Beer with a Netduino Plus

05 June 2012 - 05:13 AM

I've been working on a new brewing project and have gotten far enough along to start showing it off to folks. I've been working on modifying an Electric Turkey Fryer that I can use to brew small batch of beer for competitions and such. I based the temperature control off of my previous DIY Brewery Temperature Monitor project and enhanced it to allow the user to enter in a temperature that the Netduino will work to maintain during the mashing process. I've also added buttons to control the system for those times when I don't have a network handy along with a LCD Display to show the current status of the system. I'm still waiting for the circuit boards to come back from BatchPCB.com so I can assemble the system in a nice control panel. You can read about it over at my DIY Brewery Blog at http://diybrewery.com

PWM Ports and Relay Switching Question

29 May 2012 - 02:45 PM

I'm in the process of building a brewing controller that will be used to control an existing heating element used on an electric turkey fryer. My goal has been to mod the existing unit without replacing much of the existing parts. As the system is now, the heating element is turned on and off by a 12VDC relay. I've got this working quite well by using a normal IO pin and turning it on and off. What I would like to do is as the temperature of the beer gets close to my goal temperature use one of the PWM ports to change the duty cycle from 100% to 50% on down to 0% as I get closer and closer. This way I'm hoping to reduce the amount of temperature drift in the overall system. When I started playing with the PWM port and varying the duty cycle I noticed that the voltage readings were strange, at 50% Duty cycle I was only seeing 1.6 volts instead of 3.3 volts. Maybe this is because I am using a multi-meter instead of looking at it with an actual scope. Does anyone know what I should be seeing? Also, is varying PWM duty cycles with a relay a really good idea? I've read where it's not an issue with solid state relays but I'm uncertain about normal relays. Thanks

Professional's Guide To .NET Micro Framework Application Development Book

29 May 2012 - 04:36 AM

I didn't see anyone else post about this, so I thought I would give everybody a heads up. A new book was released about the .Net Micro Framework called, Professional's Guide To .NET Micro Framework Application Development. I picked up a copy on Amazon on the Kindle for a decent price. It does include examples for the Netduino as well as other .NET Micro Framework devices. I wouldn't call it a beginner's guide, but its not that advanced either. It is based on a training program provided by Annabooks, they provide quite a few example programs to explain each section. So far, what I've read is pretty good for an intermediate guide. Here are the book details from the Annabooks web site: Professional's Guide to .NET Micro Framework Application Development By John R. Malin and Sean D. Liming The Microsoft .NET Micro Framework brings Microsoft’s embedded expertise to resource-constrained devices, allowing device makers to bring products to market faster and at lower cost. TCP/IP and Web Services for devices functionality makes the .NET Micro Framework a compelling platform for a new generation of smart, connected, service-oriented devices. Its compact footprint (as little as 64 kilobytes) and support for 32-bit embedded processors without an MMU help keep per-device costs low, and a managed driver model makes it easier to develop device drivers. .NET Micro Framework applications are written in C# using either Visual Studio 2010 or Visual® C# Express 2010 Edition. Professional’s Guide to .NET Micro Framework Application Development provides the most advanced treatment of the .NET Micro Framework SDK available. Over 40 hands-on exercises guide the developer through the tools and APIs available in the .NET Micro Framework SDK. Nineteen chapters cover the basic operation, hardware I/O support, basic networking, graphical interfaces, storage, and the final sample projects to tie the different features together. Example Visual Studio® projects are available for the most popular .NET MF platforms on the market. Table of Contents SECTION 1 – INTRODUCTION AND C# BASICS 1 WELCOME 2 DEVELOPMENT SYSTEM SETUP AND TARGET HARDWARE CHOICES 3 .NET MICRO FRAMEWORK OVERVIEW SECTION 2 – .NET MICRO FRAMEWORK SDK AND THE PROCESS LOOP 4 THE .NET MICRO FRAMEWORK SDK AND THE FIRST .NET MICRO FRAMEWORK APPLICATION 5 INNER PROCESS MECHANICS SECTION 3 – HARDWARE I/O 6 GENERAL PURPOSE INPUT/OUTPUT PINS 7 SERIAL PORTS 8 SERIAL PERIPHERAL INTERFACE (SPI) 9 PULSE WIDTH MODULATION (PWM) 10 ANALOG-TO-DIGITAL CONVERTER (ADC) 11 ETHERNET SECTION 4 – GRAPHIC USER INTERFACE 12 BITMAP CLASS 13 WINDOWS PRESENTATION FOUNDATION CLASS 14 TOUCHSCREEN AND INK SECTION 5 – STORAGE 15 FLASH STORAGE 16 EXTENDED WEAK REFERENCES SECTION 6 – PROJECTS 17 MIGRATE APPLICATIONS TO A NEW PLATFORM 18 ROBOT PROJECT: TRAXSTER II 19 ROBOT PROJECT 2: STINGER Hope everyone finds this useful.

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.