LCD 2004 3D Ramps
LCD 2004 3D Ramps
cho máy CNC, in 3D được thiết kế để sử dụng với Board Ramps có chức năng làm
bảng hiển thị và điều khiển cho máy in 3D.
Mạch có tích hợp khe cắm thẻ nhớ SD, cần điều khiển rotary encoder với nút
bấm, cho phép cân chỉnh từ việc di chuyển các trục và nạp G-code trực tiếp
từ khe cắm thẻ nhớ.
Sử dụng thẻ nhớ để lưu và nạp code khi vận hành giúp máy in hoạt động độc
lập; không phụ thuộc vào máy tính qua cổng USB.
Sử dụng màn hình LCD 2004 để hiển thị và điều khiển các chức năng của máy in
bằng nút điều khiển ngay trên máy giúp việc kiểm tra, bảo dưỡng máy thuận
tiện, nhanh nhóng, chuyên nghiệp.
Bộ hiển thị LCD/ SD card sử dụng với các máy in 3D; Với board Mạch điều
khiển máy in 3D RAMPS 1.4 hoặc các phiên bản của board MKS based.
Mạch được thiết kế để cắm vào RAMPS hoặc các loại Ultimaker breakboard
shield để điều khiển máy in 3D một cách trực tiếp.
Thông số kỹ thuật:
Sử dụng với mạch RAMPS 1.4
Độ phân giải màn hình: 20x4 (2004) 4 dòng x 20 ký tự
Điều khiển bằng biến trở encoder có nút nhấn
Hỗ trợ in 3D, đọc gcode từ thẻ nhớ
Thẻ nhớ tương thích: SD Memory Card
Có còi bíp
Nút Stop hỗ trợ ngừng khẩn cấp
Code Test:
#include < SPI . h >
#include < SD . h >
//#define DEBUG //turns on serial debugging
//Standard RRD smart controller LCD pins when on a RAMPS 1.4
//lcd pins
#define LCD_PINS_RS 16 //[RAMPS14-SMART-ADAPTER]
#define LCD_PINS_ENABLE 17 //[RAMPS14-SMART-ADAPTER]
#define LCD_PINS_D4 23 //[RAMPS14-SMART-ADAPTER]
#define LCD_PINS_D5 25 //[RAMPS14-SMART-ADAPTER]
#define LCD_PINS_D6 27 //[RAMPS14-SMART-ADAPTER]
#define LCD_PINS_D7 29 //[RAMPS14-SMART-ADAPTER]
//encoder pins
#define BTN_EN1 31
#define BTN_EN2 33
#define BTN_ENC 35
//SDCARD Pins
#define CS 16
#define MOSI 17
#define SCK 23
#define SD_DETECT_PIN 49
#define SDSS 53
#define BEEPER_PIN 37
#define KILL_PIN 41
#define screenX 20
#define screenY 4
#include < LiquidCrystal . h >
LiquidCrystal lcd ( LCD_PINS_RS , LCD_PINS_ENABLE , LCD_PINS_D4 , LCD_PINS_D5 , LCD_PINS_D6 , LCD_PINS_D7 ) ; //RS,Enable,D4,D5,D6,D7
int encoderPos = 8 ; //Current encoder position, mid way on scale
int encoderPosLast = 8 ; //Last encoder position, midway on scale
int encoder0PinALast ; //Used to decode rotory encoder, last value
int encoder0PinNow ; //Used to decode rotory encoder, current value
Sd2Card card ;
SdVolume volume ;
int sdcardinit ;
int sdcardtype ;
int sdvolumeinit ;
int sdvolumefattype ;
unsigned long sdvolumebpc ;
unsigned long sdvolumecc ;
char tmp_string [ 16 ] ;
//Customer characters for corner of logo
byte customChar0 [ ] = {
B00000 , B00000 , B00000 , B00111 , B00100 , B00100 , B00100 , B00100
} ;
byte customChar1 [ ] = {
B00000 , B00000 , B00000 , B11100 , B00100 , B00100 , B00100 , B00100
} ;
byte customChar2 [ ] = {
B00100 , B00100 , B00100 , B00111 , B00000 , B00000 , B00000 , B00000
} ;
byte customChar3 [ ] = {
B00100 , B00100 , B00100 , B11100 , B00000 , B00000 , B00000 , B00000
} ;
static void logo_lines ( ) {
lcd . setCursor ( 0 , 0 ) ; lcd . print ( '\x00' ) ; lcd . print ( "------------------" ) ; lcd . write ( '\x01' ) ;
lcd . setCursor ( 0 , 1 ) ; lcd . print ( "| RRD LCD Tester |" ) ;
lcd . setCursor ( 0 , 2 ) ; lcd . write ( '\x02' ) ; lcd . print ( "------------------" ) ; lcd . write ( '\x03' ) ;
}
static void status_line ( char * text ) {
lcd . setCursor ( 0 , 3 ) ; lcd . print ( " " ) ; //clear the status line
lcd . setCursor ( 0 , 3 ) ; lcd . print ( text ) ;
}
static void encoder_status_line ( int value ) {
//Serial.println(value);
lcd . setCursor ( 0 , 3 ) ; lcd . print ( "Enc: " ) ;
lcd . setCursor ( 4 , 3 ) ;
for ( int x = 0 ; x < value ; x ++ ) lcd . print ( "*" ) ;
}
static void sdcardinfo ( ) {
lcd . clear ( ) ;
lcd . setCursor ( 0 , 0 ) ; lcd . print ( "Initializing SD card" ) ;
if ( sdcardinit ) {
lcd . setCursor ( 0 , 1 ) ; lcd . print ( "Card type:" ) ;
switch ( sdcardtype ) {
case SD_CARD_TYPE_SD1 :
lcd . setCursor ( 11 , 1 ) ; lcd . print ( "SD1" ) ;
break ;
case SD_CARD_TYPE_SD2 :
lcd . setCursor ( 11 , 1 ) ; lcd . print ( "SD2" ) ;
break ;
case SD_CARD_TYPE_SDHC :
lcd . setCursor ( 11 , 1 ) ; lcd . print ( "SDHC" ) ;
break ;
default :
lcd . setCursor ( 11 , 1 ) ; lcd . print ( "Unknown" ) ;
}
if ( ! sdvolumeinit ) {
lcd . setCursor ( 0 , 2 ) ; lcd . print ( "No FAT16/FAT32" ) ;
} else {
// print the type and size of the first FAT-type volume
lcd . setCursor ( 0 , 2 ) ; lcd . print ( "Volume type: FAT" ) ;
itoa ( sdvolumefattype , tmp_string , 10 ) ;
lcd . print ( tmp_string ) ;
uint32_t volumesize ;
volumesize = sdvolumebpc ; // clusters are collections of blocks
volumesize *= sdvolumecc ; // we'll have a lot of clusters
volumesize /= 2 ; // SD card blocks are always 512 bytes (2 blocks are 1KB)
volumesize /= 1024 ;
lcd . setCursor ( 0 , 3 ) ; lcd . print ( "Volume size(Mb):" ) ;
itoa ( volumesize , tmp_string , 10 ) ;
lcd . print ( tmp_string ) ;
}
} else {
lcd . setCursor ( 0 , 1 ) ; lcd . print ( "FAILED" ) ;
}
}
void setup ( ) {
#ifdef DEBUG
Serial . begin ( 9600 ) ;
Serial . println ( "Start:" ) ;
#endif
lcd . begin ( screenX , screenX ) ;
// Print a message to the LCD.
lcd . createChar ( 0 , customChar0 ) ;
lcd . createChar ( 1 , customChar1 ) ;
lcd . createChar ( 2 , customChar2 ) ;
lcd . createChar ( 3 , customChar3 ) ;
pinMode ( SD_DETECT_PIN , INPUT ) ; // Set SD_DETECT_PIN as an unput
digitalWrite ( SD_DETECT_PIN , HIGH ) ; // turn on pullup resistors
pinMode ( KILL_PIN , INPUT ) ; // Set KILL_PIN as an unput
digitalWrite ( KILL_PIN , HIGH ) ; // turn on pullup resistors
pinMode ( BTN_EN1 , INPUT ) ; // Set BTN_EN1 as an unput, half of the encoder
digitalWrite ( BTN_EN1 , HIGH ) ; // turn on pullup resistors
pinMode ( BTN_EN2 , INPUT ) ; // Set BTN_EN2 as an unput, second half of the encoder
digitalWrite ( BTN_EN2 , HIGH ) ; // turn on pullup resistors
pinMode ( BTN_ENC , INPUT ) ; // Set BTN_ENC as an unput, encoder button
digitalWrite ( BTN_ENC , HIGH ) ; // turn on pullup resistors
pinMode ( BEEPER_PIN , OUTPUT ) ; // Set BTN_ENC as an unput, encoder button
#ifdef DEBUG
Serial . print ( "BTN_EN1:" ) ; Serial . println ( digitalRead ( BTN_EN1 ) ) ;
Serial . print ( "BTN_EN2:" ) ; Serial . println ( digitalRead ( BTN_EN2 ) ) ;
#endif
//dependion on power on position of encoder adjust encoderPosLast
if ( digitalRead ( BTN_EN1 ) && digitalRead ( BTN_EN2 ) ) encoderPosLast -- ;
else if ( ( ! digitalRead ( BTN_EN1 ) && digitalRead ( BTN_EN2 ) ) || ( digitalRead ( BTN_EN1 ) && ! digitalRead ( BTN_EN2 ) ) ) encoderPosLast ++ ;
logo_lines ( ) ;
status_line ( "Starting..." ) ;
delay ( 1000 ) ;
status_line ( "Ready" ) ;
}
//Main arduino loop
void loop ( ) {
//If sd card is inserted display SD card info
if ( ! digitalRead ( SD_DETECT_PIN ) ) {
status_line ( "SD Card Inserted" ) ;
sdcardinit = card . init ( SPI_HALF_SPEED , SDSS ) ;
if ( ! sdcardinit ) sdcardinit = card . init ( SPI_HALF_SPEED , SDSS ) ; //try it again.
sdcardtype = card . type ( ) ;
sdvolumeinit = volume . init ( card ) ;
sdvolumefattype = volume . fatType ( ) ;
sdvolumebpc = volume . blocksPerCluster ( ) ;
sdvolumecc = volume . clusterCount ( ) ;
sdcardinfo ( ) ;
while ( ! digitalRead ( SD_DETECT_PIN ) ) ; //wait for sd card to be removed.
lcd . clear ( ) ;
logo_lines ( ) ;
status_line ( "SD Card Removed" ) ;
}
else {
// Read the encoder and update encoderPos
encoder0PinNow = digitalRead ( BTN_EN2 ) ;
if ( ( encoder0PinALast == LOW ) && ( encoder0PinNow == HIGH ) ) {
if ( digitalRead ( BTN_EN1 ) == LOW ) {
encoderPos ++ ;
if ( encoderPos > screenX - 4 ) encoderPos = screenX - 4 ;
} else {
encoderPos -- ;
if ( encoderPos < 0 ) encoderPos = 0 ;
}
}
encoder0PinALast = encoder0PinNow ;
if ( encoderPos != encoderPosLast ) encoder_status_line ( encoderPos ) ;
#ifdef DEBUG
Serial . print ( "EncoderPos" ) ; Serial . println ( encoderPos ) ;
Serial . print ( "EncoderPosLast" ) ; Serial . println ( encoderPosLast ) ;
#endif
encoderPosLast = encoderPos ;
//check if both buttons and sound the ebuzzer
if ( ! digitalRead ( BTN_ENC ) && ! digitalRead ( KILL_PIN ) ) {
status_line ( "Buzzer activated" ) ;
digitalWrite ( BEEPER_PIN , HIGH ) ;
while ( ! digitalRead ( BTN_ENC ) && ! digitalRead ( KILL_PIN ) ) ; //wait for button release
digitalWrite ( BEEPER_PIN , LOW ) ;
status_line ( "Buzzer deactivated" ) ;
}
//check encoder button
if ( ! digitalRead ( BTN_ENC ) && digitalRead ( KILL_PIN ) ) {
status_line ( "Enc: button pressed" ) ;
//digitalWrite(BEEPER_PIN, HIGH);
while ( ! digitalRead ( BTN_ENC ) && digitalRead ( KILL_PIN ) ) ;
//digitalWrite(BEEPER_PIN, LOW);
status_line ( "Enc: button released" ) ;
}
//Check Kill Pin
if ( ! digitalRead ( KILL_PIN ) && digitalRead ( BTN_ENC ) ) {
status_line ( "Kill button pressed" ) ;
while ( ! digitalRead ( KILL_PIN ) && digitalRead ( BTN_ENC ) ) ;
status_line ( "Kill button released" ) ;
}
}
#ifdef DEBUG
delay ( 2000 ) ;
#endif
}
Demo
Video
VIDEO
Nhận xét