farmbot-arduino-firmware/README.md

402 lines
18 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

farmbot-arduino-firmware
==========================
This software is responsible for receiving G-Codes from the Raspberry Pi, executing them, and reporting back the results.
Technicals
==========================
Created with eclipseArduino V2 - For more details see http://www.baeyens.it/eclipse/
Development build instructions
==========================
**This firmware is automatically bundled into [FarmBot OS](https://github.com/FarmBot/farmbot_os).
The following instructions are for isolated Arduino development only.**
**NOTE:** We tag releases when they are stable. The latest version (on master) is not guaranteed to be stable.
See [releases](https://github.com/FarmBot/farmbot-arduino-firmware/releases) to find a stable release.
**OPTION A:** For less stable "edge" version:
```
git clone https://github.com/FarmBot/farmbot-arduino-firmware
```
**OPTION B:** For stable release v6.4.2:
```
git clone -b 'v6.4.2' --single-branch https://github.com/FarmBot/farmbot-arduino-firmware
```
Options for compiling and uploading:
* [Arduino IDE](https://www.arduino.cc/en/main/software):
* Open `farmbot-arduino-firmware/src/src.ino`.
* Select the `Mega 2560` board in _Tools_ > _Board_.
* Uncomment only the desired board in `src/Board.h`.
* To compile and flash the firmware onto the device:
* Connect a device via USB.
* Select _Sketch_ > _Upload_ or click the _upload_ button.
* To compile without flashing:
* Select _Sketch_ > _Export compiled binary_.
* The `.hex` file will save to the `src` directory.
* Make (Linux)
* [Download the Arduino 1.8.12 IDE](https://www.arduino.cc/download_handler.php?f=/arduino-1.8.12-linux64.tar.xz) and unpack to the `/home` directory.
* `cd farmbot-arduino-firmware`
* To compile:
* `make`
* `.hex` files for each board type will save to the `bin` directory.
* VSCode
* Set Arduino path and board type.
* To compile and flash the firmware onto the device:
* Connect a device via USB.
* Select _Arduino: Upload_.
Software overview
=================
All files are in `/src`
`src.ino` contains the setup() and main loop(). This is the main sequence:
```
+--------------------------+
|farmbot_arduino_controller|
+-----------+--------------+
v
+--------------------------+
|Command |
+-----------+--------------+
v
+--------------------------+
|GCodeProcessor |
+-----------+--------------+
v
+--------------------------+
|***Handler |
+-------+-----------+------+
| |
| |
v v
+--------+ +-----------+
|Movement| | PinControl|
+--------+ +-----------+
```
Board Feature Overview
======================
| board | kit | pin encoders | SPI encoders | SPI motors | SPI stall detection |
|:----------------- |:------------ |:------------:|:------------:|:----------:|:-------------------:|
| RAMPS_V14 | Genesis v1.2 | x | | | |
| FARMDUINO_V10 | Genesis v1.3 | x | | | |
| FARMDUINO_V14 | Genesis v1.4 | | x | | |
| FARMDUINO_V30 | Genesis v1.5 | | x | x | |
| FARMDUINO_EXP_V20 | Express v1.0 | | | x | x |
Codes used for communication
============================
IMPORTANT
---------
Farmbot will NOT move until the configuration has been approved.
To approve manually, send 'F22 P2 V1 Q0'
To move, use the command 'G00 X0 Y0 Z0 Q0' where you type in the coordinates just after X, Y and Z.
G-Codes
-------
### Codes sent to the arduino
Code type|Number|Parameters|Function
---------|------|----------|--------
_G_ | | |_G-Code, the codes working the same as a 3D printer_
G |00 |X Y Z A B C|Move to location at given speed for axis (don't have to be a straight line), in absolute coordinates
G |01 |X Y Z A B C|Move to location on a straight line (not implemented)
G |28 | |Move home all axis (Z, Y, X axis order)
_F_ | | |_Farm commands, commands specially added for FarmBot_
F |01 |T |Dose amount of water using time in millisecond (not implemented)
F |02 |N |Dose amount of water using flow meter that measures pulses (not implemented)
F |09 | |Reset emergency stop
F |11 | |Home X axis (find 0, 3 attempts) __*__
F |12 | |Home Y axis (find 0, 3 attempts) __*__
F |13 | |Home Z axis (find 0, 3 attempts) __*__
F |14 | |Calibrate X axis (measure length + find 0) __*__
F |15 | |Calibrate Y axis (measure length + find 0) __*__
F |16 | |Calibrate Z axis (measure length + find 0) __*__
F |20 | |List all parameters and value
F |21 |P |Read parameter
F |22 |P V |Write parameter
F |23 |P V |Update parameter (during calibration)
F |31 |P |Read status (not enabled)
F |32 |P V |Write status (not enabled)
F |41 |P V M |Set a value V on an arduino pin in mode M (digital=0/analog=1)
F |42 |P M |Read a value from an arduino pin P in mode M (digital=0/analog=1)
F |43 |P M |Set the I/O mode M (input=0/output=1) of a pin P in arduino
F |44 |P V W T M |Set the value V on an arduino pin P, wait for time T in milliseconds, set value W on the arduino pin P in mode M (digital=0/analog=1)
F |51 |E P V |Set a value on the tool mount with I2C (not implemented)
F |52 |E P |Read value from the tool mount with I2C (not implemented)
F |61 |P V |Set the servo on the pin P (only pins 4, 5, 6, and 11) to the requested angle V
F |81 | |Report end stop
F |82 | |Report current position
F       |83   |         |Report software version
F       |84    |X Y Z     |Set axis current position to zero (yes=1/no=0)
E       |     |          |Emergency stop
__*__ Requires the use of encoders or end stops.
### Codes received from the arduino
Code type|Number|Parameters |Function
---------|------|-----------------|--------
_R_ | | |_Report messages_
R |00 | |Idle
R |01 | |Current command started
R |02 | |Current command finished successfully
R |03 |V |Current command finished with error
R |04 | |Current command running
R |05 |X Y Z |Report motor/axis state
R |06 |X Y Z |Report calibration state during execution
R |07 | |Retry movement
R |08 | |Command echo
R |09 | |Command invalid
R |11 | |X axis homing complete
R |12 | |Y axis homing complete
R |13 | |Z axis homing complete
R |15 | X |Firmware used a different X coordinate than given in move command
R |16 | Y |Firmware used a different Y coordinate than given in move command
R |17 | Z |Firmware used a different Z coordinate than given in move command
R |20 | |Report all paramaters complete
R |21 |P V |Report parameter value
R |23 |P V |Report updated parameter (during calibration)
R |31 |P V |Report status value (not enabled)
R |41 |P V |Report pin value
R |71 | |X axis timeout
R |72 | |Y axis timeout
R |73 | |Z axis timeout
R |81 |XA XB YA YB ZA ZB|Report end stops
R |82 |X Y Z |Report current position
R |83 | |Report software version
R |84 |X Y Z |Report encoder position scaled
R |85 |X Y Z |Report encoder position raw
R |87 | |Emergency lock
R |88 | |No config (see [configuration approval](#important))
R |89 |X Y Z |Report axis motor load (TMC2130) (not enabled)
R |99 | |Debug message
Error codes (R03)
-----------------
Value |Description
------|------------
0 |No error
1 |Emergency stop
2 |Timeout
3 |Stall detected
4 |Calibration error
14 |Invalid command
15 |No config
Axis states (R05)
-----------------
The state is reported for each axis individually, using the prefix X, Y or Z
Value |Description
------|------------
0 |Idle
1 |Starting motor
2 |Accelerating
3 |Cruising
4 |Decelerating
5 |Stopping motor
6 |Crawling
Calibration states (R06)
------------------------
The status for calibration is also reported for the axis that is calibrating
Value |Description
------|------------
0 |Idle
1 |Moving to home
2 |Moving to end
Parameters for commands
-----------------------
Parameters|Description |Unit of Measurement
----------|-----------------------|-------------------
X |X movement |millimeters
Y |Y movement |millimeters
Z |Z movement |millimeters
A |X speed |steps/second
B |Y speed |steps/second
C |Z speed |steps/second
Q |Queue number |#
T |Time |seconds
N |Number |#
P |Parameter/pin number |#
V |Value number |#
W |Secondary value |#
E |Element (in tool mount)|#
M |Mode (set pin mode) |0 = output / 1 = input
M |Mode (read/write) |0 = digital / 1 = analog
XA |End stop 1 on x axis |0/1
XB |End stop 2 on x axis |0/1
YA |End stop 1 on y axis |0/1
YB |End stop 2 on y axis |0/1
ZA |End stop 1 on z axis |0/1
ZB |End stop 2 on z axis |0/1
Arduino parameter numbers
------------------------
ID | Name | Unit | Notes
----| ----------------------------------| ----------| ---------------------------------------
2 | PARAM_CONFIG_OK | 0 / 1 |
3 | PARAM_USE_EEPROM | 0 / 1 |
4 | PARAM_E_STOP_ON_MOV_ERR | 0 / 1 |
5 | PARAM_MOV_NR_RETRY | integer |
11 | MOVEMENT_TIMEOUT_X | seconds |
12 | MOVEMENT_TIMEOUT_Y | seconds |
13 | MOVEMENT_TIMEOUT_Z | seconds |
15 | MOVEMENT_KEEP_ACTIVE_X | 0 / 1 |
16 | MOVEMENT_KEEP_ACTIVE_Y | 0 / 1 |
17 | MOVEMENT_KEEP_ACTIVE_Z | 0 / 1 |
18 | MOVEMENT_HOME_AT_BOOT_X | 0 / 1 |
19 | MOVEMENT_HOME_AT_BOOT_Y | 0 / 1 |
20 | MOVEMENT_HOME_AT_BOOT_Z | 0 / 1 |
21 | MOVEMENT_INVERT_ENDPOINTS_X | 0 / 1 | switch ends
22 | MOVEMENT_INVERT_ENDPOINTS_Y | 0 / 1 | switch ends
23 | MOVEMENT_INVERT_ENDPOINTS_Z | 0 / 1 | switch ends
25 | MOVEMENT_ENABLE_ENDPOINTS_X | 0 / 1 |
26 | MOVEMENT_ENABLE_ENDPOINTS_Y | 0 / 1 |
27 | MOVEMENT_ENABLE_ENDPOINTS_Z | 0 / 1 |
31 | MOVEMENT_INVERT_MOTOR_X | 0 / 1 |
32 | MOVEMENT_INVERT_MOTOR_Y | 0 / 1 |
33 | MOVEMENT_INVERT_MOTOR_Z | 0 / 1 |
36 | MOVEMENT_SECONDARY_MOTOR_X | 0 / 1 |
37 | MOVEMENT_SECONDARY_MOTOR_INVERT_X | 0 / 1 |
41 | MOVEMENT_STEPS_ACC_DEC_X | steps |
42 | MOVEMENT_STEPS_ACC_DEC_Y | steps |
43 | MOVEMENT_STEPS_ACC_DEC_Z | steps |
45 | MOVEMENT_STOP_AT_HOME_X | 0 / 1 |
46 | MOVEMENT_STOP_AT_HOME_Y | 0 / 1 |
47 | MOVEMENT_STOP_AT_HOME_Z | 0 / 1 |
51 | MOVEMENT_HOME_UP_X | 0 / 1 |
52 | MOVEMENT_HOME_UP_Y | 0 / 1 |
53 | MOVEMENT_HOME_UP_Z | 0 / 1 |
55 | MOVEMENT_STEP_PER_MM_X | steps |
56 | MOVEMENT_STEP_PER_MM_Y | steps |
57 | MOVEMENT_STEP_PER_MM_Z | steps |
61 | MOVEMENT_MIN_SPD_X | steps/s |
62 | MOVEMENT_MIN_SPD_Y | steps/s |
63 | MOVEMENT_MIN_SPD_Z | steps/s |
65 | MOVEMENT_HOME_SPD_X | steps/s |
66 | MOVEMENT_HOME_SPD_Y | steps/s |
67 | MOVEMENT_HOME_SPD_Z | steps/s |
71 | MOVEMENT_MAX_SPD_X | steps/s |
72 | MOVEMENT_MAX_SPD_Y | steps/s |
73 | MOVEMENT_MAX_SPD_Z | steps/s |
75 | MOVEMENT_INVERT_2_ENDPOINTS_X | 0 / 1 | switch NO and NC
76 | MOVEMENT_INVERT_2_ENDPOINTS_Y | 0 / 1 | switch NO and NC
77 | MOVEMENT_INVERT_2_ENDPOINTS_Z | 0 / 1 | switch NO and NC
81 | MOVEMENT_MOTOR_CURRENT_X | milliamps | TMC2130 only
82 | MOVEMENT_MOTOR_CURRENT_Y | milliamps | TMC2130 only
83 | MOVEMENT_MOTOR_CURRENT_Z | milliamps | TMC2130 only
85 | MOVEMENT_STALL_SENSITIVITY_X | integer | Express only
86 | MOVEMENT_STALL_SENSITIVITY_Y | integer | Express only
87 | MOVEMENT_STALL_SENSITIVITY_Z | integer | Express only
91 | MOVEMENT_MICROSTEPS_X | integer | TMC2130 only
92 | MOVEMENT_MICROSTEPS_Y | integer | TMC2130 only
93 | MOVEMENT_MICROSTEPS_Z | integer | TMC2130 only
101 | ENCODER_ENABLED_X | 0 / 1 | enables stall detection on Express
102 | ENCODER_ENABLED_Y | 0 / 1 | enables stall detection on Express
103 | ENCODER_ENABLED_Z | 0 / 1 | enables stall detection on Express
105 | ENCODER_TYPE_X | 0 | differential channels disabled
106 | ENCODER_TYPE_Y | 0 | differential channels disabled
107 | ENCODER_TYPE_Z | 0 | differential channels disabled
111 | ENCODER_MISSED_STEPS_MAX_X | steps |
112 | ENCODER_MISSED_STEPS_MAX_Y | steps |
113 | ENCODER_MISSED_STEPS_MAX_Z | steps |
115 | ENCODER_SCALING_X | integer | `10000*motor/encoder` (except Express)
116 | ENCODER_SCALING_Y | integer | `10000*motor/encoder` (except Express)
117 | ENCODER_SCALING_Z | integer | `10000*motor/encoder` (except Express)
121 | ENCODER_MISSED_STEPS_DECAY_X | steps | 1-99
122 | ENCODER_MISSED_STEPS_DECAY_Y | steps | 1-99
123 | ENCODER_MISSED_STEPS_DECAY_Z | steps | 1-99
125 | ENCODER_USE_FOR_POS_X | 0 / 1 | except Express
126 | ENCODER_USE_FOR_POS_Y | 0 / 1 | except Express
127 | ENCODER_USE_FOR_POS_Z | 0 / 1 | except Express
131 | ENCODER_INVERT_X | 0 / 1 | except Express
132 | ENCODER_INVERT_Y | 0 / 1 | except Express
133 | ENCODER_INVERT_Z | 0 / 1 | except Express
141 | MOVEMENT_AXIS_NR_STEPS_X | steps | 0 = limit disabled
142 | MOVEMENT_AXIS_NR_STEPS_Y | steps | 0 = limit disabled
143 | MOVEMENT_AXIS_NR_STEPS_Z | steps | 0 = limit disabled
145 | MOVEMENT_STOP_AT_MAX_X | 0 / 1 |
146 | MOVEMENT_STOP_AT_MAX_Y | 0 / 1 |
147 | MOVEMENT_STOP_AT_MAX_Z | 0 / 1 |
201 | PIN_GUARD_1_PIN_NR | integer |
202 | PIN_GUARD_1_TIME_OUT | seconds |
203 | PIN_GUARD_1_ACTIVE_STATE | 0 / 1 |
205 | PIN_GUARD_2_PIN_NR | integer |
206 | PIN_GUARD_2_TIME_OUT | seconds |
207 | PIN_GUARD_2_ACTIVE_STATE | 0 / 1 |
211 | PIN_GUARD_3_PIN_NR | integer |
212 | PIN_GUARD_3_TIME_OUT | seconds |
213 | PIN_GUARD_3_ACTIVE_STATE | 0 / 1 |
215 | PIN_GUARD_4_PIN_NR | integer |
216 | PIN_GUARD_4_TIME_OUT | seconds |
217 | PIN_GUARD_4_ACTIVE_STATE | 0 / 1 |
221 | PIN_GUARD_5_PIN_NR | integer |
222 | PIN_GUARD_5_TIME_OUT | seconds |
223 | PIN_GUARD_5_ACTIVE_STATE | 0 / 1 |
Pin Numbering
-------------
### RAMPS 1.4 (for other boards, see [/src/pins.h](/src/pins.h))
Tag |Pin Nr|Comment
-----------------|------|-------
X_STEP_PIN | 54 | X axis step signal
X_DIR_PIN | 55 | X axis direction choice
X_ENABLE_PIN | 38 | X axis enable
X_MIN_PIN | 3 | X axis end stop at home position
X_MAX_PIN | 2 | X axis end stop at far position
X_ENCDR_A | 16 | X axis encoder A channel
X_ENCDR_B | 17 | X axis encoder B channel
X_ENCDR_A_Q | 31 | X axis encoder A channel for quarature (not implemented)
X_ENCDR_B_Q | 33 | X axis encoder B channel for quarature (not implemented)
Y_STEP_PIN | 60 | Y axis step signal
Y_DIR_PIN | 61 | Y axis direction choice
Y_ENABLE_PIN | 56 | Y axis enable
Y_MIN_PIN | 14 | Y axis end stop at home position
Y_MAX_PIN | 15 | Y axis end stop at far position
Y_ENCDR_A | 23 | Y axis encoder A channel
Y_ENCDR_B | 25 | Y axis encoder B channel
Y_ENCDR_A_Q | 35 | Y axis encoder A channel for quarature (not implemented)
Y_ENCDR_B_Q | 37 | Y axis encoder B channel for quarature (not implemented)
Z_STEP_PIN | 46 | Z axis step signal
Z_DIR_PIN | 48 | Z axis direction choice
Z_ENABLE_PIN | 62 | Z axis enable
Z_MIN_PIN | 18 | Z axis end stop at home position
Z_MAX_PIN | 19 | Z axis end stop at far position
Z_ENCDR_A | 27 | Z axis encoder A channel
Z_ENCDR_B | 29 | Z axis encoder B channel
Z_ENCDR_A_Q | 39 | Z axis encoder A channel for quarature (not implemented)
Z_ENCDR_B_Q | 41 | Z axis encoder B channel for quarature (not implemented)
LED_PIN | 13 | on board LED
FAN_PIN | 9 | RAMPS board fan pin
HEATER_0_PIN | 10 | RAMPS board heating pin 0
HEATER_1_PIN | 8 | RAMPS board heating pin 1
SERVO_0_PIN | 4 | Servo motor 0 signal pin
SERVO_1_PIN | 5 | Servo motor 1 signal pin
SERVO_2_PIN | 6 | Servo motor 2 signal pin
SERVO_3_PIN | 11 | Servo motor 3 signal pin