Mini VFD

From Nottinghack Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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.

 1 #include <NewSoftSerial.h>
 2 #include <icrmacros.h>
 3 
 4 NewSoftSerial mySerial(2, 3);
 5 void setup() 
 6 { 
 7   Serial.begin(9600);
 8   mySerial.begin(9600);
 9 } 
10 
11 int b = 0x20; 
12 
13 void loop() 
14 { 
15   Serial.print(b, BYTE);
16   mySerial.print(b, BYTE);
17   delay(100);
18   b++;
19   if(b == 0xff){
20     b = 0x20; // the first char in the VFD table
21     delay(1000);
22   }
23  
24 }

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.

 1 /**
 2  *   Futaba VFD box Software serial
 3  *
 4  */
 5 #include <SoftwareSerial.h>
 6 #include <math.h>
 7 // supports 3 major temperature scales
 8 enum {
 9   T_KELVIN=0,
10   T_CELSIUS,
11   T_FAHRENHEIT
12 };
13 
14 // manufacturer data for episco k164 10k thermistor
15 // simply delete this if you don't need it
16 // or use this idea to define your own thermistors
17 #define EPISCO_K164_10k 4300.0f,298.15f,10000.0f  // B,T0,R0
18 #define NOTTINGHACK_47K 4090.0f,298.15f,47000.0f  // B,T0,R0
19 
20 SoftwareSerial mySerial(2, 3); // RX, TX
21 
22 void setup()
23 {
24   // Open serial communications and wait for port to open:
25   Serial.begin(9600);
26   while (!Serial) {
27     ; // wait for serial port to connect. Needed for Leonardo only
28   }
29   Serial.println("FutabaBox1 v1.0");
30   // set the data rate for the SoftwareSerial port
31   mySerial.begin(9600);
32   mySerial.println("Hello, world?");
33 }
34 
35 void loop() // run over and over
36 {
37   while(Serial.available()){
38     mySerial.write(Serial.read());
39   }
40   updateTemp();
41   delay(1000);
42 }
43 
44 void updateTemp(void)
45 {
46   mySerial.print("Temperature: ");
47   delay(10);
48   mySerial.println(Temperature(1,T_CELSIUS,NOTTINGHACK_47K,10000.0f));
49   delay(10);
50 }
51 
52 // Temperature function outputs float , the actual
53 // temperature
54 // Temperature function inputs
55 // 1.AnalogInputNumber - analog input to read from
56 // 2.OuputUnit - output in celsius, kelvin or fahrenheit
57 // 3.Thermistor B parameter - found in datasheet
58 // 4.Manufacturer T0 parameter - found in datasheet (kelvin)
59 // 5. Manufacturer R0 parameter - found in datasheet (ohms)
60 // 6. Your balance resistor resistance in ohms  
61 
62 float Temperature(int AnalogInputNumber,int OutputUnit,float B,float T0,float R0,float R_Balance)
63 {
64   float R,T;
65 
66   R=1024.0f * R_Balance / float( analogRead(AnalogInputNumber) ) - R_Balance;
67   T=1.0f/(1.0f/T0+(1.0f/B)*log(R/R0));
68 
69   switch(OutputUnit) {
70     case T_CELSIUS :
71       T-=273.15f;
72     break;
73     case T_FAHRENHEIT :
74       T=9.0f*(T-273.15f)/5.0f+32.0f;
75     break;
76     default:
77     break;
78   };
79 
80   return T;
81 }