<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://caseytmorris.com/feed.xml" rel="self" type="application/atom+xml" /><link href="http://caseytmorris.com/" rel="alternate" type="text/html" /><updated>2026-02-21T03:02:25+00:00</updated><id>http://caseytmorris.com/feed.xml</id><title type="html">Casey T. Morris</title><subtitle>Casey Morris - Software Engineer Project Home</subtitle><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;&quot;/assets/images/casey-profile.jpg&quot;, &quot;bio&quot;=&gt;&quot;30% done with 47 projects&quot;, &quot;location&quot;=&gt;&quot;Charlotte, NC&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Email&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-envelope-square&quot;, &quot;url&quot;=&gt;&quot;mailto:casey@caseytmorris.com&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/caseymorris61&quot;}, {&quot;label&quot;=&gt;&quot;LinkedIn&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-linkedin&quot;, &quot;url&quot;=&gt;&quot;https://www.linkedin.com/in/casey-morris-96105346/&quot;}, {&quot;label&quot;=&gt;&quot;Resume&quot;, &quot;icon&quot;=&gt;&quot;fas fa-download&quot;, &quot;url&quot;=&gt;&quot;/docs/resume.pdf&quot;}]}</name></author><entry><title type="html">TeeTimeCaddy</title><link href="http://caseytmorris.com/blog/2025/08/15/teetime-caddy/" rel="alternate" type="text/html" title="TeeTimeCaddy" /><published>2025-08-15T16:00:00+00:00</published><updated>2025-08-15T16:00:00+00:00</updated><id>http://caseytmorris.com/blog/2025/08/15/teetime-caddy</id><content type="html" xml:base="http://caseytmorris.com/blog/2025/08/15/teetime-caddy/"><![CDATA[<p>I’m excited to share <a href="https://apps.apple.com/us/app/tee-time-caddy/id6752501496">TeeTimeCaddy</a>, an iOS app I built to solve a problem that many golfers face: constantly checking booking systems for available tee times at popular public golf courses.</p>

<p style="text-align: center;"><img src="/assets/images/tee-time-logo.png" alt="TeeTimeCaddy Logo" width="400px" /></p>

<h2 id="the-problem">The Problem</h2>

<p>Anyone who’s tried to book a tee time at a popular public golf course knows the frustration. You check the booking system repeatedly, hoping to catch a cancellation or newly opened slot, especially for those coveted weekend morning times. It’s tedious, time-consuming, and often fruitless. I found myself in this exact situation, constantly refreshing booking pages and still missing out on the times I wanted.</p>

<h2 id="the-solution">The Solution</h2>

<p>TeeTimeCaddy eliminates the need for manual checking by monitoring tee time availability at your favorite courses and sending you instant push notifications when slots that match your preferences become available. Instead of spending time repeatedly checking booking systems, you can configure your preferences (like Saturday and Sunday mornings) and let the app do the monitoring for you.</p>

<p style="text-align: center;"><a href="https://apps.apple.com/us/app/tee-time-caddy/id6752501496">
  <img src="https://tools.applemediaservices.com/api/badges/download-on-the-app-store/black/en-us?size=250x83&amp;releaseDate=1735689600" alt="Download on the App Store" style="width: 200px;" />
</a></p>

<h2 id="the-technology-stack">The Technology Stack</h2>

<p>TeeTimeCaddy is built with a modern, serverless architecture that keeps the backend simple and scalable. The app uses <a href="https://supabase.com">Supabase</a> for both authentication and data storage, making it easy to manage user accounts and store their tee time preferences securely.</p>

<p>The backend monitoring system is powered by Supabase Edge Functions, which handle the periodic scraping of golf course booking systems. These functions are triggered automatically by GitHub Actions running on a cron schedule every 15 minutes, ensuring that availability is checked frequently enough to catch newly opened slots while remaining efficient and cost-effective.</p>

<p>This architecture provides several benefits:</p>
<ul>
  <li><strong>Supabase Auth</strong>: Handles user authentication seamlessly, with built-in support for email/password and social logins</li>
  <li><strong>Supabase Database</strong>: Stores user preferences, course selections, and notification settings in a PostgreSQL database</li>
  <li><strong>Supabase Functions</strong>: Serverless functions that scrape tee time availability without requiring a dedicated server</li>
  <li><strong>GitHub Actions</strong>: Reliable, free cron scheduling that triggers the scraping functions every 15 minutes</li>
</ul>

<h2 id="how-it-works">How It Works</h2>

<p>Users configure their alert preferences by selecting:</p>
<ul>
  <li>Their preferred courses</li>
  <li>Desired days of the week</li>
  <li>Preferred time ranges</li>
</ul>

<p>Once configured, TeeTimeCaddy continuously monitors availability at these courses. When a tee time opens up that matches your preferences, you receive an instant push notification. From there, you can tap through to book directly with the course - TeeTimeCaddy doesn’t handle bookings itself, ensuring you maintain your direct relationship with the golf course.</p>

<h2 id="looking-forward">Looking Forward</h2>

<p>TeeTimeCaddy is now available on the <a href="https://apps.apple.com/us/app/tee-time-caddy/id6752501496">App Store</a> and I’m excited to see how it helps golfers secure their ideal tee times. The app represents a combination of practical problem-solving and modern serverless architecture, leveraging tools like Supabase and GitHub Actions to create a reliable, scalable solution.</p>

<p>If you’re a golfer who’s tired of constantly checking booking systems, give TeeTimeCaddy a try. I’m always looking to expand the list of supported courses, so if you have a favorite course you’d like to see added, or if you have any other feedback or suggestions, I’d love to hear from you!</p>

<p>Note: AI assisted with this blog post.</p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;&quot;/assets/images/casey-profile.jpg&quot;, &quot;bio&quot;=&gt;&quot;30% done with 47 projects&quot;, &quot;location&quot;=&gt;&quot;Charlotte, NC&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Email&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-envelope-square&quot;, &quot;url&quot;=&gt;&quot;mailto:casey@caseytmorris.com&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/caseymorris61&quot;}, {&quot;label&quot;=&gt;&quot;LinkedIn&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-linkedin&quot;, &quot;url&quot;=&gt;&quot;https://www.linkedin.com/in/casey-morris-96105346/&quot;}, {&quot;label&quot;=&gt;&quot;Resume&quot;, &quot;icon&quot;=&gt;&quot;fas fa-download&quot;, &quot;url&quot;=&gt;&quot;/docs/resume.pdf&quot;}]}</name></author><category term="jekyll" /><category term="update" /><category term="project" /><category term="ios" /><category term="supabase" /><summary type="html"><![CDATA[I’m excited to share TeeTimeCaddy, an iOS app I built to solve a problem that many golfers face: constantly checking booking systems for available tee times at popular public golf courses.]]></summary></entry><entry><title type="html">Launching BeaconFound</title><link href="http://caseytmorris.com/blog/2025/06/08/beaconfound-launch/" rel="alternate" type="text/html" title="Launching BeaconFound" /><published>2025-06-08T16:00:00+00:00</published><updated>2025-06-08T16:00:00+00:00</updated><id>http://caseytmorris.com/blog/2025/06/08/beaconfound-launch</id><content type="html" xml:base="http://caseytmorris.com/blog/2025/06/08/beaconfound-launch/"><![CDATA[<p>I’m excited to announce the launch of <a href="https://beaconfound.com">BeaconFound</a>, a new solution for lost item recovery that I’ve been working on. This project represents a significant milestone in my journey as a developer and entrepreneur, combining technical innovation with real-world problem-solving.</p>

<p style="text-align: center;"><img src="/assets/images/beaconfound-logo.png" alt="BeaconFound Logo" width="400px" /></p>

<h2 id="the-genesis-of-beaconfound">The Genesis of BeaconFound</h2>

<p>The idea for BeaconFound has been brewing for about 1.5 years. Like many good ideas, it came from a personal experience - the frustration of losing items and the realization that there wasn’t a simple, effective way to connect lost items with their owners. I built an initial proof of concept back then, but it wasn’t until recently that I had the opportunity to fully realize this vision.</p>

<h2 id="the-development-journey">The Development Journey</h2>

<p>I had some down time on the weekends and wanted to explore and get familiar with modern AI coding tools, specifically <a href="https://lovable.ai">Lovable</a> and <a href="https://cursor.sh">Cursor</a>. These tools proved to be game-changers in the development process.</p>

<p>I’ll admit, I was initially skeptical about AI coding tools. Like many developers, I wondered if they could truly understand the nuances of building a production-ready application. However, I came away thoroughly impressed with their capabilities. These tools provided an incredible jump-start to the development process, helping with everything from boilerplate code to complex logic implementation.</p>

<p>That said, it’s important to note that while AI tools are powerful accelerators, they’re not magic wands. Building BeaconFound still required significant work, careful planning, and deep understanding of the technical requirements. The AI tools were more like having a highly skilled pair programmer - they could help with the heavy lifting, but the vision, architecture decisions, and final polish still needed human oversight.</p>

<h2 id="the-technology-behind-beaconfound">The Technology Behind BeaconFound</h2>

<p style="text-align: center;"><img src="/assets/images/beaconfound-tag.png" alt="BeaconFound Tag" width="300px" />
<img src="/assets/images/beaconfound-tag2.png" alt="BeaconFound Tag 2" width="300px" />
<img src="/assets/images/beaconfound-tag3.png" alt="BeaconFound Tag 3" width="300px" /></p>

<p>For those interested in the technical details of how BeaconFound works, I’ve written a more in-depth post on our <a href="https://beaconfound.com/blog">blog</a>. There, I share the origins of the project, technical challenges we faced, and the solutions we implemented.</p>

<h2 id="looking-forward">Looking Forward</h2>

<p>As BeaconFound moves from development to operation, I’m entering a new phase of learning. Running a business involves much more than just building a great product. I’m particularly focused on:</p>

<ul>
  <li>Marketing and customer acquisition strategies</li>
  <li>SEO optimization to help people find our service</li>
  <li>Understanding user behavior and needs</li>
  <li>Building a sustainable business model</li>
</ul>

<p>This next phase is both exciting and challenging. While I’m comfortable with the technical aspects of the project, I’m looking forward to learning more about the business side of things. It’s a different kind of challenge, but one that I’m eager to tackle.</p>

<h2 id="join-the-journey">Join the Journey</h2>

<p>If you’re interested in following along with BeaconFound’s journey, you can:</p>
<ul>
  <li>Visit our <a href="https://beaconfound.com">website</a></li>
  <li>Read our <a href="https://beaconfound.com/blog">blog</a> for technical deep-dives and updates</li>
  <li>Try out the service if you’ve lost something or found an item</li>
</ul>

<p>I’m grateful for the support and feedback from the community as we continue to grow and improve BeaconFound. Here’s to making the world a little less frustrating, one found item at a time!</p>

<p>Note: AI assisted with this blog post.</p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;&quot;/assets/images/casey-profile.jpg&quot;, &quot;bio&quot;=&gt;&quot;30% done with 47 projects&quot;, &quot;location&quot;=&gt;&quot;Charlotte, NC&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Email&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-envelope-square&quot;, &quot;url&quot;=&gt;&quot;mailto:casey@caseytmorris.com&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/caseymorris61&quot;}, {&quot;label&quot;=&gt;&quot;LinkedIn&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-linkedin&quot;, &quot;url&quot;=&gt;&quot;https://www.linkedin.com/in/casey-morris-96105346/&quot;}, {&quot;label&quot;=&gt;&quot;Resume&quot;, &quot;icon&quot;=&gt;&quot;fas fa-download&quot;, &quot;url&quot;=&gt;&quot;/docs/resume.pdf&quot;}]}</name></author><category term="jekyll" /><category term="update" /><category term="project" /><category term="startup" /><summary type="html"><![CDATA[I’m excited to announce the launch of BeaconFound, a new solution for lost item recovery that I’ve been working on. This project represents a significant milestone in my journey as a developer and entrepreneur, combining technical innovation with real-world problem-solving.]]></summary></entry><entry><title type="html">WagerLeagueBets</title><link href="http://caseytmorris.com/blog/2025/05/01/wagerleaguebets/" rel="alternate" type="text/html" title="WagerLeagueBets" /><published>2025-05-01T16:00:00+00:00</published><updated>2025-05-01T16:00:00+00:00</updated><id>http://caseytmorris.com/blog/2025/05/01/wagerleaguebets</id><content type="html" xml:base="http://caseytmorris.com/blog/2025/05/01/wagerleaguebets/"><![CDATA[<p>I’m excited to share <a href="https://wagerleaguebets.com">WagerLeagueBets</a>, a web application for a fantasy sports betting idea I’ve been carrying around for 8 years. Some down time and exploring some AI coding tools finally brought to life.</p>

<p style="text-align: center;"><img src="/assets/images/wager-league-bets-logo.png" alt="WagerLeagueBets Logo" width="400px" /></p>

<h2 id="the-genesis">The Genesis</h2>

<p>The idea for WagerLeagueBets has been in my mind for about 8 years. At its core, the concept is simple: create a way to bet on sports and compare yourself to friends without actually wagering money. I wanted a platform where you could make picks, track your performance, and see how you stack up against your friends - all the fun and competition of betting, but purely for bragging rights and friendly competition.</p>

<h2 id="the-technology-stack">The Technology Stack</h2>

<p>WagerLeagueBets is built on a modern, scalable architecture using <a href="https://supabase.com">Supabase</a> for both authentication and database management. Supabase’s PostgreSQL database serves as the backbone of the application, storing all league data, user information, and bet tracking details.</p>

<p>One of the most interesting technical aspects of this project was exploring PostgreSQL functions for managing bet tracking. Rather than handling all the logic in application code, I leveraged PostgreSQL’s powerful function capabilities to handle complex calculations, bet validation, and league standings updates directly in the database. I did this as an attempt to keep all bet changes atomic and because I wanted to play around with the database functions. However, going forward, it would be easier to manage in a serverless function or other backend code!</p>

<p>The application uses Supabase Auth for secure user authentication, making it easy for users to sign up, log in, and manage their accounts. The combination of Supabase’s authentication and database services created a seamless development experience while providing enterprise-grade security and reliability.</p>

<h2 id="the-2025-season-experience">The 2025 Season Experience</h2>

<p>I had the opportunity to put WagerLeagueBets to the test during the 2025 season, participating in two different leagues with friends. It was incredibly rewarding to see the application work in real-world scenarios, handling picks, tracking standings, and managing the friendly competition between league members.</p>

<p>While I didn’t win either league (much to my chagrin), the experience was invaluable. Using the app in real leagues helped me identify areas for improvement, understand user workflows better, and see how the PostgreSQL functions performed under actual load. The feedback from other league participants also provided insights that will help shape future development. Most importantly, it was fun to compete with friends and see who had the best sports predictions - all without any real money on the line.</p>

<h2 id="looking-forward">Looking Forward</h2>

<p>WagerLeagueBets is now live at <a href="https://wagerleaguebets.com">wagerleaguebets.com</a>, and I’m excited to continue improving it based on real-world usage. The project represents a perfect blend of a long-held idea, dedicated development time, and modern technology choices that made it all possible.</p>

<p>If you’re interested in competing with friends on sports predictions without the risk of real money, I’d love for you to give WagerLeagueBets a try. And if you have feedback, suggestions, or feature requests, I’m always eager to hear from users!</p>

<p>Note: AI assisted with this blog post.</p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;&quot;/assets/images/casey-profile.jpg&quot;, &quot;bio&quot;=&gt;&quot;30% done with 47 projects&quot;, &quot;location&quot;=&gt;&quot;Charlotte, NC&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Email&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-envelope-square&quot;, &quot;url&quot;=&gt;&quot;mailto:casey@caseytmorris.com&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/caseymorris61&quot;}, {&quot;label&quot;=&gt;&quot;LinkedIn&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-linkedin&quot;, &quot;url&quot;=&gt;&quot;https://www.linkedin.com/in/casey-morris-96105346/&quot;}, {&quot;label&quot;=&gt;&quot;Resume&quot;, &quot;icon&quot;=&gt;&quot;fas fa-download&quot;, &quot;url&quot;=&gt;&quot;/docs/resume.pdf&quot;}]}</name></author><category term="jekyll" /><category term="update" /><category term="project" /><category term="web" /><category term="supabase" /><category term="postgres" /><summary type="html"><![CDATA[I’m excited to share WagerLeagueBets, a web application for a fantasy sports betting idea I’ve been carrying around for 8 years. Some down time and exploring some AI coding tools finally brought to life.]]></summary></entry><entry><title type="html">KBO Fantasy Baseball</title><link href="http://caseytmorris.com/blog/2020/05/15/kbo-fantasy-baseball/" rel="alternate" type="text/html" title="KBO Fantasy Baseball" /><published>2020-05-15T16:08:12+00:00</published><updated>2020-05-15T16:08:12+00:00</updated><id>http://caseytmorris.com/blog/2020/05/15/kbo-fantasy-baseball</id><content type="html" xml:base="http://caseytmorris.com/blog/2020/05/15/kbo-fantasy-baseball/"><![CDATA[<p>2020 has been a unique year in so many ways. One of the less important differences was the lack of professional sports for more than 3 months. The beginning of the pandemic had already claimed March Madness, the start of the MLB season, the Masters, and the beginning of the NBA and NHL Playoffs in a few short (or very long) weeks. Korean baseball was one of the first sports to return, so I decided to fill the void and create a KBO fantasy site for all sports-starved fans!</p>

<h2 id="kbo">KBO</h2>
<p style="text-align: center;"><img src="/assets/images/KBO_logo.png" alt="KBO" width="300px" height="150px" /></p>
<p>The Korean Baseball Organization, or KBO, is the highest level of professional baseball in Korea. I had heard of it over the last few years as some former MLB players chose to play there, and vice versa. They resumed playing at the end of April and with the lack of sports, it gained a bit of popularity in the US. They even began showing a few games a day on ESPN in the mornings. Another reason for its ability to catch on was the English language site dedicated to KBO, <a href="https://mykbostats.com/">MyKBO</a>. This site was started as a hobby by Korean-American baseball fan and was full of terrific stats tailored to the English speaking fans. Understandably, its traffic exploded during the pandemic. While the site did contain a weekly fantasy contest where all users competed against one another and all created their own teams, it was different than traditional fantasy leagues that could be played amongst friends.</p>

<h2 id="fantasy-baseball">Fantasy Baseball</h2>
<p>One mid-morning, one of my buddies, Matt, called me to ask if I would be interested in starting a Korean Fantasy Baseball league. Having been impressed and excited after watching a game or two of the early season, I was sold. He suggested we look for a way to start a league, and if not, see if we could put something together ourselves. As it turned out, there was no fantasy sports provider that offered a season long KBO league (there were Daily KBO Fantasy sports, but that was not what we were looking for). We wanted a league much like our MLB and NFL fantasy teams, where we draft teams for the season and compete over the course of the year.</p>

<p>The week that Matt called I had just started diving into building some simple webapps using JavaScript. The only web app dev I had done to that point had been a Django based project, but from all of the Meetups I had been to in Memphis, it was clear JavaScript frameworks were something I should dive into. This also was around the time I started to learn about Firebase and its SDKs that enable real-time databases to sync and update single page applications. So, after we concluded that there was no existing solution for a KBO fantasy baseball league, I figured I might as well try to build a web app myself! I knew the data was already available on MyKBO, so I only needed to make the fantasy logic. This timing of his call was really perfect and this gave me the perfect project for me to learn more about web development and javascript frameworks.</p>

<p><img src="/assets/images/KBO_add_players.png" alt="KBO" width="300px" height="150px" />
<img src="/assets/images/KBO_league.png" alt="KBO" width="300px" height="150px" /></p>

<h2 id="javascript">JavaScript</h2>

<p>In some of my previous minor dealings with web dev, I had come across JavaScript very minimally and did not have a good understanding of how it worked and how it made websites so powerful. People at work and at Meetups would mention things like Node, and it would confuse me further. I wasn’t able to see the difference between JavaScript as a language/syntax, and Node/browsers as a runtime environment; that is until I started playing around with it.</p>

<p>One of the Firebase tutorials I did for both Android and Web Dev was for a chat app. This really helped me put together the pieces of how the web app was rendered in the browser and interacted with the Firebase backend. This had enough of the basics to take user input in the form of buttons, etc., make CRUD operations in the database, and then view the changes in real time from the single page app. It was from this sample project that I started to build the Fantasy Baseball app.</p>

<h2 id="mvp">MVP</h2>

<p>The MVP (minimal viable product) of the site included the ability to create a league, add teams to the league, list all of the players and allow them to be assigned to one team only per league. The app would then have to keep a history of the performance of each team in order to compare the teams in the league. I decided to use the rotisserie fantasy format, where there are 10 statistical categories that accumulate over the entire season, and then the performance of each team in these 10 categories determine the winner of the league. This was by far an easier format to start with than a weekly head-to-head.</p>

<p>Thus, the MVP required 3 views once authenticated and a team was created: a home view showing the user’s team, a league view showing the standings, and an available players view. The first iteration of the app was actually 3 different javascript pages (not a single page app), each with its own very large and human readable javascript file. A lot of this code was duplicated everywhere and it was not maintainable, but I was able to get a functional site up and running (in large part to Firebase backend with Auth made very easy, and using Firebase hosting and routing for the 3 pages). This allowed our league of 4 to host our draft as early as possible, just 2 weeks into the season and less than 1 week since I learned anything about JavaScript.</p>

<h2 id="vue">Vue</h2>
<p style="text-align: center;"><img src="/assets/images/vue_logo.jpeg" alt="KBO" width="300px" height="150px" /></p>

<p>The initial site left a lot to be desired, plus I wanted something that others could also use if they wanted to play KBO fantasy baseball, so I decided to rewrite the entire site using a modern JS framework. After much research and some sampling, I decided to go with VueJS over React. One of the main reasons I went with Vue was that it seemed a little easier to take existing code and use in the framework than in React (maybe that’s not true but that was how it seemed to me at the time). Taking my 3 page app with tons of repeated/reused code and transforming to components was a genuine light bulb going off moment. It became very clear how the framework was intended to be used and the many benefits it, and other frameworks, brought to web development. It didn’t take too long to get the hang of and to start implementing some really cool features. For example, adding the “Draft” and “Claim” buttons to the player page, as well as the Add/Drop player modals really made the site feel like a true fantasy site.</p>

<h2 id="netlify">Netlify</h2>
<p style="text-align: center;"><img src="/assets/images/netlify_logo.jpeg" alt="KBO" width="300px" height="150px" /></p>

<p>One of the meetups in Memphis I frequented often talked about the “JAMStack” and <a href="https://www.netlify.com/">Netlify</a>. Again, at the time, I was still trying to sort out how a web app was a “static” site (because in my mind Django-like apps were dynamic apps), but I tucked that info away. Now, having started to work on the Vue app, it became clear that this app was a perfect application of the JAMStack and Netlify. Plus, Netlify is a great option for hosting free apps, including benefits like a CDN, all made possible because the site is statically generated. So, I set up the site on Netlify, bought a domain name, and <a href="http://kbofantasybaseball.com">KBO Fantasy Baseball</a> was live for the world to use!</p>

<h2 id="stats">Stats</h2>

<p>One of the many aspects of the site that I have yet to get into much detail is the actual stats shown on the site. As I mentioned <a href="https://mykbostats.com/">MyKBO</a> hosted all of the stats, so I built a Python scrapper to scan the site for updates in players stats by the week. I then updated the stats in my Firebase Database and processed the updates for each fantasy league. This project would not have been possible without all of the data from <a href="https://mykbostats.com/">MyKBO</a>, which I linked to for every player, and they have my eternal thanks.</p>

<h2 id="wrap-up">Wrap Up</h2>

<p>I had infinitely more fun developing the site than participating in the league. As of this writing, I am destined to finish in 3rd place (out of 4), a place I have been stuck in for much of the season. Though the enthusiasm in KBO waned as American sports returned, it was a lot of fun and really was the perfect project to learn more about Web development and JS frameworks. Also, many thanks to the 11 other people who came across the site and signed up. I hope it made the sports-barren time of 2020 a little more bearable. Go Wiz!</p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;&quot;/assets/images/casey-profile.jpg&quot;, &quot;bio&quot;=&gt;&quot;30% done with 47 projects&quot;, &quot;location&quot;=&gt;&quot;Charlotte, NC&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Email&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-envelope-square&quot;, &quot;url&quot;=&gt;&quot;mailto:casey@caseytmorris.com&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/caseymorris61&quot;}, {&quot;label&quot;=&gt;&quot;LinkedIn&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-linkedin&quot;, &quot;url&quot;=&gt;&quot;https://www.linkedin.com/in/casey-morris-96105346/&quot;}, {&quot;label&quot;=&gt;&quot;Resume&quot;, &quot;icon&quot;=&gt;&quot;fas fa-download&quot;, &quot;url&quot;=&gt;&quot;/docs/resume.pdf&quot;}]}</name></author><category term="jekyll" /><category term="update" /><category term="project" /><summary type="html"><![CDATA[2020 has been a unique year in so many ways. One of the less important differences was the lack of professional sports for more than 3 months. The beginning of the pandemic had already claimed March Madness, the start of the MLB season, the Masters, and the beginning of the NBA and NHL Playoffs in a few short (or very long) weeks. Korean baseball was one of the first sports to return, so I decided to fill the void and create a KBO fantasy site for all sports-starved fans!]]></summary></entry><entry><title type="html">SparkDirector Android App</title><link href="http://caseytmorris.com/blog/2020/04/08/spark-director/" rel="alternate" type="text/html" title="SparkDirector Android App" /><published>2020-04-08T16:08:12+00:00</published><updated>2020-04-08T16:08:12+00:00</updated><id>http://caseytmorris.com/blog/2020/04/08/spark-director</id><content type="html" xml:base="http://caseytmorris.com/blog/2020/04/08/spark-director/"><![CDATA[<p>After years and years of interest in mobile application development, I finally dedicated a chunk of time to bunker down and learn the magic behind apps. This post is about the Android app I built during the early days of the COVID-19 lockdown.</p>

<p style="text-align: center;"><img src="/assets/images/android.png" alt="Android" width="400px" height="200px" /></p>

<p>I have been interested in mobile apps since I started using a smart phone (an Android) in college. A few different times I started to get into app development, but in the earlier days, i.e. 2012-2013, the barrier to entry was a bit higher, especially for an electrical engineer with no software experience. I started to think about getting into app development projects after a while at Orro, since our switch runs Android and an Android app. My bosses were great about helping me get my feet wet in the app space, assigning me beginner tickets and allowing me to spend some time learning that side of software development. Not to mention, we had a lot of Android work to do and only one Android engineer at the time. After a few months, and continued interest in Android, I decided I was ready to start my own app.</p>

<h3 id="udacity">Udacity</h3>
<p>In addition to my work at Orro starting in Android, I did a few free Udacity classes related to Kotlin and Android app development. This was quite a big commitment, but it was definitely worth it. I learned a ton about the frameworks and basic design principles used in Android. The classes were taught by Google employees and were up to date. These classes taught the MVVM architecture (which was different than the MVP we used).</p>
<ul>
  <li><a href="https://www.udacity.com/course/kotlin-bootcamp-for-programmers--ud9011">Kotlin Bootcamp for Programmers</a></li>
  <li><a href="https://www.udacity.com/course/developing-android-apps-with-kotlin--ud9012">Developing Andoird Apps with Kotlin</a></li>
</ul>

<h2 id="sparkdirector">SparkDirector</h2>
<p>At the time at Orro, we ran Android on our switch but we actually didn’t have an Android mobile app. The iOS is mostly needed for setup, but can also be useful for changing the lights. I settled on a project that would be educational for me and solve an actual need. My goal was to create an Android app that could control the Orro lights. Meet <a href="www.caseytmorris.com/sparkdirector">SparkDirector</a>.</p>

<p><img src="/assets/images/SparkDirector_control_empty.png" alt="Android" height="400px" width="200px" />
<img src="/assets/images/SparkDirector_add.png" alt="Android" height="400px" width="200px" />
<img src="/assets/images/SparkDirector_control.png" alt="Android" height="400px" width="200px" />
<img src="/assets/images/SparkDirector_edit.png" alt="Android" height="400px" width="200px" /></p>

<h3 id="ifttt">IFTTT</h3>
<p>One of the latest integrations we had added was <a href="www.ifttt.com">IFTTT</a>. This allowed users to control their lights via other IoT related devices/controls. I had read about RPi based projects that controlled smart light bulbs via IFTTT, so I figured IFTTT could be utilized to create an Android app to control Orro switches. The main idea is to use the Webhooks IFTTT service to create an API to trigger actions to control the Orro light. The idea was based on the tutorial <a href="https://thepihut.com/blogs/raspberry-pi-tutorials/using-ifttt-with-the-raspberry-pi">here</a>.</p>

<p>With the API set up, the main work of the app is to send HTTP Post requests to control the light state. There is no data to retrieve from the switch, so it is just one way communication and relatively straightforward once the endpoints and key is provided by the user. The process does require the user to do some work outside the app in IFTTT to get everything setup.</p>

<p style="text-align: center;"><img src="/assets/images/IFTTT_Orro_connect.png" alt="Android" height="400px" width="400px" /></p>

<p>Note: As of Oct 31st, 2020, IFTTT is only free for 3 applets, which is the number required to control 1 switch.</p>

<h3 id="uiux">UI/UX</h3>
<p>The idea was to make the app look like the Orro app. Each light would have a card with a slider to adjust the light and show the state. Selecting the card then allowed you to edit the settings, in the case of SparkDirector, the api endpoints and keys. The rest of the views are for adding and editing switches.</p>

<h3 id="firebase">Firebase</h3>
<p>Originally, the app was designed to use a local database to store the switch API data in order to control the light. However, I had designs for other cloud based features (vacation mode, scheduled lighting, etc.). This required a backend solution, including authentication and storage. This was a great opportunity to also learn the ins and outs of Firebase. There are easy to use Android libraries, including everything for authentication. Users then must create accounts and can access their switches from multiple phones, etc. Firebase was easy to pick up and easy to implement. Would highly recommend as a backend service for future projects!</p>

<h2 id="resources">Resources</h2>
<p>All of the code for the Android app is available on github <a href="https://github.com/caseymorris61/sparkdirector">here</a>. More information about the app and setup, etc. can be found on the <a href="http://caseytmorris.com/sparkdirector/">SparkDirector website</a>.</p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;&quot;/assets/images/casey-profile.jpg&quot;, &quot;bio&quot;=&gt;&quot;30% done with 47 projects&quot;, &quot;location&quot;=&gt;&quot;Charlotte, NC&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Email&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-envelope-square&quot;, &quot;url&quot;=&gt;&quot;mailto:casey@caseytmorris.com&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/caseymorris61&quot;}, {&quot;label&quot;=&gt;&quot;LinkedIn&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-linkedin&quot;, &quot;url&quot;=&gt;&quot;https://www.linkedin.com/in/casey-morris-96105346/&quot;}, {&quot;label&quot;=&gt;&quot;Resume&quot;, &quot;icon&quot;=&gt;&quot;fas fa-download&quot;, &quot;url&quot;=&gt;&quot;/docs/resume.pdf&quot;}]}</name></author><category term="jekyll" /><category term="update" /><category term="project" /><summary type="html"><![CDATA[After years and years of interest in mobile application development, I finally dedicated a chunk of time to bunker down and learn the magic behind apps. This post is about the Android app I built during the early days of the COVID-19 lockdown.]]></summary></entry><entry><title type="html">GiveCamp 2020: Arrows Nest</title><link href="http://caseytmorris.com/blog/2020/02/28/givecamp-arrows-nest/" rel="alternate" type="text/html" title="GiveCamp 2020: Arrows Nest" /><published>2020-02-28T16:08:12+00:00</published><updated>2020-02-28T16:08:12+00:00</updated><id>http://caseytmorris.com/blog/2020/02/28/givecamp-arrows-nest</id><content type="html" xml:base="http://caseytmorris.com/blog/2020/02/28/givecamp-arrows-nest/"><![CDATA[<p>The Memphis tech community has been a very welcoming and engaging collection of professionals ranging from beginners to experts in a wide variety of fields. One of the signature events is GiveCamp Memphis. This post details my experience at GiveCamp and the great work we did for area non-profits.</p>

<h2 id="givecamp-memphis">GiveCamp Memphis</h2>
<p style="text-align: center;"><img src="/assets/images/givecamp-memphis-logo.png" alt="Android" width="300px" height="150px" /></p>
<p>When I moved to Memphis in July 2019, one of the first things I came across was the rather large and active tech community. There are dozens of monthly meetups for a wide variety of topics, from Python, Data Science, .NET, web dev, etc. Most of the members work in web related software development or IT, but there are quite a few fellow generalists like myself. The biggest (and most often talked about) event in the community was GiveCamp. I heard about it as soon as I started going to meetups and couldn’t wait to be a part.</p>

<p><a href="https://www.givecampmemphis.org/">GiveCamp Memphis</a> is a weekend hackathon where developers and designers in the community team up to work on tech related projects for local non-profits. The non-profits vary in size, from 1 person to giant national organizations like Boys and Girls club, and in need, from website creation, shopify implementation, SEO, etc. On Friday evening, the non-profits give a short presentation about their mission and their needs. Teams are then formed and everyone works non-stop until Sunday afternoon. There were over 20 non-profits and over 100 developers. I couldn’t wait to get started.</p>

<h2 id="arrows-nest">Arrows Nest</h2>

<p>Arrows Nest is an area non-profit that serves as a home for children in need in Memphis. It is run by MK Hill, a terrific woman who has dedicated her life to serving the childern of the community. MK came to GiveCamp basically as a blank slate. She had no domain name and no website, but she needed a dedicated site so she could easily direct people who asked about her mission and were looking for a way to donate. This was an exciting challenge to experience building a wordpress site from scratch.</p>

<p><img src="/assets/images/ArrowsNest-team.jpeg" alt="TheTeam" /></p>

<p>The team for this project mainly consisted of 4 developers and 1 designer. On Friday evening when we formed teams, one of the GiveCamp administrators asked if anyone had Wordpress or web dev experience, of which no one had any real experience. We have may been one of the most inexperienced teams, but we were up for the challenge. We spent some time planning what needed to be done, divded up the responsibilities and went about making MK’s vision a reality.</p>

<h2 id="wordpress">WordPress</h2>

<p>I had known WordPress was very popular and was used in a majority of websites, but I had never really understood how it worked; I didn’t even know there was a difference between wordpress.com and wordpress.org. There were some WordPress experts (and GiveCamp veterans) who were kind enough to do some quick tutorials for participants, and this was a great help in understanding the basics. GiveCamp was also able to secure for each non-profit the use of <a href="https://www.elegantthemes.com/gallery/divi/">Divi</a>, a WordPress theme builder. This gave us access to some very beautiful themes and really gave us a head start on the UI.</p>

<p>The site was to be pretty basic, with a few pages with information about Arrows Nest, but the main goal was to create a Donation page, and to create a custom NavBar that had buttons incorporated to direct users to Donate. Developing customizations into a WordPress theme took a little trial and error, but we were able to find what we needed. In fact, we finished most of the tasks with plenty of time to spare, we were able to add a Product page where visitors were able to purchase coffee (and pay via PayPal) to support Arrows Nest as well. We were very proud of how the team worked together and the site we created. Maybe next year we can get to some of the stretch goals, like SEO improvements, and other means to increase traffic and donations!</p>

<h2 id="wrap-up">Wrap Up</h2>
<p>In all, this was a tremendous experience to meet other developers in the area and to work together to support non-profits in the area. This was my first hackathon in general, and I loved to atmosphere. While I don’t think I would want to work with WordPress full time, it was great to learn more about it and to have the experience of using it to bring a site to life. I can’t wait until next year!</p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;&quot;/assets/images/casey-profile.jpg&quot;, &quot;bio&quot;=&gt;&quot;30% done with 47 projects&quot;, &quot;location&quot;=&gt;&quot;Charlotte, NC&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Email&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-envelope-square&quot;, &quot;url&quot;=&gt;&quot;mailto:casey@caseytmorris.com&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/caseymorris61&quot;}, {&quot;label&quot;=&gt;&quot;LinkedIn&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-linkedin&quot;, &quot;url&quot;=&gt;&quot;https://www.linkedin.com/in/casey-morris-96105346/&quot;}, {&quot;label&quot;=&gt;&quot;Resume&quot;, &quot;icon&quot;=&gt;&quot;fas fa-download&quot;, &quot;url&quot;=&gt;&quot;/docs/resume.pdf&quot;}]}</name></author><category term="jekyll" /><category term="update" /><category term="project" /><summary type="html"><![CDATA[The Memphis tech community has been a very welcoming and engaging collection of professionals ranging from beginners to experts in a wide variety of fields. One of the signature events is GiveCamp Memphis. This post details my experience at GiveCamp and the great work we did for area non-profits.]]></summary></entry><entry><title type="html">RPi Backup Camera</title><link href="http://caseytmorris.com/blog/2019/10/31/rpi-backup-camera/" rel="alternate" type="text/html" title="RPi Backup Camera" /><published>2019-10-31T16:08:12+00:00</published><updated>2019-10-31T16:08:12+00:00</updated><id>http://caseytmorris.com/blog/2019/10/31/rpi-backup-camera</id><content type="html" xml:base="http://caseytmorris.com/blog/2019/10/31/rpi-backup-camera/"><![CDATA[<p>In an effort to modernize Craig’s car, we found a straightforward and simple way to add a backup camera using an RPi and a smart phone. This post details the steps to unlock better parallel parking in any car!</p>

<h2 id="car-modernization">Car Modernization</h2>

<p>My younger cousin Craig (also an EE and also with a MS in power electronics) moved out to the Bay Area about the same time we did. My wife appreciated having Craig around to keep me company and to work on all of our projects while she was busy with residency. He had an older (2003) BMW that he was interested in modifying to add some new bells and whistles. After playing around with and testing some other ideas, including splicing into the CAN bus and monitoring the messages, we decided a project worth finishing would be a backup camera. I took over the SW/FW for the project, and Craig handled the mechanicals.</p>

<h2 id="raspberry-pi-zero-w">Raspberry Pi Zero W</h2>

<p>For a hobby project requiring a camera, my first thought was Raspberry Pi after my positive experience with the <a href="/blog/2019/10/10/photo-booth/">photobooth</a> and other projects. The Pi Zero, the miniature version, was also a logical option as it is very cheap and has plenty of power to stream video. The first task was to figure out how to power the Pi which was to be placed in the trunk. There were a number of options, such as using a recharable 5V USB portable charger, however, we decided to splice into the car wiring in the truck as described in the image below.</p>
<p style="text-align: center;"><img src="/assets/images/Camera_power_connections.png" alt="power" width="400px" height="200px" /></p>

<h2 id="video-streaming">Video Streaming</h2>

<p>With the RPi needing to be in the trunk so that the camera would be in the traditional area, we needed a solution to stream the video to the user. Naturally, a smart phone mounted on the fan vents would be the ideal destination. It turns out that streaming the raw video from an RPi to a mobile phone was trivial; there are numerous smart phone apps to do this, including <a href="https://play.google.com/store/apps/details?id=ca.frozen.rpicameraviewer&amp;hl=en_US">RPi Camera Viewer</a>. All the app needs is the IP address of the RPi, and it basically ssh’s into the Pi and opens a port to stream the Raw H.264 video to the smart phone.</p>

<p>With the mobile phone solution readily available, the only remaining question was how to connect the phone and RPi to the same network in the car. The easiest way to do this was to make the RPi an access point (soft AP mode). This way, the RPi would create a network and the phone would connect to it, allowing the video to stream to the phone, as shown in the figure.</p>
<p style="text-align: center;"><img src="/assets/images/Camera_wifi_connections.png" alt="wifi" width="400px" height="200px" /></p>

<p>Directions to put the Pi into AP mode can be found <a href="https://thepi.io/how-to-use-your-raspberry-pi-as-a-wireless-access-point/">here</a>. The main idea is to edit the hostapd conf files to set the network SSID and password. The commands to start and stop the service are also included. Depending on the use case, the Pi can be configured to start the AP on boot, or, as we did, based on the state of the Reverse signal. Our idea was that the AP would turn on when in reverse so the phone would only connect to it while in Reverse, so that when using the car otherwise, the phone would connect to its normal network. This requires the use of a GPIO, and the script available on my Github <a href="https://github.com/caseymorris61/rpi_backup_camera">here</a>.</p>

<h2 id="mechanicals">Mechanicals</h2>

<p>Craig worked his magic to 3D print a mount for the camera that screwed into the license plate holder to hold the camera, and thread the camera flex cable through the license plate light. The Pi then sat in the trunk door with the power line wired into it. It was a bit janky but worked great! The only issue was that it took 30-45 seconds for the Pi to boot once the car was turned on, which in practice seemed like an eternity while waiting for the camera to start when trying to reverse out of a parking spot. The UX was much better when parking after having driven somewhere.</p>

<p style="text-align: center;"><img src="/assets/images/Camera-outside-mount.jpeg" alt="mount" width="400px" height="200px" /></p>

<h2 id="wrap-up">Wrap Up</h2>

<p>The project didn’t require much SW/FW in terms of lines of code written, but instead more system architecture to define the project, wire it up, and configure the Wifi. However, once we figured out how we could do it, we were happy to see the project through. While we were working on Craig’s car to install the camera in my driveway, a neighbor walked by and asked what we were doing. When we explained the backup camera, he was very unimpressed and told us we could have just bought a camera to do the same thing. I guess he didn’t appreciate the joy of a DIY project! It was a lot of fun and I am glad Craig can now park a bit better.</p>

<p style="text-align: center;"><img src="/assets/images/camera_proto.jpg" alt="mount" width="400px" height="200px" /></p>

<p>2020 Update: Craig sold the car, along with the backup camera! I just hope the included camera increased the resell value!</p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;&quot;/assets/images/casey-profile.jpg&quot;, &quot;bio&quot;=&gt;&quot;30% done with 47 projects&quot;, &quot;location&quot;=&gt;&quot;Charlotte, NC&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Email&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-envelope-square&quot;, &quot;url&quot;=&gt;&quot;mailto:casey@caseytmorris.com&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/caseymorris61&quot;}, {&quot;label&quot;=&gt;&quot;LinkedIn&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-linkedin&quot;, &quot;url&quot;=&gt;&quot;https://www.linkedin.com/in/casey-morris-96105346/&quot;}, {&quot;label&quot;=&gt;&quot;Resume&quot;, &quot;icon&quot;=&gt;&quot;fas fa-download&quot;, &quot;url&quot;=&gt;&quot;/docs/resume.pdf&quot;}]}</name></author><category term="jekyll" /><category term="update" /><category term="project" /><summary type="html"><![CDATA[In an effort to modernize Craig’s car, we found a straightforward and simple way to add a backup camera using an RPi and a smart phone. This post details the steps to unlock better parallel parking in any car!]]></summary></entry><entry><title type="html">RPi Photobooth</title><link href="http://caseytmorris.com/blog/2019/10/10/photo-booth/" rel="alternate" type="text/html" title="RPi Photobooth" /><published>2019-10-10T16:07:12+00:00</published><updated>2019-10-10T16:07:12+00:00</updated><id>http://caseytmorris.com/blog/2019/10/10/photo-booth</id><content type="html" xml:base="http://caseytmorris.com/blog/2019/10/10/photo-booth/"><![CDATA[<p>This post details the DIY photobooth I created featuring a RaspberryPi and was debuted at my wedding! It has been contracted for one other wedding as of this writing. I found the development and testing of this project was the best part of the wedding planning!</p>

<h2 id="design-overview">Design Overview</h2>
<p>Photobooths at weddings/parties started to become trendy as far as I was aware around 2016. When I first looked into the cost of renting one of these, I was shocked that they could cost between $500 and $1000! Like any engineer, I decided this was ridiculous and I could make one for far less money.</p>

<p>The raspberry pi and camera module were a logical choice for a custom photobooth at a low cost. The biggest questions for me were “What was the best way to take the picture?” and “How should the guests get a copy of picture?” After a few iterations using a remote trigger, and an Amazon Echo, among other things, below is the final result I implemented.</p>

<p><img src="/assets/images/photobooth_overview.png" alt="Overview" /></p>

<p>To start the photobooth countdown clock, the guest texted the word “Snap” to a specific number. I used the Twilio platform to receive these text messages and forward them to the Rasperry Pi hosting a Python Flask application. This python app then was responsible for taking the picture, uploading the photo to a Google Drive, and responding to the guest with a text containing the link to the photo. A proof of concept video made during development is shown below.</p>

<video width="480" height="320" controls="controls" muted="muted" preload="auto">
  <source src="/assets/videos/photoboothdemo.mp4" type="video/mp4" />
</video>

<h2 id="hardware-requirements">Hardware Requirements</h2>
<ul>
  <li>Raspberry Pi 3B+ with case</li>
  <li>RPi Camera v2</li>
  <li>Old LCD monitor</li>
  <li>Props, lighting, background, frame</li>
  <li>Wifi or ethernet connection at location</li>
  <li>Total cost: $75</li>
</ul>

<h2 id="dependencies">Dependencies</h2>
<p>This project was built using Python 2. On a clean install of RPi Raspbian OS. Install the following python packages:</p>
<ul>
  <li>Flask, Flask-Ask</li>
  <li><a href="https://pythonhosted.org/PyDrive/">PyDrive</a></li>
  <li><a href="https://www.twilio.com/docs/sms/quickstart/python">Twilio</a></li>
</ul>

<h2 id="source-code">Source Code</h2>
<p>The python flask app can be found <a href="https://github.com/caseymorris61/rpi_photobooth">here</a>. These can be placed in a folder on the desktop of the RPi, and a link to the bash script on the desktop to easily launch the flask app with just a WiFi mouse.</p>

<h2 id="networking">Networking</h2>
<p>One of the biggest challenges that I had for a while was determining how to easily expose the webserver running locally on the Pi to the outside so the Twilio services could access it. For a while during testing, I used <code class="language-plaintext highlighter-rouge">ngrok</code> to open the http port on the pi and expose it at a randomly generate URL. However, the downside of this was the URL would change every time I ran it, so I would have to keep updating the Twilio webhook. For testing this was okay, but I wanted a more robust solution so that set up was as simple as possible on the wedding day and could be set up by someone other than me.</p>

<h3 id="pitunnel">PiTunnel</h3>
<p>Luckily, a few months before the wedding, I learned of <a href="https://www.pitunnel.com">PiTunnel</a>. This promised a way to open a remote tunnel to the HTTP port at a static URL (based on my account name). I only had to configure the service on the Pi, and add some lines to the <code class="language-plaintext highlighter-rouge">/etc/init.rc</code> script to open the tunnel on boot, so everytime I turned on the photobooth, the HTTP port was exposed to the URL expected by Twilio! Setup of the photobooth was now a breeze!</p>

<h2 id="photobooth-display">Photobooth Display</h2>
<p>As excited as I could be about the tech behind the photobooth, it would be all for naught if it wasn’t presented in a nice and pleasing enclosure. Instead of just using the boring LCD monitor with bezel, I recruited my cousin to build a beautiful wood frame. Placed around the monitor, the screen looks like a picture in a picture frame. The RPi case with the camera sits above the top of the monitor, connected to the monitor via HDMI. She also made a bunch of props for guests to pose with in pictures! Our venue provided a background drape and some overhead lights, and we had a photobooth!</p>

<p><img src="/assets/images/booth_frame.jpg" alt="photobooth frame" height="300px" width="300px" /></p>

<h2 id="results">Results</h2>
<p>In all, the photobooth went off without a hitch at our wedding! I have a terrific wife who let me run wild on this project which left her free to worry about all of the other details! Our guests enjoyed the photobooth and we had a lot of great photos! I was excited when I saw some of these posted on social media! One of my friends asked to use it at his wedding a few months later! Here are some of my favorites!</p>

<p><img src="/assets/images/photoboothresult1.jpg" alt="booth1" height="350px" width="350px" /></p>

<p><img src="/assets/images/photoboothresult2.jpg" alt="booth2" height="350px" width="350px" /></p>

<p><img src="/assets/images/photoboothresult3.jpg" alt="booth3" height="350px" width="350px" /></p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;&quot;/assets/images/casey-profile.jpg&quot;, &quot;bio&quot;=&gt;&quot;30% done with 47 projects&quot;, &quot;location&quot;=&gt;&quot;Charlotte, NC&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Email&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-envelope-square&quot;, &quot;url&quot;=&gt;&quot;mailto:casey@caseytmorris.com&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/caseymorris61&quot;}, {&quot;label&quot;=&gt;&quot;LinkedIn&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-linkedin&quot;, &quot;url&quot;=&gt;&quot;https://www.linkedin.com/in/casey-morris-96105346/&quot;}, {&quot;label&quot;=&gt;&quot;Resume&quot;, &quot;icon&quot;=&gt;&quot;fas fa-download&quot;, &quot;url&quot;=&gt;&quot;/docs/resume.pdf&quot;}]}</name></author><category term="jekyll" /><category term="update" /><category term="project" /><summary type="html"><![CDATA[This post details the DIY photobooth I created featuring a RaspberryPi and was debuted at my wedding! It has been contracted for one other wedding as of this writing. I found the development and testing of this project was the best part of the wedding planning!]]></summary></entry><entry><title type="html">Custom RFID Lock and Lighting System</title><link href="http://caseytmorris.com/blog/2019/10/08/rfid-light-lock/" rel="alternate" type="text/html" title="Custom RFID Lock and Lighting System" /><published>2019-10-08T16:08:12+00:00</published><updated>2019-10-08T16:08:12+00:00</updated><id>http://caseytmorris.com/blog/2019/10/08/rfid-light-lock</id><content type="html" xml:base="http://caseytmorris.com/blog/2019/10/08/rfid-light-lock/"><![CDATA[<p>This post details the custom lighting and locking solution that my roommate and I implemented at our apartment in graduate school to improve our living experience. Little did I know it would foreshadow my eventual job at Orro!</p>

<h2 id="project-inception">Project Inception</h2>
<p>In graduate school, my roommate, Josh Vahala, and I lived in a pretty great apartment a few blocks from campus, walking distance to pretty much everything we needed (especially Trader Joe’s). However, it was an older apartment and did not have some of the basic features of current houses, namely overhead lights in the living room. Lighting was done via lamps connected to switch-controlled outlets, and the locations of the switches were wildly inconvenient. Most frustrating was the living room switch being at the complete opposite side of the room from the front door, meaning arriving to an empty house after dark meant fumbling across the living room; a treacherous task. The living room is pictured below, showing the front door but no switch in the picture!</p>

<p><img src="/assets/images/madison_room.JPG" alt="Madison Living Room" height="350px" width="350px" /></p>

<p>By the time winter in Madison rolled around, the sun was setting earlier and earlier, and we grew more frustrated with the light setup. In addition, we were tired of fumbling around with our keys in the freezing cold trying to open the door. Out of these issues, our DIY home locking and lighting system was born.</p>

<h2 id="system-design">System Design</h2>

<p>We had two objectives in desiging our system: 1) we wanted to add a light switch mechanism near the entry way; 2) we wanted some way to unlock the door autonomously. To accomplish the light control, we decided to use a relay, and for the lock we used an RFID reader and a hobby servo. Below is the system overview we decided to implement.</p>

<p><img src="/assets/images/rfid_system_overview.png" alt="System Overview" height="450px" width="450px" /></p>

<h2 id="hardware-requirements">Hardware Requirements</h2>
<ul>
  <li><a href="https://store.arduino.cc/usa/arduino-uno-rev3">Arduino Uno</a> with Power Supply</li>
  <li><a href="https://www.sparkfun.com/products/retired/12920">Powerswitch Tail Relay</a></li>
  <li><a href="https://www.adafruit.com/product/157?gclid=EAIaIQobChMI4ty-6NSk5QIVx0XVCh3slwmlEAQYASABEgJz1PD_BwE">IR Sensor</a></li>
  <li><a href="https://www.adafruit.com/product/2307?gclid=EAIaIQobChMIn-L6h-Kk5QIVDdvACh1JawxsEAQYASABEgJXd_D_BwE">Servo Motor</a></li>
  <li><a href="https://www.adafruit.com/product/364">RFID Sensor</a></li>
  <li>Various LEDs, wires, switches</li>
</ul>

<h2 id="lighting-control">Lighting Control</h2>
<p>The first task we decided to tackle was the lighting control. We wanted to create our own sort of light switch that we could place near the door, but we also wanted the light to be remote controlled. Using the arduino uC as the system controller, we sensed the state of a simple toggle switch. When this toggled, we toggled the light via the use of the PowerTail relay. Outputting a digital HIGH or LOW controlled the relay, therefore toggling the light.</p>

<p>For the remote control functionality, we used a basic IR sensor and an old TV remote. When the power button of the remote was detected, we similarily toggled the state of the light via the relay. The light switch, Arduino, and IR sensor were contained in 1 enclosure, and we used speaker wire to run the relay control signal around the room to the lamp and relay. The picture and video below shows an early prototype of the enclosure and the light controlled via the remote.</p>

<p><img src="/assets/images/light_control_proto1.JPG" alt="Prototype" height="350px" width="350px" /></p>

<video width="480" height="320" controls="controls" muted="muted" preload="auto">
  <source src="/assets/videos/inside_light.mov" type="video/mp4" />
</video>

<h2 id="lock-control">Lock Control</h2>
<p>Because we were tired of fumbling with our keys in the Madison winter to unlock the door, we wished for a fast and convenient way to unlock it. That would mean some sort of mechanism to actuate the lock and an easy way to trigger the actuation. The logical choice was an RFID card reader! We already used our student ID RFID cards to unlock buildings around campus, our apartment was a natural next step.</p>

<p>The hardest part of this project was certainly the locking mechanism. We knew we wanted to use the servo to move the deadbolt, but we had all sorts of trouble finding a reliable way to attach the servo to the lock. We toiled away at this task for longer than either of us would probably like to admit. Evetually, with some help from several of our mechanical friends, we designed the system explained below:</p>

<p><img src="/assets/images/lock_pulley_system.jpg" alt="Lock Design" height="350px" width="350px" /></p>

<p>We had issues maintaining string tension and eventually had to abandon the ability to also lock the door. It was a tradeoff we were willing to make for the ability to unlock. The final implementation of the unlocking system was not by any means appealing to look at (see below), but it worked reliably!</p>

<p><img src="/assets/images/lock_mechanism.jpg" alt="Lock" height="350px" width="350px" /></p>

<p>At this point, we had a finally had all of the functionality working. We then added the logic to automatically turn the light on when the RFID unlocked the door, and we added the ability to unlock the door with the remote (in case any visitors knocked, we could unlock from the couch!). The only thing left was to create a presentable enclosure.</p>

<h2 id="enclosure-design">Enclosure Design</h2>
<p>Because we wanted to fit all of this functionality into a small system controller enclosure, and not have a bunch of bread boards and wires hanging around the apartment, we needed a custom board to route all the signals to the sensors, etc. We decided to create a custom “shield” for the Arduino so we could easily connect our custom cables that connected to the relay, RFID sensor, and servo. We used Altium Board Designer and produced the following board. With this board, we were able to fit the processor and cables neatly into one system.</p>

<p><img src="/assets/images/rfid_shield.jpg" alt="Shield" height="350px" width="350px" /></p>

<h2 id="smart-home-living">Smart Home Living</h2>
<p>Eventually, everything finally came together and we lived in comfort with the conveniences now afforded to us with our improved lighting and locking system! Below are two vidoes of how the system worked from the inside and outside!</p>

<video width="480" height="320" controls="controls" muted="muted" preload="auto">
  <source src="/assets/videos/inside_lock.mov" type="video/mp4" />
</video>

<video width="480" height="320" controls="controls" muted="muted" preload="auto">
  <source src="/assets/videos/outside_lock.mov" type="video/mp4" />
</video>

<h2 id="frozen-out">Frozen Out</h2>
<p>The system was working great and we were doing our best managing the sub 0 temperatures in Madison that winter. Unfortunately, one fateful night, it was so cold that it fell below the rated operating temperature of the RFID sensor that was on the outside of the apartment. This broke the RFID sensor and served as a good lesson in the impact of operating conditions in system design!</p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;&quot;/assets/images/casey-profile.jpg&quot;, &quot;bio&quot;=&gt;&quot;30% done with 47 projects&quot;, &quot;location&quot;=&gt;&quot;Charlotte, NC&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Email&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-envelope-square&quot;, &quot;url&quot;=&gt;&quot;mailto:casey@caseytmorris.com&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/caseymorris61&quot;}, {&quot;label&quot;=&gt;&quot;LinkedIn&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-linkedin&quot;, &quot;url&quot;=&gt;&quot;https://www.linkedin.com/in/casey-morris-96105346/&quot;}, {&quot;label&quot;=&gt;&quot;Resume&quot;, &quot;icon&quot;=&gt;&quot;fas fa-download&quot;, &quot;url&quot;=&gt;&quot;/docs/resume.pdf&quot;}]}</name></author><category term="jekyll" /><category term="update" /><category term="project" /><summary type="html"><![CDATA[This post details the custom lighting and locking solution that my roommate and I implemented at our apartment in graduate school to improve our living experience. Little did I know it would foreshadow my eventual job at Orro!]]></summary></entry><entry><title type="html">Sewer Exploring Robot!</title><link href="http://caseytmorris.com/blog/2019/10/04/sewer-robot/" rel="alternate" type="text/html" title="Sewer Exploring Robot!" /><published>2019-10-04T16:07:12+00:00</published><updated>2019-10-04T16:07:12+00:00</updated><id>http://caseytmorris.com/blog/2019/10/04/sewer-robot</id><content type="html" xml:base="http://caseytmorris.com/blog/2019/10/04/sewer-robot/"><![CDATA[<p>In this post, I describe our senior design project: the sewer exploring robot! We presented this in the senior design showcase in May of 2014, and were awarded 1st place in the competition! This is how it came together…</p>

<h2 id="the-ninja-turtlees">The Ninja TurtlEEs</h2>

<p>The 2014 Notre Dame Electrical Engineering class had 39 graduates, and we were able to assemble the best possible team: <a href="https://www.linkedin.com/in/john-o-a3a046139/">John O’Brien</a>, <a href="https://www.linkedin.com/in/joshua-vahala-42264199/">Josh Vahala</a>, <a href="https://www.linkedin.com/in/justin-yoder-b1282260/">Justin Yoder</a>. Due to our project based on the idea of a sewer exploring robot, our team was aptly name: The Ninja Turtl<strong>EEs</strong><br />
<img src="/assets/images/senior_design_team.jpg" alt="TeamPhoto" /></p>

<h2 id="requirements">Requirements</h2>
<p>Perhaps the most exciting and most useful class during my undergraduate studies was Senior Design. The requirements were loose:</p>
<ul>
  <li>Work in a team of 4 to design an embedded system</li>
  <li>Must use the PIC32 uC and a serial interface</li>
  <li>Must incorporate a custom PCB</li>
  <li>$500 budget for all parts</li>
</ul>

<p>It was up to our team to come up with some sort of project idea and to devise the plan to implement the project.</p>

<h2 id="problem-description">Problem Description</h2>

<p>In the class portion of Senior Design, a representative for the city of South Bend gave a talk describing some of the challenges facing the city and asked for ideas in which our project could be of use. We were 1 of only 2 teams that geared our project to the city’s needs, and the idea we came up with was our sewer exploring robot.</p>

<p>The city explained a problem they had with the old infrastructure of their sewer pipes, and these were susceptible to leaking. One particular area where this was an issue was Bowman Creek. Here, the sewer tunnels crossed the tributary of the St. Joseph’s River, and any leaks had the potential to contaminate the water supply, damage the sewer, or both. To detect a leak, a special dye was placed in the water of the river, and the sewer tunnels were searched for traces of this dye. However, it was a great risk and expense to the city to have human workers lowered into the tunnels to search for the leak. Some sorts of specially designed robots were available for purchase that could roam the tunnels looking for leaks, but they too were too expensive for the cash strapped city.</p>

<p>This issue was of interest to our team due to both the potential positive impact it could have on the city, and also the variety of different technologies and features the ideal solution would require. The potential project certainly went above and beyond the base requirements for the project, but we were up to the challenge.</p>

<h2 id="robot-design">Robot Design</h2>

<p>We worked with the representative from the city of South Bend to come up with a set of requirements and features our project would entail. Some of the high level design requirements were as follows:</p>
<ul>
  <li>Remote control capability of the robot wirelessly</li>
  <li>Capture video and stream in real time.</li>
  <li>Control camera angle in 3 dimensions</li>
  <li>Battery powered motor drives</li>
  <li>Ability to sense obstacles in tunnel</li>
  <li>Level Sensing</li>
  <li>Waterproof enclosure</li>
</ul>

<h3 id="wireless-communication">Wireless Communication</h3>

<p>Perhaps the biggest unknown when we started the project was how to handle the wireless communication. We needed a wireless link to be able to send remote control commands to drive the robot. There was discussion as to using WiFi, Zigbee, or Bluetooth, but because we were going to also be streaming video, we decided to go with WiFi.</p>

<p>The uC that we were required to use was a PIC32, which did not have much support for WiFi. While we could have designed a board with a dedicated WiFi module and antenna, this was well out of scope for the project (and even further outside our capabilities). Instead, we decided to include a Raspberry Pi 3 module. This was 2014, before the wifi capability was built in the RPi, though it did have all networking capabilities. Our solution was to add a USB WiFi dongle to the RPi. This allowed the Pi to connect to the ad-hoc WiFi network we created with a router, and then the RPi was connected to our uC via an SPI bus. The RPi was used solely for WiFi communication and video streaming, all other processing, such as motor control, prox sensing, etc. was processed in the PIC, per class requirements.</p>

<p>Thus, the data data flowed as such: from the remote host client (to be discussed) over WiFi to the RPi via a TCP port, then to the PIC via SPI. Data was then sent back to the host from the PIC in the reverse manner.</p>

<h3 id="video-streaming">Video Streaming</h3>

<p>The most critical part of the project was the ability to live stream video. This would allow a human to view the inside of the tunnel in real time from ground level, and aided the steering ability. To accomplish this, we also relied on the RPi Camera module. This was a low cost (and relatively low quality) solution that integrated easily with the RPi. The RPi then launched an RTSP video network stream that we then opened in a VLC player on our host client to view the video live. The video streaming capability was mostly baked into the RPi, which greatly eased the amount of work on our side.</p>

<h3 id="remote-control">Remote Control</h3>

<p>Being able to control the robot remotely was of great interest to our team. There were actually 2 different things we wanted to control remotely: 1) The steering/direction/speed of the robot, and 2) The Angle of the Camera. As a result, we wanted to use some sort of remote that had two different joysticks so that we could control both simultaneous.</p>

<p>The remote that we ended up choosing to use for the project was a USB XBOX controller. The controller was connected to a Linux machine, and we used open source drivers to read the status of the controller and stream the joystick positions. We wrote a C program running on the Linux host to process the data from the controller, to open a TCP port to the RPi on the robot, send the controller commands to the PIC, and to display sensor data that is returned from the robot. We created a custom packet protocol to exchange the desired commands for the servos and the motors, and read the state of the PIC. Likewise, created an API for the RPi to communicate with the PIC via SPI.</p>

<h3 id="camera-control">Camera Control</h3>

<p>The camera was mounted using 2 different servo motors. The first was a traditional hobby servo that had about 270 degrees of rotation. The position of the servo is controlled by the width of the PWM pulse applied to its input. This servo controlled the tilt angle of the camera (in the Z direction), so changing the PWM duty cycle moved the camera angle up and down.</p>

<p>The other servo used to control the camera was a 360 degree continuous servo. This servo is able to spin continuosly. This is controlled differently in that the speed and direction of the servo spinning is controlled by the width of the PWM pulse, and a duty cycle of 50% held the servo steady. This servo was used to control the pan angle of the camera, so we were able to have a 360 degree view of the sewer from the robot at all times.</p>

<h3 id="motor-control">Motor Control</h3>

<p>The entire system was powered by a 12 V battery. We used two standard DC motors to directly drive the back two wheels of the robot. The motors where controlled via a special H-Bridge circuit that was provided by our instructor. We input a PWM pulse to the H-Bridge to apply power to the motors. Turning was accomplished by applying different speeds to each motor (though we didn’t have a differential, so turning was rough).</p>

<h3 id="other-sensors">Other Sensors</h3>

<p>We were interested in including a couple other sensors on board the robot, namely 1) a proximity sensor and a 2) gyrometer. The prox sensor would be used to alert the robot (and the controller) when the robot was nearing an obstacle. The gyrometer was used to measure the stability of the robot. This information was relayed to the Linux host so the controller had an idea if the robot was becoming unstable.</p>

<h2 id="mechanical-difficulties">Mechanical Difficulties</h2>

<p>While the electrical and software challenges were in our area of expertise, the most difficult part of the project was the mechanical design. As mentioned, one of the ideal requirements was that the body be waterproof. Though the prototype we were making would not be exactly waterproof at the edges, we took care to ensure everything was securely enclosed, including the camera casing.</p>

<p>In addition to waterproofing, designing a robot body and attaching motors, wheels, etc. was a gigantic challenge. It needed to be secure, but also easy to access the insides for testing and development. Below shows the end result of the body; a boxy, ugly mess of plastic with a hinge. We were happy that aesthetics were not part of the criteria for the prototype!</p>

<p><img src="/assets/images/robot_case.jpg" alt="Robot Case" height="300px" width="300px" /></p>

<p>Mounting the axles and wheels to the body was another huge task, and we soon learned that wheel system we implemented was not conducive to turning (no area for the wheel to turn without hitting the body of the robot). This caused some major headaches. Remarkably (and with the help of some mechanical friends and their CNC skills), we were able to put together a serviceable robot!</p>

<p><img src="/assets/images/robot1.jpg" alt="Robot Prototype" height="300px" width="300px" /></p>

<h2 id="live-demo">Live Demo</h2>

<p>Once we were able to assemble the robot and had all of the functionality (mostly) working, we arranged for a live demonstration using the sewer tunnels on campus. With the help of a member of the maintenance department, we lowered our robot into the tunnel, turned it on, and voila! Everything worked as expected! We controlled the robot for a couple hundred feet down the tunnel, streamed video back to the host and moved the camera all around to inspect the walls. We saved this video, and were excited to relax until the senior design demo the next afternoon. That was until, however, disaster struck with about 20 hours until the demo….</p>

<h2 id="disaster">Disaster</h2>

<p>The major design flaw in our design was our motor control. It was not until a year later in my motor design classes in graduate school that I would really understand what was our kryptonite. The main issue though was that we were using those DC motors, which at high frequencies, have a very high impedance. When the motors were off and in a stall state and we applied power to them through the H-Bridge circuit, in the instant the power was applied, the motor impedance can cause a giant current spike until eventually the rotor begins to spin. In traditional applications of DC motors, there are “starter capacitors” that are used to slowly (not instantaneously) apply voltage to the stator of the motor until it begins to turn. However, if not designed properly, this giant current spike can cause issues, which we would soon learn.</p>

<p>After our successful demo in the tunnels, we decided we just wanted to fine tune a few things before the big expo the following day. One of the main things we wanted to improve was the turning (which was rough as described before). In the course of testing that afternoon, in the middle of a turn, one of the wheels got stuck, and we happened to stall the motor. This led to a giant current spike, which in turn caused a huge ground noise spike (we had no isolation), and this fried all of our electronics. The H-Bridges legitimately caught fire (just a small flame), and pretty much all of our other electronics on our board were toast. The PIC, fried. The Prox Sensor, fried. The board was unusable. And we had 20 hours until the demo day…</p>

<p>Probably due to our youth, I don’t recall any of us freaking out too much. We were more in a state of shock and bewilderment. It was almost funny that our yearlong project had literally blown up hours before the due date. Instead of panicking, we collectively entered survival mode: i.e. we need to pass this class to graduate mode. Thankfully, we had video of the robot working in the tunnels so we were pretty sure we wouldn’t outright fail the class, but we desperately wanted something to demonstrate the next day.</p>

<p>We were fortunate in a couple senses: the RPi was saved (we didn’t have an extra one), we had ordered extra PCBs and parts for the board - which would need assembled ASAP. Additionally, the mechanical engineering classes were using the same prox sensors we were using, so we were able borrow one of their extra ones. However, the main issue left to figure out was how to drive the robot. As mentioned, the H-Bridge circuit had gone up in flames (literally) and even if we had enough parts to recreate it, we couldn’t be sure that it would survive until the next day.</p>

<p>At this point, we had to be creative. Again, luckily we had friends in mechanical engineering. For their projects, they were also making robots (much better looking than ours, but their electronics were sub par). Thus, there were extra motor drives, motors, and wheels lying around. We salvaged as many parts as we could find and completely redid the powertrain system for the robot. In addition to the mechanical differences, it involved different motor control PWM techniques that needed to be implemented, calibrated, and tested. Now that we had at least figured out a potential solution to save our project, we just had 20 hours to do all of the work.</p>

<p>As a result, it was on this day, the second to last day of my undergraduate career, I had to pull my first all nighter. As an aside, I am generally against the idea of an all-nighter and did not see much point in them throughout college. While many of my friends resorted to them, I always valued sleep more than the extra few hours of studying and found the sleep to be a more efficient use of my time when it came to school work. However, this was a special situation: the work to be done was known, just took time, and we were running on adrenaline. It was a whirlwind of an evening/night/morning, but somehow the sun rose the next day and we had a robot.</p>

<h2 id="presentation-day">Presentation Day</h2>

<p>To say we finished the modifications and last minute changes to the robot in the knick of time would be an understatement. We were in the lab tinkering/calibrating the robot (we needed to add reversing capability!) until 5 minutes AFTER the demo was scheduled to start. Luckily, things were running a few minutes behind which allowed us to finish and bring the robot from the lab to the demo floor as it opened. At this point, the adrenaline has begun to fade - we did it! - and we are a bit tired, but we proceed to show off the robot throughout the afternoon to the visitors of our booth. Things seem to go off without a hitch, the robot works, we show the video from the day before. Everyone loves it. We are relieved. It was later announced at graduation that we won 1st place in the design competition!!</p>

<p>That 20 hour period before the demonstration day definitely ranks up there as one of the most stressful, exhilarating, craziest times of my life. It was an incredible challenge, but one we embraced head on. We absolutely had an amazing team, to be able to accomplish what we overcame was so rewarding. If I ever need a team of 4 to take on a seemingly impossible challenge, I know who my first 3 calls will be.</p>

<h2 id="takeaways">Takeaways</h2>

<p>The senior design class was far and away the most useful class with regards to my career that I have taken. We practiced skills such as project management, product requirement gathering, specification writing, etc. We also learned the most applicable technical knowledge with topics such as serial communication, I2C, SPI, PCB design, uC development, interrupts/ISRs, UART, the list goes on (and I’m not sure why we didn’t learn these things earlier!). This class also gave us the confidence to go out into industry knowing we could accomplish anything, even if we had no idea where to start. And for this, I am eternally grateful. Thanks, Prof. Schafer.</p>

<h5 id="see-all-of-our-project-documents-archived-here">See all of our project documents archived <a href="http://seniordesign.ee.nd.edu/2014/Design%20Teams/nturtlees/index.html">here</a></h5>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;&quot;/assets/images/casey-profile.jpg&quot;, &quot;bio&quot;=&gt;&quot;30% done with 47 projects&quot;, &quot;location&quot;=&gt;&quot;Charlotte, NC&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Email&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-envelope-square&quot;, &quot;url&quot;=&gt;&quot;mailto:casey@caseytmorris.com&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/caseymorris61&quot;}, {&quot;label&quot;=&gt;&quot;LinkedIn&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-linkedin&quot;, &quot;url&quot;=&gt;&quot;https://www.linkedin.com/in/casey-morris-96105346/&quot;}, {&quot;label&quot;=&gt;&quot;Resume&quot;, &quot;icon&quot;=&gt;&quot;fas fa-download&quot;, &quot;url&quot;=&gt;&quot;/docs/resume.pdf&quot;}]}</name></author><category term="jekyll" /><category term="update" /><category term="project" /><summary type="html"><![CDATA[In this post, I describe our senior design project: the sewer exploring robot! We presented this in the senior design showcase in May of 2014, and were awarded 1st place in the competition! This is how it came together…]]></summary></entry></feed>