mirror of
https://github.com/joshr120/PD-Stepper.git
synced 2025-11-04 14:49:56 +08:00
Updated ESPHome Examples
This commit is contained in:
parent
1f17574945
commit
e1a99c644d
283
Software/ESPHome/PD-Stepper-Blinds-Advanced.yaml
Normal file
283
Software/ESPHome/PD-Stepper-Blinds-Advanced.yaml
Normal file
@ -0,0 +1,283 @@
|
||||
# This example uses a custom TMC2209 component to control the PD Stepper
|
||||
# It uses the encoder to get the current blind position so it will not lose home if blind is manually moved
|
||||
|
||||
external_components:
|
||||
- source: github://slimcdk/esphome-custom-components
|
||||
components: [tmc2209, stepper]
|
||||
|
||||
substitutions:
|
||||
encoder_closed_pos: "30000" # full blinds length (in encoder counts) !! CHANGE TO SUIT YOUR SETUP !!
|
||||
stepper_encoder_ratio: "0.195" # ratio between stepper microstepping (4) and encoder. 4 x 200 / 4096 = 0.195
|
||||
|
||||
globals:
|
||||
- id: encoder_tracking_
|
||||
type: int32_t[2]
|
||||
restore_value: no
|
||||
|
||||
- id: encoder_offset_
|
||||
type: int32_t
|
||||
restore_value: no
|
||||
|
||||
- id: sensored_home_pos
|
||||
type: int32_t
|
||||
restore_value: no
|
||||
initial_value: "0"
|
||||
|
||||
wifi:
|
||||
ssid: !secret wifi_ssid
|
||||
password: !secret wifi_password
|
||||
|
||||
api:
|
||||
|
||||
ota:
|
||||
- platform: esphome
|
||||
|
||||
logger:
|
||||
|
||||
esp32:
|
||||
board: esp32-s3-devkitc-1
|
||||
framework:
|
||||
type: esp-idf
|
||||
|
||||
esphome:
|
||||
name: pd-stepper-blinds-2
|
||||
platformio_options:
|
||||
board_build.flash_mode: dio
|
||||
upload_speed: 921600
|
||||
on_boot:
|
||||
- tmc2209.configure:
|
||||
microsteps: 4
|
||||
interpolation: true
|
||||
tcool_threshold: 400
|
||||
- tmc2209.stallguard:
|
||||
threshold: 45 #set lower if stall gaurd triggering too often
|
||||
- tmc2209.currents:
|
||||
irun: 4
|
||||
ihold: 0
|
||||
tpowerdown: 0
|
||||
iholddelay: 0
|
||||
standstill_mode: freewheeling
|
||||
|
||||
#set PD voltage # 5V 9V 12V 15V 20V
|
||||
- output.turn_off: # 1 0 0 0 0
|
||||
id: CFG1_pin
|
||||
- output.turn_on: # - 0 0 1 1
|
||||
id: CFG2_pin
|
||||
- output.turn_off: # - 0 1 1 0
|
||||
id: CFG3_pin
|
||||
|
||||
- delay: 0.5s
|
||||
- lambda: id(sensored_home_pos) = id(encoder)->get_state(); # Set the home position to power on position
|
||||
# - button.press: home
|
||||
|
||||
|
||||
web_server:
|
||||
include_internal: true
|
||||
ota: false
|
||||
version: 3
|
||||
log: false
|
||||
|
||||
|
||||
i2c:
|
||||
sda: 8
|
||||
scl: 9
|
||||
scan: true
|
||||
|
||||
uart:
|
||||
tx_pin: 17
|
||||
rx_pin: 18
|
||||
baud_rate: 712000
|
||||
|
||||
output:
|
||||
- platform: ledc
|
||||
pin: 10
|
||||
id: led1_output
|
||||
|
||||
- platform: ledc
|
||||
pin: 12
|
||||
id: led2_output
|
||||
|
||||
- platform: gpio
|
||||
pin: GPIO38
|
||||
id: CFG1_pin
|
||||
- platform: gpio
|
||||
pin: GPIO48
|
||||
id: CFG2_pin
|
||||
- platform: gpio
|
||||
pin: GPIO47
|
||||
id: CFG3_pin
|
||||
|
||||
light:
|
||||
- platform: monochromatic
|
||||
output: led1_output
|
||||
id: led1
|
||||
name: LED 1
|
||||
- platform: status_led
|
||||
output: led2_output
|
||||
id: led2
|
||||
name: Status LED
|
||||
|
||||
stepper:
|
||||
- platform: tmc2209
|
||||
id: motor
|
||||
max_speed: 800 steps/s
|
||||
acceleration: 1500 steps/s^2
|
||||
deceleration: 1500 steps/s^2
|
||||
rsense: 100 mOhm
|
||||
vsense: False
|
||||
enn_pin: 21
|
||||
diag_pin: 16
|
||||
index_pin: 11
|
||||
# step_pin: 5
|
||||
# dir_pin: 6
|
||||
on_stall:
|
||||
- logger.log: "Motor stalled!"
|
||||
# - stepper.stop: motor #un-comment this to disable on stall
|
||||
# - lambda: id(sensored_home_pos) = id(encoder)->get_state(); #un-comment this to not reset home on stall
|
||||
- cover.template.publish:
|
||||
id: pd_blinds
|
||||
state: OPEN
|
||||
- light.turn_on:
|
||||
id: led1
|
||||
transition_length: 0s
|
||||
- delay: 250ms
|
||||
- light.turn_off:
|
||||
id: led1
|
||||
transition_length: 1s
|
||||
|
||||
button:
|
||||
- platform: restart
|
||||
name: Restart
|
||||
|
||||
- platform: template
|
||||
name: Home
|
||||
id: home
|
||||
on_press:
|
||||
- stepper.set_target:
|
||||
id: motor
|
||||
target: -${encoder_closed_pos}
|
||||
|
||||
- platform: template
|
||||
name: Stop
|
||||
on_press:
|
||||
- stepper.stop: motor
|
||||
|
||||
binary_sensor:
|
||||
- platform: gpio
|
||||
name: Power Good
|
||||
pin:
|
||||
number: 15
|
||||
mode: INPUT
|
||||
inverted: true
|
||||
device_class: power
|
||||
filters:
|
||||
- delayed_on: 10ms
|
||||
|
||||
- platform: gpio
|
||||
name: Button 1
|
||||
pin:
|
||||
number: 35
|
||||
mode: INPUT
|
||||
inverted: true
|
||||
id: btn1
|
||||
filters:
|
||||
- delayed_on: 10ms
|
||||
on_press:
|
||||
- cover.open: pd_blinds
|
||||
|
||||
- platform: gpio
|
||||
name: Button 2
|
||||
id: btn2
|
||||
pin:
|
||||
number: 36
|
||||
mode: INPUT
|
||||
inverted: true
|
||||
filters:
|
||||
- delayed_on: 10ms
|
||||
on_press:
|
||||
- tmc2209.disable: motor
|
||||
|
||||
- platform: gpio
|
||||
name: Button 3
|
||||
id: btn3
|
||||
pin:
|
||||
number: 37
|
||||
mode: INPUT
|
||||
inverted: true
|
||||
filters:
|
||||
- delayed_on: 10ms
|
||||
on_press:
|
||||
- cover.close: pd_blinds
|
||||
|
||||
as5600:
|
||||
slow_filter: 16x
|
||||
|
||||
sensor:
|
||||
- platform: as5600
|
||||
id: encoder_status
|
||||
update_interval: 60s
|
||||
status:
|
||||
name: Encoder status
|
||||
|
||||
- platform: as5600
|
||||
name: Encoder
|
||||
id: encoder
|
||||
update_interval: 0s # beware of the polling rate
|
||||
filters:
|
||||
- delta: 2 # throttle the high polling rate to only act on value changes
|
||||
# compute absolute position from angle value
|
||||
- lambda: |
|
||||
const uint16_t curr = x; //current encoder value 0-4095
|
||||
const uint16_t prev = id(encoder_tracking_)[0]; //previous encoder value 0-4095
|
||||
if (curr > 3000 && prev < 1000) {
|
||||
id(encoder_tracking_)[1] -= (4095 - curr + prev); // crossed zero clockwise (went under 0)
|
||||
} else if (curr < 1000 && prev > 3000) {
|
||||
id(encoder_tracking_)[1] += (4095 - prev + curr); // crossed zero counterclockwise (went over 4095)
|
||||
} else {
|
||||
id(encoder_tracking_)[1] += (curr - prev);
|
||||
}
|
||||
id(encoder_tracking_)[0] = curr;
|
||||
return id(encoder_tracking_)[1];
|
||||
- multiply: -1.0
|
||||
accuracy_decimals: 0
|
||||
state_class: measurement
|
||||
|
||||
- platform: adc
|
||||
pin: 4
|
||||
name: VBUS Voltage
|
||||
update_interval: 10s
|
||||
attenuation: 12dB
|
||||
filters:
|
||||
- multiply: 8.47742
|
||||
|
||||
cover:
|
||||
- platform: template
|
||||
id: pd_blinds
|
||||
name: PD Stepper Blinds
|
||||
has_position: true
|
||||
assumed_state: false
|
||||
# internal: true
|
||||
lambda: "return 1.0 - ((id(encoder)->get_state()-id(sensored_home_pos)) / ${encoder_closed_pos});"
|
||||
stop_action:
|
||||
- tmc2209.disable: motor
|
||||
open_action:
|
||||
- stepper.report_position:
|
||||
id: motor
|
||||
position: !lambda return (1.0-id(pd_blinds)->position) * ${encoder_closed_pos} * ${stepper_encoder_ratio};
|
||||
- stepper.set_target:
|
||||
id: motor
|
||||
target: 0
|
||||
close_action:
|
||||
- stepper.report_position:
|
||||
id: motor
|
||||
position: !lambda return (1.0-id(pd_blinds)->position) * ${encoder_closed_pos} * ${stepper_encoder_ratio};
|
||||
- stepper.set_target:
|
||||
id: motor
|
||||
target: !lambda return ${encoder_closed_pos} * ${stepper_encoder_ratio} * 1.01;
|
||||
position_action:
|
||||
- stepper.report_position:
|
||||
id: motor
|
||||
position: !lambda return (1.0-id(pd_blinds)->position) * ${encoder_closed_pos} * ${stepper_encoder_ratio};
|
||||
- stepper.set_target:
|
||||
id: motor
|
||||
target: !lambda return (1.0-pos) * ${encoder_closed_pos} * ${stepper_encoder_ratio};
|
||||
@ -1,34 +1,17 @@
|
||||
# PD Stepper ESPHome Config
|
||||
# https://github.com/joshr120/PD-Stepper
|
||||
|
||||
# Todo:
|
||||
# - add sensorless homing/serial comms to TMC2209
|
||||
# - VBUS_SENSE adc read
|
||||
# - Motor NTC read
|
||||
|
||||
|
||||
# Enable Home Assistant API
|
||||
api:
|
||||
encryption:
|
||||
key: "c1uNv/dyYPAkygiSdfpmM2UlQzi1B9xElFm3sKEeEFc=" #EXAMPLE KEY GENERATE YOUR OWN
|
||||
|
||||
ota:
|
||||
password: "PASSWORD"
|
||||
# Simple example using step/dir control with the A4988 Component
|
||||
|
||||
wifi:
|
||||
ssid: !secret wifi_ssid
|
||||
password: !secret wifi_password
|
||||
|
||||
# Enable fallback hotspot (captive portal) in case wifi connection fails
|
||||
ap:
|
||||
ssid: "PD-Stepper Fallback Hotspot"
|
||||
password: "password"
|
||||
|
||||
captive_portal:
|
||||
api:
|
||||
|
||||
ota:
|
||||
- platform: esphome
|
||||
|
||||
esphome:
|
||||
name: stepper-motor
|
||||
name: pd-stepper-blinds
|
||||
# Set microstepping and PD voltage pins on boot
|
||||
on_boot:
|
||||
priority: 600
|
||||
@ -70,13 +53,6 @@ output:
|
||||
pin: GPIO47
|
||||
id: CFG3_pin
|
||||
|
||||
- platform: ledc
|
||||
pin: GPIO10
|
||||
id: LED1_PIN
|
||||
- platform: ledc
|
||||
pin: GPIO12
|
||||
id: LED2_PIN
|
||||
|
||||
|
||||
# Define binary input sensor for power_good and push button
|
||||
binary_sensor:
|
||||
@ -121,8 +97,8 @@ stepper:
|
||||
step_pin: GPIO5
|
||||
dir_pin:
|
||||
number: GPIO6
|
||||
inverted: false #invert to change direction
|
||||
max_speed: 16000 steps/s #will depend on which microstep mode is set
|
||||
inverted: false #to change direction (depending on what side blind is on?)
|
||||
max_speed: 16000 steps/s #depends on microstep set
|
||||
|
||||
sleep_pin:
|
||||
number: GPIO21
|
||||
@ -192,22 +168,11 @@ sensor:
|
||||
status:
|
||||
name: Status
|
||||
|
||||
#Read VBUS voltage (could be used to debug PD voltage etc)
|
||||
#Read VBUS voltage
|
||||
- platform: adc
|
||||
pin: GPIO4
|
||||
name: "VBUS Voltage"
|
||||
pin: 4
|
||||
name: VBUS Voltage
|
||||
update_interval: 10s
|
||||
attenuation: 11dB
|
||||
attenuation: 12dB
|
||||
filters:
|
||||
- multiply: 8.47742
|
||||
|
||||
light:
|
||||
- platform: monochromatic
|
||||
output: LED1_PIN
|
||||
id: LED1
|
||||
name: "LED 1"
|
||||
- platform: monochromatic
|
||||
output: LED2_PIN
|
||||
id: LED2
|
||||
name: "LED 2"
|
||||
|
||||
218
Software/ESPHome/PD-Stepper-Position-Control.yaml
Normal file
218
Software/ESPHome/PD-Stepper-Position-Control.yaml
Normal file
@ -0,0 +1,218 @@
|
||||
# This example uses a custom TMC2209 component to control the PD Stepper
|
||||
# Motor can be moved using a slider within ESPHome
|
||||
|
||||
external_components:
|
||||
- source: github://slimcdk/esphome-custom-components
|
||||
components: [tmc2209, stepper]
|
||||
|
||||
globals:
|
||||
- id: encoder_tracking_
|
||||
type: int32_t[2]
|
||||
restore_value: no
|
||||
|
||||
wifi:
|
||||
ssid: !secret wifi_ssid
|
||||
password: !secret wifi_password
|
||||
|
||||
api:
|
||||
|
||||
ota:
|
||||
- platform: esphome
|
||||
|
||||
logger:
|
||||
|
||||
esp32:
|
||||
board: esp32-s3-devkitc-1
|
||||
framework:
|
||||
type: esp-idf
|
||||
|
||||
esphome:
|
||||
name: pd-stepper
|
||||
platformio_options:
|
||||
board_build.flash_mode: dio
|
||||
upload_speed: 921600
|
||||
on_boot:
|
||||
- tmc2209.configure:
|
||||
microsteps: 4
|
||||
direction: clockwise
|
||||
interpolation: true
|
||||
tcool_threshold: 400
|
||||
- tmc2209.stallguard:
|
||||
threshold: 60
|
||||
- tmc2209.currents:
|
||||
irun: 16
|
||||
ihold: 0
|
||||
tpowerdown: 0
|
||||
iholddelay: 0
|
||||
standstill_mode: freewheeling
|
||||
|
||||
#set PD voltage # 5V 9V 12V 15V 20V
|
||||
- output.turn_off: # 1 0 0 0 0
|
||||
id: CFG1_pin
|
||||
- output.turn_on: # - 0 0 1 1
|
||||
id: CFG2_pin
|
||||
- output.turn_off: # - 0 1 1 0
|
||||
id: CFG3_pin
|
||||
|
||||
i2c:
|
||||
sda: 8
|
||||
scl: 9
|
||||
scan: true
|
||||
|
||||
uart:
|
||||
tx_pin: 17
|
||||
rx_pin: 18
|
||||
baud_rate: 712000
|
||||
|
||||
output:
|
||||
- platform: ledc
|
||||
pin: 10
|
||||
id: led1_output
|
||||
|
||||
- platform: ledc
|
||||
pin: 12
|
||||
id: led2_output
|
||||
|
||||
- platform: gpio
|
||||
pin: GPIO38
|
||||
id: CFG1_pin
|
||||
- platform: gpio
|
||||
pin: GPIO48
|
||||
id: CFG2_pin
|
||||
- platform: gpio
|
||||
pin: GPIO47
|
||||
id: CFG3_pin
|
||||
|
||||
|
||||
light:
|
||||
- platform: monochromatic
|
||||
output: led1_output
|
||||
id: led1
|
||||
name: LED 1
|
||||
- platform: status_led
|
||||
output: led2_output
|
||||
id: led2
|
||||
name: Status LED
|
||||
|
||||
stepper:
|
||||
- platform: tmc2209
|
||||
id: driver
|
||||
max_speed: 800 steps/s
|
||||
acceleration: 1500 steps/s^2
|
||||
deceleration: 1500 steps/s^2
|
||||
rsense: 100 mOhm
|
||||
vsense: False
|
||||
enn_pin: 21
|
||||
diag_pin: 16
|
||||
index_pin: 11
|
||||
on_status:
|
||||
- logger.log:
|
||||
format: "Driver is reporting an update! (code %d)"
|
||||
args: ["code"]
|
||||
on_stall:
|
||||
- logger.log: "Motor stalled!"
|
||||
- stepper.stop: driver
|
||||
- light.turn_on:
|
||||
id: led1
|
||||
transition_length: 0s
|
||||
- delay: 250ms
|
||||
- light.turn_off:
|
||||
id: led1
|
||||
transition_length: 1s
|
||||
|
||||
button:
|
||||
- platform: restart
|
||||
name: Restart
|
||||
|
||||
- platform: template
|
||||
name: Stop
|
||||
on_press:
|
||||
- stepper.stop: driver
|
||||
|
||||
binary_sensor:
|
||||
- platform: gpio
|
||||
name: Power Good
|
||||
pin:
|
||||
number: 15
|
||||
mode: INPUT
|
||||
inverted: true
|
||||
device_class: power
|
||||
filters:
|
||||
- delayed_on: 10ms
|
||||
|
||||
- platform: gpio
|
||||
name: Button 1
|
||||
pin:
|
||||
number: 35
|
||||
mode: INPUT
|
||||
inverted: true
|
||||
id: btn1
|
||||
filters:
|
||||
- delayed_on: 10ms
|
||||
|
||||
- platform: gpio
|
||||
name: Button 2
|
||||
id: btn2
|
||||
pin:
|
||||
number: 36
|
||||
mode: INPUT
|
||||
inverted: true
|
||||
filters:
|
||||
- delayed_on: 10ms
|
||||
|
||||
- platform: gpio
|
||||
name: Button 3
|
||||
id: btn3
|
||||
pin:
|
||||
number: 37
|
||||
mode: INPUT
|
||||
inverted: true
|
||||
filters:
|
||||
- delayed_on: 10ms
|
||||
|
||||
as5600:
|
||||
slow_filter: 16x
|
||||
|
||||
sensor:
|
||||
- platform: as5600
|
||||
name: Encoder
|
||||
id: encoder
|
||||
update_interval: 0s # beware of the polling rate
|
||||
filters:
|
||||
- delta: 2
|
||||
# filter which computes absolute position from angle value
|
||||
- lambda: |
|
||||
const uint16_t curr = x; //current encoder value 0-4095
|
||||
const uint16_t prev = id(encoder_tracking_)[0]; //previous encoder value 0-4095
|
||||
if (curr > 3000 && prev < 1000) {
|
||||
id(encoder_tracking_)[1] -= (4095 - curr + prev); // crossed zero clockwise (went under 0)
|
||||
} else if (curr < 1000 && prev > 3000) {
|
||||
id(encoder_tracking_)[1] += (4095 - prev + curr); // crossed zero counterclockwise (went over 4095)
|
||||
} else {
|
||||
id(encoder_tracking_)[1] += (curr - prev);
|
||||
}
|
||||
id(encoder_tracking_)[0] = curr;
|
||||
return id(encoder_tracking_)[1];
|
||||
accuracy_decimals: 0
|
||||
state_class: measurement
|
||||
|
||||
- platform: adc
|
||||
pin: 4
|
||||
name: VBUS Voltage
|
||||
update_interval: 10s
|
||||
attenuation: 12dB
|
||||
filters:
|
||||
- multiply: 8.47742
|
||||
|
||||
number:
|
||||
- platform: template
|
||||
name: Target position
|
||||
min_value: -10000
|
||||
max_value: 10000
|
||||
step: 100
|
||||
lambda: return id(driver)->current_position;
|
||||
update_interval: 1s
|
||||
set_action:
|
||||
- stepper.set_target:
|
||||
id: driver
|
||||
target: !lambda "return x;"
|
||||
Loading…
Reference in New Issue
Block a user