Merge branch 'main' of github.com:Sharwin24/sharwin24.github.io
|
@ -1,3 +1,13 @@
|
|||
.github-button {
|
||||
text-align: center;
|
||||
background-color: transparent;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 0.25rem;
|
||||
color: get-light-color('muted-text-color');
|
||||
background-color: get-light-color('bg-card');
|
||||
}
|
||||
|
||||
|
||||
body.kind-page {
|
||||
background-color: get-light-color('bg-secondary');
|
||||
position: relative;
|
||||
|
|
|
@ -127,6 +127,7 @@ params:
|
|||
maxVisibleSections: 5
|
||||
|
||||
# Enable and configure blog posts
|
||||
# site.Params.features.tags.enable
|
||||
features:
|
||||
readingTime:
|
||||
enable: true
|
||||
|
@ -134,6 +135,8 @@ params:
|
|||
title: "Project Posts"
|
||||
enable: true
|
||||
showAuthor: true
|
||||
tags:
|
||||
enable: true
|
||||
analytics:
|
||||
enabled: true
|
||||
services:
|
||||
|
|
Before Width: | Height: | Size: 481 KiB After Width: | Height: | Size: 481 KiB |
BIN
content/posts/robot-arm-edu/full_assembly_instructions.png
Normal file
After Width: | Height: | Size: 542 KiB |
BIN
content/posts/robot-arm-edu/image.png
Normal file
After Width: | Height: | Size: 803 KiB |
|
@ -17,8 +17,56 @@ tags: ["3D Printing", "Arduino", "C++", "MATLAB"]
|
|||
An educational kit designed to teach the fundamentals of kinematics and dynamics. The kit is intended to accompany the course ME3460: Robot Dynamics & Control at Northeastern University. The kit is a physical representation of the final project, which is currently done purely through MATLAB simulation.
|
||||
|
||||
## Kit Design
|
||||
The robot is a 3-link planar manipulator with 3 degrees of freedom. The end effector is a simple gripper that can grab small objects.
|
||||
|
||||
The entire kit is composed of 3D printed parts, and off-the-shelf hardware/electronics. Students can assemble the kit without any soldering and with minimal tools.
|
||||
|
||||
<div align="center">
|
||||
<img src="assembly_instructions.png" alt="Assembly Instructions" style="border-radius: 15px;">
|
||||
<div align="center" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 15px;">
|
||||
<img src="step_1.png" alt="First Step of Instructions" style="border-radius: 15px; width: 45%;">
|
||||
<img src="pcb_instructions.png" alt="PCB Instructions" style="border-radius: 15px; width: 45%;">
|
||||
<img src="base_instructions.png" alt="Base Assembly" style="border-radius: 15px; width: 45%;">
|
||||
<img src="full_assembly_instructions.png" alt="Full Assembly" style="border-radius: 15px; width: 45%;">
|
||||
</div>
|
||||
|
||||
The instructions are laid out in simple steps, akin to LEGO instructions. A custom PCB was developed to simplify the wiring process and off the shelf stepper motors and drivers were used for easy integration with the Arduino microcontroller.
|
||||
|
||||
<div align="center">
|
||||
<img src="students_building.png" alt="Students Building Kit" style="border-radius: 15px;">
|
||||
</div>
|
||||
|
||||
## Software
|
||||
|
||||
In order to control the robot arm, a custom library was written in C++ to handle the microstepping. The library followed the same technique as the AccelStepper library to enable concurrent motion of multiple motors at a time in addition to applying acceleration and velocity profiles. A custom library meant students could easily write and implement their own motion profiles without having to deal with the hardware specifics.
|
||||
|
||||
```cpp
|
||||
void LinkStepperMotor::computeNewPulseInterval() {
|
||||
// Acceleration curve is split into 3 parts: acceleration, steady-state, deceleration
|
||||
int totalSteps = abs(this->targetPosition - this->previousTargetPosition);
|
||||
int stepsRemaining = this->getStepsRemaining();
|
||||
int stepsCompleted = totalSteps - stepsRemaining;
|
||||
int n1 = totalSteps / 3;
|
||||
int n2 = 2 * n1;
|
||||
uint16_t speedSPS = this->currentSpeedSPS;
|
||||
// Determine which range we are in to apply the correct part of the acceleration curve
|
||||
if (stepsCompleted <= n1) {
|
||||
// Acceleration
|
||||
// a(n) = k * n1 + a0
|
||||
// v(n) = 0.5 * k * n^2 + a0 * n + v0
|
||||
speedSPS = (0.5f * this->accelerationRate * pow(stepsCompleted, 2)) + (this->initialAcceleration * stepsCompleted) + this->initialSpeedSPS;
|
||||
} else if (stepsCompleted >= n1 && stepsCompleted <= n2) {
|
||||
// Steady-state
|
||||
// a(n) = a_max = k * n1 + a0
|
||||
// v(n) = (k * n1 + a0) * n - 0.5 * k * n1^2 + v0
|
||||
speedSPS = ((this->accelerationRate * n1 + this->initialAcceleration) * stepsCompleted) - (0.5f * this->accelerationRate * pow(n1, 2)) + this->initialSpeedSPS;
|
||||
} else { // (stepsCompleted >= n2)
|
||||
// Deceleration
|
||||
// a(n) = -k * n + k * n2 + a_max
|
||||
// v(n) = -0.5 * k * n^2 + (k * n1 + k * n2 + a0) * n - 0.5 * k * (n1^2 + n2^2) + v0
|
||||
speedSPS = (-0.5f * this->accelerationRate * pow(stepsCompleted, 2))
|
||||
+ (this->accelerationRate * n1 + this->accelerationRate * n2 + this->initialAcceleration) * stepsCompleted
|
||||
- (0.5f * this->accelerationRate * (pow(n1, 2) + pow(n2, 2)))
|
||||
+ this->initialSpeedSPS;
|
||||
}
|
||||
this->setSpeedSPS(speedSPS);
|
||||
}
|
||||
```
|
BIN
content/posts/robot-arm-edu/pcb_instructions.png
Normal file
After Width: | Height: | Size: 378 KiB |
BIN
content/posts/robot-arm-edu/step_1.png
Normal file
After Width: | Height: | Size: 717 KiB |
BIN
content/posts/robot-arm-edu/students_building.png
Normal file
After Width: | Height: | Size: 803 KiB |
|
@ -62,6 +62,11 @@
|
|||
{{ if site.Params.features.tags.enable }}
|
||||
{{partial "misc/tags.html" .Params.tags }}
|
||||
{{ end }}
|
||||
<!-- <div class="github-button">
|
||||
<a href="https://github.com/Sharwin24/" target="_blank" class="btn btn-primary">
|
||||
<i class="fab fa-github"></i> View on GitHub
|
||||
</a>
|
||||
</div> -->
|
||||
<div class="post-content" id="post-content">
|
||||
{{ .Page.Content }}
|
||||
</div>
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
<div class="tags">
|
||||
<ul style="padding-left: 0;">
|
||||
{{ range . }}
|
||||
{{ $url:= printf "tags/%s/" . }}
|
||||
<li class="rounded"><a href="{{ $url | urlize | relLangURL }}" class="btn btn-sm btn-info">{{ . }}</a></li>
|
||||
<li class="rounded"><a class="btn btn-sm btn-info">{{ . }}</a></li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
|
|