I decided to keep it simple to start with, so rather than get the Panelolu2 working, which would require I2C and headaches with 3.3V and 5V logic, I started with the PanelOne, a very basic LCD, Encoder, SD card combination which we are using on our Kossel Mini Kits.
Using a 5V LCD with 3.3V Microprocessor
This was the first hurdle to overcome. The HD44780 standard that these character LCD displays work on states 2.7 to 5V should work fine for the logic signals, however the LCD screens incorporating these chips are a lot more restrictive: 4.8-5.2V for the logic signals. Given the conflicting information I decided to modify a PanelOne prototype board by hand and give it a go. The key is to keep the logic signals separate from the backlight voltages. The schematic is below:
The major change is the addition of the "VCC" power into pin 2 of the LCD from pin 8 of header P1. Previously this was a straight 5V, now this should be able to be either 5V or 3.3V depending on the logic of the Microprocessor we are interfacing with. I connected this up and edited the "Hello World" sketch within Arduino 1.5.7 (1.5.6 r2 works as well) to use the following pin definitions:
/*
Arduino pin number Duet Pin Name Expansion header pin
* LCD RS pin to digital pin D67 PB16 (32)
* LCD Enable pin to digital D23 PA14 (10)
* LCD D4 pin to digital pin D19 PA10 RXD0 (14)
* LCD D5 pin to digital pin D18 PA11 TXD0 (13)
* LCD D6 pin to digital pin D17 PA12 RXD1 (12)
* LCD D7 pin to digital pin D16 PA13 TXD1 (11)
*/
LiquidCrystal lcd(67, 23, 19, 18, 17, 16);
Happily this worked!
I tested this with two other LCDs (old generic ones off eBay) and it worked with them as well. However as it's outside the guidelines of the LCD manufacturer's datasheets there is no guarantee that all types of HD44780 character LCDS will work in the same way.
Reading an SD card over SPI
The Duet's build in SD card supports SD2.0 and uses a 4 bit HSMCI interface. However it is often convenient to use an SD card reader mounted next to the screen, so I want to support SD over SPI which is how older 3D printer electronics and hardware interface with SD cards. The Arduino environment has a simple SPI SD library that worked straight away. The only customisation required is to make sure SD.Begin() uses the correct CS pin:
SD.begin(77);
For this example I used the SPI0_NPCS0 pin which is arduino digital pin 77. I combined the listfiles example sketch with the LCD display to list the first 4 files on a SD card:
The code (an adaptation of the listfiles example sketch):
#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal.h>
File root;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(67, 23, 19, 18, 17, 16); //RS,E,D4,D5,D6,D7
void setup()
{
lcd.begin(20, 4);
lcd.print("Reading Files...");
delay(2000); //delay or else the message will not be displayed
if (!SD.begin(77)) {
lcd.clear();
lcd.print("initialization");
lcd.setCursor(0,1);
lcd.print("failed!");
return;
}
lcd.clear();
lcd.print("initialization done");
delay(2000); //delay or else the message will not be displayed
lcd.clear();
lcd.print("listing 4 files");
delay(2000); //delay or else the message will not be displayed
root = SD.open("/");
lcd.clear();
printDirectory(root, 0);
}
void printDirectory(File dir, int numTabs) {
int row=0;
while(true) {
if(row>3) return;
lcd.setCursor(0,row);
File entry = dir.openNextFile();
if (! entry) {// no more files
break;
}
for (uint8_t i=0; i<numTabs; i++) {
lcd.print(' ');
}
lcd.print(entry.name());
if (entry.isDirectory()) {
lcd.print("/");
printDirectory(entry, numTabs+1);
row++;
} else {
// files have sizes, directories do not
lcd.print(" ");
lcd.print(entry.size(), DEC);
row++;
}
entry.close();
}
}
This sketch, and the adapted Kicad schematic are all on the Think3dPrint3d github.
Next...
I will test more LCD screens and hopefully will be able to get the next batch of PanelOnes compatible with both 3.3V and 5V.
The big job will be to port and adapt the Marlin menu system to RepRap Firmware. If anyone wants to assist with this project then drop me a line and I may be able to help with some hardware (duet board + LCD screen).