The Lab

This is where I experiment, take notes, and show off the tools I work with. A peek inside the engineering mind — oscilloscopes, build logs, and everything in between.

Interactive
Live Signal Simulator
Interactive oscilloscope — adjust channels and watch the waveforms
Workshop

Tools & Equipment

What's on my bench right now

🔬
Oscilloscope
Rigol DS1054Z 4CH, 50MHz
Power Supply
Variable DC bench, 0-30V 5A
🖨️
3D Printer
Bambu Lab A1 — PETG/PLA
💻
Dev Machine
Ubuntu 22.04, ROS2 Humble
🔧
Soldering
Hakko FX-888D station
📡
Logic Analyzer
Saleae Logic 8, 100MHz
🤖
Robotic Arm
6-DOF custom built, ROS2
📟
Multimeter
Fluke 87V Industrial
Lab Notebook

Engineering Notes & Learnings

2025-04-15
PID Tuning — Ziegler-Nichols vs Manual
Tried Z-N auto-tuning on the exo joint. Got massive overshoot (~40%). Switched to manual Kp increments from 0.1 — settled at Kp=1.8, Ki=0.4, Kd=0.12. Lesson: Z-N works on motors, not on compliant mechanisms.
Control Theory
2025-04-08
Why I switched from I2C to SPI for sensor array
I2C address collision with 3 identical sensors. Tried multiplexing — latency went up 4ms per channel. SPI with chip-selects brought it down to 0.8ms. Should have started with SPI.
Embedded
2025-03-22
Kalman Filter — Intuition that finally clicked
Think of it as a weighted average between your prediction and measurement — weighted by how much you trust each. High process noise → trust measurement more. Simple once you drop the matrix notation.
Signal Processing
2025-03-10
FEA lesson: mesh refinement matters at stress concentrations
Initial bracket FEA showed safe stress. After refining mesh at fillet radius — stress jumped 2.3x. The coarse mesh was averaging out the stress concentration. Always refine at geometry transitions.
Mechanical
2025-02-28
MQTT QoS levels — when to use which
QoS 0 for high-frequency telemetry (you expect some loss), QoS 1 for commands (at least once), QoS 2 for financial/critical state (exactly once). Most IoT sensor data = QoS 0.
IoT
2025-02-14
OpenCV contour detection trick for irregular shapes
For convex shapes use approxPolyDP. For concave (like grippers, brackets), use convexityDefects — the defect points give you the concave regions. Combined with moments for centroid.
Computer Vision
Snippet of the Week

Kalman Filter — Python Implementation

kalman_filter.py
import numpy as np

class KalmanFilter1D:
    """1D Kalman filter for IMU sensor fusion."""

    def __init__(self, process_noise=0.01, measurement_noise=0.1):
        self.Q = process_noise      # Process noise covariance
        self.R = measurement_noise  # Measurement noise covariance
        self.P = 1.0               # Estimation error covariance
        self.x = 0.0               # Initial state estimate

    def update(self, measurement: float) -> float:
        # --- Predict ---
        self.P += self.Q

        # --- Kalman gain ---
        K = self.P / (self.P + self.R)

        # --- Update state ---
        self.x += K * (measurement - self.x)
        self.P *= (1 - K)

        return self.x

# Usage: fusing gyroscope + accelerometer angle
kf = KalmanFilter1D(process_noise=0.001, measurement_noise=0.05)
filtered_angle = kf.update(raw_imu_reading)
By the Numbers

Some Fun Stats

847
Coffees consumed debugging
🔌
23
PCBs designed & manufactured
🖨️
340+
Hours of 3D printing
🔧
5
Stripped screws this month
📉
99
Failed prototypes before it worked
🐍
18k
Lines of Python written