Piers Kwan
About Me
Welcome!
I am a Computer Engineer with an interest in embedded systems and machine learning. I value hard work, doing things the right way, and being responsible for my work (documentation!). In my free time, I enjoy (more) programming, photography, racket sports, cooking, coffee/wine, and music. Here on my portfolio I intend to give a more in depth view of my work; something that could not be afforded on a resume.
Projects
Project Image
Autonomous Search and Rescue Drone

I worked in a team of six engineers to design a low-cost and effective autonomous search and rescue drone. From our benchmarking, we found that many existing solutions involve drones that cost thousands of dollars with limited flight time. Our goal was to produce a drone for less than a thousand dollars with a sufficiently long flight time. I managed the sensor, mechanical control, and electrical subsystems. For the sensor subsystem, I designed a simple HAL that allowed for communication with the accelerometer, magnetometer, gyroscope, barometer, and GPS. A similar HAL was designed for the mechanical control subsystem to interface with the ESCs and servos. The use of the abstraction layer expedited development of interfaces to these external components. For the electrical subsystem, a PCB was then designed to distribute power and signals between the various components and development boards. Finally, I was responsible for the integration of the sensor, mechanical control, electrical, and kernel subsystems during final assembly. Although the drone never took off, this project provided an excellent opportunity to learn and practice engineering concepts.

Project Image
Attitude and Heading Reference System (AHRS)

An AHRS is responsible for processing raw IMU data into attitude information. During my senior design project (Autonomous Search and Rescue Drones), a major challenge was the cost of processing raw sensor data and sensor fusion. My goal was to create a device that was affordable and able to offload complex computations away from a central processor. As a result, I designed and fabricated a two layer PCB that interfaces with a Bosch BMX055 9-DoF IMU with an ARM Cortex-M4 microcontroller---my first serious PCB. To accomplish this, I researched PCB design best practices and learned about surface mount soldering. To my surprise, after fixing a bit of solder that did not reflow properly, the fabricated board had no electrical issues. I am currently working on board bring-up. At this point, I have designed a basic HAL, initialized the clock to use the external oscillator, and have been able to communicate with the IMU. Currently, I am working on designing a more complex debug interface and writing drivers to read from the IMU. In the future, I plan on implementing a Kalman filter for sensor fusion.

Project Image
VGA Demo Using an ARM Cortex-M0+ Development Board

This project happened in my second year of college. A friend and I wanted to do something challenging and fun for the final project of our Assembly Language Programming class. At the time, there were many things we did not know about (such as interrupt latency). We studied the VGA specification and made note of the vsync and hsync pulses required to specify timing to the monitor. To generate these pulses, we used the TPM (Timer PWM Module) on the Kinetis KL46 MCU and bitbanged the color signals to the DAC included on the VGA adapter. In the end, we were never able to sync the signals using interrupts and instead used thousands of the no-op instructions to manually time the signals. We were able to successfully display a solid color to the screen.

Project Image
FPGA Neural Network Accelerator using Systolic Arrays

This accelerator was my part of a larger project to design and implement a VLSI Layout of a neural network accelerator tuned for image edge detection. Systolic arrays allow for complex computations to be pipelined in multiple dimensions through a grid of compute elements. The choice of systolic arrays to perform the matrix multiplcations allowed for a more efficient use of area over fully parallel designs. Efficient use of area allows for a reduction in the complexity of routing the layout. The implemented systolic array featured memory mapped input/output, a data fabric to deliver data, and multiply accumulate compute elements. The systolic array was able to complete a matrix multiplcation in a matter of clock cycles.

Project Image
Portfolio Website

Knowing close to nothing about web development, I decided to learn some! Through the process of making this portfolio, I learned a lot more about how web technology works. Here we have my portfolio; where I used Hugo, HTML, CSS, and some Javascript to make what you are seeing right now.

Project Image
Others

Over the years, I have accumulated quite a few projects. Examples are a hamming code demo (C), an artificial neural network implementation with backpropagation (C), a spiking neural network implementation (Pytorch), and audio generation using an FPGA (VHDL). I will continue to post more projects that I deem worthy here, but feel free to contact me about any of the above!

Skills
Embedded C

The C Programming Language is one of my favorite languages. It's fast, portable, and when you mess up, you know it's your fault. I am most familiar with ARM Cortex-M microcontrollers from STM and NXP. I am also experienced with debugging tools such as the Saleae Logic Analyzer and Black Magic Probe (JTAG/SWD).

Python 3

Python is an extremely powerful language; but, with great power comes great responsibility. I prefer to use Python as a scripting language or for prototyping, and not shipped software.
I have experience with designing extensible frameworks using importlib.

Machine Learning

Machine learning has intrigued me since my first year in college; however, studying it has allowed me to step off the hypetrain. My preferred framework is Pytorch, but I have experience in Tensorflow, SciKit Learn, Numpy, SciPy, Matplotlib, Pandas, and many other frameworks.

The Linux Operating System

Linux has been my go-to operating system since my second year of college. Using ArchLinux has motivated me to learn about how the system works, especially by fixing things when they break.
Developing on Linux has allowed me to become familiar with bash, make, meson, gcc, valgrind, and gdb.

Hardware Design

Experience in designing PCBs for power distribution and signal integrity. I use Altium Designer for schematics, bill of materials, and layout.
I have some experience with SPICE, FGPAs (Xilinx Vivado), and VLSI Layout.

Continuous Integration

Experience setting up development environments that lint, build, and test code, using Docker, JIRA, Bitbucket, and Jenkins Build Server.
I prefer the Agile/Scrum methodology and have experience in code reviews.

Embedded Protocols

Familiar with communication protocols such as UART, I2C, and SPI.
I am also experienced with GPS NMEA, and the hardware specifications of USB.

Git

Git is my preferred version control system.

et al.

For the sake of brevity, not everything is listed above. Additional skills include CUDA, ARM Thumb Assembly, VHDL, and more.

Experience
Software Engineer - Persistent Systems LLC
June 2019 - August 2019

At Persistent Systems, I developed code for an embedded Android Mobile Ad Hoc Network radio.

Some of my projects include:
- Designing an extensible testing framework in Python 3. The testsuite dynamically imported tests, allowing additional tests to be added simply by implementing a Python 3 class and adding it to the directory.
- Developing a parameter configuration tool with a graphical user interface in Java.
- Developing firmware for the device to assist parameter configuration.

Research Assistant - Rochester Institute of Technology
January 2019 - May 2019

I researched memristive devices under a PhD candidate in the Neuromorphic AI Lab. Memristors are non-linear, two terminal, variable resistance devices. I worked on using particle swarm optimization to fit data points from an IV curve to the VTEAM memristor model to solve for a set of constants.

Computer Engineering Intern - Parsons Cyber
June 2018 - December 2018

At Parsons, I developed POSIX compliant, userspace C code for embedded Linux devices. I designed and implemented an extensible log parser in Python 3 for data analytics. To improve the efficiency of the team, I implemented a Jenkins pipeline to lint, build, and test pull requests.

Teaching Assistant - Rochester Institute of Technology
August 2017 - December 2020

I graded and mentored students in Computing for Engineers, Introduction to Computer Engineering, Digital Systems Design II, Digital IC Design, Interface and Digital Electronics, and Brain Inspired Computing.

Education
Bachelor of Science in Computer Engineering
August 2016 - December 2020

Rochester Institude of Technology
Immersion in Mathematics

Master of Science in Computer Engineering
August 2018 - December 2021

Rochester Institude of Technology
Research on Memory Augmented Neural Networks and Task Incremental Learning