Home Education Projects About Me Links
Email Phone

Computer Engineer

headshot
I graduated Magna Cum Laude from University at Buffalo with a degree in Computer Engineering. I have had an interest in programming and hardware since I was little. I am passionate about technology and I am constantly pursuing deeper knowledge about how the technology that surrounds us works.

You can see some of the projects that I have done in class and more about my education in the Education section.

I have programming experience with both low level and high level programming. You can see some of my personal projects that I have been working on in the Projects section.

You can see some of my non technical hobbies and interests in my About Me.
Senior Design Control Systems Robotic Algorithms Operating Systems Embedded Systems Microprocessors Computational Intelligence Systems Programming Computer Organization Math/Physics

Education


This section contains summary of what I did and what I learned in some of my favorite classes. My education also includes several math classes, physics, and some electrical engineering classes, but my favorite classes involve low level programming and microprocessors.

Senior Design

For my senior design project, I worked with a group of 8 other students to design and implement a sensory wall for a near by elementary school.
The first thing the team decided on was what we were going to create. We decide upon making 4 games which we decided on as a group. The 4 games we made were Bop it, Whack-a-mole/Simon-Says, a maze wheel and an LED matrix drawing game. During the initial design phase of the project, one of our main concerns was how we were going to mount the games to the wall. As a group we decided that back plate for each game would be consistent across all modules except for the maze wheel. We found that toggle bolts would be a good solution to mount our back plates to the wall. There were many other small details that we discussed as a group such as power routing and finding the specific hardware that we would need.
We split into pairs to implement each game. I worked on the LED matrix art game that we named "Picture This". My partner and I spent a lot of time figuring out how we were going to control the game. As opposed to the other games, we had much more creative freedom because this was not already a well defined game. After many meetings, we decided on a joystick to control the cursor, and several arcade push buttons to perform operations such as changing color, change draw mode, reset and erase. The art would be displayed on 2 64x32 matrices chained together to make one large 64x64 display. The microcontroller that we chose was a teensy 4. The main reasoning behind this was that there was a product called a "LED Matrix Smart Shield" which made driving the matrices much easier because we would not have to worry as much about the pin out that was required.
During our implementation phase, the main set back was waiting for parts. The main element that we were missing for a long time was the smart shield. While there was documentation that showed the pinout of the matrix, there was still some ambiguity that made testing our code difficult. One of the unfortunate side effects of using the smart shield was the library that we had intended on using was intended to be used in the Arduino ide. Due to this, the code isn't set up in a way that I would usually try to implement something like this, but this important thing is that everything worked in the end.
One cool thing the professor did for this class was allowing the class to vote on who had the best designed project (1st semester) and best implemented project (2nd semester) and whoever won the vote would get a guaranteed A for that semester. My group happened to win the vote for the best implementation.
The code for these project can be found on Github.
senior senior senior senior senior

Control Systems

This was another project based class and the goal was, by the end of the semester to have a working control system to be able to show at the engineering demo day.
I worked in a group of 4 and we decide on making an automated blinds control system. Our inputs for the system were temperature and light level. The amount that the blinds were opened adjusted according to those two inputs using 2 stepper motors.
The first thing we brainstormed on was how we were going to design the blinds - would they be vertical or horizontal, could they be opened manually. We decided on vertical blinds and had originally planned to only use 1 stepper motor, but after testing we found that the wire that held the blinds would pinch and cause the blinds on the end to not be able to behave properly. Switching to two steppers, one on each end solved this problem. Something that we were not able to solve in the timeframe that was given was there were times when the temperature sensor would read corrupt values and cause the system to get stuck in its current state until a correct reading was read. As it turns out, temperature is difficult for cheap sensors to read. It may have been better to find a better sensor that could provide a more consistent reading.
In order to have a nice prototype for demo day, we built a small window. I designed and 3D printed some mounts to hold the stepper motors in place. We also 3D printed the blinds to give them a more consistent look as opposed to cutting them from some other material. We also found some spare acrylic to act as the "glass" for the window.
The code for these project can be found on Github.
control control

Robotic Algorithms

In this class I implemented several common algorithms that are often used in robotics using ROS (Robotic Operating System). Some of those algorithms include obstacle detection and avoidance, BUG2, A*, RANSAC, and Bayes algorithm. All of these projects were done using simulation software and visualization guis that were provided through ROS. All of these algorithms were done in C++ with the exception of matplotlib visualizations being done in python.

robot robot robot robot

Operating Systems

This class is less "flashy" to talk about, but I learned a lot about operating systems and how the kernel works. The projects for this class were based on Pintos, which is an incomplete operating system and through out the semester we implemented threads, scheduling, user programs, and virtual memory.
For the threads project, we used synchronization primitives' such as semaphores and locks to protect the threads critical section. We also implemented 2 forms of scheduling which included MLFQS and priority.
The next part of the project was to implement a way for user programs to be run on the OS. I enjoyed this part much more than the first because it was more memory management oriented. This involved stack packing process call inputs, and working with the file system. We also had to keep track of what was considered user memory vs kernel memory and if a program tried to access invalid memory a page fault would be sent.
We also implemented virtual memory which was much more on the theoretical side of things. We learned that virtual memory allows the OS to act as if it has infinite memory by keeping the active processes in RAM and inactive processes on disk. When a context switch is necessary the OS will determine if it needs to move data out of RAM onto disk if there is not enough space for the new process or just place the new processes data into RAM.

Embedded Systems

For this class a Nucleo-144 was used. I implemented 2 major projects, a timer system and what I called an "Alternative Hearing Device".
The timer project used a 4x4 keypad to control the timer and a 16x2 LCD to display the time and prompts. A string of number inputs were input and parsed to be converted into minutes and seconds so that the time could be decremented via a timer interrupt every second. I wrote the code with the intention of allowing the time to go beyond 9:59, but due to the restrictions of the project description it is currently set to not go past the ten minute mark.
The "Alternative Hearing Device" used a series of sound transducers to collect sound at different levels and displayed the sound level on the LCD as well as provided physical feedback via a vibration motor. A rotary encoder was used to adjust the intensity of the vibration motor. There are things for this project that I would have liked to do differently, but I was restricted to the scope of the class.
The code for these project can be found on Github.
embed embed

Microprocessors

This course has been my favorite class that I have taken so far. This course utilizes the Tiva C processor model EK-TM4C123GPM which uses an ARM Cortex-M4 Processor. All the programming in this class has been done in ARM assembly. I have learned how to utilize GPIO from the microprocessor at a 'bare-metal' level by using bitwise control. Interrupts via GPIO buttons and the clock were used and initialized using bitwise control.

I implemented a version of the game "FlowFree". This project is using everything that I have learned throughout the class. I am used ANSI escape sequences to provide color to the game and several custom made data structures in order to track positions of the links and cursor movement. One of my favorite aspects of programming in assembly is pointer math (which I also enjoyed when programming in C). I find being able to manipulate raw memory very rewarding. The repository can be seen here (asm is in lab6 folder): FlowFree
micro mirco micro micro micro

Computational Intelligence

In this class, I learned about how computational intelligence techniques can be used in the context of hardware. There were 4 major projects for this class which included: Fuzzy Controller, Time Series, Microgrid Controller, and a written paper to summarize a IEEE technical paper. All the coding projects were completed in MATLAB.

The time series project was an implementation of representation techniques over time and how to classify classes into specific groups with a reduction in the number of dimensions used. The representation techniques used were PAA and SAX and the classification types were Euclidean and Manhattan. Project on Github: Time Series

The project that I enjoyed the most in this class was the Microgrid project. This project used a Genetic Algorithm to predict the best power output from 4 varying sources. The GA used 2 survival techniques: elitism and random selection as well as 2 reproduction techniques: mutation and crossover. More information on the implementation can be seen here: Implementation.
The project on Github: Microgrid

Systems Programming

This class had many labs and projects that were programmed in C. Prior to this class, programming was not coming easy to me, but this is where it all started to click for me. In this class, I learned memory manipulation, and pointer math. These skills have vastly helped me program in assembly, because memory manipulation is so important. Unfortunately I am unable to share some of the code that was produced as a part of this class, due to UB's strict academic violation policy, but I can share what was done.

One of the major projects that was included in this class was one where I had to develop an implementation of the C functions: malloc(), calloc(), realloc(), and free(). In order to create this implementation, sbrk() was used in order to create a chunk of memory that was accessible. I then used a linked list that stored valid memory addresses that were 4 bytes apart. malloc, pulled the required amount of memory off the linked list, and free put memory back onto the linked list. While this, is an over simplified version of what complexities were involved in this program, this project boosted my confidence significantly as a developer.

Computer Organization

This class involved my introduction to assembly, but specifically MIPS assembly was used. The main part of this class, was to learn how a computer actually works. The CPU data path was an important aspect of the class. I learned how languages like C are compiled into assembly and how that assembly is converted to machine code. In the fall of '21 I was a TA for this class.

The major project that this class had was to take a list of x,y coordinates and sort the coordinates by Euclidean distance in MIPS assembly. The sort algorithm that I used was essentially selection sort. One thing that I enjoyed in this project that was not a requirement was finding a way to print that data to the terminal screen in an organized manner. obviously testing is not easy when it comes to programming in assembly and this subroutine to print the data vastly helped with my success on this project. The code for this project can be seen here: Least Euclidean Distance

Math/Physics

Throughout my college career I was required to take several math and physics courses. The courses include:
- Calculus I, II, III
- Discrete Math
- Probability and Statistics
- Differential Equations
- Linear Algebra
- Physics I, II
Calendar 3D Printing 2048 Game of Life Watch AutoHotKey x86 Assembly Chrome Extension VS code

Projects

I have worked on many projects, and really enjoy programming in my free time. The only way to get better at something is through practice and programming is no exception to this rule.

Calendar

This project started as a simple new tab page. I didn't like the way that chromes dark mode new tab looked, so I thought that I could do it better. This started out by having the search bar and the icons on the top right of the screen and it evolved from there.

I began this project a couple weeks before Covid 19 caused everything to go online. I had the idea to incorporate my calendar into this new tab shortly before this had happened. During this time I had been in a data structures class, so it was the perfect time to take on this type of project and it is also the reason I chose to use Scala. I knew there were ways that I could download the ical file automatically, it was just a matter of parsing the file. This code has undergone several ground up rebuilds and at this moment I would say it is perfect for my use case.

One of the main parts of this calendar were that I wanted to have the location displayed on the new tab page. After this implementation and after moving to online, I realized that I could place my class meeting links in the location field. After some regex to place the main site location as the name to be display, I know had a way to enter my lectures without having to search for a link for a specific class. To this day I have yet to miss an online lecture.

When the semester ended I had the idea to make a full blown calendar using the same parsing code that I used for the new tab. Now, making a simple calendar that was placed in a simple html grid would have been easy, but I wanted the ability to have user input. I developed a way that I could click on a specific day and that days events would appear on the left of the calendar. I also included time indicators on each event. When an event is approaching it turns cyan and when it is current it turns red. There are a few other options that can manipulate this feature, like it flashes red if exam is in the description and it is currently an active event.

After the calendar was designed I purchased a raspberry pi that now sits in my room and displays my calendar all day with the help of some bash files to initiate parsing every thirty minutes and to power off the display at night.

There was a lot of thought that went into the design and implementation of this project. You can see the code for this project here: Calendar
cal cal cal tab tab tab

3D Printing

I really wanted to get more into 3D modeling, but didn't have a true reason to start. After I got my 3D printer I have worked on many small projects that have given me a basic understanding of how modeling works. Most of the modeling that I have done has been editing a model that has already been made by someone else. This has helped me understand how other people take on the design process to tackle a project of my own from scratch.

One design that I am particularly proud of is a laptop stand that I designed to lift my laptop to a more ergonomic position. While the design has some room for improvement, I have found it very useful and I use it everyday.
laptop laptop laptop laptop

2048

This project was created with the same microcontroller as used in my Microprocessors class with the addition of the EduBase. When writing code for this microcontroller, there are not any preexisting libraries, so everything has to be written from scratch (LCD code was adapted from external source). All interrupts and GPIO configurations had to be done via bitwise control of the necessary registers. There is more information about the project implementation on Github.
2048 2048

Game of Life

Originally I had this project as a homework assignment in my systems programming course. I did this as a quick weekend project to see what could be done in just a few days. There are many things about this project that I would do very differently today, but I also learned a lot while working on this project.

One of my major project requirements was that the used had to be able to click on any of the squares to test there own design on the algorithm. This was important to me because the algorithm in itself is quite simple, I needed something to make this last a weekend. As I said before, if I did this project again I would do it very differently. The code if far from efficient, but I also didn't want to break the spirit of the original idea to see what could be done in a weekend and change it now.
The code for this project can be found here: Game of Life
gameoflife gameoflife

Watch

I started making watch faces in High School using an app called Watchmaker. This app allowed for easy design while also allowing for scripting using Lua. This was some of the first programming that I had ever done.
At the moment I am trying to rebuild this same watch face natively for a Samsung watch in C.
watch watch watch

AutoHotKey

One thing that I enjoy is creating programs that make programming and working on a computer in general more efficient. I do that with AutoHotkey. I have made several custom key bindings and GUIs to make my workflow easier. Being a programmer there are many shortcuts that text editors have that the operating system does not. I use AutoHotkey to mimic some of these shortcuts.

I also have some experience making guis with AutoHotkey. One GUI that I have made is to display my music volume when it is increased or decreased. This was necessary because originally I just make a key binding to adjust my music volume, but I had no visual reference for how high or low it was. I designed the GUI to look exactly like the windows volume in the top left corner, but instead of a white block it has a green one.
music

x86 Assembly

I took some time to learn the basics of x86 assembly. The approach I took was to use the nasm assembler. This approach gave me access to the OS syscalls as apposed to my project that was done in my Microprocessors course which had no OS.

Before I was able to start this project I set up an Ubuntu Server VM with Virtual Box which I run in headless mode. This allows me to ssh into the VM with the VScode extension Remote-SSH. I am able to write all my code and run it with the built in terminal as if I was wasn't working off of a VM.

I started to learn the syntax by writing some useful subroutines that can be used for debugging such as: print_string, int_to_string, print_hex (which can print the value in a register) and a memory dump. The memory dump routine is particularly useful because it shows all the current values in memory given a starting address and size and it prints out as if I was using an IDE. This code can be found at ASM Library

After I built these debugging tools, I wanted to try to implement the game of life. I chose this because it was something I was familiar with, but also requires a bit of memory management. That code can be found at ASM GOL

x86asm x86asm

Chrome Extension

This is a basic chrome extension that I made. Its purpose is to provide easier access to streaming websites when my laptop is in tablet mode. While I am working, I often like to have something playing in the background. This may slightly decrease my productivity, but I have found that I get frustrated less when I have a video playing while doing work.
video

VS code

This isn't necessarily a project per se, but I believe in efficient programming. An hour spent to adjust a text editor for efficiency can be several hours saved in the future. I have taken my time to get truly comfortable with vs code that it is now my go to. Sure, it isn't as light weight as emacs or vim, but it also opens much quicker than some other IDE's that are available.
Hobbies Interests

About Me

While a large part of my life is done working with computers I do have many things that I enjoy to do when I am not sitting In front of my computer.

Hobbies

Skiing

One of my favorite things to do in the winter is ski. I have been skiing since I was about 4 years old and I have loved it ever since. I raced for a little while when I was in middle and high school and even went to the state championship a couple times.

Electric Skateboarding

When it is too warm to ski, I enjoy electric skateboarding. It gives me the same adrenalin rush that skiing gives me, but I can do it when it is warm. It is a lot of fun to some smooth pavement and carve around at full speed.

Cooking

Something that calms me down after a stressful day is cooking. At one point imposter syndrome was hitting me pretty hard and I was considering going to culinary school.

Interests

Technology

I am really interested in technology. I love hearing about the newest best device that is just coming out and watching review about them. I enjoy talking to people about what is new and what is good and bad about the devices. This was one of the big influences for getting into Computer Engineering

Cars

Another thing that I am really interested in is cars. While it may only ever be a dream of mine to be able to own a two hundred thousand dollar car, I still really enjoy admiring them.
up arrow Top