M106 Commands being ignored when executed via Gcode

I can manually turn on M106 codes from both the Host and remote screen, But when I try to turn on the commands via gcode it ignores the commands. I even wrote a very small manual coding to see if it was the gcode but even my little segment gets ignored. I'm trying to use this as TTL commands for a laser. The laser does turn on, but it will not "fire" with gcode. 
M107
M452
G28
M03
M106 S255
G1 X50
G1 Y50
G1 X1
G1 Y1
M106  S125
G1 X50 Y50
G1 X1
G1 X50 Y1
M107
G1 X1 Y1


Firmware settings
#define NUM_EXTRUDER 0
#define MOTHERBOARD 33
#include "pins.h"

// ################## EDIT THESE SETTINGS MANUALLY ################
// ################ END MANUAL SETTINGS ##########################

#undef FAN_PIN
#define FAN_PIN 58
#undef FAN_BOARD_PIN
#define FAN_BOARD_PIN -1
#define BOARD_FAN_SPEED 255
#define FAN_THERMO_PIN -1
#define FAN_THERMO_MIN_PWM 128
#define FAN_THERMO_MAX_PWM 255
#define FAN_THERMO_MIN_TEMP 45
#define FAN_THERMO_MAX_TEMP 60
#define FAN_THERMO_THERMISTOR_PIN -1
#define FAN_THERMO_THERMISTOR_TYPE 1
#undef Z_MIN_PIN
#define Z_MIN_PIN -1
#undef X_MAX_PIN
#define X_MAX_PIN -1
#undef Y_MAX_PIN
#define Y_MAX_PIN -1
#undef Z_MAX_PIN
#define Z_MAX_PIN -1

//#define EXTERNALSERIAL  use Arduino serial library instead of build in. Requires more ram, has only 63 byte input buffer.
// Uncomment the following line if you are using Arduino compatible firmware made for Arduino version earlier then 1.0
// If it is incompatible you will get compiler errors about write functions not being compatible!
//#define COMPAT_PRE1
#define BLUETOOTH_SERIAL  -1
#define BLUETOOTH_BAUD  115200
#define MIXING_EXTRUDER 0

#define DRIVE_SYSTEM 0
#define XAXIS_STEPS_PER_MM 100
#define YAXIS_STEPS_PER_MM 100
#define ZAXIS_STEPS_PER_MM 2287
#define EXTRUDER_FAN_COOL_TEMP 50
#define PDM_FOR_EXTRUDER 0
#define PDM_FOR_COOLER 0
#define DECOUPLING_TEST_MAX_HOLD_VARIANCE 20
#define DECOUPLING_TEST_MIN_TEMP_RISE 1
#define KILL_IF_SENSOR_DEFECT 0
#define RETRACT_ON_PAUSE 2
#define PAUSE_START_COMMANDS ""
#define PAUSE_END_COMMANDS ""
#define SHARED_EXTRUDER_HEATER 0

#define FEATURE_RETRACTION 1
#define AUTORETRACT_ENABLED 0
#define RETRACTION_LENGTH 3
#define RETRACTION_LONG_LENGTH 13
#define RETRACTION_SPEED 40
#define RETRACTION_Z_LIFT 0
#define RETRACTION_UNDO_EXTRA_LENGTH 0
#define RETRACTION_UNDO_EXTRA_LONG_LENGTH 0
#define RETRACTION_UNDO_SPEED 20
#define FILAMENTCHANGE_X_POS 0
#define FILAMENTCHANGE_Y_POS 0
#define FILAMENTCHANGE_Z_ADD  2
#define FILAMENTCHANGE_REHOME 1
#define FILAMENTCHANGE_SHORTRETRACT 5
#define FILAMENTCHANGE_LONGRETRACT 50
#define JAM_STEPS 220
#define JAM_SLOWDOWN_STEPS 320
#define JAM_SLOWDOWN_TO 70
#define JAM_ERROR_STEPS 500
#define JAM_MIN_STEPS 10
#define JAM_ACTION 1

#define RETRACT_DURING_HEATUP true
#define PID_CONTROL_RANGE 20
#define SKIP_M109_IF_WITHIN 2
#define SCALE_PID_TO_MAX 0
#define TEMP_HYSTERESIS 0
#define EXTRUDE_MAXLENGTH 160
#define NUM_TEMPS_USERTHERMISTOR0 0
#define USER_THERMISTORTABLE0 {}
#define NUM_TEMPS_USERTHERMISTOR1 0
#define USER_THERMISTORTABLE1 {}
#define NUM_TEMPS_USERTHERMISTOR2 0
#define USER_THERMISTORTABLE2 {}
#define GENERIC_THERM_VREF 5
#define GENERIC_THERM_NUM_ENTRIES 33
#define HEATER_PWM_SPEED 0

// ############# Heated bed configuration ########################

#define HAVE_HEATED_BED 0
#define HEATED_BED_MAX_TEMP 120
#define SKIP_M190_IF_WITHIN 3
#define HEATED_BED_SENSOR_TYPE 1
#define HEATED_BED_SENSOR_PIN TEMP_1_PIN
#define HEATED_BED_HEATER_PIN HEATER_1_PIN
#define HEATED_BED_SET_INTERVAL 5000
#define HEATED_BED_HEAT_MANAGER 0
#define HEATED_BED_PID_INTEGRAL_DRIVE_MAX 255
#define HEATED_BED_PID_INTEGRAL_DRIVE_MIN 80
#define HEATED_BED_PID_PGAIN_OR_DEAD_TIME   196
#define HEATED_BED_PID_IGAIN   33
#define HEATED_BED_PID_DGAIN 290
#define HEATED_BED_PID_MAX 255
#define HEATED_BED_DECOUPLE_TEST_PERIOD 300000
#define MIN_EXTRUDER_TEMP 150
#define MAXTEMP 275
#define MIN_DEFECT_TEMPERATURE -10
#define MAX_DEFECT_TEMPERATURE 290

// ##########################################################################################
// ##                             Laser configuration                                      ##
// ##########################################################################################

/*
If the firmware is in laser mode, it can control a laser output to cut or engrave materials.
Please use this feature only if you know about safety and required protection. Lasers are
dangerous and can hurt or make you blind!!!

The default laser driver only supports laser on and off. Here you control the eíntensity with
your feedrate. For exchangeable diode lasers this is normally enough. If you need more control
you can set the intensity in a range 0-255 with a custom extension to the driver. See driver.h
and comments on how to extend the functions non invasive with our event system.

If you have a laser - powder system you will like your E override. If moves contain a
increasing extruder position it will laser that move. With this trick you can
use existing fdm slicers to laser the output. Laser width is extrusion width.

Other tools may use M3 and M5 to enable/disable laser. Here G1/G2/G3 moves have laser enabled
and G0 moves have it disables.

In any case, laser only enables while moving. At the end of a move it gets
automatically disabled.
*/

#define SUPPORT_LASER 1
#define LASER_PIN HEATER_2_PIN
#define LASER_ON_HIGH 1

// ##                              CNC configuration                                       ##

/*
If the firmware is in CNC mode, it can control a mill with M3/M4/M5. It works
similar to laser mode, but mill keeps enabled during G0 moves and it allows
setting rpm (only with event extension that supports this) and milling direction.
It also can add a delay to wait for spindle to run on full speed.
*/

#define SUPPORT_CNC 1
#define CNC_WAIT_ON_ENABLE 300
#define CNC_WAIT_ON_DISABLE 0
#define CNC_ENABLE_PIN HEATER_0_PIN
#define CNC_ENABLE_WITH 1
#define CNC_DIRECTION_PIN -1
#define CNC_DIRECTION_CW 1


#define DEFAULT_PRINTER_MODE 2

// ################ Endstop configuration #####################

#define ENDSTOP_PULLUP_X_MIN true
#define ENDSTOP_X_MIN_INVERTING true
#define MIN_HARDWARE_ENDSTOP_X true
#define ENDSTOP_PULLUP_Y_MIN true
#define ENDSTOP_Y_MIN_INVERTING true
#define MIN_HARDWARE_ENDSTOP_Y true
#define ENDSTOP_PULLUP_Z_MIN true
#define ENDSTOP_Z_MIN_INVERTING false
#define MIN_HARDWARE_ENDSTOP_Z false
#define ENDSTOP_PULLUP_X_MAX true
#define ENDSTOP_X_MAX_INVERTING false
#define MAX_HARDWARE_ENDSTOP_X false
#define ENDSTOP_PULLUP_Y_MAX true
#define ENDSTOP_Y_MAX_INVERTING false
#define MAX_HARDWARE_ENDSTOP_Y false
#define ENDSTOP_PULLUP_Z_MAX true
#define ENDSTOP_Z_MAX_INVERTING false
#define MAX_HARDWARE_ENDSTOP_Z false
#define max_software_endstop_r true

#define min_software_endstop_x false
#define min_software_endstop_y false
#define min_software_endstop_z false
#define max_software_endstop_x true
#define max_software_endstop_y true
#define max_software_endstop_z false
#define ENDSTOP_X_BACK_MOVE 5
#define ENDSTOP_Y_BACK_MOVE 5
#define ENDSTOP_Z_BACK_MOVE 2
#define ENDSTOP_X_RETEST_REDUCTION_FACTOR 3
#define ENDSTOP_Y_RETEST_REDUCTION_FACTOR 3
#define ENDSTOP_Z_RETEST_REDUCTION_FACTOR 3
#define ENDSTOP_X_BACK_ON_HOME 1
#define ENDSTOP_Y_BACK_ON_HOME 1
#define ENDSTOP_Z_BACK_ON_HOME 0
#define ALWAYS_CHECK_ENDSTOPS 1

// ################# XYZ movements ###################

#define X_ENABLE_ON 0
#define Y_ENABLE_ON 0
#define Z_ENABLE_ON 0
#define DISABLE_X 0
#define DISABLE_Y 0
#define DISABLE_Z 0
#define DISABLE_E 0
#define INVERT_X_DIR 0
#define INVERT_Y_DIR 0
#define INVERT_Z_DIR 0
#define X_HOME_DIR -1
#define Y_HOME_DIR -1
#define Z_HOME_DIR 1
#define X_MAX_LENGTH 675
#define Y_MAX_LENGTH 400
#define Z_MAX_LENGTH 200
#define X_MIN_POS 0
#define Y_MIN_POS 0
#define Z_MIN_POS 0
#define DISTORTION_CORRECTION 0
#define DISTORTION_CORRECTION_POINTS 5
#define DISTORTION_CORRECTION_R 100
#define DISTORTION_PERMANENT 1
#define DISTORTION_UPDATE_FREQUENCY 15
#define DISTORTION_START_DEGRADE 0.5
#define DISTORTION_END_HEIGHT 1
#define DISTORTION_EXTRAPOLATE_CORNERS 0
#define DISTORTION_XMIN 10
#define DISTORTION_YMIN 10
#define DISTORTION_XMAX 190
#define DISTORTION_YMAX 190

// ##########################################################################################
// ##                           Movement settings                                          ##
// ##########################################################################################

#define FEATURE_BABYSTEPPING 1
#define BABYSTEP_MULTIPLICATOR 1

#define DELTA_SEGMENTS_PER_SECOND_PRINT 180 // Move accurate setting for print moves
#define DELTA_SEGMENTS_PER_SECOND_MOVE 70 // Less accurate setting for other moves
#define EXACT_DELTA_MOVES 1

// Delta settings
#define DELTA_HOME_ON_POWER 0

#define DELTASEGMENTS_PER_PRINTLINE 24
#define STEPPER_INACTIVE_TIME 360L
#define MAX_INACTIVE_TIME 0L
#define MAX_FEEDRATE_X 200
#define MAX_FEEDRATE_Y 200
#define MAX_FEEDRATE_Z 2
#define HOMING_FEEDRATE_X 40
#define HOMING_FEEDRATE_Y 40
#define HOMING_FEEDRATE_Z 2
#define HOMING_ORDER HOME_ORDER_ZXY
#define ZHOME_MIN_TEMPERATURE 0
#define ZHOME_HEAT_ALL 1
#define ZHOME_HEAT_HEIGHT 20
#define ZHOME_X_POS 999999
#define ZHOME_Y_POS 999999
#define ENABLE_BACKLASH_COMPENSATION 0
#define X_BACKLASH 0
#define Y_BACKLASH 0
#define Z_BACKLASH 0
#define RAMP_ACCELERATION 1
#define STEPPER_HIGH_DELAY 0
#define DIRECTION_DELAY 0
#define STEP_DOUBLER_FREQUENCY 12000
#define ALLOW_QUADSTEPPING 1
#define DOUBLE_STEP_DELAY 0 // time in microseconds
#define MAX_ACCELERATION_UNITS_PER_SQ_SECOND_X 1000
#define MAX_ACCELERATION_UNITS_PER_SQ_SECOND_Y 1000
#define MAX_ACCELERATION_UNITS_PER_SQ_SECOND_Z 100
#define MAX_TRAVEL_ACCELERATION_UNITS_PER_SQ_SECOND_X 100
#define MAX_TRAVEL_ACCELERATION_UNITS_PER_SQ_SECOND_Y 100
#define MAX_TRAVEL_ACCELERATION_UNITS_PER_SQ_SECOND_Z 100
#define INTERPOLATE_ACCELERATION_WITH_Z 0
#define ACCELERATION_FACTOR_TOP 100
#define MAX_JERK 20
#define MAX_ZJERK 0.3
#define PRINTLINE_CACHE_SIZE 16
#define MOVE_CACHE_LOW 10
#define LOW_TICKS_PER_MOVE 250000
#define EXTRUDER_SWITCH_XY_SPEED 100
#define DUAL_X_AXIS 0
#define FEATURE_TWO_XSTEPPER 0
#define X2_STEP_PIN   ORIG_E1_STEP_PIN
#define X2_DIR_PIN    ORIG_E1_DIR_PIN
#define X2_ENABLE_PIN ORIG_E1_ENABLE_PIN
#define FEATURE_TWO_YSTEPPER 0
#define Y2_STEP_PIN   ORIG_E1_STEP_PIN
#define Y2_DIR_PIN    ORIG_E1_DIR_PIN
#define Y2_ENABLE_PIN ORIG_E1_ENABLE_PIN
#define FEATURE_TWO_ZSTEPPER 0
#define Z2_STEP_PIN   ORIG_E1_STEP_PIN
#define Z2_DIR_PIN    ORIG_E1_DIR_PIN
#define Z2_ENABLE_PIN ORIG_E1_ENABLE_PIN
#define FEATURE_THREE_ZSTEPPER 0
#define Z3_STEP_PIN   ORIG_E2_STEP_PIN
#define Z3_DIR_PIN    ORIG_E2_DIR_PIN
#define Z3_ENABLE_PIN ORIG_E2_ENABLE_PIN
#define FEATURE_DITTO_PRINTING 0
#define USE_ADVANCE 0
#define ENABLE_QUADRATIC_ADVANCE 0


// ################# Misc. settings ##################

#define BAUDRATE 115200
#define ENABLE_POWER_ON_STARTUP 1
#define POWER_INVERTING 0
#define KILL_METHOD 1
#define ACK_WITH_LINENUMBER 1
#define WAITING_IDENTIFIER "wait"
#define ECHO_ON_EXECUTE 1
#define EEPROM_MODE 1
#undef PS_ON_PIN
#define PS_ON_PIN ORIG_PS_ON_PIN
#define JSON_OUTPUT 0
#define FEATURE_WATCHDOG 0
#ifndef SDSUPPORT  // Some boards have sd support on board. These define the values already in pins.h
#define SDSUPPORT 0
#undef SDCARDDETECT
#define SDCARDDETECT -1
#define SDCARDDETECTINVERTED 0
#define SD_EXTENDED_DIR 1 /** Show extended directory including file length. Don't use this with Pronterface! */
#define SD_RUN_ON_STOP ""
#define SD_STOP_HEATER_AND_MOTORS_ON_STOP 1
#define ARC_SUPPORT 1
#define FEATURE_MEMORY_POSITION 1
#define FEATURE_CHECKSUM_FORCED 0
#define FEATURE_FAN_CONTROL 1
#define FEATURE_FAN2_CONTROL 0
#define FEATURE_CONTROLLER 11
#define ADC_KEYPAD_PIN -1
#define LANGUAGE_EN_ACTIVE 1
#define LANGUAGE_DE_ACTIVE 0
#define LANGUAGE_NL_ACTIVE 0
#define LANGUAGE_PT_ACTIVE 0
#define LANGUAGE_IT_ACTIVE 0
#define LANGUAGE_ES_ACTIVE 0
#define LANGUAGE_FI_ACTIVE 0
#define LANGUAGE_SE_ACTIVE 0
#define LANGUAGE_FR_ACTIVE 0
#define LANGUAGE_CZ_ACTIVE 0
#define LANGUAGE_PL_ACTIVE 0
#define LANGUAGE_TR_ACTIVE 0
#define UI_PRINTER_NAME "MPCNC"
#define UI_PRINTER_COMPANY "Matt Robison"
#define UI_PAGES_DURATION 4000
#define UI_ANIMATION 0
#define UI_SPEEDDEPENDENT_POSITIONING 0
#define UI_DISABLE_AUTO_PAGESWITCH 1
#define UI_AUTORETURN_TO_MENU_AFTER 10000
#define FEATURE_UI_KEYS 0
#define UI_ENCODER_SPEED 2
#define UI_REVERSE_ENCODER 0
#define UI_KEY_BOUNCETIME 10
#define UI_KEY_FIRST_REPEAT 500
#define UI_KEY_REDUCE_REPEAT 50
#define UI_KEY_MIN_REPEAT 50
#define FEATURE_BEEPER 0
#define CASE_LIGHTS_PIN -1
#define CASE_LIGHT_DEFAULT_ON 1
#define UI_START_SCREEN_DELAY 1000
#define UI_DYNAMIC_ENCODER_SPEED 1
        /**
Beeper sound definitions for short beeps during key actions
and longer beeps for important actions.
Parameter is delay in microseconds and the secons is the number of repetitions.
Values must be in range 1..255
*/
#define BEEPER_SHORT_SEQUENCE 2,2
#define BEEPER_LONG_SEQUENCE 8,8
#define UI_SET_PRESET_HEATED_BED_TEMP_PLA 60
#define UI_SET_PRESET_EXTRUDER_TEMP_PLA   190
#define UI_SET_PRESET_HEATED_BED_TEMP_ABS 110
#define UI_SET_PRESET_EXTRUDER_TEMP_ABS   240
#define UI_SET_MIN_HEATED_BED_TEMP  30
#define UI_SET_MAX_HEATED_BED_TEMP 120
#define UI_SET_MIN_EXTRUDER_TEMP   170
#define UI_SET_MAX_EXTRUDER_TEMP   260
#define UI_SET_EXTRUDER_FEEDRATE 2
#define UI_SET_EXTRUDER_RETRACT_DISTANCE 3


#define NUM_MOTOR_DRIVERS 0




Comments

  • Fan PWM is so slow that it is unusable for a laser. It would be much better to just control feedrate in this case. For PWM you need a hardware PWM to get enough signals per second (fan has ca. 15Hz). The right solution would be to add a laser event to set the pwm then. This is already supported so that you can set intensity while enabling laser.

    BTW: There is no difference between online gcode and code gcode. So it is the combination of gcodes and maybe the timing. If you are using older firmware (0.91) the fan signals are not in sync. With laser mode you can not use fan. Both use the same variable to set it, whcih I guess is your real problem.
  • Ok I'll have to dig in to properly setting the laser PWM, Thank you
  • Ok after playing around with the settings I decided to try a few different things. I'm using the latest Repetier firmware.

    A few things about my machine, I'm currently using D9 as the 12 V input for my laser, this controls the power on and acts as a safety feature to keep the laser from accidentally being fired. I'm trying to use a voltage modulated output (D58) to control the intensity of the laser (3.8w).

    In a perfect world M106 S127 G1 X50  Y50  Should activate the laser at half power and lase to position. Below is more trial and error

    Solution 1. I provided 12 V to the laser and kept the machine in CNC mode ( I also tried FFF) and tired to run the code. The only thing I got was movement, No indication of fan ( Laser Power) change in any mode. Failure

    Solution 2 I tried changing pins once again from 58 to 44. Was able to verify voltage and change, that's when I noticed voltage transition was not solid it kept bouncing back to 5 V. So M106 S127 would show 2.5V but it would keep bouncing back to 5 V then back to 2.5 and so on under manual control, still no change. 

    Solution 3. With Extreme reluctance I installed Marlin on the machine just to verify if I could get solution 2 to work properly. I was able to get a solid 2.5 V at M106 S127. There was no voltage bouncing on the pin. The output of the laser was smooth and steady from M106 S1 all the way to M106 S255. I have not tried to see how this works in conjunction with X Y movements yet. First I have to re-learn how to work with Marlin, I've been using your firmware for 3 years and have come quite familiar with it.

    The bottom line: 2 problems
    Problem 1: I still can't get the machine to acknowledge the laser intensity (fan) commands by code I still have to manually change it. Mode (FFF,CNC,LAS) does not affect it.

    Problem 2:  The voltage output of D58 is not smooth so the laser intensity looks like Morris Code instead of smooth output.
  • I forgot to mention, when I take TTL out of the equation, and use a vectored solution instead of raster output it works as advertised,using solely M03 M05 with G1 movements for Full power lasing. I'm trying to use a raster output.
  • You should be able to run solution 1 in FFF mode. Then M106 is move compatible, but you have some start move delays so it burns sometimes longer then intended. But power control is possible.

    Don't know Morris Code but as I said PWM is 15,25hz by default in firmware so this is too slow for average voltage creation.

    The only real solution is to use laser mode and add the event for setting intensity and set a hardware pwm pin to pwm frequency.
  • I'd like to make a short video about it, maybe I am going crazy, they do say a picture says thousand words. Maybe all those laser fumes, but I swear up and down it's not working as it should.

    I do not know the specifics but constant analog voltage is possible. The specifics of the install of the laser can be found here
    http://www.vicious1.com/the-2-8-watt-100-laser/ The last page even has a picture of the output. It's 8 bit grey-scale raster output using variable output power not federate. You can watch a video of it in action here They are using marlin, I verified the solid analog voltage output by both multi meter and laser.(solution 3).

    I've really enjoyed using your software and firmware, I know you work very hard on it and take lots of pride, I can see it in the output. Thank you for you time and patience and entertaining the numerous idiots out there like me,
  • PWM to "constant" voltage can only be done with capacitors making output smooth. But you will need a minimum pwm frequency for it to work. Search config for HEATER_PWM_SPEED best in config tool. You can increase it up to 60Hz which should allow smoothing.  At least it would be 4 times as smooth as without. Then fan control in FFF mode would do what you want I guess. You could also set fan mode to PDM instead of PWM which makes even more signal switches if possible. 50% power would be 3906/2 Hz in that case, but 1 would map to 60Hz back again.

  • "I did some digging and I found this "marlin uses 490 hz PWM to control laser grey-scale" "Pwm,phase correct" I tried first on pin 58 on a ramps 1.4 didn't have any luck, I went with the recommended pin 44 and it works as it should. According to the Ramps Wiki Pin 44 is a Digital pin only. I don't know how to modify PWM in Repetier yet, but I'm going to keep digging. 

    Looking at other setting for  HEATER_PWM_SPEED the Max Hz is 122.06 (3) that's less than 1/4 output of marlin. So how are they doing it ? I'll try running it at 122 and see if there's a noticeable difference. 

    So just installing marlin on my machine is able to make the raster images, with what was discussed earlier. 

    In a since it's crippling my machine just running marlin on it, the tool chain I've been using is with geared towards Repetier in addition to the more important Vectored CNC actions that I use the machine for on a regular basis. So I'm going to keep working at trying to get the raster output on the laser as a side project. 
  • They used hardware PWM for intensity. This is what I always say you can do. See driver code


    void LaserDriver::initialize()
    {
        if(EVENT_INITALIZE_LASER)
        {
    #if LASER_PIN > -1
            SET_OUTPUT(LASER_PIN);
        }
        changeIntensity(0);
    }
    void LaserDriver::changeIntensity(uint8_t newIntensity)
    {
        if(EVENT_SET_LASER(newIntensity))
        {
            // Default implementation
    #if LASER_PIN > -1
            WRITE(LASER_PIN,(LASER_ON_HIGH ? newIntensity > 199 : newIntensity < 200));
        }
    }

    So set 
    EVENT_SET_LASER to call your set intensity function and return false. All this function has to do is setting the pwm speed for your pin. Similar set EVENT_INITALIZE_LASER to initalize pin and set it off. The reason why I did not do it is that you need a unused pin with PWM that is not used by firmware (0-2 or 3 = sound beeper) are used and this differs from board to board. On AVR systems timer 4 and 5 should be usable. It could be as easy as using arduino analogWrite but I'm not sure what frequency they use.
  • I appologize for the confusion when I think hardware PWM, I think in addition to current hardware, something else that I have to add to get the desired results.

    this is going to sound silly, but this isn't cut and paste in driver.h is it I need to modify the code correct ? 
  • Yes, read event.h file on how to extend event system. What I showed is the laser implementation to show you how to extend it with events to reach your desired result.

    hardware pwm means using the AVR hardware capability to toggle a pin without software interference, so higher rates do not cause more cpu load.
Sign In or Register to comment.