Skip to content

Final Project

Welcome to My Final Project Page! by Hiroe Takeda

Final Result

In Week 17, I made slide and Video.


alt text


  • Director: Hiroe Takeda
  • Cast: Shin Masuoka / Yasuyuki Yanai / Kazunari Takeda / Hiroe Takeda
  • Special Thanks: Professor Neil / Fab Lab Kitakagaya / Fab Lab West-harima / All Instructors
  • Music: Sound made by PlayGround / Look Both Ways - Nathan Moore

First Idea

alt text

What will it do?

It has a function to read a member's card and turn on/off the machine based on the Mifare card’s data, and It can record the operation time. I call my final project Runtime checker. I search with google about runtime checker, It seems there in't same name.

How the idea was generated?

My final project idea is started when I noticed there is the problem in Fablab west-harima, and I want to solve the problem. At first, I must hearing the details of problem.

Hearing the Problems at Fab Lab West-Harima

  • Not been able to keep track of the Operation training record for each machine for FabLab members.
  • Many people who have not used machine for a long time have forgotten how to use it.
  • Want to know the operating hours of each machine in order to use it for maintenance and upkeep of the machine.
  • want to clarify the amount of time each member uses each machine.

Making idea simply

  • The secondly I thought, if there is a product reads the member's card, and if that device can operate the machine ON and OFF. And if the device can record time, it would solve the problem.

alt text

Japanese Radio law

  • During seaching site, I noticed there is Japanese Radio Law. And It was so difficult to find a product that was easy for individuals to purchase and that complied with Japanese radio laws. I must search a lots of site. Finaly, I find the RFID2 unit, this product that are not regulated by Japanese radio laws.

Who's done what beforehand?

There have been several RFID device.

There was a service with a similar idea called FABMAN, but I could not find the same idea for an individual project.

Electrical wiring work procedure (Plan)

  1. Under the presence and guidance of an electrician, Check electrical wiring and confirm operation.
  2. Perform work that does not require an electrician's license by yourself.
    (Check with the electrician about the scope of work that can be done.)
  3. Ask an electrician for work that requires an electrician's license
    (check with the electrician to confirm the areas that require a request).


  • For electrical wiring, it is necessary to comply with the laws set forth in each country.
  • Do not work without a qualified electrician for work that requires qualifications.
  • For work that requires qualifications, request work to be performed by qualified personnel.
  • For work that can be performed by unqualified personnel, check with the certification body or qualified personnel in each country and perform the work within that category.
  • If notification is required for installation, please submit the necessary notification to the respective organizations.

What purpose for?

The next, I clarified the purpose of the product.

Using RFID, read the membership card to collate/record the following information and turn on/off the main power of the machine

  • Reconciliation of the Operation training record
  • Management of the Operation training record expiration dates (Expiration date management for those who have not used the equipment for a long period of time or for large equipment that requires periodic training)
  • Management of machine availability (used to plan replacement of consumables and installation of maintenance equipment)

Using the above content, streamline the operational activities of the FabLab


alt text
alt text

What will you design?

  • Body of Device
  • The design of Mifare card

What processes will be used?

topic Plan
2D design Members' card design
3D design Outbox and feed design
Subtractive - Laser cutting A part of outbox
Subtractive - CNC milling Board and feet milling
Additive - 3D printing Outbox
Electronics Design Design a XIAO ESP32 board
Embedded Programming Embedded Programming with XIAO ESP32 board
molding and casting Create feet
output devices DFplayer & speaker, LCD, Fan
input devices RFID2
networking and communications Networking with XIAO ESP32 board

- Plans are subject to change depending on circumstances.


Total: ¥15,730 (JPY)

Part name Q'ty Unit Price Sub Total Where to buy
Solid State Module 
1 ¥1,000 ¥1,000 Akizuki
DC Fan 5V 1 ¥280 ¥280 Akizuki
Power Supply (RWS50B-5) 1 ¥5,600 ¥5,600 Digikey
Ac inlet (FN281-4-06) 1 ¥4,000 ¥4,000 Digikey
AC code 3pin 1 ¥900 ¥900 Monotarou
Wall outlet 1 ¥600 ¥600 Monotarou
Wifi Antenna 2.4GHz 5.8G 1 ¥250 ¥250 Amazon
USB 1.0cable typeC 1 ¥100 ¥100 100 yen shop
USB 3.0cable typeA 1 ¥900 ¥900 Amazon
USB Extension Cable 2 ¥900 ¥1,800 Amazon
Wire (as needed)     - ¥300 ¥300 Amazon

- Prioritizing reliability, a high-brand switching power supply (RWS50B-5) and AC inlet (FN281-4-06) were used, but I think a low-cost power supply could have been procured for half the price.
- RFID2: Select this product that are not regulated by Japanese radio laws.

Electronics production

Main Board

Total: ¥1,774 (JPY)

Parts Quantity Unit price Sub Total Where to buy
Proto Board FR1 1/3 board ¥1,600 ¥534 DigiKey
Seeed Studio XIAO ESP32C3 1 ¥940 ¥940 Akizuki
PinHeader_1x04_P2.54mm_Vertical_SMD 3 ¥30 ¥90 Akizuki
PinHeader_1x02_P2.54mm_Vertical_SMD 1 ¥30 ¥30 Akizuki
Photocoupler TLP293 1 ¥30 ¥30 Akizuki
LED 1206 1 ¥20 ¥20 Akizuki
Switch Button Omron B3SN 1 ¥20 ¥20 Akizuki
Resistor 1k ohm 1 ¥20 ¥20 DigiKey
Resistor 470 ohm 1 ¥50 ¥50 DigiKey
Resistor 0 ohm 2 ¥20 ¥40 DigiKey

Sound board

Total: ¥2,170 (JPY)

Parts Quantity Unit price Sub Total Where to buy
Proto Board FR1 1/4 board ¥1,600 ¥400 DigiKey
DFplayer mini(DFR0299) 1 ¥810 ¥810 DigiKey
Speaker unit (8Ω 0.5W) 1 ¥120 ¥120 Akizuki
PinHeader_1x04_P2.54mm_Vertical 1 ¥30 ¥30 Akizuki
PinHeader_1x02_P2.54mm_Vertical 1 ¥30 ¥30 Akizuki
SD card (32GB) 1 ¥780 ¥780 Amazon

NOTE: I think SD card could have been less expensive as I didn't need 32GB

Card reader /LCD connect board

Total: ¥2,055 (JPY)

Parts Quantity Unit price Sub Total Where to buy
Proto Board FR1 1/4 board ¥1,600 ¥400 DigiKey
RFID2 (U031-B) 1 ¥679 ¥679 DigiKey
LCD Module(AE-AQM1602A(KIT)) 1 ¥780 ¥780 Akizuki
PinHeader_1x04_P2.54mm_Vertical 3 ¥30 ¥90 Akizuki
Mifare card 1 ¥106 ¥106 Amazon

Body parts

Total: ¥3.952 (JPY)

Part name Q'ty Unit Price Sub Total Where to buy
Filament (PLA) Polyterra PLA 1.75mm 0.80 ¥3,300 (1kg) ¥2,640 Polymaker
Filament (ABS+) eSUN 1.75mm 0.05 ¥2,400 (1kg) ¥120 Amazon
Acrylic Sheet t2x160x180 1 ¥270 d ¥270 Amazon
Insert Nuts M3x4mm x L 4mm 46 ¥10 ¥460 Amazon
Insert Nuts M4x6mm x L 6mm 10 ¥30 ¥300 Amazon
Screw M3x6 16 ¥3 ¥48 Misumi
Screw M3x8 4 ¥3 ¥12 Misumi
Screw M3x10 12 ¥3 ¥36 Misumi
Screw M3x12 2 ¥3 ¥6 Misumi
Screw M3x15 10 ¥3 ¥30 Misumi
Screw M3x16 2 ¥3 ¥6 Misumi
Screw M4x15 2 ¥3 ¥6 Misumi
Washer M3 4 ¥3 ¥12 Misumi
Washer M4 2 ¥3 ¥6 Misumi
  • NOTE:
    • Filaments were converted to actual amount used.
    • ABS is used only for mounts where parts tend to generate heat. (ex: SSR mount base)

2D Model


  • In Week02, I designed Prototype1 of member's card, using Inkscape & Illustrator.
    -> more details: Week02.
    alt text


  • In Week16, I check Prototype1, and found logo could not be made clear shape and the color was dark. I designed Prototype2 of member's card, using Canva free format, and edit the color and text, and export png file. It seems better than Prototype1.
    alt text
  • Printout with Label seal A-one, and paste to Mifare card.
    alt text
  • Set to card holder. The size seems good.

3D Model


  • In week02, I designed the rough prototype of outbox, using Fusion360.
    alt text


  • Since week02 (3D model) is only designed a simple model, I re-create Prototype2.   
  • I considered the proper size with cardboard box that I cut with a cutter.
    alt text
  • I create 3D model (Prototype2) by Fusion360.
    alt text
    alt text

3D Printhing

The several parts of final project were output.
- Machine: VORON 2.4 R2
- Material: PLA and ABS (ABS is used only for mounts where parts tend to generate heat. (ex: SSR mount base) alt text

alt text
The Body, it took about 13.5 hours to output.
alt text

Laser cut

The 2 panel for final project, cut by Laser cutting machine.
- Machine: FABOOL Laser CO2
- Material: Acrylic Sheet t2 - Parameter: Speed 1000 / Power 60 / Times 2 alt text
alt text

NOTE: The SVG file to cut with laser cut is made by Fusion360 add-in shaper utilities. The details to do is in Week03.

Electronics Design & Production

Main board

With several trial, I created the prototype of the board for my final Project. I think that Electronics Design is one of the most difficult tasks that required a lot of effort. During works It is important to look the datasheet.

The latest board is below, made by week09. alt text

- Schematic

alt text

- Board design

alt text

Why I add photocoupler?

  1. Changing the input signal voltage of the Solid State Relay Module (SSR-40DA).
    Old version :3-32V
    New version :4-32V
    (Input control voltage of DC5V or more is recommended for stable operation.)
  2. The input signal voltage of the SSR used was 4-32V and could not be driven by the digital pin voltage (3.3V) of the ESP32C3.
  3. For the above reasons, I thought of using some kind of device such as a FET or logic level converter to control the 5V voltage with a 3.3V signal voltage.
  4. For the device to be used, I decided to use a photocoupler that was stocked in large quantities at home.
    (I figured I didn't want to pay 1000 yen shipping to buy one FET for 60 yen)

- Data file:

- Datasheet

  • Pinout of XIAO ESP32-C3 alt text

Sound board (DFplayer mini)

  • Data file
  • Schematic and Board design are below.
    alt text

Card reader / LCD connect board

  • Data file
  • Schematic and Board design are below. alt text

Assemble / Wiring

Wire Work

  • Since high voltages are handled, it should be taken into account and adequate safety measures (e.g., use appropriate cables...) should be taken.
  • After receiving advice from a qualified electrician, the following cables were selected for use with Japanese household power (100V 15A).
    • VVF cable (2.0mm^2) Allowable current 23A
    • IV cable (2.0mm^2) Permissible current 35A

Put insert to mount and panel and body. then screw down parts and boards.
alt text
Make wire and connect to devices.

alt text
Connect AC and DC power supply related.
alt text
Rear panel mounted on body.
alt text
Front panel mounted on body alt text
alt text

Assemble for Remote Controller parts and devices.
alt text
Assembly complete
alt text

Output Divice

In Week09, I work with Solid State Module(SSR-40DA).

Programming microcontroller board with Seeed Studio XIAO ESP32C3 which I designed to turn on the Heat Gun (AC100V) using SSR-40DA. This result make me happy.

How to connect alt text

I use ChatGPT for programming. Programming code is below.

const int SSRPin1 = D8;//Solid State Module outpin 
const int buttonPin = D1;// button pin  ESP32C3 pin D7 
int buttonState = 0;//initial state of the button
int i = 0; //variable intensity led

void setup() { //declaration of inputs and outputs
  pinMode(SSRPin1, OUTPUT);
  pinMode(buttonPin, INPUT);
void loop() {
  buttonState = digitalRead(buttonPin);// we read the state of the button
  if (buttonState == HIGH) { //if we press the button
  digitalWrite(SSRPin1, HIGH);
  digitalWrite(SSRPin1, LOW);    

  else {  //if we don't press the button
  digitalWrite(SSRPin1, LOW);

Input Device

In Week11, I work with RFID2. alt text RFID2 to a microcontroller board that I have designed and read the Mifare card. alt text

I generated a code in ChatGPT that reads the card and displays the UID of the card. The code is below.

#include <Wire.h>
#include <MFRC522v2.h>
#include <MFRC522DriverI2C.h>
#include <MFRC522Debug.h>

const uint8_t customAddress = 0x28;

MFRC522DriverI2C driver{customAddress, Wire}; // Use the standard Wire object for I2C driver.

MFRC522 mfrc522{driver}; // Create MFRC522 instance.

void setup() {
  Serial.begin(115200); // Initialize serial communications with the PC for debugging.
  while (!Serial);      // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4).

  Wire.begin(); // Initialize I2C with default SDA and SCL pins.

  mfrc522.PCD_Init();   // Init MFRC522 board.
  MFRC522Debug::PCD_DumpVersionToSerial(mfrc522, Serial); // Show details of PCD - MFRC522 Card Reader details.
  Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));

void loop() {
  if ( !mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {

  MFRC522Debug::PICC_DumpToSerial(mfrc522, Serial, &(mfrc522.uid));

Molding and Casting

In week12, I made the feet for my final Project, with Milling Molding Wax & Molding by silicone, and Casting by polyurethane resin.
alt text Drill holes。   alt text The feet is set on the bottom of body.
alt text

Networking and communications

  • In week13. I checked the communications of nords for my final Project.
  • Read the Mifare card by RFID2, and depends on Authentication UID or Un-authentication of Mifare card, turn on/off SSR-40DA, and display text to LCD, and play sound by DF player mini.

I use below nord and Board and IDE as following.

title Description
Nord RFID2, SSR-40DA, LCD Module(AE-AQM1602A), DFplayer mini(DFR0299)
Board Seeed XIAO ESP32C3 board, designed by week09 for my final Project
IDE Arduino IDE
Communication I2C x2, Serial communication x1, Wifi
others Mifare card, Speaker (8Ω 0.5W), MicroSDcard


Communication diagram

alt text
alt text

How to connect

alt text

Code (Final)

I generated The program code using ChatGPT about Solid State Module in Week09, RDID2 in Week11, Networking and communications in Week13. with checking the operation of the devices one by one.

The Final code details are below.

This code is an Arduino-based RFID card reader system that uses an RFID reader module called MFRC522 to read the card and compare it with the registered card information for authentication. It also uses an audio player module called DFRobotDFPlayerMini to play audio for various situations. Additionally, it has the ability to display messages on the LCD display.
Below is a detailed description of each part.  

Syntax Description
1. library inclusion: Include the required libraries. This includes Wire (I2C communication), MFRC522v2 (RFID reader), WiFi (wireless connectivity), time (time-related processing), SoftwareSerial (software serial communication), and DFRobotDFPlayerMini (audio player).
2. global variable definitions: Defines variables used throughout the program, including RFID reader, card information, card current status, audio playback status, SoftwareSerial communication, and audio player.
3. setup functions: initialize hardware and set up WiFi connection. It also initializes the audio player and plays audio to start the system.
4. Loop function: reads the card, compares it with the registered information, and performs actions according to its status (play audio, update LCD, etc.). This function is looped continuously while the Arduino is running.
5. other functions: functions are defined to perform specific functions such as formatting the UID of the card, updating the LCD, connecting to WiFi, getting the time, checking the expiration date, etc.

Specific actions include: when a registered card is read, the card's expiration date is checked, and if it has not expired, the LED is lit, an audio is played, and a message is displayed on the LCD. If a non-registered or expired card is read, a different voice is played and a warning message is displayed on the LCD.

// Hiroe Takeda. Fab Academy 2023
//【Final code for Runtime checker 】2023/5/19
// Fab Lab Kitakagaya, Fab Lab West-harima

#include <Wire.h>
#include <MFRC522v2.h>
#include <MFRC522DriverI2C.h>
#include <MFRC522Debug.h>
#include <WiFi.h>
#include <time.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>

const uint8_t customAddress = 0x28;
const uint8_t DEVICE_ADDRESS = 0x3E;

MFRC522DriverI2C driver{customAddress, Wire};
MFRC522 mfrc522{driver};

struct CardInfo {
  const char* uid;
  const char* userName;
  const char* expiryDate;

CardInfo registeredCards[] = {
  {"5E4ABC3E", "HIROE TAKEDA", "20240501"},
  {"DEE6B43E", "KAZUNARI TAKEDA", "20240501"},
  {"DE1AB83E", "FABLAB TARO", "20221001"}

// WiFi Network Information
struct WifiNetwork {
  const char* ssid;
  const char* password;

WifiNetwork wifiNetworks[] = {
  {"Wifi_SSID1", "Wifi_Password1"},
  {"Wifi_SSID2", "Wifi_Password2"},
  // Add more networks as needed

bool soundPlayed = false;
const uint8_t ssr = 8;

enum CardStatus {

CardStatus currentStatus = NO_CARD;

char lastUid[9] = "";
char lastUserName[17] = "";
bool countTime = false;
time_t cardAuthStartTime;

SoftwareSerial mySoftwareSerial(20, 21);
DFRobotDFPlayerMini myDFPlayer;

bool uidMatches(MFRC522::Uid *uid1, const char *uid2) {
  if (uid1->size != 4) {
    return false;

  for (uint8_t i = 0; i < uid1->size; i++) {
    char buf[3] = {uid2[i * 2], uid2[i * 2 + 1], '\0'};
    uint8_t uid2Byte = strtol(buf, nullptr, 16);
    if (uid1->uidByte[i] != uid2Byte) {
      return false;
  return true;

const char* formatUid(MFRC522::Uid *uid) {
  static char buf[9];
  for (uint8_t i = 0; i < uid->size; i++) {
    snprintf(&buf[i * 2], 3, "%02X", uid->uidByte[i]);
  return buf;

void printCardDetails(MFRC522::Uid *uid) {
  for (uint8_t i = 0; i < uid->size; i++) {

void setup() {
  pinMode(ssr, OUTPUT);


  // DFPlayer setup
  while (!myDFPlayer.begin(mySoftwareSerial)) {
  myDFPlayer.setTimeOut(500); // Set serial communication time out 500ms
  myDFPlayer.volume(30); // DFPlayer volume value. From 0 to 30; // Play the System Opening : Sound No.1

void loop()

  // Check WiFi connection and reconnect if disconnected
  if(WiFi.status() != WL_CONNECTED) {

  bool cardPresent = mfrc522.PICC_IsNewCardPresent() &&
  CardStatus newStatus;

  if (cardPresent) {

    bool isRegistered = false;
    bool isExpired = false;

    for (uint8_t i = 0; i < sizeof(registeredCards) / sizeof(registeredCards[0]); i++) {
      if (uidMatches(&(mfrc522.uid), registeredCards[i].uid)) {
        isRegistered = true;
        strncpy(lastUid, registeredCards[i].uid, sizeof(lastUid));
        strncpy(lastUserName, registeredCards[i].userName, sizeof(lastUserName));

        if (isDateExpired(registeredCards[i].expiryDate)) {
          isExpired = true;


    if (isRegistered && !isExpired) {
      digitalWrite(ssr, HIGH);
      newStatus = REGISTERED_CARD;
      if (!soundPlayed) {; //Play the Sound for the turn on: Sound No.2
        soundPlayed = true;

      while (mfrc522.PICC_IsNewCardPresent()) {
    } else {
      digitalWrite(ssr, LOW);
      newStatus = UNREGISTERED_CARD;
      if (isExpired) {; // Play the Sound for expired cards : Sound No.5
      } else {; //Play the Sound for not authorized: Sound No.3
      updateLCD("Not authorized", "or expired");
  } else {
    digitalWrite(ssr, LOW);
    newStatus = NO_CARD;
    soundPlayed = false;
    if (currentStatus != newStatus) {; //Play the Sound for the turn off: Sound No.4

  if (newStatus != currentStatus) {
    currentStatus = newStatus;

    switch (currentStatus) {
      case NO_CARD:
        if (countTime) {
          time_t elapsedTime = time(nullptr) - cardAuthStartTime;
          unsigned long hours = elapsedTime / 3600;
          unsigned long minutes = (elapsedTime % 3600) / 60;
          unsigned long seconds = elapsedTime % 60;
          char elapsedTimeStr[17];
          snprintf(elapsedTimeStr, sizeof(elapsedTimeStr), "%luh %lum %lus", hours, minutes, seconds);
          updateLCD(elapsedTimeStr, lastUserName);
          countTime = false;
        } else {
          updateLCD("Put your", "members card");
        updateLCD("Welcome FabLab", lastUserName);
        cardAuthStartTime = time(nullptr);
        countTime = true;
        updateLCD("Not authorized", "or expired");

void updateLCD(const char* line1, const char* line2) {
  writeCommand(0x01); // Clear Display

  // Write first line
  for (int i = 0; line1[i] != '\0' && i < 16; i++) {
    writeCommand(0x80 + i);

  // Write second line
  for (int i = 0; line2[i] != '\0' && i < 16; i++) {
    writeCommand(0xC0 + i);

void writeData(byte toSend) {

void writeCommand(byte toSend) {

void init_LCD() {

void connectToWifi() {

  // Try to connect with each access point
  for(uint8_t i = 0; i < sizeof(wifiNetworks) / sizeof(WifiNetwork);i++) {
    WiFi.begin(wifiNetworks[i].ssid, wifiNetworks[i].password);

    uint8_t attempt = 0;
    while (WiFi.status() != WL_CONNECTED && attempt < 30) {
    // If connection was successful, exit the loop
    if(WiFi.status() == WL_CONNECTED) {

  if(WiFi.status() == WL_CONNECTED) {
    // print your local IP address:
    Serial.print("Connected to network: ");

void obtainTime() {
  //set NTP server pool
  configTime(0, 0, "");

  // Wait for time to be set (by the network)
  const int maxRetries = 10;
  int retries = 0;
  while(time(nullptr) < 1619042464L && retries < maxRetries) {
    Serial.println("Waiting for time to be set...");

bool isDateExpired(const char *expiryDate) {
  time_t now;
  struct tm * timeinfo;
  timeinfo = localtime (&now);
  char currentDate[9];
  sprintf(currentDate, "%04d%02d%02d", timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday);  
  return strcmp(currentDate, expiryDate) > 0;


In my case, I decided to grant the following license "CC BY-NC-SA" for my project for all copyrighted works.
alt text
This license allows re-users to distribute, remix, adapt, and build upon the material in any medium or format for noncommercial purposes only, and only so long as attribution is given to the creator. If people remix, adapt, or build upon the material, you must license the modified material under identical terms.

Reference from Creative Commons alt text

My thought

  • For me, all assignment are not easy, very tough work. Many software and tools were used for the first time and errors occurred frequently. There were many difficult hours.
  • As It was obvious to me that I did not have enough skills before Fab Academy, I did self bootcamp about 6 months, learning the role and function of electronic parts, and board creation with Kicad and milling machine etc. The self bootcamp (spartan training) helps me a lot.
  • I consider the device for final project during bootcamp every day, It bedome good training too.
  • In week assignment, I tried to related with final project. It was good for me, as I think that my work is not so fast.Some weeks did not go as planned, and the work each week was difficult each time, but by the end I could see the shape of the project.

Data file