diff --git a/assets/styles/layouts/single.scss b/assets/styles/layouts/single.scss
index 047440f..568db74 100644
--- a/assets/styles/layouts/single.scss
+++ b/assets/styles/layouts/single.scss
@@ -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;
diff --git a/config.yaml b/config.yaml
index 6c3f5e0..5ee9ac2 100644
--- a/config.yaml
+++ b/config.yaml
@@ -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:
diff --git a/content/posts/robot-arm-edu/assembly_instructions.png b/content/posts/robot-arm-edu/base_instructions.png
similarity index 100%
rename from content/posts/robot-arm-edu/assembly_instructions.png
rename to content/posts/robot-arm-edu/base_instructions.png
diff --git a/content/posts/robot-arm-edu/full_assembly_instructions.png b/content/posts/robot-arm-edu/full_assembly_instructions.png
new file mode 100644
index 0000000..c2016ba
Binary files /dev/null and b/content/posts/robot-arm-edu/full_assembly_instructions.png differ
diff --git a/content/posts/robot-arm-edu/image.png b/content/posts/robot-arm-edu/image.png
new file mode 100644
index 0000000..a0ee293
Binary files /dev/null and b/content/posts/robot-arm-edu/image.png differ
diff --git a/content/posts/robot-arm-edu/index.md b/content/posts/robot-arm-edu/index.md
index f46ce17..70ea0af 100644
--- a/content/posts/robot-arm-edu/index.md
+++ b/content/posts/robot-arm-edu/index.md
@@ -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.
-
-

+
+
+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.
+
+
+

+
+
+## 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);
+}
+```
\ No newline at end of file
diff --git a/content/posts/robot-arm-edu/pcb_instructions.png b/content/posts/robot-arm-edu/pcb_instructions.png
new file mode 100644
index 0000000..dc0cbe5
Binary files /dev/null and b/content/posts/robot-arm-edu/pcb_instructions.png differ
diff --git a/content/posts/robot-arm-edu/step_1.png b/content/posts/robot-arm-edu/step_1.png
new file mode 100644
index 0000000..38013c2
Binary files /dev/null and b/content/posts/robot-arm-edu/step_1.png differ
diff --git a/content/posts/robot-arm-edu/students_building.png b/content/posts/robot-arm-edu/students_building.png
new file mode 100644
index 0000000..a0ee293
Binary files /dev/null and b/content/posts/robot-arm-edu/students_building.png differ
diff --git a/layouts/_default/single.html b/layouts/_default/single.html
index ac0d1b2..a3d7eb9 100644
--- a/layouts/_default/single.html
+++ b/layouts/_default/single.html
@@ -62,6 +62,11 @@
{{ if site.Params.features.tags.enable }}
{{partial "misc/tags.html" .Params.tags }}
{{ end }}
+
{{ .Page.Content }}
diff --git a/layouts/partials/misc/tags.html b/layouts/partials/misc/tags.html
index f333300..8badc47 100644
--- a/layouts/partials/misc/tags.html
+++ b/layouts/partials/misc/tags.html
@@ -1,8 +1,7 @@