Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
ACC
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Alfonso Parra Rubio
ACC
Commits
c19e834e
Commit
c19e834e
authored
2 months ago
by
Quentin Bolsee
Browse files
Options
Downloads
Patches
Plain Diff
Edit cane_control.ino
parent
3925f9df
Branches
main
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
code/cane_control/cane_control.ino
+131
-63
131 additions, 63 deletions
code/cane_control/cane_control.ino
with
131 additions
and
63 deletions
code/cane_control/cane_control.ino
+
131
−
63
View file @
c19e834e
...
...
@@ -2,6 +2,8 @@
#include
<AccelStepper.h>
#include
<Adafruit_SSD1306.h>
//#define DRYRUN
#define PIN_STEP1 28
#define PIN_DIR1 29
#define PIN_STEP2 26
...
...
@@ -11,6 +13,8 @@
#define PIN_ENC_B 4
#define READ_FAST(pin) ((sio_hw->gpio_in & (1 << pin)) > 0)
#define T_DEBOUNCE 100
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
...
...
@@ -21,21 +25,25 @@
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
#define SERIAL_BAUD_RATE 115200
#define RUN_CURRENT_PERCENT 80
#define STALL_GUARD_THRESHOLD 70
#define HOMING_VELOCITY 400
#define RUN_CURRENT_PERCENT 85
#define STALL_GUARD_THRESHOLD 90
#define HOMING_VELOCITY 200
#define MOVE_SPEED1 1200
#define MOVE_ACC1 2000
#define MOVE_SPEED
80
0
#define MOVE_ACC
12
00
#define MOVE_SPEED
2 35
0
#define MOVE_ACC
2 6
00
#define MICROSTEPS 4
#define MICROSTEPS_PER_TURN (200L*MICROSTEPS)
#define MICROSTEPS_PER_TURN1 (57*200L*MICROSTEPS/11)
#define MICROSTEPS_PER_TURN2 (200L*MICROSTEPS)
#define ANGLE_INIT 16
#define ANGLE_READY 340
#define STATE_MENU 0
#define STATE_
COCK
ING 1
#define STATE_
ARM
ING 1
#define STATE_FEEDING 2
int
machine_state
=
STATE_MENU
;
...
...
@@ -47,8 +55,8 @@ Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
AccelStepper
stepper1
(
AccelStepper
::
DRIVER
,
PIN_STEP1
,
PIN_DIR1
);
AccelStepper
stepper2
(
AccelStepper
::
DRIVER
,
PIN_STEP2
,
PIN_DIR2
);
TMC2209
stepper_driver
1
;
TMC2209
stepper_driver
2
;
TMC2209
stepper
1
_driver
;
TMC2209
stepper
2
_driver
;
int
state_now
=
0b00
;
int
state_prev
=
0b00
;
...
...
@@ -59,17 +67,17 @@ float length = 5.00;
int
counter
=
0
;
int
cutting
=
false
;
bool
update
_screen
=
true
;
bool
refresh
_screen
=
true
;
int
k
=
0
;
long
int
length_to_step
(
float
d
)
{
// 1 inch per revolution
return
MICROSTEPS_PER_TURN
*
d
/
3.14159
;
return
MICROSTEPS_PER_TURN
1
*
d
/
M_PI
;
}
long
int
angle_to_step
(
int
angle
)
{
return
2
*
MICROSTEPS_PER_TURN
*
angle
/
360
;
return
MICROSTEPS_PER_TURN
2
*
angle
/
360
;
}
inline
void
update_knob
()
{
...
...
@@ -89,7 +97,7 @@ inline void update_knob() {
length
=
LENGTH_MIN
;
}
}
update
_screen
=
true
;
refresh
_screen
=
true
;
}
state_prev
=
state_now
;
}
...
...
@@ -100,32 +108,28 @@ void pin_AB_change() {
}
void
homing
()
{
stepper_driver2
.
moveAtVelocity
(
-
HOMING_VELOCITY
);
delay
(
200
);
stepper_driver2
.
moveAtVelocity
(
HOMING_VELOCITY
);
stepper2_driver
.
moveAtVelocity
(
HOMING_VELOCITY
);
delay
(
100
);
bool
done
=
false
;
while
(
!
done
)
{
uint16_t
stall_guard_result
=
stepper_driver
2
.
getStallGuardResult
();
uint16_t
stall_guard_result
=
stepper
2
_driver
.
getStallGuardResult
();
done
=
stall_guard_result
<
STALL_GUARD_THRESHOLD
;
Serial
.
println
(
stall_guard_result
);
}
stepper_driver
2
.
moveAtVelocity
(
0
);
stepper_driver2
.
enable
(
);
stepper
2
_driver
.
moveAtVelocity
(
0
);
delay
(
100
);
stepper2_driver
.
enable
();
stepper2
.
moveTo
(
angle_to_step
(
ANGLE_INIT
));
stepper2
.
runToPosition
();
stepper2
.
setCurrentPosition
(
0
);
stepper2
.
moveTo
(
angle_to_step
(
ANGLE_READY
));
stepper2
.
runToPosition
();
}
void
setup
()
{
Serial
.
begin
(
0
);
delay
(
2000
);
pinMode
(
PIN_ENC_A
,
INPUT
);
pinMode
(
PIN_ENC_B
,
INPUT
);
pinMode
(
PIN_BTN
,
INPUT_PULLUP
);
delay
(
1000
);
display
.
begin
(
SSD1306_SWITCHCAPVCC
,
SCREEN_ADDRESS
);
display
.
setTextSize
(
1
);
// Normal 1:1 pixel scale
...
...
@@ -135,91 +139,140 @@ void setup() {
display
.
clearDisplay
();
display
.
cp437
(
true
);
stepper_driver1
.
setup
(
serial_stream
,
SERIAL_BAUD_RATE
,
TMC2209
::
SERIAL_ADDRESS_1
);
stepper_driver1
.
setRunCurrent
(
RUN_CURRENT_PERCENT
);
stepper_driver1
.
setMicrostepsPerStep
(
MICROSTEPS
);
#ifndef DRYRUN
stepper1_driver
.
setup
(
serial_stream
,
SERIAL_BAUD_RATE
,
TMC2209
::
SERIAL_ADDRESS_1
);
stepper1_driver
.
setRunCurrent
(
RUN_CURRENT_PERCENT
);
stepper1_driver
.
setHoldCurrent
(
RUN_CURRENT_PERCENT
);
stepper1_driver
.
setMicrostepsPerStep
(
MICROSTEPS
);
delay
(
50
);
stepper_driver2
.
setup
(
serial_stream
,
SERIAL_BAUD_RATE
,
TMC2209
::
SERIAL_ADDRESS_0
);
stepper_driver2
.
setRunCurrent
(
RUN_CURRENT_PERCENT
);
stepper_driver2
.
setMicrostepsPerStep
(
MICROSTEPS
);
stepper_driver2
.
enable
();
delay
(
50
);
stepper2_driver
.
setup
(
serial_stream
,
SERIAL_BAUD_RATE
,
TMC2209
::
SERIAL_ADDRESS_0
);
stepper2_driver
.
setRunCurrent
(
RUN_CURRENT_PERCENT
);
stepper2_driver
.
setHoldCurrent
(
RUN_CURRENT_PERCENT
);
stepper2_driver
.
setMicrostepsPerStep
(
MICROSTEPS
);
stepper2_driver
.
enable
();
display
.
clearDisplay
();
display
.
setCursor
(
0
,
0
);
display
.
print
(
"Homing..."
);
display
.
display
();
#endif
stepper1
.
setMaxSpeed
(
MOVE_SPEED
);
stepper1
.
setAcceleration
(
MOVE_ACC
);
stepper1
.
setMaxSpeed
(
MOVE_SPEED
1
);
stepper1
.
setAcceleration
(
MOVE_ACC
1
);
stepper1
.
setPinsInverted
(
true
);
stepper2
.
setMaxSpeed
(
MOVE_SPEED
);
stepper2
.
setAcceleration
(
MOVE_ACC
);
stepper2
.
setMaxSpeed
(
MOVE_SPEED
2
);
stepper2
.
setAcceleration
(
MOVE_ACC
2
);
#ifndef DRYRUN
homing
();
#endif
state_now
=
READ_FAST
(
PIN_ENC_A
)
|
(
READ_FAST
(
PIN_ENC_B
)
<<
1
);
state_prev
=
state_now
;
// encoder
pinMode
(
PIN_ENC_A
,
INPUT
);
pinMode
(
PIN_ENC_B
,
INPUT
);
pinMode
(
PIN_BTN
,
INPUT_PULLUP
);
attachInterrupt
(
digitalPinToInterrupt
(
PIN_ENC_A
),
pin_AB_change
,
CHANGE
);
attachInterrupt
(
digitalPinToInterrupt
(
PIN_ENC_B
),
pin_AB_change
,
CHANGE
);
}
void
loop
()
{
static
int
btn_pressed
=
false
;
int
btn_pressed_now
=
!
digitalRead
(
PIN_BTN
);
bool
just_pressed
=
btn_pressed_now
&&
!
btn_pressed
;
static
int
btn_pressed_prev
=
false
;
static
int
machine_state_prev
=
machine_state
;
static
bool
init
=
false
;
static
unsigned
long
t_last_changed
=
0
;
static
unsigned
long
dt_debounce
=
T_DEBOUNCE
;
bool
just_pressed
=
false
;
int
btn_pressed
=
btn_pressed_prev
;
if
(
dt_debounce
<
T_DEBOUNCE
)
{
dt_debounce
=
millis
()
-
t_last_changed
;
}
else
{
btn_pressed
=
!
digitalRead
(
PIN_BTN
);
just_pressed
=
btn_pressed
&&
!
btn_pressed_prev
;
if
(
btn_pressed
!=
btn_pressed_prev
)
{
t_last_changed
=
millis
();
dt_debounce
=
0
;
}
}
stepper1
.
run
();
stepper2
.
run
();
switch
machine_state
{
machine_state_prev
=
machine_state
;
switch
(
machine_state
)
{
case
STATE_MENU
:
if
(
just_pressed
)
{
// prepare
machine_state
=
STATE_COCKING
;
stepper_driver1
.
enable
();
stepper1
.
setCurrentPosition
(
0
);
#ifndef DRYRUN
stepper1_driver
.
enable
();
#endif
stepper2
.
moveTo
(
angle_to_step
(
ANGLE_READY
));
update_screen
=
true
;
if
(
stepper2
.
distanceToGo
()
==
0
)
{
machine_state
=
STATE_FEEDING
;
stepper1
.
moveTo
(
length_to_step
(
length
));
}
else
{
machine_state
=
STATE_ARMING
;
}
}
break
;
case
STATE_
COCK
ING
:
case
STATE_
ARM
ING
:
if
(
just_pressed
)
{
machine_state
=
STATE_MENU
;
stepper_driver1
.
disable
();
update_screen
=
true
;
stepper1
.
stop
();
#ifndef DRYRUN
stepper1_driver
.
disable
();
#endif
}
else
if
(
!
stepper2
.
isRunning
())
{
machine_state
=
STATE_FEEDING
;
stepper1
.
moveTo
(
lengt_to_step
(
length
));
stepper1
.
moveTo
(
lengt
h
_to_step
(
length
));
}
break
;
case
STATE_FEEDING
:
if
(
just_pressed
)
{
machine_state
=
STATE_MENU
;
stepper_driver1
.
disable
();
update_screen
=
true
;
stepper1
.
stop
();
#ifndef DRYRUN
stepper1_driver
.
disable
();
#endif
}
else
if
(
!
stepper1
.
isRunning
())
{
// chop!
// CHOP!
display
.
clearDisplay
();
display
.
setCursor
(
0
,
0
);
display
.
printf
(
"Length: %8.2f in
\n
"
,
length
);
display
.
setCursor
(
0
,
16
);
display
.
printf
(
"Counter: %7d cuts
\n
"
,
counter
);
display
.
setCursor
(
4
,
50
);
display
.
println
(
"CHOP!"
);
display
.
display
();
stepper2
.
moveTo
(
angle_to_step
(
360
));
stepper2
.
runToPosition
();
stepper2
.
setCurrentPosition
(
0
);
counter
++
;
update_screen
=
true
;
// prepare
machine_state
=
STATE_COCKING
;
machine_state
=
STATE_ARMING
;
stepper1
.
setCurrentPosition
(
0
);
stepper2
.
moveTo
(
angle_to_step
(
ANGLE_READY
));
}
break
;
}
if
(
update_screen
)
{
update_screen
=
false
;
refresh_screen
|=
machine_state_prev
!=
machine_state
;
if
(
refresh_screen
)
{
refresh_screen
=
false
;
display
.
clearDisplay
();
display
.
setCursor
(
0
,
0
);
display
.
printf
(
"Length: %8.2f in
\n
"
,
length
);
...
...
@@ -228,11 +281,26 @@ void loop() {
display
.
printf
(
"Counter: %7d cuts
\n
"
,
counter
);
display
.
setCursor
(
0
,
40
);
display
.
println
(
cutting
?
"RUNNING..."
:
"STOPPED"
);
switch
(
machine_state
)
{
case
STATE_MENU
:
display
.
println
(
"STOPPED"
);
display
.
setCursor
(
0
,
56
);
display
.
println
(
"[ press to START ]"
);
break
;
case
STATE_ARMING
:
display
.
println
(
"ARMING..."
);
display
.
setCursor
(
0
,
56
);
display
.
println
(
cutting
?
"[ press to stop ]"
:
"[ press to start ]"
);
display
.
println
(
"[ press to STOP ]"
);
break
;
case
STATE_FEEDING
:
display
.
println
(
"FEEDING..."
);
display
.
setCursor
(
0
,
56
);
display
.
println
(
"[ press to STOP ]"
);
break
;
}
display
.
display
();
}
btn_pressed
=
btn_pressed_now
;
machine_state_prev
=
machine_state
;
btn_pressed_prev
=
btn_pressed
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment