diff --git a/README.md b/README.md index befb21f..18ab21a 100644 --- a/README.md +++ b/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 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 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 [![Watch the video](images/thumbnail.jpg)](https://youtu.be/MgQbPdiuUTw) diff --git a/documentation/build_guides/buildguide_3dof.md b/documentation/build_guides/buildguide_3dof.md new file mode 100644 index 0000000..874c21e --- /dev/null +++ b/documentation/build_guides/buildguide_3dof.md @@ -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 + diff --git a/electronics/.gitignore b/electronics/.gitignore index 4e48574..499d81a 100644 --- a/electronics/.gitignore +++ b/electronics/.gitignore @@ -24,3 +24,10 @@ fp-info-cache # Footprint association file (exported from Pcbnew) *.cmp + +# Kicad default backup folder +*-backups/ + +# Gerber files +*.g* +*.drl diff --git a/firmware/MotionControllerRP/platformio.ini b/firmware/MotionControllerRP/platformio.ini index 3bb553f..6696468 100644 --- a/firmware/MotionControllerRP/platformio.ini +++ b/firmware/MotionControllerRP/platformio.ini @@ -25,4 +25,5 @@ platform = https://github.com/maxgerhardt/platform-raspberrypi.git board = rpipico2 # RP2530 # board = rpipico # RP2040 -framework = arduino \ No newline at end of file +framework = arduino +lib_deps = mryslab/NeoPixelConnect diff --git a/firmware/MotionControllerRP/src/kinemtaic_models/kinematic_model_base.cpp b/firmware/MotionControllerRP/src/kinematic_models/kinematic_model_base.cpp similarity index 100% rename from firmware/MotionControllerRP/src/kinemtaic_models/kinematic_model_base.cpp rename to firmware/MotionControllerRP/src/kinematic_models/kinematic_model_base.cpp diff --git a/firmware/MotionControllerRP/src/kinemtaic_models/kinematic_model_base.h b/firmware/MotionControllerRP/src/kinematic_models/kinematic_model_base.h similarity index 87% rename from firmware/MotionControllerRP/src/kinemtaic_models/kinematic_model_base.h rename to firmware/MotionControllerRP/src/kinematic_models/kinematic_model_base.h index c4639ab..38a0126 100644 --- a/firmware/MotionControllerRP/src/kinemtaic_models/kinematic_model_base.h +++ b/firmware/MotionControllerRP/src/kinematic_models/kinematic_model_base.h @@ -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(); diff --git a/firmware/MotionControllerRP/src/kinemtaic_models/kinematic_model_delta3d.cpp b/firmware/MotionControllerRP/src/kinematic_models/kinematic_model_delta3d.cpp similarity index 100% rename from firmware/MotionControllerRP/src/kinemtaic_models/kinematic_model_delta3d.cpp rename to firmware/MotionControllerRP/src/kinematic_models/kinematic_model_delta3d.cpp diff --git a/firmware/MotionControllerRP/src/kinemtaic_models/kinematic_model_delta3d.h b/firmware/MotionControllerRP/src/kinematic_models/kinematic_model_delta3d.h similarity index 90% rename from firmware/MotionControllerRP/src/kinemtaic_models/kinematic_model_delta3d.h rename to firmware/MotionControllerRP/src/kinematic_models/kinematic_model_delta3d.h index e6b5919..788cf9a 100644 --- a/firmware/MotionControllerRP/src/kinemtaic_models/kinematic_model_delta3d.h +++ b/firmware/MotionControllerRP/src/kinematic_models/kinematic_model_delta3d.h @@ -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]); \ No newline at end of file + Vec3F intersections[2]); diff --git a/firmware/MotionControllerRP/src/main.cpp b/firmware/MotionControllerRP/src/main.cpp index e7f40fd..5e2a6ec 100644 --- a/firmware/MotionControllerRP/src/main.cpp +++ b/firmware/MotionControllerRP/src/main.cpp @@ -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(); -} \ No newline at end of file +} diff --git a/firmware/MotionControllerRP/src/motion_control/path_planner.cpp b/firmware/MotionControllerRP/src/motion_control/path_planner.cpp index 376271d..b85b433 100644 --- a/firmware/MotionControllerRP/src/motion_control/path_planner.cpp +++ b/firmware/MotionControllerRP/src/motion_control/path_planner.cpp @@ -12,7 +12,7 @@ #include -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; } diff --git a/firmware/MotionControllerRP/src/motion_control/path_planner.h b/firmware/MotionControllerRP/src/motion_control/path_planner.h index 9064901..b48734f 100644 --- a/firmware/MotionControllerRP/src/motion_control/path_planner.h +++ b/firmware/MotionControllerRP/src/motion_control/path_planner.h @@ -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 ct_path_segment_queue; RingBuffer js_path_segment_queue; - IKinemtaicModel* kinematic_model; + IKinematicModel* kinematic_model; JointSpacePathSegmentGenerator* segment_generator = nullptr; float segment_time_step; LinearAngular junction_deviation; diff --git a/firmware/MotionControllerRP/src/motion_control/path_segment.cpp b/firmware/MotionControllerRP/src/motion_control/path_segment.cpp index 27c7402..f9adcf0 100644 --- a/firmware/MotionControllerRP/src/motion_control/path_segment.cpp +++ b/firmware/MotionControllerRP/src/motion_control/path_segment.cpp @@ -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; diff --git a/firmware/MotionControllerRP/src/motion_control/path_segment.h b/firmware/MotionControllerRP/src/motion_control/path_segment.h index e5342a6..0f793c1 100644 --- a/firmware/MotionControllerRP/src/motion_control/path_segment.h +++ b/firmware/MotionControllerRP/src/motion_control/path_segment.h @@ -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; }; diff --git a/firmware/MotionControllerRP/src/robot.cpp b/firmware/MotionControllerRP/src/robot.cpp index 8bb991f..2ec86df 100644 --- a/firmware/MotionControllerRP/src/robot.cpp +++ b/firmware/MotionControllerRP/src/robot.cpp @@ -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"; -} \ No newline at end of file +} diff --git a/firmware/MotionControllerRP/src/robot.h b/firmware/MotionControllerRP/src/robot.h index a2b3cef..bcb3e14 100644 --- a/firmware/MotionControllerRP/src/robot.h +++ b/firmware/MotionControllerRP/src/robot.h @@ -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; -}; \ No newline at end of file +};