Skip to content

Final Project

Slide and Video

Interactive Map

Since our Global Study Program in Charlotte Latin is getting unnoticed by people, I decided to do something to help it advertise. I decided to make an interactive map to present the moments of Global Study. I decided to add sensors on the marks of the places where we have our sister schools or the common places where our global study program usually goes. When I click on the buttons, the embedded screen will display the video about wonderful moment during the trip in Global Study. Visitors can play with the map in our school, which helps them learn more about both our Global Study program and our Engineering program.

3D Sketch of my Final Project

I used Fusion 360 because I have had plenty of experience of this software. After I tried Blender, I felt Fusion 360 is my favorite for 3D design.

First, I created a 61cm x 36.5cm rectangle on the bottom face.

Then I extruded the rectangle by 5cm

Since my project is a map, I found a world map online and made it as my reference. I created a frame of my interactive map.

Next, I created an offset plane on the top of the rectangular prism and inserted my reference image using “Canvas” feature.

Then I created sketch on the top plane and use spline tool to sketch out the outlines of the continents.

It took me 2 hours to finsih sketching the outlines of the continents.

I extruded the outlines inside for 3cm.

Finally, I went the website of my school’s Global Study program, and then marked the countries where our Global Study Program includes.

Then I made spots for the buttons between the countries related to our Global Study Program and create a spot for the screen. I also added the names of the countries beside the buttons. I was think about cutting out the text and pour resin in. The second option is to raster the text using laser cutter.

Finally, I extruded the spots for screen and press buttons by 4cm.

I added Appearance feature to make the frame look more real.

I’m done with my 3D design of my Final Project!

System Diagram

Bill Of Materials

Gantt Chart

List of Tasks to Do

  • Mechanics (5/12-5/18)
  • 3D design of the map frame
    • I have done a sketch map frame in Fusion 360 but I need to improve it
  • CNC Machining
    • Milling out my design
  • Laser Cutting
    • CorelDraw Design
    • I have never done laser cutting on acrylic before but I knew that we are able to cut it using our laser cutter.
  • Vinyl Cutting
    • CorelDraw Design
    • I have all the names of the countries. I just need to cut it out.
  • Electronics (5/3-5/11)
  • TFT Screen with SD Card
    • Upload example code
    • Use the tutorial to figure out how to use SD card with TFT
  • Ask ChatGPT to generate proper code for me
  • Touch Sensor
    • Figure out how to connect 8 touch sensor with one RP2040
    • Figure out how to secure Touch sensor on acrylic
    • Figure out how to make it work under acrylic
  • PCB Design
    • Design a board that can include 8 sensors, one TFT screen and one RP2040
    • Double-sided PCB
  • Milling Boards
    • Double sided PCB milling
    • Soldering
  • Documentation
  • Finish documenting all the week before 6/1
  • Finishing documenting final project 6/8
  • Finish making slides and video of my final project 6/8

Problem Responses

What will it do?

The interactive map is used to adverise our school’s global study program. Once the touch sensor is triggered on the map, the screen will show images of the happy moments our students have experienced in that place.

Who’s done what beforehand?

As far as I know, Elaine Liu and Connor Cruz have done similar projects as me.

What will you design and what parts and systems will be made?

I would design the wooden frame of my map for CNC machining.

I also need to design the names of the countries for vinyl cutting.

The shapes of the continents need to be designed in CorelDraw and cutted out by laser cutter.

I also need to design the PCB of my final project.

What materials and components will be used?

For laser cutting, I will using obaque acrylic for the shapes of the continents. I will use cardbaord for test cutting.

For Vinyl cutting, I will use glazed vinyl of various colors.

I will use 0.5” wood for the frame of my

For electronics, I will use copper tape and electricaltape to make the sensor and copper boards for making PCB and a TFT screen for displaying images.

Here’smy Bill of Materials:

Where will come from?

Most components and materials are available in Fab Lab. I’ll just need to order the TFT screen and acrylics from Amazon.

How much will they cost?

Taking everything incuding some materials in lab into considerations, it will cost $104.78 in total.

What processes will be used?

  • CNC Machining for my wood frame and the outline of the map.
  • Laser Cutting for cutting acrylic into shapes of the continents on the map.
  • Vinyl Cutting for the names of the countries
  • PCB milling for the electronics

What questions need to be answered?

  • How to make the acrylic stay on top of the map?

  • How to make the sensors remain contact with the acrylic?

  • How to position my PCB board on the map?

  • What can I selectively reduce to finish my final project on time?

  • How to make the SD card work with the TFT screen?

  • Should I use same microcontroller for both sensors and screen or should I use different and make communications between them?

How will it be evaluated?

  • the delicacy of the whole map
  • the accuracy of the touch sensors
  • the responses TFT screen made (displaying the matching images).

What tasks have been completed?

I have done the CNC machining for the wood frame, although I still need to sand my frame. Ihave also figured out how to build my own touch sensors.Part of the acrylics have been cutted out.

What tasks remain?

I still need to finish laser cutting acrylics. I also need to figure out how to display images on TFT Screen from SD card and te connection between xiao esp32-c3 and rp2040. I also need to figure out what type of code I will use: C++ (Arduino) or Python (Thonny).

What has worked? What hasn’t?

The sensor I built have been working well. However the SD card does not want to cooperate with me so I still need to figure out how to display images from an SD card.

What questions need to be resolved?

Since the bit I used for CNC machining is 3/8 spiral compression, it rounded edges that are supposed to be sharp on the map. So I need to adjust my laser cutting design according to the actual shape of the map on the wooden frame. So there are gaps between the acrylic and the wood frame. I am trying to make gap smaller but I will solve it later.

What have you learned?

I think time management is the biggest thing I have learned in building my final project. Since we have little time, it is important to make good use of every spare time to complete the weekly assignments while working on my final project. I also learned to take advantage of some of the weeks and incorporate part of the final project into the weekly assignments.

Failure Modes

Connection between Screen and Sensors: Since I am using different microcontrollers, the communcation between each other maybe ad and may not work

Gap between Acrylic and Sensor: The tape may be loosen my gravity so that the connection between the acrylic andthe sensors maybe bad which may cause the sensor stop working.

Packaging

For packaging, I will make the wooden frame hollow so that I can hide the PCBs with in the wooden frame. I will use gluee to stick the PCB onto the bottom surface of the frame and stick sensors onto different acrylics. I will use press-fit method to assemble the frame.

Electronics

Sensor Part
XIAO ESP32-C3 TFT Screen
XIAO RP2040 Capacitive Tuch Sensor

Building my Own Sensor

In week 15, I started to build the sensor for my final project.

Step Response

Since I am not allowed to use pre-built touch sensors, I had to figure out how to build my own. My frist option was Step Response. I first got the example code from Neil. Then I used ChatGPT to modify the code into C++ and based on mywiring. Then I got the step response sensor to work with objects but not my hands.

Then I continued to use ChatGPT to modified the code. I ask ChatGPT to increase the sensitivity of the sensor. Then I successfully make the sensor work with my hand.

The Working Code:

// Capacitive Step-Response Sensor for Seeed Studio XIAO RP2040


const int tx_pin = 28;       // TX Plate (Digital Output)
const int rx_pin = 27;       // RX Plate (Analog Input)
const int led_pin = 26;      // LED Indicator


const int settle_time = 100; // Microseconds to wait after setting TX pin
const int samples = 100;     // Number of samples for averaging


void setup() {
  pinMode(tx_pin, OUTPUT);
  pinMode(led_pin, OUTPUT);
  Serial.begin(115200);
}


long average() {
  long total = 0;
  for (int i = 0; i < samples; i++) {
    digitalWrite(tx_pin, HIGH);
    delayMicroseconds(settle_time);
    int up = analogRead(rx_pin);


    digitalWrite(tx_pin, LOW);
    delayMicroseconds(settle_time);
    int down = analogRead(rx_pin);


    total += (up - down);
  }
  return total;
}


void loop() {
  long avg = average();
  Serial.println(avg);


  // Adjust the threshold value based on your setup
  if (avg < 16000) {
    digitalWrite(led_pin, HIGH);
  } else {
    digitalWrite(led_pin, LOW);
  }


  delay(100);
}

Then since I needed to make it work with the screen, I decided to add an OLED Screen for testing.

After making ChatGPT modify my code, I successfuly light up the screen through the step response sensor.

Code With the OLED Screen:

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>


#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);


const int tx_pin = 28;
const int rx_pin = 27;
const int settle_time = 100;
const int samples = 100;


bool screen_on = false;
unsigned long screen_timer = 0;
const unsigned long display_duration = 5000; // 5 seconds


void setup() {
  pinMode(tx_pin, OUTPUT);
  Serial.begin(115200);


Wire.setSDA(6);  // or your correct SDA pin
Wire.setSCL(7);  // or your correct SCL pin
Wire.begin();


  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    while (true);
  }
  display.clearDisplay();
  display.display();
}


long average() {
  long total = 0;
  for (int i = 0; i < samples; i++) {
    digitalWrite(tx_pin, HIGH);
    delayMicroseconds(settle_time);
    int up = analogRead(rx_pin);


    digitalWrite(tx_pin, LOW);
    delayMicroseconds(settle_time);
    int down = analogRead(rx_pin);


    total += (up - down);
  }
  return total;
}


void loop() {
  long value = average();
  Serial.println(value);


  if (value < 16000 && !screen_on) {
    screen_on = true;
    screen_timer = millis();


    // Show something on screen
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(10, 20);
    display.println("Hello!");
    display.display();
  }


  // Turn off screen after timeout
  if (screen_on && millis() - screen_timer >= display_duration) {
    screen_on = false;
    display.clearDisplay();
    display.display();
  }


  delay(100);
}

Capacitive Touch Sensor

In Week 9 and Week 10, I both explored using pre-built capacitive touch sensor. However, my dearest teacher Mr.Dubick asked me to build a sensor on my own. So I immediately started to look up sensors that I can use. I went to Fab Academy Website and found the capacitive touch sensor building instructions there. I used the example code Neil provided for RP2040. Then I asked ChatGPT to modify the code for me so that the sensors can be sensitive enough to work through acrylic.

Here’s a picture of my wiring:

Here’s a video of my sensor working:

Here’s a video of my sensor working through 1/8” acrylic:

Here’s the Python code I use for the sensor to work through acrylic:

from machine import Pin, freq
import rp2
import time

@rp2.asm_pio(set_init=rp2.PIO.OUT_HIGH)
def steptimer():
    pull()
    mov(y, osr)
    pull()
    mov(x, null)
    set(pins, 1)
    label("main_loop")
    set(pindirs, 1)
    label("up_settle")
    mov(isr, x)
    mov(x, osr)
    label("up_settle_loop")
    jmp(x_dec, "up_settle_loop")
    mov(x, isr)
    set(pindirs, 0)
    label("down_loop")
    jmp(pin, "down_jump")
    jmp("down_continue")
    label("down_jump")
    jmp(x_dec, "down_loop")
    label("down_continue")
    jmp(y_dec, "main_loop")
    mov(isr, x)
    push()

class StepTime:
    def __init__(self, sm_id, pin):
        self._sm = rp2.StateMachine(sm_id, steptimer, jmp_pin=pin, set_base=pin)
        self._sm.active(True)
        self.get = self._sm.get
        self.put = self._sm.put

# Run at full speed for better timing accuracy
freq(250_000_000)

# === Configure only 2 sensors and 2 LEDs ===
sensor_pins = [27, 1]      # GPIOs for capacitive sensors
led_pins = [4, 17]       # GPIOs for LEDs

steps = [StepTime(i, pin) for i, pin in enumerate(sensor_pins)]
leds = [Pin(pin, Pin.OUT) for pin in led_pins]

loop = 200
settles = [20000, 20000]     # Lower = more sensitive
thresholds = [2000, 3000]    # Tune individually

# Track baseline values
mins = [1e6] * 2

while True:
    for i in range(2):
        steps[i].put(loop)
        steps[i].put(settles[i])
        result = 4294967296 - steps[i].get()
        if result < mins[i]:
            mins[i] = result
        delta = result - mins[i]

        leds[i].value(delta > thresholds[i])

    time.sleep(0.05)

Image Display on TFT Screen with SD card (Failed)

After figuring out the sensor, it is time for me to figure out TFT Screen. My original plan was to display images on TFT Screen using SD card. So I went to Connor Cruz’s documentation, trying to follow his instructions and figure out the images. However, even though I followed the exact tutorialand used the same libraries, the code still failed to upload on to XIAO RP2040 due to some library issue. I then decided to change the sensor to XIAO ESP32-C3. This time, the code succeeded to upload. However, the SD card still did not initialize successfully. After one-month of struggling, I decided to switch to some basic stuff and just display text on the TFT screen to finish the project on time.

Basic TFT Screen Wiring

I asked ChatGPT to give me the wiring table for TFT screen and XIAO RP2040 or XIAO ESP32-C3. You can find the wiring table here.

Text Display on TFT Screen

For the text display on TFT screen, it is so uch easier than the images diaplay on TFT screen. I asked ChatGPT to generate the code for me for the text.

Then I asked Claude to generate code for the communication between RP2040 and ESP32 so that the sensor can trigger the screen to display mathcing texts.

Here’s the wiring:

Here’s a video of the sensor and the TFT working together:

PCB Design and Milling

After figuring out the elctronics, I started to design my PCB board in Kicad.

Here’s the Schemeatic View of my PCB:

Here’s the PCB view:

Here’s the 3D View:

Then I milled it out using the Bantam milling Machine.

The first time I used double sided PCB. However, then I realized a problem: I use trhough hole for my sensors, which meansboth sides would have continuity which caused a short circuit on my PCB.

Garrett and I tried to use a scalpel to add tracks manually so that it could isolate the electricity. However, it did not work at last.

The second time, I found single-sided PCBs and milled it out. This time it worked perfect after I soldered all the components and headers on to my PCB.

Here’s a video of the circuit working using my PCB:

Mechanics

CNC Machining (Wood Cutting)

Designing in Fusion 360

First I used Fusion 360 to design a wooden frame for my map.

Then I followed this tutorial and then laid every parts flat and prepared for CNC machining.

Test Cut

I wanted to test out my frame tabs on cardboard first, so I used Scale feature and scaled everything down for a cardbaord size in fusion for the 3D parts.

Then I cutted out my test frame using laser cutter.

Actual Cutting

First, I exported .DXF file from Fusion 360. Then Imported it into Aspire.

Then I added dog-bone fillets to make the tabs fit.

Then I seted up Proflie toolpath to cut out the outline and the hollow part of the map using 3/8 compression bit. Since I want a place to hold my acrylic pieces, I used Offset feature to let the cut cut more inside.

For Pocket toolpath, I used the same bit and let it cut for 1/8” deep which is the thickness of my acrylic pieces.

Here’s the whole preview of my wood cutting:

Then I saved toolpath and followed instructions and completed the CNC machining.

Laser Cutting Acrylics

After cutting out the wood frame of my map, I started to cut out my acrylic pieces. Since I engraved out the shape using 3/8 compression bit, some of the sharp places becme round. I had to take a picture of the actual wood frame and trace the out in CorelDraw. I had to use cardboard to test out if the pueces fit into the frame. After several hours of trying, I finally let all the cardboard fit inside the frame.

Then I cut out the actual acrylic pieces.

Here’s whatI got ~~~~ (Very Prud of myself)

I referenced the color choice from this:

Most of my acrylic pieces are press-fit. I use Poxy to fix Africa and South America.

Adding sensor

My sensor would just be several copper boards. I first positioned where the sensors will be and then used electrical tape to make it really stick to the acrylic pieces.

Then I used Alien Tape to fix the position of the PCB board and the batter case. For the screen, I just use duck tape to make it fix.

Here’s how the initial wiring looks like:

Vinyl Cutting

After fixing all the back, I decided to add marks on the front so that people would know where the sensors are.

I use vinyl cutter to cut out some little gold stars.

Here’s what I got:

Adding Buttons

After Mr.Dubick saw my whole main board, he asked a really good question: How can use cut off the power? After several minute of frustration, I decided to add a button really quickly. I first cut out the ground wires on the battery casead then connect both sides of the button to the ground of the battery case. Thanks to Andrew Puky who provided me the beautiful little button.

Next, I used the drill to drill a hole on my side piece of the frame. I used 1/2” drill wood bit.

Then I realized one problem: the wood is too thick that the washer of the button can not fix the position of the button. So I changed the bit to 3/4” and then drilled a place that can fit the washer and fix the button.

Here’s the final look of the button:

PCB Case

Then Mr.Dubick asked me make a case for my PCB board.

I first tok a picture of my PCB board with a ruler and imported ito Fusion 360. Then I followed this tutorial and scaled down the image to the real size.

With the real dimension of the PCB, it is really easy to make the holes accurate and complete the case.

Then I 3D printed out the case

and got this!

Covering up the back side

Mr.Dubick also thought the black tapes were too ugly, so He asked me to cut out something to cover up the tape and the sensors. I took a picture of the back side and trace the outline of the back and leave rooms for the connective place of the wires in Fusion 360. Then I laser cutted the acrylic pieces and pressed fit onto the back side.

Here’s how it looks like after covering it up:

Clean up Wirings

After being checked by Mr.Dubick, he asked me to clean up all the tapes and use real wires instead of jumper wires. He also asked me to use zip ties to group wires instead of tapes and use screws to fix the battery case and the screen onto the frame. I followed his instructions and use zip ties to group the new wires together and handscrew the screws in to fix the position of the battery case and the screen.

Here’s what I got for the 2nd version:

Assembling

After Mr.Dubick said OK to my main board, I could finally assemble every part up. Here’s what I got in the end!:

Final Product Video Showing

Here’s a video of my whole project working!

File Download

You can download my files here.

AI Usage

I used Claude and ChatGPT to help me generate the code. You can found the whole conversation here and here.

Great Thanks

Thanks to Tyler Russell who helped me reopened my wood frame and teach me how to use the drill.

Thanks to Garrett who helped me figure out howto clean up my wiring and stuff.

Thanks to all the people in GOT who helped me figure out weeks and make me feel that I am not alone!

Great Great Thanks

Great thanks to my bestie Kathryn Wu who helped me doing the sanding and editing my final prokect video. There’s no way I would make it without her help and accompany!


Last update: June 17, 2025