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
5fb3d129
Commit
5fb3d129
authored
2 months ago
by
Quentin Bolsee
Browse files
Options
Downloads
Patches
Plain Diff
Add new file
parent
bf66840d
No related branches found
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
+184
-0
184 additions, 0 deletions
code/cane_control/cane_control.ino
with
184 additions
and
0 deletions
code/cane_control/cane_control.ino
0 → 100644
+
184
−
0
View file @
5fb3d129
#include
<TMC2209.h>
#include
<AccelStepper.h>
#include
<Adafruit_SSD1306.h>
#define PIN_STEP1 28
#define PIN_DIR1 29
#define PIN_STEP2 26
#define PIN_DIR2 27
#define PIN_BTN 2
#define PIN_ENC_A 3
#define PIN_ENC_B 4
#define READ_FAST(pin) ((sio_hw->gpio_in & (1 << pin)) > 0)
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define LENGTH_MIN (0.05)
#define LENGTH_MAX (4000.0)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#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 80
#define HOMING_VELOCITY 400
#define MOVE_SPEED 800
#define MOVE_ACC 1200
HardwareSerial
&
serial_stream
=
Serial1
;
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_driver1
;
TMC2209
stepper_driver2
;
int
state_now
=
0b00
;
int
state_prev
=
0b00
;
int
lookup_move
[]
=
{
0
,
-
1
,
1
,
-
2
,
1
,
0
,
2
,
-
1
,
-
1
,
2
,
0
,
1
,
-
2
,
1
,
-
1
,
0
};
float
length
=
5.00
;
int
counter
=
0
;
int
active
=
false
;
bool
update_screen
=
true
;
int
k
=
0
;
inline
void
update_knob
()
{
int
key
=
(
state_now
<<
2
)
|
state_prev
;
if
(
!
active
)
{
k
+=
lookup_move
[
key
];
if
(
k
>=
4
)
{
length
+=
0.05
;
k
-=
4
;
if
(
length
>
LENGTH_MAX
)
{
length
=
LENGTH_MAX
;
}
}
else
if
(
k
<=
-
4
)
{
length
-=
0.05
;
k
+=
4
;
if
(
length
<
LENGTH_MIN
)
{
length
=
LENGTH_MIN
;
}
}
update_screen
=
true
;
}
state_prev
=
state_now
;
}
void
pin_AB_change
()
{
state_now
=
(
READ_FAST
(
PIN_ENC_B
)
<<
1
)
|
READ_FAST
(
PIN_ENC_A
);
update_knob
();
}
void
homing
()
{
stepper_driver2
.
moveAtVelocity
(
-
HOMING_VELOCITY
);
delay
(
200
);
stepper_driver2
.
moveAtVelocity
(
HOMING_VELOCITY
);
delay
(
100
);
bool
done
=
false
;
while
(
!
done
)
{
uint16_t
stall_guard_result
=
stepper_driver2
.
getStallGuardResult
();
done
=
stall_guard_result
<
STALL_GUARD_THRESHOLD
;
}
stepper_driver2
.
moveAtVelocity
(
0
);
stepper_driver2
.
enable
();
}
void
setup
()
{
Serial
.
begin
(
0
);
pinMode
(
PIN_ENC_A
,
INPUT
);
pinMode
(
PIN_ENC_B
,
INPUT
);
pinMode
(
PIN_BTN
,
INPUT_PULLUP
);
display
.
begin
(
SSD1306_SWITCHCAPVCC
,
SCREEN_ADDRESS
);
display
.
setTextSize
(
1
);
// Normal 1:1 pixel scale
display
.
setTextColor
(
SSD1306_WHITE
);
// Draw white text
display
.
display
();
delay
(
100
);
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
(
4
);
delay
(
50
);
stepper_driver2
.
setup
(
serial_stream
,
SERIAL_BAUD_RATE
,
TMC2209
::
SERIAL_ADDRESS_0
);
stepper_driver2
.
setRunCurrent
(
RUN_CURRENT_PERCENT
);
stepper_driver2
.
setMicrostepsPerStep
(
4
);
stepper_driver2
.
enable
();
delay
(
50
);
display
.
clearDisplay
();
display
.
setCursor
(
0
,
0
);
display
.
print
(
"Homing..."
);
display
.
display
();
homing
();
stepper1
.
setMaxSpeed
(
MOVE_SPEED
);
stepper1
.
setAcceleration
(
MOVE_ACC
);
stepper2
.
setMaxSpeed
(
MOVE_SPEED
);
stepper2
.
setAcceleration
(
MOVE_ACC
);
state_now
=
READ_FAST
(
PIN_ENC_A
)
|
(
READ_FAST
(
PIN_ENC_B
)
<<
1
);
state_prev
=
state_now
;
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
);
if
(
btn_pressed_now
&&
!
btn_pressed
)
{
active
=
!
active
;
update_screen
=
true
;
if
(
active
)
{
stepper_driver1
.
enable
();
}
else
{
stepper_driver1
.
disable
();
}
}
if
(
active
)
{
stepper1
.
moveTo
(
800
);
stepper1
.
runToPosition
();
stepper1
.
setCurrentPosition
(
0
);
active
=
false
;
update_screen
=
true
;
}
if
(
update_screen
)
{
update_screen
=
false
;
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
(
0
,
40
);
display
.
println
(
active
?
"RUNNING..."
:
"STOPPED"
);
display
.
setCursor
(
0
,
56
);
display
.
println
(
active
?
"[ press to stop ]"
:
"[ press to start ]"
);
display
.
display
();
}
delay
(
1
);
btn_pressed
=
btn_pressed_now
;
}
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