This commit is contained in:
0x23 2025-10-13 23:45:42 +02:00
commit 351266ddbb
15 changed files with 63 additions and 24 deletions

View file

@ -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 didnt, 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
[![Watch the video](images/thumbnail.jpg)](https://youtu.be/MgQbPdiuUTw) [![Watch the video](images/thumbnail.jpg)](https://youtu.be/MgQbPdiuUTw)

View 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

View file

@ -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

View file

@ -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

View file

@ -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();

View file

@ -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();

View file

@ -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"

View file

@ -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;
} }

View file

@ -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;

View file

@ -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;

View file

@ -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;
}; };

View file

@ -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"

View file

@ -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;