This is only a preview of the February 2026 issue of Silicon Chip. You can view 35 of the 104 pages in the full issue, including the advertisments. For full access, purchase the issue for $10.00 or subscribe for access to the latest issues. Items relevant to "Mains LED Indicator":
Articles in this series:
Items relevant to "The Internet Radio, Part 1":
Items relevant to "Mains Hum Notch Filter":
Items relevant to "DCC Remote Controller":
Articles in this series:
Items relevant to "Tiny QR Code Reader":
Purchase a printed copy of this issue for $14.00. |
Using Electronic Modules with Tim Blythman
Actual Size
Tiny QR
Code Reader
Combining a camera with a microcontroller
opens up many possibilities, but typically
adds the requirement to process vast volumes
of data. The Tiny Code Reader is a fairly
inexpensive module that includes a camera and can
decode QR codes, making it quite useful indeed.
T
his tiny module is available from
Mouser and DigiKey for around
$15 and we thought that it would be
worth trying out; that’s a good price
for a module that can read QR codes.
If you want to learn more about QR
codes, see our panel overleaf.
The Tiny Code Reader has a straightforward interface, with example software for numerous languages and processors. We didn’t see any PicoMite
code, so we’ve written a BASIC program that allows the PicoMite to interact with the Reader.
The Reader is produced by a firm
called Useful Sensors, based in the
USA. They specialise in AI-powered
technology; some of their other products include speech-to-text and translation features.
It is very small, measuring about 16
× 19mm and about 8mm thick overall. The lead photos show the front
(featuring the camera lens) and rear.
Pin headers are not supplied, so we
fitted those ourselves.
The hardware appears to be similar (electrically) to a Raspberry Pi
Pico module. It is based on an RP2040
processor, and you can see the flash
memory chip and oscillator on the
small PCB. It appears to be a closedsource design, and we did not find any
circuit diagrams or the like at www.
usefulsensors.com
The camera module is glued in place
and attaches via a slim mezzanine
connector. That and an RGB LED are
about the only parts that would not be
found on an RP2040 microcontroller
board such as the Pico. The RGB LED
is on the same side as the camera lens.
The main external interface is a fiveway 0.1in/2.54mm pitch header that
breaks out an I2C interface along with
power. We used the pin headers during
our testing but there is also a four-way
1mm-pitch JST connector that provides a so-called ‘Qwiic’ I2C interface.
The Qwiic interface was developed
by SparkFun but is now used on many
different development boards. There
is more information available on it at
www.sparkfun.com/qwiic
Tiny Code Reader
The Tiny Code Reader has a microcontroller that reads and decodes
image data from a camera sensor. It
can communicate via an I2C interface
and has an RGB LED that flashes to
report its status.
During normal operation, the LED
flashes blue, turning green when a
valid QR code is detected. If it shows
red, an error has occurred. The entire
device operates at 3.3V, which simplifies the circuit, since no regulator is
needed for the 3.3V microcontroller.
▶ Fig.1: the wiring is straightforward; the connections shown here will work with
our sample code. We didn’t need to fit any external pullup resistors during our
tests. The module is shown larger than life here for clarity.
Fig.2: the approximate ranges at which the Tiny Code Reader could decode a
62mm-wide QR code. It has much the same vertical range as horizontal range.
The user guide suggests a distance of 100mm should work, and we were able to
achieve this with a smaller QR code spanning a 20° field in the camera’s vision.
80
Silicon Chip
Australia's electronics magazine
siliconchip.com.au
A guide can be found at https://github.
com/usefulsensors/tiny_code_reader_
docs
There are links to numerous code
examples on this page; we will also
discuss our code (Arduino and Pico
Mite) shortly. There is also a data
sheet, found at https://usfl.ink/tcr_ds
This indicates that the maximum
operating current is 40mA. Our unit
ran very close to 37mA whether the
LED was on or off. The wiring connections we used during our tests are
shown in Fig.1. Note that the INT pin
has no function on this module.
Since the module flashes its LED
green when it detects a QR code, we
found it easy to check its operation.
Once we had our software loaded,
everything worked as expected, printing the detected codes on a serial monitor program. Later, we will study its
range and field of view.
We found it was a bit tricky to aim
the device since there is no viewfinder.
It would have been more useful to
have the LED on the opposite side of
the board so it is visible when you are
facing the QR code.
Interface
The interface is quite simple. It uses
7-bit address 12 (0xC) and will respond
to all reads with a simple data structure up to 256 bytes long. The first two
bytes report the length of the detected
QR code (zero if not detected) and the
remaining bytes are the contents of the
code. There is also a write command
that can be used to disable or enable
the status LED.
As we mention in the panel on QR
codes, they can encode data much
longer than 256 bytes. The Tiny Code
Reader is only recommended to work
with codes up to 40 bytes, although
we were able to successfully read a
177-byte code.
The Tiny Code Reader performs a
scan every 200ms, since that is how
long it takes to process each image. It
can work with a 400kHz I2C bus, but
even with a 100kHz I2C bus, reading 256 bytes will only take around
23ms, so the reader is not limited by
the bus speed.
Some QR codes can encode non-
ASCII data, such as numeric data or
Japanese kanji symbols; it appears
that these encodings are not supported
by the Tiny Code Reader. As you can
see, the interface is quite simple, so
we recommend that you have a look
siliconchip.com.au
Start
The Tiny QR Code Reader should be at address 0x0C
Found
7 bit address: 12 (0xC)
8 bit write address: 24 (0x18)
8 bit read address: 25 (0x19)
Done.
Found 1 device(s).
T=2349
Code detected:
test
Code detected:
test
Screen 1: the output from our
Code detected:
Arduino test sketch includes an I2C
test
scan to confirm that communication
No code detected.
with the Reader is working.
No code detected.
at some of the code examples if you
want to learn more.
Code examples
We have created code examples for
the Pico microcontroller in both the
Arduino and PicoMite BASIC languages. There are compiled (UF2) files
for directly programming the Pico;
these work with the wiring shown
in Fig.1.
Screen 1 shows the output of the
serial port from when the Arduino
program starts and runs. Initially, it
performs an I2C device scan to allow
you to check that the Tiny Code Reader
is correctly wired. It then reports any
codes it sees and their contents.
The output is updated every two
seconds unless the content changes,
in which case it is updated immediately. The PicoMite BASIC program
works similarly, although it shows a
different style of I2C scan. Both programs allow you to switch the status
LED off or on by sending 0 or 1 to the
serial port.
Other notes
There is a nominally 2.2mm diameter mounting hole in one corner of the
PCB near the headers. The Reader is
quite small, but if you are able to use
the Qwiic connector, it can be made
even smaller by snapping off a portion of the PCB. That would include
the mounting hole, so it may not suit
all situations.
The documentation is quite firm on
the Reader only being suitable for 3.3V
logic levels. We still expect it would
work fine with a 5V microcontroller,
as long as the power and I2C lines are
limited to 3.3V, since most 5V micros
will accept anything above about 3.0V
as a high level. Just be sure not to apply
5V pullups to the I2C lines.
We tried reading linear (1D) barcodes, but it seems that the Tiny Code
Australia's electronics magazine
Reader does not support any of the
common linear barcodes. We plan to
review a 1D/2D barcode reader module in the near future.
If the Tiny Code Reader could be
expanded to handle linear barcodes,
we think it could be much more versatile. Given that linear barcodes are
simpler, we expect they would be
easier to decode. On that note, Useful
Sensors points out that they do not
provide support for reprogramming
the firmware on the Reader.
The RP2040 chip uses an external,
unencrypted flash memory chip, and
the Reader has about 10 test points
exposed. So we think it wouldn’t be
too hard for someone to extract the
firmware if they really wanted to.
Abilities
For these tests, we printed out some
short QR codes on white copy paper.
We found this to give better results
than the same code on a computer
monitor; we suspect that the refresh
rate of the monitor might be causing
artefacts in what the camera sees. The
codes we used were the smallest version and can hold up to 19 ASCII characters. The printed codes were 62mm
wide and tall.
We used normal office lighting and
rigged up the Tiny Code Reader on the
workbench with some rulers to measure the ranges over which it could
read our codes. So, our conditions
were fairly optimal without needing
extreme measures. Fig.2 shows the
regions over which we could perform
successful reads.
The spans shown are in the horizontal plane, but we found the vertical spans to be much the same. The
functional span (of the camera’s field
of view) varies between 33° close up
and 13° at a distance. At 150mm, the
62mm code covers 22° of the sensor’s
field, while it covers only 4° at 900mm.
February 2026 81
QR Codes
QR codes were invented in 1994, and QR stands for “quick response”. QR codes
were developed in Japan by Denso Wave, originally as an improvement on linear barcodes used to track automobile parts. Denso Wave maintains the website at www.qrcode.com/en/
These applications previously used codes similar to the EAN and UPC barcodes
used in retail environments to identify units of stock. Like linear barcodes, QR
codes are a pattern of light and dark shapes that encode data. The design of linear barcodes is in turn inspired by Morse code. Other 2D barcode types also exist.
The EAN (European article number) linear barcode can encode 13 numeric digits, equivalent to 43 bits of data. The simplest QR code can hold 152 bits, while
there are versions that can encode up to 23kbits (2.9 kilobytes) of data. While
linear barcodes have error detection, QR codes support multiple levels of error
correction and can be decoded even when some symbols are completely missing.
Crucial for their popularity, Denso Wave has made the specifications for
standard QR codes publicly available, so it is possible for anyone to create and
decode QR codes. Note that some of their specialised codes are still protected
by patents, though.
Despite having a logo covering some
of its modules, this QR code can still
be scanned and will provide a link to
the Silicon Chip website.
Structure
The figure below shows the layout of a QR code. The black or white squares are known as modules, and the smallest
QR codes measure 21×21 modules; this is known as version 1. Each version adds four modules in each direction, up to
177 × 177 modules for version 40.
A reader uses the quiet zone to establish the rough framing of a QR code, then detects the position patterns to determine the exact location and orientation of the code. The alignment and timing patterns provide enough information to
determine the location and thus value of each module.
Once the module data has been extracted, the format and version information is decoded, which dictates how the
remaining data is decoded. It includes redundancy in the form of error detection and correction codes, to allow data to
be successfully recovered even if the code is somewhat corrupted.
For example, a version 1 code, which can carry up to 152 bits of useful information, has about 200 modules available
for data and error correction after the necessary patterns have been counted. There are also different ‘levels’, which
allow more data to be encoded with greater redundancy. At the highest level, up to 30% corruption will still allow the
data to be recovered.
The redundant data uses Reed-Solomon coding, which is also used on compact discs. The format information is used
to decode the modules. A mode marker embedded in the data can be used to select between different types of encoding, such as ASCII (byte) data and the Kanji encoding noted earlier.
The encoding process also involves interleaving the data, which means shuffling bits around such that a localised
‘burst’ error is easier to detect and correct. This technique is also used on compact discs.
Encoding also involves a so-called masking step. The masks are known patterns that are used to modify the image to
make it less likely to have artefacts that are difficult to decode, such as areas of a single colour or an uneven count of
dark and light modules. The decoding step involves reversing the interleaving and masking processes.
All these steps may seem complex, but they make QR codes quite robust. They will work with just about any two colours
that can be distinguished by a camera. It’s even possible to create a customised code by deliberately corrupting a QR
code and replacing some of the modules with a logo or similar, since the error correction can handle the missing data.
There are numerous online QR code generators, although we would be dubious about entering any sensitive information
into an untrusted website. Denso Wave provides QR code software at www.denso-wave.com/en/adcd/product/software/
We also found an Arduino library by Richard
Moore that can generate QR codes. The example
1. Version information
sketch prints a code to the serial monitor using
block characters. It can be found by searching for
2. Format information
QRCode in the Library Manager or downloaded
3. Data and error correction keys
from https://github.com/ricmoo/qrcode/
We tried using it with the Tiny Code Reader
4. Required patterns
decoding the codes that the library created and
4.1. Position
it worked well enough. Fitting an Arduino board
with a display and Tiny Code Reader could be a
way to have slow but simple bidirectional com4.2. Alignment
munication!
4.3. Timing
5. Quiet zone
82
Silicon Chip
While QR codes may appear to be a random
assortment of black and white squares, they are
actually highly structured and robust. Source:
https://w.wiki/BRVs
Australia's electronics magazine
siliconchip.com.au
There is clearly an interplay of factors such as focus and resolution at
play. For example, we were also able
to read a 31mm-wide code at a distance of 90mm from the sensor; in this
case, the code covers 20° of the sensor’s field. The data sheet states that
a distance of 10-15cm is best for the
camera’s focus.
Uses
While we thought that the Tiny
Code Reader sounded like a novel and
interesting device, we weren’t sure
exactly what uses it might have. The
Useful Sensors documentation does
offer one suggestion: as a way to provision WiFi network information to a
microcontroller.
There are specific code formats
intended to carry WiFi network information (SSID, password, encryption
type etc), so this seems straightforward enough. It’s probably not practical for a one-off setup, but if a device
is expected to connect to multiple different networks, it is quite an elegant
method. We have seen smartphones
that can display a QR code for this
purpose.
Similar situations, where a microcontroller needs a small amount of
data for an initialisation or occasional
configuration, would be well-suited
to using a QR code. If an application
already requires an I2C bus, no extra
I/O pins are needed.
While the Reader hardware might
end up a bit more expensive than, say,
a small display and some buttons, it
could simplify the software if the QR
code data can be structured to avoid
the need to program a complicated
user interface.
In this regard, it has parallels to
the way we used the NFC chip in the
IR Remote Control Keyfob (February
2025; siliconchip.au/Article/17730).
The bottom of the PCB has an RP2040
processor, flash memory chip and
crystal oscillator. The white connector
is a JST header that’s compatible with
SparkFun’s Qwiic connector system.
The Tiny Code Reader
is compact and uncomplicated.
The top side shown here includes the
camera, while the small brownish
part is an RGB status LED.
In it, the NFC chip is used to provide a
one-off configuration of the codes that
the Keyfob is programmed to transmit.
We also found a YouTube video
about a robotics project that uses the
Tiny Code Reader to detect QR codes as
fiducial (location) markers and allow
the robot to know its position. The
robot’s work area is populated with
small QR codes that hold (x,y) coordinate pairs. The video is at https://
youtu.be/UL-vF4JaKqQ
The presenter of the video discusses his experiences implementing Tiny Code Reader in his project.
He also mentions the need to put an
LED on the robot to illuminate the
QR codes. Watching this video made
us think that access to some of the
Reader’s metadata might also be useful; unfortunately, there is no way to
access it.
Metadata is simply data relating to
other data. For a QR code reader, the
firmware would likely have access to
data about where the code is within
the camera’s field of view and how
many pixels it spans. This information
could be used to determine the code’s
position in space relative to the camera, which would be handy to know
in a robotics application.
Summary
We found the Tiny Code Reader to
be a straightforward device that was
easy to use and program. The lack of
a screen can make aiming the camera
a bit tricky, but the LED meant that it
was simple to confirm that a code had
been read.
It feels like a niche device, with
limited practical applications, but is
a fairly inexpensive unit for what it is
capable of doing.
The Tiny Code Reader is available
from Mouser (485-5744) and DigiKey
SC
(1528-5744-ND).
Raspberry Pi Pico W BackPack
The new Raspberry Pi Pico W provides WiFi functionality, adding
to the long list of features. This easy-to-build device includes a
3.5-inch touchscreen LCD and is programmable in BASIC, C or
MicroPython, making it a good general-purpose controller.
This kit comes with everything needed to build a Pico W BackPack module, including
components for the optional microSD card, IR receiver and stereo audio output.
$85 + Postage ∎ Complete Kit (SC6625)
siliconchip.com.au/Shop/20/6625
The circuit and assembly instructions were published in the January 2023 issue: siliconchip.au/Article/15616
|