LCD 2004 3D Ramps Arduino Test

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

 

Nhận xét

Mới hơn Cũ hơn