<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Michael Bell</title>
    <subtitle>Circuits. Signals. Hardware. Michael&#x27;s web portfolio contains A collection of Michael&#x27;s projects, technical blog posts, and notes.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://mikebell.cc/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://mikebell.cc"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-11-16T00:00:00+00:00</updated>
    <id>https://mikebell.cc/atom.xml</id>
    <entry xml:lang="en">
        <title>Superheterodyne HF Receiver</title>
        <published>2026-06-12T00:00:00+00:00</published>
        <updated>2026-06-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/26-superhet-receiver/"/>
        <id>https://mikebell.cc/projects/26-superhet-receiver/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/26-superhet-receiver/">




    &lt;div class=&quot;admonition&quot; data-type=&quot;warning&quot;&gt;
        &lt;div class=&quot;admonition-title&quot;&gt;
            &lt;p&gt;ONGOING&lt;&#x2F;p&gt;

        &lt;&#x2F;div&gt;
        &lt;p&gt;&lt;strong&gt;This project is new and ongoing as of June 2026&lt;&#x2F;strong&gt;. I have added it to the list as a way to show off where I am at in the project as it is quite complex. I will add to this page as I go. Once I finish the project, I will re-write the page.&lt;&#x2F;p&gt;
&lt;p&gt;For details on each of the components&#x2F;building block of this radio, I will post the build process through my &lt;a href=&quot;&#x2F;posts&#x2F;&quot;&gt;blog&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;

&lt;p&gt;Since 2023 I wanted to make my own superheterodyne receiver. In 2025, I made my first direct conversion reciever and then later on a superheterodyne receiver. Because of my final year of university, I was unable to work on the radio and had to pack it away. Now that I have finished my degree, I have some additional free time that I spent revisiting the project.&lt;&#x2F;p&gt;
&lt;p&gt;I will update this project page as I go, but below are images and videos of what I have built so far.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;june-2026&quot;&gt;June 2026&lt;&#x2F;h1&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20260611_164230.webp&quot; width=90% alt=&quot;June 12, 2026 - Radio Prototype&quot;&#x2F;&gt;
  &lt;figcaption&gt;June 12, 2026 - Radio Prototype&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;receiving-signals&quot;&gt;Receiving Signals&lt;&#x2F;h2&gt;
&lt;p&gt;Morse Code on the 20m band:&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;video width=&quot;90%&quot; controls&gt;
    &lt;source src=&quot;media&#x2F;20260611_163934.mp4&quot; type=&quot;video&#x2F;mp4&quot; width=&quot;90%&quot; alt=&quot;Receiving Morse Code on the 20m band&quot;&#x2F;&gt;
  &lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;SSB Transmissions on the 20m band:&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;video width=&quot;90%&quot; controls&gt;
    &lt;source src=&quot;media&#x2F;20260611_161631.mp4&quot; type=&quot;video&#x2F;mp4&quot; width=&quot;90%&quot; alt=&quot;Receiving SSB on the 20m band&quot;&#x2F;&gt;
  &lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;notes&quot;&gt;Notes&lt;&#x2F;h2&gt;





    &lt;div class=&quot;admonition&quot; data-type=&quot;note&quot;&gt;
        &lt;div class=&quot;admonition-title&quot;&gt;
            &lt;p&gt;Note on Noise&lt;&#x2F;p&gt;

        &lt;&#x2F;div&gt;
        &lt;p&gt;The current configuration has very little gain through the intermediate frequency, so I made up for that using a very high gain audio stage. The issue I was having is known as &quot;motorboating&quot; where a feedback loop causes a fast puttering&#x2F;popping noise in the audio. Creating an audio diplexer after the final mixer fixed the noise problem, but the recievers gain was still very low.&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;






    &lt;div class=&quot;admonition&quot; data-type=&quot;note&quot;&gt;
        &lt;div class=&quot;admonition-title&quot;&gt;
            &lt;p&gt;Note on Frequency Displayed&lt;&#x2F;p&gt;

        &lt;&#x2F;div&gt;
        &lt;p&gt;At this early stage of the prototype, I am using an SI5351 clock generator for the variable frequency oscillator (VFO) and the beat frequency oscillator (BFO). The IF of my superheterodyne receiver is at 8 MHz, meaning a VFO around 6 MHz receives signals at 14 MHz.&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;

</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Revisiting the Cascode Amplifier</title>
        <published>2026-06-10T00:00:00+00:00</published>
        <updated>2026-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/cascode-amplifier/"/>
        <id>https://mikebell.cc/posts/cascode-amplifier/</id>
        
        <summary type="html">&lt;p&gt;With my University Degree complete, I had much more free time to work on my superheterodyne reciever. Armed with more knowledge than my 2025 self, I decided it was worth redesigning most of it. Beginning with the frontend amplifier, I decided to try the cascode amplifier once again.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Undergraduate Capstone Project</title>
        <published>2026-04-11T00:00:00+00:00</published>
        <updated>2026-04-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/26-ubco-capstone/"/>
        <id>https://mikebell.cc/projects/26-ubco-capstone/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/26-ubco-capstone/">&lt;h1 id=&quot;undergraduate-engineering-capstone&quot;&gt;Undergraduate Engineering Capstone&lt;&#x2F;h1&gt;
&lt;p&gt;Engineering capstone is the final undergraduate engineering project students complete in their undergraduate degree. Teams of 6 to 7 students are assigned a project provided by local industry partners or university faculty and completed over the span of their final year (2 terms).&lt;&#x2F;p&gt;
&lt;p&gt;The project assigned to my team was titled &quot;Development of miniaturized readout electronics for microwave ice sensing applications in harsh environments&quot;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;project-overview-the-why&quot;&gt;Project Overview (The &lt;em&gt;Why&lt;&#x2F;em&gt;)&lt;&#x2F;h2&gt;
&lt;p&gt;Ice buildup is a serious issue in aerospace and wind energy systems, where accumulation can reduce aerodynamic performance and create safety hazards. Our capstone project focused on designing a portable Scalar Network Analyzer (SNA) capable of detecting ice using microwave resonant sensors. The device measures shifts in resonant frequency from Split Ring Resonators (SRRs), allowing ice formation to be detected in real time. The objective was to create a lightweight, field deployable alternative to traditional laboratory network analyzers for use in wireless microwave sensor networks.&lt;&#x2F;p&gt;
&lt;p&gt;The project was initially defined through its proposal and later expanded upon by our client &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;scholar.google.com&#x2F;citations?user=wA2LtHsAAAAJ&amp;amp;hl=en&quot;&gt;Dr. Mohammad H. Zarifi&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;





    &lt;details class=&quot;admonition&quot; data-type=&quot;note&quot;  &gt;
        &lt;summary&gt;
            &lt;p&gt;Project Proposal&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Problem statement&lt;&#x2F;strong&gt; - &lt;em&gt;What is the Problem that this project is meant to solve?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Microwave resonant sensors are low cost and simple to fabricate for many different applications.  However, current microwave readout electronics can be expensive, heavy, and implement many features so they are useful in a variety of different applications. This project will focus on readout electronics specialized in measuring the necessary response from microwave ice sensors. This will miniaturize the electronics required for ice sensing to provide more flexibility on use and portability, such as drones for ice sensing automation. This technology can be used to create safer infrastructure and improve safety for maintenance workers.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Background&lt;&#x2F;strong&gt; - &lt;em&gt;Please provide any additional relevant background information that is related to the problem you would like this project to solve.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;This project involves designing and development of a two-port circuit implemented on a printed circuit board (PCB), capable of characterizing the frequency response of a resonator within a limited frequency range, dynamic range, physical dimensions, and weight. The system will be integrated wirelessly with smart devices or portable electronics for visualization and communication purposes.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Constraints&lt;&#x2F;strong&gt; - &lt;em&gt;What are the Constraints for the problem you are trying to solve?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;The objective of this project is to design, build, and implement a scalar network analyzer capable of measuring the amplitude frequency response of resonant based microwave sensors, while being low weight and maintaining a small form factor. Since this device will be implemented in ice sensing projects, the device is expected to withstand temperatures below zero; because of this, the device must remain operational and accurate for temperatures as cold as -40℃ or as hot as 60℃ with a frequency range between 1 to 8 GHz, dynamic range of 50 dB or more, and minimum output power of –5 dBm.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Risks&lt;&#x2F;strong&gt; - &lt;em&gt;What are potential Risks that are associated with the Problem this project is attempting to solve?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Personal risks associated with this project may involve handling a soldering iron as well as inhaling any toxic fumes that comes with the soldering process. These risks can be mitigated by informing students of standard safe soldering practices. During the development of the PCB, prototyping of the design may lead to E-waste.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Applicable Engineering Disciplines&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Electrical, Mechanical, Manufacturing&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

    &lt;&#x2F;details&gt;

&lt;p&gt;Key takeaways of this proposal were the projects objective, device specifications, and constraints. More on this will be duscussed when going over the &lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;projects&#x2F;26-ubco-capstone&#x2F;#design-process&quot;&gt;desing process&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;meet-the-team&quot;&gt;Meet the team&lt;&#x2F;h3&gt;
&lt;p&gt;With a project such as this a capable team was required. The students assigned to this project were,&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Michael Bell&lt;&#x2F;strong&gt; - &lt;em&gt;Electrical Engineering&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mathew Bishop&lt;&#x2F;strong&gt; - &lt;em&gt;Electrical Engineering&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Aiden Macson&lt;&#x2F;strong&gt; - &lt;em&gt;Electrical Engineering&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Radu David&lt;&#x2F;strong&gt; - &lt;em&gt;Computer Engineering&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Supreet Dhatt&lt;&#x2F;strong&gt; - &lt;em&gt;Electrical Engineering&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Duncan Rabenstein&lt;&#x2F;strong&gt; - &lt;em&gt;Electrical Engineering&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Each of the students have skillsets in electronics, hardware, and software, making for a strong team to tackle our assigned project.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;team_photo.webp&quot; width=90% alt=&quot;Team Photo&quot;&#x2F;&gt;
  &lt;figcaption&gt;Starting from the left: Supreet, Radu, Mathew, Aiden, Michael, and Dunctan.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;design-process&quot;&gt;Design Process (The &lt;em&gt;How&lt;&#x2F;em&gt;)&lt;&#x2F;h2&gt;
&lt;p&gt;The team was tasked with designing a scalar network analyzer (SNA) for wireless sensing and ice-detection applications. The specifications we needed to conform to were as follows:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Operational frequency range of &lt;strong&gt;10-18 GHz (Ku band)&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Dynamic range of &lt;strong&gt;≥ 50 dB&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Power output of &lt;strong&gt;-5 dBm&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Measurement resolution of &lt;strong&gt;32 sample points&lt;&#x2F;strong&gt; over range&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Low power &amp;amp; portable&lt;&#x2F;strong&gt; optimization (battery operated)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The key challenges were achieving the desired operational frequency range while maintaining moderate dynamic range.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-is-an-sna&quot;&gt;What is an SNA?&lt;&#x2F;h3&gt;
&lt;p&gt;A scalar network analyzer is a device that will output a sinusoid wave that is swept over a defined frequency range, and measures the amplitude response of a device under test (DUT). This response allows users to see the magnitude frequency response of a device, which in our case allows us to measure microwave ice detection sensors.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;sna_animation.gif&quot; width=70% alt=&quot;SNA RF Subsystem Block Diagram&quot;&#x2F;&gt;
  &lt;figcaption&gt;SNA RF Subsystem Block Diagram&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;proposed-approaches&quot;&gt;Proposed Approaches&lt;&#x2F;h3&gt;
&lt;p&gt;To design this SNA the team focused on the devices RF structure. I was personally tasked with developing the RF subsystems in such a way that there were options balancing performance, cost, and complexity.&lt;&#x2F;p&gt;





    &lt;details class=&quot;admonition&quot; data-type=&quot;note&quot; name=&quot;design&quot; &gt;
        &lt;summary&gt;
            &lt;p&gt;Design 1&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;figure&gt;
  &lt;img src=&quot;media&#x2F;simple_vco_pd.png&quot; width=90% style=&quot;background-color: #fff;&quot;  alt=&quot;Simple VCO and Power Detector&quot;&#x2F;&gt;
  &lt;figcaption&gt;Simple VCO and Power Detector&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;This design utilizes only a voltage controlled oscillator (VCO) and power detector.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #069130;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M21.801 10A10 10 0 1 1 17 3.335&quot; &#x2F;&gt;  &lt;path d=&quot;m9 11 3 3L22 4&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Simple&lt;&#x2F;li&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #069130;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M21.801 10A10 10 0 1 1 17 3.335&quot; &#x2F;&gt;  &lt;path d=&quot;m9 11 3 3L22 4&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Very few components&lt;&#x2F;li&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #FF2244;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot; &#x2F;&gt;  &lt;path d=&quot;M8 12h8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Components are expensive for operating range&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

    &lt;&#x2F;details&gt;






    &lt;details class=&quot;admonition&quot; data-type=&quot;note&quot; name=&quot;design&quot; &gt;
        &lt;summary&gt;
            &lt;p&gt;Design 2&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;figure&gt;
  &lt;img src=&quot;media&#x2F;double_conv.png&quot; width=90% style=&quot;background-color: #fff;&quot;  alt=&quot;Double Conversion Methodology&quot;&#x2F;&gt;
  &lt;figcaption&gt;Double Conversion Methodology&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;This design utilizes a double conversion methodology incorporating frequency mixing and filtering.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #069130;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M21.801 10A10 10 0 1 1 17 3.335&quot; &#x2F;&gt;  &lt;path d=&quot;m9 11 3 3L22 4&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; More affordable components&lt;&#x2F;li&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #069130;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M21.801 10A10 10 0 1 1 17 3.335&quot; &#x2F;&gt;  &lt;path d=&quot;m9 11 3 3L22 4&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Still relatively simple&lt;&#x2F;li&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #FF2244;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot; &#x2F;&gt;  &lt;path d=&quot;M8 12h8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; More components&lt;&#x2F;li&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #FF2244;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot; &#x2F;&gt;  &lt;path d=&quot;M8 12h8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Longer design timeframe&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

    &lt;&#x2F;details&gt;






    &lt;details class=&quot;admonition&quot; data-type=&quot;note&quot; name=&quot;design&quot; &gt;
        &lt;summary&gt;
            &lt;p&gt;Design 3&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;figure&gt;
  &lt;img src=&quot;media&#x2F;double_conv_mult.png&quot; width=90% style=&quot;background-color: #fff;&quot; alt=&quot;Double Conversion with Multipliers&quot;&#x2F;&gt;
  &lt;figcaption&gt;Double Conversion with Multipliers&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;This design expands on the double conversion methodology by adding frequency multipliers and amplifiers for additional range and flexibility.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #069130;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M21.801 10A10 10 0 1 1 17 3.335&quot; &#x2F;&gt;  &lt;path d=&quot;m9 11 3 3L22 4&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Most flexible with affordable parts&lt;&#x2F;li&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #069130;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M21.801 10A10 10 0 1 1 17 3.335&quot; &#x2F;&gt;  &lt;path d=&quot;m9 11 3 3L22 4&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Most complex&lt;&#x2F;li&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #FF2244;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot; &#x2F;&gt;  &lt;path d=&quot;M8 12h8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Large part count&lt;&#x2F;li&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #FF2244;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot; &#x2F;&gt;  &lt;path d=&quot;M8 12h8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Longest design timeframe&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

    &lt;&#x2F;details&gt;






    &lt;details class=&quot;admonition&quot; data-type=&quot;note&quot; name=&quot;design&quot; &gt;
        &lt;summary&gt;
            &lt;p&gt;Design 4&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;figure&gt;
  &lt;img src=&quot;media&#x2F;mult_down_con.png&quot; width=90% style=&quot;background-color: #fff;&quot; alt=&quot;Multiplier and Down-conversion&quot;&#x2F;&gt;
  &lt;figcaption&gt;Multiplier and Down-conversion&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;This design utilizes frequency multiplication at its output and a down-conversion stage at its input to make it flexible yet simple.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #069130;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M21.801 10A10 10 0 1 1 17 3.335&quot; &#x2F;&gt;  &lt;path d=&quot;m9 11 3 3L22 4&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Complex but simpler&lt;&#x2F;li&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #069130;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M21.801 10A10 10 0 1 1 17 3.335&quot; &#x2F;&gt;  &lt;path d=&quot;m9 11 3 3L22 4&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Manageable number of parts&lt;&#x2F;li&gt;
&lt;li&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1em; color: #FF2244;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot; &#x2F;&gt;  &lt;path d=&quot;M8 12h8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Moderate design timeframe&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

    &lt;&#x2F;details&gt;

&lt;h3 id=&quot;initial-prototype&quot;&gt;Initial Prototype&lt;&#x2F;h3&gt;
&lt;p&gt;Given the timeline constraints of this project, we decided to proceed with the first design, utilizing a single VCO and power detector. We opted to use connectorized RF components to reduce any possible troubleshooting time in the future. The two major RF components we used were the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.analog.com&#x2F;media&#x2F;en&#x2F;technical-documentation&#x2F;data-sheets&#x2F;hmc733.pdf&quot;&gt;HMC733 VCO&lt;&#x2F;a&gt; by Analog Devices and the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.minicircuits.com&#x2F;WebStore&#x2F;dashboard.html?model=ZV47-K44RMS%2B&quot;&gt;ZV47-K44RMS+ Power Detector&lt;&#x2F;a&gt; from Mini-Circuits.&lt;&#x2F;p&gt;
&lt;p&gt;With these building blocks, the team began working on the device. We used an ESP32 microcontroller in addition to a number of components for power distribution and amplification. A printed circuit board (PCB) was developed to host all the power regulators and voltage conversion stages. The resulting unit was not glamorous, but it demonstrated the projects feasibility.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;prototype_1.webp&quot; width=90% alt=&quot;SNA Prototype 1&quot;&#x2F;&gt;
  &lt;figcaption&gt;SNA Prototype 1&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;In addition to the VCO and power detector, we used two &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.minicircuits.com&#x2F;WebStore&#x2F;dashboard.html?model=ZX60-R5183P%2B&quot;&gt;Mini-Circuits ZX60-R5183P+&lt;&#x2F;a&gt; amplifiers (approx. 8 dB gain). These amplifiers were used for wireless measurements using horn antennas.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;improvements-to-the-software&quot;&gt;Improvements to the software&lt;&#x2F;h3&gt;
&lt;p&gt;With the first prototype built, a simple graphical user interface (GUI) was designed. There were a number of iterations that this software went through. The members working on the software were Supreet, Duncan, and Aiden.&lt;&#x2F;p&gt;





    &lt;details class=&quot;admonition&quot; data-type=&quot;note&quot; name=&quot;ui&quot; &gt;
        &lt;summary&gt;
            &lt;p&gt;First UI Revision&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;p&gt;The first GUI designed was barebones and made to function-test the first prototype.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;gui_ver_1.png&quot; width=90% alt=&quot;GUI Version 1&quot;&#x2F;&gt;
  &lt;figcaption&gt;GUI Version 1&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
    &lt;&#x2F;details&gt;






    &lt;details class=&quot;admonition&quot; data-type=&quot;note&quot; name=&quot;ui&quot; &gt;
        &lt;summary&gt;
            &lt;p&gt;Second UI Revision&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;p&gt;The second GUI was a polished version of the first, with more attention to the design and user experience.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;gui_ver_2.png&quot; width=90% alt=&quot;GUI Version 2&quot;&#x2F;&gt;
  &lt;figcaption&gt;GUI Version 2&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
    &lt;&#x2F;details&gt;






    &lt;details class=&quot;admonition&quot; data-type=&quot;note&quot; name=&quot;ui&quot; &gt;
        &lt;summary&gt;
            &lt;p&gt;Third UI Revision&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;p&gt;The final GUI incorporated all the features the team set out to include.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;gui_ver_3.png&quot; width=90% alt=&quot;GUI Version 3&quot;&#x2F;&gt;
  &lt;figcaption&gt;GUI Version 3&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
    &lt;&#x2F;details&gt;

&lt;h2 id=&quot;final-design&quot;&gt;Final Design&lt;&#x2F;h2&gt;
&lt;p&gt;With the results we were achieving, we looked into areas of our design we could improve. Two distinct areas of improvement we discovered were &lt;strong&gt;power consumption&lt;&#x2F;strong&gt; and &lt;strong&gt;user experience&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;new-pcb&quot;&gt;New PCB&lt;&#x2F;h3&gt;
&lt;p&gt;A new PCB was designed for the device to incorporate new power distribution networks. I was tasked with designing the second PCB iteration which meant designing a new power supply for the device.&lt;&#x2F;p&gt;
&lt;p&gt;We wanted to be able to intelligently control the devices power distribution to optimize for power consumption. To do so, I incorporated a switch-mode power supply to provide the ESP32 with 3.3V, and a switch-mode power supply to provide the 18V required for tuning the VCO. To power the RF components such as the power detector, amplifiers, and VCO, I utilized linear regulators with an Enable&#x2F;Disable feature for a smooth DC output that I can turn on and off using the ESP32.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20260317_131300.webp&quot; width=90% alt=&quot;Second iteration PCB&quot;&#x2F;&gt;
  &lt;figcaption&gt;Second iteration PCB&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;enclosure&quot;&gt;Enclosure&lt;&#x2F;h3&gt;
&lt;p&gt;We achieved an improved user experience for the final design&#x27;s software as shown in &lt;a href=&quot;javascript:void(0);&quot;&gt;UI Iteration 3&lt;&#x2F;a&gt;, but we also worked to improve the devices presentation as well. An enclosure was designed by Mathew, Aiden, and Radu, to incorporate all the components while keeping the dimensions within the desired volume.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20260330_155603.webp&quot; width=90% alt=&quot;Final Enclosure with Components&quot;&#x2F;&gt;
  &lt;figcaption&gt;Final Enclosure with Components&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;resulting-product-the-outcome&quot;&gt;Resulting Product (The &lt;em&gt;Outcome&lt;&#x2F;em&gt;)&lt;&#x2F;h2&gt;
&lt;p&gt;Closing in on the projects completion date the team conducted a final assembly of the device. The result was a product of everyones commitment, hard work, and ingenuity.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;sna_enclosed.webp&quot; width=90% alt=&quot;Complete SNA Assembled&quot;&#x2F;&gt;
  &lt;figcaption&gt;Complete SNA Assembled&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;sna-clip.gif&quot; width=90% alt=&quot;SNA Open Case Short Clip&quot;&#x2F;&gt;
  &lt;figcaption&gt;SNA Open Case Short Clip&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;testing&quot;&gt;Testing&lt;&#x2F;h3&gt;
&lt;p&gt;Testing the device, results showed minimal error and useable accuracy, making this device suitable for microwave sensor technologies. Below is a figure of a test done using a SRR. The blue trace shows the SRR&#x27;s characteristics on a Keysight N5222B vector network analyzer which will be used as our baseline. The red trace is our SNA&#x27;s measurement. Overall, the relative error between the SNA&#x27;s results and the baseline was -4.34% in amplitude and +0.35% in frequency.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;SRR2_compared2_WIDE.png&quot; width=90% alt=&quot;SRR Measurement results&quot;&#x2F;&gt;
  &lt;figcaption&gt;SRR Measurement Results&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;We successfully built a portable device that allows for microwave ice detection and sensing technology to be implemented at a lower cost. Instead of using large and expensive lab equipment, this device can be deployed in real environments like wind turbines, drones, or aircraft surfaces for ice detection applications that will provide improve safety.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;final-video-presentation&quot;&gt;Final Video Presentation&lt;&#x2F;h3&gt;
&lt;p&gt;The final video presentation of our device:&lt;&#x2F;p&gt;
&lt;iframe style=&quot;width: 100%; aspect-ratio: 16 &#x2F; 9; border: none;&quot; src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;OmqRjWwdaAI&quot; title=&quot;Capstone Video - Team F3&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;&#x2F;iframe&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>15 GHz Split Ring Resonator</title>
        <published>2026-03-30T00:00:00+00:00</published>
        <updated>2026-03-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/26-15-ghz-split-ring-resonator/"/>
        <id>https://mikebell.cc/projects/26-15-ghz-split-ring-resonator/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/26-15-ghz-split-ring-resonator/">&lt;p&gt;During my Undergraduate Capstone Project, my team realized that there were no devices that we could test our newly designed Ku-band scalar network analyzer (SNA). Because of this we needed a device that operates around 15 GHz to be able to compare and test our SNA with, all within 24 hours.&lt;&#x2F;p&gt;
&lt;p&gt;Using the AWR Microwave Office software I set out to design a &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Split-ring_resonator&quot;&gt;Split Ring Resonator (SRR)&lt;&#x2F;a&gt; notch filter.&lt;&#x2F;p&gt;
&lt;p&gt;A SRR functions the same as a resonant LC tank circuit, where the conductive loops provide inductance (L), while the gaps provide capacitance (C). When an oscillating electromagnetic field is present parallel to the SRR, it induces a circulating current producing resonance at a frequency determined by the L and C values.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20260329_125758.webp&quot; style=&quot;aspect-ratio: 24&#x2F;9; object-fit: cover;&quot; width=90% alt=&quot;SRR after fabrication&quot;&#x2F;&gt;
  &lt;figcaption&gt;Complete SRR filter&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;design-and-simulation&quot;&gt;Design and Simulation&lt;&#x2F;h1&gt;
&lt;p&gt;To start the design process, I created the basic shape of a SRR. The dimensions of the ring were set to ensure the overall ring length was a one-half wavelength of the resonant frequency as recommended by the graduate student I was working with. In the case of 15 GHz, the overall length of the SRR should be 10 mm (which is quite small).&lt;&#x2F;p&gt;
&lt;p&gt;For this design I chose to placing the SRR&#x27;s parallel to a microstrip transmission line. Doing this will create a notch filter centered at the SRR&#x27;s resonant frequency. While the length to height ratio of the SRR isn&#x27;t critical, I made sure that the length was longer to better couple with the transmission line. To tune the SRR I took an iterative approach, changing one variable at a time and running a low-precision simulation. This simulation helped locate the resonant frequency to ensure I was on the right track.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;transmission-line&quot;&gt;Transmission line&lt;&#x2F;h2&gt;
&lt;p&gt;To design the transmission line I used AWR Microwave Office&#x27;s built in TXLine tool. With this tool I calculated the dimensions required for a 50 ohm 15 GHz microstrip transmission line on a Rogers RO4003C substrate. The substrate was 0.51 mm thick with a copper thickness of 35 um. From the TXLine result, a trace width of 1.156 mm is required.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;txline.png&quot; width=70% alt=&quot;TXLine software result&quot;&#x2F;&gt;
  &lt;figcaption&gt;Microstrip TXLine calculation&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;initial-design&quot;&gt;Initial Design&lt;&#x2F;h2&gt;
&lt;p&gt;In the first design I ran a quick simulation with 1 SRR, and decided to use 6 SRR&#x27;s on one line to achieve the desired notch magnitude (depth) at the resonant freuqency. The resulting Q-factor of the notch was around 21, with a bandwidth of 705 MHz. This was good, but it wasn&#x27;t at the target frequency and I wanted a wider bandwidth so lower-resolution network analyzers can see the notch.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;srr_layout_iter1.png&quot; style=&quot;--aspect: 16&#x2F;9;&quot; width=49% alt=&quot;SRR Geometry&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;srr_layout_parameters.png&quot; style=&quot;--aspect: 16&#x2F;9;&quot; width=49% alt=&quot;SRR Geometry Parameters&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;srr_sparam_iter1.png&quot; width=49% alt=&quot;SRR S-Parameters&quot;&#x2F;&gt;
  &lt;figcaption&gt;6 SRR Simulation setup and results&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;tuning-the-freuquency&quot;&gt;Tuning the freuquency&lt;&#x2F;h2&gt;
&lt;p&gt;Continuing with my iterative design approach to this, I started adjusting portions of the SRR to achieve different results. To do this I went back to using 1 SRR and ran some courser simulations. I found that by making the bottom length of the SRR thicker, I could achieve the frequency I wanted to design to, as well as improve the notches magnitude.&lt;&#x2F;p&gt;
&lt;p&gt;For the single SRR, the frequency was centered at 15 GHz and had a Q-factor of 60. The geometry of the SRR was 0.25λ tall by 0.3λ wide, a trace width of 0.4 mm with the bottom trace being 0.6 mm, a gap of 0.25 mm, and 0.23 mm spacing from the microstrip.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;srr_layout_single_iter2.png&quot; width=49% alt=&quot;SRR Geometry of 2nd iteration&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;srr_sparam_single_iter2.png&quot; width=49% alt=&quot;SRR S-Parameters of 2nd iteration&quot;&#x2F;&gt;
  &lt;figcaption&gt;Single SRR Simulation setup and results&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;I wanted to see if I could improve the depth of the notch so I placed 6 SRR&#x27;s on the microstrip again. This time the notch was much deeper and still on frequency, with a bandwidth of 700 MHz and a Q-factor of 21.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;srr_layout_six_iter2.png&quot; width=49% alt=&quot;SRR Geometry of 2nd iteration&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;srr_sparam_six_iter2.png&quot; width=49% alt=&quot;SRR S-Parameters of 2nd iteration&quot;&#x2F;&gt;
  &lt;figcaption&gt;Six SRR Simulation setup and results&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;increasing-the-bandwidth&quot;&gt;Increasing the Bandwidth&lt;&#x2F;h2&gt;
&lt;p&gt;Satisfied with the depth of the notch, I began testing ways to increase the bandwidth (lower the Q-factor). The best simulation results I achieved were after spacing the SRR&#x27;s 2.33 mm from each other and increasing the outer SRR&#x27;s spacing from the microstrip by another 0.1 mm (making it 0.3 mm). I achieved a bandwidth of 701 MHz (marginal if any improvement at all) and a notch depth of -28 dB.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;srr_layout_iter3.png&quot; width=49% alt=&quot;SRR Geometry of 32nd iteration&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;srr_sparam_iter3.png&quot; width=49% alt=&quot;SRR S-Parameters of 3nd iteration&quot;&#x2F;&gt;
  &lt;figcaption&gt;Final SRR Simulation setup and results&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;After spending some time simulating different configurations, time was running out so I settled for the 700 MHz bandwidth.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;srr-pcb-fabrication&quot;&gt;SRR PCB Fabrication&lt;&#x2F;h1&gt;
&lt;p&gt;I translated the design from AWR Microwave Office to KiCad to generate the necessary PCB fabrication files. I designed the SRR around the Rogers RO4003C substrate.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;pcb_layout.png&quot; width=49% alt=&quot;PCB layout of SRRs&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;20260324_164804.webp&quot; width=49% alt=&quot;Rogers RO4003C Substrate Specs&quot;&#x2F;&gt;
  &lt;figcaption&gt;PCB Fabrication Preparation&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Using a 1200 DPI laserjet printer, I printed the PCB design on to some gloss paper. I then used a laminator to transfer the toner from the gloss paper onto the RO4003C copper clad board. After the toner is transferred to the copper clad board, I tape off the back side to keep the copper ground plane and etch the board in ammonium persulphate.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20260327_120259.webp&quot; width=49% alt=&quot;PCB design on gloss paper&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;20260327_121113.webp&quot; width=49% alt=&quot;Toner transfer process&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;20260327_122444.webp&quot; width=49% alt=&quot;Successful toner transfer&quot;&#x2F;&gt;
  &lt;figcaption&gt;Toner transfer and Etching&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The results after the etching process were promising. The SRR dimensions were on the edge of the printers resolution, so the resulting PCB had &quot;bumpy&quot; traces.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_9149.webp&quot; width=49% alt=&quot;Etched PCB before removing toner&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;IMG_9150.webp&quot; width=49% alt=&quot;Etched PCB&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;20260327_152209.webp&quot; width=49% alt=&quot;Full PCB image&quot;&#x2F;&gt;
  &lt;figcaption&gt;The resulting etched PCB&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;lab-tests-on-keysight-n5222b-pna&quot;&gt;Lab tests on Keysight N5222B PNA&lt;&#x2F;h2&gt;
&lt;p&gt;After fabricating 3 of the SRR PCBs, I tested them from 12-18 GHz on a calibrated vector network analyzer. The results of which were close to what I designed, but off from the initial frequency. I tested the SRR on its own and achieved a notch at 14.155 GHz, and a depth of -21.75 dB. Curious, I then placed some Kapton tape over the SRR&#x27;s to see what it would look like. Shown in the second image, the S21 measurement of the SRR with Kapton is shown in bright blue, while the SRR without the Kapton is shown by the dark blue trace.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20260327_154054.webp&quot; style=&quot;--aspect: 3&#x2F;4;&quot; width=49% alt=&quot;SRR result on the VNA&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;20260327_154557.webp&quot; style=&quot;--aspect: 3&#x2F;4;&quot; width=49% alt=&quot;Etched PCB&quot;&#x2F;&gt;
  &lt;figcaption&gt;Testing the SRR without Kapton (left) and with Kapton (right)&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;results-and-challenges&quot;&gt;Results and Challenges&lt;&#x2F;h1&gt;
&lt;p&gt;This project was a means to an end, with the main purpose being to test the scalar network analyzer (SNA) my team and I designed for our &lt;a href=&quot;&#x2F;projects&#x2F;26-ubco-capstone&quot;&gt;undergraduate capstone project&lt;&#x2F;a&gt;. We measured our SNA using the SRR with the Kapton tape.&lt;&#x2F;p&gt;
&lt;p&gt;The key challenge in making this SRR was managing the sizes of every trace. Striking a balance in trace width, spacing, gap width, and overall dimensions was a hurdle that took lots of iteration. Being limited in time, continuously running simulations for each iteration would take too long, so I strategized. Utilizing patterns I notice with each simulation, making educated changes based on those patterns, and running low-resolution simulations allowed me to optimize the time it took to design the SRR filter.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;vna_measurement.png&quot; width=90% alt=&quot;Result of the VNA test&quot;&#x2F;&gt;
  &lt;figcaption&gt;VNA test comparison between the SRR with and without Kapton tape&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Homebrew Ribbon Microphone</title>
        <published>2026-02-28T00:00:00+00:00</published>
        <updated>2026-02-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/ribbon-mic/"/>
        <id>https://mikebell.cc/posts/ribbon-mic/</id>
        
        <summary type="html">&lt;p&gt;I recently purchased a Roland Rubix22 USB audio interface second-hand for my PC, and being that it has XLR and 1&#x2F;4 inch mic jacks, I thought it would be fun to have my hand at making a microphone. While looking into the different types of microphones that exist, I chose to try making a ribbon mic.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Inductor Saturation Current Tester</title>
        <published>2026-01-25T00:00:00+00:00</published>
        <updated>2026-01-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/inductor-sat-tester/"/>
        <id>https://mikebell.cc/posts/inductor-sat-tester/</id>
        
        <summary type="html">&lt;p&gt;Working on my Vacuum Flourescent Display (VFD) filament driver, I realized I have no easy way to test the saturation current of my home made inductors. Characterizing the inductors core material is necessary to creating an efficient transformer, so I built a test unit based on the principles of inductance.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Vacuum Flourescent Display Filament Driver</title>
        <published>2025-12-23T00:00:00+00:00</published>
        <updated>2025-12-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/vfd-filament-driver/"/>
        <id>https://mikebell.cc/posts/vfd-filament-driver/</id>
        
        <summary type="html">&lt;p&gt;After getting curious about vacuum tubes, nixie tubes, and later on vacuum flourescent displays (VFDs), I decided to go and give driving a VFD a shot. It seemed simple enough as I didn&#x27;t need to use high voltages.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Doublet Antenna Design</title>
        <published>2025-12-03T00:00:00+00:00</published>
        <updated>2025-12-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/25-engr-473-project/"/>
        <id>https://mikebell.cc/projects/25-engr-473-project/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/25-engr-473-project/">&lt;p&gt;For my antennas course (ENGR 473) in my 4th year of undergraduate studies, the class was given a final project. In this project students were tasked with designing a specific antenna within Cadence&#x27;s AWR Microwave Office&#x27;s AXIEM software (I will refer to it as AWR AXIEM, or AXIEM). Students were given a list of antennas they could choose from, such as Yagi-Uda, Bow-tie, Fractal, Helical, etc.&lt;&#x2F;p&gt;
&lt;p&gt;Around the middle of the school term, I was in the process of designing a doublet antenna in the backyard for my HF radio. After a discussion with the professor, he offered I  expand on my existing 40m doublet for the project.&lt;&#x2F;p&gt;
&lt;p&gt;The project itself was to hold a presentation educating the class on the history and applications of the antenna, and showing the AWR AXIEM simulation results. In this project writeup I will cover both the process I took of building this antenna and some simulation results.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20251102_124436.webp&quot; style=&quot;filter: brightness(95%); --aspect: 21&#x2F;9; object-position: top;&quot; width=90% alt=&quot;TTL XOR Schematic&quot;&#x2F;&gt;
  &lt;figcaption&gt;Doublet antenna on a 30 ft mast&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;doublet-antenna&quot;&gt;Doublet Antenna&lt;&#x2F;h1&gt;
&lt;p&gt;A doublet is a common variant of the standard dipole antenna, but with a few key differences. Most notably, a doublet is a &lt;u&gt;non-resonant&lt;&#x2F;u&gt; dipole that uses a balanced feedline (typically a 300 Ω, 450 Ω, or 600 Ω two-wire &quot;ladder&quot; line). While a standard resonant dipole has an impedance of 73 + j42.5 Ω and easily matches a 50 Ω system with a 1:1 current balun, a doublet&#x27;s feedline impedance varies wildly depending on the frequency. Because of this, it requires an Antenna Tuning Unit (ATU) to achieve a proper match.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Why use a doublet?&lt;&#x2F;strong&gt; It is an incredibly efficient multi-band antenna. Its main draw is the ability to tune across several different frequency bands while maintaining high performance.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;What does &quot;non-resonant&quot; mean?&lt;&#x2F;strong&gt; In this context, it means the antenna isn&#x27;t operating at a natural 50 Ω match. The elements are intentionally cut to lengths that do not match the standard wavelength fractions (like λ&#x2F;2, λ&#x2F;4, or λ&#x2F;8) of the frequencies being used.&lt;&#x2F;p&gt;
&lt;p&gt;Note: when referring to λ, it is the wavelength of the &lt;u&gt;lowest operating frequency&lt;&#x2F;u&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;operation&quot;&gt;Operation&lt;&#x2F;h2&gt;
&lt;p&gt;Because doublets are non-resonant, the VSWR on the elements and balanced feedline can reach 10:1 or higher. If you were to use conventional coaxial cable, cable loss would cause these standing waves to dissipate rather than fully radiate. A two-wire feedline solves this problem: it allows the standing waves to reflect back and forth between the elements and the ATU with very little loss, ensuring most of the energy is radiated.&lt;&#x2F;p&gt;
&lt;p&gt;This balanced feedline also acts as an impedance transformer, a detail that influences how a doublet may be built. By intentionally balancing the lengths of the elements and the feedline, the antenna can be targeted for specific amateur radio bands (most noteably, the 80m&#x2F;75m, 60m, 40m, 30m, 20m, 17m, 15m, 12m, and 10m bands).&lt;&#x2F;p&gt;
&lt;p&gt;Another approach is to cut the elements to resonate on the lowest desired frequency, while relying on the ATU to tune it for higher bands. For the antenna I built and simulated, I used an element length of 10.7m (approx. 44 feet) to establish a minimum operating frequency of 7 MHz for the 40m band.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;building-the-doublet&quot;&gt;Building the Doublet&lt;&#x2F;h1&gt;
&lt;p&gt;The antenna was built as affordably as possible. The materials I used to make the antenna were as follows:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;6x Fiberglass Military tent poles (OD of 2.75-inch) that I found for CA$5 each at Princess Auto.&lt;&#x2F;li&gt;
&lt;li&gt;A lot of 16 AWG hookup wire that I pulled from a spool I already have.&lt;&#x2F;li&gt;
&lt;li&gt;3D printed components, some crimp connectors, and a small fiberglass panel.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;constructing-the-feedline&quot;&gt;Constructing the feedline&lt;&#x2F;h2&gt;
&lt;p&gt;Being budget oriented, I decided to construct the feedline myself. To do this, I first calculated the spacing I would need to acieve a 450 Ω characteristic impedance. Using  an &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.emclab.cei.uec.ac.jp&#x2F;xiao&#x2F;Wire&#x2F;index.html&quot;&gt;online two-wire transmission line calculator&lt;&#x2F;a&gt; I determined the best wire spacing to be 28 mm center-to-center. Taking into account the velocity factor of the hookup wire and its PVC insulation, the impedance was likely not exactly 450 Ω, but close.&lt;&#x2F;p&gt;
&lt;p&gt;I designed and 3D printed some spacers that snap onto the wire out of PETG plastic. By placing spacers every 5 to 6 inches along the wires I created the feedline.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;two-wire-spacer.png&quot; width=70% alt=&quot;Feedline spacer design&quot;&#x2F;&gt;
  &lt;figcaption&gt;Spacer CAD model&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The final feedline was very consistent in its construction and looked the part.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250905_134850.webp&quot; width=49% alt=&quot;Making the feedline&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;20250905_194117.webp&quot; width=49% alt=&quot;A lot of home made feedline&quot;&#x2F;&gt;
  &lt;figcaption&gt;Two-wire Feedline&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;measuring-the-elements&quot;&gt;Measuring the elements&lt;&#x2F;h2&gt;
&lt;p&gt;The length of each element was cut to 10.7m. This length produces a resonance on the 40m band like a regular dipole antenna, but the doublet configuration allows it to be tunable to multiple bands.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250907_234726.webp&quot; width=49% alt=&quot;Fiberglass Plate&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;20250907_234721.webp&quot; width=49% alt=&quot;Feedline connected to the elements&quot;&#x2F;&gt;
  &lt;figcaption&gt;Electrical Connections&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;erecting-the-antenna&quot;&gt;Erecting the Antenna&lt;&#x2F;h2&gt;
&lt;p&gt;With everything measured and cut, the components were ready to be assembled. I constructed the antenna on the hill behind my house, mounting the fiberglass poles inside a secure steel pipe that I had set into concrete.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20251011_130421.webp&quot; width=80% alt=&quot;Antenna components&quot;&#x2F;&gt;
  &lt;figcaption&gt;Doublet antenna components&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The antenna used 44.25-inch fiberglass military tent poles for its mast. I initially used 8 poles to achieve a height of 10m, but it snapped after an exceptionally windy day. Because of this, I shortened the mast to 6 poles, leaving me with a height of 7.8m. This simply meant the antenna had a higher take-off angle, making it better optimized for NVIS operation.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20251101_174117.webp&quot; width=35% alt=&quot;Mast after falling&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;20251101_174208.webp&quot; width=35% alt=&quot;Mast break point&quot;&#x2F;&gt;
  &lt;figcaption&gt;Mast failure&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;After shortening the mast and optimizing my guy-line placement, the antenna stands strong.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20251031_162838.webp&quot; width=90% alt=&quot;Doublet antenna standing tall&quot;&#x2F;&gt;
  &lt;figcaption&gt;Doublet antenna standing tall&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;measurements&quot;&gt;Measurements&lt;&#x2F;h2&gt;
&lt;p&gt;To analyze the antenna&#x27;s impedance over the 1–30 MHz HF frequency range, I used a 1:1 current balun and a NanoVNA to capture the S11 parameters. I then converted the S11 parameters to a Z11 plot and VSWR plot.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20251120_142024.webp&quot; width=90% alt=&quot;NanoVNA measurement setup&quot;&#x2F;&gt;
  &lt;figcaption&gt;NanoVNA measurement setup&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;I placed markers on the 80m, 40m, 30m, 20m, 15m, and 10m bands. The resulting impedance at each point will be fed into the ATU via either a 1:1 or 4:1 balun to bring it within a matchable range for a 50 Ω system.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;Figure_2.png&quot; width=90% alt=&quot;Doublet antenna Z11 measurement&quot;&#x2F;&gt;
  &lt;figcaption&gt;Measured Z11 parameters&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;Figure_3.png&quot; width=90% alt=&quot;Doublet antenna VSWR measurement&quot;&#x2F;&gt;
  &lt;figcaption&gt;Measured VSWR&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;simulating-the-doublet&quot;&gt;Simulating the Doublet&lt;&#x2F;h1&gt;
&lt;p&gt;The doublet was simulated in AWR AXIEM, however due to constraints in the software, I had to scale the antenna and thus its frequency of operation. I scaled the frequency by 100 (and lengths scaled by 0.01). The simulations were run from 500 MHz to 3000 MHz.&lt;&#x2F;p&gt;
&lt;p&gt;I simulated different parameters of the antenna:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Total feedline length&lt;&#x2F;li&gt;
&lt;li&gt;Height off ground&lt;&#x2F;li&gt;
&lt;li&gt;Different earth conductivities&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;feedline-length&quot;&gt;Feedline Length&lt;&#x2F;h2&gt;
&lt;p&gt;Since the feedline acts as an impedance transformer, certain configurations can create extreme impedances that are challenging for an ATU to handle. Specifically, it is best to avoid a feedline length that is an integer multiple of λ&#x2F;2, or any combination where the feedline&#x27;s electrical length plus one antenna element equals an odd multiple of λ&#x2F;8 (such as λ&#x2F;4 + λ&#x2F;8 = 3λ&#x2F;8).&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;Slide14.png&quot; width=90% alt=&quot;Presentation slide 14&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The simulation evaluated the resulting impedances for three different feedline lengths: 107.1 mm, 160.7 mm, and 190 mm. The 190 mm feedline yielded the best results, as its non-multiple length provided the most matchable impedances.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;Slide15.png&quot; width=90% alt=&quot;Presentation slide 15&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;antenna-height&quot;&gt;Antenna Height&lt;&#x2F;h2&gt;
&lt;p&gt;Because the ground mirrors the currents in a horizontally oriented dipole or doublet, the ground plays an integral part in the far-field radiation pattern of the antenna. The best performance is acheived by keeping the antenna λ&#x2F;2 from the ground or higher. When the antenna elements are less than λ&#x2F;2 off the ground, the mirrored currents in the ground will act against the antennas currents providing destructive interference. This interference pushes the take-off angle upwards, making the antenna radiate towards the sky rather than the horizon. Having the antenna less than λ&#x2F;2 or even λ&#x2F;4 is the principle behind near vertical incidence skywave (NVIS) operation.&lt;&#x2F;p&gt;
&lt;p&gt;The resulting radiation patterns show that as the height off the ground decreases, the main radiating lobe of the lowest frequency is directed further upwards.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;Slide19.png&quot; width=49% alt=&quot;Presentation slide 19&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;Slide20.png&quot; width=49% alt=&quot;Presentation slide 20&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;Slide21.png&quot; width=49% alt=&quot;Presentation slide 21&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;Slide22.png&quot; width=49% alt=&quot;Presentation slide 22&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;ground-conductivity&quot;&gt;Ground Conductivity&lt;&#x2F;h2&gt;
&lt;p&gt;Because the ground interacts with the antenna&#x27;s radiation pattern, I simulated the effect of different earth conductivities based on &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;publications.gc.ca&#x2F;collections&#x2F;collection_2021&#x2F;rncan-nrcan&#x2F;m183-2&#x2F;M183-2-8594-eng.pdf&quot;&gt;One-dimensional Layered Earth Models&lt;&#x2F;a&gt; provided by the canadian geological survey.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;Slide26.png&quot; width=49% alt=&quot;Presentation slide 26&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;Slide27.png&quot; width=49% alt=&quot;Presentation slide 27&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;Slide28.png&quot; width=49% alt=&quot;Presentation slide 28&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;Slide29.png&quot; width=49% alt=&quot;Presentation slide 29&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;presentation-document&quot;&gt;Presentation Document&lt;&#x2F;h2&gt;
&lt;p&gt;The full slide deck can be found in PDF format here: &lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;projects&#x2F;25-engr-473-project&#x2F;media&#x2F;473_presentation.pdf&quot;&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z&quot; &#x2F;&gt;  &lt;path d=&quot;M14 2v5a1 1 0 0 0 1 1h5&quot; &#x2F;&gt;  &lt;path d=&quot;M10 9H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 13H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 17H8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Presentation Slides&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>2025 UBCO IEEE PCB Design Workshop</title>
        <published>2025-10-23T00:00:00+00:00</published>
        <updated>2025-10-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/25-eworkshop/"/>
        <id>https://mikebell.cc/projects/25-eworkshop/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/25-eworkshop/">&lt;p&gt;In the autumn of 2025, I once again volunteered to create and present a printed circuit board (PCB) design workshop for the University of British Columbia Okanagan&#x27;s (UBCO) IEEE McNaughton Learning Resource Center&#x27;s (MLRC) Hackerspace (or UBCO IEEE MLRC Hackerspace for &quot;&lt;em&gt;short&lt;&#x2F;em&gt;&quot;).&lt;&#x2F;p&gt;
&lt;p&gt;Having hosted this workshop in 2022 and 2023, I knew how I could improve this workshop even more.&lt;&#x2F;p&gt;
&lt;p&gt;In the &lt;a href=&quot;&#x2F;projects&#x2F;23-eworkshop&quot;&gt;2023 EWorkshop&lt;&#x2F;a&gt; I recieved feedback that the PCB was difficult for beginners who have never soldered before which I should have expected since I chose to use SMD components for the PCB.&lt;&#x2F;p&gt;
&lt;p&gt;This year I decided to go with a different PCB design. One that is simpler, is made with through hole components, and has fewer parts, all while being tactile and captivating. The board was based on a transistor-transistor logic (TTL) exclusive OR (XOR) gate. Using 3 BJTs, 4 resistors, 2 SPST push buttons, and an LED.&lt;&#x2F;p&gt;
&lt;p&gt;Before going into the circuit however, I will cover how I structured the workshop.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;presentation-and-structure&quot;&gt;Presentation and Structure&lt;&#x2F;h2&gt;
&lt;p&gt;The presentation structure was similar to the 2023 workshop. I primarily covered the following:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Introduction to the KiCAD software - A brief run through of the project creation process.&lt;&#x2F;li&gt;
&lt;li&gt;Introduction to the schematic editor, placing components, changing and adding component properties.&lt;&#x2F;li&gt;
&lt;li&gt;Sourcing parts from sites like &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.digikey.ca&#x2F;&quot;&gt;DigiKey&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.mouser.ca&#x2F;&quot;&gt;Mouser&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Generating a bill of materials (BOM)&lt;&#x2F;li&gt;
&lt;li&gt;Configuring the PCB editor, setting DRC tolerances, importing footprints, and PCB layout.&lt;&#x2F;li&gt;
&lt;li&gt;Running design rule checks on the final PCB design and exporting gerber (manufacture) files.&lt;&#x2F;li&gt;
&lt;li&gt;Ordering PCB&#x27;s from sites like &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;oshpark.com&#x2F;&quot;&gt;OSH Park&lt;&#x2F;a&gt;, &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.pcbway.com&#x2F;&quot;&gt;PCBway&lt;&#x2F;a&gt;, and &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;jlcpcb.com&#x2F;&quot;&gt;JLCPCB&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;On later dates, students could also come to the hackerspace to learn how to solder the PCBs.&lt;&#x2F;p&gt;
&lt;p&gt;Like I mentioned in &lt;a href=&quot;&#x2F;projects&#x2F;23-eworkshop&quot;&gt;2023 EWorkshop&lt;&#x2F;a&gt;, the information from the &lt;a href=&quot;&#x2F;notes&#x2F;sch-practices&#x2F;&quot;&gt;&lt;em&gt;schematic design best practice&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; and &lt;a href=&quot;&#x2F;notes&#x2F;pcb-practices&#x2F;&quot;&gt;&lt;em&gt;PCB design best practice&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; to my notes section of my site which has my updated and most recent personal best practices that I employ.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;documents&quot;&gt;Documents&lt;&#x2F;h3&gt;
&lt;p&gt;I reused most of the presentation structure from the 2023 workshop, and adjusted it to have information on the new circuit.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;projects&#x2F;25-eworkshop&#x2F;media&#x2F;eworkshop_presentation_2025.pdf&quot;&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z&quot; &#x2F;&gt;  &lt;path d=&quot;M14 2v5a1 1 0 0 0 1 1h5&quot; &#x2F;&gt;  &lt;path d=&quot;M10 9H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 13H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 17H8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; EWorkshop Presentation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The supplimental documents I made for the 2023 workshop still apply to this workshop, so I gave them a touch-up and provided them to students.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;projects&#x2F;25-eworkshop&#x2F;media&#x2F;schematic_design_best_practice_2025.pdf&quot;&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z&quot; &#x2F;&gt;  &lt;path d=&quot;M14 2v5a1 1 0 0 0 1 1h5&quot; &#x2F;&gt;  &lt;path d=&quot;M10 9H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 13H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 17H8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Schematic Design Best Practice&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;projects&#x2F;25-eworkshop&#x2F;media&#x2F;pcb_design_best_practice_2025.pdf&quot;&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z&quot; &#x2F;&gt;  &lt;path d=&quot;M14 2v5a1 1 0 0 0 1 1h5&quot; &#x2F;&gt;  &lt;path d=&quot;M10 9H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 13H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 17H8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; PCB Design Best Practice&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;projects&#x2F;25-eworkshop&#x2F;media&#x2F;ordering_pcbs_and_parts_online_2025.pdf&quot;&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z&quot; &#x2F;&gt;  &lt;path d=&quot;M14 2v5a1 1 0 0 0 1 1h5&quot; &#x2F;&gt;  &lt;path d=&quot;M10 9H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 13H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 17H8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Ordering PCBs and Parts Online&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;circuit-and-pcb&quot;&gt;Circuit and PCB&lt;&#x2F;h2&gt;
&lt;p&gt;The circuit I chose to use was a TTL XOR gate, consisting of a few BJTs, resistors, buttons, and an LED.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;schem.png&quot; width=90% alt=&quot;TTL XOR Schematic&quot;&#x2F;&gt;
  &lt;figcaption&gt;TTL XOR Schematic&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Before I designed the PCB, I made sure to prototype the circuit to verify that it is functional.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;video width=&quot;90%&quot; controls&gt;
    &lt;source src=&quot;media&#x2F;20251008_222020.mp4&quot; type=&quot;video&#x2F;mp4&quot; width=&quot;90%&quot; alt=&quot;TTL XOR breadboard test&quot;&#x2F;&gt;
  &lt;&#x2F;video&gt;
  &lt;figcaption&gt;TTL XOR breadboard test&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Once the circuit was prototyped and validated, I designed the PCB.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;top_cu.png&quot; width=49% alt=&quot;PCB Layout top layer&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;bottom_cu.png&quot; width=49% alt=&quot;PCB Layout bottom layer&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;pcb_isometric.png&quot; width=49% alt=&quot;PCB Render isometric&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;pcb_top.png&quot; width=49% alt=&quot;PCB Render top&quot;&#x2F;&gt;
  &lt;figcaption&gt;PCB Design&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;workshop-event&quot;&gt;Workshop Event&lt;&#x2F;h2&gt;
&lt;p&gt;This workshop had a large turnup, with students in different areas of study such as Computer Science, Computer Engineering, Mechanical Engineering, and Electrical Engineering. Presenting the workshop, we covered all the basics of KiCad and I had time to spare in the third session to answer any additional questions that attendees had.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_3679.webp&quot; width=90% alt=&quot;Workshop session 1&quot;&#x2F;&gt;
  &lt;figcaption&gt;First Workshop Session&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;final-pcb&quot;&gt;Final PCB&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20251205_124854.webp&quot; width=90% alt=&quot;PCB front and back&quot;&#x2F;&gt;&lt;br&gt;
  &lt;img src=&quot;media&#x2F;20251205_001958.webp&quot; width=90% alt=&quot;PCB soldered&quot;&#x2F;&gt;&lt;br&gt;
  &lt;video width=&quot;90%&quot; controls&gt;
    &lt;source src=&quot;media&#x2F;20251205_002148.mp4&quot; type=&quot;video&#x2F;mp4&quot; width=&quot;90%&quot; alt=&quot;PCB operation&quot;&#x2F;&gt;
  &lt;&#x2F;video&gt;
  &lt;figcaption&gt;Finished PCB&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>RF Mixer Visualization</title>
        <published>2025-10-11T00:00:00+00:00</published>
        <updated>2025-10-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/notes/mixer-visualise/"/>
        <id>https://mikebell.cc/notes/mixer-visualise/</id>
        
        <content type="html" xml:base="https://mikebell.cc/notes/mixer-visualise/">&lt;style&gt;
#plotWindow {
	background-color: white;
	border: .05rem solid var(--md-default-fg-color--lightest);
	border-radius: .1rem;
}

.md-typeset .grid &gt; .card {
	padding: .3rem .8rem;
}

.play-pause .pause-icon {
    display: none; &#x2F;* Initially hide pause icon *&#x2F;
}

#lo_anim:checked + .play-pause .play-icon {
    display: none; &#x2F;* Hide play icon when checked *&#x2F;
}

#lo_anim:checked + .play-pause .pause-icon {
    display: inline-block; &#x2F;* Show pause icon when checked *&#x2F;
}
&lt;&#x2F;style&gt;
&lt;h1 id=&quot;visual-aid-of-a-mixers-properties&quot;&gt;Visual Aid of a Mixers Properties&lt;&#x2F;h1&gt;
&lt;p&gt;&lt;span style=&quot;color:#ffa000; font-size: 0.85em;&quot;&gt;Plot may not function properly on small&#x2F;mobile displays.&lt;&#x2F;span&gt;&lt;&#x2F;p&gt;
&lt;div&gt;
    Viewport frequency limit: +&#x2F;- &lt;input type=&quot;text&quot; style=&quot;font-size: 0.9em; width: 4em;&quot; id=&quot;flimits&quot; inputmode=&quot;numeric&quot; value=&quot;1000&quot;&gt; MHz
&lt;&#x2F;div&gt;
&lt;div&gt;
	&lt;label for=&quot;fim&quot;&gt;Show Image Frequency &lt;&#x2F;label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;fim&quot; name=&quot;image&quot;&gt;
&lt;&#x2F;div&gt;
&lt;div&gt;
	&lt;label for=&quot;fneg&quot;&gt;Show Negative Frequency &lt;&#x2F;label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;fneg&quot; name=&quot;negative&quot; checked&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;&lt;canvas id=&quot;plotWindow&quot; width=&quot;600&quot; height=&quot;250&quot;&gt;&lt;&#x2F;canvas&gt;&lt;&#x2F;p&gt;
&lt;div&gt;
	RF carrier (center) frequency
    &lt;input type=&quot;range&quot; id=&quot;fc&quot; min=&quot;0&quot; max=&quot;1&quot; step=&quot;0.00001&quot; value=&quot;0.35&quot; style=&quot;width: 100%&quot;&gt;
&lt;&#x2F;div&gt;
&lt;div&gt;
LO frequency 
&lt;input type=&quot;checkbox&quot; id=&quot;lo_anim&quot; style=&quot;display:none;&quot;&gt;
	&lt;label for=&quot;lo_anim&quot; class=&quot;play-pause&quot; style=&quot;cursor: pointer;&quot;&gt;
		&lt;span class=&quot;play-icon&quot;&gt;:material-play:&lt;&#x2F;span&gt;&lt;span class=&quot;pause-icon&quot;&gt;:material-pause:&lt;&#x2F;span&gt;
	&lt;&#x2F;label&gt;
	&lt;input type=&quot;range&quot; id=&quot;flo&quot; min=&quot;0&quot; max=&quot;1&quot; step=&quot;0.00001&quot; value=&quot;0.275&quot; style=&quot;width: 100%&quot;&gt;
&lt;&#x2F;div&gt;
&lt;div&gt;
    RF signal bandwidth
    &lt;input type=&quot;range&quot; id=&quot;bw&quot; min=&quot;0&quot; max=&quot;1&quot; step=&quot;0.00001&quot; value=&quot;0.5&quot; style=&quot;width: 100%&quot;&gt;
&lt;&#x2F;div&gt;
&lt;script&gt;

&#x2F;&#x2F; Object definitions
const canvas = document.getElementById(&#x27;plotWindow&#x27;);
const ctx = canvas.getContext(&#x27;2d&#x27;);
let aspect = 3; &#x2F;&#x2F; Aspect ratio of canvas (for resize)

&#x2F;&#x2F; limits
let fmax = 100;
let bwmax = 0.2*fmax;
let ibwmax = 0.2*fmax;

&#x2F;&#x2F; Sliders
const fc_element = document.getElementById(&#x27;fc&#x27;);
const bw_element = document.getElementById(&#x27;bw&#x27;);
const flo_element = document.getElementById(&#x27;flo&#x27;);
const fim_element = document.getElementById(&#x27;fim&#x27;);
const flimits = document.getElementById(&#x27;flimits&#x27;);
const lo_anim = document.getElementById(&#x27;lo_anim&#x27;);
const fneg_element = document.getElementById(&#x27;fneg&#x27;);

&#x2F;&#x2F; Define Initial Axis Origin
let originX = canvas.width&#x2F;2; &#x2F;&#x2F; middle
let originY = canvas.height*0.9;
const fromEdge = canvas.width*0.02; &#x2F;&#x2F; axis padding from edge

&#x2F;&#x2F; Initial Properties
let v_fc = parseInt(fc_element.value);
let v_bw = parseInt(bw_element.value);
let v_flo = parseInt(flo_element.value);

var v_fifS; var v_fifD; var v_fimS; var v_fimD;
var fc_px; var bw_px; var flo_px;
var fifS_px; var fifD_px; var fimS_px; var fimD_px;

var side;
let showImage = fim_element.checked;
let showNeg = fneg_element.checked;

let sidebandOpacity = 0.35;

const f_height = canvas.height*0.3;

const fcColor = &#x27;rgba(13, 77, 2, 0.8)&#x27;;
const fcusbColor = &#x27;rgba(32, 138, 14,&#x27;+sidebandOpacity+&#x27;)&#x27;;
const fclsbColor = &#x27;rgba(18, 77, 8,&#x27;+sidebandOpacity+&#x27;)&#x27;;

const loColor = &#x27;rgba(0, 0, 255, 0.8)&#x27;;

const ifColor = &#x27;rgba(82, 7, 89, 0.8)&#x27;;
const ifusbColor = &#x27;rgba(144, 19, 156,&#x27;+sidebandOpacity+&#x27;)&#x27;;
const iflsbColor = &#x27;rgba(86, 20, 92,&#x27;+sidebandOpacity+&#x27;)&#x27;;

const imDColor = &#x27;rgba(255, 0, 0, 0.8)&#x27;;
const imSColor = &#x27;rgba(72, 72, 72, 0.8)&#x27;;



&#x2F;&#x2F; Function to draw carrier signal and its sidebands
function drawSidebands(pos, bw, height, color, lColor, uColor, op=0, label=&#x27;&#x27;, label_height=0) {
	const m = 2;
	var nlabel = label;
	
	var pos_p = originX + pos;
	var pos_n = originX - pos;
	
	&#x2F;&#x2F; Positive Frequency
	drawLine(pos_p, originY - 1, pos_p, height, color, label, label_height); &#x2F;&#x2F; Carrier line
	&#x2F;&#x2F; Draw sidebands
	if (op == 0) { &#x2F;&#x2F; Trapezoid (lsb high)
		drawTrapezoid(pos_p-bw&#x2F;2, originY - 1, pos_p-m, originY-1, pos_p-m, height*1.14, pos_p-bw&#x2F;2, height*1, lColor, lColor);
		drawTrapezoid(pos_p+bw&#x2F;2, originY - 1, pos_p+m, originY-1, pos_p+m, height*1.16, pos_p+bw&#x2F;2, height*1.3, uColor, uColor);
	} else if (op == 1) { &#x2F;&#x2F; Triangle (dsb)
		drawTrapezoid(pos_p-bw&#x2F;2, originY - 1, pos_p-m, originY-1, pos_p-m, height*1.05, pos_p-bw&#x2F;2, height*1.15, lColor, lColor);
		drawTrapezoid(pos_p+bw&#x2F;2, originY - 1, pos_p+m, originY-1, pos_p+m, height*1.05, pos_p+bw&#x2F;2, height*1.15, uColor, uColor);
	}
	
	if (label != &#x27;&#x27;) nlabel = &#x27;-&#x27;+label;
	
	&#x2F;&#x2F; Negative Frequency
	drawLine(pos_n, originY - 1, pos_n, height, color, nlabel, label_height); &#x2F;&#x2F; Carrier line
	&#x2F;&#x2F; Draw sidebands
	if (op == 0) { &#x2F;&#x2F; Trapezoid (lsb high)
		drawTrapezoid(pos_n-bw&#x2F;2, originY-1, pos_n-m, originY-1, pos_n-m, height*1.16, pos_n-bw&#x2F;2, height*1.3, uColor, uColor);
		drawTrapezoid(pos_n+bw&#x2F;2, originY-1, pos_n+m, originY-1, pos_n+m, height*1.14, pos_n+bw&#x2F;2, height*1, lColor, lColor);
	} else if (op == 1) { &#x2F;&#x2F; Triangle (dsb)
		drawTrapezoid(pos_n-bw&#x2F;2, originY - 1, pos_n-m, originY-1, pos_n-m, height*1.05, pos_n-bw&#x2F;2, height*1.15, uColor, uColor);
		drawTrapezoid(pos_n+bw&#x2F;2, originY - 1, pos_n+m, originY-1, pos_n+m, height*1.05, pos_n+bw&#x2F;2, height*1.15, lColor, lColor);
	}
	
}

function drawCarrier(pos, height, color, label=&#x27;&#x27;, label_height=0) {
	var pos_p = originX + pos;
	var pos_n = originX - pos;
	
	var nlabel = label;
	if (label != &#x27;&#x27;) nlabel = &#x27;-&#x27;+label;
	
	&#x2F;&#x2F; Positive Frequency
	drawLine(pos_p, originY - 1, pos_p, height, color, label, label_height); &#x2F;&#x2F; Carrier line
	&#x2F;&#x2F; Negative Frequency
	drawLine(pos_n, originY - 1, pos_n, height, color, nlabel, label_height); &#x2F;&#x2F; Carrier line
}

&#x2F;&#x2F; Draw all components generated by the mixer
function drawAll() {
	ctx.clearRect(0, 0, canvas.width, canvas.height); &#x2F;&#x2F; Clear the canvas
    drawAxis(); &#x2F;&#x2F; redraw axis
	
	drawSidebands(fc_px, bw_px, f_height, fcColor, fclsbColor, fcusbColor, 0, &#x27;rf&#x27;, originY+12); &#x2F;&#x2F; draw rf
	drawSidebands(fifD_px, bw_px, f_height, ifColor, iflsbColor, ifusbColor, 0, &#x27;if(d)&#x27;, f_height-8); &#x2F;&#x2F; draw if difference
	drawSidebands(fifS_px, bw_px, f_height, ifColor, iflsbColor, ifusbColor, 0, &#x27;if(s)&#x27;, f_height-8); &#x2F;&#x2F; draw if sum
	
	drawCarrier(flo_px, f_height, loColor, &#x27;lo&#x27;, f_height-16);
	
	if (showImage) {
		drawCarrier(fimS_px, f_height*1.5, imSColor, &#x27;im(s)&#x27;, f_height*1.5-10);
		drawCarrier(fimD_px, f_height*1.5, imDColor, &#x27;im(d)&#x27;, f_height*1.5-10);
	}
	
	&#x2F;&#x2F; Description Text
	ctx.font = &#x27;12px consolas&#x27;;
	ctx.textBaseline = &#x27;middle&#x27;;
    
	ctx.textAlign = &#x27;left&#x27;;
	ctx.fillStyle = &#x27;rgb(0, 0, 0)&#x27;;
    ctx.fillText(&#x27;Michael Bell 2025&#x27;, 2, 8);
	ctx.fillText(&#x27;Viewport:\t\t[-&#x27;+Math.round(fmax*100)&#x2F;100+&#x27;,&#x27;+Math.round(fmax*100)&#x2F;100+&#x27;] MHz&#x27;, 2, canvas.height-8);
	
	ctx.textAlign = &#x27;right&#x27;;
    ctx.fillStyle = fcColor;
    ctx.fillText(&#x27;rf:\t\t&#x27;+v_fc.toFixed(2)+&#x27; MHz&#x27;, canvas.width-2, 8);
	ctx.fillStyle = loColor;
    ctx.fillText(&#x27;lo:\t\t&#x27;+v_flo.toFixed(2)+&#x27; MHz&#x27;, canvas.width-2, 20);
	ctx.fillStyle = ifColor;
    ctx.fillText(&#x27;if(Sum):\t\t&#x27;+v_fifS.toFixed(2)+&#x27; MHz&#x27;, canvas.width-2, 32);
	ctx.fillText(&#x27;if(Diff):\t\t&#x27;+v_fifD.toFixed(2)+&#x27; MHz&#x27;, canvas.width-2, 44);
	
	if (showImage) {
		ctx.fillStyle = imSColor;
		ctx.fillText(&#x27;im(s):\t\t&#x27;+v_fimS.toFixed(2)+&#x27; MHz&#x27;, canvas.width-2, canvas.height-32);
		ctx.fillStyle = imDColor;
		ctx.fillText(&#x27;im(d):\t\t&#x27;+v_fimD.toFixed(2)+&#x27; MHz&#x27;, canvas.width-2, canvas.height-20);
	}
	ctx.fillStyle = &#x27;black&#x27;;
	ctx.fillText(&#x27;bw:\t\t&#x27;+v_bw.toFixed(2)+&#x27; MHz&#x27;, canvas.width-2, canvas.height-8);
	
	ctx.textAlign = &#x27;center&#x27;;
	ctx.fillStyle = &#x27;blue&#x27;;
    ctx.fillText(side+&#x27; injection&#x27;, canvas.width*0.5, canvas.height-8);
	
	if (!showNeg) {
		ctx.clearRect(0, fromEdge*2, originX-1, originY-fromEdge*2-1); &#x2F;&#x2F; Clear sliver at start
		ctx.clearRect(0, originY+1, originX-1, fromEdge*1.5); &#x2F;&#x2F; Clear sliver at start
	}
}

function resizeCanvas() {
	let new_width = canvas.parentNode.offsetWidth;
	canvas.width = new_width;
	canvas.height = new_width &#x2F; aspect;
	updateValues(); &#x2F;&#x2F; Redraw
}

function drawAxis() {
	if (showNeg) originX = canvas.width&#x2F;2; &#x2F;&#x2F; middle
	else originX = 3*fromEdge; &#x2F;&#x2F; middle
	
	originY = canvas.height*0.8;
	
	var adim = 10;
	
	&#x2F;&#x2F; Draw X-axis
	ctx.beginPath(); 
	ctx.moveTo(0, originY); &#x2F;&#x2F; Set cursor start point
	ctx.lineTo(canvas.width, originY);
	ctx.strokeStyle = &#x27;black&#x27;;
	ctx.lineWidth = 1;
	ctx.stroke();
	
	&#x2F;&#x2F; X-axis left arrow
	if (showNeg) {
		ctx.beginPath(); 
		ctx.moveTo(adim, originY); &#x2F;&#x2F; Set cursor start point
		ctx.lineTo(adim, originY-adim&#x2F;2);
		ctx.lineTo(0, originY);
		ctx.lineTo(adim, originY+adim&#x2F;2);
		ctx.lineTo(adim, originY);
		ctx.fillStyle = &#x27;black&#x27;;
		ctx.strokeStyle = &#x27;black&#x27;;
		ctx.fill();
		ctx.lineWidth = 1;
		ctx.stroke();
	}
	
	&#x2F;&#x2F; X-axis right arrow
	ctx.beginPath(); 
	ctx.moveTo(canvas.width-adim, originY); &#x2F;&#x2F; Set cursor start point
	ctx.lineTo(canvas.width-adim, originY-adim&#x2F;2);
	ctx.lineTo(canvas.width, originY);
	ctx.lineTo(canvas.width- adim, originY+adim&#x2F;2);
	ctx.lineTo(canvas.width- adim, originY);
	ctx.fillStyle = &#x27;black&#x27;;
	ctx.strokeStyle = &#x27;black&#x27;;
	ctx.fill();
	ctx.lineWidth = 1;
	ctx.stroke();
	
	&#x2F;&#x2F; Draw Y-axis
	ctx.beginPath();
	ctx.moveTo(originX, originY + fromEdge);
	ctx.lineTo(originX, fromEdge);
	ctx.strokeStyle = &#x27;black&#x27;;
	ctx.lineWidth = 1;
	ctx.stroke();
	
	&#x2F;&#x2F; y-axis top arrow
	ctx.beginPath(); 
	ctx.moveTo(originX, adim+fromEdge); &#x2F;&#x2F; Set cursor start point
	ctx.lineTo(originX+adim&#x2F;2, adim+fromEdge);
	ctx.lineTo(originX, fromEdge);
	ctx.lineTo(originX-adim&#x2F;2, adim+fromEdge);
	ctx.lineTo(originX, adim+fromEdge);
	ctx.fillStyle = &#x27;black&#x27;;
	ctx.strokeStyle = &#x27;black&#x27;;
	ctx.fill();
	ctx.lineWidth = 1;
	ctx.stroke();
	
	&#x2F;&#x2F; Zero point text
	ctx.font = &#x27;14px consolas&#x27;;
    ctx.fillStyle = &#x27;black&#x27;;
    ctx.textAlign = &#x27;center&#x27;;
    ctx.textBaseline = &#x27;middle&#x27;;
    ctx.fillText(&#x27;0&#x27;, originX, originY+fromEdge*2);
}

function drawTrapezoid(x1, y1, x2, y2, x3, y3, x4, y4, fillColor = &#x27;blue&#x27;, strokeColor = &#x27;black&#x27;) {
    ctx.beginPath();
    ctx.moveTo(x1, y1); &#x2F;&#x2F; Top-left vertex
    ctx.lineTo(x2, y2); &#x2F;&#x2F; Top-right vertex
    ctx.lineTo(x3, y3); &#x2F;&#x2F; Bottom-right vertex
    ctx.lineTo(x4, y4); &#x2F;&#x2F; Bottom-left vertex
    ctx.closePath(); &#x2F;&#x2F; Connects the last point to the first
    ctx.fillStyle = fillColor;
    ctx.fill();
    ctx.strokeStyle = strokeColor;
    ctx.lineWidth = 1; &#x2F;&#x2F; Optional: set line width for the stroke
    ctx.stroke();
}

function drawLine(x1, y1, x2, y2, strokeColor = &#x27;black&#x27;, text=&#x27;&#x27;, text_y) {
	ctx.beginPath();
	ctx.moveTo(x1, y1);
	ctx.lineTo(x2, y2);
	ctx.strokeStyle = strokeColor;
	ctx.lineWidth = 1;
	ctx.stroke();
	
	&#x2F;&#x2F; Optional text below line
	ctx.font = &#x27;12px consolas&#x27;;
    ctx.fillStyle = strokeColor;
    ctx.textAlign = &#x27;center&#x27;;
    ctx.textBaseline = &#x27;middle&#x27;;
    ctx.fillText(text, x1, text_y);
}


function updateValues() {
	&#x2F;&#x2F; set max frequency
	fmax = parseFloat(flimits.value);
	bwmax = 0.2*fmax;
	
	var pxlim = canvas.width-originX-fromEdge; &#x2F;&#x2F; middle
	
	&#x2F;&#x2F; Carrier frequency value and pixel value on canvas
	v_fc = parseFloat(fc_element.value).map(0,1,0,fmax);
	fc_px = v_fc.map(0,fmax,0,pxlim);
	
	&#x2F;&#x2F; Bandwidth value and pixel width on canvas
	v_bw = parseFloat(bw_element.value).map(0,1,0,bwmax);
	bw_px = v_bw.map(0,bwmax,0,pxlim*0.1);
	
	&#x2F;&#x2F; Intermediate frequency value and pixel value on canvas
	v_flo = parseFloat(flo_element.value).map(0,1,0,fmax);
	flo_px = v_flo.map(0,fmax,0,pxlim);
	
	&#x2F;&#x2F; Calculate high and low side LO
	v_fifS = v_fc + v_flo;
	v_fifD = v_fc - v_flo;
	
	fifS_px = v_fifS.map(0,fmax,0,pxlim);
	fifD_px = v_fifD.map(0,fmax,0,pxlim);
	
	&#x2F;&#x2F; Calculate image frequency
	showImage = fim_element.checked;
	
	if (v_fc &lt;= v_flo) {
		side = &#x27;high-side&#x27;;
	} else if (v_fc &gt; v_flo) {
		side = &#x27;low-side&#x27;;
	}
	
	v_fimD = 2*v_flo - v_fc; &#x2F;&#x2F; normally would have an absolute around these but dont to show spectral inversion
	v_fimS = 2*v_flo + v_fc;
	
	fimS_px = v_fimS.map(0,fmax,0,pxlim);
	fimD_px = v_fimD.map(0,fmax,0,pxlim);
	
	drawAll();
}


async function animateLO() {
	for (let k = flo_element.value*1000; k &lt;= 1000; k++) {
		if (!lo_anim.checked) break;
		flo_element.value = k&#x2F;1000;
		updateValues();
		await sleep(12);
	}
}

const sleep = (milliseconds) =&gt; {
	return new Promise(resolve =&gt; setTimeout(resolve, milliseconds));
};

&#x2F;&#x2F; map number in range, to another range
Number.prototype.map = function (in_min, in_max, out_min, out_max) {
  return (this - in_min) * (out_max - out_min) &#x2F; (in_max - in_min) + out_min;
}

&#x2F;&#x2F; Event listener for fc slider
fc.addEventListener(&#x27;input&#x27;, () =&gt; { updateValues(); });

&#x2F;&#x2F; Event listener for bw slider
bw.addEventListener(&#x27;input&#x27;, () =&gt; { updateValues(); });

&#x2F;&#x2F; Event listener for flo slider
flo.addEventListener(&#x27;input&#x27;, () =&gt; { lo_anim.checked = false; updateValues(); });

&#x2F;&#x2F; Event listener for fim checkbox
fim.addEventListener(&#x27;input&#x27;, () =&gt; { updateValues(); });

&#x2F;&#x2F; Event listener for frequency limits input
fneg.addEventListener(&#x27;input&#x27;, () =&gt; { showNeg = fneg_element.checked; drawAxis(); updateValues(); });

&#x2F;&#x2F; Event listener for frequency limits input
flimits.addEventListener(&#x27;input&#x27;, () =&gt; { updateValues(); });

&#x2F;&#x2F; Event listener for fc slider
lo_anim.addEventListener(&#x27;input&#x27;, () =&gt; { animateLO(); });

&#x2F;&#x2F; Initial function runs
resizeCanvas();
updateValues();

&lt;&#x2F;script&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>PCB Design: Practices and Principles</title>
        <published>2025-10-11T00:00:00+00:00</published>
        <updated>2025-10-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/notes/pcb-practices/"/>
        <id>https://mikebell.cc/notes/pcb-practices/</id>
        
        <content type="html" xml:base="https://mikebell.cc/notes/pcb-practices/">&lt;h1 id=&quot;pcb-design-practices-and-principles&quot;&gt;PCB Design: Practices and Principles&lt;&#x2F;h1&gt;
&lt;p&gt;When designing my PCBs, I take into consideration a number of things. Here are some of the considerations I make.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;manufacturer-tolerances&quot;&gt;Manufacturer tolerances&lt;&#x2F;h2&gt;
&lt;p&gt;When designing your PCB, make sure to design it within manufacturer tolerances. If you are unsure of what manufacturer you plan on using, it is wise to find a couple and use the loosest tolerance so that you have the option later on to choose a specific manufacturer. Most manufacturers have the same tolerances, however, it pays to always double check.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;snap-grid-and-spacing&quot;&gt;Snap grid and spacing&lt;&#x2F;h2&gt;
&lt;p&gt;When designing a PCB layout, understanding where and at what distance components should be arranged is important. Utilizing the snap grid and keeping component separation consisten makes for a clean looking PCB. Additionally, spacing components such that a soldering iron can be used or using hand-soilder friendly footprints can be beneficial for prototype PCBs or boards that you may expect to be modifying in the future.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;clearly-label-with-silkscreen&quot;&gt;Clearly label with silkscreen&lt;&#x2F;h2&gt;
&lt;p&gt;When spacing out components on the PCB, adjust the placement to prevent overlap in silkscreen. Make sure all reference designators are visible and unambiguous in their placement.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;trace-width-for-dc-applications-low-frequency-and-power-distribution&quot;&gt;Trace Width (for DC applications, low frequency, and power distribution)&lt;&#x2F;h2&gt;
&lt;p&gt;The width of your traces will play a large part in how much current can flow through them. Select trace width based on application and current&#x2F;resistance requirements. Below is a table of IPC recommended track widths for a 1 oz copper PCB. The values are calculated based on the current required to raise the temperature of the trace by 10 degrees celsius.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;pcb_best_practice&#x2F;ipc_trace_current.png&quot; width=100% alt=&quot;IPC Trace width current ratings&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;trace-spacing&quot;&gt;Trace Spacing&lt;&#x2F;h2&gt;
&lt;p&gt;The spacing of your traces depends on the purpose of the traces. In applications where signals are being sent, it is best to follow the 3W rule, where you space two parallel traces 3 time the trace width apart. This will reduce interference (crosstalk) between the two traces.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;trace-bends&quot;&gt;Trace Bends&lt;&#x2F;h2&gt;
&lt;p&gt;When you need to make a bend in a trace, it is important to keep in mind the type of signal the trace is carrying. For low frequency signals and applications where trace length or resistance is not a concern, a 90 degree (a) turn is acceptable, and can sometimes give the PCB a unique look. Typically, a 45 degree miter (b) would be employed for general use in digital and analog signaling as it reduces overall trace resistance (shorter length) and has better high-speed signaling characteristics. For high-voltage power or radio-frequency signals, a round bend (c) would be used as it has the best high-speed characteristics, maintains a consistent characteristic impedance, and, for high-voltage, does not have any sharp corners for charges to build up on.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;pcb_best_practice&#x2F;pcb_trace_bend.png&quot; width=100% alt=&quot;PCB Trace bending figure&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;trace-junctions&quot;&gt;Trace Junctions&lt;&#x2F;h2&gt;
&lt;p&gt;Avoid junctions of more than 3 traces. When making a 3-way junction, avoid acute angles. Acute angles create signal reflections at higher frequencies, and generate etchant “acid” traps during manufacturing. When choosing a junction, the 90 degree (a) is perfectly acceptable for general use, but as the signal speed gets faster, the mitred (b) or ‘Y’ junction (c) may improve high-speed signal characteristics and signal integrity.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;pcb_best_practice&#x2F;pcb_trace_tee.png&quot; width=100% alt=&quot;PCB Trace junctions figure&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;place-decoupling-capacitors-close-to-ics&quot;&gt;Place Decoupling Capacitors Close to ICs&lt;&#x2F;h2&gt;
&lt;p&gt;When you design a PCB layout for a schematic containing decoupling capacitors for ICs, always place the decoupling capacitor as close to the IC power input pin as possible, and connect it directly to a ground plane using a short trace or via.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;pcb_best_practice&#x2F;decoupling.png&quot; width=100% alt=&quot;Decoupling capacitor placement figure&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;power-and-ground-planes&quot;&gt;Power and Ground Planes&lt;&#x2F;h2&gt;
&lt;p&gt;If you are designing a PCB with 4 or more layers, the two inner layers should be a copper layer for power and ground. This will reduce the number of traces needed to distribute power, reduce EMI, and create a shorter path to both power and ground through vias.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;power-and-signal-distribution&quot;&gt;Power and Signal Distribution&lt;&#x2F;h2&gt;
&lt;p&gt;There are three methods for power distribution: single point source, star source, and multipoint source. Each has their strengths and weaknesses. Below is a table to summarize:&lt;&#x2F;p&gt;
&lt;p&gt;Information &amp;amp; figures to be added.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;differential-pairs&quot;&gt;Differential Pairs&lt;&#x2F;h2&gt;
&lt;p&gt;When designing a PCB layout containing differential pairs, keep the trace lengths the exact same. Most EDA CAD softwares automatically maintain the differential pair length, but in some cases you may need to enable that function.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;smd-thermal-paths-and-reflow-considerations&quot;&gt;SMD Thermal paths and Reflow Considerations&lt;&#x2F;h2&gt;
&lt;p&gt;When soldering surface mount components using solder paste and a hot air station (or reflow oven), the surface tension of molten solder will automatically align surface-mount devices (SMDs) on their pads. This however can cause issues where the thermal relief on pads may create colder areas on the pad where solder may solidify faster. In the case of pads with traces connecting from top and bottom (a), the component may&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;pcb_best_practice&#x2F;pcb_pad_thermal_pull_a.png&quot; width=100% alt=&quot;Thermal tension figure a&quot;&#x2F;&gt;&lt;br&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;pcb_best_practice&#x2F;pcb_pad_thermal_pull_b.png&quot; width=100% alt=&quot;Thermal tension figure b&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;serial-rx-tx-poka-yoke-uart-spi-rs232&quot;&gt;Serial RX&#x2F;TX Poka-yoke (UART, SPI, RS232)&lt;&#x2F;h2&gt;
&lt;p&gt;When working with serial connections that require a crossover, such as two serial devices where the Rx of one is connected to the Tx of the other (and vice versa) a poka-yoke method can be used. The method shared here is one that I personally prefer.&lt;&#x2F;p&gt;





    &lt;div class=&quot;admonition&quot; data-type=&quot;note&quot;&gt;
        &lt;div class=&quot;admonition-title&quot;&gt;
            &lt;p&gt;Poka-yoke Origin&lt;&#x2F;p&gt;

        &lt;&#x2F;div&gt;
        &lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Poka-yoke&quot;&gt;Poka-yoke&lt;&#x2F;a&gt; (ポカヨケ; [poka joke]) is any mechanism in a process that helps an equipment operator to avoid mistakes and defects by preventing, correcting, or drawing attention to human errors as they occur. Poka-yoke was originally baka-yoke, but as this means &quot;fool-proofing&quot; (or &quot;idiot-proofing&quot;) the name was changed to the milder poka-yoke.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;

    &lt;&#x2F;div&gt;

&lt;p&gt;In the event an error is made in the design, this method of footprint layout can ensure no matter the Tx&#x2F;Rx arrangement between devices, one can still recover from the error by changing the way the jumpers are soldered to the board.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;pcb_best_practice&#x2F;uart_pokayoke.png&quot; width=100% alt=&quot;UART Poka-yoke figure&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;&lt;&#x2F;br&gt;&lt;&#x2F;br&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Application Note Index</title>
        <published>2025-10-09T00:00:00+00:00</published>
        <updated>2026-01-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/notes/appnotes/"/>
        <id>https://mikebell.cc/notes/appnotes/</id>
        
        <content type="html" xml:base="https://mikebell.cc/notes/appnotes/">&lt;style&gt;
a {
color: var(--primary-color)
}
&lt;&#x2F;style&gt;
&lt;h1 id=&quot;application-note-index&quot;&gt;Application Note Index&lt;&#x2F;h1&gt;
&lt;p&gt;This page is a collection of application notes I like to refer back to.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&amp;gt;113 appnotes to be added.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Truck Air Horn Installation</title>
        <published>2025-09-17T00:00:00+00:00</published>
        <updated>2025-09-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/truck-horn/"/>
        <id>https://mikebell.cc/posts/truck-horn/</id>
        
        <summary type="html">&lt;p&gt;Being that I drive a 1&#x2F;4 tonne pickup (ford ranger), the horn is rather weak and &quot;car&quot; sounding. To fix that, I gave my pickup a voice -- that voice being an air horn from Amazon. This is how the installation went.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Cascode Frontend Amplifier (redesign)</title>
        <published>2025-08-27T00:00:00+00:00</published>
        <updated>2025-08-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/cascode-frontend-1/"/>
        <id>https://mikebell.cc/posts/cascode-frontend-1/</id>
        
        <summary type="html">&lt;p&gt;The previous cascode design was insufficient, so I redesigned it with much better results.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Cascode Frontend Amplifier</title>
        <published>2025-08-09T00:00:00+00:00</published>
        <updated>2025-08-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/cascode-frontend/"/>
        <id>https://mikebell.cc/posts/cascode-frontend/</id>
        
        <summary type="html">&lt;p&gt;When testing the 20m superheterodyne reciever, there was a lot of noise generated by the previous frontend amplifier design, so I have decided to re-design the frontend amplifier. In this approach, I utilize the cascode configuration.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>W7ZOI Termination Insensitive Amplifier</title>
        <published>2025-08-06T00:00:00+00:00</published>
        <updated>2025-08-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/w7zoi-amp/"/>
        <id>https://mikebell.cc/posts/w7zoi-amp/</id>
        
        <summary type="html">&lt;p&gt;To amplify the IF portion of the 20m superheterodyne recievers signal chain, I though I would give the W7ZOI and K3NHI&#x27;s termination insensitive amplifier design a try.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Crystal Filter (Approach 4)</title>
        <published>2025-07-13T00:00:00+00:00</published>
        <updated>2025-07-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/crystal-filter-3/"/>
        <id>https://mikebell.cc/posts/crystal-filter-3/</id>
        
        <summary type="html">&lt;p&gt;Still unsatisfied with my crystal filter, I decided to order some 8 MHz crystals. This decision ended up producing the best crystal filter for the reciever.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Diode Ring Mixers (Revisited)</title>
        <published>2025-07-05T00:00:00+00:00</published>
        <updated>2025-07-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/diode-mixer-2/"/>
        <id>https://mikebell.cc/posts/diode-mixer-2/</id>
        
        <summary type="html">&lt;p&gt;For the 20m superheterodyne reciever, I need two mixers for the RF-IF stage and IF-Audio stage. My initial diode ring mixer design functioned as intended, but this time I chose to make it more compact and to use different diodes. ~ I also built two this time.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Crystal Filter (Approach 3)</title>
        <published>2025-06-28T00:00:00+00:00</published>
        <updated>2025-06-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/crystal-filter-2/"/>
        <id>https://mikebell.cc/posts/crystal-filter-2/</id>
        
        <summary type="html">&lt;p&gt;With the new crystals characterized, I take on a new approach to designing a crystal filter.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>G3UUR &amp; NanoVNA Crystal Characterization</title>
        <published>2025-06-25T00:00:00+00:00</published>
        <updated>2025-06-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/crystal-characterization/"/>
        <id>https://mikebell.cc/posts/crystal-characterization/</id>
        
        <summary type="html">&lt;p&gt;To effectively build a Crystal filter, I characterized the new 4 MHz crystals I ordered. Using two methods, the NanoVNA-H with DiSlord firmware, and the G3UUR method.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Crystal Filter (Approach 2)</title>
        <published>2025-06-12T00:00:00+00:00</published>
        <updated>2025-06-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/crystal-filter-1/"/>
        <id>https://mikebell.cc/posts/crystal-filter-1/</id>
        
        <summary type="html">&lt;p&gt;After a dissapointing first attempt, I redesigned the crystal filter again. This time using a slightly different approach.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Crystal Filter (Approach 1)</title>
        <published>2025-06-06T00:00:00+00:00</published>
        <updated>2025-06-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/crystal-filter/"/>
        <id>https://mikebell.cc/posts/crystal-filter/</id>
        
        <summary type="html">&lt;p&gt;The next step in building my 20m superheterodyne reciever is the crystal filter. This filter will determine the selectivity of my radio&#x27;s tuning and dynamic range. The goal is to make a crystal filter with a bandwidth of 3 kHz for SSB operation.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>14 MHz Direct Conversion Radio Reciever</title>
        <published>2025-05-30T00:00:00+00:00</published>
        <updated>2025-05-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/25-direct-conversion-reciever/"/>
        <id>https://mikebell.cc/projects/25-direct-conversion-reciever/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/25-direct-conversion-reciever/">&lt;p&gt;Recently, I have been designing a superheterodyne receiver for the 20m amateur radio band. As an interim milestone, I integrated the currently completed stages to temporarily operate the system as a direct conversion receiver.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250530_193117.webp&quot; width=90% alt=&quot;Component Layout&quot;&#x2F;&gt;
  &lt;figcaption&gt;Direct Conversion Reciever with 3 Major Components&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;radio-components&quot;&gt;Radio Components&lt;&#x2F;h1&gt;
&lt;p&gt;A DCR simplifies reception by mixing the incoming RF signal with a local oscillator (LO) tuned to the exact same target frequency. This &#x27;zero-IF&#x27; approach downconverts the radio signals directly into baseband audio, completely bypassing the need for intermediate frequency stages and allowing me to instantly evaluate my front-end gain and LO stability.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h2&gt;
&lt;p&gt;The basic DCR block diagram shows how a small number of building blocks can be used to create a radio reciever. I set out to build each of these building blocks from elementary electronics parts.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;dcr_block_diagram.png&quot; style=&quot;filter: brightness(175%);&quot; width=80% alt=&quot;Block Diagram&quot;&#x2F;&gt;
  &lt;figcaption&gt;DCR block diagram&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;I built this radio by designing and making three of its core components from scratch. Because each component came with its own set of hurdles, I’ve written blog posts covering the design process and challenges for each one.&lt;&#x2F;p&gt;
&lt;p&gt;The components I built for this project were:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;&#x2F;posts&#x2F;2025-05-25-bandpass-filter&#x2F;&quot;&gt;Band Select (Bandpass) Filter&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;&#x2F;posts&#x2F;2025-05-16-rf-amplifier&quot;&gt;Reciever Frontend Amplifier&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;&#x2F;posts&#x2F;2025-05-23-diode-mixer&#x2F;&quot;&gt;Double Balanced Diode Ring Mixer&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;band-select-filter&quot;&gt;Band Select Filter&lt;&#x2F;h2&gt;
&lt;p&gt;The band select filter is a bandpass filter designed to isolate the desired frequency band that you wish to recieve to. In the case of this reciever, the bandpass filter was designed for the 20m amateur radio band which exists between 14.00 MHz and 14.35 MHz.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250530_001608.webp&quot; width=90% alt=&quot;Bandpass filter PCB&quot;&#x2F;&gt;
  &lt;figcaption&gt;Bandpass filter PCB&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Measuring the filters S11 and S21 response with the NanoVNA, an insertion loss of 1.19 dB over a bandwidth slightly wider than the 20m band was measured.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250530_001619.webp&quot; width=90% alt=&quot;Bandpass filter S11 and S21 measurement&quot;&#x2F;&gt;
  &lt;figcaption&gt;Bandpass filter S11 and S21 measurement&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;frontend-amplifier&quot;&gt;Frontend Amplifier&lt;&#x2F;h2&gt;
&lt;p&gt;The frontend amplifier is designed to amplify the incoming signals and condition them for the diode ring mixer. The amplifier was designed to be in a cascode configuration to achieve high gain, lower noise figure, and moderate to low input impedance.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250516_213316.webp&quot; width=90% alt=&quot;Amplifier PCB&quot;&#x2F;&gt;
  &lt;figcaption&gt;Frontend amplifier PCB&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Connecting the amplifier to the function generator and oscilloscope, a gain of 22.8 dB was measured.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250516_221733.webp&quot; width=90% alt=&quot;Amplifier gain measurement&quot;&#x2F;&gt;
  &lt;figcaption&gt;Amplifier gain measurement&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;diode-ring-mixer&quot;&gt;Diode Ring Mixer&lt;&#x2F;h2&gt;
&lt;p&gt;The defining component of any radio receiver is the mixer, which multiplies incoming signals to produce both the sum and difference of two input frequencies. The diode ring mixer achieves this by using a LO to drive diodes on and off, effectively chopping the incoming signal. I constructed this specific component using off-the-shelf diodes.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250523_184409.webp&quot; width=90% alt=&quot;Mixer PCB&quot;&#x2F;&gt;
  &lt;figcaption&gt;Frontend amplifier PCB&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Using a 14 MHz input signal and a 5 MHz LO signal, I measured the output of the mixer using my TinySA spectrum analyzer.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250524_001405.webp&quot; width=90% alt=&quot;Mixer spectrum analyzer measurement&quot;&#x2F;&gt;
  &lt;figcaption&gt;Mixer spectrum analyzer measurement&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;fully-assembled-radio&quot;&gt;Fully Assembled Radio&lt;&#x2F;h1&gt;
&lt;p&gt;The radio was assembled and tested using my 20m band dipole antenna outside. The reciever was capable of picking up amateur radio operators transmitting single sideband (SSB) voice transmissions and morse code. I used my function generator as the LO, and used an op-amp audio amplifier circuit I put together on a breadboard.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;dcr_board.webp&quot; width=90% alt=&quot;Assembled direct conversion reciever&quot;&#x2F;&gt;
  &lt;figcaption&gt;Assembled direct conversion reciever&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;results-videos&quot;&gt;Results &amp;amp; Videos&lt;&#x2F;h2&gt;
&lt;p&gt;The reciever had some noise or oscillations occurring internally which I believe is from a poor termination on the diode ring mixer. Diode ring mixers are notoriously picky about terminations.&lt;&#x2F;p&gt;
&lt;p&gt;The first signals I was able to listen to were some amateur radio operators out of North Carolina and Ohio.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;video width=&quot;90%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;20250530_203709.mp4&quot; type=&quot;video&#x2F;mp4&quot; width=&quot;90%&quot; alt=&quot;Recieving SSB transmission from Ohio&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;&lt;br&gt;
	&lt;video width=&quot;90%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;20250530_205636.mp4&quot; type=&quot;video&#x2F;mp4&quot; width=&quot;90%&quot; alt=&quot;Explaination of DCR setup&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;I also recieved the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.nist.gov&#x2F;pml&#x2F;time-and-frequency-division&#x2F;time-distribution&#x2F;radio-station-wwv&quot;&gt;15MHz NIST Clock signal (Station WWV)&lt;&#x2F;a&gt; transmitted near Fort Collins, Colorado.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;video width=&quot;90%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;20250531_203301.mp4&quot; type=&quot;video&#x2F;mp4&quot; width=&quot;90%&quot; alt=&quot;Recieving the 15 MHz NIST atomic clock transmission&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Reciever Bandpass Filter</title>
        <published>2025-05-25T00:00:00+00:00</published>
        <updated>2025-05-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/bandpass-filter/"/>
        <id>https://mikebell.cc/posts/bandpass-filter/</id>
        
        <summary type="html">&lt;p&gt;To prevent any strong out of band signals from overloading the frontend of my reciever, I designed a bandpass filter to place before the rf amplifier.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Diode Ring Mixer</title>
        <published>2025-05-23T00:00:00+00:00</published>
        <updated>2025-05-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/diode-mixer/"/>
        <id>https://mikebell.cc/posts/diode-mixer/</id>
        
        <summary type="html">&lt;p&gt;The next key component of my 20m Superheterodyne Reciever project was the mixer. In a previous post I did some experimentation with a Gilbert cell mixer, which yielded promising results, but there is a simpler approach that requires less components. This brings us to the double balanced diode ring mixer (or double balance mixer, DBM for short).&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Reciever Front-End Amplifier (Approach 3)</title>
        <published>2025-05-16T00:00:00+00:00</published>
        <updated>2025-05-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/rf-amplifier-3/"/>
        <id>https://mikebell.cc/posts/rf-amplifier-3/</id>
        
        <summary type="html">&lt;p&gt;After the two previous designs, I decided to purchase some transistors rated for a higher frequency. This is a more pay-to-win approach to my previous issues, but works nonetheless. An additional bonus is the noise figure of the new transistors being significantly lower.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Passive Volume Knob</title>
        <published>2025-05-10T00:00:00+00:00</published>
        <updated>2025-05-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/volume-knob/"/>
        <id>https://mikebell.cc/posts/volume-knob/</id>
        
        <summary type="html">&lt;p&gt;At my PC I usually use headphones and an FX-Audio DAC to listen to audio, but occasionally I will hook up my JBL partybox to play music with a speaker. The issue I was having was that the line level output from the DAC was at a fixed volume. So as a small, simple, 1 hour project, I made a stereo volume knob for the line level output.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Simple Resistive Pi-Network Attenuators</title>
        <published>2025-04-26T00:00:00+00:00</published>
        <updated>2025-04-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/attenuators/"/>
        <id>https://mikebell.cc/posts/attenuators/</id>
        
        <summary type="html">&lt;p&gt;Learning about the NanoVNA, I found that testing amplifiers without any attenuators resulted in terrible resutls. Because I want to test my amplifier designs using the NanoVNA, I made some simple 50 ohm attenuators.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Reciever Front-End Amplifier (Approach 2)</title>
        <published>2025-04-26T00:00:00+00:00</published>
        <updated>2025-04-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/rf-amplifier-2/"/>
        <id>https://mikebell.cc/posts/rf-amplifier-2/</id>
        
        <summary type="html">&lt;p&gt;Having acquired more knowledge on amplifier configurations and properties, I redesigned the front-end amplifier. This time using a common base as the first stage, then common emitter as a second stage, with a common collector at the output to match the impedance to 50 ohms for the VNA measurements.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>16-QAM Digital Communication Link</title>
        <published>2025-04-09T00:00:00+00:00</published>
        <updated>2025-04-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/25-engr-498q-project/"/>
        <id>https://mikebell.cc/projects/25-engr-498q-project/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/25-engr-498q-project/">&lt;p&gt;The final project for the ENGR 498Q Digital Communications course built directly upon our semester labs, where we had progressively constructed a 4-Pulse Amplitude Modulation (4-PAM) system.&lt;&#x2F;p&gt;
&lt;p&gt;For the final project, we were challenged to scale this design into a 16-Symbol Quadrature Amplitude Modulation (16-QAM) system. By modifying and duplicating the core 4-PAM architecture to handle orthogonal In-phase (I) and Quadrature (Q) channels, we successfully implemented the full 16-QAM system.&lt;&#x2F;p&gt;
&lt;p&gt;All labs and simulations were conducted using the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.gnuradio.org&#x2F;&quot;&gt;GNU Radio&lt;&#x2F;a&gt; software and &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.ni.com&#x2F;en-ca&#x2F;shop&#x2F;model&#x2F;usrp-2901.html&quot;&gt;NI USRP-2901&lt;&#x2F;a&gt; software defined radios (SDR).&lt;&#x2F;p&gt;
&lt;h1 id=&quot;16qam-communication-system-in-gnu-radio&quot;&gt;16QAM Communication System in GNU Radio&lt;&#x2F;h1&gt;
&lt;p&gt;The goal of 16-QAM system is to maximize data throughput over a limited bandwidth. It achieves this by varying both the amplitude and phase of a carrier signal simultaneously, allowing a single transmitted symbol to represent 4 bits of binary data.&lt;&#x2F;p&gt;
&lt;p&gt;The primary trade-off for this spectral efficiency is noise sensitivity. Because data relies on precise amplitude levels, any signal distortion or noise can push a point into an adjacent grid slot, causing bit errors. Implementing 16-QAM requires highly linear power amplifiers and precise carrier synchronization at the receiver to prevent clipping and phase drift.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h2&gt;
&lt;p&gt;The 16-QAM system uses an &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.ni.com&#x2F;en-ca&#x2F;shop&#x2F;model&#x2F;usrp-2901.html&quot;&gt;NI USRP-2901&lt;&#x2F;a&gt; SDR to both transmit and recieve our signals using a coaxial cable as our channel. Simulations were also conducted using a virtual channel as well.&lt;&#x2F;p&gt;
&lt;p&gt;Instead of transmit any meaningful data over the channel, a stream of random bits were generated. Various parts of the system were monitored in a GUI to better visualize what each portion is doing.&lt;&#x2F;p&gt;
&lt;p&gt;All processes in this project are occurring in the baseband and imposed on to a 930 MHz carrier at transmission. Below is a figure of the variables and virtual channel configuration.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;configuration_virtual_channel.png&quot; width=90% alt=&quot;Variables and Virtual Channel blocks&quot;&#x2F;&gt;
  &lt;figcaption&gt;Variables and Virtual Channel Blocks&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;data-transmition&quot;&gt;Data Transmition&lt;&#x2F;h2&gt;
&lt;p&gt;The transmission portion of the system operates by taking in the raw data as 4-bit symbols. These symbols are assigned quadrature values according to the mapping below.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;constellation&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;j&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;symbol_map&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 12&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 13&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 9&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 7&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 15&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 11&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 6&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 14&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After symbol mapping, the signal is routed through a pulse-shaping filter prior to transmission. This process limits harmonic radiation and optimizes the trade-off between bandwidth usage and signal-to-noise ratio (SNR).&lt;&#x2F;p&gt;
&lt;p&gt;The sybols are sent in packets of 128 symbols, with a 32-symbol pilot signal being sent at the beginning of each packet. This pilot signal allows the reciever to syncronize the incoming data to be decoded. This occurs within the virtual source, which generates the random symbols and appends the pilot sequence to the start of it.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;transmit_blocks.png&quot; width=90% alt=&quot;Transmition system block diagram&quot;&#x2F;&gt;
  &lt;figcaption&gt;Transmition System Block Diagram&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;recieve-syncronization&quot;&gt;Recieve Syncronization&lt;&#x2F;h2&gt;
&lt;p&gt;On the receiving side of the system, the incoming QAM signal is delayed, out of phase, and unsynchronized with the radio&#x27;s physical local oscillator. To correct this, the signal must pass through a synchronization pipeline.&lt;&#x2F;p&gt;
&lt;p&gt;First, a phase synchronization and equalization block is used to align the real and imaginary (in-phase and quadrature) components. This block functions by correlating the received data with the known 32-symbol pilot signal.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;recieve_sync_blocks.png&quot; width=90% alt=&quot;Receive system syncronization block diagram&quot;&#x2F;&gt;
  &lt;figcaption&gt;Receive system syncronization block diagram&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;When using Gaussian pulse shaping, the synchronization script encountered difficulties locking onto the signal. The figure below illustrates the typical appearance of this unsynchronized signal.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;gauss_not_phase_match.png&quot; width=90% alt=&quot;Gaussian pulse signal not phase matching&quot;&#x2F;&gt;
  &lt;figcaption&gt;Unsyncronized Gaussian Pulse Signal&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;After reverting to a rectangular pulse shape, proper synchronization was successfully achieved. The figure below displays the synchronized signal, which was captured over a channel with some noise.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;simulated_channel.png&quot; width=90% alt=&quot;Syncronized signal&quot;&#x2F;&gt;
  &lt;figcaption&gt;Syncronized Signal&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Increasing the channel&#x27;s noise causes the eye diagram to close, but the synchronization remains stable.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;higher_noise1.png&quot; width=90% alt=&quot;Syncronized signal from noisy channel&quot;&#x2F;&gt;
  &lt;figcaption&gt;Syncronized Signal from Noisy Channel&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;reception-frame-syncronization-and-decoding&quot;&gt;Reception, Frame Syncronization and Decoding&lt;&#x2F;h2&gt;
&lt;p&gt;Once the incoming QAM signal is synchronized to the receiver&#x27;s local oscillator, it must be downsampled to isolate the actual data symbols. Up to this point, the signal is heavily oversampled to accommodate pulse shaping. To strip away these transition samples, the signal is routed through a &lt;code&gt;Keep 1 in N&lt;&#x2F;code&gt; block. By selecting only the peak sample of each symbol period and discarding the rest, this block decimates the stream down to exactly one sample per symbol.&lt;&#x2F;p&gt;
&lt;p&gt;This downsampled symbol stream is then fed into a custom &lt;code&gt;Frame_Sync&lt;&#x2F;code&gt; Python block alongside the output of a dedicated pilot correlator filter. The pilot correlator utilizes an FIR filter to cross-correlate the incoming data with the known 32-symbol pilot sequence. When the pilot passes through, it generates a distinct spike which the &lt;code&gt;Frame_Sync&lt;&#x2F;code&gt; block uses as a precise timing reference. By calculating this exact delay, the block shifts the one-sample-per-symbol stream into perfect alignment, allowing the synchronized data to be cleanly passed to the virtual sink for final 16-QAM decoding and Symbol Error Rate (SER) calculation.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;recieve_blocks.png&quot; width=90% alt=&quot;Receive system block diagram&quot;&#x2F;&gt;
  &lt;figcaption&gt;Receive System Block Diagram&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The figure below displays the receiver performance using a rectangular pulse shape in a noisy channel. Here, we can clearly observe the received correlation spike, the matched filter output, and the successfully recovered symbols.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;higher_noise2.png&quot; width=90% alt=&quot;Frame-syncronized and decoded symbols&quot;&#x2F;&gt;
  &lt;figcaption&gt;Frame-Syncronized and Decoded Symbols&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;decoding-and-error&quot;&gt;Decoding and Error&lt;&#x2F;h2&gt;
&lt;p&gt;To quantify the systems performance under various noise conditions, the synchronized received symbols (decode) and the original transmitted symbols (tx_symbols) are both decoded into data characters and subtracted from one another. Any non-zero difference indicates a bit mismatch and triggers an error flag. A moving average block then tracks these flags over a 100k-sample window, calculating a real-time Symbol Error Rate (SER) for the system.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;decoding_and_error.png&quot; width=90% alt=&quot;Decoding and error calculation blocks&quot;&#x2F;&gt;
  &lt;figcaption&gt;Decoding and error calculation Blocks&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Statistical and power analysis of the decoded data is handled by isolating the signal&#x27;s quadrature component via a &lt;code&gt;Complex to Imag&lt;&#x2F;code&gt; block. The raw imaginary values are fed directly into a histogram sink to visually analyze noise distribution and cluster density across the constellation rows. Simultaneously, the signal is squared to compute its instantaneous power, which is smoothed through a moving average filter to track the stable average Received Energy.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;decoding_histogram.png&quot; width=90% alt=&quot;Hystogram generation blocks&quot;&#x2F;&gt;
  &lt;figcaption&gt;Hystogram Generation Blocks&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Under very low noise conditions, the system achieves a perfect SER of 0, as shown below.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;very_low_noise3.png&quot; width=90% alt=&quot;SER, hystogram, and average power of received signal&quot;&#x2F;&gt;
  &lt;figcaption&gt;SER, Hystogram, and Average Power of Received Signal&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Increasing the channel&#x27;s noise causes the SER to rise to 0.00634, the histogram to widen, and the average power to increase.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;higher_noise3.png&quot; width=90% alt=&quot;SER, hystogram, and average power of received signal under noisy conditions&quot;&#x2F;&gt;
  &lt;figcaption&gt;SER, Hystogram, and Average Power of Received Signal under Noisy Conditions&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;results&quot;&gt;Results&lt;&#x2F;h1&gt;
&lt;p&gt;Overall, the project successfully achieved its core objectives despite a few critical implementation hurdles. The primary challenge was that our Python phase synchronization block could not accommodate a Gaussian pulse-shaped signal, which restricted our ability to optimize bandwidth usage and harmonics. However, by troubleshooting with a rectangular pulse shape, we proved the robustness of the rest of the receiver pipeline, achieving perfect frame synchronization and accurate symbol decoding under varying noise conditions.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;video-of-system&quot;&gt;Video of System&lt;&#x2F;h2&gt;
&lt;p&gt;Below is a demonstration video of the 16-QAM system operating over a virtual channel, where noise is added and removed.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;video width=&quot;90%&quot; autoplay loop controls&gt;
    &lt;source src=&quot;media&#x2F;16-qam_system_demo.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Demonstration of the 16-QAM system&quot;&#x2F;&gt;
  &lt;&#x2F;video&gt;
  &lt;figcaption&gt;Demonstration of the 16-QAM System&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Reciever Front-End Amplifier (Approach 1)</title>
        <published>2025-04-06T00:00:00+00:00</published>
        <updated>2025-04-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/rf-amplifier/"/>
        <id>https://mikebell.cc/posts/rf-amplifier/</id>
        
        <summary type="html">&lt;p&gt;With the ongoing superheterodyne reciever project, I designed and simulated a recieve amplifier to amplify the signals coming from the antenna. I have chosen to use a bipolar junction transistor in the common emitter configuration as my amplifier.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>PPG Heart Rate Detector</title>
        <published>2025-03-24T00:00:00+00:00</published>
        <updated>2025-03-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/25-engr-352-ppg/"/>
        <id>https://mikebell.cc/projects/25-engr-352-ppg/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/25-engr-352-ppg/">&lt;p&gt;As part of the ENGR 352 Microelectronics II laboratory curriculum, we designed, prototyped, and evaluated a Photoplethysmography (PPG) circuit—a medical electronics device used to detect blood volume changes in tissue using optical sensors. While the baseline requirements were prototyped on a breadboard, the project offered a bonus opportunity to design and manufacture a custom Printed Circuit Board (PCB) for the completed system.&lt;&#x2F;p&gt;
&lt;p&gt;The development of the PPG circuit was systematically divided into four progressive stages:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sensor Stage:&lt;&#x2F;strong&gt; Integrating the optical sensor (the IR&#x2F;Red LED and the receiving photodiode) to capture the raw biometric data.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Transimpedance Amplifier:&lt;&#x2F;strong&gt; Converting the low-level current signal generated by the photodiode into a workable voltage signal.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Secondary Amplification:&lt;&#x2F;strong&gt; Further boosting the signal amplitude and conditioning it to improve the signal-to-noise ratio (SNR).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Signal Processing &amp;amp; Output:&lt;&#x2F;strong&gt; Implementing a differentiator circuit, a pulse generator, and an LED driver to cleanly turn the analog waves into distinct, visible pulses representing the heartbeat.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Initially, the entire four-stage architecture was successfully validated on a breadboard. Following this, the circuit was translated into a custom PCB design to secure the project&#x27;s bonus credit.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;ppg-design-and-prototype&quot;&gt;PPG Design and Prototype&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;building-the-sensor&quot;&gt;Building the Sensor&lt;&#x2F;h2&gt;
&lt;p&gt;The sensor consisted of an infrared (IR) emitter, and an IR sensor. Using a piece of stripboard, we soldered the IR emitter and sensor to one end and wires to the other. This allowed us to&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250127_172642.jpg&quot; width=90% alt=&quot;Sensor assembly&quot;&#x2F;&gt;
  &lt;figcaption&gt;Sensor assembly&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;transimpedance-amplifier&quot;&gt;Transimpedance Amplifier&lt;&#x2F;h2&gt;
&lt;p&gt;The transimpedance amplifier was simulated and built on a breadboard. The amplifier itself is built around the MCP601 Op-amp. An adjustable gain was implemented by utilizing a 5 Megaohm potentiometer as the feedback resistor. During the construction of the breadboard circuit, we adjusted the gain to achieve a decent level of amplification without saturating the output. In addition to the gain, a capacitor was added to the feedback loop to add some lowpass filtering around 12 Hz.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;lab2_schem.png&quot; width=90% alt=&quot;Transimpedance amplifier schematic&quot;&#x2F;&gt;
  &lt;figcaption&gt;Transimpedance amplifier circuit&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250210_164714.webp&quot; width=90% alt=&quot;Transimpedance amplifier breadboard layout&quot;&#x2F;&gt;
  &lt;figcaption&gt;Transimpedance amplifier breadboard layout&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;After the amplifier was built, we tested it for a signal. We were able to pick up our pulses.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250210_170910.webp&quot; width=90% alt=&quot;Testing the amplifier circuit&quot;&#x2F;&gt;
  &lt;figcaption&gt;Testing the amplifier circuit&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;second-amplifier-stage&quot;&gt;Second Amplifier Stage&lt;&#x2F;h2&gt;
&lt;p&gt;The second amplifier was built using the same Op-amp as the first, but this amplifier utilized a non-inverting configuration with a virtual ground. The virtual ground allows for single-rail operation of the amplifier. The amplifier has a gain of approx. 21. The 4.7 uF DC blocking capacitor and 470 kohm resistor form a highpass filter centered around 0.072 Hz, and the 1000 pF capacitor in the op-amps feedback loop (along with the 10 Mohm resistor) form a lowpass filter around 16 Hz.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;lab3_schem.png&quot; width=90% alt=&quot;Second amplifier stage schematic&quot;&#x2F;&gt;
  &lt;figcaption&gt;Second amplifier stage schematic&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250210_173606.webp&quot; width=90% alt=&quot;Second stage breadboard layout&quot;&#x2F;&gt;
  &lt;figcaption&gt;Second stage breadboard layout&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Once again, after the breadboard circuit was constructed, we tested its operation.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250210_175523.webp&quot; width=90% alt=&quot;Testing the second stage circuit&quot;&#x2F;&gt;
  &lt;figcaption&gt;Testing the second stage circuit&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;comparator-with-hysterisis&quot;&gt;Comparator with Hysterisis&lt;&#x2F;h2&gt;
&lt;p&gt;After the second amplifier, a comparator was added to convert the analog PPG signal into a discrete pulse that can be used for any number of applications. In the design of the comparator, positive feedback was added to create some hysterisis in the circut. This hysterisis prevents small variations near the threshold voltage from creating noisy pulses by seperating the high threshold and low threshold.&lt;&#x2F;p&gt;
&lt;p&gt;The comparator circuit was drawn, simulated, and built on the breadboard alongside all other components as shown below&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;lab4_schem.png&quot; width=90% alt=&quot;Comparator circuit schematic&quot;&#x2F;&gt;
  &lt;figcaption&gt;Comparator circuit schematic&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250224_170717.webp&quot; width=90% alt=&quot;Comparator breadboard layout&quot;&#x2F;&gt;
  &lt;figcaption&gt;Comparator breadboard layout&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The circuit was tested and operated as expected.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250224_171529.webp&quot; width=90% alt=&quot;Testing the comparator&quot;&#x2F;&gt;
  &lt;figcaption&gt;Testing the comparator&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;





    &lt;details class=&quot;admonition&quot; data-type=&quot;video&quot;  &gt;
        &lt;summary&gt;
            &lt;p&gt;Comparator test video&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;figure&gt;
  &lt;video width=&quot;60%&quot; autoplay loop controls&gt;
	&lt;source src=&quot;media&#x2F;20250224_170611.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Comparator test&quot;&#x2F;&gt;
  &lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
    &lt;&#x2F;details&gt;

&lt;h2 id=&quot;differentiator-and-pulse-generator&quot;&gt;Differentiator and Pulse Generator&lt;&#x2F;h2&gt;
&lt;p&gt;The final stage(s) of the PPG circuit were the differentiator, pulse generator, and LED driver. The differentiator consisted of a capacitor, diode, and two resistors. The capacitor is the main component that differentiates the sharp comparator edges into positive and negative pulses. The diode then only allows positive edge signals to go through. The shunt resistor on the anode of the diode is to provide a ground path for negative pulses. The positive edge then triggeres a monostable multivibrator. The monostable multivibrator produces a precisely timed pulse given and input trigger. This timed pulse then lights an LED.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;lab5_schem.png&quot; width=90% alt=&quot;Pulse generator circuit schematic&quot;&#x2F;&gt;
  &lt;figcaption&gt;Pulse generator circuit schematic&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250310_173753.webp&quot; width=90% alt=&quot;Final breadboard layout&quot;&#x2F;&gt;
  &lt;figcaption&gt;Final breadboard layout&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Testing the differentiator first, everything functioned as intended. The output of the diode marked with the D_bar is the yellow trace (ch1) and the 2k resistor output D is the blue trace (ch2).&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250310_173941.webp&quot; width=90% alt=&quot;Testing the final circuits differentiator outputs&quot;&#x2F;&gt;
  &lt;figcaption&gt;Testing the final circuits differentiator outputs&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Next the output of the second stage amplifier (yellow ch1) and pulse generator (blue ch2) are shown, giving a clean representation of the analog PPG signal and digitized LED output signal.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250310_174202.webp&quot; width=90% alt=&quot;Testing the final circuit second stage and final pulse output&quot;&#x2F;&gt;
  &lt;figcaption&gt;Testing the final circuit second stage and final pulse output&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;





    &lt;details class=&quot;admonition&quot; data-type=&quot;video&quot;  &gt;
        &lt;summary&gt;
            &lt;p&gt;Pulse generator video&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;figure&gt;
  &lt;video width=&quot;60%&quot; autoplay loop controls&gt;
	&lt;source src=&quot;media&#x2F;20250310_173515.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Pulse generator in action&quot;&#x2F;&gt;
  &lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
    &lt;&#x2F;details&gt;

&lt;h1 id=&quot;pcb-design-and-part-sourcing&quot;&gt;PCB Design and Part sourcing&lt;&#x2F;h1&gt;
&lt;p&gt;With the prototype built, the schematic and PCB were designed in KiCad. Parts were sourced from Digi-key with all passives being in the 0805 SMD package for ease of soldering. The dual package SOIC-8 variant (MCP602-I) of the op-amp was chosen.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;kicad_schem.png&quot; width=90% alt=&quot;KiCad Schematic&quot;&#x2F;&gt;
  &lt;figcaption&gt;KiCad schematic design&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;kicad_pcb.png&quot; width=90% alt=&quot;KiCad PCB Layout&quot;&#x2F;&gt;
  &lt;figcaption&gt;KiCad PCB design&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The board was then sent to be manufactured.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;board1.png&quot; width=45% alt=&quot;KiCad 3D render top&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;board2.png&quot; width=45% alt=&quot;KiCad 3D render bottom&quot;&#x2F;&gt;
  &lt;figcaption&gt;PCB Renders&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;results&quot;&gt;Results&lt;&#x2F;h1&gt;
&lt;p&gt;Once the components and PCBs arrived, the boards were populated and prepped for testing. Because test points were accidentally omitted during the design phase, we improvised by soldering 28 AWG magnet wire to the board to act as manual probes. Fortunately, this workaround worked perfectly, and testing proceeded smoothly.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cost-analysis&quot;&gt;Cost Analysis&lt;&#x2F;h2&gt;
&lt;p&gt;The total cost of the project came to CA$80, broken down as follows:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;PCBs: ~CA\$40 (the boards themselves cost less than the shipping).&lt;&#x2F;li&gt;
&lt;li&gt;Components: ~CA\$40.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;While the overall budget was a bit higher than anticipated, this was primarily driven by a few specialized, pricey components—most notably the 5 MΩ potentiometer.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;final-takeaways&quot;&gt;Final Takeaways&lt;&#x2F;h2&gt;
&lt;p&gt;In the end, the project was a resounding success. The final results were fantastic, the hardware performed beautifully, and the hands-on troubleshooting provided some incredibly valuable lessons for the next design iteration.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250324_141858.webp&quot; width=90% alt=&quot;Assembled PCB&quot;&#x2F;&gt;
  &lt;figcaption&gt;Fully Assembled PCB&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20250324_165100.webp&quot; width=45% alt=&quot;KiCad 3D render top&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;20250324_165054.webp&quot; width=45% alt=&quot;KiCad 3D render bottom&quot;&#x2F;&gt;
  &lt;figcaption&gt;PCB with test points and oscilloscope output&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;video width=&quot;90%&quot; autoplay loop controls&gt;
	&lt;source src=&quot;media&#x2F;ppg_pcb_demo.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Demonstration of the functioning PPG device&quot;&#x2F;&gt;
  &lt;&#x2F;video&gt;
  &lt;figcaption&gt;Demonstration of the functioning PPG device&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Schematic Drawing: Practices and Principles</title>
        <published>2025-02-24T00:00:00+00:00</published>
        <updated>2025-12-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/notes/sch-practices/"/>
        <id>https://mikebell.cc/notes/sch-practices/</id>
        
        <content type="html" xml:base="https://mikebell.cc/notes/sch-practices/">&lt;h1 id=&quot;schematic-drawing-practices-and-principles&quot;&gt;Schematic Drawing: Practices and Principles&lt;&#x2F;h1&gt;
&lt;p&gt;In an effort to make the schematics I draw consistent and tidy while containing all necessary information, I use the following practices.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;A &lt;strong&gt;must watch&lt;&#x2F;strong&gt; video that goes over some of what is discussed below, but also goes into more detail on some important topics. Overall, it encompases the essence of good schematic design and I like it a lot.&lt;&#x2F;p&gt;





    &lt;details class=&quot;admonition&quot; data-type=&quot;info&quot;  &gt;
        &lt;summary&gt;
            &lt;p&gt;A Great Video&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;div style=&quot;width: 100%; aspect-ratio: 16&#x2F;9;&quot;&gt;
	&lt;iframe style=&quot;width: 100%; height: 100%;&quot; src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;X0hd_v8qRiY&quot; title=&quot;Actually Useful Schematics in KiCad - Andrew Greenberg&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
    &lt;&#x2F;details&gt;

&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;utilize-the-snap-grid&quot;&gt;Utilize the snap grid&lt;&#x2F;h2&gt;
&lt;p&gt;When using any EDA CAD software, turn on the snap grid and set it to a dimension that will remain constant throughout your drawings. Consistency in your schematics is key to ensuring your schematics remain consistent, clear, and readable.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;signal-and-voltage-flow&quot;&gt;Signal and Voltage Flow&lt;&#x2F;h2&gt;
&lt;p&gt;A schematic layout should have the signal path going from left to right. With feedback signals going right to left, as they are &quot;feeding back&quot;. It is best to have the higher voltage connections close to the top of the page, and lower voltage connections close to the bottom of the page. Power connection symbols should always be vertical, with positive voltages pointing up and negative voltages (including ground) pointing down.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;schematics_best_practice&#x2F;schem_best_practice_1.png&quot; width=90% alt=&quot;Figure 1&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;design-on-standard-paper-size&quot;&gt;Design on standard paper size&lt;&#x2F;h2&gt;
&lt;p&gt;Design your schematic so that they are readable on a standard printer size paper like A4 or 8.5”x11”. This allows them to be easily printed. For larger circuits, you may need to design the schematic over multiple pages to keep your drawings organized and readable.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;text-font&quot;&gt;Text Font&lt;&#x2F;h2&gt;
&lt;p&gt;Text on the schematic should be uniform, simple, and every character should be easily legible at all font sizes. For that reason fonts that are very vector-like, with straight lines, unambiguous, are best. Make sure the font you choose has good spacing to prevent symbols such as underscores from being covered by other lines in the schematic such as symbols or wires. Common fonts to use are Arial, Consolas, or Tahoma. In addition to font, always make text for components, nets, labels, notes, etc. ALL CAPS.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;text-placement&quot;&gt;Text placement&lt;&#x2F;h2&gt;
&lt;p&gt;Adjust the placement of the text associated with a symbol to not overlap other text and to make the text orientation consistent. It is good practice to have the designators and values on either side (or occasionally on the top and bottom) of horizontally oriented components and on the right side above and below vertically oriented components as shown below.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;schematics_best_practice&#x2F;schem_best_practice_2.png&quot; width=90% alt=&quot;Figure 2&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;defining-junctions&quot;&gt;Defining Junctions&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Draw a dot at every junction and make all junctions T’s.&lt;&#x2F;strong&gt; &lt;u&gt;Do not draw 4-way cross junctions&lt;&#x2F;u&gt;. With two lines crossing, one vertical the other horizontal, the only way to know whether they are connected is whether the junction dot is present.&lt;&#x2F;p&gt;
&lt;p&gt;The reason this is done is to prevent ambiguity in the event of generation loss. An example of generation loss may be the schematic is physically printed and scanned multiple times, or a screenshot is taken and compressed, then sent through email. When the image quality of the schematic is lost, the dots used to indicate a junction may fade, disappear, or reappear in places they shouldn’t.&lt;&#x2F;p&gt;
&lt;p&gt;When drawing or reading schematics, the general rule is if two lines cross then they are never connected, even if after some reproduction or compression artifacts it looks like there maybe is a dot there. By making all junctions Ts with dots, all crossing lines are therefore different nets without dots. In addition to this, &lt;strong&gt;never use an arc to indicate one net crossing over another&lt;&#x2F;strong&gt;. This is an old method and considered bad practice.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;schematics_best_practice&#x2F;schem_best_practice_3.png&quot; width=90% alt=&quot;Figure 3&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;keep-symbols-consistent&quot;&gt;Keep symbols consistent&lt;&#x2F;h2&gt;
&lt;p&gt;Always use the same symbol for the same device. For instance, there are multiple ways to draw different types of resistors, capacitors, logic gates, etc. When drawing these symbols, choose one symbol for the device and keep it consistent throughout your project&#x27;s schematics.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;schematics_best_practice&#x2F;schem_best_practice_4.png&quot; width=90% alt=&quot;Figure 4&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;break-it-down-into-blocks&quot;&gt;Break it down into blocks&lt;&#x2F;h2&gt;
&lt;p&gt;Break down your design into blocks based on functions, signal types, voltage domains, etc. Doing this will make designing on multiple pages easier, troubleshooting quicker, and overall improve organization. Adding a block diagram to the first page of your schematic package will also improve organization and searchability.&lt;&#x2F;p&gt;
&lt;p&gt;An example of this would be to draw a power supply design on one schematic page, then perhaps an amplifier on the other, so on and so forth.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;common-circuit-topologies&quot;&gt;Common circuit topologies&lt;&#x2F;h2&gt;
&lt;p&gt;When drawing known building blocks and sub-circuits, draw them as they are commonly known and ensure they are recognizable. An example of this would be a common emitter amplifier. The drawing on the left is easily recognizable as a common emitter amplifier, while the drawing on the right is hardly recognizable as the common emitter topology.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;schematics_best_practice&#x2F;schem_best_practice_5.png&quot; width=90% alt=&quot;Figure 5&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;draw-pins-according-to-function&quot;&gt;Draw pins according to function&lt;&#x2F;h2&gt;
&lt;p&gt;Show pins of ICs in a position relevant to their function. Following the signal path and layout, when drawing an IC, have the voltage inputs at the top, grounds and negative voltages at the bottom, inputs on the right, and outputs on the left. Physical pin order layouts obfuscate the circuit, so it is best to avoid them.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;schematics_best_practice&#x2F;schem_best_practice_6.png&quot; width=90% alt=&quot;Figure 6&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;spacing&quot;&gt;Spacing&lt;&#x2F;h2&gt;
&lt;p&gt;Leave enough space between pins to make the pins readable and consistent. A good rule of thumb for this is to leave enough space so you can add resistors on top of eachother with room for text (this is particularly helpful when adding resistor arrays).&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;schematics_best_practice&#x2F;schem_best_practice_7.png&quot; width=90% alt=&quot;Figure 7&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;wires-and-busses&quot;&gt;Wires and busses&lt;&#x2F;h2&gt;
&lt;p&gt;When designing a schematic with parallel logic or wires that should be grouped together, use a bus where possible. A bus will group the wires and show as one thick wire on the schematic (depending on EDA). This saves space, and increases readability. Avoid crossing busses if possible as this can lead to ambiguities.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;net-names&quot;&gt;Net names&lt;&#x2F;h2&gt;
&lt;p&gt;Placed directly on a “wire” connection, explicit net names are used to clarify the purpose of a signal, or label a specific type of signal. A common use for net names is to name the signals on connector pins. In most EDA CAD software, nets are global, so they can be used across multiple pages of a schematic to define connections.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;use-ports-labels-for-distant-connections&quot;&gt;Use ports&#x2F;labels for distant connections&lt;&#x2F;h2&gt;
&lt;p&gt;When designing schematics that have one or more connections spanning the entire page, it is better and more organized to use a label instead of drawing a wire across the entire page to connect the two points. In the case of a multi-page schematic, labels are necessary. Use direct wires where possible, but use labels to complete the less than direct connections.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;decoupling-capacitor-placement&quot;&gt;Decoupling capacitor placement&lt;&#x2F;h2&gt;
&lt;p&gt;Because of the purpose of decoupling capacitors, they need to be physically placed very close to the part. On a schematic, it is best practice to place decoupling capacitors by their IC power pins. This makes the intent of the component clear, and can prevent mistakes later in the PCB design process. &lt;em&gt;It also makes troubleshooting a lot easier!&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;..&#x2F;media&#x2F;schematics_best_practice&#x2F;schem_best_practice_8.png&quot; width=45% alt=&quot;Figure 8&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;standard-component-values&quot;&gt;Standard component values&lt;&#x2F;h2&gt;
&lt;p&gt;When designing a circuit in a simulation or calculating values, your components may have specific and non-standard values. An example of this could be the requirement of a 1.0634 kOhm resistor, which does not exist on the market. So unless it is a critical value, not using standard values will only make manufacturing and parts sourcing extremely difficult or impossible.&lt;&#x2F;p&gt;
&lt;p&gt;Standard values for resistors, capacitors, and inductors most commonly follow the &lt;u&gt;E-Series of preferred numbers&lt;&#x2F;u&gt;, details of which are explained in the IEC 60063:2015 standard. You can also go to the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;E_series_of_preferred_numbers&quot;&gt;E-Series of preferred numbers - Wikipeda&lt;&#x2F;a&gt; page to read further.&lt;&#x2F;p&gt;
&lt;p&gt;For fuses, standard values follow the Renard series of preferred numbers, more of which can be found in the ISO 3:1973 standard or at &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Renard_series&quot;&gt;Renard Series - Wikipeda&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;value-notation-and-tolerance&quot;&gt;Value notation and tolerance&lt;&#x2F;h2&gt;
&lt;p&gt;While giving capacitors, inductors, and resistors values, use metric system international (SI) suffix letters in place of the decimal point. As schematics get routinely photocopied or otherwise optically reproduced, decimal dots can disappear after a few generations. To prevent any chance of errors this convention was adopted. As a bonus, it makes values shorter and quicker to read. SI suffix letters used are shown below.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;Letter&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;SI Unit&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;10^&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Used for&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Example Case&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;p&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Pico&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;-12&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Capacitors&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;33p for 33pF, 8p1 for 8.1pF&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;n&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Nano [1]&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;-9&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Capacitors, Inductors&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;2n2 for 2.2nF, 39n for 39nH&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;u&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Micro&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;-6&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Capacitors, Inductors&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;4u7 for 4.7uF, 10u for 10uH&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;m&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Milli&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;-3&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Capacitors, Inductors, Resistors&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;1m for 1mF, 3m3for 3mF&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;R&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Ohm [2]&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;0&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Resistors only&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;37R5 for 37.5 Ohms, 220R for 220 Ω&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;k&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Kilo&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;3&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Resistors&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;2k2 for 2.2k Ohms, 22k for 22kΩ&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;M&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Mega&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;&lt;code&gt;6&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Resistors&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;3M3 for 3.3 M Ohms&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;





    &lt;div class=&quot;admonition&quot; data-type=&quot;info&quot;&gt;
        &lt;div class=&quot;admonition-title&quot;&gt;
            &lt;p&gt;Notation&lt;&#x2F;p&gt;

        &lt;&#x2F;div&gt;
        &lt;ol&gt;
&lt;li&gt;Using nano (n) for capacitors and inductors is not typical in industry. It is more common to use micro (u) and pico (p). Ex. 2200p for 2.2n or 0u8 for 800n.&lt;&#x2F;li&gt;
&lt;li&gt;The &quot;R&quot; is &lt;u&gt;only used for resistors&lt;&#x2F;u&gt; and is used in place of the decimal. Capacitors and inductors are indicated with their units for sizes larger than what is commonly occurring within the schematic such as a 1 F capacitor.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;

    &lt;&#x2F;div&gt;

&lt;p&gt;When writing out the component value, use 3 characters (including the SI letter) to denote a 5% tolerance, use 4 characters to denote 1%, and use 5 characters for 0.5&#x2F;0.1%. Ex. 1M0 for 1M Ohms 5%, 4u70 for 4.7uF 1%, 2k210 for 2.21k Ohms 0.1%.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;component-tolerances&quot;&gt;Component tolerances&lt;&#x2F;h2&gt;
&lt;p&gt;When designing a circuit, most passive components will follow the same tolerances, such as using 1% resistors across the entire circuit. Instead of indicating the tolerance of each component at the component, it is better to leave an engineering note on the drawing that states a default tolerance for a component type, then when you deviate from that tolerance you can add the tolerance value next to the component value.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reference-designators&quot;&gt;Reference Designators&lt;&#x2F;h2&gt;
&lt;p&gt;Reference designators are used to uniquely identify components within a circuit. A reference designator consists of a letter (or two) to indicate the type of component followed by a number to identify the specific component.&lt;&#x2F;p&gt;
&lt;p&gt;Make sure reference designators are visible, clear, and at the components side in the same orientation as all other reference designators. Most EDA CAD softwares have default reference designators, and the ability to add your own. Common reference designators can be found in the table below&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: center&quot;&gt;Designator&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;R&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Resistor, All kinds&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;RA&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Resistor Array&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;C&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Capacitor, All Kinds&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;CA&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Capacitor Array&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;D&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Diode, All kinds (including LED)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;TVS&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Transient Voltage Suppression Diode&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;L&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Inductor, All Kinds (Excluding transformer)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;T&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Transformer&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;FB&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Ferrite Bead&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;F&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Fuse&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;Q&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;DiscreteTransistor&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;U&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Integrated Circuits (Including Voltage Regulators, microcontrollers, and SoCs)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;SW&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Switch, Button&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;K&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Relay&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;BAT&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Battery Clip&#x2F;Connection&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;J&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Jack (Least movable connector of a connector pair)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;JP&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Jumper Connector (Link on Board)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;P&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Plug (most-movable connector of a connector pair)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center&quot;&gt;A&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Sub-module or PCB assembly&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;multi-part-packages&quot;&gt;Multi part packages&lt;&#x2F;h2&gt;
&lt;p&gt;Multi part packages such as Quad Op Amps (4 op amps in one chip) or a hex inverter (6 inverters in one chip) may show up in schematics as U2A, U2B, etc. Make sure that all of the parts get “packaged” into the minimum number of IC packages required. If there are parts that aren’t being used, such as 5 of the 6 inverters being used in a hex inverter, consult the datasheet of the part to determine whether to pull unused pins low, high, or to leave them unconnected. Doing so can prevent the possibility of interference, crosstalk, or oscillations from occurring.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;part-orientation&quot;&gt;Part orientation&lt;&#x2F;h2&gt;
&lt;p&gt;When drawing parts on a schematic such as an Op Amp, make sure not to flip the orientation in such a way that it is less commonly perceived. In the case of most op amps, they are drawn with the non-inverting input above the inverting input.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;do-not-populate-no-pop-option&quot;&gt;Do Not Populate (No-Pop) Option&lt;&#x2F;h2&gt;
&lt;p&gt;Most EDA&#x27;s have an option in their schematic editors to define a component as &quot;Do Not Populate&quot; (or No-Pop) for short. This option will allow the designer to keep a component in the design, but inform the manufacturer that the component is not needed to be soldered on to the PCB.
One application of this option is to add multiple different footprints for one component -- say a PCB has an op-amp that can be ordered as a DIP-8 package or an SOIC-8 package. Depending on lead times and&#x2F;or component availability, it helps to have both footprints on one&#x27;s PCB to have the option to order either package of op-amp and not need to order different PCB&#x27;s.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Gilbert Cell Experimentation</title>
        <published>2025-02-21T00:00:00+00:00</published>
        <updated>2025-02-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/gilbert-cell/"/>
        <id>https://mikebell.cc/posts/gilbert-cell/</id>
        
        <summary type="html">&lt;p&gt;Lately I have been chipping away at the idea of creating a superheterodyne reciever (and potentially tranciever). One of the key blocks within the design of a superheterodyne reciever is a mixer. I have a number of options when it comes to mixer topologies, and among them I wanted to give the gilbert cell a look.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Software Index</title>
        <published>2025-02-19T00:00:00+00:00</published>
        <updated>2026-01-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/notes/software/"/>
        <id>https://mikebell.cc/notes/software/</id>
        
        <content type="html" xml:base="https://mikebell.cc/notes/software/">&lt;style&gt;
a {
color: var(--primary-color)
}
&lt;&#x2F;style&gt;
&lt;h1 id=&quot;software-index&quot;&gt;Software Index&lt;&#x2F;h1&gt;
&lt;p&gt;This page is a collection of software tools I use, many of which are open source. They are organized into categories based on use case.&lt;&#x2F;p&gt;
&lt;p&gt;I specify whether a software is free and open source (FOSS), as well as specific versions to aim for if there are any.&lt;&#x2F;p&gt;
&lt;p&gt;Some softwares may add features such as telemetry after certain versions. For that reason, I will specify the optimal versions to use if necessary.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;media&quot;&gt;Media&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;u&gt;Video&lt;&#x2F;u&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;:simple-kdenlive: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;kdenlive.org&#x2F;en&#x2F;&quot;&gt;Kdenlive&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Video editing. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;:simple-vlcmediaplayer: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.videolan.org&#x2F;vlc&#x2F;&quot;&gt;VLC Media Player&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Viewing and streaming video. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;:simple-obsstudio: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;obsproject.com&#x2F;&quot;&gt;OBS&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Screen recording and live streaming. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;u&gt;Image&lt;&#x2F;u&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;:simple-gimp: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.gimp.org&#x2F;&quot;&gt;GIMP&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Image editing. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;u&gt;Audio&lt;&#x2F;u&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;:simple-audacity: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.audacityteam.org&#x2F;&quot;&gt;Audacity&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Audio editing. Free, :simple-opensourceinitiative: Open Source, Free, (1) Only up to &lt;strong&gt;v3.0.2&lt;&#x2F;strong&gt;
{ .annotate }&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;After version	v3.0.2, Audacity has telemetry. If you do not want telemetry, install versions up to and including &lt;strong&gt;v3.0.2&lt;&#x2F;strong&gt; but no greater.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.mp3tag.de&#x2F;en&#x2F;&quot;&gt;MP3Tag&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Audio file metadata editing and tagging. Free for Windows only, Not version specific.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;utility&quot;&gt;Utility&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;:simple-notepadplusplus: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;notepad-plus-plus.org&#x2F;&quot;&gt;Notepad++&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Text and source code editor. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;:simple-libreoffice: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.libreoffice.org&#x2F;&quot;&gt;LibreOffice&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Office Suite. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;okular.kde.org&#x2F;&quot;&gt;Okular&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Universal document viewer by KDE. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.libreoffice.org&#x2F;&quot;&gt;Void Tools Everything&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - File search utility. Free, Not version specific.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;vb-audio.com&#x2F;&quot;&gt;VB Audio Voicemeeter&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Digital audio mixing and routing. Free, Not version specific.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;engineering&quot;&gt;Engineering&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;:simple-octave: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;octave.org&#x2F;&quot;&gt;GNU Octave&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Open Source alternative to MATLAB. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;:simple-python: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.python.org&#x2F;&quot;&gt;Python&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - High-level, general-purpose programming language. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;u&gt;Electronics&lt;&#x2F;u&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;:simple-ltspice: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.analog.com&#x2F;en&#x2F;resources&#x2F;design-tools-and-calculators&#x2F;ltspice-simulator.html&quot;&gt;LTspice&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - A popular circuit simulator used in education and industry. Free, Not version specific.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ra3xdh.github.io&#x2F;&quot;&gt;QUCS-S&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - (Quite Universal Circuit Simulator) Circuit simulation program based on the Qucs circuit simulator. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;:simple-kicad: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.kicad.org&#x2F;&quot;&gt;KiCad&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Open source EDA &#x2F; electronics CAD software. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;u&gt;3D Printing &amp;amp; CNC&lt;&#x2F;u&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.prusa3d.com&#x2F;page&#x2F;prusaslicer_424&#x2F;&quot;&gt;PrusaSlic3r&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - 3D printing toolpath generation. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;flatcam.org&#x2F;&quot;&gt;FlatCAM&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Computer-Aided Manufacturing (CAM) and Design (CAD) software for Printed Circuit Board (PCB). :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Denvi&#x2F;Candle&quot;&gt;GRBL Candle&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - GRBL controller application with G-Code visualizer for CNC. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;other&quot;&gt;Other&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;libresprite.github.io&#x2F;#!&#x2F;&quot;&gt;LibreSprite&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Creating and animating pixel art &amp;amp; sprites. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;binarynonsense&#x2F;comic-book-reader?tab=readme-ov-file&quot;&gt;ACBR&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Comic book reader and converter for CBZ, CBR, CB7, EPUB and PDF files. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Picocrypt&#x2F;Picocrypt&quot;&gt;PicoCrypt&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Simple encryption tool for files using XChaCha20. :simple-opensourceinitiative: Open Source, Free, Not version specific.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Website Index</title>
        <published>2025-02-19T00:00:00+00:00</published>
        <updated>2026-11-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/notes/website-index/"/>
        <id>https://mikebell.cc/notes/website-index/</id>
        
        <content type="html" xml:base="https://mikebell.cc/notes/website-index/">&lt;style&gt;
a {
color: var(--primary-color)
}
&lt;&#x2F;style&gt;
&lt;h1 id=&quot;website-index&quot;&gt;Website Index&lt;&#x2F;h1&gt;
&lt;p&gt;This page is a collection of websites and web tools I use. They are organized into categories based on use case.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;utility&quot;&gt;Utility&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;docs.fileformat.com&#x2F;&quot;&gt;FileFormat.com&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Documentation on file formats and extensions.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;pairdrop.net&#x2F;&quot;&gt;PairDrop.net&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Browser based Air Drop clone for file sharing.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;regexr.com&#x2F;&quot;&gt;RegExr.com&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - RegEx editor and verification.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ninite.com&#x2F;&quot;&gt;Ninite.com&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Create installers for various softwares for single installation.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;engineering&quot;&gt;Engineering&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;apps.automeris.io&#x2F;wpd4&#x2F;&quot;&gt;WebPlotDigitizer v4&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Data extraction from chart images.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.symbolab.com&#x2F;&quot;&gt;Symbolab.com&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - AI calculator.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.desmos.com&#x2F;calculator&quot;&gt;Desmos.com&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Web based graphing calculator.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.boolean-algebra.com&#x2F;&quot;&gt;boolean-algebra.com&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Boolean Algebra calculator.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;latex.codecogs.com&#x2F;eqneditor&#x2F;editor.php&quot;&gt;latex.codecogs.com&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - LaTex equation editor and generator.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;^^Electronics^^&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;sim.okawa-denshi.jp&#x2F;en&#x2F;&quot;&gt;Okawa Electric Design Utilities&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Analog design and filter design calculators.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.digikey.ca&#x2F;en&#x2F;resources&#x2F;online-conversion-calculators&quot;&gt;digikey.ca Conversion Calculators&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Digikey online conversion calculators.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.falstad.com&#x2F;circuit&#x2F;circuitjs.html&quot;&gt;falstad.com CircitJS&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Web based interactive and visual circuit simulator.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;home.sandiego.edu&#x2F;~ekim&#x2F;e194rfs01&#x2F;jwmatcher&#x2F;matcher2.html&quot;&gt;John Wetherell&#x27;s Matching Network Designer&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Impedance matching network calculator.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.szynalski.com&#x2F;tone-generator&#x2F;&quot;&gt;szynalski.com Tone Generator&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Audio tone generator and sweep.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;^^3D Printing &amp;amp; CNC^^&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ncviewer.com&#x2F;&quot;&gt;NCviewer.com&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - G-Code toolpath viewer.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;media&quot;&gt;Media&lt;&#x2F;h2&gt;
&lt;p&gt;^^Video^^&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Information to be added.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;^^Image^^&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ezgif.com&#x2F;&quot;&gt;EZGif&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Online gif creation, editing, conversion tool.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;onlinepngtools.com&#x2F;&quot;&gt;OnlinePNGtools.com&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Online PNG Manipulation.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;^^Audio^^&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.rtings.com&#x2F;headphones&#x2F;tools&#x2F;compare&#x2F;&quot;&gt;RTINGS.com Headphone Compare&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Extensive headphone comparison site.&lt;&#x2F;li&gt;
&lt;li&gt;Information to be added.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;^^Graphical^^&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;simpleicons.org&#x2F;&quot;&gt;Simple Icons&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - SVG Icons for popular brands.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;pictogrammers.com&#x2F;library&#x2F;mdi&#x2F;&quot;&gt;Material Design Icons&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Icons for the Material Design theme.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.svgrepo.com&#x2F;&quot;&gt;SVGRepo&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - SVG Icons for various brands and designs.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;other&quot;&gt;Other&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;hardwaretester.com&#x2F;gamespad&quot;&gt;hardwaretester.com&#x2F;gamepad&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Browser gamepad functionality testing.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;fontmeme.com&#x2F;outline-fonts&#x2F;&quot;&gt;fontmeme.com&#x2F;outline-fonts&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Font PNG banner generator.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;operating-systems&quot;&gt;Operating Systems&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;massgravel&#x2F;Microsoft-Activation-Scripts?tab=readme-ov-file&quot;&gt;Microsoft Activation Scripts (MAS)&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - Open-source Windows and Office activator featuring HWID, Ohook, TSforge, KMS38, and Online KMS activation methods, along with advanced troubleshooting.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Community</title>
        <published>2025-02-16T00:00:00+00:00</published>
        <updated>2026-04-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/about/community/"/>
        <id>https://mikebell.cc/about/community/</id>
        
        <content type="html" xml:base="https://mikebell.cc/about/community/">&lt;h1 id=&quot;clubs-and-community&quot;&gt;Clubs and Community&lt;&#x2F;h1&gt;
&lt;p&gt;I aim to be in a community where I can thrive. I prefer surrounding myself with people that I can learn from, and learn with. This page discusses my time with all the communities and clubs I have been apart of, big or small, as well as some efforts I have made to create communities.&lt;&#x2F;p&gt;
&lt;p&gt;The larger topics in this category have been split into their own pages. The following is organized from oldest to newest.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;robotics-club&quot;&gt;High School Robotics Club&lt;&#x2F;h2&gt;
&lt;p&gt;In the spring of 2018 I created a robotics club at my high school with a friend. After running through the necessary hoops with faculty, we became official and got a room in the building for club activities.&lt;&#x2F;p&gt;
&lt;p&gt;There wasn&#x27;t much at first, but we were eventually donated a 3D printer thanks to our advisor. This 3D printer, which was a handfull to get working, was a TEVO Tornado FDM printer. This 3D printer taught me many things 3D printing related, like bed adhesion, filament flow rates and quality, different materials and their properties, and the frustration of failed prints. The printer was by far not user friendly, but we made it work. My friend even spent the time to get &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;octoprint.org&#x2F;&quot;&gt;OctoPrint&lt;&#x2F;a&gt; to work with it, allowing us to queue up prints and watch them print as we were in class.&lt;&#x2F;p&gt;
&lt;p&gt;Some time after, the school purchased an Ender 3 V2 which was much nicer to work with. Around this time I introduced my self to CAD through the site &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.tinkercad.com&#x2F;&quot;&gt;TinkerCAD&lt;&#x2F;a&gt;. This allowed me to make very generic and functional prints such as enclosures for electronics projects or structural components on antennas.&lt;&#x2F;p&gt;
&lt;p&gt;By late 2019 the club had gained 3 more members, and we registered for the FIRST Tech Challenge robotics competition. Participating in this challenge was a great teambuilding experience and introduced me to what an engineering team could be like. I go into more detail regarding the construction and engineering of the robot for this competition on my &lt;a href=&quot;&#x2F;projects&quot;&gt;projects&lt;&#x2F;a&gt; page.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20200222_082303.jpg&quot; width=90% alt=&quot;FIRST Tech Challenge team photo&quot;&#x2F;&gt;
  &lt;figcaption&gt;FIRST Tech Challenge team photo&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;university-study-group&quot;&gt;University Study Group&lt;&#x2F;h2&gt;
&lt;p&gt;When the school term for my first year of university began in autumn of 2020, the pandemic was in full force and everything was online. This was a hurdle for most, and I thought it would be nice to connect with my cohort during this time.&lt;&#x2F;p&gt;
&lt;p&gt;My solution was to create a study group through the social platform &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;discord.com&#x2F;&quot;&gt;Discord&lt;&#x2F;a&gt;. Similar to teamspeak, Discord is used within the gaming community as a way to send text messages, share media, and join conference-style voice calls. With the added benefit of easy user interface configuration, I made a server on Discord for the 2020 University of British Columbia Okanagan (UBCO) cohort and called it the &quot;&lt;em&gt;Just Vibin Study Groups&lt;&#x2F;em&gt;&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;On the first day, all new engineering students attended a first day orientation zoom call. During this call I promoted the study group. After some time, the study group Discord server began gaining members, and eventually exceeded 250 members by the middle of the first term.&lt;&#x2F;p&gt;
&lt;p&gt;I would host group study sessions for many of the first year courses. During these sessions I would use Discords screen sharing functionality alongside my drawing tablet to solve practice problems with other students. Some of these sessions would reach 70 members. I always found I learned material better by teaching what I know and learning what I don&#x27;t from everyone else. Because of this I had a very successful first year, even with the stress of having to take 6 online courses in the span of 12 weeks.&lt;&#x2F;p&gt;
&lt;p&gt;Overall, the server was very popular with above 500 members after the first term (December 2020), and peaked at 754 members in early 2023. After the last term of the 2023 year however, the server started to have less traffic as everything at the university had returned to in-person. By the end of 2024, majority of the students had moved on or graduated, so the server is officially a thing of the past.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;discord_studygroup.png&quot; width=90% alt=&quot;Just Vibin Study Groups discord server&quot;&#x2F;&gt;
  &lt;figcaption&gt;Just Vibin Study Groups discord server&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;ubco-ieee-mlrc-student-branch&quot;&gt;UBCO IEEE MLRC Student Branch&lt;&#x2F;h2&gt;
&lt;p&gt;In my second year of university (spring of 2022), a friend introduced me to the executive chair of the universities UBCO IEEE McNaughton Learning Resource Centre (MLRC) student branch as it had just revived itself after a two year hiatus. Right away I knew this was where I would spend most of my time while on campus.&lt;&#x2F;p&gt;
&lt;p&gt;Not even a month after learning about the space I became a volunteer lab monitor. I spent most of my spare time on campus in this space, to the point that I considered it home on campus.
As someone who enjoys discussion with others on topics I take interest in, when somebody needs help with anything electronics related, I would be more than happy to offer a helping hand. Because of this, I found myself connecting with the community and becoming something of a volunteer tutor.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;DSC3426.jpg&quot; width=90% alt=&quot;IEEE Student Branch UBCO 2022&quot;&#x2F;&gt;
  &lt;figcaption&gt;IEEE Student Branch UBCO 2022&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;pcb-design-workshops&quot;&gt;PCB Design Workshops&lt;&#x2F;h3&gt;
&lt;p&gt;Through the IEEE Student branch, I was given the privilege of hosting multiple workshops to teach students how to design printed circuit boards (PCB). Hosting the first workshop in 2022, then 2023, and soon 2025, I taught students how to go from an idea and schematic, to designing a functional and presentable circuit board -- knowledge that can give students a boost in finding jobs as PCB design is not taught in the regular curriculum.&lt;&#x2F;p&gt;
&lt;p&gt;The event had a high attendance, with the 2022 and 2023 workshops having over 50 students in attendance. I taught students how to take a schematic, draw it on &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.kicad.org&#x2F;&quot;&gt;KiCad&lt;&#x2F;a&gt;, source parts from &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.digikey.ca&#x2F;&quot;&gt;digikey&lt;&#x2F;a&gt;, then create a PCB layout. From the PCB layout, I demonstrated how to export the files needed to send to manufacturers to have the boards created.&lt;&#x2F;p&gt;
&lt;p&gt;More can be read about the &lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;about&#x2F;community&#x2F;projects&#x2F;23_eworkshop.md&quot;&gt;2023 EWorkshop&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;about&#x2F;community&#x2F;projects&#x2F;25_eworkshop.md&quot;&gt;2025 EWorkshop&lt;&#x2F;a&gt; on my projects page.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;1701468064462.jpg&quot; width=90% alt=&quot;IEEE Student Branch UBCO 2022&quot;&#x2F;&gt;
  &lt;figcaption&gt;IEEE Student Branch UBCO 2022&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;other-volunteering-history&quot;&gt;Other Volunteering History&lt;&#x2F;h2&gt;
&lt;p&gt;Outside of academics and engineering, some other recorded events I volunteered for can be found below.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;calgary-ukrainian-festival-2024&quot;&gt;Calgary Ukrainian Festival 2024&lt;&#x2F;h3&gt;
&lt;p&gt;I was in Calgary Alberta for a Co-op over the summer of 2024. In June the Calgary Ukranian Festival (CUF) took place. Being that my uncle was one of the founders of the CUF, he asked if I wanted to volunteer, so I agreed to. I helped with unloading and loading drinks for the bars, as well as set up and take down of all the stands, tables, and chairs.&lt;&#x2F;p&gt;
&lt;p&gt;Overall it was very fun to be apart of the CUF in 2024, especially since it had been well over a decade since the last time I had attended the annual event.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_20240602_110958476.jpg&quot; width=90% alt=&quot;2024 Calgary Ukranian Festival&quot;&#x2F;&gt;
  &lt;figcaption&gt;2024 Calgary Ukranian Festival&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Work History</title>
        <published>2025-02-16T00:00:00+00:00</published>
        <updated>2026-04-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/about/work/"/>
        <id>https://mikebell.cc/about/work/</id>
        
        <content type="html" xml:base="https://mikebell.cc/about/work/">&lt;style&gt;
h3 {
  margin-top: 0.5rem;
  &amp;:before {
    content: &quot;&quot;;  
  }
}

&lt;&#x2F;style&gt;
&lt;h1 id=&quot;industry-experience&quot;&gt;Industry Experience&lt;&#x2F;h1&gt;
&lt;p&gt;Since graduating high school and being in university, I have worked a number of industry related jobs. After high school, I worked in the electronics manufacturing space as an assembler, then moved on to electronics repair and troubleshooting. Later down the road I worked as a communications installer, where I installed mobile radios in vehicles and programmed mobile radios and relays. I then went on to do two eight-month co-ops (internships) for my engineering degree in the avionics and military contracting industries respectively.&lt;&#x2F;p&gt;
&lt;p&gt;Work history is ordered from newest position to oldest.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;omega-labs-university-of-british-columbia&quot;&gt;OMEGA Labs - University of British Columbia&lt;&#x2F;h2&gt;
&lt;h3&gt;Undergraduate Research Assistant&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M16 10h2&quot; &#x2F;&gt;  &lt;path d=&quot;M16 14h2&quot; &#x2F;&gt;  &lt;path d=&quot;M6.17 15a3 3 0 0 1 5.66 0&quot; &#x2F;&gt;  &lt;circle cx=&quot;9&quot; cy=&quot;11&quot; r=&quot;2&quot; &#x2F;&gt;  &lt;rect x=&quot;2&quot; y=&quot;5&quot; width=&quot;20&quot; height=&quot;14&quot; rx=&quot;2&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; &lt;em&gt;Working under &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;mtt.org&#x2F;profile&#x2F;mohammad-h-zarifi&#x2F;&quot;&gt;Dr. Mohammad H. Zarifi&lt;&#x2F;a&gt; and his graduate students &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ieeexplore.ieee.org&#x2F;author&#x2F;679869612782464&quot;&gt;Zahra Sarpanah Sourkouhi&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ieeexplore.ieee.org&#x2F;author&#x2F;37090005999&quot;&gt;Fatemeh Niknahad&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z&quot; &#x2F;&gt;  &lt;path d=&quot;M15 5.764v15&quot; &#x2F;&gt;  &lt;path d=&quot;M9 3.236v15&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Kelowna, BC&lt;br&gt;
&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M16 14v2.2l1.6 1&quot; &#x2F;&gt;  &lt;path d=&quot;M16 2v4&quot; &#x2F;&gt;  &lt;path d=&quot;M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5&quot; &#x2F;&gt;  &lt;path d=&quot;M3 10h5&quot; &#x2F;&gt;  &lt;path d=&quot;M8 2v4&quot; &#x2F;&gt;  &lt;circle cx=&quot;16&quot; cy=&quot;16&quot; r=&quot;6&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; May 2025 - April 2026&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Working closely with masters and graduate students, aiding in their research.&lt;&#x2F;li&gt;
&lt;li&gt;Working with state of the art and novel technologies such as &lt;strong&gt;MXene&lt;&#x2F;strong&gt; metamaterials, and &lt;strong&gt;contactless microwave sensing techniques&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Frequency Selective Surface and Antenna simulations using &lt;strong&gt;ANSYS Electronics HFSS&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Integrating &lt;strong&gt;NanoVNA, TinySA, and ESP32&lt;&#x2F;strong&gt; components to Windows and Linux using Python.&lt;&#x2F;li&gt;
&lt;li&gt;Sourcing CAD models and designing test fixtures with &lt;strong&gt;SolidWorks&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Rapid CAD design&lt;&#x2F;strong&gt; and prototyping utilizing &lt;strong&gt;3D printing&lt;&#x2F;strong&gt; for test fixtures and structures.&lt;&#x2F;li&gt;
&lt;li&gt;Programming ESP32 web interfaces and websockets for remote browser controlled test fixtures.&lt;&#x2F;li&gt;
&lt;li&gt;Conducting lab tests using sophiscticated measurement tools and software.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Data analysis&lt;&#x2F;strong&gt; and processing using &lt;strong&gt;MATLAB&lt;&#x2F;strong&gt; and &lt;strong&gt;Python&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;





    &lt;details class=&quot;admonition&quot; data-type=&quot;note&quot;  &gt;
        &lt;summary&gt;
            &lt;p&gt;Equipment &amp;amp; Software Used&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;p&gt;&lt;u&gt;Equipment&lt;&#x2F;u&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;evidentscientific.com&#x2F;en&#x2F;material-science-microscopes&#x2F;confocal&quot;&gt;Olympus LEXT OLS5000&lt;&#x2F;a&gt; Profilometer&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.keysight.com&#x2F;ca&#x2F;en&#x2F;product&#x2F;N5222B&#x2F;pna-microwave-network-analyzer-900-hz-10-mhz-26-5-ghz.html&quot;&gt;Keysight N5222B PNA&lt;&#x2F;a&gt; Vector Network Analyzer&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;bambulab.com&#x2F;en-ca&#x2F;p1&quot;&gt;BambuLab P1S&lt;&#x2F;a&gt; 3D printer with multi-filament AMS add-on.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;nanorfe.com&#x2F;nanovna-v2.html&quot;&gt;NanoVNA-F V2&lt;&#x2F;a&gt; Vector Network Analyzer (Interfacing NanoVNA to PC through Python)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;u&gt;Software&lt;&#x2F;u&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ANSYS Electronics HFSS&lt;&#x2F;li&gt;
&lt;li&gt;SOLDIWORKS&lt;&#x2F;li&gt;
&lt;li&gt;BambuLab Studio&lt;&#x2F;li&gt;
&lt;li&gt;MATLAB, GNU Octave&lt;&#x2F;li&gt;
&lt;li&gt;Python&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;

    &lt;&#x2F;details&gt;

&lt;figure&gt;
  &lt;img src=&quot;IMG-20250604-WA0002.jpg&quot; width=90% alt=&quot;OMEGA Lab Team Photo&quot;&#x2F;&gt;
  &lt;figcaption&gt;OMEGA Lab Team Photo&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;general-dynamics-mission-systems-canada&quot;&gt;General Dynamics Mission Systems Canada&lt;&#x2F;h2&gt;
&lt;h3&gt;Hardware Engineering Co-op&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z&quot; &#x2F;&gt;  &lt;path d=&quot;M15 5.764v15&quot; &#x2F;&gt;  &lt;path d=&quot;M9 3.236v15&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Calgary, AB&lt;br&gt;
&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M16 14v2.2l1.6 1&quot; &#x2F;&gt;  &lt;path d=&quot;M16 2v4&quot; &#x2F;&gt;  &lt;path d=&quot;M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5&quot; &#x2F;&gt;  &lt;path d=&quot;M3 10h5&quot; &#x2F;&gt;  &lt;path d=&quot;M8 2v4&quot; &#x2F;&gt;  &lt;circle cx=&quot;16&quot; cy=&quot;16&quot; r=&quot;6&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; January 2024 - September 2024&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Circuit design&lt;&#x2F;strong&gt; and &lt;strong&gt;simulation&lt;&#x2F;strong&gt; of analog &lt;strong&gt;filters&#x2F;amplifiers&lt;&#x2F;strong&gt; and &lt;strong&gt;power distribution systems&lt;&#x2F;strong&gt; in &lt;strong&gt;LTspice&lt;&#x2F;strong&gt;, followed by Schematic Layouts.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Schematic layouts&lt;&#x2F;strong&gt; and drafting using &lt;strong&gt;Siemens Mentor Xpedition ECAD&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Power distribution network (PDN) analysis&lt;&#x2F;strong&gt; and decoupling optimization using HyperLynx SI PI Thermal and Altera PDN Analysis tools.&lt;&#x2F;li&gt;
&lt;li&gt;Focused &lt;strong&gt;part sourcing&lt;&#x2F;strong&gt; to find components with a strict set of criteria and characteristics.&lt;&#x2F;li&gt;
&lt;li&gt;FPGA pin assignment &amp;amp; &lt;strong&gt;fanout optimization&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Pin assignments for high speed edge and ribbon cable connectors, with power delivery and data integrity considerations.&lt;&#x2F;li&gt;
&lt;li&gt;Working in an environment that operates with &lt;strong&gt;secret information&lt;&#x2F;strong&gt; on a need to know basis, and usage of &lt;strong&gt;material that falls under ITAR&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;skytrac&quot;&gt;Skytrac&lt;&#x2F;h2&gt;
&lt;h3&gt;Design Airworthiness Organization Engineering Co-op&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z&quot; &#x2F;&gt;  &lt;path d=&quot;M15 5.764v15&quot; &#x2F;&gt;  &lt;path d=&quot;M9 3.236v15&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Kelowna, BC&lt;br&gt;
&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M16 14v2.2l1.6 1&quot; &#x2F;&gt;  &lt;path d=&quot;M16 2v4&quot; &#x2F;&gt;  &lt;path d=&quot;M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5&quot; &#x2F;&gt;  &lt;path d=&quot;M3 10h5&quot; &#x2F;&gt;  &lt;path d=&quot;M8 2v4&quot; &#x2F;&gt;  &lt;circle cx=&quot;16&quot; cy=&quot;16&quot; r=&quot;6&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; May 2023 - December 2023&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Working with a team to &lt;strong&gt;generate supplemental type certificates&lt;&#x2F;strong&gt; and supporting documentation for &lt;strong&gt;avionics equipment&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Reviewing &lt;strong&gt;aircraft wiring diagrams&lt;&#x2F;strong&gt; and &lt;strong&gt;avionics installations&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Generation of engineering service bulletins, certification plans, electrical load analysis, DO-160G qualification reports, and supplemental flight manual documentation with standardized technical english (ASD-STE100).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;lanmark-engineering&quot;&gt;Lanmark Engineering&lt;&#x2F;h2&gt;
&lt;h3&gt;Electrical and Instrumentation Control Internship&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z&quot; &#x2F;&gt;  &lt;path d=&quot;M15 5.764v15&quot; &#x2F;&gt;  &lt;path d=&quot;M9 3.236v15&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Calgary, AB (Remote)&lt;br&gt;
&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M16 14v2.2l1.6 1&quot; &#x2F;&gt;  &lt;path d=&quot;M16 2v4&quot; &#x2F;&gt;  &lt;path d=&quot;M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5&quot; &#x2F;&gt;  &lt;path d=&quot;M3 10h5&quot; &#x2F;&gt;  &lt;path d=&quot;M8 2v4&quot; &#x2F;&gt;  &lt;circle cx=&quot;16&quot; cy=&quot;16&quot; r=&quot;6&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; June 2022 - September 2022&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Verification of cathodic protection systems on pipeline segments and meter stations.&lt;&#x2F;li&gt;
&lt;li&gt;Redline markups of drawing packages in Bluebeam Revu.&lt;&#x2F;li&gt;
&lt;li&gt;Generation of construction scopes of work.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;vernon-communications-ltd&quot;&gt;Vernon Communications Ltd.&lt;&#x2F;h2&gt;
&lt;h3&gt;Radio Systems and Electronics Repair Tech&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z&quot; &#x2F;&gt;  &lt;path d=&quot;M15 5.764v15&quot; &#x2F;&gt;  &lt;path d=&quot;M9 3.236v15&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Vernon, BC&lt;br&gt;
&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M16 14v2.2l1.6 1&quot; &#x2F;&gt;  &lt;path d=&quot;M16 2v4&quot; &#x2F;&gt;  &lt;path d=&quot;M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5&quot; &#x2F;&gt;  &lt;path d=&quot;M3 10h5&quot; &#x2F;&gt;  &lt;path d=&quot;M8 2v4&quot; &#x2F;&gt;  &lt;circle cx=&quot;16&quot; cy=&quot;16&quot; r=&quot;6&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; May 2022 - September 2022&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Installation and configuration of VHF and UHF radio repeater telecommunication systems.&lt;&#x2F;li&gt;
&lt;li&gt;Electronic circuit analysis, troubleshooting, and repair of mobile and portable radio devices.&lt;&#x2F;li&gt;
&lt;li&gt;General electronics repair such as uninterrupted power delivery systems and audio amplifiers.&lt;&#x2F;li&gt;
&lt;li&gt;Mobile radio installations for commercial vehicles and trucks.&lt;&#x2F;li&gt;
&lt;li&gt;Automotive whip antenna tuning with use of antenna analyzers.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;tekmar-control-systems-ltd&quot;&gt;Tekmar Control Systems Ltd.&lt;&#x2F;h2&gt;
&lt;h3&gt;Manufacturer&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z&quot; &#x2F;&gt;  &lt;path d=&quot;M15 5.764v15&quot; &#x2F;&gt;  &lt;path d=&quot;M9 3.236v15&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Vernon, BC&lt;br&gt;
&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M16 14v2.2l1.6 1&quot; &#x2F;&gt;  &lt;path d=&quot;M16 2v4&quot; &#x2F;&gt;  &lt;path d=&quot;M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5&quot; &#x2F;&gt;  &lt;path d=&quot;M3 10h5&quot; &#x2F;&gt;  &lt;path d=&quot;M8 2v4&quot; &#x2F;&gt;  &lt;circle cx=&quot;16&quot; cy=&quot;16&quot; r=&quot;6&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; June 2021 - September 2021&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Troubleshooting and repairing of damaged products - reflow and soldering components under microscope.&lt;&#x2F;li&gt;
&lt;li&gt;Assembling electronic HVAC components and control boards.&lt;&#x2F;li&gt;
&lt;li&gt;Soldering surface mount and through hole components to PCBs.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;selfdesign-learning-foundation&quot;&gt;SelfDesign Learning Foundation&lt;&#x2F;h2&gt;
&lt;h3&gt;Math, Physics, and Electronics Tutor&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z&quot; &#x2F;&gt;  &lt;path d=&quot;M15 5.764v15&quot; &#x2F;&gt;  &lt;path d=&quot;M9 3.236v15&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Vancouver, BC (Remote)&lt;br&gt;
&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M16 14v2.2l1.6 1&quot; &#x2F;&gt;  &lt;path d=&quot;M16 2v4&quot; &#x2F;&gt;  &lt;path d=&quot;M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5&quot; &#x2F;&gt;  &lt;path d=&quot;M3 10h5&quot; &#x2F;&gt;  &lt;path d=&quot;M8 2v4&quot; &#x2F;&gt;  &lt;circle cx=&quot;16&quot; cy=&quot;16&quot; r=&quot;6&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; January 2021 - July 2023&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;(Sep 2022 - July 2023)&lt;&#x2F;em&gt; Tutoring students in Pre-Calculus 12, Digital Logic Design, and Electronics.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;(Sep 2021 - Apr 2022)&lt;&#x2F;em&gt; Tutoring students in Physics 12 and Pre-Calculus 11.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;(Jan 2021 - May 2021)&lt;&#x2F;em&gt; Tutoring students in Physics 11 and Electronics.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;tekmar-control-systems-ltd-1&quot;&gt;Tekmar Control Systems Ltd.&lt;&#x2F;h2&gt;
&lt;h3&gt;Manufacturer&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z&quot; &#x2F;&gt;  &lt;path d=&quot;M15 5.764v15&quot; &#x2F;&gt;  &lt;path d=&quot;M9 3.236v15&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Vernon, BC&lt;br&gt;
&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M16 14v2.2l1.6 1&quot; &#x2F;&gt;  &lt;path d=&quot;M16 2v4&quot; &#x2F;&gt;  &lt;path d=&quot;M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5&quot; &#x2F;&gt;  &lt;path d=&quot;M3 10h5&quot; &#x2F;&gt;  &lt;path d=&quot;M8 2v4&quot; &#x2F;&gt;  &lt;circle cx=&quot;16&quot; cy=&quot;16&quot; r=&quot;6&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; June 2020 - September 2020&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Assembling electronic HVAC components and control boards.&lt;&#x2F;li&gt;
&lt;li&gt;Soldering surface mount and through hole components to PCBs.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Any new or current positions will be shown at the top.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Web Portfolio&#x2F;CV Website</title>
        <published>2025-02-16T00:00:00+00:00</published>
        <updated>2025-02-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/posts/mkdocs-cv/"/>
        <id>https://mikebell.cc/posts/mkdocs-cv/</id>
        
        <content type="html" xml:base="https://mikebell.cc/posts/mkdocs-cv/">&lt;h1 id=&quot;web-portfolio-cv-website&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#web-portfolio-cv-website&quot; aria-label=&quot;Anchor link for: web-portfolio-cv-website&quot;&gt;Web Portfolio&#x2F;CV Website&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Once my co-op terms came to a close, I wanted an easier way to show off my projects, work history, and other information, ouside of my Resume. I had been struggling to pick skills and projects to show off on my Resume, so I thought why not throw it onto a website and reference to that!&lt;&#x2F;p&gt;
&lt;p&gt;I had already made my &lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;posts&#x2F;mkdocs-cv&#x2F;23_etoolbox_site.md&quot;&gt;Etoolbox&lt;&#x2F;a&gt; website from scratch, how hard could this be? Well I didn&#x27;t know what I was getting myself into.&lt;&#x2F;p&gt;
&lt;p&gt;Thankfully, I discovered the existence of Static site generators -- more specifically a tool by the name of MkDocs. This was a static site generator that runs using :simple-python: Python, and utilizes :simple-markdown: Markdown to create each page.&lt;&#x2F;p&gt;
&lt;p&gt;I was a big fan of using Markdown for creating each page because it meant I can spend more time writing about my projects and less time adjusting HTML elements and playing around with CSS styling.&lt;&#x2F;p&gt;
&lt;p&gt;The MkDocs site started out a little bland, but eventually I was able to incorporate it into my project plans, updating my blog page as I worked on projects.&lt;&#x2F;p&gt;
&lt;p&gt;2025-02-16&lt;&#x2F;p&gt;
&lt;h2 id=&quot;setup&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#setup&quot; aria-label=&quot;Anchor link for: setup&quot;&gt;Setup&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I used &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;squidfunk.github.io&#x2F;mkdocs-material&#x2F;&quot;&gt;MkDocs Material&lt;&#x2F;a&gt; by &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;squidfunk&quot;&gt;squidfunk&lt;&#x2F;a&gt;. It was sleek looking, and had a wide variety of features, themes, and plugins.&lt;&#x2F;p&gt;
&lt;p&gt;MkDocs utilizes a file named &lt;code&gt;mkdocs.yml&lt;&#x2F;code&gt; to configure the site. In this file I include the extensions I want, the plugins, and configure themes. Additionally, in the yaml configuration file, I specifiy the navigation tree and define the markdown files I want to display on the site.&lt;&#x2F;p&gt;
&lt;p&gt;Below I show the different Here are some of the plugins, extensions, and features I utilize,&lt;&#x2F;p&gt;
&lt;p&gt;&lt;u&gt;Plugins&lt;&#x2F;u&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;lugins&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; g&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;lightbox&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; s&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;earch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;log&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;nclude-markdown&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;u&gt;Extensions&lt;&#x2F;u&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;m&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;arkdown_extensions&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ttr_list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; m&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;d_in_html&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;dmonition&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; t&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ables&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.details&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.blocks.caption&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.blocks.html&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.details&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.superfences&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.keys&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.arithmatex&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ymdownx.betterem&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		s&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;mart_enable&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ll&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.caret&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.critic&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.tilde&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ymdownx.highlight&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		a&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;nchor_linenums&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		l&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ine_spans&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; _&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;_span&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ygments_lang_class&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.snippets&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ymdownx.tabbed&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		a&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;lternate_style&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.inlinehilite&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.magiclink&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.mark&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ymdownx.smartsymbols&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ymdownx.tasklist&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		c&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ustom_checkbox&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ymdownx.emoji&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		e&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;moji_index&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; !!python&#x2F;name:material.extensions.emoji.twemoji&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		e&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;moji_generator&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; !!python&#x2F;name:material.extensions.emoji.to_svg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		o&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ptions&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;			c&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ustom_icons&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;				-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; d&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ocs&#x2F;overrides&#x2F;.icons&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt; t&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;oc&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ermalink&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		t&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;oc_depth&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;u&gt;Themes &amp;amp; Features&lt;&#x2F;u&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;	f&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;eatures&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;		-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; n&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;avigation.tabs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;		-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; n&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;avigation.sections&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;		-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; n&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;avigation.top&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;		-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; n&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;avigation.path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;		-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; t&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;oc.follow&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;		-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; c&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ontent.tabs.link&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;		-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; n&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;avigation.footer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;		-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; s&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;earch.highlight&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;	p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;alette&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;	#&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Palette toggle for automatic mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt; m&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;edia&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;(prefers-color-scheme)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;	p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;rimary&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;lack&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;	a&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ccent&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;lue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;	t&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;oggle&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		i&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;con&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; m&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;aterial&#x2F;brightness-auto&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		n&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ame&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; S&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;witch to light mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;	#&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Palette toggle for light mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	-&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt; m&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;edia&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;(prefers-color-scheme: light)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;	p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;rimary&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;lack&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;	a&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ccent&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;lue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;	s&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;cheme&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; d&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;efault&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;	t&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;oggle&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		i&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;con&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; m&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;aterial&#x2F;brightness-7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;		n&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ame&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; S&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;witch to dark mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With the site setup complete, I began writing my project and about sections.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hosting-the-site&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hosting-the-site&quot; aria-label=&quot;Anchor link for: hosting-the-site&quot;&gt;Hosting the site&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;To host the site, I needed to generate it first. As I write the markdown pages, I could preview how the site would look by running the &lt;code&gt;mkdocs serve&lt;&#x2F;code&gt; command in powershell, but eventually for simplicity I turned it into a simple batch script to click on.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;bat&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;@&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; off&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mkdocs serve --livereload --watch-theme&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;pause&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;When I was ready to host the site, I chose to use Cloudflare, as I could host a static webpage for free so long as it is under 20,000 files, and each file is under 25 MB each.&lt;&#x2F;p&gt;
&lt;p&gt;The challenge came when I would write a project page that includes a video. I would always exceed the 25 MB file size and spend time searching for which file was the culprit. To do some pre-screening, I wrote a batch script that checks all the file sizes, and if all are under the file size limit, builds the site, compresses it, and gets it ready for upload to Cloudflare.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;bat&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;@&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; off&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; make site&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mkdocs build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Get Current time&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;f &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;%%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;powershell -NoProfile -Command &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Get-Date -Format yyyy-MM-dd_HHmm&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; do&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; set&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;fullstamp&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;%%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Make sure all files are less than 25 MB as per CloudFlares requirements for pages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;setlocal&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; enabledelayedexpansion&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; SEARCH_DIR&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;~dp0&lt;&#x2F;span&gt;&lt;span&gt;site\&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; FILE_SIZE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;24000000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; COUNTER&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;FILE_SIZE&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; findstr&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;\&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;[0-9][0-9]*\&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; NUL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; errorlevel&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span&gt; Usage: &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;~nx0&lt;&#x2F;span&gt;&lt;span&gt; directory file_size_in_bytes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span&gt; Lists all files in given directory and its subdirectories larger than given size.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    exit&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;b &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; not&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; exist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;SEARCH_DIR&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;SEARCH_DIR&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; does not exist.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    exit&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;b &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;R &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;SEARCH_DIR&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; %%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;F&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;*&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; do&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; exist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;%%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;F&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; if&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; %%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;~zF&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; GEQ&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; %&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;FILE_SIZE&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; %%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;F&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; set&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;A &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;COUNTER&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;COUNTER&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; %&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;COUNTER&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; GTR&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;	echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; %&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;COUNTER&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt; Files greater than &lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;FILE_SIZE&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt; bytes found.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;	pause&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;	exit&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;b &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span&gt; site&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tar acvf &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;..&#x2F;site_&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;fullstamp&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;%&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;.zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; *&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span&gt; ..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;REM&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; rmdir &#x2F;S &#x2F;Q site&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;timeout&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;t &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A disclaimer, some of the script is bodged together by various sources on StackOverflow. But it still works to this day, and catches all files that are larger than the file limit, saving me my time and sanity.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;Conclusion&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I don&#x27;t have too much else to write about on this project, as it was more of a laundry-list item relative to the rest of my projects. I enjoy the functionality it provides me, and was very easy to get set up.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Lego Classification using Machine Learning</title>
        <published>2024-12-07T00:00:00+00:00</published>
        <updated>2024-12-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/24-engr-418-ml/"/>
        <id>https://mikebell.cc/projects/24-engr-418-ml/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/24-engr-418-ml/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h1&gt;
&lt;p&gt;For the final project in my ENGR 418 Machine Learning course, I built a Python-based computer vision system to identify and sort Lego bricks on a moving conveyor belt. The project simulates an industrial automation challenge. An optical sensor captures images of items moving along a conveyor belt, categorizes them using a machine learning algorithm, and routes them to their correct destinations based on their classification.&lt;&#x2F;p&gt;
&lt;p&gt;The core focus of this project was the development and optimization of the classification pipeline. Working with RGB images, the system was trained to identify and sort four distinct Lego shapes from a top-down view: 2x4 rectangles, 2x2 squares, 2x2 circles, and 2x1 rectangles.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;legos_description.png&quot; width=90% alt=&quot;Example of the lego brick images&quot;&#x2F;&gt;
  &lt;figcaption&gt;Example of the lego brick images&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The project was split into two distinct phases, moving from a basic raw-pixel model to a more robust, feature-engineered solution.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;core-technologies&quot;&gt;Core Technologies&lt;&#x2F;h2&gt;
&lt;p&gt;This project was done entirely using the Python programming language.&lt;&#x2F;p&gt;
&lt;p&gt;The Libraries used for this project were:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; os&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; numpy&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; as&lt;&#x2F;span&gt;&lt;span&gt; np&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; pandas&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; as&lt;&#x2F;span&gt;&lt;span&gt; pd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; matplotlib&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;pyplot&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; as&lt;&#x2F;span&gt;&lt;span&gt; plt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; sklearn&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;linear_model&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; LogisticRegression&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; sklearn&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;metrics&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; confusion_matrix&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; accuracy_score&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; PIL&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; Image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; PIL&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; ImageFilter&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; PIL&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; ImageEnhance&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Computer vision libraries like &lt;u&gt;OpenCV were prohibited&lt;&#x2F;u&gt; for this project.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;skills-demonstrated&quot;&gt;Skills Demonstrated&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Image Processing:&lt;&#x2F;strong&gt; Grayscale conversion, resizing, and cropping using Python.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Feature Engineering:&lt;&#x2F;strong&gt; Extracting spatial and geometric properties from images to handle rotation and misalignment.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Model Optimization:&lt;&#x2F;strong&gt; Designing efficient ML models under strict hardware and parameter constraints.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Validation:&lt;&#x2F;strong&gt; Evaluating performance using confusion matrices and accuracy scores on separate training and testing sets.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;stage-1-raw-image-classification&quot;&gt;Stage 1 - Raw Image Classification&lt;&#x2F;h1&gt;
&lt;p&gt;In this stage, I built a 4-class classifier using raw image data. This phase used an idealized dataset where all the Lego bricks were perfectly centered and oriented in the same direction.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;u&gt;Preprocessing:&lt;&#x2F;u&gt; Raw RGB images were converted to grayscale, scaled, and cropped into a uniform $64\times64$ pixel input.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;u&gt;Constraints:&lt;&#x2F;u&gt; To keep the model lightweight, the architecture was restricted to fewer than 4,097 trainable parameters (weights) per class.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;image-processing&quot;&gt;Image Processing&lt;&#x2F;h2&gt;
&lt;p&gt;Because the model had to rely entirely on raw pixel values rather than engineered geometric features, image preprocessing was critical to standardize the inputs.&lt;&#x2F;p&gt;
&lt;p&gt;The original RGB images were converted to grayscale to reduce unnecessary color channels and minimize computational complexity. Images were scaled and cropped into a uniform $64 \times 64$ pixel resolution. The final $64 \times 64$ grayscale images were flattened into a 4,096-dimensional input vector ($64 \times 64 = 4,096$), matching the parameter limit per class.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;stage1_proc_img.png&quot; width=35% alt=&quot;Processed image ready for classification&quot;&#x2F;&gt;
  &lt;figcaption&gt;Processed Image ready for Classification&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;model-architecture-and-implementation&quot;&gt;Model Architecture and Implementation&lt;&#x2F;h2&gt;
&lt;p&gt;I implemented a 4-class Logistic Regression model using a One-vs-Rest (OvR) approach. By flattening the images to 4,096 pixels, the model utilized exactly 4,096 weights plus 1 bias parameter per class, optimizing the architecture right up to the allowable threshold.&lt;&#x2F;p&gt;
&lt;p&gt;The code was structured cleanly in a Python notebook with modular cells separating the workflows:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;u&gt;Data Ingestion:&lt;&#x2F;u&gt; Built a robust function to dynamically read all files within the training and testing directories without assuming a fixed dataset size.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;u&gt;Training and Evaluation:&lt;&#x2F;u&gt; The model was trained exclusively on the training folder dataset. Its performance was evaluated using a confusion matrix and overall accuracy to track classification errors across the four shapes.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;u&gt;Testing Function:&lt;&#x2F;u&gt; I packaged the final trained model into a standalone, callable function, &lt;code&gt;test_function&lt;&#x2F;code&gt;, allowing external test paths to be passed seamlessly for grading and validation.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Plotting the weights as images, the &quot;memory&quot; of each class can be seen after the model has learned. The figure below shows the weights for 2x4 rectangles, 2x2 squares, 2x2 circles, and 2x1 rectangles in order from left to right.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;stage1_weights.png&quot; width=90% alt=&quot;First stage regression model weights&quot;&#x2F;&gt;
  &lt;figcaption&gt;First stage regression model weights&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;model-accuracy&quot;&gt;Model Accuracy&lt;&#x2F;h2&gt;
&lt;p&gt;The model achieved exceptional classification performance across both datasets, capturing the raw pixel boundaries with high precision. It reached a perfect 100% accuracy on the training data, while maintaining a robust 98.6% accuracy when evaluated on the unseen test images.&lt;&#x2F;p&gt;
&lt;p&gt;Because Stage 1 used an idealized dataset where all pieces were perfectly centered and uniformly aligned, the model easily mapped the raw pixel boundaries of each shape. To gain further insight into the innaccuracies, a confusion matrix was generated.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;stage1_confusion_matrix.png&quot; width=35% alt=&quot;First stage confusion matrix&quot;&#x2F;&gt;
  &lt;figcaption&gt;First stage confusion matrix&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Breaking down what this matrix means:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Row 1 (Actual 2x1 Rectangles): 18 images were tested, and all 18 were correctly predicted as 2x1 rectangles.&lt;&#x2F;li&gt;
&lt;li&gt;Row 2 (Actual 2x2 Circles): 18 images were tested, and all 18 were correctly predicted as circles.&lt;&#x2F;li&gt;
&lt;li&gt;Row 3 (Actual 2x4 Rectangles): 18 images were tested, and all 18 were correctly predicted as 2x4 rectangles.&lt;&#x2F;li&gt;
&lt;li&gt;Row 4 (Actual 2x2 Squares): 18 images were tested. 17 were correctly predicted as squares, but 1 square image was incorrectly predicted as a circle (falling under Column 2, which corresponds to the 2x2 circles).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This means there is an occasional misclassifications occurring between the 2x2 square and 2x2 circle. Because they share the same stud count and general aspec ratio, the model sometimes confuses the two lego pieces.&lt;&#x2F;p&gt;
&lt;p&gt;A lightweight Logistic Regression model using exactly 4,096 weights per class is highly effective for industrial sorting under strict, controlled environmental conditions. However, this total reliance on raw pixel locations meant the model lacked spatial flexibility, making it vulnerable to the rotation and displacement introduced in Stage 2.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;stage-2-handling-real-world-variance&quot;&gt;Stage 2 - Handling Real-World Variance&lt;&#x2F;h1&gt;
&lt;p&gt;When tested against a more realistic dataset containing uncentered and randomly rotated Lego bricks, the baseline Stage 1 model failed. The objective for Stage 2 was to overhaul the processing pipeline to make the classifier translation and rotation invariant.&lt;&#x2F;p&gt;
&lt;p&gt;Hardware constraints were tightened further to simulate edge computing limits. Instead of 4,096 weights, the model was strictly limited to a maximum of 40 engineered features per image.&lt;&#x2F;p&gt;
&lt;p&gt;Instead of feeding raw pixels into the model, I extracted the geometric features of each image to make the system rotation and translation invariant.&lt;&#x2F;p&gt;
&lt;p&gt;Using 7 engineered features to train a 4-class logistic regression classifier, I generated a model that could accurately sort the displaced and rotated bricks with minimal processing overhead.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;image-processing-1&quot;&gt;Image Processing&lt;&#x2F;h2&gt;
&lt;p&gt;To extract clean geometric data regardless of a brick&#x27;s position or rotation, I built a robust computer vision pipeline using Python&#x27;s Pillow library. The raw images were passed through the following sequential filters:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;u&gt;Contrast and Normalization:&lt;&#x2F;u&gt; Enhanced contrast by a factor of 1.35 and stretched the pixel values to occupy the full 0 to 255 grayscale range.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;u&gt;Noise Reduction:&lt;&#x2F;u&gt; Applied a sharpness enhancer factor of 1.75 followed by a Gaussian Blur to smooth out visual artifacts.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;u&gt;Edge Detection and Cropping:&lt;&#x2F;u&gt; Passed the image through a FIND_EDGES filter. To prevent the physical edges of the image boundary from being detected, an absolute padding of 28 pixels was cropped from the perimeter before resizing the image to 64x64 pixels.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;u&gt;Hysteresis Thresholding:&lt;&#x2F;u&gt; Converted the image to pure monochrome using a dual-threshold system to isolate the distinct boundary of the Lego brick.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The figure below shows an example of the image processing on a 2x4 rectangle brick.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;stage2_edge_detection.png&quot; width=70% alt=&quot;Second stage image processing edge detection&quot;&#x2F;&gt;
  &lt;figcaption&gt;Second stage image processing edge detection&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;feature-engineering&quot;&gt;Feature Engineering&lt;&#x2F;h2&gt;
&lt;p&gt;To measure features from the processed images, I wrote an algorithm to explicitly measure the geometric properties of the shapes.&lt;&#x2F;p&gt;
&lt;p&gt;The system programmatically rotated the processed edge-detected image through 16 angles (22.5 degree increments). At each angle, the algorithm calculated the bounding box width and height by summing the non-zero pixels across the horizontal and vertical axes. From this rotational sweep, I distilled the data down to just 7 engineered features:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Maximum relative height across all rotations.&lt;&#x2F;li&gt;
&lt;li&gt;Minimum relative height across all rotations.&lt;&#x2F;li&gt;
&lt;li&gt;Maximum relative width across all rotations.&lt;&#x2F;li&gt;
&lt;li&gt;Minimum relative width across all rotations.&lt;&#x2F;li&gt;
&lt;li&gt;Maximum absolute difference between width and height.&lt;&#x2F;li&gt;
&lt;li&gt;Aspect ratio based on minimum width and maximum height.&lt;&#x2F;li&gt;
&lt;li&gt;Aspect ratio based on maximum width and minimum height.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;vert_horiz_pixel_count.png&quot; width=30% alt=&quot;Example of height and width measurements&quot;&#x2F;&gt;
  &lt;figcaption&gt;Example of height and width measurements&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;model-architecture&quot;&gt;Model Architecture&lt;&#x2F;h2&gt;
&lt;p&gt;By feeding only these 7 engineered features into an optimized Logistic Regression model (tuned with C=18), the system achieved outstanding performance and completely overcame the spatial variance issues.&lt;&#x2F;p&gt;
&lt;p&gt;To evaluate how the model was making its decisions, I visualized the logistic regression weights using a heatmap.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Y-Axis (Target Classes): &lt;code&gt;0.&lt;&#x2F;code&gt; 2x1 Rectangles, &lt;code&gt;1.&lt;&#x2F;code&gt; 2x2 Circles, &lt;code&gt;2.&lt;&#x2F;code&gt; 2x4 Rectangles, and &lt;code&gt;3.&lt;&#x2F;code&gt; 2x2 Squares.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;X-Axis (Engineered Features): The zero-indexed geometric features defined in the previous section.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This tool made it incredibly easy to see which specific features carried the most weight for classifying each distinct shape.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;model_weights_fig.png&quot; width=60% alt=&quot;Heatmap of model weights against classes and features&quot;&#x2F;&gt;
  &lt;figcaption&gt;Heatmap of model weights against classes and features&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;model-accuracy-1&quot;&gt;Model Accuracy&lt;&#x2F;h2&gt;
&lt;p&gt;The model achieved an amazing classification performance across both training and testing datasets. Using 7 features, the model achieved an accuracy of &lt;code&gt;94.4%&lt;&#x2F;code&gt; when classifying its training dataset, and an accuracy of &lt;code&gt;95.3%&lt;&#x2F;code&gt; when classifying a new testing dataset.&lt;&#x2F;p&gt;
&lt;p&gt;Out of 108 test images, the model misclassified only 5 pieces. The 2x4 rectangles and 2x2 circles were identified with near-perfect accuracy because their shape profiles are highly distinct.&lt;&#x2F;p&gt;
&lt;p&gt;The few misclassifications that did occur were between the 2x1 rectangles and the 2x2 squares. Under extreme rotations, edge shadows slightly skewed the bounding box ratios, occasionally causing the model to mistake one shape for the other.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;stage2_test_data_confusion_matrix.png&quot; width=35% alt=&quot;Second stage confusion matrix&quot;&#x2F;&gt;
  &lt;figcaption&gt;Second stage confusion matrix&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Rows indicate the class of the input and columns indicate the resulting classification the model provides.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;This system successfully proved that strategic image processing can resolve complex spatial noise with minimal computing power. Filtering out background artifacts allowed for the extraction of highly accurate, rotation-invariant bounding box metrics. Using just seven engineered geometric features, the model achieved a robust 95.3% testing accuracy on misaligned and rotated items. This minimal feature footprint ensures maximum processing speeds, making it an ideal, production-ready solution for real-time sorting on high-speed industrial conveyor belts.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Switchmode Power Supply Project</title>
        <published>2024-11-27T00:00:00+00:00</published>
        <updated>2024-11-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/24-engr-458-smps/"/>
        <id>https://mikebell.cc/projects/24-engr-458-smps/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/24-engr-458-smps/">&lt;p&gt;During my ENGR 458 Power Electronics course, I participated in a mini project where my group built a physical DC-DC boost converter from scratch on a breadboard. We designed the system to convert a +12 V input into a +48 V output, capable of delivering 10 W of power to a 233 ohm load. Operating at a switching frequency of 100 kHz, the converter was strictly optimized to keep the output voltage ripple under 1%.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;dc-dc-smps-design-test&quot;&gt;DC-DC SMPS Design &amp;amp; Test&lt;&#x2F;h1&gt;
&lt;p&gt;The circuit design follows a standard boost converter topology utilizing specific power components. An &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;assets.nexperia.com&#x2F;documents&#x2F;data-sheet&#x2F;PHP23NQ11T.pdf&quot;&gt;NXP PHP23NQ11T&lt;&#x2F;a&gt; N-channel power MOSFET serves as the primary switch, driven by a &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ww1.microchip.com&#x2F;downloads&#x2F;en&#x2F;DeviceDoc&#x2F;mic4420.pdf&quot;&gt;MICREL MIC4420&lt;&#x2F;a&gt; low side driver capable of delivering a 6 A peak output current. For rectification, an &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.smc-diodes.com&#x2F;propdf&#x2F;12TQ080(100)(S)%20N0663%20REV.A.pdf&quot;&gt;SMC 12TQ100&lt;&#x2F;a&gt; Schottky diode was selected due to its 15 A forward current capability.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;schematic.png&quot; width=90% alt=&quot;Switching driver and boost converter circuit schematic&quot;&#x2F;&gt;
  &lt;figcaption&gt;Switching driver and boost converter circuit schematic&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The passive components are quite simple. The capacitor used was a 560 uF Aluminum Electrolytic capacitor rated for 80 V. The inductor was hand-wound on a &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.tdk-electronics.tdk.com&#x2F;inf&#x2F;80&#x2F;db&#x2F;fer&#x2F;r_34_0_20_5_10_0.pdf&quot;&gt;TDK B64290L0058X830&lt;&#x2F;a&gt; ferrite toroid. The target inductance was between 35 mH and 54 mH. Given the toroid has an AL value of 4.36 uH (+&#x2F;- 25%) we calculated the number of turns to be around 100 turns.&lt;&#x2F;p&gt;
&lt;p&gt;The passive component selection focused on power handling and stability. Output filtering is provided by an 80 V rated, 560 μF aluminum electrolytic capacitor. The inductor was custom fabricated by hand winding 28 AWG insulated wire onto a &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.tdk-electronics.tdk.com&#x2F;inf&#x2F;80&#x2F;db&#x2F;fer&#x2F;r_34_0_20_5_10_0.pdf&quot;&gt;TDK B64290L0058X830&lt;&#x2F;a&gt; ferrite toroid. To meet the target inductance range of 35 mH to 54 mH with the core&#x27;s $A_L$ value of 4.36 μH (± 25%), approximately 100 turns were applied. The final inductance value was verified in the lab using an LC meter. Additionally, a 5 W, 1 Ω resistor was placed in series before the inductor to safely facilitate current measurements.&lt;&#x2F;p&gt;
&lt;p&gt;Using 28 AWG insulated wire we wound the inductor and tested the inductance using an LC-meter in the lab.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;inductor_lc_meter.webp&quot; width=40% alt=&quot;Testing inductors inductance using an LC meter&quot;&#x2F;&gt;
  &lt;figcaption&gt;Testing inductors inductance using an LC meter&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;breadboard-prototype&quot;&gt;Breadboard Prototype&lt;&#x2F;h2&gt;
&lt;p&gt;Once all components were prepared the MOSFET driver and boost converter circuits were prototyped on a solderless breadboard. To minimize parasitic resistances, switching noise, and EMI, which are common challenges in breadboard layouts, the high current transition ($di&#x2F;dt$) paths connecting the power switch, rectifier diode, and filtering capacitor were kept as short and compact as possible.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;breadboard_circuit.webp&quot; width=90% alt=&quot;Boost converter breadboard circuit&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;breadboard_circuit_connected.webp&quot; width=90% alt=&quot;Boost converter breadboard circuit powered&quot;&#x2F;&gt;
  &lt;figcaption&gt;The complete boost converter circuit on a breadboard&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;measurements-and-performance&quot;&gt;Measurements and Performance&lt;&#x2F;h2&gt;
&lt;p&gt;To make measurements on the circuit, we used a &lt;u&gt;Tektronix TDS 2012B&lt;&#x2F;u&gt; Digital Oscilloscope, &lt;u&gt;Rigol DM3058E&lt;&#x2F;u&gt; Digital Multimeter and &lt;u&gt;BK Precision 2880B&lt;&#x2F;u&gt; Digital Multimeter. Additionally, the function generator used to generate the 100 kHz switching signal was a &lt;u&gt;BK Precision 4011A&lt;&#x2F;u&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Following the lab manual, we first measured the voltage across the inductor which was about 48 V peak to peak. We then measured the current through the inductor as 0.940 $A_{RMS}$.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;inductor_voltage_marker.webp&quot; width=45% alt=&quot;Measured voltage across the inductor&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;inductor_current.webp&quot; width=45% alt=&quot;Measured current through the inductor&quot;&#x2F;&gt;
  &lt;figcaption&gt;Measured the inductors voltage (left) and current (right)&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;We monitored the active components by measuring the operational current waveforms of the MOSFET and the diode. The current through the MOSFET was measured to have 1.2 A running through it. The peak diode current was measured to be 768 mA.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;switch_current.webp&quot; width=45% alt=&quot;Switch current measurement&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;diode_current_measure.webp&quot; width=45% alt=&quot;Diode current measurement&quot;&#x2F;&gt;
  &lt;figcaption&gt;Measured the current through the MOSFET (left) and Diode (right)&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Capacitor current was also measured to evaluate the output stage. The peak current into the capacitor reached 768 mA, matching the peak forward current of the diode as expected from the circuit topology.&lt;&#x2F;p&gt;
&lt;p&gt;Finally the resulting voltage output was measured. Maintaining a duty cycle around 78%, we achieved a voltage output of 49.8 V given an input voltage of 13.3 V.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;vin_vout_measure.webp&quot; width=90% alt=&quot;Input-Output voltage measurement&quot;&#x2F;&gt;
  &lt;figcaption&gt;Input Voltage (yellow) and Output Voltage (blue)&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;challenges&quot;&gt;Challenges&lt;&#x2F;h2&gt;
&lt;p&gt;One of the primary practical challenges during the build was managing voltage ringing across the MOSFET. The rapid switching transitions ($di&#x2F;dt$) interact with stray circuit inductances and parasitic capacitances, creating resonant ringing when the device turns off. These voltage spikes can easily exceed the MOSFET&#x27;s maximum drain to source voltage rating ($V_{DS}$). We verified this behavior by measuring the voltage waveform directly across the switch.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;switch_voltage.webp&quot; width=90% alt=&quot;MOSFET voltage measurement&quot;&#x2F;&gt;
  &lt;figcaption&gt;Voltage spikes across the MOSFET&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;During switching transitions, excessive voltage ringing pushed the MOSFET dangerously close to its maximum breakdown voltage. A recommended future improvement is to integrate an RC snubber circuit across the power switch. The snubber would dampen the high frequency ringing caused by parasitic circuit elements, absorbing the transient energy and converting it to heat to protect the semiconductor from overvoltage failure.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;This lab project provided an invaluable bridging experience between theoretical power electronics and practical hardware design. Building the circuit was highly engaging and personally nostalgic, reminiscent of an early high school project where I attempted to build a boost converter without understanding the underlying mathematics. While that early prototype worked largely by chance, this course has equipped me with the analytical tools to precisely calculate, model, and predict system behavior. Ultimately, designing and prototyping this 100 kHz converter served as excellent practice in component selection, layout optimization, and hardware debugging.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Etoolbox Calculator Website</title>
        <published>2024-08-25T00:00:00+00:00</published>
        <updated>2024-08-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/23-etoolbox-site/"/>
        <id>https://mikebell.cc/projects/23-etoolbox-site/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/23-etoolbox-site/">&lt;p&gt;After my third year of undergraduate studies, just before going on my co-op work terms, I had a collection of electronics calculator tools coded for MATLAB.&lt;&#x2F;p&gt;
&lt;p&gt;I always turned to the internet when I wanted to quickly calculate various values for different applications, such as the reactances of inductors or capacitors, or general equations. While using an off the shelf calculator and paper would be enough, it takes some extra time, unlike a website which is a click away.&lt;&#x2F;p&gt;
&lt;p&gt;With the collection of MATLAB calculator scripts, I wanted to translate them over to a webpage I could host on github. In addition to the speed at which one can access an online calculator, I saw this as a way to make my own personalized toolbox for improving my efficiency and workflow.&lt;&#x2F;p&gt;
&lt;p&gt;Now there was only one problem... I&#x27;ve never really designed a website before this.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;michael-s-etoolbox-website&quot;&gt;Michael&#x27;s Etoolbox Website&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;the-beginning-learning-javascript&quot;&gt;The Beginning (Learning JavaScript)&lt;&#x2F;h2&gt;
&lt;p&gt;When I started, my first goal was to learn :simple-javascript: JavaScript, as that language is used by all browsers and runs locally on the client side. I did this primarily to not need a server or backend.&lt;&#x2F;p&gt;
&lt;p&gt;I had a handfull of MATLAB scripts to translate to JavaScript, so I converted them one-by-one. Initially the scripts I had made were:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Closest Standard Value&lt;&#x2F;strong&gt; - Given an arbitrary resistance value, output the closest industry standard value defined by the E-series of preferred numbers (defined in the IEC 60063 standard).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Combination Calculator&lt;&#x2F;strong&gt; - A tool that will bruteforce a combination (series, parallel, series+parallel) of 2 or 3 resistors to achieve a target arbitrary value. This tool also worked with capacitors.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Resistor Div&#x2F;Ratio&lt;&#x2F;strong&gt; - A tool that will return the best resistor values for a resistor divider given a desired voltage, or return the best resistor values for an op-amp feedback loop.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Marking Decoder&lt;&#x2F;strong&gt; - Decodes SMD resistor and capacitor markings based on EIA 3-digit, EIA 4-digit, EIA-96 codes for resistors, and EIA 3-digit, EIA 4-digit, EIA-198 codes for capacitors.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;initial_indexpage.png&quot; width=90% alt=&quot;First revision of the index page&quot;&#x2F;&gt;
  &lt;figcaption&gt;First revision of the index page&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;At the time, my favourite tool was the combination calculator as I saw it more as a &quot;bodgy&quot; prototype centric tool. It was useful when I needed a resistance value in a prototype circuit, but didn&#x27;t have the correct value resistors for it.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;initial_comp_combo.png&quot; width=90% alt=&quot;First component combination calculator page&quot;&#x2F;&gt;
  &lt;figcaption&gt;First component combination calculator page&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Now, I added a total of 7 different calculators by the time I decided the site itself was long due for a makeover. Being that this was the first site I made, I decided to restart (keeping the JavaScript code obviously) and make another version.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-makeover-learning-css&quot;&gt;The Makeover (Learning CSS)&lt;&#x2F;h2&gt;
&lt;p&gt;Up until now, I was putting minimal CSS inside the &lt;code&gt;style=&quot;&quot;&lt;&#x2F;code&gt; option of each element, but I found using a separate cascaded style sheet and classes, I could do a lot more.&lt;&#x2F;p&gt;
&lt;p&gt;Learning :simple-css: CSS was quite fun, as I could just throw different elements in, give them classes, and adjust their properties on a separate document.&lt;&#x2F;p&gt;
&lt;p&gt;In the end, the resulting site looked a bit sleeker and less early 2000&#x27;s.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;stylized_indexpage.png&quot; width=90% alt=&quot;Adding styles to the index page&quot;&#x2F;&gt;
  &lt;figcaption&gt;Adding styles to the index page&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;As you can probably see, I was also busy adding more to the list of calculators. In addition to what I had originally made, I added:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Delta-Wye Resistor Networks&lt;&#x2F;strong&gt; - Calculates the conversion between a delta resistor network and a wye resistor network for real 3-phase loads.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ohms Law Calculator&lt;&#x2F;strong&gt; - A simple Ohms law calculator that will output remaining values of voltage, current, resistance, and power, given 2 inputs.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Three Phase Calculator&lt;&#x2F;strong&gt; - Calculates 3-phase values such as line voltage&#x2F;current, phase voltage&#x2F;current, apparent power, real power, reactive power, phase angle, and power factor, for both delta and wye configurations.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;AC&#x2F;RF Voltage Conversion&lt;&#x2F;strong&gt; - Convert between peak-to-peak voltage, peak voltage, RMS votlage, dBV, dBu, and given a system impedance, calculate all those values given a power in dBm or watts.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Reactance Calculator&lt;&#x2F;strong&gt; - Calculates reactance of an inductor&#x2F;capacitor at a given frequency.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Resonance Calculator&lt;&#x2F;strong&gt; - Calculates the resonant frequency of an LC tank circuit.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Frequency-Wavelength&lt;&#x2F;strong&gt; - Convert between frequency and wavelength in a system, with the ability to define velocity and velocity factor of the wave.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;That was a lot, but all of these calculators were fairly simple to implement.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;adapting-to-mobile-2024&quot;&gt;Adapting to Mobile (2024)&lt;&#x2F;h2&gt;
&lt;p&gt;Now that I was more familiar with JavaScript and CSS (and by technicality HTML), I was fairly comfortable expanding the site and improving fuctionality.&lt;&#x2F;p&gt;
&lt;p&gt;In 2024 I added a lot more tools, and as I was actively using these tools for work, I found my site was terrible on mobile. This meant yet another makeover and more CSS learning. This time I learned about the CSS &lt;code&gt;@media&lt;&#x2F;code&gt; at-rule, which allowed me to change the CSS based on display size.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;modern_indexpage.png&quot; width=74% alt=&quot;Stylized index page.&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;mobile_friendly_indexpage.png&quot; width=24% alt=&quot;Stylized index page.&quot;&#x2F;&gt;
  &lt;figcaption&gt;Improving CSS Styling and adapting to Mobile viewports&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;I also added some crude SVG icons, and using a grid-like list I was able to make each calculator easier to select.&lt;&#x2F;p&gt;
&lt;p&gt;This version is currently the version that is being hosted on github. You can visit my EToolbox on github at &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ve7kwz.github.io&#x2F;etoolbox&#x2F;index.htm&quot;&gt;Michael&#x27;s EToolbox&lt;&#x2F;a&gt; - I will mention however that over time, some calculators have shown bugs that need to be fixed, and&#x2F;or simply don&#x27;t work correctly. I am working on my EToolbox V2, so I will no longer maintain this github page.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;As most of my projects go, I had a goal and learned skills to achieve it. I learned HTML, CSS, and JavaScript in either to bring this site to life, even adding
easter-eggs along the way (&lt;em&gt;seriously, the website has easter eggs! And so does my ePortfolio site youre reading this on!&lt;&#x2F;em&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;I did a lot more work behind the scenes than shown on this page, and spent hours learning both JavaScript and CSS to achieve good asthetics and functionality.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>2023 PCB Design E-Workshop Event</title>
        <published>2023-11-16T00:00:00+00:00</published>
        <updated>2023-11-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/23-eworkshop/"/>
        <id>https://mikebell.cc/projects/23-eworkshop/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/23-eworkshop/">&lt;p&gt;In the autumn of 2023, I volunteered to create and present a printed circuit board (PCB) design workshop for the University of British Columbia Okanagan&#x27;s (UBCO) IEEE McNaughton Learning Resource Center&#x27;s (MLRC) Hackerspace (&lt;em&gt;whew that was a mouthfull!&lt;&#x2F;em&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;Now, I did this the previous year, and while it did have an attendance somewhere in the range of 40 students, it was fairly new and also my first time hosting an in-person event like that.&lt;&#x2F;p&gt;
&lt;p&gt;This newly revised PCB design workshop was simply a polished version of the 2022 EWorkshop.&lt;&#x2F;p&gt;
&lt;p&gt;As for the EDA, I chose to use &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.kicad.org&#x2F;&quot;&gt;KiCAD&lt;&#x2F;a&gt; as it is a free and open source EDA with a reputation as the go-to hobby and startup PCB design software. Additionally, KiCAD is similar enough to industry standard software such as Altium Designer, that it should help students that are unfamiliar with PCB design adapt to various other EDAs.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;DSC_0083.webp&quot; style=&quot;--aspect: 25&#x2F;9;&quot; width=90% alt=&quot;Aisle view&quot;&#x2F;&gt;
  &lt;figcaption&gt;Hosting the Event&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;eworkshop-event-presentation-and-structure&quot;&gt;EWorkshop Event Presentation and Structure&lt;&#x2F;h1&gt;
&lt;p&gt;The workshop was built around the circuit and PCB design, but generally speaking, it covers the following:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Introduction to the KiCAD software - A brief run through of the project creation process.&lt;&#x2F;li&gt;
&lt;li&gt;Drawing schematics, searching for and placing symbols, and editing symbol preferences&#x2F;data and associated footprint.&lt;&#x2F;li&gt;
&lt;li&gt;Sourcing parts from sites like &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.digikey.ca&#x2F;&quot;&gt;DigiKey&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.mouser.ca&#x2F;&quot;&gt;Mouser&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Generating a bill of materials (BOM)&lt;&#x2F;li&gt;
&lt;li&gt;Configuring the PCB editor, setting DRC tolerances, importing footprints, and PCB layout.&lt;&#x2F;li&gt;
&lt;li&gt;Running design rule checks on the final PCB design and exporting gerber (manufacture) files.&lt;&#x2F;li&gt;
&lt;li&gt;Ordering PCB&#x27;s from sites like &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;oshpark.com&#x2F;&quot;&gt;OSH Park&lt;&#x2F;a&gt;, &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.pcbway.com&#x2F;&quot;&gt;PCBway&lt;&#x2F;a&gt;, and &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;jlcpcb.com&#x2F;&quot;&gt;JLCPCB&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;On later dates, students could also come to the hackerspace to learn how to solder the PCBs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;documents&quot;&gt;Documents&lt;&#x2F;h2&gt;
&lt;p&gt;Most of the work went into generating documents such as the presentation, and supplimental docs. I made the presentation and presenter notes to be simple yet informative.&lt;&#x2F;p&gt;
&lt;p&gt;The presentation introduced students into what a printed circuit board consists of, what a stackup is, and some of the history behind PCB&#x27;s.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;projects&#x2F;23-eworkshop&#x2F;media&#x2F;eworkshop_presentation_2023.pdf&quot;&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z&quot; &#x2F;&gt;  &lt;path d=&quot;M14 2v5a1 1 0 0 0 1 1h5&quot; &#x2F;&gt;  &lt;path d=&quot;M10 9H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 13H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 17H8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; EWorkshop Presentation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The supplimental documents took more time, as the information needed to be gathered. The &quot;&lt;em&gt;best practices&lt;&#x2F;em&gt;&quot; documents contain what I believe to be best practices, but that is always subject to change and there are no hard rules. At the end of the day, the goal is to create clean and consistent schematics and PCBs.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;projects&#x2F;23-eworkshop&#x2F;media&#x2F;schematic_design_best_practice.pdf&quot;&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z&quot; &#x2F;&gt;  &lt;path d=&quot;M14 2v5a1 1 0 0 0 1 1h5&quot; &#x2F;&gt;  &lt;path d=&quot;M10 9H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 13H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 17H8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Schematic Design Best Practice&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;projects&#x2F;23-eworkshop&#x2F;media&#x2F;pcb_design_best_practice.pdf&quot;&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z&quot; &#x2F;&gt;  &lt;path d=&quot;M14 2v5a1 1 0 0 0 1 1h5&quot; &#x2F;&gt;  &lt;path d=&quot;M10 9H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 13H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 17H8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; PCB Design Best Practice&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;projects&#x2F;23-eworkshop&#x2F;media&#x2F;ordering_pcbs_and_parts_online.pdf&quot;&gt;&lt;span class=&quot;inline-icon&quot; style=&quot;--icon-size: 1.2em;&quot;&gt;&lt;svg  xmlns=&quot;http:&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg&quot;  width=&quot;24&quot;  height=&quot;24&quot;  viewBox=&quot;0 0 24 24&quot;  fill=&quot;none&quot;  stroke=&quot;currentColor&quot;  stroke-width=&quot;2&quot;  stroke-linecap=&quot;round&quot;  stroke-linejoin=&quot;round&quot;&gt;  &lt;path d=&quot;M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z&quot; &#x2F;&gt;  &lt;path d=&quot;M14 2v5a1 1 0 0 0 1 1h5&quot; &#x2F;&gt;  &lt;path d=&quot;M10 9H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 13H8&quot; &#x2F;&gt;  &lt;path d=&quot;M16 17H8&quot; &#x2F;&gt;&lt;&#x2F;svg&gt;&lt;&#x2F;span&gt; Ordering PCBs and Parts Online&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I have forked the information from the &lt;a href=&quot;&#x2F;notes&#x2F;sch-practices&#x2F;&quot;&gt;&lt;em&gt;schematic design best practice&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; and &lt;a href=&quot;&#x2F;notes&#x2F;pcb-practices&#x2F;&quot;&gt;&lt;em&gt;PCB design best practice&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; to my notes section of my site which has my updated and most recent personal best practices that I employ.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-circuit-and-pcb&quot;&gt;The Circuit and PCB&lt;&#x2F;h1&gt;
&lt;p&gt;To get started on organizing the workshop, I needed a circuit to design. The president of the UBCO IEEE MLRC Hackerspace showed me a decade-old PCB from the previous student that ran the space, and using that as a reference, I came up with the idea of a badge with blinking LED&#x27;s. Simple, yet interesting.&lt;&#x2F;p&gt;
&lt;p&gt;Using a basic astable oscillator design using two NPN BJT&#x27;s I threw together an 8 LED blinking circuit. Using the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.falstad.com&#x2F;circuit&#x2F;circuitjs.html&quot;&gt;Falstad Circuit Simulator&lt;&#x2F;a&gt; I put together a simple animation to demonstrate the circuits operation.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;blinker_sim.gif&quot; width=70% alt=&quot;Blinking circuit simulation&quot;&#x2F;&gt;
  &lt;figcaption&gt;Blinking circuit simulation&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;After, I proceeded to draw the schematic in KiCAD. At the same time, I sourced the parts as needed and included their information (datasheet, footprint, etc.) within each schematic symbols data.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;blinker_schem.png&quot; width=90% alt=&quot;Blinking circuit schematic&quot;&#x2F;&gt;
  &lt;figcaption&gt;Blinking circuit Schematic&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;pcb-layout&quot;&gt;PCB Layout&lt;&#x2F;h2&gt;
&lt;p&gt;Once the schematic and parts were picked out, the PCB was laid out.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;blinker_f_cu.png&quot; width=23% alt=&quot;PCB top copper layer&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;blinker_b_cu.png&quot; width=23% alt=&quot;PCB bottom copper layer&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;blinker_f_silk.png&quot; width=23% alt=&quot;PCB top silkscreen&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;blinker_b_silk.png&quot; width=23% alt=&quot;PCB top silkscreen&quot;&#x2F;&gt;
  &lt;figcaption&gt;Blinking circuit PCB Layout&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The complete PCB will be ordered to have a red solder mask.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;blinker_render_top.png&quot; style=&quot;--aspect: 4&#x2F;3;&quot; width=45% alt=&quot;PCB top render&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;blinker_render_bot.png&quot; style=&quot;--aspect: 4&#x2F;3;&quot; width=45% alt=&quot;PCB bottom render&quot;&#x2F;&gt;
  &lt;figcaption&gt;Render of the blinking circuit PCB&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;workshop-event&quot;&gt;Workshop Event&lt;&#x2F;h1&gt;
&lt;p&gt;The workshop was a success, with an attendance of around 55-60 students. I was able to pace the workshop in such a way that there was plenty of time for questions, help, and tangents.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;DSC_0070.webp&quot; width=45% alt=&quot;Me hosting the event&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;DSC_0074.webp&quot; width=45% alt=&quot;Attendees&quot;&#x2F;&gt;
  &lt;figcaption&gt;Event Photos&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The final result of the PCB workshop was a lovely badge that students could wear, or tie a string to and hang. It could even be used as a Christmas tree ornament!&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;20251016_150239.webp&quot; width=31% alt=&quot;Badge top&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;20251016_150303.webp&quot; width=31% alt=&quot;Badge bottom&quot;&#x2F;&gt;&lt;br&gt;
	&lt;img src=&quot;media&#x2F;blinking_badge.gif&quot; width=31% alt=&quot;Badge blinking&quot;&#x2F;&gt;
  &lt;figcaption&gt;Built PCB Photos&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Custom Racing Simulation Pedal Controller</title>
        <published>2023-10-29T00:00:00+00:00</published>
        <updated>2023-10-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/23-race-sim-pedals/"/>
        <id>https://mikebell.cc/projects/23-race-sim-pedals/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/23-race-sim-pedals/">&lt;p&gt;My younger brother had bought some FANATEC race simulation pedals from Facebook Marketplace, but when he went to set them up, they didn&#x27;t work. After fighting with them for a while, he brought it to me to fix. The issue was in the main board, which had been damaged due to the wrong plugs being inserted in incorrect sockets, which the instructions stated could damage the board.&lt;&#x2F;p&gt;
&lt;p&gt;Because of the damaged main board, I decided that I would build my own main board. To do this I utilized the integrated USB human interface device (HID) support the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ww1.microchip.com&#x2F;downloads&#x2F;en&#x2F;devicedoc&#x2F;atmel-7766-8-bit-avr-atmega16u4-32u4_datasheet.pdf&quot;&gt;Atmel ATmega32u4&lt;&#x2F;a&gt; microprocessor has. The microprocessor development board used was a spin-off of the Arduino pro micro.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;retrofitting-pedal-hardware&quot;&gt;Retrofitting Pedal Hardware&lt;&#x2F;h1&gt;
&lt;p&gt;The pedals consisted of two hall-effect sensor controlled inputs and a load cell input. The center pedal (brake) used a load cell, and the left and right pedal (clutch and acceleration respectively) used analog hall-effect sensors to determine position.&lt;&#x2F;p&gt;
&lt;p&gt;After gutting the internal electronics of each pedal, I began putting together the circuit on a solderless breadboard.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_20231020_215803728.webp&quot; width=90% alt=&quot;Pedals with microprocessor and load cell amplifier&quot;&#x2F;&gt;
  &lt;figcaption&gt;Pedals with microprocessor and load cell amplifier&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;breadboard&quot;&gt;Breadboard&lt;&#x2F;h2&gt;
&lt;p&gt;Since the pedals needed two hall effect sensors and a load cell amplifier, I made the necessary purchases on amazon to get the parts right away. Overall, it only cost me CA$30. I began prototyping by connecting the hall effect sensors to the microprocessors analog input pins. These analog inputs operate on a 10-bit analog-to-digital converter (ADC), allowing for a resolution of around 4.88 mV (at a supply voltage of 5V), which would be plenty for the hall effect sensors.&lt;&#x2F;p&gt;
&lt;p&gt;The load cell required an amplifier to get any useful amount of data from it. The amplifier I used was an &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;static.weylan-d.com&#x2F;resource&#x2F;product&#x2F;02&#x2F;02&#x2F;44649&#x2F;550930419944657565.pdf&quot;&gt;Avia HX711&lt;&#x2F;a&gt;. This amplifier is fairly common and easily sourced, and provided 24-bits of resolution, which was way more than I needed -- I later configured the HX711 in the code to read at a higher speed at cost of the precision.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_20231020_215819370.webp&quot; width=90% alt=&quot;Breadboard prototype of the circuit&quot;&#x2F;&gt;
  &lt;figcaption&gt;Breadboard prototype of the circuit&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;I also included a button for user input. This button allows the user to calibrate the pedals or to reset the calibration to default.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;main-board-design&quot;&gt;Main board design&lt;&#x2F;h2&gt;
&lt;p&gt;The pedals originally had its main board in a box at the bottom of the middle pedal. The goal for me was to fit all my electronics inside that same box. To start I measured out where I needed to make holes, then planned where I would place the components.&lt;&#x2F;p&gt;
&lt;p&gt;Because I was trying to expedite the project and finish it in a day or two, I opted to use perforated proto-board. This meant that the microprocessor development board and HX711 could be placed down as-is (almost)...&lt;&#x2F;p&gt;
&lt;p&gt;To make the HX711 fit on the main board, I had to de-solder the IC from the development board I got from amazon, and transplanted it onto an SOIC to DIP breakout board. This would be easy if I had a hot-plate, but I didn&#x27;t at the time, so I had to use the next best method: clothing iron.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_20231019_212440505.webp&quot; width=90% alt=&quot;Clothes iron hot plate&quot;&#x2F;&gt;
  &lt;figcaption&gt;Clothes iron hot plate&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;By balancing the iron using a pot and pencil, I was able to place the board on top and desolder the SOIC chip &quot;effortlessly&quot; (in reality it was quite a bit of effort).&lt;&#x2F;p&gt;
&lt;p&gt;After transplanting the HX711 IC, I soldered everything to the perf-board.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_20231029_005950837.webp&quot; width=45% alt=&quot;Main board top close up&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;IMG_20231029_005939049.webp&quot; width=45% alt=&quot;Main board bottom close up&quot;&#x2F;&gt;
  &lt;figcaption&gt;Soldered control board retrofit into previous controller container&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The point-to-point soldering was done using 24 AWG enamel copper wire as it was what I had on hand, and it was easy to remove the enamel. This also gave the board a very nice look when viewing from the bottom.&lt;&#x2F;p&gt;
&lt;p&gt;On the top I used connectors to attach the other two pedals (hall-effect sensor inputs). Additionally, the USB port on the Arduino pro micro board was obstructed, so I &quot;piggy backed&quot; a female USB type-B connector on the board.&lt;&#x2F;p&gt;





    &lt;div class=&quot;admonition&quot; data-type=&quot;info&quot;&gt;
        &lt;div class=&quot;admonition-title&quot;&gt;
            &lt;p&gt;Arduino Pro Micro USB &#x27;piggy backing&#x27;&lt;&#x2F;p&gt;

        &lt;&#x2F;div&gt;
        &lt;p&gt;To piggy back a USB connection to the Arduino pro micro, I soldered the following connections:&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;pro_micro_usb.png&quot; width=30% alt=&quot;Arduino Pro Micro USB Piggyback connection&quot;&#x2F;&gt;
  &lt;figcaption&gt;Soldered control board retrofit into previous controller container&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Connecting the D+ and D- to the corresponding pins on the USB type-B connector, and jumping the Vcc pin of the Arduino to the pad of the capacitor (marked in purple in the image).&lt;&#x2F;p&gt;

    &lt;&#x2F;div&gt;

&lt;p&gt;Given the expedited two-day turnaround, the PCB design was optimized to be reliabile. The resulting boards worked as intended and fit into the pedals effortlessly.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_20231029_020543059.webp&quot; style=&quot;--aspect: 16&#x2F;9;&quot; width=45% alt=&quot;Main board top&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;IMG_20231029_020614581.webp&quot; style=&quot;--aspect: 16&#x2F;9;&quot; width=45% alt=&quot;Main board bottom&quot;&#x2F;&gt;
  &lt;figcaption&gt;Complete main controller board&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;&#x2F;h2&gt;
&lt;p&gt;Putting everything together was quite straightforward, since the mechanical footprint remained the same the only modifications required were swapping out the controller board and replacing the Hall effect sensors.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_20231029_030323766.webp&quot; style=&quot;--aspect: 4&#x2F;3;&quot; width=45% alt=&quot;Fully assembled&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;IMG_20231029_132554921.webp&quot; style=&quot;--aspect: 4&#x2F;3;&quot; width=45% alt=&quot;Assembly button placement&quot;&#x2F;&gt;
  &lt;figcaption&gt;Assembling the pedals&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;controller-firmware&quot;&gt;Controller Firmware&lt;&#x2F;h1&gt;
&lt;p&gt;The software was written using the Arduino IDE in the &lt;code&gt;C++&lt;&#x2F;code&gt; language. The libraries I used were &lt;code&gt;joystick.h&lt;&#x2F;code&gt;, &lt;code&gt;HX711.h&lt;&#x2F;code&gt;, and the &lt;code&gt;EEPROM.h&lt;&#x2F;code&gt; library. The ATmega32u4&#x27;s built in EEPROM was used to save calibration settings.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;startup&quot;&gt;Startup&lt;&#x2F;h2&gt;
&lt;p&gt;When the device powers on, it executes a startup sequence to ensure all hardware components are connected and operable before the main loop begins. The startup sequence is as follows:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Hardware &amp;amp; Communication Setup&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;ul&gt;
&lt;li&gt;A 1-second delay is placed at the very start of setup(). This ensures the power rails are completely stable and prevents communication glitches before peripheral initialization.&lt;&#x2F;li&gt;
&lt;li&gt;The firmware then initializes the joystick object, opens the Serial port for debugging, and connects to the HX711 load cell sensor.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;GPIO &amp;amp; Memory Configuration&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;ul&gt;
&lt;li&gt;The GPIO pins for the calibration button and the status LED indicator are configured.&lt;&#x2F;li&gt;
&lt;li&gt;The system reads the saved calibration limits from the EEPROM, allowing the device to retain its accuracy across power cycles without needing a recalibration.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;System Feedback &amp;amp; Diagnostics&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;ul&gt;
&lt;li&gt;The onboard LED flashes a distinct blink pattern to give a clear visual confirmation that the system booted successfully.&lt;&#x2F;li&gt;
&lt;li&gt;The retrieved low and high calibration limits are printed to the Serial interface for quick diagnostic verification.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Boot Guard Interlock&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;ul&gt;
&lt;li&gt;A final check prevents the main execution loop from starting if the calibration button is held down during boot. This serves as an intentional interlock, allowing the user to trigger a manual calibration sequence before the core application logic takes over.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;





    &lt;details class=&quot;admonition&quot; data-type=&quot;code&quot;  &gt;
        &lt;summary&gt;
            &lt;p&gt;Libraries, definitions, and Startup() method&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;include&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Joystick.h&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;include&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;EEPROM.h&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;include&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;HX711.h&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; HX_din&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; HX_sck&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; led_pin&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; deadzoneL&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;       &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; LOWER deadzone with 0-1023&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; deadzoneH&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;       &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; HIGH deadzone with 0-1023&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; LCdeadzoneL&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 750&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; LOWER deadzone with Load Cell&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; LCdeadzoneH&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 500&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; HIGH deadzone with Load Cell&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; blinkLED&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; pin&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; del&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; double&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; duty&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; num&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;	for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; i &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; i &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt;&lt;span&gt; num&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;		digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;pin&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;HIGH&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;		delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;del &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; duty&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;		digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;pin&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;LOW&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;		delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;del &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;duty&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;	digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;pin&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;LOW&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; setup&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;	delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; 	&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;Bug Fix&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;	Joystick&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;		&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;Start Joystick&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;	Serial&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;9600&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;		&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;Start Serial output&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;	&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;Start HX711 loadcell amplifier readings 64 or 128 (Channel A hard wired)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;	scale&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;HX_din&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; HX_sck&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 64&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;	scale&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;tare&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Center Load Cell reading at &amp;quot;zero&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;	&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;Set calibration button input and LED output&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;	pinMode&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;9&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;INPUT_PULLUP&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;	pinMode&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;8&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;OUTPUT&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;	&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;Load calibration information from EEPROM&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	cal_lo_T &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; intReadEEPROM&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	cal_hi_T &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; intReadEEPROM&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	cal_lo_C &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; intReadEEPROM&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	cal_hi_C &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; intReadEEPROM&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	cal_lo_B &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; longReadEEPROM&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	cal_hi_B &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; longReadEEPROM&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;12&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;	blinkLED&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;led_pin&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 600&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;	delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;Bug Fix&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;	&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;Debug Calibration Values&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;	sprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;buffer&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;T[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.4i&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;, &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.4i&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;] &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;\t&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; C[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.4i&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;, &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.4i&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;] &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;\t&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; T [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.6ld&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;, &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.6ld&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	cal_lo_T&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_T&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	cal_lo_C&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_C&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	cal_lo_B&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_B&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;	Serial&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;buffer&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;	&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;If button held down, main loop wont start until let go&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  	while&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;9&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
    &lt;&#x2F;details&gt;

&lt;h2 id=&quot;main-loop&quot;&gt;Main Loop&lt;&#x2F;h2&gt;
&lt;p&gt;The main loop handles the core runtime logic, which is divided into three primary responsibilities: executing runtime calibration routines, processing and filtering sensor data, and broadcasting the final axis positions to the host PC.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;dynamic-calibration-routine&quot;&gt;Dynamic Calibration Routine&lt;&#x2F;h3&gt;
&lt;p&gt;To ensure long-term accuracy without needing to hardcode sensor values, the firmware includes an on-the-fly calibration routine triggered by the physical calibration button.&lt;&#x2F;p&gt;





    &lt;details class=&quot;admonition&quot; data-type=&quot;code&quot;  &gt;
        &lt;summary&gt;
            &lt;p&gt;Calibration Sequence&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; CALIBRATION SEQUENCE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;9&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    while&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;9&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; wait for button to release&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;    digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;led_pin&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; HIGH&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Set Minimum&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cal_lo_T &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; readADC&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;A0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cal_lo_C &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; readADC&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;A1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cal_lo_B &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; readHXadc&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cal_hi_T &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; cal_lo_T&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cal_hi_C &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; cal_lo_C&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cal_hi_B &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; cal_lo_B&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Read Maximum input until button press&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    while&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;      if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;readADC&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;A0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_T&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_T &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; readADC&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;A0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;      if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;readADC&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;A1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_C&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_C &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; readADC&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;A1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;      if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;readHXadc&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_B&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_B &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; readHXadc&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;      &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;Debug Calibration Values&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;      sprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;buffer&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;T[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.4i&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;, &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.4i&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;](&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.4i&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;) &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;\t&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; C[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.4i&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;, &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.4i&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;](&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.4i&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;) &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;\t&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; T [&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.6ld&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;, &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.6ld&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;](&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%.4ld&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;) &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;\t&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; %.6ld&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        cal_lo_T&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_T&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_T &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; cal_lo_T&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        cal_lo_C&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_C&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_C &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; cal_lo_C&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        cal_lo_B&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_B&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_B &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; cal_lo_B&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;        readHXadc&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      )&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;      Serial&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;println&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;buffer&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;      if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;9&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;        Serial&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Exit. &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        long&lt;&#x2F;span&gt;&lt;span&gt; t &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; millis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        while&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;9&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;          if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; -&lt;&#x2F;span&gt;&lt;span&gt; t&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 800&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; If long press (800ms), save calibration to EEPROM&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;            intWriteEEPROM&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;cal_lo_T&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;addr 0-1   (2b int)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;            intWriteEEPROM&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;cal_hi_T&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;addr 2-3   (2b int)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;            intWriteEEPROM&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;cal_lo_C&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;addr 4-5   (2b int)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;            intWriteEEPROM&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;cal_hi_C&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;addr 6-7   (2b int)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;            longWriteEEPROM&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;8&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;cal_lo_B&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;addr 8-12  (4b long)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;            longWriteEEPROM&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;12&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;cal_hi_B&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;addr 12-14 (4b long)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;            Serial&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Saved. &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;            blinkLED&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;led_pin&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 400&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            while&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;9&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            break&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;          blinkLED&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;led_pin&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 500&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;6&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        break&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;      delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
    &lt;&#x2F;details&gt;

&lt;p&gt;The sequence executes as follows:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Minimum Bounds: When the button is pressed and released with the pedals at rest, the system captures the baseline sensor values.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Maximum Bounds: The system enters a loop that tracks and retains the highest peak input value as the user depresses each pedal.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Dual-Mode Saving: Upon a second button press, the system checks the hold duration. A short press saves the calibration limits to RAM for temporary testing, while a long press (&amp;gt;800ms) commits the data to non-volatile EEPROM memory.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;data-processing-mapping-deadzones-and-clamping&quot;&gt;Data Processing - Mapping, Deadzones, and Clamping&lt;&#x2F;h3&gt;
&lt;p&gt;Once raw data is captured from the ADCs and the load cell, the inputs must be conditioned. The raw data is mapped to a standard controller resolution range of 0–1023 while factoring in pre-defined high and low deadzones to eliminate sensor noise at the extremes of pedal travel.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Map value between calibration points from 0 to 1023&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    unsigned&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;span&gt; gasVal    &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; map&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;readADC&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;A0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_lo_T &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt;deadzoneL&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_T &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;deadzoneH&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1023&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    unsigned&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;span&gt; clutchVal &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; map&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;readADC&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;A1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_lo_C &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt;deadzoneL&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_C &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;deadzoneH&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1023&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    unsigned&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;span&gt; brakeVal  &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; map&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;readHXadc&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_lo_B &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt;LCdeadzoneL&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; cal_hi_B &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;LCdeadzoneH&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1023&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Clamp value between 0 and 1023&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    gasVal    &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; clamp&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;gasVal&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1023&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    clutchVal &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; clamp&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;clutchVal&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1023&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    brakeVal  &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; clamp&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;brakeVal&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1023&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Because the &lt;code&gt;map()&lt;&#x2F;code&gt; function can extrapolate outside the target boundaries if the pedal travel exceeds the calibrated thresholds, a custom &lt;code&gt;clamp()&lt;&#x2F;code&gt; helper function ensures the values stay securely within the 0–1023 bounds to prevent erratic game behavior.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;unsigned&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; clamp&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; lo&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; hi&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;in &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; lo&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; in &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; lo&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;in &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; hi&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; in &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; hi&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; in&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;clutch-curve-optimization-pc-output&quot;&gt;Clutch Curve Optimization &amp;amp; PC Output&lt;&#x2F;h3&gt;
&lt;p&gt;During testing, a purely linear response on the clutch pedal felt unnatural, making it difficult to modulate the simulated &quot;bite point.&quot; To fix this, I implemented a custom piecewise, two-slope response curve.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;clutchVal &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 512&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        clutchVal &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;*=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;25&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;double&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;clutchVal&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1023&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; else&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        clutchVal &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;*=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;75&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;double&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;clutchVal&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1023&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While this mathematical curve does not strictly replicate a physical clutch pressure-to-displacement curve, it heavily skews the output to emulate the subjective &quot;feel&quot; of a real clutch engagement in-game.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, the fully processed data is updated to the PC via the Gamepad API through the Joystick object.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Output controller data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;    Joystick&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;setRxAxis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;gasVal&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;    Joystick&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;setRyAxis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;brakeVal&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;    Joystick&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;setRzAxis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;clutchVal&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;    delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h1 id=&quot;results&quot;&gt;Results&lt;&#x2F;h1&gt;
&lt;p&gt;Ultimately, the pedals turned out incredibly well for a rapid two-day build. They offer great responsiveness and seamless compatibility across my brother’s favorite games. From a user experience standpoint, the system is entirely plug-and-play—appearing instantly as a standard game controller the moment it is plugged into a PC.&lt;&#x2F;p&gt;
&lt;p&gt;The tight 48-hour timeline pushed me to pick up several new software and hardware skills. Specifically, I gained a lot of hands-on experience working with the ATmega32u4’s native USB HID functionality to implement the game controller architecture, and I learned how to successfully piggyback an additional USB plug onto the Arduino Pro Micro.&lt;&#x2F;p&gt;
&lt;p&gt;Moving forward, the platform is highly adaptable. The underlying code can easily be reprogrammed down the road to support new titles, advanced input curves, or entirely new functionalities.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;video width=&quot;90%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;VID_20231029_024048901.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Pedals controller test&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>ENGR 362 Digital Signal Processing Project</title>
        <published>2023-03-30T00:00:00+00:00</published>
        <updated>2023-03-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/22-engr-362-dsp/"/>
        <id>https://mikebell.cc/projects/22-engr-362-dsp/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/22-engr-362-dsp/">&lt;h1 id=&quot;engr-362-digital-signal-processing-project&quot;&gt;ENGR 362 Digital Signal Processing Project&lt;&#x2F;h1&gt;
&lt;p&gt;In the ENGR 362 Digital Signal Processing project, we were presented a final project were students were to design a digital guitar compression pedal.&lt;&#x2F;p&gt;
&lt;p&gt;This project involved designing and implementing the digital signal processing (DSP) filters using MATLAB. An audio recording of a guitar playing a D Major chord was provided. The main notes are located at the frequencies of &lt;code&gt;146.83 Hz (D3)&lt;&#x2F;code&gt;, &lt;code&gt;220.00 Hz (A3)&lt;&#x2F;code&gt;, &lt;code&gt;293.66 Hz (D4)&lt;&#x2F;code&gt;, and &lt;code&gt;369.99 Hz (F#4)&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;audio controls style=&quot;width: 90%;&quot; src=&quot;media&#x2F;original.mp3&quot;&gt;&lt;&#x2F;audio&gt;
  &lt;figcaption&gt;D Major chord strummed on a guitar&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;project-objectives&quot;&gt;Project Objectives&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Analyze:&lt;&#x2F;strong&gt; Plot and analyze the original audio in both time and frequency domains.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Isolate:&lt;&#x2F;strong&gt; Design a parallel filter bank with four bandpass filters to isolate each individual note.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Measure:&lt;&#x2F;strong&gt; Record the amplitudes of the filtered signals to balance them during recombination.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Compress&#x2F;Equalize:&lt;&#x2F;strong&gt; Equalize the amplitudes of the four frequencies to within 10% of each other, then recombine and analyze the final output.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;frequency-detection&quot;&gt;Frequency Detection&lt;&#x2F;h2&gt;
&lt;p&gt;The frequency detection was done by using MATLABs internal function &lt;code&gt;findpeaks()&lt;&#x2F;code&gt;. However, this function provided too much information, including smallpeaks that were beside larger peaks. In order to get the larger more prominent peaks, aloop was used to find peaks within 1% of another and remove the peak with a loweramplitude. The output was then truncated to provide only the 4 most prominent peaks.The number of peaks and percentage of which peaks are close can be adjustedthrough parameters.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;filter-design&quot;&gt;Filter Design&lt;&#x2F;h2&gt;
&lt;p&gt;The filters used were a 7th order Chebyshev low, and high pass filter each with the passband ripple being set to 0.5. Both filters were given a center frequency ± a percentage of width, with the low pass center frequency being set a fraction above the peak frequency, and the high pass having a center frequency a fraction below. During trials, compression within spec worked with a percentage between 1% and 8.875%.&lt;&#x2F;p&gt;
&lt;p&gt;To achieve the desired filter characteristics, the program was repeatedly run with various parameters adjusted each time. The parameters available were the order of the filter, the percentage above and below the center frequency that the low and high pass cutoff frequency was set to, and the passband ripple.&lt;&#x2F;p&gt;
&lt;p&gt;The passband ripple was not adjusted much, it was set to 0.5 to start. Adjusting the filters order adjusts the cutoff slope, and so a sharp slope was desired, therefore a 7th order filter was ideal. Having too low an order filter would increase the error between the peaks in the processed signal, making it not meet the 10% specification. The filter order could be increased given a larger width percentage, it entirely depends on how the user wants the processed signal to sound.&lt;&#x2F;p&gt;
&lt;p&gt;The width percentage was set to 8.875%, which resulted in a peak deviation of approximately 10%, therefore, the width percentage can be anywhere between 0% and 8.875% with the given audio file. To allow for some error, the width percentage was set to 5%, which resulted in a peak deviation of 3.75%.&lt;&#x2F;p&gt;
&lt;p&gt;The following figures show the filter&#x27;s frequency response and each filtered signal in the time domain.&lt;&#x2F;p&gt;
&lt;p&gt;First is the frequency response of 7th order Chebyshev filters at peak frequencies with cutoff frequency widths being ±5% the peak frequency.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;filter_responses.png&quot; width=90% alt=&quot;Filter Responses&quot;&#x2F;&gt;
  &lt;figcaption&gt;Filter Responses&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Next are the resulting peaks of each filtered signal at their respective frequencies.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;peaks_fft.png&quot; width=90% alt=&quot;FFT Peaks&quot;&#x2F;&gt;
  &lt;figcaption&gt;FFT Peaks of the filtered signals&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;design-specifications&quot;&gt;Design Specifications&lt;&#x2F;h2&gt;
&lt;p&gt;With the current parameters of a 7th order Chebyshev low pass and high pass filter in series, with center frequencies being 5% above and below the peak frequency respectively, produces an output with each peak being within 3.75% of each other. Scaling was achieved by taking each peak amplitude, finding the median between the highest and lowest amplitude, then generating a factor to make each peak meet the median amplitude. The factors were then multiplied to the frequency domain signal of each filtered isolated peak, and recombined by summing them together. After summation, the peaks of the signal are within 10% of each other. In the following figures a comparison of the original and processed frequency domain signal is shown.&lt;&#x2F;p&gt;
&lt;p&gt;Below shows a comparison between the original signals DFT (left) and the processed signals DFT (right).&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;original_and_proc_signal_fft.png&quot; width=90% alt=&quot;FFT Peaks&quot;&#x2F;&gt;
  &lt;figcaption&gt;FFT Peaks of the original and processed signals&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;results&quot;&gt;Results&lt;&#x2F;h1&gt;
&lt;p&gt;After the process of filtering and equalizing, the processed frequency domain signal was passed through an inverse discrete fourier transform, then normalized to unity. Adjusting parameters greatly affects how the processed signal sounds, and with the current parameters the processed audio signal has a compressed sound to it with a ring you would find in sinusoidal signals without many harmonics. The figures below show a comparison between the original time domain signal and the processed time domain signal.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;original_signal_time_domain.png&quot; width=90% alt=&quot;Original Time Domain Signal&quot;&#x2F;&gt;&lt;br&gt;
  &lt;img src=&quot;media&#x2F;processed_signal_time_domain.png&quot; width=90% alt=&quot;Processed Time Domain Signal&quot;&#x2F;&gt;
  &lt;figcaption&gt;Original and Processed time domain signals&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Between the two plots, the compression is visible. This is expected as in the filtering process, most frequencies are being filtered out.&lt;&#x2F;p&gt;
&lt;p&gt;The resulting audio is as follows:&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;audio controls style=&quot;width: 90%;&quot; src=&quot;media&#x2F;processed.mp3&quot;&gt;&lt;&#x2F;audio&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;remarks&quot;&gt;Remarks&lt;&#x2F;h2&gt;
&lt;p&gt;Below is a flowchart of the DSP MATLAB program.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;ENGR 362 Project Flowchart.jpg&quot; width=95% alt=&quot;Flowchart&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>UBCO Motorsports Break System Plausability Device (BSPD)</title>
        <published>2023-03-30T00:00:00+00:00</published>
        <updated>2023-03-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/22-motorsports-bspd/"/>
        <id>https://mikebell.cc/projects/22-motorsports-bspd/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/22-motorsports-bspd/">&lt;p&gt;Back in 2022, I took on the challenge of upgrading the Brake System Plausibility Device (BSPD) for the UBCO Motorsports club, taking it from an existing concept to a fully realized PCB. Because it was my first large-scale board design, this project holds a special place in my engineering journey and added to my passion for hardware development.&lt;&#x2F;p&gt;
&lt;p&gt;The purpose of the BSPD is to kill the engine of formula SAE (FSAE) car that the Motorsports club was designing. The BSPD is a safety system that monitors for dangerous conditions where hard braking occurs simultaneously with high power output to the motors, indicating a fault.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;bspd-fsae-rules-and-requirements&quot;&gt;BSPD FSAE Rules and Requirements&lt;&#x2F;h1&gt;
&lt;p&gt;In 2023, students were told to follow the 2019 FSAE rules in the design for the BSPD, so the following requirements were to be met:&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;BSPD_Circuit.png&quot; width=90% alt=&quot;BSPD Circuit Specifications&quot;&#x2F;&gt;
  &lt;figcaption&gt;BSPD Circuit Specifications&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;A summary of the requirements that need to be met would be:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Given both &lt;strong&gt;hard braking&lt;&#x2F;strong&gt; (0.8*g deceleration) and &lt;strong&gt;throttle greater than 10%&lt;&#x2F;strong&gt; occurs for more than &lt;strong&gt;one second&lt;&#x2F;strong&gt;, &lt;u&gt;kill the motor&lt;&#x2F;u&gt;, &lt;u&gt;fuel flow to the motor&lt;&#x2F;u&gt;, and &lt;u&gt;close the throttle to idle position&lt;&#x2F;u&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;The BSPD can not contain any programmable components such as microcontrollers.&lt;&#x2F;li&gt;
&lt;li&gt;The circuit can only be reset through cycling the power.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;bspd-design&quot;&gt;BSPD Design&lt;&#x2F;h1&gt;
&lt;p&gt;Sensors will output an analog voltage (or current) between 0.5V and 4.5V. If the voltage falls under 0.5V or over 4.5V, the sensor is considered have a fault. Given the sensors operating range is known, the circuit was designed as per the requirements.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;comparator&quot;&gt;Comparator&lt;&#x2F;h2&gt;
&lt;p&gt;The first step to the design was measuring the analog sensor signals and discretizing them using a comparator. The comparator used was the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.ti.com&#x2F;lit&#x2F;ds&#x2F;symlink&#x2F;lm393a.pdf?HQS=dis-dk-null-digikeymode-dsf-pf-null-wwe&amp;amp;ts=1757715246405&amp;amp;ref_url=https%253A%252F%252Fwww.ti.com%252Fgeneral%252Fdocs%252Fsuppproductinfo.tsp%253FdistId%253D10%2526gotoUrl%253Dhttps%253A%252F%252Fwww.ti.com%252Flit%252Fgpn%252Flm393a&quot;&gt;TI LM393&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;There are two of the comparator circuits, one for &lt;u&gt;implausability 1: hard braking&lt;&#x2F;u&gt;, and &lt;u&gt;implausability 2: throttle &amp;gt; 10%&lt;&#x2F;u&gt;.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;comparator.png&quot; width=90% alt=&quot;Comparator circuit&quot;&#x2F;&gt;
  &lt;figcaption&gt;Comparator circuit&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The sensor is connected to both the comparators inputs in such a way that, utilizing both the comparators in the dual-package IC, both a disconnect (sensor voltage below 0.5V) and implausability can be detected. The disconnect threshold is set by a voltage divider that outputs a reference voltage of 0.495V. The implausability threshold is set with a 20k trimmer potentiometer.&lt;&#x2F;p&gt;
&lt;p&gt;A transient voltag suppression (TVS) diode was added to the sensor input for electro-static discharge (ESD) protection to the LM393.&lt;&#x2F;p&gt;
&lt;p&gt;Lastly, the LM393&#x27;s output is an open-collector, so the outputs were pulled up to 5V via 10k ohm resistors for the digital logic section.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;logic-and-timing&quot;&gt;Logic and Timing&lt;&#x2F;h2&gt;
&lt;p&gt;The logic circuitry starts by taking the implausabilities of both sensors and using a NOR gate to detect when both the implausability errors occur. Using an OR style gate seems counter intuitive for an AND operation, however, because of the open-collector comparator needing pullup resistors, the comparator outputs a LOW when there is an error, so the NOR only goes HIGH when both implausabilities occur. Likewise, for the disconnect error, we want to trigger the device when either of the sensors have a disconnect error, so a NAND was used.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;logic_latch.png&quot; width=90% alt=&quot;Logic and Latch circuit&quot;&#x2F;&gt;
  &lt;figcaption&gt;Logic and Latch circuit&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Following the implausability error gate, an RC network handles the timing of the shutdown. The logic gate ICs have a LOW-HIGH threshold around 2.5V, so the RC values were calculated to charge to 2.5V in 1 second.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, if there is a disconnect error, or an implausability, and the BSPD has been powered up for longer than 1 second, a latch is triggered.&lt;&#x2F;p&gt;
&lt;p&gt;The latch circuit operates similarily to a silicon controlled rectifier (SCR) as it has an PNPN junction structure. In a future revision of this circuit, the latch circuit was swapped out for a discrete SCR.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;shutdown-timer-calculation&quot;&gt;Shutdown Timer Calculation&lt;&#x2F;h2&gt;
&lt;p&gt;The shutdown timer was designed in such a way that the capacitor could discharge through a shunt resistor. This was done to prevent small occurrances of implausability errors from compunding.&lt;&#x2F;p&gt;
&lt;p&gt;To calculate the timing of this RC network, the following calculations were made. A &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.desmos.com&#x2F;calculator&#x2F;fdeojvvike&quot;&gt;Desmos Calculator&lt;&#x2F;a&gt; was also made for this formula.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;shutdown_timer_equ.png&quot; width=60% alt=&quot;Shutdown timer calculations&quot;&#x2F;&gt;
  &lt;figcaption&gt;Shutdown timer calculations&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;relay-led-indication-and-connector&quot;&gt;Relay, LED indication, and Connector&lt;&#x2F;h2&gt;
&lt;p&gt;The relay and status LEDs were driven with MOSFETs. The relay itself was powered from the 5V source, and triggers the connection to the ECU to kill the engine.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;drivers_relay_status.png&quot; width=90% alt=&quot;LED and relay driver circuitry&quot;&#x2F;&gt;
  &lt;figcaption&gt;LED and relay driver circuitry&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Coming from the connector is the cars voltage supply, which is dropped to 5V using a linear regulator. All test points are connected to key lines to measure the RC timers and various digital states.&lt;&#x2F;p&gt;
&lt;p&gt;The 1N4007 rectifier diode connected to the 12V supply was implemented to prevent damage in the case of reverse polarization. Additionally, the TVS diode was added to prevent any ESD damage.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;connector_tp_voltage.png&quot; width=90% alt=&quot;Connector, voltage regulation, and test point circuitry&quot;&#x2F;&gt;
  &lt;figcaption&gt;Connector, voltage regulation, and test point circuitry&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;pcb-design-and-assembly&quot;&gt;PCB Design and Assembly&lt;&#x2F;h1&gt;
&lt;p&gt;With the schematic set, the PCB was designed in &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.kicad.org&#x2F;&quot;&gt;KiCad&lt;&#x2F;a&gt;. The PCB was layed out similar to the schematics layout, and all groups are labeled clearly with silkscreen. This was done so the judges could understand how the circuit functioned at a glance.&lt;&#x2F;p&gt;
&lt;p&gt;The PCB was designed to be a two sided board, with FR4 substrate. The simplicity of the circuit allowed for minimal use of the second layer.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;pcb_top.png&quot; width=90% alt=&quot;PCB top layer&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;pcb_bottom.png&quot; width=90% alt=&quot;PCB bottom layer&quot;&#x2F;&gt;
  &lt;figcaption&gt;PCB Design&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;After ordering and recieving the PCB from &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;oshpark.com&#x2F;&quot;&gt;OSH Park&lt;&#x2F;a&gt; and getting the necessary components from &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.digikey.ca&#x2F;&quot;&gt;Digi-Key&lt;&#x2F;a&gt;, we started populating the PCB with its components.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_20230310_152848878.webp&quot; width=90% alt=&quot;Physical PCB top layer&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;IMG_20230310_152912141.webp&quot; width=90% alt=&quot;Physical PCB bottom layer&quot;&#x2F;&gt;
  &lt;figcaption&gt;Physical PCBs&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The assembled board turned out well. Now all that is left is tuning the comparators thresholds to trigger at the correct sensor levels.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;20230214_170116.webp&quot; width=90% alt=&quot;Populated and Assembled BSPD PCB&quot;&#x2F;&gt;
  &lt;figcaption&gt;Fully assembled BSPD PCB&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;testing&quot;&gt;Testing&lt;&#x2F;h2&gt;
&lt;p&gt;After assembly, the board was tested to ensure timings fell within the 1 second requirement. The test setup consisted of an arduino for data acqisition and voltage supply to simulate the sensors output.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_20230310_202520419.webp&quot; width=50% alt=&quot;Timing test setup&quot;&#x2F;&gt;
  &lt;figcaption&gt;BSPD Timing Test Setup&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The results from testing (at a room temperature of 23 degrees celcius) showed the startup timer to be 0.977 seconds and the shutdown timer to be 0.967 seconds. Both timers trigger under the maximum 1 second requirement.&lt;&#x2F;p&gt;
&lt;p&gt;When the error state goes low, the shutdown timer begins, and the relay is powered after the shutdown timer reaches its logic threshold voltage. This is shown below in the test results.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;BSPD_Error-state_Shutdown_Measurement.png&quot; width=90% alt=&quot;BSPD Error state timing measurement&quot;&#x2F;&gt;
  &lt;figcaption&gt;BSPD Error state Timing Measurement&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;results&quot;&gt;Results&lt;&#x2F;h1&gt;
&lt;p&gt;The BSPD project was a success across every phase of the design, manufacturing, and real-world implementation. The finalized PCB was integrated into the vehicle and operated correctly during technical inspection, and was officially passed by the FSAE competition judges.&lt;&#x2F;p&gt;
&lt;p&gt;As one of my very first hardware designs, this project was a foundational learning experience. Navigating the strict regulatory constraints of FSAE rules, calculating analog timing circuits, and managing a complete hardware production cycle gave me technical confidence. This milestone ultimately solidified my passion for hardware engineering and set a strong benchmark for all my future PCB design work.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Brushless DC Motor Project</title>
        <published>2023-03-24T00:00:00+00:00</published>
        <updated>2023-03-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/22-engr-320-motor/"/>
        <id>https://mikebell.cc/projects/22-engr-320-motor/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/22-engr-320-motor/">&lt;p&gt;During the spring of 2023, as part of my third-year course ENGR 320: Electromechanical Devices, my team was tasked with designing and building a functional motor or generator from scratch. The project came with a strict $100 CAD budget, a requirement for at least 20 seconds of sustained rotation, and a ban on using off-the-shelf motor parts. Because extra points were awarded for design complexity and self-starting capabilities, we chose to challenge ourselves by building a Three-Phase Brushless DC (BLDC) motor.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;engr-320-motor-design-project&quot;&gt;ENGR 320 Motor Design Project&lt;&#x2F;h1&gt;
&lt;p&gt;Students were free to choose any type of motor, but additional points were granted proportional to the complexity of the design. For that reason, my group had chosen to design a brushless DC (BLDC) motor.&lt;&#x2F;p&gt;
&lt;p&gt;The design constraints&#x2F;requirements were&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;$100 CAD budget.&lt;&#x2F;li&gt;
&lt;li&gt;Minimum 20 seconds of sustained rotation.&lt;&#x2F;li&gt;
&lt;li&gt;Students aren&#x27;t allowed to use existing motors or motor parts.&lt;&#x2F;li&gt;
&lt;li&gt;Additional points awarded if motor is self starting.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The BLDC motor we created was a delta configuration with 8 rotor poles and 6 stator coils.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;building-the-stator-6-coils&quot;&gt;Building the Stator (6 Coils)&lt;&#x2F;h2&gt;
&lt;p&gt;The coils were wound around M3 machine screws with 22 AWG magnet wire. All 6 coils were matched to be 54.5 ± 0.5 uH. We matched using inductance as it was easier than counting turns. (The coil turn count was approximated to be more than 200 turns of 22 AWG magnet wire). Coil dimensions OD: 13mm, ID: 3mm, length: 13mm.&lt;&#x2F;p&gt;
&lt;p&gt;Unfortunately, no picture of the coil winding process or finished coils were taken.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rotor-8-magnets&quot;&gt;Rotor (8 Magnets)&lt;&#x2F;h2&gt;
&lt;p&gt;The rotor was designed to hold 8 neodymium magnets and was 3d printed out of PLA. The design included space to fit a bearing to recude any friction. By winding the coils of the stator around screws, we were able to adjust the gap between the coils of the stator and magnets of the rotor.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_20230315_200513405.webp&quot; width=75% alt=&quot;Stator&quot;&#x2F;&gt;
  &lt;figcaption&gt;Complete Stator&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;variable-frequency-motor-driver-vfd-esc&quot;&gt;Variable Frequency Motor Driver (VFD, ESC)&lt;&#x2F;h2&gt;
&lt;p&gt;To control the 3 phase BLDC motor, we needed to create (or find) a variable frequency 3-phase motor driver. We started out by designing our own.&lt;&#x2F;p&gt;
&lt;p&gt;The design consisted of 3 half H-bridges made from MOSFETS and an Arduino to control the gates. The control signal is not a sinusoid, but is usable. The sequence used for the motor was ABCABC.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;3phaseGen_1.png&quot; style=&quot;--aspect: 3&#x2F;2;&quot; width=45% alt=&quot;3 Phase switching Sequence&quot;&#x2F;&gt;&lt;br&gt;
  &lt;img src=&quot;media&#x2F;IMG_20230315_200457070.webp&quot; style=&quot;--aspect: 3&#x2F;2;&quot; width=45% alt=&quot;DIY VFD&quot;&#x2F;&gt;
  &lt;figcaption&gt;DIY Variable Frequency Driver&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;This design was very poorly implemented, and generated more heat than expected. This was quite bad as the motor was also not moving.&lt;&#x2F;p&gt;
&lt;p&gt;Being that the project was on a deadline, we decided it would be better to simply buy an ESC module for a BLDC.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_7403.webp&quot; width=75% alt=&quot;ESC Module&quot;&#x2F;&gt;
  &lt;figcaption&gt;ESC Module&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Using this ESC we were able to get the motor to run successfully.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;driver-soft-start&quot;&gt;Driver Soft Start&lt;&#x2F;h2&gt;
&lt;p&gt;Due to minor physical imbalances inherent in a custom-built motor, requesting high acceleration from a static position caused inconsistent starting behavior and stalling. To overcome this inertia and ensure reliable self-starting, a software-based soft-start routine was implemented within the microcontroller code.&lt;&#x2F;p&gt;
&lt;p&gt;The algorithm functions by filtering the raw analog potentiometer input and introducing a dynamic ramp-up rate, preventing abrupt current spikes and synchronized lag:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; analogRead&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;potpin&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 300&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 300&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; If knob is between 10 and 300, remap to start from 300 (0-300 is a deadzone for motor)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  escVal &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; map&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;val&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1023&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;maxspd&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;!=&lt;&#x2F;span&gt;&lt;span&gt; escVal&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; If speed knob has changed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 150&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; del_set &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 120&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 160&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 90&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; del_set &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 90&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 90&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; del_set &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 25&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;del&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;gt;=&lt;&#x2F;span&gt;&lt;span&gt; del_set &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; maxspd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; high &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; escVal&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      spd&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      del &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; millis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;del&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 15&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; maxspd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; low &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; escVal&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      spd&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; In limited power, from 0&#x2F;180 to 50&#x2F;180, change relatively quick (Slow enough that it reacts fine)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      del &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; millis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; escVal&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; escVal&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; When decreasing speed, decrease instantly&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  ESC&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;write&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;spd&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Send the signal to the ESC&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;esc-controller-tachometer-code&quot;&gt;ESC Controller &amp;amp; Tachometer Code&lt;&#x2F;h2&gt;
&lt;p&gt;To safely operate the motor and track benchmarking data, an Arduino Uno was integrated with a custom control panel and a telemetry sensor.&lt;&#x2F;p&gt;
&lt;p&gt;The hardware interface consisted of:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A Potentiometer that acted as a manual throttle for precise speed adjustment.&lt;&#x2F;li&gt;
&lt;li&gt;Dual-Mode Toggle Switch allowing the operator to select between two profiles: &quot;Nerfed&quot; Mode which restricted speed and current draw for safe troubleshooting, and Maximum Mode which unlocked full power to achieve peak RPM.&lt;&#x2F;li&gt;
&lt;li&gt;An LCD Screen provided live visual feedback, displaying the current RPM and active soft-start state.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;A Hall effect sensor was mounted adjacent to the rotor to track speed. As the 8 rotor magnets passed the sensor, the Arduino calculated the pulse frequency using hardware interrupts, translating the data into a real-time RPM reading for benchmarking.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_20230324_145946508.webp&quot; width=75% alt=&quot;Motor mount and Control Panel&quot;&#x2F;&gt;
  &lt;figcaption&gt;Motor mount and Control Panel&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;





    &lt;details class=&quot;admonition&quot; data-type=&quot;code&quot;  &gt;
        &lt;summary&gt;
            &lt;p&gt;Arduino Code for the ESC&lt;&#x2F;p&gt;

        &lt;&#x2F;summary&gt;
        &lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; =======================================================================================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; ESC Controller for the ENGR 320 Motor project&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; By Michael Bell&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; MARCH 2023&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; As a group, we chose to add unecessary and extra features because we finished early.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; =======================================================================================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;include&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;LiquidCrystal_I2C.h&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;include&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Servo.h&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; =======================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Pin Definitions&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; =======================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; pwmPin&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 6&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; ESC on pin 6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; potpin&lt;&#x2F;span&gt;&lt;span&gt; A0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Speed potentiometer on A0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; sw&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Max&#x2F;limited power switch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; led&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Indication LED&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; hall&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Hall effect sensor pin (Must be pin 2 or 3)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Constants&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; low&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 50&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; about 28% power (50&#x2F;180)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;define&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; high&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 180&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; max PWM speed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;LiquidCrystal_I2C&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; lcd&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;0x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;27&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 16&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Servo ESC&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;     &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; create servo object to control the ESC&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; maxspd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; low&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; val&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; escVal&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; spd&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; n&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;float&lt;&#x2F;span&gt;&lt;span&gt; t_old&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; t_new&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; rpm&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; del&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; del_set&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; setup&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; =======================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Initialization&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; =======================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  Serial&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;9600&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;  pinMode&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;sw&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; INPUT_PULLUP&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;  pinMode&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;led&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; OUTPUT&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;  attachInterrupt&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;digitalPinToInterrupt&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;hall&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; tacho&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; FALLING&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Activate Tachometer interrupt when Hall sensor goes from 5v to 0v&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;  digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;led&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  lcd&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;init&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;initialize the lcd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  lcd&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;backlight&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;open the backlight &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  lcd&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;setCursor&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  ESC&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;attach&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;pwmPin&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1000&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;2000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; (pin, min pulse width, max pulse width in microseconds)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  ESC&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;writeMicroseconds&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;900&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; send “stop” signal to ESC.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;  delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;2000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; delay to allow the ESC to recognize the stopped signal&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; =======================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  while&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;analogRead&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;potpin&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;Check for knob to be zeroed, if not, wait until it is&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;    digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;led&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;    delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;    digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;led&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;    delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;500&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;  digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;led&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  lcd&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;clear&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  lcd&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;setCursor&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  lcd&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;RPM: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  lcd&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;setCursor&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  lcd&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Power: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; loop&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; ==========================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Full&#x2F;Limited Power Switch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; ==========================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  int&lt;&#x2F;span&gt;&lt;span&gt; spdpin &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;sw&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; read full power switch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;spdpin &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; maxspd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; low&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; if switch is on, knob is zeroed, and the max speed is low, then allow full power&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    maxspd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; high&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;    digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;led&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;spdpin &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; maxspd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; high&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; if switch is on, knob is zeroed, and the max speed is max, then go to quarter power&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    maxspd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; low&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;    digitalWrite&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;led&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; ================================================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Speed Control, Full&#x2F;Limited Power soft control&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; ================================================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; analogRead&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;potpin&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 300&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; val &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 300&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; If knob is between 10 and 300, remap to start from 300 (0-300 is a deadzone for motor)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  escVal &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; map&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;val&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1023&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;maxspd&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;!=&lt;&#x2F;span&gt;&lt;span&gt; escVal&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; If speed knob has changed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 150&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; del_set &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 120&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 160&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 90&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; del_set &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 90&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 90&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; del_set &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 25&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;del&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;gt;=&lt;&#x2F;span&gt;&lt;span&gt; del_set &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; maxspd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; high &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; escVal&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      spd&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      del &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; millis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;millis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;del&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 15&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; maxspd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;==&lt;&#x2F;span&gt;&lt;span&gt; low &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; escVal&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      spd&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; In limited power, from 0&#x2F;180 to 50&#x2F;180, change relatively quick (Slow enough that it reacts fine)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      del &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; millis&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; escVal&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; escVal&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; When decreasing speed, decrease instantly&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  ESC&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;write&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;spd&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Send the signal to the ESC&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; =======================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; LCD Output&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; =======================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;n &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 15&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    n &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;    lcd&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;setCursor&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;7&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;    lcd&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;String&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;rpm&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;          &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; else&lt;&#x2F;span&gt;&lt;span&gt; n&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  lcd&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;setCursor&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;7&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;  lcd&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;String&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;float&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;spd &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 100&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span&gt; high&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;%          &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;Serial.println(String(spd) + &amp;quot;,&amp;quot; + String(escVal) + &amp;quot;,&amp;quot; + String(val) + &amp;quot;,&amp;quot; + String(maxspd) + &amp;quot;,&amp;quot; + String(rpm));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;Serial.println(&amp;quot;Speed: &amp;quot; + String((float)spd * 100 &#x2F; high) + &amp;quot;%,  RPM: &amp;quot; + String(rpm));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; tacho&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; =======================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Hall Sensor Tachometer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; =======================&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  float&lt;&#x2F;span&gt;&lt;span&gt; rpm_0 &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; rpm&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  float&lt;&#x2F;span&gt;&lt;span&gt; rpm_1 &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; rpm_0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  float&lt;&#x2F;span&gt;&lt;span&gt; rpm_2 &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; rpm_1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  t_new &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; micros&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; ;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;  float&lt;&#x2F;span&gt;&lt;span&gt; period &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;t_new &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; t_old&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;4&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1000000&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; 8 magnets on rotor, 4 of them will make hall sensor go from high --&amp;gt; low, so we multiply time by 4.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  t_old &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; t_new&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  rpm &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;period&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;60&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; rpm_0 &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt; rpm_1 &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt; rpm_2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
    &lt;&#x2F;details&gt;

&lt;h1 id=&quot;result&quot;&gt;Result&lt;&#x2F;h1&gt;
&lt;p&gt;The motor ran on 12V DC with a current draw of around 2.8A at no load full RPM. Overall, the motor ran quite well.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;video width=&quot;90%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;VID_20230318_212125204.mp4&quot; type=&quot;video&#x2F;mp4&quot; width=&quot;90%&quot; alt=&quot;Motor Test&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
    &lt;figcaption&gt;First Motor Test&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
	&lt;video width=&quot;90%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;VID_20230324_145255942.mp4&quot; type=&quot;video&#x2F;mp4&quot; width=&quot;90%&quot; alt=&quot;Final Motor Run&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
    &lt;figcaption&gt;Final Motor Test and Submission&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;remarks&quot;&gt;Remarks&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;figcaption&gt;Backup Submission&lt;&#x2F;figcaption&gt;
	&lt;video width=&quot;60%&quot; autoplay muted loop&gt;
		&lt;source src=&quot;media&#x2F;VID_20230210_123106305.mp4&quot; type=&quot;video&#x2F;mp4&quot; width=&quot;60%&quot; alt=&quot;AA Battery Motor&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Macro Keyboard</title>
        <published>2020-09-23T00:00:00+00:00</published>
        <updated>2020-09-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/20-macro-keyboard/"/>
        <id>https://mikebell.cc/projects/20-macro-keyboard/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/20-macro-keyboard/">&lt;h1 id=&quot;macro-keyboard&quot;&gt;Macro Keyboard&lt;&#x2F;h1&gt;
&lt;p&gt;Being in my first year of engineering, I was in a course that taught students how to use CAD software, specifically Dassault Systèmes SolidWorks. I realized early on that I would be using a number of shortcuts and keystroke sequences, so I began designing a simple macro keyboard around an Arduino Pro Micro.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;design&quot;&gt;Design&lt;&#x2F;h2&gt;
&lt;p&gt;Using 9 mechanical keyboard switches, I didn&#x27;t need to get into any in depth array of buttons, so the design was rather simple. I used 9 digital IO pins from the Arduino and set them as inputs. I also included a button for selecting different sets of macros, and with that two LEDs were included as a binary counter&#x2F;indicator of which macro set is selected.&lt;&#x2F;p&gt;
&lt;p&gt;The circuit was turned into a PCB layout using EasyEDA (at this point in time I had not known about KiCad). I exported the PCB Layout into gerber files and used &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;flatcam.org&#x2F;&quot;&gt;FlatCAM&lt;&#x2F;a&gt; to turn them into CNC milling operations.&lt;&#x2F;p&gt;
&lt;p&gt;After milling out the PCB, I was able to solder in the components including the Arduino Pro Micro. Keycaps were later added to the switches as well.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_20200923_143637887.jpg&quot; width=45% alt=&quot;Milled PCB&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;IMG_20200922_225002374.jpg&quot; width=45% alt=&quot;Adding components&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;IMG_20200923_180508273.jpg&quot; width=45% alt=&quot;Finished Product&quot;&#x2F;&gt;
  &lt;figcaption&gt;Macro Keyboard PCB&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;software&quot;&gt;Software&lt;&#x2F;h2&gt;
&lt;p&gt;The software was quite straight forward since the Arduino Pro Micro (more specifically the Atmel ATMEGA32U4 microprocessor) has human interface device (HUD) support built in. This means that the Arduino can behave like any computer input peripheral such as a mouse, keyboard, or game controller.&lt;&#x2F;p&gt;
&lt;p&gt;I won&#x27;t cover much of the software since it was only a series of if statements within the main loop.&lt;&#x2F;p&gt;
&lt;p&gt;The code responsible for sending the keypress is shown below:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span&gt; LOW&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;Button 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;    Keyboard&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;press&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;KEY_LEFT_ALT&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;    Keyboard&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;press&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;KEY_LEFT_SHIFT&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;    Keyboard&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;press&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;    Keyboard&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;releaseAll&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    while&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;digitalRead&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span&gt; LOW&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;    delay&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;del&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Essentially in the main loop, once the key assigned to pin 4 is pressed, the input goes low causing this if statement to execute. This statement executes keypresses in the order of &lt;code&gt;ALT&lt;&#x2F;code&gt;, &lt;code&gt;SHIFT&lt;&#x2F;code&gt;, and &lt;code&gt;M&lt;&#x2F;code&gt;, then releases all the pressed keys and waits for the macro key to be let go.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;results&quot;&gt;Results&lt;&#x2F;h2&gt;
&lt;p&gt;The macro keyboard was heavily used in my first year, but gradually was used less. I ended up reconfiguring it to be a numpad as the keyboard I was using didn&#x27;t have a numpad.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>FIRST Robotics Competition</title>
        <published>2020-09-05T00:00:00+00:00</published>
        <updated>2020-09-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/20-first-robotics/"/>
        <id>https://mikebell.cc/projects/20-first-robotics/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/20-first-robotics/">&lt;h1 id=&quot;first-tech-challenge&quot;&gt;FIRST Tech Challenge&lt;&#x2F;h1&gt;
&lt;p&gt;Over a timeframe of about 6 months, me and the members of the &lt;a href=&quot;..&#x2F;community.md#robotics-club&quot;&gt;Kal Robotics Club&lt;&#x2F;a&gt; worked towards making a robot to compete in the 2020 FIRST Tech Challenge.&lt;&#x2F;p&gt;
&lt;p&gt;??? media &quot;FIRST Tech Challenge 2019-2020 Video&quot;
&lt;iframe width=&quot;1903&quot; height=&quot;768&quot; src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;D2-CRBoGpJQ&quot; title=&quot;FTC 2019-2020 SKYSTONE Game Animation (No Intro)&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;&#x2F;iframe&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The premise of the challenge wass to move bricks from one location to another, while completing additional bonus tasks in the process. Each round had an automated stage and a man-controlled stage where the robot would first execute a pre-defined set of instructions&#x2F;movements, then after, two team members manually control the robot.&lt;&#x2F;p&gt;
&lt;p&gt;With the design requirements set, we began putting together a design.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Information to be added.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>PCB CNC Milling</title>
        <published>2020-08-05T00:00:00+00:00</published>
        <updated>2020-08-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/20-cnc-milling-pcb/"/>
        <id>https://mikebell.cc/projects/20-cnc-milling-pcb/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/20-cnc-milling-pcb/">&lt;h1 id=&quot;milling-pcb-using-cnc-machine&quot;&gt;Milling PCB using CNC machine&lt;&#x2F;h1&gt;
&lt;p&gt;In mid 2020 I purchased a mini desktop CNC milling machine for the sole purpose of milling out printed circuit boards (PCBs).&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;902039382.jpg&quot; width=70% alt=&quot;CNC Assembly&quot;&#x2F;&gt;
  &lt;figcaption&gt;Assembling the CNC Router&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The CNC mill was controlled through a software called &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Denvi&#x2F;Candle&quot;&gt;GRBL Candle&lt;&#x2F;a&gt;, which read g-code instructions from a file and sends G-Code instructions to the CNC.&lt;&#x2F;p&gt;
&lt;p&gt;G-code serves as the standard alphanumeric programming language used to dictate the machine&#x27;s toolpaths and operational commands. For example, the command G0 X10 Y20 Z5 instructs the mill to execute a rapid linear move to the coordinate position ($X=10$, $Y=20$, $Z=5$). For an exhaustive breakdown of individual commands and syntax parameters, refer to the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;marlinfw.org&#x2F;docs&#x2F;gcode&#x2F;G000-G001.html&quot;&gt;Marlin G-code Documentation&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;dfa071f9053382e76e184451656ec5dc.jpg&quot; width=50% alt=&quot;CNC Control Software&quot;&#x2F;&gt;
  &lt;figcaption&gt;CNC Control Software &quot;GRBL Candle&quot;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;process&quot;&gt;Process&lt;&#x2F;h2&gt;
&lt;p&gt;For the purpose of milling PCBs, I needed a way to convert my gerber export files from EasyEDA (or KiCad) into g-code instructions for my CNC to execute. To do this, I found an application called &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;flatcam.org&#x2F;&quot;&gt;FlatCAM&lt;&#x2F;a&gt;, which allowed me to import gerber files, add and configure toolpaths, and configure the drilling paths for holes.&lt;&#x2F;p&gt;
&lt;p&gt;When milling a board, there are &lt;u&gt;2 major processes&lt;&#x2F;u&gt;:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Isolating traces:&lt;&#x2F;strong&gt; where the outline of each trace is cut out.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Drilling Holes:&lt;&#x2F;strong&gt; where the various through holes are drilled and sized.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Before going straight into milling copper clad board, I wanted to tune in my FlatCAM configurations to get the best results possible. To run tests, I simply milled out some plywood I painted black.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;IMG_20200805_182909814.jpg&quot; width=80% alt=&quot;Configuration Test&quot;&#x2F;&gt;
  &lt;figcaption&gt;Configuration Test&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;After the third revision of configurations, I had it dialed in quite well, so I made some PCBs using single sided copper clad board.&lt;&#x2F;p&gt;
&lt;figure&gt;
	&lt;video width=&quot;40%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;VID_20200805_181722518.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Test Pass&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
	&lt;video width=&quot;40%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;VID_20200805_193235593.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Milling Copper board&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
  &lt;figcaption&gt;Milling PCB Traces&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;results&quot;&gt;Results&lt;&#x2F;h2&gt;
&lt;p&gt;I had a number of failed attemts, but that never stopped me from trying again. I was able to create boards for various applications, such as SOIC to DIP test boards, and various boards for my projects.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;ff5b0c2380ad3fd37cb26cd930732d9a.jpg&quot; width=&quot;40%&quot; alt=&quot;Circuit Board&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;3d330bc67f3cc350343577a087eaab78.jpg&quot; width=&quot;40%&quot; alt=&quot;Circuit Board&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;4b958e21da5b7e33900ea82a24054b6d.jpg&quot; width=&quot;40%&quot; alt=&quot;SOT-23-6 VCO IC&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;IMG_20200815_113458027.jpg&quot; width=&quot;40%&quot; alt=&quot;SOIC Breakout Board&quot;&#x2F;&gt;
  &lt;figcaption&gt;Resulting Milled Circuit Boards&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>2020 Project Collection</title>
        <published>2020-01-01T00:00:00+00:00</published>
        <updated>2020-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/20-projects/"/>
        <id>https://mikebell.cc/projects/20-projects/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/20-projects/">&lt;p&gt;Below are some of the projects and experiments that I recorded in 2020. This year was different as I had graduated high school and entered university. From this year onwards, the projects made will have a page of their own.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;january-2020&quot;&gt;January 2020&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;I started 2020 off by experimenting a little with casette tapes. I was watching some youtube videos on tape delay audio effects and wanted to look into making my own. At the time however I didn&#x27;t know much on how magnetic tape really worked, so I went to a local thrift store, found an old casette player and took it apart. I tried making a tape loop as well.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
  &lt;img src=&quot;media&#x2F;202001&#x2F;71e9f445314e5ee9866d4875bffd6a8b.jpg&quot; width=&quot;35%&quot; alt=&quot;Dissassembled cassette player&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;202001&#x2F;927afc7be9c0314024592a3a756f309d.jpg&quot; width=&quot;35%&quot; alt=&quot;Dissassembled cassette player&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;202001&#x2F;f16fc638210808cf07806828d01d9c3b.jpg&quot; width=&quot;35%&quot; alt=&quot;Cassette tape&quot;&#x2F;&gt;
  &lt;img src=&quot;media&#x2F;202001&#x2F;9238306d33637e1ca2958df617f503b2.jpg&quot; width=&quot;35%&quot; alt=&quot;Cassette tape loop&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;I also did some more experiments with the PT2399 reverb IC, making some more modifications to the circuit and playing the piano audio through it.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;202001&#x2F;c3d60a5dd5d5a7a1f2cf71a658762de4.jpg&quot; width=&quot;35%&quot; alt=&quot;PT2399 reverb prototype&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202001&#x2F;eeb5f7c54b02f1e8f55bf401839cd30b.jpg&quot; width=&quot;35%&quot; alt=&quot;PT2399 reverb prototype&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;febuary-2020&quot;&gt;Febuary 2020&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;In Febuary I made a simple &quot;On Air&quot; LED sign using the addressible LEDs I experimented with in Nov 2019. The display itself was 3D printed and the LEDs were controlled with an Ardiuno Pro Micro. I had some fun programming different color animations as the addressible LEDs could make some pretty neat effects if done right. I added a button to switch through the different animations.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;202002&#x2F;007f0525717f1a6f37d64733aa04c628.jpg&quot; width=&quot;35%&quot; alt=&quot;On Air sign Green&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202002&#x2F;a01b9fc789a75fc370b499c72cd41859.jpg&quot; width=&quot;35%&quot; alt=&quot;On Air sign Red&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202002&#x2F;bd018be342046825deaf4afc30efd075.jpg&quot; width=&quot;35%&quot; alt=&quot;On Air sign Side&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;april-2020&quot;&gt;April 2020&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;In april I worked primarily on a simple IR strobe light with a tunable frequency.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;202004&#x2F;e67c19b433cc9f61b9969f41eba57cfa.jpg&quot; width=&quot;35%&quot; alt=&quot;IR Strobe light&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202004&#x2F;43a6dd886a9dcb5541436331c783934f.jpg&quot; width=&quot;35%&quot; alt=&quot;IR Strobe light&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202004&#x2F;6b9c6ba7a590760bdb133312ac89dbfe.jpg&quot; width=&quot;35%&quot; alt=&quot;IR Strobe light&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;I also began configuring a Minecraft server on my UDOO X86 Ultra using Ubuntu as an operating system.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;202004&#x2F;f073f3e23c8745c06f0752cfc332e1dd.jpg&quot; width=&quot;35%&quot; alt=&quot;Ubuntu Minecraft server setup&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202004&#x2F;70b8cb15ac63e1c2057f28499c8fb4b1.jpg&quot; width=&quot;35%&quot; alt=&quot;Ubuntu Minecraft server setup&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;may-2020&quot;&gt;May 2020&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Carrying on from April, I continued working on that Ubuntu minecraft server and made an enclosure for the UDOO X86 Ultra. I needed to make a PWM controller so the fan wouldn&#x27;t sit at 100% all the time (very loud), so I threw one together using a 555 timer IC and some other components.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;202005&#x2F;27003f5489da2c7f781df39747f99e74.jpg&quot; width=&quot;35%&quot; alt=&quot;PWM controller&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202005&#x2F;7359be0c2585a28dbc35895fc0cf5181.jpg&quot; width=&quot;35%&quot; alt=&quot;UDOO X86 Enclosure&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;I came across a forum that mentioned a way to overclock the TI-84 Plus graphing calculator. After some digging I found where the clocks resistor and capacitor were located on the PCB and I soldered a potentiometer in parallel to the resistor. It is a little touchy when tuning, mainly because of the parallel combinations equivalent resistance relationship, but also because the potentiometer I used was a 3&#x2F;4 turn pot.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;202005&#x2F;f9f01c3d6f8b5c88531f4141edf1d3a3.jpg&quot; width=&quot;35%&quot; alt=&quot;TI-84 Overclocking&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202005&#x2F;e573e790939d221c27644129caf329bb.jpg&quot; width=&quot;35%&quot; alt=&quot;TI-84 Overclocking&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202005&#x2F;0c74b780467fd35e84d2a0b1e0da5f2e.jpg&quot; width=&quot;35%&quot; alt=&quot;TI-84 Overclocking&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;Going back to the NOAA-19 satellite antenna, I had to do some repairs as the antenna was getting beat up from the elements. While I was at it, I also decided to make some improvements as well. At the time, I had purchased a NanoVNA which is a very small vector network analyzer. With this tool, I was able to dial in the antenna to be very resonant on 137.1MHz. At the same time, I also added a low noise amplifier to improve the reception. Sadly I didn&#x27;t take any images of the S21 measurements of the antenna.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;202005&#x2F;1d78d9e650a272274b806284c48b28d0.jpg&quot; width=&quot;35%&quot; alt=&quot;NOAA recieve antenna improvements&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202005&#x2F;0c8952cf418b2b0811898eeb5049a4b4.jpg&quot; width=&quot;35%&quot; alt=&quot;NanoVNA&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202005&#x2F;e2b1c55a085da8f521c7ad3358247272.jpg&quot; width=&quot;35%&quot; alt=&quot;NOAA recieve antenna improvements&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202005&#x2F;e1efbd1a7bfa02f902875d80fcdea9de.jpg&quot; width=&quot;35%&quot; alt=&quot;Low noise amplifier&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202005&#x2F;5f0ef6d36a3f735987b3790550a9361c.jpg&quot; width=&quot;35%&quot; alt=&quot;Recieving NOAA signal&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;Later in the month I worked on a small audio equalizer&#x2F;amplifier for fun.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;202005&#x2F;a7bef3ced6cc86ef0e4b09674db5a0b6.jpg&quot; width=&quot;42%&quot; alt=&quot;Audio equalizer breadboard circuit&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202005&#x2F;e3268978195975bd651ce7373104624f.jpg&quot; width=&quot;42%&quot; alt=&quot;Audio equalizer breadboard circuit&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;june-2020&quot;&gt;June 2020&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;I continued to explore my new NanoVNA and made a bandpass filter centered at 137.1 MHz to maybe get rid of unwanted harmonics from other transmissions during a 10 minute NOAA image reception. I made each coil for the filter making sure to measure inductance with my LC meter, and used beeswax to keep the coils rigid once soldered on the board.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;202006&#x2F;4dc0d2b575409e4a98f638a039ba736f.jpg&quot; width=&quot;35%&quot; alt=&quot;137MHz Bandpass filter&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202006&#x2F;3487209308cc0af29602652ae919f316.jpg&quot; width=&quot;35%&quot; alt=&quot;NanoVNA measurement of filter&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202006&#x2F;aa5012feb4bfab7c99fde8a3291e21ce.jpg&quot; width=&quot;35%&quot; alt=&quot;Filter on antenna&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;And here are some images I was able to capture from the satellite.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;202006&#x2F;3b86d45f2500969dd397fe0509fc9661.jpg&quot; width=&quot;35%&quot; alt=&quot;NOAA-19 Image&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202006&#x2F;5484ffef839a2e8ffac5bb82ec0793c2.jpg&quot; width=&quot;35%&quot; alt=&quot;NOAA-19 Image&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;202006&#x2F;db55d9bf370b27d380b208d1d66be51e.jpg&quot; width=&quot;35%&quot; alt=&quot;NOAA-19 Image&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;remarks&quot;&gt;Remarks&lt;&#x2F;h1&gt;
&lt;p&gt;The projects I worked on from 2018 to the end of 2020 were very defining. They really show how far I have come in terms of self driven learning and discovery. I enjoy electronic circuits very much and have chosen my career path because of that.&lt;&#x2F;p&gt;
&lt;p&gt;From here onwards is where I began my university education. All the projects from here on will be given a dedicated page which will be indexed on the &lt;a href=&quot;&#x2F;projects&quot;&gt;Projects&lt;&#x2F;a&gt; page&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>2019 Project Collection</title>
        <published>2019-01-01T00:00:00+00:00</published>
        <updated>2019-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/19-projects/"/>
        <id>https://mikebell.cc/projects/19-projects/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/19-projects/">&lt;p&gt;Below are the projects and experiments that I recorded in 2019.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;january-2019&quot;&gt;January 2019&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Starting the year off, I wanted to make a mini subwoofer for my speaker system. I did this using a dedicated 3W speaker amplifier IC, and some passive filters. This project mainly taught me about filters and the various topologies such as low pass, high pass, and bandpass filters.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201901&#x2F;6ae35af1d3f5fda5a3e1d9c03b8dd51d.jpg&quot; width=&quot;35%&quot; alt=&quot;DIY 3 inch subwoofer breadboard circuit&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201901&#x2F;b2422121c043e8a70db9944a3292a1c1.jpg&quot; width=&quot;35%&quot; alt=&quot;DIY 3 inch subwoofer&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;I also dove further into my interest in radio and bought a software defined radio (SDR). With this SDR I was able to recieve radio signals from 30 MHz all the way to 1.6 GHz.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201901&#x2F;709a950495eeaaebb17d3dedebf903fa.jpg&quot; width=&quot;35%&quot; alt=&quot;DIY 3 inch subwoofer breadboard circuit&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201901&#x2F;5f01cbf1cba7173868e8995f2a3befe7.jpg&quot; width=&quot;35%&quot; alt=&quot;DIY 3 inch subwoofer&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;Another experiment I played around with was learning to drive a stepper motor I had salvaged from an old printer. I was able to successfully drive the motor with full steps in both clockwise and counter clockwise rotations.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201901&#x2F;be6de36322614f3964dac77e1a2e7295.jpg&quot; width=&quot;35%&quot; alt=&quot;Driving a stepper motor&quot;&#x2F;&gt;
    &lt;video width=&quot;35%&quot; autoplay muted loop&gt;
		&lt;source src=&quot;media&#x2F;201901&#x2F;39aee6c22cfead6d3de6a159c5f5a8df.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Stepper motor driver in action&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;febuary-2019&quot;&gt;Febuary 2019&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Continuing further into my radio journey, I laid conduit out to run coaxial cable to my back yard from my room. This enabled me to create and set up larger antennas to capture lower frequency radio signals.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201902&#x2F;6569a7d3fff58f114894ef70527ceb74.jpg&quot; width=&quot;35%&quot; alt=&quot;Conduit for coax&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201902&#x2F;b7db855bdd32b94ad5e7e53ebeca44b2.jpg&quot; width=&quot;35%&quot; alt=&quot;Wall box for coax&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;I also bought another SDR with a down converter to allow me to capture these lower frequency signals down to 100 kHz. With the ability to recieve lower frequency signals, I was having &quot;ghost signals&quot; show up on my radio software (which I believe was due to aliasing but didn&#x27;t know at the time) so I built a first order passive low pass filter to get rid of any signals above 14 MHz (a.k.a. the 20m band).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201902&#x2F;9832156b77a07d388eea453dd5fb0236.jpg&quot; width=&quot;35%&quot; alt=&quot;New SDR with down converter&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201902&#x2F;3ef91b9a304a87d3bdc0499cf75f9c07.jpg&quot; width=&quot;35%&quot; alt=&quot;14 MHz low pass filter&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;Another experiment I worked on was a high voltage step up transformer. As these experiments go, I was bored in my electronics class and had some spare time to waste, so I decided to begin winding a transformer. By winding the primary with 10 turns of 24 AWG magnet wire and winding the secondary with upwards to 6000 turns of 32 AWG wire, I was able to produce around 600V AC to light up a neon bulb. I sadly don&#x27;t have any images of the transformer itself, but I do have an image of the neon bulb lighting up.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201902&#x2F;9b0a13e0bed0d75ae6cb91cc376a75a2.jpg&quot; width=&quot;35%&quot; alt=&quot;High Voltage transformer&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;To top things off, I began playing around with Linux and Android x86 operating systems some more on my UDOO X86 Ultra computer.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201902&#x2F;699f6e31ba9ba33f9a3dc9383757eaaf.jpg&quot; width=&quot;35%&quot; alt=&quot;Android x86 installation&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201902&#x2F;dc3b269d811d7eaf4caef566efeeeb47.jpg&quot; width=&quot;35%&quot; alt=&quot;Ubuntu installation&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;march-2019&quot;&gt;March 2019&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;March of 2019 is the month I started a larger more monumental project. From my previous endeavours in making the FM transmitters and learning with the SDRs, I wanted to make a regenerative radio reciever. I chose to have this reciever operate within the range of 6 MHz to about 9 MHz. The design of this reciever was a hurdle as I didn&#x27;t conduct any circuit analysis. I essentially took different schematics from the internet and created my own frankenstein reciever from what I could glean.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;This is only the start of this project however, I cover the completion of this project in &lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;projects&#x2F;19-projects&#x2F;#may-2019&quot;&gt;May 2019&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201903&#x2F;922490b2968a4d36077e70eba829776f.jpg&quot; width=&quot;35%&quot; alt=&quot;Parts used for regen. reciever&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201903&#x2F;22bd9439f7a217402a341b5b4c64ca95.jpg&quot; width=&quot;35%&quot; alt=&quot;Regenerative reciever prototype Schematic&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201903&#x2F;d2d2a48ca88fd9e5adcd358ec3996774.jpg&quot; width=&quot;35%&quot; alt=&quot;Regenerative reciever inductor&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201903&#x2F;6f04f1943686b47245cd954ec2e0ef24.jpg&quot; width=&quot;35%&quot; alt=&quot;Regenerative reciever circuit prototype&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;With the regenerative reciever project and my SDR, I also needed an antenna that can operate at both 7 MHz and 14 MHz, so I began to make a 40m dipole antenna (20m physical length) with choking coils midway though to give me both a 7 MHz and 14 MHz resonance. The coil values were called to be approximately 45 microhenrys, so I began winding them around a 3 inch piece of PVC. Using an LC meter I recently purchased, I was able to measure the inductance fairly accurately.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201903&#x2F;dc4bec931650b1d091c8ae5334a38e0e.jpg&quot; width=&quot;35%&quot; alt=&quot;Antenna coil&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201903&#x2F;6f46f83759a187a6a603e6197d657b6a.jpg&quot; width=&quot;35%&quot; alt=&quot;Antenna coil inductance&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;Another project I worked on briefly was converting a Wii remote nunchuck into a controller for games on my PC.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
    &lt;video width=&quot;35%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;201903&#x2F;165a77b9d1681ac191f633456e53a76a.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Wii remote nunchuck controller for PC&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;april-2019&quot;&gt;April 2019&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;In april of 2019 I began my attempts at capturing the image transmitted from the NOAA-19 satellite that flys overhead my area. The NOAA-19 satellite transmits a black and white image over 137.1 MHz using automatic picture transmission (APT). To capture these signals however, I needed a suitable antenna that can recieve circularly polarized radio waves. The antenna of choice for simplicity was a turnstile antenna. The idea here is that you have two dipoles tuned to 137.1 MHz, and their feedpoints are connected by a set length of coax to provide a 90 degree phase shift. My first prototype was made with 14 AWG solid core wire connected to a 3D printed jig and mounted to some spare 1 inch conduit tubing as a mast. This antenna worked well enough that I was able to capture a semi-decent image.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201904&#x2F;61b624869391bbfd58cd91281b8133e9.jpg&quot; width=&quot;35%&quot; alt=&quot;Turnstile antenna&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201904&#x2F;72d50e5016d5bb89a545ba0397f74050.jpg&quot; width=&quot;35%&quot; alt=&quot;Turnstile antenna&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201904&#x2F;1624495c3e1f854ab149be695cebe87e.jpg&quot; width=&quot;35%&quot; alt=&quot;Resulting transmission capture&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I then opted to make a second better antenna with a slightly more rigid construction using PVC fittings and tape measures. The amateur radio community finds ways to make antennas as cheap and effective as possible, and tape measures are the way to do that. Since tape measures have the curve to them, it makes for an easy to fold and store antenna, but also offers good rigidity in light wind.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;I cover more on this later on &lt;em&gt;&lt;a href=&quot;..&#x2F;20-projects#may-2020&quot;&gt;May 2020&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201904&#x2F;f01b970a19dbf884ca83d7a33e949ae3.jpg&quot; width=&quot;35%&quot; alt=&quot;Turnstile antenna v2&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201904&#x2F;8f2602ac6523de31ca348bfdf5e9a68f.jpg&quot; width=&quot;35%&quot; alt=&quot;Turnstile antenna v2&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201904&#x2F;1335c0b3b41fee1d33f77dd4fe9319b8.jpg&quot; width=&quot;35%&quot; alt=&quot;Turnstile antenna v2&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201904&#x2F;247cde6d25a178869e7a77294fa6c835.jpg&quot; width=&quot;35%&quot; alt=&quot;Turnstile antenna v2 next to v1&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;Another experiment I worked on at this time was working with acoustic radar sensors and volatile organic compound sensors using an Arduino Pro Micro and OLED display. This was more of a functionality test of both the sensors, display, and software libraries.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201904&#x2F;72581b71ead8e240bac0198249e17108.jpg&quot; width=&quot;35%&quot; alt=&quot;Sonar radar sensor test 1&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201904&#x2F;bdfbbb036f7df0cb27a193660dc14bfd.jpg&quot; width=&quot;35%&quot; alt=&quot;Sonar radar sensor test 2&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201904&#x2F;11ebbc9a04898f50c75147feacef5459.jpg&quot; width=&quot;35%&quot; alt=&quot;Sonar radar sensor&quot;&#x2F;&gt;
    &lt;img src=&quot;media&#x2F;201904&#x2F;d4f818b103910e968c5acb71bf3082e9.jpg&quot; width=&quot;35%&quot; alt=&quot;VOC sensor test&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;I was also playing around with more coils, this time I was making the secondary for a small tesla coil. Spoiler alert, it didn&#x27;t work, and the reason: not enough turns. Never enough turns! But it was good practice, and the coil looks very clean which is always nice to see.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201904&#x2F;5456a1f628ca5f98a047bc61eca1090f.jpg&quot; width=&quot;35%&quot; alt=&quot;Tesla secondary&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201904&#x2F;be6e2bc49ebd19ee33f124c5dde7b018.jpg&quot; width=&quot;35%&quot; alt=&quot;Tesla secondary inductance&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;may-2019&quot;&gt;May 2019&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;May was the month I completed yet &lt;strong&gt;another monumental project&lt;&#x2F;strong&gt;. I was able to finish my regenerative reciever, and it worked! I was able to listen to signals from 6.5 MHz all the way up to around 8 MHz. I packaged everything into a wooden box which you may recognize it from the mini subwoofer project I made at the beginning of the year. Being that it is a regenerative reciever, there are two knobs you need to turn in either to tune the radio. The blue knob is the main frequency selector, and the black round knob is the regeneration amount.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201905&#x2F;258424894b72f9d7a747ecf26a2156d6.jpg&quot; width=&quot;35%&quot; alt=&quot;Regenerative reciever complete&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201905&#x2F;693387596207d0c857a92ea8ff545b8f.jpg&quot; width=&quot;35%&quot; alt=&quot;Regenerative reciever in use&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201905&#x2F;1a4af24a089d9d509f0cb10364694661.jpg&quot; width=&quot;35%&quot; alt=&quot;Regenerative reciever breadboard prototype&quot;&#x2F;&gt;
    &lt;video width=&quot;35%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;201905&#x2F;f869164e479f428f4461ebb3a9c05668.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Regenerative Reciever radio amateur&#x27;s morse code&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
    &lt;video width=&quot;35%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;201905&#x2F;3dab90863b1e34dbdad213835733caa5.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Regenerative Reciever recieving spanish AM station&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;While listening in on various stations such as a spanish shortwave station around 6.6 MHz and various morse code signals from amateur radio operators, I was also viewing the signals from my SDR. This night was particularily busy, which was a great time to test my regenerative reciever.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201905&#x2F;c3377029ac605c555fcd40d68fb33786.jpg&quot; width=&quot;35%&quot; alt=&quot;40m amateur radio band&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;The antenna I used to recieve these signals was a regular quarter-wavelenth dipole tuned to 7.1 MHz. I made a large choke at the feedpoint to try and improve my reception.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201905&#x2F;041311f7f95e1ba3a4fa317b0906d4f8.jpg&quot; width=&quot;35%&quot; alt=&quot;feedline choke on antenna&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201905&#x2F;44a9c266a9f8275e2f1c3aa692b8d92d.jpg&quot; width=&quot;35%&quot; alt=&quot;feedline choke&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;During this month I also worked on a few other projects. I wanted to make a speedometer for my bike, so I grabbed an Arduino and GPS module, and with a little bit of programming I created a speedometer. It was rather crude but worked great. One issue however was that the OLED was difficult to see in the sun. A takeaway from this project is that LCDs with no backlight are much better in sunlit environments.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201905&#x2F;6ae5e16c38bf1be867fa4ba01ab70c73.jpg&quot; width=&quot;35%&quot; alt=&quot;GPS speedometer breadboard&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201905&#x2F;357913eeb5571ead1963935cef7231c8.jpg&quot; width=&quot;35%&quot; alt=&quot;GPS speedometer on bike&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;Another project I worked on was a &lt;em&gt;very useful&lt;&#x2F;em&gt; binary keyboard. What does it do? Well, it makes the process of typing a single letter 8 times slower and more complicated! Essentially, what you do is type out the sequence of 1&#x27;s and 0&#x27;s according to the ascii character you want to send, and once the register is full, the letter is sent as a keyboard input to the computer. If you make an error while typing out the binary ascii character, you press the reset button to clear the register and then you can start over. Was it practical, no. Was it fun, yes.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201905&#x2F;3e2d60fe677700568243df0a1fa48611.jpg&quot; width=&quot;35%&quot; alt=&quot;Ascii binary keyboard&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201905&#x2F;24650a4c259285ca858684442e539de0.jpg&quot; width=&quot;35%&quot; alt=&quot;Ascii binary keyboard&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;To finish off this month, I also explored dual tone multi-frequency (DTMF) detection with my Baofeng handheld VHF radio and an arduino. Using some libraries I found, I was able to decode DTMF tones, which could be used in a number of applications and projects.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201905&#x2F;376a649d7f8c7fde3b80601213648168.jpg&quot; width=&quot;35%&quot; alt=&quot;DTMF decoding using an arduino&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;june-2019&quot;&gt;June 2019&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Another project I made (which I can&#x27;t find many images of) was a tremelo guitar effect pedal. I used a DIY optocoupler consisting of a white LED and a photoresistor taped together with elecrical tape. Ironically, I don&#x27;t play guitar or own a guitar. Instead I tested the circuit out on my familys electric piano, and the effect was quite interesting. It worked as intended, but is an unexpected noise to hear from a piano.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201906&#x2F;208c71d617802275a69ac8f9f68f9b9d.jpg&quot; width=&quot;35%&quot; alt=&quot;Tremelo pedal breadboard&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201906&#x2F;864864a1a79b7f53090b880b83c10806.jpg&quot; width=&quot;35%&quot; alt=&quot;Tremelo pedal prototype&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;At this time I also had a chance to etch my own circuit board during my electronics class. Using a marker, I drew thick lines to mask where I wanted to keep copper, and then using ferric chloride etchant I was able to achieve a functional result. This board was for the regenerative reciever circuit which I finished designing in &lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;projects&#x2F;19-projects&#x2F;#may-2019&quot;&gt;May 2019&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201906&#x2F;f4b7d4c973dab234595375235cb8ab03.jpg&quot; width=&quot;35%&quot; alt=&quot;Before etch&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201906&#x2F;d9f28b6ded0319806706991bb857f0db.jpg&quot; width=&quot;35%&quot; alt=&quot;After etch&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;july-2019&quot;&gt;July 2019&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;I did a couple fun projects this month. I had purchased some serial LoRa boards to try out low powered digital communications with my ESP8266. I first tested the range of the transmitters, and achieved an astounding 10km, which was the furthest I went on my bike that day. Since LoRa works around 915MHz, and at a power far below 1W, it is quite impressive. I took it a step further however, and added a simple chatroom webpage for the ESP8266 to broadcast so I can connect to it through my phone. With that I was able to send text messages (line of sight of course) without the need of infrastructure.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201907&#x2F;1b68d79d3b98d5c10a457477da3a05cd.jpg&quot; width=&quot;35%&quot; alt=&quot;Testing LoRa boards&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201907&#x2F;8d5d4370f5b044fd7135efe4b0b40bc8.jpg&quot; width=&quot;35%&quot; alt=&quot;ESP8266 LoRa transcievers&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;Continuing with the theme of radios, I found some resources online on how I could make a Morse code decoder with an arduino, so I built one and it was quite fun to use with the regenerative reciever I had built.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201907&#x2F;2a875aca8566ea4bd0532c13624f6c88.jpg&quot; width=&quot;35%&quot; alt=&quot;Morse code decoder&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;Another project I worked on this month was a PT2399 reverb IC circuit. I was working on making a reverb effect pedal for my familys electric piano.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201907&#x2F;65b602348653930b30e85802d48c0285.jpg&quot; width=&quot;35%&quot; alt=&quot;PT2399 Breadboard circuit&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;august-2019&quot;&gt;August 2019&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Continuing along with etching, I wanted to see what I could use to etch my own boards at home (&lt;em&gt;while staying cheap&lt;&#x2F;em&gt;). I ended up finding a guide online that used a mixture of 2 parts hydrogen peroxide (2%) with 3 parts white vinegar and a gram of table salt per litre.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201908&#x2F;3a88e6a2373508efa04080529a07c468.jpg&quot; width=&quot;35%&quot; alt=&quot;Board before etch&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201908&#x2F;1e8b58d3a77852d2e6181157b326faca.jpg&quot; width=&quot;35%&quot; alt=&quot;Board after etch&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201908&#x2F;7e2ab47069929e8db9ab590494b4d07c.jpg&quot; width=&quot;35%&quot; alt=&quot;Boards in etchant solution&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;Another project I made with this etching experiment was a small stylophone using a 555 and resistor chain to create the different notes.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201908&#x2F;f76dde48d0e7a6fe269be9c9426e1187.jpg&quot; width=&quot;35%&quot; alt=&quot;555 Stylophone before etch&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201908&#x2F;1ac6f57afdd9a1f583e194774bb8e1fb.jpg&quot; width=&quot;35%&quot; alt=&quot;555 Stylophone&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;september-2019&quot;&gt;September 2019&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;In september I worked on making a function generator using an AD9833 waveform generator.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
    &lt;video width=&quot;35%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;201909&#x2F;62d1eaf01dfee0e5fd937f9d3036eaa7.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;AD9833 function generator&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
    &lt;video width=&quot;35%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;201911&#x2F;ef95b0c39ce8dd4799829df52b8a621f.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;AD9833 function generator on an oscilloscope&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;I also bought a simple UART receipt printer, so I made a small random number generator that also generates unique one time pads for secret messages.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
    &lt;video width=&quot;35%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;201909&#x2F;ba9bf40f274ebd0b4de390870acc8074.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Random number generator with receipt printer&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;october-2019&quot;&gt;October 2019&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;I didn&#x27;t do too much this month, but I did spend some time capturing NOAA-19 satellite imagery.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201910&#x2F;out.png&quot; alt=&quot;NOAA-19 image&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;november-2019&quot;&gt;November 2019&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;I spent some time this month experimenting with addressible RGB LEDs.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201911&#x2F;417e41012c2924f4453011d15ec60b5d.jpg&quot; width=&quot;35%&quot; alt=&quot;RGB LEDs&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201911&#x2F;6c448415c4d793159b710606b5b67d00.jpg&quot; width=&quot;35%&quot; alt=&quot;RGB LEDs&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;december-2019&quot;&gt;December 2019&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;During this month I made a piezo pickup for my kalimba. I used some passive filtering on the volume potentiometer similar to how electric guitars may have. The piezo was glued into the center of the instrument with a 1&#x2F;4 inch audio jack at the base. Once complete, I was able to record audio from it while I was playing, and it was suprisingly clear too.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201912&#x2F;0efccd2c7e6757d0781f066ac302eb54.jpg&quot; width=&quot;35%&quot; alt=&quot;Potentiometer soldering&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201912&#x2F;6531fc5f52f02a0e5a90d964417709a2.jpg&quot; width=&quot;35%&quot; alt=&quot;Potentiometer soldering&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201912&#x2F;4aeb1434f13fff7f476b8f057e1c4de6.jpg&quot; width=&quot;35%&quot; alt=&quot;Electric kalimba&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201912&#x2F;e3330b3fb1dafcbe2bea8e8e25c8cf1e.jpg&quot; width=&quot;35%&quot; alt=&quot;Electric kalimba&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>2018 Project Collection</title>
        <published>2018-01-01T00:00:00+00:00</published>
        <updated>2018-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikebell.cc/projects/18-projects/"/>
        <id>https://mikebell.cc/projects/18-projects/</id>
        
        <content type="html" xml:base="https://mikebell.cc/projects/18-projects/">&lt;p&gt;2018 was the year I began my journey in learning electronics. Originally, I had an interest in computers and computer components, so I was typically found tinkering with computer hardware and making video game servers for some games me and my siblings enjoyed playing.&lt;&#x2F;p&gt;
&lt;p&gt;Later down the road, in 9th grade, I registered to an electronics course. This course introduced me to all the various electronic circuit components used to make a functional device. When I finished the course work early, I would tinker and occasionally experiment at home as well.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;febuary-2018&quot;&gt;Febuary 2018&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;My first electronic project was an audio reactive LED.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
    &lt;video width=&quot;35%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;201802&#x2F;44214f23357cb9d3cf9b980cb4ec5704.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Audio reactive LED&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;march-2018&quot;&gt;March 2018&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Initially I had an interest in computers, software, and how they functioned. I had an old desktop that I would experiment with for instance, loading different operating systems such as Windows 7, Windows XP, Linux Mint, Ubuntu, Fedora, and making servers for some popular video games I would play with friends. Around this time I learned a lot about the command line in windows.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201803&#x2F;ce44c86830b8dc1a07878a0a6462bf86.jpg&quot; width=&quot;35%&quot; alt=&quot;Computer&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201803&#x2F;fb83ef7f57dcc100fe8e9c0a634e86d8.jpg&quot; width=&quot;35%&quot; alt=&quot;Computer&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;My first attempt at working with an active electronics component was making this audio amplifier. I had no clue how these magic little three legged components worked, but I gave it my best shot while following resources online. I soldered this circuit together onto a cut piece of plastic from a milk jug. It was quite a start, and no, it did not work... &lt;em&gt;as expected...&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201803&#x2F;c021e8ef232955cbc30a516222d05bbe.jpg&quot; width=&quot;35%&quot; alt=&quot;BJT Audio Amplifier&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;april-2018&quot;&gt;April 2018&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;In April 2018, I created a stulus pen by using an old mouse and some lego.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
    &lt;video width=&quot;35%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;201804&#x2F;e3249d88255b0987a184e53e6c7e6d3a.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Converting mouse into stylus&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;may-2018&quot;&gt;May 2018&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;May 2018 was around the time I was introduced to arduinos and the world of microcontrollers. The &lt;a href=&quot;..&#x2F;community.md#robotics-club&quot;&gt;robotics club&lt;&#x2F;a&gt; at my high school had gotten some arduino learning and development kits, and being overly curious I took interest in learning about what I could make with it.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201805&#x2F;5294ab93965832ba62441cadd6383b86.jpg&quot; width=&quot;35%&quot; alt=&quot;Arduino and LCD display&quot;&#x2F;&gt;
    &lt;video width=&quot;35%&quot; autoplay muted loop&gt;
		&lt;source src=&quot;media&#x2F;201805&#x2F;c5f1afd6e910d821f4c4b3cfc0c0900d.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;LCD Display Video&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This was also the beginning of my programming journey, as all I had done before this was windows cmd and batch scripts.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;I was also creating some interesting projects in my electronics class as well, such as a binary counter with 7 segment display output and a siren circuit.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;video width=&quot;35%&quot; controls muted&gt;
		&lt;source src=&quot;media&#x2F;201805&#x2F;ca8e9e3301fbeab8e10e317bcd69fecd.mp4&quot; type=&quot;video&#x2F;mp4&quot; width=&quot;35%&quot; alt=&quot;Counter&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
	&lt;video width=&quot;35%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;201805&#x2F;fb826c732e084f3eea6b4636e13dbb5b.mp4&quot; type=&quot;video&#x2F;mp4&quot; width=&quot;35%&quot; alt=&quot;Siren&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;june-2018&quot;&gt;June 2018&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;June of 2018 was a busy month for projects. This was near the end of the school term and I kept myself busy in the electronics course I was registered to. Going in no particular order, I worked on the following projects:&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Being bored in my electronics class, I decided to be proactive and make something fun. I searched for a circuit online to bump up voltage and discovered how to make a boost converter. At this time, I had no knowledge of the math and calculations needed to make one of these work, but I managed to make one that was functional. I never took any operating point measurements, but from what I recall, the boost converter was capable of taking 9V in from a battery and bump it up to 80V.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201806&#x2F;588527909dac3f0ce59be0a6a5993bcd.jpg&quot; width=&quot;35%&quot; alt=&quot;Boost Converter&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201806&#x2F;7b829364c03b124153db5c7a3a4f7af2.jpg&quot; width=&quot;35%&quot; alt=&quot;Boost Converter&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;Another project that stemmed from boredom was a lamp I made. I had an LED strip from an old light and wanted to make something fancy with it, so during my woodwork class, I made a nice lamp body out of maple hardwood and brought it to my electronics class. In class I soldered the LED strip to some wires and glued the LEDs into the wood lamp body. Using paper as a diffuser resulted in a nice looking desk lamp.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201806&#x2F;47f411e2caba2fcb14a8e4b720066f79.jpg&quot; width=&quot;35%&quot; alt=&quot;LED Lamp&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201806&#x2F;fa50b4d9620c054e7444e6e6f15541a5.jpg&quot; width=&quot;35%&quot; alt=&quot;LED Lamp&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;At home, I recently bought an Espressif ESP8266 wifi microcontrolelr to play around with. I experimented with connecting to APIs and making small webservers from the microcontroller.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201806&#x2F;565a07be71e53ea47529875bcf18cf26.jpg&quot; width=&quot;39%&quot; alt=&quot;ESP8266&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201806&#x2F;5929a64b41d38d586c2aff7bbb15b2bd.jpg&quot; width=&quot;59%&quot; alt=&quot;Code!&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;For more fun with Arduinos, I experimented with servo motors and made a small two-axis servo pointer. The idea with this creation was to have it randomly move a laser to entertain my cat.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201806&#x2F;249a52c309d041adfc3937c0bfc162e0.jpg&quot; width=&quot;39%&quot; alt=&quot;Servos!&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201806&#x2F;ea2516a48f9d474e10758149bce1603b.jpg&quot; width=&quot;59%&quot; alt=&quot;Servo control circuit&quot;&#x2F;&gt;
    &lt;video width=&quot;35%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;201806&#x2F;5828f586e1221a6b96e780214434b49b.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Servo Gantry Video&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;I was always in need of a power supply for my experiments at home, so I got my hands on some LM317 linear DC regulator ICs. With the help of some guides I found online, I built a 1.25V to 12V DC power supply.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201806&#x2F;b7426ec63031f3ab93c33d27e7da7142.jpg&quot; width=&quot;35%&quot; alt=&quot;DC Power Supply&quot;&#x2F;&gt;
	&lt;video width=&quot;35%&quot; muted loop autoplay&gt;
		&lt;source src=&quot;media&#x2F;201806&#x2F;f8086454e5f76b9ea80472f43524200d.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Power Supply&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;Lastly for this month was my &lt;strong&gt;greatest achievement at the time&lt;&#x2F;strong&gt;. I was able to create a counter. &lt;em&gt;sounds boring, I know&lt;&#x2F;em&gt;, but it was quite a learning curve for me. This was the first complex circuit I had made at the time. Using a 555 timer, binary up-counter, binary to 7 segment decoder, and some discrete logic with diodes to create gates, I was able to create a counter that incremented from 00 to 99!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201806&#x2F;3ddccafbd7f07056ad51bb5054c8084d.jpg&quot; width=&quot;31%&quot; alt=&quot;Counter Circuit&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201806&#x2F;81b2af6f16813e9eba31be9d114ad308.jpg&quot; width=&quot;31%&quot; alt=&quot;Counter Circuit&quot;&#x2F;&gt;
	&lt;video width=&quot;31%&quot; autoplay loop muted&gt;
		&lt;source src=&quot;media&#x2F;201806&#x2F;e755947332ed21877a98564554260141.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;Counter&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;july-2018&quot;&gt;July 2018&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;This month I made a small altoids tin game controller. The idea sprung up when I learned that an Arduino Pro Micro can be used as a human interface device (HID) and send keyboard or mouse inputs to a computer. I wanted to try and make a small controller for the fun of it, and so I did.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201807&#x2F;57be3cb86dd0b9abebbe75bee424293d.jpg&quot; width=&quot;35%&quot; alt=&quot;Altoids Game Controller&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201807&#x2F;a79e148ac9bbf80d454a286d150dab43.jpg&quot; width=&quot;35%&quot; alt=&quot;Altoids Game Controller&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;Another experiment I did was making my Arduino output music through PWM.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;video width=&quot;35%&quot; controls muted&gt;
		&lt;source src=&quot;media&#x2F;201807&#x2F;b57d2ecbb8788e00e31651027776f35e.mp4&quot; type=&quot;video&#x2F;mp4&quot; width=&quot;35%&quot; alt=&quot;Arduino Music&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;aug-2018&quot;&gt;August 2018&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;When I was experimenting with API connections and webpages using the ESP8266 wifi enabled microcontroller, I wanted to display information. This was done with a 2x16 character LCD screen connected to the microcontroller through I2C. At the time of creation, I didn&#x27;t make the device do much, but later on in early 2019, I made the ESP8266 pull satellite information from the web and tell me when the international space station was overhead.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201808&#x2F;04e96f01e1d02cc4b81311b717377fdc.jpg&quot; width=&quot;35%&quot; alt=&quot;ESP8266 with LCD&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201808&#x2F;43e578a3073cd4b23e756fb2bbf9d46e.jpg&quot; width=&quot;35%&quot; alt=&quot;ESP8266 with LCD&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201808&#x2F;40216ed12f01689d78ffb33dc427312d.jpg&quot; width=&quot;35%&quot; alt=&quot;ESP8266 with LCD displaying satellite information&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201808&#x2F;ad630b42999458f0dee70978d5a74def.jpg&quot; width=&quot;35%&quot; alt=&quot;ESP8266 with LCD displaying satellite information&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Another milestone I made&lt;&#x2F;strong&gt; was this two transistor FM transmitter. I didn&#x27;t know much of anything about radios, impedances, antennas, or related topics, but I was extremely curious and wanted to try making this circuit. So after some failed attempts, I was able to create this FM transmitter. It had a decent audio quality over my dads truck FM reciever, but the oscillator was very suceptible to stray capacitance and would change frequency anytime I got close to the antenna or circuit board.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201808&#x2F;421c00eac53e4e4711a5f05bacfbfc2e.jpg&quot; width=&quot;31%&quot; alt=&quot;FM transmitter version 1&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201808&#x2F;92171248b9bebf7338a92e45dffbbf72.jpg&quot; width=&quot;31%&quot; alt=&quot;FM transmitter reference schematic&quot;&#x2F;&gt;
	&lt;video width=&quot;31%&quot; controls&gt;
		&lt;source src=&quot;media&#x2F;201808&#x2F;c77c3542787690d15782116d6228cf1e.mp4&quot; type=&quot;video&#x2F;mp4&quot; alt=&quot;FM transmitter video&quot;&#x2F;&gt;
	&lt;&#x2F;video&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;The schematic shown above was more of a reference as I implemented (&lt;em&gt;to the best of my ability at the time&lt;&#x2F;em&gt;) a buffer&#x2F;amplification stage with another transistor after the first transistor. I cover another version I made of this transmitter in &lt;a href=&quot;https:&#x2F;&#x2F;mikebell.cc&#x2F;projects&#x2F;18-projects&#x2F;#oct-2018&quot;&gt;October 2018&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;september-2018&quot;&gt;September 2018&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;September wasn&#x27;t very full of projects, but I did begin playing around with operational amplifiers. In this case, I was looking into how I could make a microphone for my computer so I can talk with friends over &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;discord.com&#x2F;&quot;&gt;discord&lt;&#x2F;a&gt;. Using an electret mic and an op amp that &lt;em&gt;I really cant remember the part number of&lt;&#x2F;em&gt;, I was able to make the worst quality microphone possible! It was quite entertaining as my friends kept saying my mic sounds like I&#x27;m at niagra falls or in a severe rainstorm. Noisy!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201809&#x2F;aef38168e68c21bd358158426229b30e.jpg&quot; width=&quot;35%&quot; alt=&quot;DIY Microphone&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201809&#x2F;bb6428ef7cb32ea67d86b755e15ba522.jpg&quot; width=&quot;35%&quot; alt=&quot;DIY Microphone schematic&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;I also made some LED lighting for my monitors during this time. This was more solder practice than it was an experiment.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201809&#x2F;a11cd6ac6f9a4ce1e2afd1b8f962ac04.jpg&quot; width=&quot;35%&quot; alt=&quot;Monitor Lights&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201809&#x2F;b6cbccf8a9ea2a2fcb64c51d2bee90c0.jpg&quot; width=&quot;35%&quot; alt=&quot;Monitor Lights&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;oct-2018&quot;&gt;October 2018&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;During this month I gave the FM transmitter project another go, and made version 2! This transmitter worked a little more reliably, and after some reading I learned a little more about impedances and matching. Mind you I didn&#x27;t know how to apply it let alone the circuit analysis required, but I still threw it in there as an experiment.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201810&#x2F;76c723df1e45acef8dba6b49d5d358dd.jpg&quot; width=&quot;35%&quot; alt=&quot;FM Transmitter version 2&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;I also bought a small 7MHz (40m band) morse code reciever kit as I was getting interested in amateur radio around this time.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201810&#x2F;22d441c5186074ba363514b8f2d919cd.jpg&quot; width=&quot;35%&quot; alt=&quot;40m band morse code reciever kit&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;november-2018&quot;&gt;November 2018&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;November was a quiet month, the only experiment I have record of for this month was a Samsung S7 that I was able to gain root access to. This is a process known as Rooting, where you unlock the bootloader, flash a new bootloader, and then you have the ability to load any android operating system you&#x27;d like. In this case, I flashed an android OS called OxygenOS. I ran into issues right away however as the cameras did not function properly. This sort of issue made me choose to revert to the OEM samsung operating system.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201811&#x2F;7f118aaea5634120812ca744ecedc9dd.jpg&quot; width=&quot;35%&quot; alt=&quot;Samsung S7 Rooted&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
&lt;hr &#x2F;&gt;
&lt;h1 id=&quot;december-2018&quot;&gt;December 2018&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;If you remember the laptop I had in a couple of the previous images on this page, it was reaching its end of life as it had a number of issues. I decided, instead of throwing it all away, why not salvage the screen! So I took out the screen from the laptop, bought a driver board for it (for cheap too, it was only $30 at the time), and mounted it to a sheet of acrylic.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
	&lt;img src=&quot;media&#x2F;201812&#x2F;2ffe70a533b5075ea9beb206aeed54a2.jpg&quot; width=&quot;35%&quot; alt=&quot;Laptop screen repurposing&quot;&#x2F;&gt;
	&lt;img src=&quot;media&#x2F;201812&#x2F;79f5c2e4a0b82d36ed86cb659de6735c.jpg&quot; width=&quot;35%&quot; alt=&quot;Laptop screen repurposings&quot;&#x2F;&gt;
&lt;&#x2F;figure&gt;
</content>
        
    </entry>
</feed>
