Tim Evers 2020-03-06 19:01:46 +01:00
commit c1bf9d659c
18 changed files with 367 additions and 203 deletions

View File

@ -0,0 +1,46 @@
version: 2.1
jobs:
build:
machine: true
parameters:
arduino_version:
description: "Arduino version"
default: "1.8.11"
type: string
steps:
- checkout
- restore_cache:
keys:
- arduino-<< parameters.arduino_version >>
- run:
name: Install Arduino
command: |
if [ ! -d "$HOME/arduino-<< parameters.arduino_version >>" ]
then
wget https://downloads.arduino.cc/arduino-<< parameters.arduino_version >>-linux64.tar.xz
tar xf arduino-<< parameters.arduino_version >>-linux64.tar.xz -C $HOME
fi
- save_cache:
key: arduino-<< parameters.arduino_version >>
paths:
- ~/arduino-<< parameters.arduino_version >>
- run:
name: Compile
command: make
- run:
name: Check strings
command: make strings_test
- run:
name: Check software version
command: |
export SOFTWARE_VERSION=$(cat src/Config.h | grep -w SOFTWARE_VERSION | cut -d'"' -f 2 | cut -d'\' -f 1)
strings bin/arduino_firmware.hex.bin | grep $SOFTWARE_VERSION
export SHORT_COMMIT_SHA=$(echo $CIRCLE_SHA1 | cut -c1-8)
export COMMIT_SUFFIX=$(strings bin/arduino_firmware.hex.bin | grep $SHORT_COMMIT_SHA)
export NEW_FW_DIR=bin/$SOFTWARE_VERSION$COMMIT_SUFFIX
mkdir $NEW_FW_DIR
rm bin/*.bin
mv bin/*.hex $NEW_FW_DIR
- store_artifacts:
path: bin

1
.gitignore vendored
View File

@ -43,3 +43,4 @@ bin
src.ino.cpp
src.ino.mega.hex
src.ino.with_bootloader.mega.hex
src/CommitSHA.h

View File

@ -8,11 +8,16 @@ FBARDUINO_FIRMWARE_LIB_BUILD_DIR ?= $(BUILD_DIR)/libraries
ARDUINO_INSTALL_DIR ?= $(HOME)/arduino-1.8.11
# Get current commit SHA
COMMIT_SHA := $(shell git -C $(FBARDUINO_FIRMWARE_SRC_DIR)/.. rev-parse --short=8 HEAD)
MODIFIER := $(shell echo $$(if [ -z "$$(git -C $(FBARDUINO_FIRMWARE_SRC_DIR)/.. status -s -uall)" ];then echo "";else echo "+";fi))
CREATE_COMMIT_SHA_H := $(shell echo "\#ifndef COMMIT_SHA_H_\n\#define COMMIT_SHA_H_\n\#define SOFTWARE_COMMIT \"-$(COMMIT_SHA)$(MODIFIER)\"\n\#endif" > $(FBARDUINO_FIRMWARE_SRC_DIR)/CommitSHA.h)
# Files to be tracked for make to know to rebuild.
COPY_INO := $(shell cp $(FBARDUINO_FIRMWARE_SRC_DIR)/src.ino $(FBARDUINO_FIRMWARE_SRC_DIR)/src.ino.cpp)
CXX_SRC := $(wildcard $(FBARDUINO_FIRMWARE_SRC_DIR)/*.cpp)
SRC := $(CXX_SRC)
SRC_DEPS := $(SRC) $(wildcard $(FBARDUINO_FIRMWARE_SRC_DIR)/*.h)
HEADERS := $(wildcard $(FBARDUINO_FIRMWARE_SRC_DIR)/*.h)
# Object files and Dependency files That will eventually be built.
CXX_OBJ := $(CXX_SRC:.cpp=.o)
@ -42,7 +47,7 @@ include lib/targets/farmduino_k14.Makefile
include lib/targets/farmduino_k15.Makefile
include lib/targets/express_k10.Makefile
.PHONY: all clean force_clean remove_ino_copy \
.PHONY: all clean strings_test force_clean remove_temp \
dep_core dep_core_clean \
dep_Servo dep_Servo_clean \
dep_SPI dep_SPI_clean \
@ -57,9 +62,9 @@ DEPS := $(DEP_CORE) $(DEP_SPI) $(DEP_Servo) $(DEP_EEPROM)
DEPS_OBJ := $(DEP_SPI_OBJ) $(DEP_Servo_OBJ) $(DEP_EEPROM_OBJ)
DEPS_CFLAGS := $(DEP_CORE_CFLAGS) $(DEP_SPI_CFLAGS) $(DEP_Servo_CFLAGS) $(DEP_EEPROM_CFLAGS)
all: $(BIN_DIR) $(DEPS) target_ramps_v14 target_farmduino_v10 target_farmduino_k14 target_farmduino_k15 target_express_k10 remove_ino_copy
all: $(BIN_DIR) $(DEPS) target_ramps_v14 target_farmduino_v10 target_farmduino_k14 target_farmduino_k15 target_express_k10 remove_temp
clean: remove_ino_copy target_ramps_v14_clean target_farmduino_v10_clean target_farmduino_k14_clean target_farmduino_k15_clean target_express_k10_clean
clean: remove_temp target_ramps_v14_clean target_farmduino_v10_clean target_farmduino_k14_clean target_farmduino_k15_clean target_express_k10_clean
strings_test: all
$(OBJ_COPY) -I ihex $(TARGET_ramps_v14_HEX) -O binary $(TARGET_ramps_v14_HEX).bin
@ -67,17 +72,18 @@ strings_test: all
$(OBJ_COPY) -I ihex $(TARGET_farmduino_k14_HEX) -O binary $(TARGET_farmduino_k14_HEX).bin
$(OBJ_COPY) -I ihex $(TARGET_farmduino_k15_HEX) -O binary $(TARGET_farmduino_k15_HEX).bin
$(OBJ_COPY) -I ihex $(TARGET_express_k10_HEX) -O binary $(TARGET_express_k10_HEX).bin
@strings $(TARGET_ramps_v14_HEX).bin | grep -q "6.5.0.R"
@strings $(TARGET_farmduino_v10_HEX).bin | grep -q "6.5.0.F"
@strings $(TARGET_farmduino_k14_HEX).bin | grep -q "6.5.0.G"
@strings $(TARGET_farmduino_k15_HEX).bin | grep -q "6.5.0.H"
@strings $(TARGET_express_k10_HEX).bin | grep -q "6.5.0.E"
@strings $(TARGET_ramps_v14_HEX).bin | grep -q ".R.genesisK12"
@strings $(TARGET_farmduino_v10_HEX).bin | grep -q ".F.genesisK13"
@strings $(TARGET_farmduino_k14_HEX).bin | grep -q ".G.genesisK14"
@strings $(TARGET_farmduino_k15_HEX).bin | grep -q ".H.genesisK15"
@strings $(TARGET_express_k10_HEX).bin | grep -q ".E.expressK10"
force_clean: remove_ino_copy
force_clean: remove_temp
$(RM) -r $(BUILD_DIR) $(BIN_DIR)
$(BIN_DIR):
$(MKDIR_P) $(BIN_DIR)
remove_ino_copy:
remove_temp:
$(RM) $(FBARDUINO_FIRMWARE_SRC_DIR)/src.ino.cpp
$(RM) $(FBARDUINO_FIRMWARE_SRC_DIR)/CommitSHA.h

306
README.md
View File

@ -57,7 +57,7 @@ Software overview
All files are in `/src`
Farmbot_arduino_controller contains the setup() and main(). This is the main sequence:
`src.ino` contains the setup() and main loop(). This is the main sequence:
```
+--------------------------+
@ -84,52 +84,26 @@ Farmbot_arduino_controller contains the setup() and main(). This is the main seq
```
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
============================
Pin Numbering
-------------
IMPORTANT
---------
### 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
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
-------
@ -221,6 +195,7 @@ Value |Description
1 |Emergency stop
2 |Timeout
3 |Stall detected
4 |Calibration error
14 |Invalid command
15 |No config
@ -280,112 +255,147 @@ ZB |End stop 2 on z axis |0/1
Arduino parameter numbers
------------------------
ID | Name
-----|----------------------------
2 | PARAM_CONFIG_OK
3 | PARAM_USE_EEPROM
4 | PARAM_E_STOP_ON_MOV_ERR
5 | PARAM_MOV_NR_RETRY
11 | MOVEMENT_TIMEOUT_X
12 | MOVEMENT_TIMEOUT_Y
13 | MOVEMENT_TIMEOUT_Z
15 | MOVEMENT_KEEP_ACTIVE_X
16 | MOVEMENT_KEEP_ACTIVE_Y
17 | MOVEMENT_KEEP_ACTIVE_Z
18 | MOVEMENT_HOME_AT_BOOT_X
19 | MOVEMENT_HOME_AT_BOOT_Y
20 | MOVEMENT_HOME_AT_BOOT_Z
21 | MOVEMENT_INVERT_ENDPOINTS_X
22 | MOVEMENT_INVERT_ENDPOINTS_Y
23 | MOVEMENT_INVERT_ENDPOINTS_Z
25 | MOVEMENT_ENABLE_ENDPOINTS_X
26 | MOVEMENT_ENABLE_ENDPOINTS_Y
27 | MOVEMENT_ENABLE_ENDPOINTS_Z
31 | MOVEMENT_INVERT_MOTOR_X
32 | MOVEMENT_INVERT_MOTOR_Y
33 | MOVEMENT_INVERT_MOTOR_Z
36 | MOVEMENT_SECONDARY_MOTOR_X
37 | MOVEMENT_SECONDARY_MOTOR_INVERT_X
41 | MOVEMENT_STEPS_ACC_DEC_X
42 | MOVEMENT_STEPS_ACC_DEC_Y
43 | MOVEMENT_STEPS_ACC_DEC_Z
45 | MOVEMENT_STOP_AT_HOME_X
46 | MOVEMENT_STOP_AT_HOME_Y
47 | MOVEMENT_STOP_AT_HOME_Z
51 | MOVEMENT_HOME_UP_X
52 | MOVEMENT_HOME_UP_Y
53   | MOVEMENT_HOME_UP_Z
55   | MOVEMENT_STEP_PER_MM_X
56   | MOVEMENT_STEP_PER_MM_Y
57   | MOVEMENT_STEP_PER_MM_Z
61   | MOVEMENT_MIN_SPD_X
62 | MOVEMENT_MIN_SPD_Y
63 | MOVEMENT_MIN_SPD_Z
65 | MOVEMENT_HOME_SPD_X
66 | MOVEMENT_HOME_SPD_Y
67 | MOVEMENT_HOME_SPD_Z
71 | MOVEMENT_MAX_SPD_X
72 | MOVEMENT_MAX_SPD_Y
73 | MOVEMENT_MAX_SPD_Z
75 | MOVEMENT_INVERT_2_ENDPOINTS_X
76 | MOVEMENT_INVERT_2_ENDPOINTS_Y
77 | MOVEMENT_INVERT_2_ENDPOINTS_Z
81 | MOVEMENT_MOTOR_CURRENT_X
82 | MOVEMENT_MOTOR_CURRENT_Y
83 | MOVEMENT_MOTOR_CURRENT_Z
85 | MOVEMENT_STALL_SENSITIVITY_X
86 | MOVEMENT_STALL_SENSITIVITY_Y
87 | MOVEMENT_STALL_SENSITIVITY_Z
91 | MOVEMENT_MICROSTEPS_X
92 | MOVEMENT_MICROSTEPS_Y
93 | MOVEMENT_MICROSTEPS_Z
101 | ENCODER_ENABLED_X
102 | ENCODER_ENABLED_Y
103 | ENCODER_ENABLED_Z
105 | ENCODER_TYPE_X
106 | ENCODER_TYPE_Y
107 | ENCODER_TYPE_Z
111 | ENCODER_MISSED_STEPS_MAX_X
112 | ENCODER_MISSED_STEPS_MAX_Y
113 | ENCODER_MISSED_STEPS_MAX_Z
115 | ENCODER_SCALING_X
116 | ENCODER_SCALING_Y
117 | ENCODER_SCALING_Z
121 | ENCODER_MISSED_STEPS_DECAY_X
122 | ENCODER_MISSED_STEPS_DECAY_Y
123 | ENCODER_MISSED_STEPS_DECAY_Z
125 | ENCODER_USE_FOR_POS_X
126 | ENCODER_USE_FOR_POS_Y
127 | ENCODER_USE_FOR_POS_Z
131 | ENCODER_INVERT_X
132 | ENCODER_INVERT_Y
133 | ENCODER_INVERT_Z
141 | MOVEMENT_AXIS_NR_STEPS_X
142 | MOVEMENT_AXIS_NR_STEPS_Y
143 | MOVEMENT_AXIS_NR_STEPS_Z
145 | MOVEMENT_STOP_AT_MAX_X
146 | MOVEMENT_STOP_AT_MAX_Y
147 | MOVEMENT_STOP_AT_MAX_Z
201 | PIN_GUARD_1_PIN_NR
202 | PIN_GUARD_1_TIME_OUT
203 | PIN_GUARD_1_ACTIVE_STATE
205 | PIN_GUARD_2_PIN_NR
206 | PIN_GUARD_2_TIME_OUT
207 | PIN_GUARD_2_ACTIVE_STATE
211 | PIN_GUARD_3_PIN_NR
212 | PIN_GUARD_3_TIME_OUT
213 | PIN_GUARD_3_ACTIVE_STATE
215 | PIN_GUARD_4_PIN_NR
216 | PIN_GUARD_4_TIME_OUT
217 | PIN_GUARD_4_ACTIVE_STATE
221 | PIN_GUARD_5_PIN_NR
222 | PIN_GUARD_5_TIME_OUT
223 | PIN_GUARD_5_ACTIVE_STATE
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 |
IMPORTANT
=========
Pin Numbering
-------------
Farmbot will NOT move until the configuration has been approved.
To approve manually, send 'F22 P2 V1 Q0'
### RAMPS 1.4 (for other boards, see [/src/pins.h](/src/pins.h))
To move, use the command 'G00 X0 Y0 Z0 Q0' where you type in the coordinates just after X, Y and Z.
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

View File

@ -12,7 +12,7 @@ $(TARGET_express_k10_BUILD_DIR)/express_k10.eep: $(TARGET_express_k10_BUILD_DIR)
$(TARGET_express_k10_BUILD_DIR)/express_k10.elf: $(TARGET_express_k10_OBJ)
$(CC) -w -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections,--relax -mmcu=atmega2560 -o $@ $(TARGET_express_k10_OBJ) $(DEPS_OBJ) $(DEP_CORE_LDFLAGS)
$(TARGET_express_k10_BUILD_DIR)/%.o: $(FBARDUINO_FIRMWARE_SRC_DIR)/%.cpp
$(TARGET_express_k10_BUILD_DIR)/%.o: $(FBARDUINO_FIRMWARE_SRC_DIR)/%.cpp $(HEADERS)
$(CXX) $(CXX_FLAGS) -DFARMBOT_BOARD_ID=3 $(DEPS_CFLAGS) $< -o $@
$(TARGET_express_k10_BUILD_DIR):

View File

@ -12,7 +12,7 @@ $(TARGET_farmduino_k14_BUILD_DIR)/farmduino_k14.eep: $(TARGET_farmduino_k14_BUIL
$(TARGET_farmduino_k14_BUILD_DIR)/farmduino_k14.elf: $(TARGET_farmduino_k14_OBJ)
$(CC) -w -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections,--relax -mmcu=atmega2560 -o $@ $(TARGET_farmduino_k14_OBJ) $(DEPS_OBJ) $(DEP_CORE_LDFLAGS)
$(TARGET_farmduino_k14_BUILD_DIR)/%.o: $(FBARDUINO_FIRMWARE_SRC_DIR)/%.cpp
$(TARGET_farmduino_k14_BUILD_DIR)/%.o: $(FBARDUINO_FIRMWARE_SRC_DIR)/%.cpp $(HEADERS)
$(CXX) $(CXX_FLAGS) -DFARMBOT_BOARD_ID=2 $(DEPS_CFLAGS) $< -o $@
$(TARGET_farmduino_k14_BUILD_DIR):

View File

@ -12,7 +12,7 @@ $(TARGET_farmduino_k15_BUILD_DIR)/farmduino_k15.eep: $(TARGET_farmduino_k15_BUIL
$(TARGET_farmduino_k15_BUILD_DIR)/farmduino_k15.elf: $(TARGET_farmduino_k15_OBJ)
$(CC) -w -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections,--relax -mmcu=atmega2560 -o $@ $(TARGET_farmduino_k15_OBJ) $(DEPS_OBJ) $(DEP_CORE_LDFLAGS)
$(TARGET_farmduino_k15_BUILD_DIR)/%.o: $(FBARDUINO_FIRMWARE_SRC_DIR)/%.cpp
$(TARGET_farmduino_k15_BUILD_DIR)/%.o: $(FBARDUINO_FIRMWARE_SRC_DIR)/%.cpp $(HEADERS)
$(CXX) $(CXX_FLAGS) -DFARMBOT_BOARD_ID=4 $(DEPS_CFLAGS) $< -o $@
$(TARGET_farmduino_k15_BUILD_DIR):

View File

@ -12,7 +12,7 @@ $(TARGET_farmduino_v10_BUILD_DIR)/farmduino_v10.eep: $(TARGET_farmduino_v10_BUIL
$(TARGET_farmduino_v10_BUILD_DIR)/farmduino_v10.elf: $(TARGET_farmduino_v10_OBJ)
$(CC) -w -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections,--relax -mmcu=atmega2560 -o $@ $(TARGET_farmduino_v10_OBJ) $(DEPS_OBJ) $(DEP_CORE_LDFLAGS)
$(TARGET_farmduino_v10_BUILD_DIR)/%.o: $(FBARDUINO_FIRMWARE_SRC_DIR)/%.cpp
$(TARGET_farmduino_v10_BUILD_DIR)/%.o: $(FBARDUINO_FIRMWARE_SRC_DIR)/%.cpp $(HEADERS)
$(CXX) $(CXX_FLAGS) -DFARMBOT_BOARD_ID=1 $(DEPS_CFLAGS) $< -o $@
$(TARGET_farmduino_v10_BUILD_DIR):

View File

@ -12,7 +12,7 @@ $(TARGET_ramps_v14_BUILD_DIR)/arduino_firmware.eep: $(TARGET_ramps_v14_BUILD_DIR
$(TARGET_ramps_v14_BUILD_DIR)/arduino_firmware.elf: $(TARGET_ramps_v14_OBJ)
$(CC) -w -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections,--relax -mmcu=atmega2560 -o $@ $(TARGET_ramps_v14_OBJ) $(DEPS_OBJ) $(DEP_CORE_LDFLAGS)
$(TARGET_ramps_v14_BUILD_DIR)/%.o: $(FBARDUINO_FIRMWARE_SRC_DIR)/%.cpp
$(TARGET_ramps_v14_BUILD_DIR)/%.o: $(FBARDUINO_FIRMWARE_SRC_DIR)/%.cpp $(HEADERS)
$(CXX) $(CXX_FLAGS) -DFARMBOT_BOARD_ID=0 $(DEPS_CFLAGS) $< -o $@
$(TARGET_ramps_v14_BUILD_DIR):

View File

@ -29,7 +29,6 @@
#elif FARMBOT_BOARD_ID == 3
#define FARMDUINO_EXP_V20
#elif FARMBOT_BOARD_ID == 4
#define FARMDUINO_EXP_V20
#define FARMDUINO_V30
#endif

View File

@ -9,6 +9,8 @@
#ifndef CONFIG_H_
#define CONFIG_H_
const char SOFTWARE_VERSION[] = "6.5.8\0";
const int LOGGING = 0;
const int INCOMING_CMD_BUF_SIZE = 100;
@ -224,8 +226,6 @@
const long STATUS_GENERAL_DEFAULT = 0;
//const char SOFTWARE_VERSION[] = "4.0.2\0";
#define NSS_PIN 22
#define READ_ENA_PIN 49
#define NULL 0
@ -240,22 +240,28 @@ enum MdlSpiEncoders
};
#endif /* CONFIG_H_ */
#if defined(RAMPS_V14) && !defined(SOFTWARE_VERSION)
#define SOFTWARE_VERSION "6.5.0.R\0"
#if defined(RAMPS_V14) && !defined(SOFTWARE_VERSION_SUFFIX)
#define SOFTWARE_VERSION_SUFFIX ".R.genesisK12\0"
#endif
#if defined(FARMDUINO_V10) && !defined(SOFTWARE_VERSION)
#define SOFTWARE_VERSION "6.5.0.F\0"
#if defined(FARMDUINO_V10) && !defined(SOFTWARE_VERSION_SUFFIX)
#define SOFTWARE_VERSION_SUFFIX ".F.genesisK13\0"
#endif
#if defined(FARMDUINO_V14) && !defined(SOFTWARE_VERSION)
#define SOFTWARE_VERSION "6.5.0.G\0"
#if defined(FARMDUINO_V14) && !defined(SOFTWARE_VERSION_SUFFIX)
#define SOFTWARE_VERSION_SUFFIX ".G.genesisK14\0"
#endif
#if defined(FARMDUINO_V30) && !defined(SOFTWARE_VERSION)
#define SOFTWARE_VERSION "6.5.0.H\0"
#if defined(FARMDUINO_V30) && !defined(SOFTWARE_VERSION_SUFFIX)
#define SOFTWARE_VERSION_SUFFIX ".H.genesisK15\0"
#endif
#if defined(FARMDUINO_EXP_V20) && !defined(SOFTWARE_VERSION)
#define SOFTWARE_VERSION "6.5.0.E\0"
#if defined(FARMDUINO_EXP_V20) && !defined(SOFTWARE_VERSION_SUFFIX)
#define SOFTWARE_VERSION_SUFFIX ".E.expressK10\0"
#endif
#ifndef FARMBOT_BOARD_ID
#define SOFTWARE_COMMIT ""
#else
#include "CommitSHA.h"
#endif

View File

@ -16,6 +16,7 @@ enum ErrorListEnum
ERR_EMERGENCY_STOP = 1,
ERR_TIMEOUT = 2,
ERR_STALL_DETECTED = 3,
ERR_CALIBRATION_ERROR = 4,
ERR_INVALID_COMMAND = 14,
ERR_PARAMS_NOT_OK = 15,

View File

@ -34,6 +34,8 @@ int F83Handler::execute(Command *command)
Serial.print("R83 ");
Serial.print(SOFTWARE_VERSION);
Serial.print(SOFTWARE_VERSION_SUFFIX);
Serial.print(SOFTWARE_COMMIT);
//Serial.print("\r\n");
CurrentState::getInstance()->printQAndNewLine();

View File

@ -522,7 +522,7 @@ int Movement::moveToCoords(double xDestScaled, double yDestScaled, double zDestS
// Let the interrupt handle all the movements
while ((axisActive[0] || axisActive[1] || axisActive[2]) && !emergencyStop)
{
#if defined(FARMDUINO_V14)
#if defined(FARMDUINO_V14) || defined(FARMDUINO_V30)
checkEncoders();
#endif
@ -741,7 +741,7 @@ int Movement::moveToCoords(double xDestScaled, double yDestScaled, double zDestS
case 1:
serialBuffer += CurrentState::getInstance()->getPosition();
serialBuffer += CurrentState::getInstance()->getQAndNewLine();
#if defined(FARMDUINO_V14)
#if defined(FARMDUINO_V14) || defined(FARMDUINO_V30)
getEncoderReport();
#endif
break;
@ -765,14 +765,14 @@ int Movement::moveToCoords(double xDestScaled, double yDestScaled, double zDestS
serialMessageNr++;
#if !defined(FARMDUINO_EXP_V20) && !defined(FARMDUINO_V30)
#if !defined(FARMDUINO_EXP_V20)
if (serialMessageNr > 1)
{
serialMessageNr = 0;
}
#endif
#if defined(FARMDUINO_EXP_V20) || defined(FARMDUINO_V30)
#if defined(FARMDUINO_EXP_V20)
if (serialMessageNr > 2)
{
@ -928,7 +928,7 @@ int Movement::calibrateAxis(int axis)
loadMotorSettings();
loadEncoderSettings();
//unsigned long timeStart = millis();
unsigned long timeStart = millis();
bool movementDone = false;
@ -1004,7 +1004,7 @@ int Movement::calibrateAxis(int axis)
break;
default:
Serial.print("R99 Calibration error: invalid axis selected\r\n");
error = 1;
error = ERR_CALIBRATION_ERROR;
CurrentState::getInstance()->setLastError(error);
return error;
}
@ -1014,7 +1014,7 @@ int Movement::calibrateAxis(int axis)
if (calibAxis->endStopMin() || calibAxis->endStopMax())
{
Serial.print("R99 Calibration error: end stop active before start\r\n");
error = 1;
error = ERR_CALIBRATION_ERROR;
CurrentState::getInstance()->setLastError(error);
return error;
}
@ -1053,12 +1053,47 @@ int Movement::calibrateAxis(int axis)
while (!movementDone && error == 0)
{
#if defined(FARMDUINO_V14)
#if defined(FARMDUINO_V14) || defined(FARMDUINO_V30)
checkEncoders();
#endif
checkAxisVsEncoder(calibAxis, calibEncoder, &motorConsMissedSteps[axis], &motorLastPosition[axis], &motorConsEncoderLastPosition[axis], &motorConsEncoderUseForPos[axis], &motorConsMissedStepsDecay[axis], &motorConsEncoderEnabled[axis]);
// Check timeouts
if (!movementDone && ((millis() >= timeStart && millis() - timeStart > timeOut[axis] * 1000) || (millis() < timeStart && millis() > timeOut[axis] * 1000)))
{
calibAxis->disableMotor();
switch (axis)
{
case 0:
Serial.print(COMM_REPORT_TIMEOUT_X);
CurrentState::getInstance()->printQAndNewLine();
Serial.print("R99 timeout X axis\r\n");
error = ERR_TIMEOUT;
CurrentState::getInstance()->setLastError(error);
return error;
case 1:
Serial.print(COMM_REPORT_TIMEOUT_Y);
CurrentState::getInstance()->printQAndNewLine();
Serial.print("R99 timeout Y axis\r\n");
error = ERR_TIMEOUT;
CurrentState::getInstance()->setLastError(error);
return error;
case 2:
Serial.print(COMM_REPORT_TIMEOUT_Z);
CurrentState::getInstance()->printQAndNewLine();
Serial.print("R99 timeout Z axis\r\n");
error = ERR_TIMEOUT;
CurrentState::getInstance()->setLastError(error);
return error;
default:
Serial.print("R99 Calibration error: invalid axis selected\r\n");
error = ERR_CALIBRATION_ERROR;
CurrentState::getInstance()->setLastError(error);
return error;
}
}
// Check if there is an emergency stop command
if (Serial.available() > 0)
{
@ -1070,7 +1105,7 @@ int Movement::calibrateAxis(int axis)
CurrentState::getInstance()->setEmergencyStop();
Serial.print(COMM_REPORT_EMERGENCY_STOP);
CurrentState::getInstance()->printQAndNewLine();
error = 1;
error = ERR_EMERGENCY_STOP;
}
}
@ -1175,6 +1210,8 @@ int Movement::calibrateAxis(int axis)
Serial.print(" calibrating length");
Serial.print("\r\n");
timeStart = millis();
stepsCount = 0;
movementDone = false;
*missedSteps = 0;
@ -1195,12 +1232,47 @@ int Movement::calibrateAxis(int axis)
while (!movementDone && error == 0)
{
#if defined(FARMDUINO_V14)
#if defined(FARMDUINO_V14) || defined(FARMDUINO_V30)
checkEncoders();
#endif
checkAxisVsEncoder(calibAxis, calibEncoder, &motorConsMissedSteps[axis], &motorLastPosition[axis], &motorConsEncoderLastPosition[axis], &motorConsEncoderUseForPos[axis], &motorConsMissedStepsDecay[axis], &motorConsEncoderEnabled[axis]);
// Check timeouts
if (!movementDone && ((millis() >= timeStart && millis() - timeStart > timeOut[axis] * 1000) || (millis() < timeStart && millis() > timeOut[axis] * 1000)))
{
calibAxis->disableMotor();
switch (axis)
{
case 0:
Serial.print(COMM_REPORT_TIMEOUT_X);
CurrentState::getInstance()->printQAndNewLine();
Serial.print("R99 timeout X axis\r\n");
error = ERR_TIMEOUT;
CurrentState::getInstance()->setLastError(error);
return error;
case 1:
Serial.print(COMM_REPORT_TIMEOUT_Y);
CurrentState::getInstance()->printQAndNewLine();
Serial.print("R99 timeout Y axis\r\n");
error = ERR_TIMEOUT;
CurrentState::getInstance()->setLastError(error);
return error;
case 2:
Serial.print(COMM_REPORT_TIMEOUT_Z);
CurrentState::getInstance()->printQAndNewLine();
Serial.print("R99 timeout Z axis\r\n");
error = ERR_TIMEOUT;
CurrentState::getInstance()->setLastError(error);
return error;
default:
Serial.print("R99 Calibration error: invalid axis selected\r\n");
error = ERR_CALIBRATION_ERROR;
CurrentState::getInstance()->setLastError(error);
return error;
}
}
// Check if there is an emergency stop command
if (Serial.available() > 0)
{
@ -1212,7 +1284,7 @@ int Movement::calibrateAxis(int axis)
CurrentState::getInstance()->setEmergencyStop();
Serial.print(COMM_REPORT_EMERGENCY_STOP);
CurrentState::getInstance()->printQAndNewLine();
error = 1;
error = ERR_EMERGENCY_STOP;
}
}
@ -1686,7 +1758,7 @@ bool Movement::endStopsReached()
void Movement::storePosition()
{
#if !defined(FARMDUINO_EXP_V20) && !defined(FARMDUINO_V30)
#if !defined(FARMDUINO_EXP_V20)
if (motorConsEncoderEnabled[0])
{
CurrentState::getInstance()->setX(encoderX.currentPosition());
@ -1715,7 +1787,7 @@ void Movement::storePosition()
}
#endif
#if defined(FARMDUINO_EXP_V20) || defined(FARMDUINO_V30)
#if defined(FARMDUINO_EXP_V20)
CurrentState::getInstance()->setX(axisX.currentPosition());
CurrentState::getInstance()->setY(axisY.currentPosition());
CurrentState::getInstance()->setZ(axisZ.currentPosition());

View File

@ -76,20 +76,24 @@ void MovementEncoder::loadMdlEncoderId(MdlSpiEncoders encoder)
void MovementEncoder::setPosition(long newPosition)
{
#if defined(RAMPS_V14) || defined(FARMDUINO_V10) || defined(FARMDUINO_EXP_V20) || defined(FARMDUINO_V30)
#if defined(RAMPS_V14) || defined(FARMDUINO_V10) || defined(FARMDUINO_EXP_V20)
position = newPosition;
#endif
#if defined(FARMDUINO_V14)
#if defined(FARMDUINO_V14) || defined(FARMDUINO_V30)
if (newPosition == 0)
{
position = newPosition;
const byte reset_cmd = 0x00;
SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV4, MSBFIRST, SPI_MODE0));
digitalWrite(NSS_PIN, LOW);
delayMicroseconds(2);
SPI.transfer(reset_cmd | (mdlEncoder << mdl_spi_encoder_offset));
delayMicroseconds(5);
digitalWrite(NSS_PIN, HIGH);
SPI.endTransaction();
}
#endif
}
@ -105,7 +109,7 @@ long MovementEncoder::currentPosition()
}
else
{
#if defined(FARMDUINO_V14)
#if defined(FARMDUINO_V14) || defined(FARMDUINO_V30)
floatScalingFactor = scalingFactor / 40000.0;
return position * floatScalingFactor * encoderInvert;
#endif
@ -127,7 +131,7 @@ void MovementEncoder::checkEncoder(bool channelA, bool channelB, bool channelAQ,
processEncoder();
#endif
#if defined(FARMDUINO_V14)
#if defined(FARMDUINO_V14) || defined(FARMDUINO_V30)
processEncoder();
#endif
@ -169,14 +173,16 @@ void MovementEncoder::processEncoder()
#endif
// If using farmduino, revision 1.4, use the SPI interface to read from the Motor Dynamics Lab chip
#if defined(FARMDUINO_V14)
#if defined(FARMDUINO_V14) || defined(FARMDUINO_V30)
const byte read_cmd = 0x0F;
int readSize = 4;
long encoderVal = 0;
SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV4, MSBFIRST, SPI_MODE0));
digitalWrite(NSS_PIN, LOW);
delayMicroseconds(2);
SPI.transfer(read_cmd | (mdlEncoder << mdl_spi_encoder_offset));
delayMicroseconds(10);
delayMicroseconds(5);
for (int i = 0; i < readSize; ++i)
{
@ -185,6 +191,7 @@ void MovementEncoder::processEncoder()
}
digitalWrite(NSS_PIN, HIGH);
SPI.endTransaction();
position = encoderVal;
#endif
@ -277,7 +284,7 @@ float MovementEncoder::getMissedSteps()
void MovementEncoder::checkMissedSteps()
{
#if !defined(FARMDUINO_EXP_V20) && !defined(FARMDUINO_V30)
#if !defined(FARMDUINO_EXP_V20)
if (encoderEnabled)
{
bool stepMissed = false;
@ -327,4 +334,4 @@ void MovementEncoder::checkMissedSteps()
}
#endif
*/
}
}

View File

@ -296,7 +296,7 @@ void checkParamsChanged()
void checkEncoders()
{
#if defined(FARMDUINO_V14)
#if defined(FARMDUINO_V14) || defined(FARMDUINO_V30)
// Check encoders out of interrupt for farmduino 1.4
Movement::getInstance()->checkEncoders();
#endif
@ -594,6 +594,20 @@ void setPinInputOutput()
digitalWrite(SERVO_1_PIN, LOW);
digitalWrite(SERVO_2_PIN, LOW);
digitalWrite(SERVO_3_PIN, LOW);
#if defined(FARMDUINO_V30)
reportingPeriod = 500;
pinMode(READ_ENA_PIN, INPUT_PULLUP);
pinMode(NSS_PIN, OUTPUT);
digitalWrite(NSS_PIN, HIGH);
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV4);
SPI.begin();
#endif
}
#endif
@ -631,7 +645,7 @@ void startInterrupt()
// Serial.println("set timer");
// TIMSK2 = (TIMSK2 & B11111110) | 0x01; // Enable timer overflow
// TCCR2B = (TCCR2B & B11111000) | 0x01; // Set divider to 1
// OCR2A = 4; // Set overflow to 4 for total of 64 µs
// OCR2A = 4; // Set overflow to 4 for total of 64 µs
//#endif
}

View File

@ -334,7 +334,7 @@
#define SERVO_0_PIN 4
#define SERVO_1_PIN 5
#define SERVO_2_PIN 6
#define SERVO_3_PIN -1
#define SERVO_3_PIN 11
// Encoder X channel A: pin 16, port H1
#define ENC_X_A_PORT PINH

View File

@ -32,7 +32,7 @@ void setup()
loadMovementSetting();
startMotor();
startPinGuard();
startServo();
//startServo();
startInterrupt();
initLastAction();
homeOnBoot();
@ -57,4 +57,4 @@ void loop()
checkParamsChanged();
periodicChecksAndReport();
}
}