By Kevin West on Sunday, 21 January 2018
Category: How To Tutorials

G Codes and M Codes for 3D printing

          You can customize the beginning and ending code that your slicer adds to the gcode files it produces to automate certain tasks or produce a more desired behavior. Below are suggestions for these codes.

For a list of gcode commands and their usage continue to the bottom of the post.

Based On The Simplify3D Tutorial

          Did you know that 3D printers have their own language? Today, many desktop 3D printers use a numerically controlled programming language made up of a series of commands called G-Code. Most of these commands start with a G (hence the name), but there are also some common machine-specific codes that start with an M. These commands tell your 3D printer exactly what actions to perform – where to move, what speed to use, what temperatures to set, and much more. For any maker, it is beneficial to have a basic knowledge of G-Code to understand how your 3D printer works, debug or perform maintenance on your machine, and verify your print files.  This guide will explain the 10 most commonly used commands, what they do, and how to edit them in Simplify3D.

When slicing your model in Simplify3D the software will automatically generate the G-Code commands necessary to complete the print. You can view these commands by clicking “Save Toolpaths to Disk”, selecting a location for the file on your hard drive, and then opening the .gcode file in a text editor like Notepad or TextEdit. If you happen to be using Notepad++, you can download this handy XML file that will enable syntax highlighting for your gcode files, just like the image at the top of this article. To import the file in Notepad++, go to Language > Define your language, click Import, and select the XML file.

Although G-Code is the standard language for most 3D printers, some machines may use different file formats or commands. Even if your printer uses a different file format such as an .x3g file, please note that Simplify3D will still export both the .gcode and .x3g files to the location that you select. This is quite useful, as many of the other file formats are actually binary files. Viewing the text in the gcode file is much easier than readings lots of 1’s and 0’s in the binary files!

After you open your .gcode file in a text editor, you will notice that each command is typically listed on a separate line. The start of the line tells you what type of command it is, and then there may be several additional arguments that follow. You can even add comments within the file by placing a semi-colon before the comment so that it is ignored by the machine. So now that you have seen an example of what your 3D print files look like, here is our list of the 10 most common commands you need to know.

The 10 Most Common G-Code Commands for 3D Printing

For each command, we will provide a description of what the command does, specify what arguments may be needed, and even provide a few sample commands so that you can see how it is commonly used.

G28 – Perform Homing Routine

This command tells the printer to run its homing sequence, which will move the toolhead to the far edges of the machine until it contacts the endstops at these locations. Most of your print files will begin with this command so that the printer starts from a known location. This is also a useful way to quickly move one axis out of the way, which may be useful at the end of a print so that you can remove your part.

Arguments:
If no arguments are provided, the machine will home all 3 axes. You can also specify which exact axes you want to home by adding an X, Y, or Z to the command.

Example usage:
G28 ; home all axes (X, Y, and Z)

G28 X Y ; home X and Y axes

G28 Z ; home Z axis only
G90 and G91 – Set Positioning Mode
Your printer can use either absolute or relative positioning. Absolute positioning means that you will be telling your 3D printer to move an exact XYZ coordinate. Relative positioning is used when you want to tell the printer how far it should move from the current location. Send a G90 command to tell your printer to use absolute positioning, or a G91 for relative positioning. The majority of your gcode file will likely use absolute positioning, since the slicer has already determined the exact XYZ coordinates to move to. However, if you don’t know the previous position of the toolhead, or you simply know that you want to move the head a certain distance along an axis, you can use relative positioning. While G90 and G91 control the positioning mode for the X, Y, and Z axes, you can also use M82 or M83 to set your extruder (E-axis) to absolute or relative positioning.

Arguments:
None

Example usage:
G90 ; use absolute positioning for the XYZ axes
G1 X10 F3600 ; move to the X=10mm position on the bed
G1 X20 F3600 ; move to X=20mm

G91 ; use relative positioning for the XYZ axes
G1 X10 F3600 ; move 10mm to the right of the current location
G1 X10 F3600 ; move another 10mm to the right

G1 – Linear Movement

This command probably makes up 95% of your gcode files, so it is a good one to learn! The G1 command tells your printer to move in a straight line to the location that you specify. You can use this to move just a single axis, or multiple axes at once. Keep in mind that your extruder is controlled just like any other axis, so you can also use this command to extrude or retract filament from the nozzle.

Arguments:
Use X, Y, or Z values to tell the printer what position to move to. Keep in mind that these values will obey the current positioning mode, so you can specify them using either absolute or relative coordinates. Include an E value if you want to move the extruder as well. The E value corresponds to the position of your filament spool, so if you move the E axis by 10mm, that would cause 10mm of your filament to be pushed into the nozzle. Since the nozzle diameter is usually much smaller than your filament diameter, 10mm of filament pushed into the nozzle may create an extrusion that is hundreds of millimeters long! For this reason, the E values that you will see in your file are typically quite small compared to the X, Y, and Z values. Finally, you can use an F value to tell the printer what speed to use for the movement. This speed must always specified in units of mm/min, so even if you use mm/s in your slicing software, you will still need use mm/min anytime you are sending a command directly to the printer.

Most printers support “sticky” coordinates, which means that you only need to specify the arguments for the axes you actually want to move. So if you only wanted to move the Z axis, you would just include the Z argument as well as an F value to define the speed.

Example usage:
G1 X0 Y0 F2400 ; move to the X=0 Y=0 position on the bed at a speed of 2400 mm/min
G1 Z10 F1200 ; move the Z-axis to Z=10mm at a slower speed of 1200 mm/min
G1 X30 E10 F1800 ; push 10mm of filament into the nozzle while moving to the X=30 position at the same time

G92 – Set Current Position
Use this command to set the current position of your axes. This can be useful if you want to change or offset the location of one of your axes. One of the most common uses for this command is actually with your E axis (the filament position). You can quickly override the current filament position so that all future commands will now be relative to this new value. It is common to do this at the start of each layer or right before a prime or retraction command.

Arguments:
Specify the absolute coordinate for any axis that you wish to overwrite. You can include the X, Y, Z, and E axes. If you do not include one of these axes in the command, the position will remain unchanged.

Example usage:
G92 E0 ; set the current filament position to E=0
G1 E10 F800 ; extrude 10mm of filament

M104 and M109 – Extruder Heating Commands

Use these commands to set the temperature of your extruder. The M104 command starts heating the extruder, but then allows you to run other commands immediately afterwards. The M109 command will actually wait until the desired temperature is reached before allowing any other commands to run. For this reason, you will frequently see an M109 at the top of your Simplify3D gcode files, as this allows the extruder to reach the necessary temperature before the print begins.

While most machines use M104 and M109, some firmwares may use slightly different commands. For example, if you are using a machine that reads x3g files, then you may use an M133 command for stabilizing your extruder instead of M109. If you are using a machine that runs a variant of the FlashForge Dreamer or Dremel firmwares, you’ll want to use an M6 command to stabilize your extruder. You can check what firmware type you are using in Simplify3D by going to Tools > Firmware Configuration.

Arguments:
The S value specifies the extruder temperature in degrees Celsius. The T value can be used if you have more than one extruder, as it allows you to specify which exact extruder temperature you want to set. If you have a dual extrusion machine, typically T0 is the right extruder, and T1 is the left extruder. If you only have a single extruder machine, you can typically omit the T parameter entirely.

Example usage:
M104 S190 T0 ; start heating T0 to 190 degrees Celsius
G28 X0 ; home the X axis while the extruder is still heating
M109 S190 T0 ; wait for T0 to reach 190 degrees before continuing with any other commands

M140 and M190 – Bed Heating Commands
Use these commands to set the temperature of your heated build platform. The syntax is very similar to the M104 and M109 commands mentioned above. Sending the M140 command begins heating the bed, but allows you to run other commands immediately afterwards. The M190 command will wait until the bed temperature is reached before allowing any other commands to run. Keep in mind that the heated bed on your printer may take several minutes to reach elevated temperatures. So don’t be surprised if you see your printer pausing while waiting on an M190 command to finish heating the bed. Because this process can take a long time, it may be a good idea to start heating the bed at the beginning of your routine using an M140 command, which would allow you to do other actions such as homing or nozzle purging while the bed is still pre-heating. Just make sure to include an M190 before the print begins, as the bed temperature can be an important factor for first layer adhesion.

As with the M104 and M109 commands, these bed heating commands can differ depending on what firmware you are using. If your machine reads x3g files, then you can use the M134 command for stabilizing your bed instead of M190. If you are using a variant of the FlashForge Dreamer or Dremel firmwares, you’ll want to use an M7 command to stabilize your bed.

Arguments:
The S value specifies the bed temperature in degrees Celsius. No other arguments are typically needed, as most machines only have a single heated build platform.

Example usage:
M140 S50 ; start heating the bed to 50 degrees Celsius
G28 ; home all 3 axes while the bed is still heating
M190 S50 ; wait until the bed reaches 50 degrees before continuing

M106 – Set Fan Speed
This command allows you to set the speed of your printer’s part cooling fan. This is an external cooling fan that is pointed towards the part that you are printing. Keep in mind that your printer may also have an extruder fan that helps cool the extruder drive mechanism, so make sure you are looking at the correct fan first. While most printers have an external cooling fan, there are a few exceptions, so check your machine first to make sure it has an external cooling fan that you can control.

Arguments:
The S value sets the speed of the cooling fan in a range between 0 (off) and 255 (full power).

Example usage:
M106 S255 ; set the fan to full speed

M106 S127 ; set the fan to roughly 50% power

M106 S0 ; turn off the fan completely

How to Send or Edit G-Code Commands

If your machine accepts normal gcode files like most RepRap machines, then a great way to test different commands is by manually sending them one-at-a-time to see how your printer responds. You can do this within Simplify3D by going to Tools > Machine Control Panel. Once in the Machine Control Panel make sure you are connected to your 3D printer and then use the Communications tab to send your printer a line of G-Code. Just type the command that you want to send at the bottom of the window and then press the Send button. None of the commands mentioned in this article are permanent, so you can always reboot the printer if you want to stop what the machine is doing or get back to a fresh state.

Once you feel comfortable with the commands, you may find that you want to run the same series of commands before or after each print. Thankfully, Simplify3D gives you the ability to customize the routines that are run at the start and end of each print, so you can easily update your settings so that your 3D printer automatically performs these actions. To do this, click “Edit Process Settings” and then select the Scripts tab. There are several different scripts on this tab that you can edit. Each one is used at different times during your print. For example, the Starting script is used at the very beginning of the print, while the Ending script is run at the very end of the print. Depending on where you want to make your changes select the appropriate categories and start editing. The default profile that Simplify3D provides for your 3D printer will already include scripts that we have tested and verified, so you can use these as a starting point.

Each time you make a change to these scripts, you can try running a quick test print to make sure the printer behaves like you would expect. Once you are happy with the changes, you can use Simplify3D’s profile management system to permanently save these new settings for future prints. You can even create multiple versions of your profile if you want to keep track of your changes along the way.

Beginning Gcode

G28 ;home all axes

Ending Gcode

The following ending gcode will lift the Z axis slightly, retract filament to reduce oozing when pre-heating for the next print, move the bed to the front, and run the extruder cooling fan at 100% for 2 minutes before turning it off.

M104 S0                       ;extruder heater off
M140 S0                       ;bed heater off
G91                           ;relative positioning
G1 E-1 F300                   ;retract the filament 1mm
G1 Z+0.5 E-3 X-20 Y-20 F6000  ;move Z up and retract filament 3mm
M106 S255                     ;fan at 100% to cool nozzle
G90                           ;absolute positioning
G28 X0 Y0                     ;home X and Y
G1 Y190                       ;move bed forward
M84                           ;steppers off
G4 P120000                    ;wait 2 minutes (120 seconds)
M106 S0                       ;fan off

These are codes for the Marlin RepRap firmware. These codes are fairly standard accross 3D printers, and are mostly consistent with NIST G Code standards. This information was collated directly from the Marlin firmware and from reprap.org/wiki/G-code.

 

Common codes - without details

Code Description
G0 Rapid Movement
G1 Coordinated Movement X Y Z E
G2 CW ARC
G3 CCW ARC
G4 Dwell S or P
G28 Home all Axis/td>
G90 Use Absolute Coordinates
G91 Use Relative Coordinates
G92 Set current position to coordinates given
M0 Unconditional stop
M18 Disable all stepper motors; same as M84
M84 Disable steppers until next move or set an inactivity timeout
M104 Set extruder target temp
M105 Read current temp
M106 Fan on
M109 Set extruder target temp and wait for it to be reached
M112 Emergency stop
M114 Output current position to serial port
M140 Set bed target temp
M190 Set bed target temp and wait for it to be reached
M220 Set speed factor override percentage
M221 Set extrude factor override percentage
 
 

Common codes - with details

Code Description Parameters Examples with Explanations
G0 Rapid Movement G0 X## Y## Z## E## F## S## Most RepRap Firmwares treat G0 and G1 as the same command G0 X12 (move to 12mm on the X axis) G0 F1500 (Set the feedrate to 1500mm/minute)
G1 Coordinated Movement X Y Z E G1 X## Y## Z## E## F## S## Not all variables need to be used, but at least one has to be used X## The position to move to on the X axis Y## The position to move to on the Y axis Z## The position to move to on the Z axis E## The amount to extrude between the starting point and ending point F## The feedrate per minute of the move between the starting point and ending point (if supplied) S## Flag to check if an endstop was hit (S1 to check, S0 to ignore, S2 see note, default is S0)1 G1 X90.6 Y13.8 E22.4 (Move to 90.6mm on the X axis and 13.8mm on the Y axis while extruding 22.4mm of material) 1. G1 F1500 (set the feedrate to 1500mm/minute) 2. G1 X50 Y25.3 E22.4 ( move to 50mm on the X axis and 25.3mm on the Y axis while extruding 22.4mm of filament between the two points.) 1. G1 F1500 (set a feedrate of 1500 mm/minute) 2. G1 X50 Y25.3 E22.4 F3000 (move accelerating to a feedrate of 3000 mm/minute as it does so)
G2 CW ARC I## The point in X space from the current X position to maintain a constant distance from J## The point in Y space from the current Y position to maintain a constant distance from G2 X90.6 Y13.8 I5 J10 E22.4 (Move in a Clockwise arc from the current point to point (X=90.6,Y=13.8), with a center point at (X=current_X+5, Y=current_Y+10), extruding 22.4mm of material between starting and stopping)
G3 CCW ARC X## The position to move to on the X axis Y## The position to move to on the Y axis I## The point in X space from the current X position to maintain a constant distance from J## The point in Y space from the current Y position to maintain a constant distance from E## The amount to extrude between the starting point and ending point G3 X90.6 Y13.8 I5 J10 E22.4 (Move in a Counter-Clockwise arc from the current point to point (X=90.6,Y=13.8), with a center point at (X=current_X+5, Y=current_Y+10), extruding 22.4mm of material between starting and stopping)
G4 Dwell S or P G4 S## Wait for ## seconds G4 P## Wait for ## milliseconds G4 S2 (wait for 2 seconds) G4 P2000 (wait for 2000 milliseconds) same thing
G28 Home all Axis G28 X Y Z X Flag to go back to the X axis origin Y Flag to go back to the Y axis origin Z Flag to go back to the Z axis origin G28 (Go to origin on all axes) G28 X Z (Go to origin only on the X and Z axis)
G90 Use Absolute Coordinates   G90 All coordinates from now on are absolute relative to the origin of the machine. (This is the RepRap default.)
G91 Use Relative Coordinates   G91 All coordinates from now on are relative to the last position.
G92 Set current position to coordinates given G92 X## Y## Z## E## G92 X10 E90 Allows programming of absolute zero point, by reseting the current position to the values specified. This would set the machine's X coordinate to 10, and the extrude coordinate to 90. No physical motion will occur. G92 without coordinates, all axes are set to zero
M0 Unconditional stop   M0 The RepRap machine finishes any moves left in its buffer, then shuts down. All motors and heaters are turned off. It can be started again by pressing the reset button on the master microcontroller. M1 is the same in Marlin. See also M112.
M18 Disable all stepper motors; same as M84   M18 Disables stepper motors and allows axis to move 'freely.'
M84 Disable steppers until next move or set an inactivity timeout M84 S## S## The number of seconds of inactivity before disabling motors M84 Stop the idle hold on all axis and extruder. In some cases the idle hold causes annoying noises, which can be stopped by disabling the hold. Be aware that by disabling idle hold during printing, you will get quality issues. This is recommended only in between or after printjobs. On Marlin, M84 can also be used to configure or disable the idle timeout. For example, "M84 S10" will idle the stepper motors after 10 seconds of inactivity. "M84 S0" will disable idle timeout; steppers will remain powered up regardless of activity.
M104 Set extruder target temp M104 S## S## The taget temperature in Celcius M104 S190 Set the temperature of the current extruder to 190oC and return control to the host immediately (i.e. before that temperature has been reached by the extruder)
M105 Read current temp   M105 Request the temperature of the current extruder and the build base in degrees Celsius. The temperatures are returned to the host computer.
M106 Fan on M106 S## S## The speed of the fan 0-255 M106 S127 Turn on the cooling fan at half speed. Mandatory parameter 'S' declares the PWM value (0-255). M106 S0 turns the fan off.
M109 Set extruder target temp and wait for it to be reached M109 S## M109 R## S## Wait for extruder current temp to reach target temp. Waits only when heating. R## Wait for extruder current temp to reach target temp. Waits when heating and cooling M109 S185 R240 Sets extruder temperature to 185 and waits for the temperature to be between 185 - 240.
M112 Emergency stop   M112 Any moves in progress are immediately terminated, then RepRap shuts down. All motors and heaters are turned off. It can be started again by pressing the reset button on the master microcontroller. See also M0 and M1.
M114 Output current position to serial port   M114 This causes the RepRap machine to report its current X, Y, Z and E coordinates to the host.
M140 Set bed target temp M140 S## R## S## The taget temp of the bed in Celcius S## The holding temp of the bed in Celcius M140 S55 Set the temperature of the build bed to 55C and return control to the host immediately (i.e. before that temperature has been reached by the bed). M140 S65 R40. Sets the target bed temp to 65C and establishes a standby temp of 40C.
M190 Set bed target temp and wait for it to be reached M190 S## R## S## Wait for bed current temp to reach target temp. Waits only when heating R## Wait for bed current temp to reach target temp. Waits when heating and cooling M190 S60 This will wait until the bed temperature reaches 60 degrees, communicating the temperature of the hot end and the bed every second.
M220 Set speed factor override percentage M220 S## S## Resents the preinter speed to this percentage of the orginal speed M220 S80 Slow down to 80% of the defined speed M220 S200 Increase the speed to double what was coded.
M221 Set extrude factor override percentage M221 S## S## The extrude factor override percentage M221 S70 Reduces the extrusion rate to 70%.
 
 

All codes in Marlin

Code Description
G0 Rapid Movement
G1 Coordinated Movement
G2 CW ARC
G3 CCW ARC
G4 Dwell S or P
G10 Retract filament according to settings of M207
G11 Retract recover filament according to settings of M208
G28 Home all Axis
G29 Detailed Z-Probe, probes the bed at 3 or more points. Will fail if you haven't homed yet.
G30 Single Z Probe, probes bed at current XY location.
G31 Dock sled (Z PROBE SLED only)
G32 Undock sled (Z PROBE SLED only)
G90 Use Absolute Coordinates
G91 Use Relative Coordinates
G92 Set current position to coordinates given
M Codes  
M0 Unconditional stop
M1 Same as M0
M17 Enable/Power all stepper motors
M18 Disable all stepper motors; same as M84
M20 List SD card
M21 Init SD card
M22 Release SD card
M23 Select SD file (M23 filename.g)
M24 Start/resume SD print
M25 Pause SD print
M26 Set SD position in bytes (M26 S12345)
M27 Report SD print status
M28 Start SD write (M28 filename.g)
M29 Stop SD write
M30 Delete file from SD (M30 filename.g)
M31 Output time since last M109 or SD card start to serial
M32 Select file and start SD print (Can be used _while_ printing from SD card files):
M42 Change pin status via gcode Use M42 Px Sy to set pin x to value y, when omitting Px the onboard led will be used.
M80 Turn on Power Supply
M81 Turn off Power Supply
M82 Set E codes absolute (default)
M83 Set E codes relative while in Absolute Coordinates (G90) mode
M84 Disable steppers until next move,or use S to specify an inactivity timeout, after which the steppers will be disabled. S0 to disable the timeout.
M85 Set inactivity shutdown timer with parameter S. To disable set zero (default)
&M92 Set axis_steps_per_unit same syntax as G92
M104 Set extruder target temp
M105 Read current temp
M106 Fan on
M107 Fan off
M109 S## Wait for extruder current temp to reach target temp. Waits only when heating. R## Wait for extruder current temp to reach target temp. Waits when heating and cooling IF AUTOTEMP is enabled, S B F. Exit autotemp by any M109 without F
M112 Emergency stop
M114 Output current position to serial port
M115 Capabilities string
M117 Display message
M119 Output Endstop status to serial port
M126 Solenoid Air Valve Open (BariCUDA support by jmil)
M127 Solenoid Air Valve Closed (BariCUDA vent to atmospheric pressure by jmil)
M128 EtoP Open (BariCUDA EtoP = electricity to air pressure transducer by jmil)
M129 EtoP Closed (BariCUDA EtoP = electricity to air pressure transducer by jmil)
M140 Set bed target temp
M150 Set BlinkM Color Output R: Red<0-255> U(!): Green<0-255> B: Blue<0-255> over i2c, G for green does not work.
M190 S## Wait for bed current temp to reach target temp. Waits only when heating R## Wait for bed current temp to reach target temp. Waits when heating and cooling
M200 D set filament diameter and set E axis units to cubic millimeters (use S0 to set back to millimeters).
M201 Set max acceleration in units/s^2 for print moves (M201 X1000 Y1000)
M202 Set max acceleration in units/s^2 for travel moves (M202 X1000 Y1000) Unused in Marlin!!
M203 Set maximum feedrate that your machine can sustain (M203 X200 Y200 Z300 E10000) in mm/sec
M204 Set default acceleration: S normal moves T filament only moves (M204 S3000 T7000) in mm/sec^2 also sets minimum segment time in ms (B20000) to prevent buffer under-runs and M20 minimum feedrate
M205 Advanced settings: minimum travel speed S=while printing T=travel only, B=minimum segment time X= maximum xy jerk, Z=maximum Z jerk, E=maximum E jerk
M206 Set additional homing offset
M207 Set retract length S[positive mm] F[feedrate mm/min] Z[additional zlift/hop], stays in mm regardless of M200 setting
M208 Set recover=unretract length S[positive mm surplus to the M207 S*] F[feedrate mm/sec]
M209 S<1=true/0=false> enable automatic retract detect if the slicer did not support G10/11: every normal extrude-only move will be classified as retract depending on the direction.
M218 Set hotend offset (in mm): T X Y
M220 S set speed factor override percentage
M221 S set extrude factor override percentage
M226 P S Wait until the specified pin reaches the state required
M240 Trigger a camera to take a photograph
M250 Set LCD contrast C (value 0..63)
M280 Set servo position absolute. P: servo index, S: angle or microseconds
M300 Play beep sound S P
M301 Set PID parameters P I and D
M302 Allow cold extrudes, or set the minimum extrude S.
M303 PID relay autotune S sets the target temperature. (default target temperature = 150C)
M304 Set bed PID parameters P I and D
M400 Finish all moves
M401 Lower z-probe if present
M402 Raise z-probe if present
M404 N Enter the nominal filament width (3mm, 1.75mm ) or will display nominal filament width without parameters
M405 Turn on Filament Sensor extrusion control. Optional D to set delay in centimeters between sensor and extruder
M406 Turn off Filament Sensor extrusion control
M407 Displays measured filament diameter
M500 Stores parameters in EEPROM
M501 Reads parameters from EEPROM (if you need reset them after you changed them temporarily).
M502 Reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to.
M503 Print the current settings (from memory not from EEPROM)
M540 Use S[0|1] to enable or disable the stop SD card print on endstop hit (requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED)
M600 Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal]
M665 Set delta configurations
M666 Set delta endstop adjustment
M605 Set dual x
M700 Turn off print pressure to syringe 0 RMH 10/31/14
M701 Turn on print pressure to syringe 0 RMH 10/31/14
M702 Turn off purge pressure to syringe 0 RMH 10/31/14
M703 Turn on purge pressure to syringe 0 RMH 10/31/14
M750 Turn off vaccuum pump RMH 10/31/14
M751 Turn on vaccuum pump RMH 10/31/14
M907 Set digital trimpot motor current using axis codes.
M908 Control digital trimpot directly.
M350 Set microstepping mode.
M351 Toggle MS1 MS2 pins directly.
Leave Comments