Merge branch 'main' of https://github.com/0x23/MicroManipulatorStepper
This commit is contained in:
commit
351266ddbb
15 changed files with 63 additions and 24 deletions
15
README.md
15
README.md
|
|
@ -19,6 +19,12 @@ A 'magnetic gearing' approach increases the resolution of the low-cost magnetic
|
||||||
The device can be controlled via simple G-Code commands over a USB serial interface and is thus easily integrated into other projects.
|
The device can be controlled via simple G-Code commands over a USB serial interface and is thus easily integrated into other projects.
|
||||||
The firmware implements a complete motion planning stack with look-ahead for smooth and accurate path following capabilities.
|
The firmware implements a complete motion planning stack with look-ahead for smooth and accurate path following capabilities.
|
||||||
|
|
||||||
|
|
||||||
|
## 💬 NEW: Discord Server
|
||||||
|
|
||||||
|
Visit the projects community [Discord Server](https://discord.gg/maRvMVpa2Q) to meet and discuss subjects related to the project,
|
||||||
|
get help for the build or share ideas and applications.
|
||||||
|
|
||||||
## 🐍 NEW: Python-API
|
## 🐍 NEW: Python-API
|
||||||
|
|
||||||
The lightweight Python API handles all serial communication and provides convenient command execution and debug message printing.
|
The lightweight Python API handles all serial communication and provides convenient command execution and debug message printing.
|
||||||
|
|
@ -163,5 +169,14 @@ The client must wait for an acknowledgment from the previous command before send
|
||||||
|
|
||||||
*Note: The communication protocol uses 3D vectors for rotations. The direction represents the rotation axis and the length of the vector represents the angle of rotation around the axis.
|
*Note: The communication protocol uses 3D vectors for rotations. The direction represents the rotation axis and the length of the vector represents the angle of rotation around the axis.
|
||||||
|
|
||||||
|
## ❤️ Support
|
||||||
|
|
||||||
|
If you'd like to support this project, consider the following:
|
||||||
|
|
||||||
|
- **Contribute to the build guide** – Help improve or expand the build instructions by submitting pull requests or opening issues with suggestions.
|
||||||
|
- **Characterize typical radial stepper motor shaft error motion** – Measure radial error motion of the shaft of multiple Nema-17 stepper motors (see Cylos Garage for more information about the subject: https://www.youtube.com/watch?v=gt2gK-oxy5s).
|
||||||
|
- **Give feedback on the build experience** – Let us know what worked, what didn’t, and how the process could be smoother for others.
|
||||||
|
- **Support the project on Ko-fi** – If you find this project valuable, you can support it financially via [Ko-fi](https://ko-fi.com/diffractionlimited) ☕.
|
||||||
|
|
||||||
## Youtube Video
|
## Youtube Video
|
||||||
[](https://youtu.be/MgQbPdiuUTw)
|
[](https://youtu.be/MgQbPdiuUTw)
|
||||||
|
|
|
||||||
16
documentation/build_guides/buildguide_3dof.md
Normal file
16
documentation/build_guides/buildguide_3dof.md
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
# Open MircoManipulator 3DOF - Build Guide
|
||||||
|
|
||||||
|
This document shall provide an easy to follow build guide and help with material selection like glues/magnets and so on.
|
||||||
|
The following structure is just a placeholder, feel free to contribute...
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
## Bill of Materials
|
||||||
|
|
||||||
|
## Components
|
||||||
|
### Mechanical Parts
|
||||||
|
### Magnet Selection
|
||||||
|
|
||||||
|
## Balljoints
|
||||||
|
## Assembly
|
||||||
|
|
||||||
7
electronics/.gitignore
vendored
7
electronics/.gitignore
vendored
|
|
@ -24,3 +24,10 @@ fp-info-cache
|
||||||
|
|
||||||
# Footprint association file (exported from Pcbnew)
|
# Footprint association file (exported from Pcbnew)
|
||||||
*.cmp
|
*.cmp
|
||||||
|
|
||||||
|
# Kicad default backup folder
|
||||||
|
*-backups/
|
||||||
|
|
||||||
|
# Gerber files
|
||||||
|
*.g*
|
||||||
|
*.drl
|
||||||
|
|
|
||||||
|
|
@ -26,3 +26,4 @@ platform = https://github.com/maxgerhardt/platform-raspberrypi.git
|
||||||
board = rpipico2 # RP2530
|
board = rpipico2 # RP2530
|
||||||
# board = rpipico # RP2040
|
# board = rpipico # RP2040
|
||||||
framework = arduino
|
framework = arduino
|
||||||
|
lib_deps = mryslab/NeoPixelConnect
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,11 @@
|
||||||
|
|
||||||
class Pose6DF;
|
class Pose6DF;
|
||||||
|
|
||||||
//--- IKinemtaicModel -------------------------------------------------------------------
|
//--- IKinematicModel -------------------------------------------------------------------
|
||||||
|
|
||||||
class IKinemtaicModel {
|
class IKinematicModel {
|
||||||
public:
|
public:
|
||||||
virtual ~IKinemtaicModel() {};
|
virtual ~IKinematicModel() {};
|
||||||
|
|
||||||
// returns the number of joints
|
// returns the number of joints
|
||||||
virtual int get_joint_count();
|
virtual int get_joint_count();
|
||||||
|
|
@ -16,9 +16,9 @@
|
||||||
|
|
||||||
class Pose6DF;
|
class Pose6DF;
|
||||||
|
|
||||||
//--- KinemtaicModel_Delta3D ------------------------------------------------------------
|
//--- KinematicModel_Delta3D ------------------------------------------------------------
|
||||||
|
|
||||||
class KinematicModel_Delta3D : public IKinemtaicModel {
|
class KinematicModel_Delta3D : public IKinematicModel {
|
||||||
public:
|
public:
|
||||||
KinematicModel_Delta3D();
|
KinematicModel_Delta3D();
|
||||||
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
#include "robot.h"
|
#include "robot.h"
|
||||||
#include "utilities/logging.h"
|
#include "utilities/logging.h"
|
||||||
#include "utilities/frequency_counter.h"
|
#include "utilities/frequency_counter.h"
|
||||||
#include "kinemtaic_models/kinematic_model_delta3d.h"
|
#include "kinematic_models/kinematic_model_delta3d.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "hw_config.h"
|
#include "hw_config.h"
|
||||||
#include "LittleFS.h"
|
#include "LittleFS.h"
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
PathPlanner::PathPlanner(IKinemtaicModel* kinematic_model, float time_step) {
|
PathPlanner::PathPlanner(IKinematicModel* kinematic_model, float time_step) {
|
||||||
PathPlanner::segment_time_step = time_step;
|
PathPlanner::segment_time_step = time_step;
|
||||||
PathPlanner::kinematic_model = kinematic_model;
|
PathPlanner::kinematic_model = kinematic_model;
|
||||||
|
|
||||||
|
|
@ -23,7 +23,7 @@ PathPlanner::PathPlanner(IKinemtaicModel* kinematic_model, float time_step) {
|
||||||
PathPlanner::~PathPlanner() {
|
PathPlanner::~PathPlanner() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PathPlanner::set_kinematic_model(IKinemtaicModel* kinematic_model) {
|
void PathPlanner::set_kinematic_model(IKinematicModel* kinematic_model) {
|
||||||
PathPlanner::kinematic_model = kinematic_model;
|
PathPlanner::kinematic_model = kinematic_model;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
//*** CLASS *****************************************************************************
|
//*** CLASS *****************************************************************************
|
||||||
|
|
||||||
class IKinemtaicModel;
|
class IKinematicModel;
|
||||||
|
|
||||||
//--- PathPlanner -----------------------------------------------------------------------
|
//--- PathPlanner -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
@ -24,11 +24,11 @@ class PathPlanner {
|
||||||
static constexpr int JS_QUEUE_SIZE = 32;
|
static constexpr int JS_QUEUE_SIZE = 32;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PathPlanner(IKinemtaicModel* kinematic_model, float time_step);
|
PathPlanner(IKinematicModel* kinematic_model, float time_step);
|
||||||
~PathPlanner();
|
~PathPlanner();
|
||||||
|
|
||||||
// sets the kinematic model for foreward and inverse kinematic calculations
|
// sets the kinematic model for foreward and inverse kinematic calculations
|
||||||
void set_kinematic_model(IKinemtaicModel* kinematic_model);
|
void set_kinematic_model(IKinematicModel* kinematic_model);
|
||||||
|
|
||||||
// adds a new cartesian space path segment to the planner queue
|
// adds a new cartesian space path segment to the planner queue
|
||||||
bool add_cartesian_path_segment(const CartesianPathSegment& path_segment);
|
bool add_cartesian_path_segment(const CartesianPathSegment& path_segment);
|
||||||
|
|
@ -67,7 +67,7 @@ class PathPlanner {
|
||||||
RingBuffer<CartesianPathSegment, CT_QUEUE_SIZE> ct_path_segment_queue;
|
RingBuffer<CartesianPathSegment, CT_QUEUE_SIZE> ct_path_segment_queue;
|
||||||
RingBuffer<JointSpacePathSegment, JS_QUEUE_SIZE> js_path_segment_queue;
|
RingBuffer<JointSpacePathSegment, JS_QUEUE_SIZE> js_path_segment_queue;
|
||||||
|
|
||||||
IKinemtaicModel* kinematic_model;
|
IKinematicModel* kinematic_model;
|
||||||
JointSpacePathSegmentGenerator* segment_generator = nullptr;
|
JointSpacePathSegmentGenerator* segment_generator = nullptr;
|
||||||
float segment_time_step;
|
float segment_time_step;
|
||||||
LinearAngular junction_deviation;
|
LinearAngular junction_deviation;
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
#include "path_segment.h"
|
#include "path_segment.h"
|
||||||
#include "utilities/logging.h"
|
#include "utilities/logging.h"
|
||||||
#include "kinemtaic_models/kinematic_model_base.h"
|
#include "kinematic_models/kinematic_model_base.h"
|
||||||
|
|
||||||
//--- MotionProfileConstAcc -------------------------------------------------------------
|
//--- MotionProfileConstAcc -------------------------------------------------------------
|
||||||
|
|
||||||
|
|
@ -248,7 +248,7 @@ bool JointSpacePathSegment::is_initialized() {
|
||||||
|
|
||||||
JointSpacePathSegmentGenerator::JointSpacePathSegmentGenerator(
|
JointSpacePathSegmentGenerator::JointSpacePathSegmentGenerator(
|
||||||
const CartesianPathSegment* path_segment,
|
const CartesianPathSegment* path_segment,
|
||||||
IKinemtaicModel* kinematic_model,
|
IKinematicModel* kinematic_model,
|
||||||
float time_step)
|
float time_step)
|
||||||
{
|
{
|
||||||
JointSpacePathSegmentGenerator::path_segment = path_segment;
|
JointSpacePathSegmentGenerator::path_segment = path_segment;
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ constexpr int NUM_JOINTS = 3;
|
||||||
|
|
||||||
//*** CLASS *****************************************************************************
|
//*** CLASS *****************************************************************************
|
||||||
|
|
||||||
class IKinemtaicModel;
|
class IKinematicModel;
|
||||||
|
|
||||||
//--- JointInfo -------------------------------------------------------------------------
|
//--- JointInfo -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
@ -127,7 +127,7 @@ class JointSpacePathSegmentGenerator {
|
||||||
public:
|
public:
|
||||||
JointSpacePathSegmentGenerator(
|
JointSpacePathSegmentGenerator(
|
||||||
const CartesianPathSegment* path_segment,
|
const CartesianPathSegment* path_segment,
|
||||||
IKinemtaicModel* kinematic_model,
|
IKinematicModel* kinematic_model,
|
||||||
float time_step
|
float time_step
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -143,6 +143,6 @@ class JointSpacePathSegmentGenerator {
|
||||||
float current_joint_pos[NUM_JOINTS]; // current joint positions
|
float current_joint_pos[NUM_JOINTS]; // current joint positions
|
||||||
|
|
||||||
const CartesianPathSegment* path_segment = nullptr;
|
const CartesianPathSegment* path_segment = nullptr;
|
||||||
IKinemtaicModel* kinematic_model;
|
IKinematicModel* kinematic_model;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
#include "hw_config.h"
|
#include "hw_config.h"
|
||||||
#include "utilities/logging.h"
|
#include "utilities/logging.h"
|
||||||
#include "utilities/utilities.h"
|
#include "utilities/utilities.h"
|
||||||
#include "kinemtaic_models/kinematic_model_delta3d.h"
|
#include "kinematic_models/kinematic_model_delta3d.h"
|
||||||
#include "servo_control/homing_controller.h"
|
#include "servo_control/homing_controller.h"
|
||||||
#include "servo_control/actuator_calibration.h"
|
#include "servo_control/actuator_calibration.h"
|
||||||
#include "pico/multicore.h"
|
#include "pico/multicore.h"
|
||||||
|
|
|
||||||
|
|
@ -130,7 +130,7 @@ class Robot : public ICommandProcessor {
|
||||||
RobotJoint* volatile joints[NUM_JOINTS];
|
RobotJoint* volatile joints[NUM_JOINTS];
|
||||||
spin_lock_t* joints_spin_lock = nullptr;
|
spin_lock_t* joints_spin_lock = nullptr;
|
||||||
|
|
||||||
IKinemtaicModel* kinematic_model;
|
IKinematicModel* kinematic_model;
|
||||||
PathPlanner path_planner;
|
PathPlanner path_planner;
|
||||||
MotionController motion_controller;
|
MotionController motion_controller;
|
||||||
CommandParser command_parser;
|
CommandParser command_parser;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue