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 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
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.
## ❤️ 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
[![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)
*.cmp
# Kicad default backup folder
*-backups/
# Gerber files
*.g*
*.drl

View file

@ -25,4 +25,5 @@
platform = https://github.com/maxgerhardt/platform-raspberrypi.git
board = rpipico2 # RP2530
# board = rpipico # RP2040
framework = arduino
framework = arduino
lib_deps = mryslab/NeoPixelConnect

View file

@ -9,11 +9,11 @@
class Pose6DF;
//--- IKinemtaicModel -------------------------------------------------------------------
//--- IKinematicModel -------------------------------------------------------------------
class IKinemtaicModel {
class IKinematicModel {
public:
virtual ~IKinemtaicModel() {};
virtual ~IKinematicModel() {};
// returns the number of joints
virtual int get_joint_count();

View file

@ -16,9 +16,9 @@
class Pose6DF;
//--- KinemtaicModel_Delta3D ------------------------------------------------------------
//--- KinematicModel_Delta3D ------------------------------------------------------------
class KinematicModel_Delta3D : public IKinemtaicModel {
class KinematicModel_Delta3D : public IKinematicModel {
public:
KinematicModel_Delta3D();
@ -46,4 +46,4 @@ bool circle_sphere_intersection(double r1, const Vec3F& p, double r2, Vec3F inte
bool three_sphere_intersection(const Vec3F& p1, float r1,
const Vec3F& p2, float r2,
const Vec3F& p3, float r3,
Vec3F intersections[2]);
Vec3F intersections[2]);

View file

@ -18,7 +18,7 @@
#include "robot.h"
#include "utilities/logging.h"
#include "utilities/frequency_counter.h"
#include "kinemtaic_models/kinematic_model_delta3d.h"
#include "kinematic_models/kinematic_model_delta3d.h"
#include "version.h"
#include "hw_config.h"
#include "LittleFS.h"
@ -160,4 +160,4 @@ void setup() {
void loop() {
main_core0();
}
}

View file

@ -12,7 +12,7 @@
#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::kinematic_model = kinematic_model;
@ -23,7 +23,7 @@ PathPlanner::PathPlanner(IKinemtaicModel* kinematic_model, float time_step) {
PathPlanner::~PathPlanner() {
}
void PathPlanner::set_kinematic_model(IKinemtaicModel* kinematic_model) {
void PathPlanner::set_kinematic_model(IKinematicModel* kinematic_model) {
PathPlanner::kinematic_model = kinematic_model;
}

View file

@ -14,7 +14,7 @@
//*** CLASS *****************************************************************************
class IKinemtaicModel;
class IKinematicModel;
//--- PathPlanner -----------------------------------------------------------------------
@ -24,11 +24,11 @@ class PathPlanner {
static constexpr int JS_QUEUE_SIZE = 32;
public:
PathPlanner(IKinemtaicModel* kinematic_model, float time_step);
PathPlanner(IKinematicModel* kinematic_model, float time_step);
~PathPlanner();
// 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
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<JointSpacePathSegment, JS_QUEUE_SIZE> js_path_segment_queue;
IKinemtaicModel* kinematic_model;
IKinematicModel* kinematic_model;
JointSpacePathSegmentGenerator* segment_generator = nullptr;
float segment_time_step;
LinearAngular junction_deviation;

View file

@ -7,7 +7,7 @@
#include "path_segment.h"
#include "utilities/logging.h"
#include "kinemtaic_models/kinematic_model_base.h"
#include "kinematic_models/kinematic_model_base.h"
//--- MotionProfileConstAcc -------------------------------------------------------------
@ -248,7 +248,7 @@ bool JointSpacePathSegment::is_initialized() {
JointSpacePathSegmentGenerator::JointSpacePathSegmentGenerator(
const CartesianPathSegment* path_segment,
IKinemtaicModel* kinematic_model,
IKinematicModel* kinematic_model,
float time_step)
{
JointSpacePathSegmentGenerator::path_segment = path_segment;

View file

@ -17,7 +17,7 @@ constexpr int NUM_JOINTS = 3;
//*** CLASS *****************************************************************************
class IKinemtaicModel;
class IKinematicModel;
//--- JointInfo -------------------------------------------------------------------------
@ -127,7 +127,7 @@ class JointSpacePathSegmentGenerator {
public:
JointSpacePathSegmentGenerator(
const CartesianPathSegment* path_segment,
IKinemtaicModel* kinematic_model,
IKinematicModel* kinematic_model,
float time_step
);
@ -143,6 +143,6 @@ class JointSpacePathSegmentGenerator {
float current_joint_pos[NUM_JOINTS]; // current joint positions
const CartesianPathSegment* path_segment = nullptr;
IKinemtaicModel* kinematic_model;
IKinematicModel* kinematic_model;
};

View file

@ -10,7 +10,7 @@
#include "hw_config.h"
#include "utilities/logging.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/actuator_calibration.h"
#include "pico/multicore.h"
@ -782,4 +782,4 @@ void Robot::process_calibrate_joint_command(const GCodeCommand& cmd, std::string
bool ok = calibrate_joint(idx, store_calibration, print_measurements);
reply = ok ? "ok\n" : "error\n";
}
}

View file

@ -130,7 +130,7 @@ class Robot : public ICommandProcessor {
RobotJoint* volatile joints[NUM_JOINTS];
spin_lock_t* joints_spin_lock = nullptr;
IKinemtaicModel* kinematic_model;
IKinematicModel* kinematic_model;
PathPlanner path_planner;
MotionController motion_controller;
CommandParser command_parser;
@ -146,4 +146,4 @@ class Robot : public ICommandProcessor {
FrequencyCounter servo_loop_frequency_counter;
FrequencyCounter motion_controller_frequency_counter;
};
};