416012
The BOB makes a pretty good Arduino shield for an LCD Control Panel with switches, and ribbon cable connections to stepper motor drivers, space for a relay driver, etc.. Video of the build:
For the LCD panel, Install
For the switches, Install
For Motor Drivers (optional hack for attaching PMinMO compatible stepper or other drivers)
BOBLCDPanel.ino
#include <LiquidCrystal.h>
// See this page for the BOB Control Panel build
// http://www.massmind.org/techref/arduino-bob-panel.htm
#define LCD_COLS 16
#define LCD_ROWS 2
//#define MOTORS
#define S1_PIN 10
#define S2_PIN 11
#define S3_PIN 12
#define S4_PIN 13
#define X_DIR 6
#define X_STEP 2
#define Y_DIR 7
#define Y_STEP 3 // Shared with LCD RS
#define Z_DIR 8
#define Z_STEP 4
#define A_DIR 9
#define A_STEP 5 // Shared with LCD /E
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(3, 5, 6, 7, 8, 9);
//use this line instead if you patched C4 to JP4 (Z-STEP) instead.
//LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
int switch_state() {
int i=0;
if (0==digitalRead(S1_PIN)) i+=1;
if (0==digitalRead(S2_PIN)) i+=2;
if (0==digitalRead(S3_PIN)) i+=4;
if (0==digitalRead(S4_PIN)) i+=8;
return i;
}
void setup() {
// setup the switch pins, with pullups
pinMode(S1_PIN, INPUT_PULLUP);
pinMode(S2_PIN, INPUT_PULLUP);
pinMode(S3_PIN, INPUT_PULLUP);
pinMode(S4_PIN, INPUT_PULLUP);
#ifdef MOTORS
// setup the PWM or Step outputs
pinMode(X_STEP, OUTPUT);
pinMode(Y_STEP, OUTPUT);
pinMode(Z_STEP, OUTPUT);
pinMode(A_STEP, OUTPUT);
// setup the Direction outputs
pinMode(X_DIR, OUTPUT);
pinMode(Y_DIR, OUTPUT);
pinMode(Z_DIR, OUTPUT);
pinMode(A_DIR, OUTPUT);
// setup the A2 analog pin as an enable output.
pinMode(A2, OUTPUT);
#endif
// setup the LCD's number of columns and rows:
lcd.begin(LCD_COLS, LCD_ROWS);
}
void loop() {
// Print a message to the LCD.
lcd.setCursor(0, 0);
lcd.print("Hello World! ");
lcd.setCursor(0, 1);
lcd.print("version 1.00 ");
int s = switch_state();
if (0 != s) { // switch was pushed
lcd.setCursor(13, 1);
lcd.print(s);
#ifdef MOTORS
lcd.setCursor(0, 0);
lcd.print("Motor running");
lcd.print(s*(255/15));
digitalWrite(A2,HIGH); //enable the motors.
while (0 != s) {
s = switch_state();
analogWrite(X_DIR, s*(255/15)); //run the motor on X 0 to 255
}
digitalWrite(A2,LOW); //disable the motors.
#endif
}
delay(1000);
lcd.setCursor(0, 0);
lcd.print(" ");
for(int i=0; i<LCD_COLS; i++) {
lcd.setCursor(i, 0); //char i of line 0
if ( i>10 ) lcd.print(i / 10); //divide by 10 gives upper digit,
//no decimal because int
lcd.setCursor(i, 1); //char i of line 1
lcd.print(i % 10); //modulo 10 gives lower digit
delay(10);
}
delay(500);
}