Mini VFD

From Nottinghack Wiki
Revision as of 18:21, 21 April 2019 by Jon (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
Mini VFD
[[|border|frameless|220px|center]]
Primary Contact Michael
Created 26/04/2012
Completed 10/12/2014
Dormant
Version
Members
Manufacturer {{{manufacturer}}}
Model {{{model}}}
Location [[{{{location}}}]]
GitHub / Repo {{{repo}}}
Status complete
Type Members Project
Live Status
QR code

A small Vacuum Flourescent Display I recovered from the skip at work.

It is housed in a project box with a mains transformer - it use to have a mystery 9-pin serial port input but it wouldn't work until we worked out that it was expecting a 5V TTL serial signal.

The Futaba Corp M202SD08G module is a 20 character x 2 line, 5x8 dot matrix display. It has a European font with characters in the range from 0x20 (space) through the ASCII range and up to 0xFF with a bunch of Greek and Cyrillic characters.

I've put a Xino into the box and I'm working on something amusing for it to do in the hackspace.

The module has a single 20 pin connector (2x10 0.1" pins) of which we only need connection for +5V, GND, serial data in and a busy line out. The module asserts the busy line when it is working but it is enough to just make short delays in your code!

I have a simple Arduino sketch that just shows each character. It uses NewSoftSerial on pins 2 and 3 as well as regular serial on pins 0 and 1 (on old Arduino0022) just for testing to see if NewSoftSerial is any good.

#include <NewSoftSerial.h>
#include <icrmacros.h>

NewSoftSerial mySerial(2, 3);
void setup() 
{ 
  Serial.begin(9600);
  mySerial.begin(9600);
} 

int b = 0x20; 

void loop() 
{ 
  Serial.print(b, BYTE);
  mySerial.print(b, BYTE);
  delay(100);
  b++;
  if(b == 0xff){
    b = 0x20; // the first char in the VFD table
    delay(1000);
  }
 
}

The mains transformer in the box is this LASCAR PSU 201 Fixed Voltage Single Rail Power Supply...

Although the unit is useful as a plain serial-driven ASCII display there are some interesting capabilities alluded to in the various datasheets. The VFD character table includes some programmable characters. I'd like to have a go at this! There are control sequences to shift the screen and create a scrolling effect.

/**
 *   Futaba VFD box Software serial
 *
 */
#include <SoftwareSerial.h>
#include <math.h>
// supports 3 major temperature scales
enum {
  T_KELVIN=0,
  T_CELSIUS,
  T_FAHRENHEIT
};

// manufacturer data for episco k164 10k thermistor
// simply delete this if you don't need it
// or use this idea to define your own thermistors
#define EPISCO_K164_10k 4300.0f,298.15f,10000.0f  // B,T0,R0
#define NOTTINGHACK_47K 4090.0f,298.15f,47000.0f  // B,T0,R0

SoftwareSerial mySerial(2, 3); // RX, TX

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.println("FutabaBox1 v1.0");
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
  while(Serial.available()){
    mySerial.write(Serial.read());
  }
  updateTemp();
  delay(1000);
}

void updateTemp(void)
{
  mySerial.print("Temperature: ");
  delay(10);
  mySerial.println(Temperature(1,T_CELSIUS,NOTTINGHACK_47K,10000.0f));
  delay(10);
}

// Temperature function outputs float , the actual
// temperature
// Temperature function inputs
// 1.AnalogInputNumber - analog input to read from
// 2.OuputUnit - output in celsius, kelvin or fahrenheit
// 3.Thermistor B parameter - found in datasheet
// 4.Manufacturer T0 parameter - found in datasheet (kelvin)
// 5. Manufacturer R0 parameter - found in datasheet (ohms)
// 6. Your balance resistor resistance in ohms  

float Temperature(int AnalogInputNumber,int OutputUnit,float B,float T0,float R0,float R_Balance)
{
  float R,T;

  R=1024.0f * R_Balance / float( analogRead(AnalogInputNumber) ) - R_Balance;
  T=1.0f/(1.0f/T0+(1.0f/B)*log(R/R0));

  switch(OutputUnit) {
    case T_CELSIUS :
      T-=273.15f;
    break;
    case T_FAHRENHEIT :
      T=9.0f*(T-273.15f)/5.0f+32.0f;
    break;
    default:
    break;
  };

  return T;
}