Skip to content

Week 9 : Input devices

PCB CNC milling not available at time of writing at the workspace. Thus, tests were mainly done on breadboard. The final result-with the CNC milling- could be seen further below

Week 9 assignment could be categorized as follows:

  • Group assignment

    • Input devices signal characteristics
  • Individual assignment

    • Sensor + designed PCB test

Input devices signal characteristics

Types of input sensors
  • Air quality
    • Detects dust/particles
  • Distance
    • Measures distance to objects
  • Encoder
    • Measures rotation or linear movement. Counting pulses = tells position. Pulse frequency = tells speed.
  • Force
    • Measures applied force or pressure
  • Image/vision
    • Captures images and processes them digitally
  • Light
    • Phototransistor: Changes current based on light intensity
    • Photoresistor: Changes resistance based on light intensity
    • Color: Detects RGB light components
  • Magnetic field vector
    • Measures magnetic field X, Y, Z axes
  • Magnetic switch/hall
    • Measures magnetic field strength and detects change
  • Motion
    • Pyroelectric (obsolete): Detects human body heat movement
    • Doppler/LIDAR: Detects motion via frequency shift
  • Motion & Orientation/IMU (Inertial Measurement Unit)
    • Acceleration (XYZ)
    • Rotation (Gyroscope)
    • Magnetic field
    • 6-axis = acceleration + rotation, 9-axis = acceleration + rotation + magnetic field
  • Sound
    • Converts sound waves into electrical signals
  • Temperature
    • Typical use: Monitor and control temperature
  • Time & location
    • Real-time clock (RTC): Tracks time
    • GPS: Location and time (Needs satellite visibility)
  • Vibration
    • Measures mechanical oscillations or shake

Sensors must be interfaced with a microcontroller to provide meaningful data. This interface depends on the type of signal the sensor produces (analog/digital) and the processing method of it. These input methods could be categorized as the following :

  • Direct input methods (microcontroller reads signal from sensor itself):
    • GPIO (ports)
    • Comparator : Threshold-based detection. Not available at XIAO RP2040 and XIAO ESP32C3.
    • ADC
  • Communication interfaces (microcontroller reads data from another chip):
    • I2C
    • SPI
    • UART

The SEEED Studio Grove system is a modular electronics platform designed to simplify prototyping with a wide range of sensors and microcontrollers. It uses standardized 4-pin connectors, allowing components to be easily connected without soldering and detailed documentation - including usage guide and example code - is available on the SEEED studio wiki. At the time of writing this documentation, there are 20 Grove sensors that are available at Chaihuo makerspace and 13 of them managed to be tested.

4-pin connectors have a housing that mechanically prevents incorrect orientation or misalignment

Note : This test is aimed to understand the characteristic of the (digital and analog) signal and the the physical connections (i.e. I2C and UART) between the Grove sensors and the XIAO ESP32C3. Detailed investigation on the underlying principals of all sensors were not conducted and communication interfaces characteristics will be explored further in the coming weeks. With this in mind, the Arduino IDE was used as the programming environment - usage and setup could be found at the Week 4 : Embedded Programming documentation.

Sensor Name Interface Additional notes
Grove - Air Quality Sensor Analog ⚠️ results though are inconclusive. Need to be compared with real dataset
Grove - Encoder Digital -
Grove - GPS UART -
Grove - Light Sensor Analog -
Grove Mech Keycap Digital -
Grove - PIR Motion Sensor Digital -
Grove - RTC (Real-Time Clock) I2C Without battery, only powered through USB
Grove - Rotary Angle Sensor Analog -
Grove - Temperature Sensor Analog ⚠️ worked, further test could be done to test extremes/sensitivity
Grove - Thumb Joystick Analog ⚠️ worked, results though are inconclusive. Need to be tested with moving parts
Grove - Touch Sensor Digital -
Grove - Loudness Sensor Analog -
Sensor Name Interface Additional notes
Grove - 3-Axis Digital Accelerometer I2C -
Grove - 6-Axis Accelerometer & Compass I2C -
Grove - 6-Axis Accelerometer & Gyroscope I2C -
Grove - Gas Sensor Analog -
Grove - High Precision Barometer Sensor (DPS310) I2C -
Grove - IMU 10DOF I2C ⚠️ tested, but results though are inconclusive. Need to be tested with moving parts. Flagged as not yet tested
Grove - Line Finder Analog -
Grove - Moisture Sensor Analog -

Most of the reference implementations at the wiki are based on Arduino board and might require adjustments to make it actually work. AI in this case could help greatly with the process.

The following sections therefore highlight cases where additional configuration, debugging, or modifications were needed beyond straightforward plug-and-play usage. Incidentally, these examples also cover a range of communication interfaces, including UART, I2C, as well as digital and analog connections.

While the Grove board is convenient for quick prototyping, it may introduce slight additional resistance and contact impedance due to its connectors (e.g. LED was spotted to be dimmer than with breadboard during the test). In such cases, testing on a breadboard with direct jumper wire connections could be an alternative. The breadboard though is also not reliable especially for long-term setups

Limitations of breadboards
  • Component limitations: Breadboards are designed for through-hole components. This means users need to have through-hole and SMD components in their inventory.

  • Poor electrical performance: The internal connections can introduce noise, resistance, and crosstalk between signals, which may affect circuit behavior—especially for high-speed or sensitive signals.

  • Mechanical instability: Connections are not secure. Moving or handling the breadboard can loosen wires or components, causing the circuit to stop worrking and so lack of reliability.

Rotary angle vs Encoder | Digital vs Analog

Both the encoder and the rotary angle sensor are used to measure rotational movement. Differences in working principle could be seen at the table below.

Feature Rotary Angle Sensor Encoder
Signal Type Analog Digital
Output Type Absolute position (angle) Relative movement (steps)
Measurement Range Limited (e.g., ~300°) Continuous rotation
Precision Limited by ADC resolution Higher (depends on encoder resolution)

A rotary encoder generates digital pulses as it rotates. These pulses come from two signals, CLK (Clock) and DT (Data), and the relative timing between them allows the system to determine the direction of rotation—clockwise (CW) or counterclockwise (CCW). By counting the number of pulses, the system can evaluate how far the encoder has been turned. For a clearer visual explanation, please refer to resources online.

In contrast, a rotary angle sensor produces an analog voltage proportional to its rotational position. This allows it to directly indicate the absolute angle of the knob. The analog output can be read via an ADC pin and mapped to control outputs, such as LED brightness. Unlike the encoder, the rotary angle sensor does not inherently detect direction; it simply reports the current position.

GPS | UART

The Grove GPS module communicates using UART and can be interfaced directly with the XIAO ESP32C3 without requiring additional softwares (at the time of writing this document, the wiki mentioned the SIMCom GPS DEMO). The module outputs standard NMEA sentences (standardized text message format used by GPS modules to transmit data such as location, time, speed and satellite information), which can be parsed (i.e. converted to more readable text) using libraries like TinyGPS++.

Two key conditions must be ensured for the GPS module to function correctly: - The module communicates via UART, which means the GPS module’s TX should be connected to the XIAO’s RX, and the GPS module’s RX to the XIAO’s TX. - The GPS requires an open outdoor environment to acquire satellite signals

The module should pick up signals within 2 minutes. If this is not the case, then it is likely that one or both of these conditions have not been met.

The working GPS code could be seen at the admonition below.

GPS x XIAO ESP32C3 code
#include <TinyGPS++.h>
#include <HardwareSerial.h>

TinyGPSPlus gps;
HardwareSerial GPSSerial(1); // UART1 for GPS

void setup() {
  Serial.begin(9600); // USB serial monitor
  while (!Serial);

  Serial.println("Starting Grove GPS Debug...");

  // RX = GPIO20, TX = GPIO21
  GPSSerial.begin(9600, SERIAL_8N1, 20, 21);

  Serial.println("Waiting for GPS data...");
}

void loop() {
  while (GPSSerial.available()) {
    gps.encode(GPSSerial.read());
  }

  if (gps.charsProcessed() < 10) {
    Serial.println("No GPS data yet...");
    delay(1000);
    return;
  }

  Serial.print("Satellites in view: ");
  Serial.println(gps.satellites.value());

  if (gps.location.isValid()) {
    Serial.print("Latitude: ");
    Serial.println(gps.location.lat(), 6);
    Serial.print("Longitude: ");
    Serial.println(gps.location.lng(), 6);
  } else {
    Serial.println("Waiting for GPS fix...");
  }

  delay(1000);
  }

  *Source: ChatGPT by OpenAI, March 2026*

The figures below shows the location of the outdoor experiment to test the definition of "open environment". Although it is in between walls, it was still able to acquire satellite signals. In this case, 4 satellites.

A second test was then carried out to compare indoor performance. When the device was moved indoors, the number of detected satellites dropped significantly (i.e. from 4 to 0 satellites). This clearly highlights the strong dependency of the GPS signal quality on the environmental conditions.

RTC | I2C

RTC is used to keep track of time. Although microcontrollers might include internal RTCs, the external ones generally provide higher accuracy. Furthermore, external power supply (e.g. battery) enables the module to keep time even when the main power supply - that might power other components - is lost.

The component uses the I2C protocol and so uses two signal line :

  • SDA (serial data) : carries data
  • SCL (series clock) : provides timing

In order for the module to work, the following conditions need to be met : - Correct wiring. SDA of microcontroller needs to be connected to the SDA of the module. This also applies to SCL. - The I2C needs to be initialized in the code (i.e. Wire.begin()) otherwise no communication will occur.

Sometimes the serial monitor needs also to be closed and reopened to re-establish connection. Behaviors vary across OS, IDEs, etc

The working RTC code could be seen at the admonition below.

RTC x XIAO ESP32C3 code
#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;       // RTC object
const int ledPin = 3; // LED on GPIO3

void setup() {
Serial.begin(9600);
delay(1000);

pinMode(ledPin, OUTPUT);

Wire.begin(6, 7); // SDA=6, SCL=7 (your working pins)

if (!rtc.begin()) {
    Serial.println("Couldn't find RTC!");
    while (1);
}

Serial.println("RTC found!");

rtc.adjust(DateTime(2026, 3, 21, 15, 54, 0));
}

void loop() {
DateTime now = rtc.now();

int sec = now.second();

// LED logic: ON if seconds do NOT contain digit 3
if ((sec % 10 != 3) && (sec / 10 != 3)) {
    digitalWrite(ledPin, HIGH);
} else {
    digitalWrite(ledPin, LOW);
}

// Print current time to Serial Monitor
Serial.print(now.hour()); Serial.print(":");
Serial.print(now.minute()); Serial.print(":");
Serial.println(now.second());

delay(1000);
}

Note :The LED used in this example is not essential for verifying I2C communication. It is included only as a simple visual indicator to show that the program is running and reacting to data from the RTC. The behaviour of the LED is not directly connected to or representative of the I2C signals.

Sensor + designed PCB test

The final project requires a reliable and sensitive light sensing mechanism. For this reason, a comparison between a photoresistor and a phototransistor was carried out, with more detailed observations documented in the MCU + Peripherals section under the Final Project tab. In general, the phototransistor behaves as a light-controlled transistor, meaning that incident light generates a current which is then amplified internally. Therefore, this amplification character boosts the sensitivity of the component. High absolute measurement accuracy is not a strict requirement as two phototransistors are used to measure relative differences in light intensity. The consistency and responsiveness of the sensor is thus more important.

The industrially manufactured PCB is used for the test - however it was not designed to include a display (this will be added next week) and so a "visual aid" is needed to understand the sensor's behaviour apart from the serial monitor. Therefore the servo motor is used for this, which is also part of the final project.

It can be observed that the servo motor rotates in response to changes in light detected by the phototransistor.

The bill of materials (BOM) is listed below :

Qty Component Description
2 Photoretransistor Light sensor
2 Pin sockets For interface between PCB and phototransistor
1 Pin headers For interface between PCB and servo
1 Seeed Studio XIAO RP2040 Microcontroller for reading sensor and controlling servo
1 Servo motor (e.g. SG5010) Visual output device to indicate light level

Files