Prusa firmware for RAMPS Prusa i3 clones with MK42 beds

#121

When I activate auto bed leveling Arduino ide keeps giving me an error. " initializer fails to determine size of ‘__c’

0 Likes

#122

What do you mean by “an error in the compilation”.

I think soon I will create a version of the firmware that thinks it’s already calibrated perfectly, to assist those without MK42 beds (or those with china “clone” aluminium ones).

0 Likes

#123

Hi! I have been testing this firmware and everything works perfectly. But when I activate the auto leveling it is always giving an error in the compilation and the mesh bed leveling even if I change the probe points, one of these points is always out of the bed even if I put the max x at 150
ps: I am using a pcb heatedbed with aluminium tape in probing points

0 Likes

#124

Hello guys!

Anyone here managed to get work MMU with MKS GEN 1.4?, from schematics i found mmu uses VCC,TX2,RX2,GND pins, these pins can be found on mks board too, named J15 Header 1x4pin (WIFI) the only thing here is the order of pins, and i guess VCC is 5v also, in firmware side there is defined E_MUX2_PIN 84, but this pin is unused on both boards by schematics, can someone clarify this? Thanks!.

0 Likes

#125

where are the mmu multiplexer schematics?

0 Likes

#126

I found it on github, https://github.com/prusa3d/MK2mm_Stepper_switch.

0 Likes

#127

No need to use the same pins that Prusa use for RAMBo.

The ones in the servo header are probably a good bet- Maybe use D4 and D5 - you’ve got your 5V and GND there too.

Change the pins numbers in pins.h :-

#define E_MUX0_PIN 17
#define E_MUX1_PIN 16

to

#define E_MUX0_PIN 4
#define E_MUX1_PIN 5

and it will probably work

0 Likes

#128

I downloaded the rambo mini 1.3a schematic, then i searched for the pinout of the respective header (2x5pin), rambo mini uses P3 header’s 1,3,5,7 pins, i attached the schematic of this header.

0 Likes

#129

His campaign concluded successfully though. Of the two MK42 I have, his is the usable one. The Edward Clifford (d3di ) campaign is the one where a few of the backers (me included) have received an unusable warped bed, and the rest have got nothing.

0 Likes

#130

Then i think you got one of the first batch.
But some of the first batch never received anything and it looks like no one of the second batch got one.

0 Likes

#131

hi guys!.. can someone help me to configurate the ““mesh_bed_calibration.cpp”” for a MK3 Aluminum Heated Bed. This bed have 200x200 so i’ve been having many issues to work with this. please just need to understand how the point reference works. thanks.

0 Likes

#132

It won’t work; the calibration is dependent on the 9 calibration points on the MK42 bed.

0 Likes

#133

it’s not going to work in any way?? because i believed that i just need to modified that file

0 Likes

#134

anybody noticed the new mk25 firmware?! i would love to see this one ported! :geek:

0 Likes

#135

Looks promising. I’ve been watching the mk3 firmware but it’s been a long way from able to compile for a Rambo with TMC2130 and the other mk3 bits turned off.

All the new functionality in the firmware is enabled via compiler #defines but there were a lot missing which resulted in failed compiles. I’ve been reluctant to add them myself because then my branch would diverge from the upstream by too much to maintain.

I suspect this release is the result of prusa fixing what I’ve been avoiding, and I hope it’s possible to port the ramps stuff to this but also re-add the TMC2130 support. I will investigate soon.

0 Likes

#136

You’re the best!

0 Likes

#137

Hello guys,

I am using a Prusa I3 Single Nozzle Printer with an Ramps 1.4 (Prusa MK 2S clone).
The firmware I am using is the Prusa I3 Mk 2S Ver 3.1.0 optimized from Slippyr4:

Slippyr4 Github

I added a thermistor on my board on Pin 15 -> Temp_1_PIN.
The thermistor is connected to the internals of my power supply. I want to read the power supply temperature, if the temp is higher than a treshold it should shutoff.

The problem is, I dont know how to add the thermisor in the firmware. I already set the extruders to 2:

// This defines the number of extruders
#define EXTRUDERS 2

to activate the second thermistor. Then I modified the:
ultralcd_implementation_hitachi_HD44780.h

and added

    int tHotend=int(degHotend(0) + 0.5);
    int tTarget=int(degTargetHotend(0) + 0.5);

    //Print the hotend temperature 1
    lcd.setCursor(0, 0);
    lcd.print(LCD_STR_THERMOMETER[0]);
    lcd.print(itostr3(tHotend));
    lcd.print('/');
    lcd.print(itostr3left(tTarget));
    lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
    lcd_printPGM(PSTR("  "));

################## here begins the addeded content #################

    tHotend=int(degHotend(1) + 0.5);
    tTarget=int(degTargetHotend(1) + 0.5);
    
    //Print the hotend temperature 2
    lcd.setCursor(0, 1);
    lcd.print(LCD_STR_THERMOMETER[0]);
    lcd.print(itostr3(tHotend));
    lcd.print('/');
    lcd.print(itostr3left(tTarget));
    lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
    lcd_printPGM(PSTR("  "));

############### end of my added content #####################

    //Print the Z coordinates
    lcd.setCursor(LCD_WIDTH - 8-2, 1);
#if 1
    lcd_printPGM(PSTR("  Z"));
    if (custom_message_type == 1) {
        // In a bed calibration mode.
        lcd_printPGM(PSTR("   --- "));
    } else {
        lcd.print(ftostr32sp(current_position[Z_AXIS] + 0.00001));
        lcd.print(' ');
    }
#else
    lcd_printPGM(PSTR(" Queue:"));
    lcd.print(int(moves_planned()));
    lcd.print(' ');
#endif

    //Print the Bedtemperature
    lcd.setCursor(LCD_WIDTH - 8-2, 0);
    tHotend=int(degBed() + 0.5);
    tTarget=int(degTargetBed() + 0.5);
    lcd.print(LCD_STR_BEDTEMP[0]);
    lcd.print(itostr3(tHotend));
    lcd.print('/');
    lcd.print(itostr3left(tTarget));
    lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
    lcd_printPGM(PSTR("  "));

I also double chekd that the pins in pins.h are mapped the right way to Pin 15.

If I compile the firmware like this it will be shown on my printer like this (See attached picture):
(LCD Layout was modified from me)

It will show the 2 thermistors in the display but the 2 thermistor is somehow mapped to the Bed thermistor … (Hotend 1 thermistor is not defined as redundant! in the setting). So something is wrong with the definitions I think.

tHotend=int(degHotend(1) + 0.5);
tTarget=int(degTargetHotend(1) + 0.5);

should activate the 2 Thermistor … but it is the Bed thermistor so the Bed thermistor is shown twice in my display.

Anyone an idea what I am missing ?

0 Likes

#138

I played even more around and tried to add some code from my old dual extruder Marlin setup… and suprisingly the code snipped worked. But same here the int(degHotend(1) is somehow mapped to the bed thermistor and not the thermistor 2 of the hotend.

20x4   |01234567890123456789|
       |T 000/000D  Z000.0  |
       |B 000/000D  F100%   |
       |SD100%      T--:--  |
       |Status line.........|
*/

static void lcd_implementation_status_screen()
{
    int tHotend=int(degHotend(0) + 0.5);
    int tTarget=int(degTargetHotend(0) + 0.5);

#if LCD_WIDTH < 20
    lcd.setCursor(0, 0);
    lcd.print(itostr3(tHotend));
    lcd.print('/');
    lcd.print(itostr3left(tTarget));

# if EXTRUDERS > 1 || TEMP_SENSOR_BED != 0
    //If we have an 2nd extruder or heated bed, show that in the top right corner
    lcd.setCursor(8, 0);
#  if EXTRUDERS > 1
    tHotend = int(degHotend(1) + 0.5);
    tTarget = int(degTargetHotend(1) + 0.5);
    lcd.print(LCD_STR_THERMOMETER[0]);
#  else//Heated bed
    tHotend=int(degBed() + 0.5);
    tTarget=int(degTargetBed() + 0.5);
    lcd.print(LCD_STR_BEDTEMP[0]);
#  endif
    lcd.print(itostr3(tHotend));
    lcd.print('/');
    lcd.print(itostr3left(tTarget));
# endif//EXTRUDERS > 1 || TEMP_SENSOR_BED != 0

#else//LCD_WIDTH > 19
    lcd.setCursor(0, 0);
    lcd.print(LCD_STR_THERMOMETER[0]);
    lcd.print(itostr3(tHotend));
    lcd.print('/');
    lcd.print(itostr3left(tTarget));
    lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
    if (tTarget < 10)
        lcd.print(' ');

# if EXTRUDERS > 1 || TEMP_SENSOR_BED != 0
    //If we have an 2nd extruder or heated bed, show that in the top right corner
    lcd.setCursor(10, 0);
#  if EXTRUDERS > 1
    tHotend = int(degHotend(1) + 0.5);
    tTarget = int(degTargetHotend(1) + 0.5);
    lcd.print(LCD_STR_THERMOMETER[0]);
#  else//Heated bed
    tHotend=int(degBed() + 0.5);
    tTarget=int(degTargetBed() + 0.5);
    lcd.print(LCD_STR_BEDTEMP[0]);
#  endif
    lcd.print(itostr3(tHotend));
    lcd.print('/');
    lcd.print(itostr3left(tTarget));
    lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
    if (tTarget < 10)
        lcd.print(' ');
# endif//EXTRUDERS > 1 || TEMP_SENSOR_BED != 0
#endif//LCD_WIDTH > 19

#if LCD_HEIGHT > 2
//Lines 2 for 4 line LCD
# if LCD_WIDTH < 20
#  ifdef SDSUPPORT
    lcd.setCursor(0, 2);
    lcd_printPGM(PSTR("SD"));
    if (IS_SD_PRINTING)
        lcd.print(itostr3(card.percentDone()));
    else
        lcd_printPGM(PSTR("---"));
    lcd.print('%');
#  endif//SDSUPPORT
# else//LCD_WIDTH > 19
#  if EXTRUDERS > 1 && TEMP_SENSOR_BED != 0
    //If we both have a 2nd extruder and a heated bed, show the heated bed temp on the 2nd line on the left, as the first line is filled with extruder temps
    lcd.setCursor(0,1);
    lcd.print('X');
    lcd.print(ftostr3(current_position[X_AXIS]));
    lcd_printPGM(PSTR(" Y"));
    lcd.print(ftostr3(current_position[Y_AXIS]));
#  else
    tHotend=int(degBed() + 0.5);
    tTarget=int(degTargetBed() + 0.5);

    lcd.setCursor(0, 1);
    lcd.print(LCD_STR_BEDTEMP[0]);
    lcd.print(itostr3(tHotend));
    lcd.print('/');
    lcd.print(itostr3left(tTarget));
    lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
    if (tTarget < 10)
        lcd.print(' ');
        
#  endif//EXTRUDERS > 1 || TEMP_SENSOR_BED != 0
# endif//LCD_WIDTH > 19
    lcd.setCursor(LCD_WIDTH - 8, 1);
    lcd.print('Z');
    lcd.print(ftostr32(current_position[Z_AXIS]));
#endif//LCD_HEIGHT > 2

#if LCD_HEIGHT > 3
    lcd.setCursor(0, 2);
    lcd.print(LCD_STR_FEEDRATE[0]);
    lcd.print(itostr3(feedmultiply));
    lcd.print('%');
# if LCD_WIDTH > 19
#  ifdef SDSUPPORT
    lcd.setCursor(7, 2);
    lcd_printPGM(PSTR("SD"));
    if (IS_SD_PRINTING)
        lcd.print(itostr3(card.percentDone()));
    else
        lcd_printPGM(PSTR("---"));
    lcd.print('%');
#  endif//SDSUPPORT
# endif//LCD_WIDTH > 19
    lcd.setCursor(LCD_WIDTH - 6, 2);
    lcd.print(LCD_STR_CLOCK[0]);
    if(starttime != 0)
    {
        uint16_t time = millis()/60000 - starttime/60000;
        lcd.print(itostr2(time/60));
        lcd.print(':');
        lcd.print(itostr2(time%60));
    }else{
        lcd_printPGM(PSTR("--:--"));
    }
#endif

    //Status message line on the last line
    lcd.setCursor(0, LCD_HEIGHT - 1);
    lcd.print(lcd_status_message);
}
static void lcd_implementation_drawmenu_generic(uint8_t row, const char* pstr, char pre_char, char post_char)
{
    char c;
    //Use all characters in narrow LCDs
  #if LCD_WIDTH < 20
      uint8_t n = LCD_WIDTH - 1 - 1;
    #else
      uint8_t n = LCD_WIDTH - 1 - 2;
  #endif
    lcd.setCursor(0, row);
    lcd.print(pre_char);
    while( ((c = pgm_read_byte(pstr)) != '\0') && (n>0) )
    {
        lcd.print(c);
        pstr++;
        n--;
    }
    while(n--)
        lcd.print(' ');
    lcd.print(post_char);
    lcd.print(' ');
}

I modified it a little bit ( normally it would look like this)

#  if EXTRUDERS > 1 && TEMP_SENSOR_BED != 0
    //If we both have a 2nd extruder and a heated bed, show the heated bed temp on the 2nd line on the left, as the first line is filled with extruder temps
tHotend=int(degBed() + 0.5);
    tTarget=int(degTargetBed() + 0.5);

    lcd.setCursor(0, 1);
    lcd.print(LCD_STR_BEDTEMP[0]);
    lcd.print(itostr3(tHotend));
    lcd.print('/');
    lcd.print(itostr3left(tTarget));
    lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
    if (tTarget < 10)
        lcd.print(' ');    
#  else
lcd.setCursor(0,1);
    lcd.print('X');
    lcd.print(ftostr3(current_position[X_AXIS]));
    lcd_printPGM(PSTR(" Y"));
    lcd.print(ftostr3(current_position[Y_AXIS]));

I changed the If with the else parameter otherwise my display will show the X Y and Z coordinates.

#  if EXTRUDERS > 1 && TEMP_SENSOR_BED != 0
    //If we both have a 2nd extruder and a heated bed, show the heated bed temp on the 2nd line on the left, as the first line is filled with extruder temps
    lcd.setCursor(0,1);
    lcd.print('X');
    lcd.print(ftostr3(current_position[X_AXIS]));
    lcd_printPGM(PSTR(" Y"));
    lcd.print(ftostr3(current_position[Y_AXIS]));
#  else
    tHotend=int(degBed() + 0.5);
    tTarget=int(degTargetBed() + 0.5);

    lcd.setCursor(0, 1);
    lcd.print(LCD_STR_BEDTEMP[0]);
    lcd.print(itostr3(tHotend));
    lcd.print('/');
    lcd.print(itostr3left(tTarget));
    lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
    if (tTarget < 10)
        lcd.print(' ');

So the condition if EXTRUDERS > 1 && TEMP_SENSOR_BED != 0 -> is somehow not met … otherwise I dont have to change the if with the else in my normal dual extruder setup (standard marlin 1.0.3) it worked flawlessly but with the code I get the bed temperature twice
See the attached picture.

I think I know why … in configuration_adv.h is the following declared:

[code]// A single Z stepper driver is usually used to drive 2 stepper motors.
// Uncomment this define to utilize a separate stepper driver for each Z axis motor.
// Only a few motherboards support this, like RAMPS, which have dual extruder support (the 2nd, often unused, extruder driver is used
// to control the 2nd Z axis stepper motor). The pins are currently only defined for a RAMPS motherboards.
// On a RAMPS (or other 5 driver) motherboard, using this feature will limit you to using 1 extruder.
#define Z_DUAL_STEPPER_DRIVERS

#ifdef Z_DUAL_STEPPER_DRIVERS
#undef EXTRUDERS
#define EXTRUDERS 1
#endif[/code]

and if I define EXTRUDERS 2 there … the shit is on fire … The “undef extruders” kills the extruders 2 in the configuration.h and so 1 extruder is declared again… I think I am done … °_°

0 Likes

#139

Hello, Does somebody know how to get run RepRapDiscount Full Graphic Smart Controlle?

I have tried uncomment #define DOGLCD and #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER but it give me error.

I have already install library U8glib.

Thank you

0 Likes

#140

you dont want to uncomment doglcd since that is not what you are using. So just define that full_graphic controller and you should be good to go.

So:
//#define DOGLCD
#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER

0 Likes