This is only a preview of the March 2022 issue of Silicon Chip. You can view 37 of the 112 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. Articles in this series:
Items relevant to "Capacitor Discharge Welder, part one":
Items relevant to "Raspberry Pi Pico BackPack":
Articles in this series:
Items relevant to "Amplifier Clipping Indicator":
Items relevant to "Dual Hybrid Power Supply, part two":
Items relevant to "A Gesture Recognition Module":
Articles in this series:
Purchase a printed copy of this issue for $11.50. |
By Tim Blythman
The Pico microcontroller board,
described in the December 2021
issue, is a versatile and powerful
ARM-based microcontroller on
a small board for less than $10.
There’s quite a lot you can do with
it on its own, but it’s even more
interesting when connected to an
LCD touchscreen.
Raspberry Pi
Pico BackPack
W
e reviewed the Raspberry Pi
Foundation’s Pico microcontroller board in the December 2021 issue
(siliconchip.com.au/Article/15125).
It’s based on their own RP2040 microcontroller and is quite different from
their popular line of Raspberry Pi
single-board computers (SBCs). However, it shares a resemblance in its low
price and ease of use.
In that article, we compared it to
other well-known microcontroller
boards and showed how it can be programmed in several different ways. It
can be programmed using a C language
compiler and SDK (software development kit) or via the Arduino IDE (integrated development environment),
with the option of using the Mbed OS
for ARM microcontrollers.
It’s also possible to program the Pico
using MicroPython, a variant of the
Python programming language optimised for use on embedded devices.
In the January 2022 issue, we also
described the PicoMite software that
allows the Pico to be programmed in
the BASIC language (siliconchip.com.
au/Article/15177). This makes it a
close relative to the Micromite, which
also runs MMBasic.
The Micromite pairs well with an
LCD touchscreen, so we decided to
create a matching BackPack for the Pi
siliconchip.com.au
Pico as well. The BackPack allows the
Pico to interface to an LCD touchscreen
and includes other useful hardware.
While several other companies have
designed boards around the RP2040
chip (including Arduino’s Nano Connect, with a WiFi module), our BackPack is designed to work with the original Pico board. We decided to concentrate on the Pico because it is low in
cost, compact and versatile.
Raspberry Pi Pico
Here’s a quick recap of the Pico. It’s
based around the Raspberry Pi Foundation’s RP2040 microcontroller and
has 264kB of internal RAM. Program
storage is on a separate 2MB flash chip.
The processor is a dual-core ARM
operating up to a nominal 133MHz but
it can usually be overclocked above
200MHz. The processor has 30 input/
output pins, although not all are broken out. For example, some are used
for flash memory access.
It supports USB host and device
operation. A ROM-based bootloader
provides a convenient USB drive interface for uploading firmware images.
Programming the Pico is as simple as
copying a file.
It has the usual peripherals, like
UART, SPI, I2C and PWM. There are
also two PIO peripheral modules.
Australia's electronics magazine
These are programmable I/O state
machines that you can use to create
more peripheral functions, or just
more of those we’ve just mentioned.
The Pico BackPack
We’ve created something similar to the Micromite BackPack V3
(August 2019; siliconchip.com.au/
Article/11764), adding some extra
features in the space that’s available.
Like the BackPack V3, it is designed
to work with both the 2.8in and 3.5in
LCD touchscreens.
Since we prefer to use the 3.5in display, as it has a much higher resolution and more area at a similar cost,
we’ll also show you how the Pico and
BackPack can be programmed to use
this display. Using the 2.8in screen
is possible (and is very easy to do in
PicoMite BASIC), but we will leave
that as an exercise for the reader.
We’ll present comprehensive example code for the PicoMite BASIC language, the C SDK, Arduino IDE and
MicroPython languages. However,
not all features are available in all
languages.
Circuit
Fig.1 is the circuit diagram for the
Pico BackPack. MOD1 is the Pico itself
and a 14-pin header is provided to
March 2022 35
connect the LCD touchscreen (CON4).
Since both the LCD and touch controllers on the panel use the SPI serial
interface, we have wired the header to
SPI-capable pins on the Pico.
The Pico’s I/O pins have two different numbering systems. All have a
physical number, which depends on
their location on the package. This is
the logical numbering that you would
use if you think of the Pico module like
an extra-wide 40-pin IC.
This numbering system includes
pins other than just those which can
be used as I/Os. For example, pins 3,
8, 13, 18, 23, 28, 33 and 38 are all connected to ground.
The RP2040 general-purpose I/O
pins also have a consecutive numbering scheme from GP0 to GP29,
although some are not connected to
pins 1-40. Most programming languages use the GP numbering system
(sometimes dropping the GP prefix),
although PicoMite BASIC allows you
to use either.
For the system SPI bus used to
Fig.1: the BackPack consists of a motley assortment
of components added to the Pi Pico to interface it to
the outside world. You can omit any or all of the IR
receiver, micro SD card, audio amplifier and RTC
sections if you just want a simple LCD touchscreen
breakout. Note that the 1kW resistor for the IR
receiver can typically be omitted; most IR receivers
have a very weak internal pull-up and can be
safely connected to the Pico’s 3.3V inputs.
36
Silicon Chip
Australia's electronics magazine
siliconchip.com.au
interface with the LCD panel, GP18
(pin 24) is the SPI clock (SCK), GP19
(pin 25) is MOSI and GP16 (pin 21)
is MISO. Note that the MISO signal
travels via JP2 to the LCD’s pin 9. This
jumper can usually be left off as data
does not need to be sent from the LCD
controller back to the Pico.
Other control pins include the LCD
controller’s CS (chip select), RST
(reset) and D/C (data/command) lines,
which map to GP12 (pin 16), GP13 (pin
17) and GP14 (pin 19) respectively.
The touch controller uses the same
main SPI lines as the LCD with its own
CS and IRQ lines: GP15 (pin 20) and
GP17 (pin 22), respectively.
GP20 (pin 26) is used to control the
LCD panel’s LED backlight if JP1 is in
place. If JP1 is absent, the 10kW resistor
pulls N-channel Mosfet Q2’s gate high,
which in turn pulls P-channel Mosfet
Q1’s gate low, continuously supplying
5V into the LED pin and keeping the
backlight on full permanently. The
same thing happens if GP20 is actively
pulled high; the LED pin receives 5V.
If GP20 is driven low and JP1 is in
place, the LCD backlight is switched
off, while a PWM signal from this
pin can produce a range of backlight
brightness levels.
Pushbutton switch S1 is connected
between the Pico’s 3V3_EN pin and
ground. The 3V3_EN pin connects to
the enable pin of the Pico’s onboard
3.3V regulator and is normally pulled
high by a 100kW resistor on the Pico.
When it is pulled low, the 3.3V supply
to the microcontroller is shut down.
Thus a brief press of S1 will reset the
microcontroller.
The RT6150 regulator fitted to the
Pico is a buck-boost type and can operate from an input voltage between 1.8V
and 5.5V. But be aware that the infrared receiver and LCD controller might
not work over that entire range. We
recommend supplying at least 3.3V to
the BackPack if you plan to use those
features.
Optional infrared receiver IRRX1
is fed from the board’s USB supply
(nominally 5V) via a 100W resistor
and bypassed by a 10μF capacitor.
The 5V output of IRRX1 is divided
by a 470W/1kW divider to 3.3V, and
this signal connects to GP22 (pin 29)
of the Pico.
Some IR receivers have an internal pull-down (open collector/drain)
transistor complemented by a weak
internal pull-up. In this case, the 1kW
siliconchip.com.au
The complete Pico BackPack
can have the Raspberry Pi Pico soldered
directly to the PCB, or mounted on headers.
resistor can be left out as the weak
pull-up, and the 470W series resistor
will limit current from the 5V rail into
the 3.3V microcontroller.
CON1 is a micro SD card socket
powered from the 3.3V rail and with
its SPI pins (SCK, MOSI and MISO)
connected to the same SPI pins as the
LCD touchscreen. Its CS (chip select)
pin connects to GP21 (pin 27) on the
Pico. The supply to the micro SD card
is bypassed by 100nF and 10μF capacitors for reliable operation.
IC1 is an optional DS3231 or
DS3231M real-time clock & calendar
IC with its own 100nF bypass capacitor to the 3.3V supply rail. It communicates with the micro via an I2C serial
bus, and the 4.7kW pull-up resistors to
the 3.3V rail required for I2C communication are also provided. The I2C SDA
and SCL (data and clock) signals connect to the Pico’s GP10 (pin 14) and
GP11 (pin 15).
A cell holder (BAT1) is also provided to allow the RTCC to keep time
when the main power supply is off.
20-pin header CON2 breaks out
some of the Pico’s spare pins. These
include 17 GPIO pins that are otherwise unused or can be shared with
devices on the BackPack.
The GND, 3.3V and VSYS (VIN) pins
on the Pico also connect to this header.
The GND and VSYS pins can be used
to power the BackPack or feed power
from the BackPack to other parts, while
the 3.3V pins should be considered an
output only.
The circuitry around IC2 is intended
to convert a pair of PWM signals from
Australia's electronics magazine
GP8 (pin 11) and GP9 (pin 12) into stereo line-level signals at CON3.
While we could have fitted an I2S
DAC IC instead for higher audio quality, the PicoMite can play audio via
PWM natively, and it’s pretty easy to
implement this in other languages (as
we have done in some of our sample
code). The PWM implementation also
costs much less.
Each PWM signal is treated the
same. A low-pass and biasing network formed from the 22kW, 47kW
and 100kW resistors shifts the 0V to
3.3V signal to around 0.9-2.9V. The
1nF capacitor also removes high-
frequency PWM artifacts, with a -3dB
point around 13kHz.
IC2 is a dual op amp fed from the
5V rail with both of its channels configured for unity gain, so it produces a
2V peak-to-peak signal (around 700mV
RMS) with a DC offset of 1.9V. The
10μF capacitor and 100kW bias resistor
remove the DC offset, with the 100W
resistor protecting the op amp from
short circuits on the output.
The audio output is available at
CON3, with the centre pin being
ground. The signal here is suitable for
driving headphones, a small speaker
or an amplifier.
PCB features
The Pico BackPack PCB is sized
to match the 3.5in LCD touchscreen.
Header CON4 at one end connects to
the LCD touchscreen while CON2,
along one edge, provides connections
to a breadboard or other hardware (eg,
a ‘daughterboard’).
March 2022 37
The Pico mounts opposite the LCD
header, allowing its micro-USB socket
to be accessible from the edge of the
PCB (avoiding the need for us to fit a
separate USB socket). To match the
Pico itself, we’ve provided pads to
mount it on headers or to solder it
directly to the PCB, as though it were
a surface-mounting component.
The latter is preferred for permanent
installations, as using headers would
require extended headers on the LCD
panel to provide clearance below. A
third option is to fit the Pico with
female headers above and male headers below the Pico BackPack, bypassing the clearance issue.
Our parts list assumes the direct
mounting method. If you wish to use
headers, you will need two extra pairs
of 20-pin, 2.54mm pitch male and
female header strips.
You can use the Pico’s onboard
bootloader pushbutton (adjacent to its
micro-USB socket) along with S1 to
enter bootloader mode. The sequence
is to hold down the bootloader button, press and release S1, then release
the bootloader button. S1 removes the
need to plug and unplug the Pico for
programming, which would otherwise cause wear to its USB socket (or
your PC’s).
With the LCD header on the right,
the micro SD socket and IR receiver
sit at the top for ease of access. The
body of the IR receiver can be bent
backwards to allow the lens to face the
same direction as the screen.
Optional sections
The photos and overlay diagram
show that the PCB is divided by lines
into sections corresponding to each
hardware feature. This allows you
to fit or not fit the various features as
needed.
The PCB silkscreen also has the pin
information printed along its bottom
half. The default SPI pins for the LCD,
touch and micro SD card are described
on the left-hand side, while each pin
of CON2 is also marked with its corresponding Pico pin connection.
With all the features fitted, you have
eleven spare I/O pins: GP0 to GP7 and
GP26 to GP28, although the I2C pins
GP10 and GP11 can also be shared
with other I2C devices. GP26 to GP28
are the only externally-available pins
that can be used as analog inputs.
Deleting the audio section frees up
GP8 and GP9, while not using the LCD
38
Silicon Chip
Fig.2: the lines on the PCB mark the regions and components that
correspond to the optional features. From the left, the IR receiver,
audio amplifier and micro SD card socket sit along the top of the PCB,
providing external access. The RTCC is at the lower right. If fitting the RTC
components, don’t forget the battery holder on the rear of the PCB.
backlight control pin frees up GP20.
With only the LCD touchscreen fitted,
you can have up to 17 free I/O pins.
With this in mind, you can plan
what onboard and offboard circuitry
will be needed for your Pico BackPack,
allowing you to decide what parts you
do and don’t need to fit.
Our demo code is focused on the
BackPack’s features and does not
require any external parts beyond the
LCD touchscreen and a speaker connected to CON3.
Construction
We’ll describe the construction as
though all parts are fitted. You can
skip any that you don’t want to install.
As most of the onboard parts are
SMDs to save space, you will need
flux paste and a magnifier as well as
a soldering iron. We also recommend
that you have some solder wicking
braid and a suitable cleaning solvent
for your flux.
Since flux can generate harmful
smoke, fume extraction is a good idea.
Australia's electronics magazine
If you don’t have any fume extraction,
work outside or near an open window.
This may also help with providing
good illumination.
The Pico BackPack is built on a
99 x 55mm double-sided PCB coded
07101221. Refer to the overlay diagram, Fig.2, during construction.
Start by fitting the micro SD card
socket, CON1. Apply flux to the pins
and rest the socket in place. It has
locating posts, so it is easy to align.
Add some more flux to the top of the
pins too.
Clean the tip of the iron, add a small
amount of fresh solder and apply it
to the socket’s pins, taking care not to
contact the metal shell of the socket.
If you are happy with the pin soldering, solder the mechanical tabs too. If
there are any bridges, use solder braid
to remove them by adding some more
flux, cleaning the iron’s tip and pressing the braid against the bridge with
the iron. Carefully slide both away
together once the wick has soaked up
the excess solder.
siliconchip.com.au
Parts List – Pico BackPack
1 double-sided PCB coded 07101221, 99 x 55mm
1 Raspberry Pi Pico Module (MOD1) [Altronics Z6421, Digi-Key, Mouser,
Core Electronics]
1 3.5in LCD touchscreen [Silicon Chip Shop Cat SC5062]
1 14-pin, 2.54mm pitch socket header (for LCD panel)
1 20-pin, 2.54mm pitch pin header (CON2)
2 2-pin, 2.54mm pitch pin headers with jumper shunts (JP1, JP2)
1 6mm x 6mm tactile switch (S1)
8 M3 x 6mm panhead machine screws
4 M3 x 12mm tapped spacers
Semiconductors
1 IRLML2244TRPBF/SSM3J372R P-channel Mosfet, SOT-23 (Q1)
1 2N7002 N-channel Mosfet, SOT-23 (Q2)
Resistors (all M3216/1206, 1%, ⅛W)
1 10kW
1 1kW
Optional Components
Kit (SC6075) – $80
Includes all parts listed here, plus
optional parts, except the DS3231
IC (available separately).
SD card
1 SMD micro SD card socket (CON1) [Altronics P5717]
1 10μF 10V X7R SMD ceramic capacitor, M3216/1206 size
1 100nF 10V X7R SMD ceramic capacitor, M3216/1206 size
Real time clock/calendar
1 surface-mounting CR2032 cell holder (BAT1) [BAT-HLD-001]
1 DS3231 or DS3231M in SOIC-16 (wide) or SOIC-8 package (IC1)
1 100nF 10V X7R SMD ceramic capacitor, M3216/1206 size
2 4.7kW 1% ⅛W M3216/1206 size
IR receiver
1 3-pin infrared receiver (IRRX1)
1 10μF 10V X5R SMD ceramic capacitor, M3216/1206 size
1 1kW 1% ⅛W resistor M3216/1206 size
1 470W 1% ⅛W resistor M3216/1206 size
1 100W 1% ⅛W resistor M3216/1206 size
Stereo audio
1 MCP6272(T)-E/SN, MCP6002(T)-I/SN or -E/SN dual op amp, SOIC-8 (IC2)
1 3-pin, 2.54mm pitch pin header (CON3; see text for other options)
2 1nF 25V X7R SMD ceramic capacitors, M3216/1206 size
2 100nF 10V X7R SMD ceramic capacitors, M3216/1206 size
2 10uF 10V X5R SMD ceramic capacitors, M3216/1206 size
4 100kW 1% ⅛W resistor M3216/1206 size
2 47kW 1% ⅛W resistor M3216/1206 size
2 22kW 1% ⅛W resistor M3216/1206 size
2 10kW 1% ⅛W resistor M3216/1206 size
2 100W 1% ⅛W resistor M3216/1206 size
Next, fit the two ICs. There are variants of IC1 in both 16-pin and 8-pin
packages. The SOIC-16 part uses all
the pads, while the narrower SOIC-8
part will use the lower eight extended
pads. Regardless, IC1’s pin 1 is at the
lower right.
If you can’t make out a pin 1 marking
on IC1’s case, look for a bevel along one
edge. This will be the edge with pin 1.
IC2’s pin 1 goes to the upper left.
For the ICs, apply flux, rest the part in
place, aiming to align it squarely and
symmetrically.
siliconchip.com.au
Add more flux to the tops of the
pins and clean the iron tip. Add some
solder and tack one pin in place. Confirm that the part is flat against the PCB
and still positioned correctly; if not,
reapply heat and nudge the part into
alignment.
Solder the remaining pins and only
then remove any bridges if necessary.
For transistors Q1 and Q2, use a
similar process as the ICs. The SOT23 parts are small but easy enough to
solder, as long as you don’t lose them.
Move onto the capacitors next. We
Australia's electronics magazine
recommend working with one value
at a time, as they will probably be
unmarked. The procedure for passives
is much the same as ICs: tack one lead
and confirm that the parts are flat,
square and centred, then solder the
other lead. Refresh the first joint with
some flux and a touch of the iron if it
doesn’t look glossy.
Fit the four 10μF capacitors in the
positions shown in Fig.2, then follow
with the four 100nF parts and the two
1nF capacitors in the audio section.
Now move on to the resistors. Match
up the part codes with those given in
our parts list and the PCB silkscreen
markings. You can use our SMD Test
Tweezers (October 2021; siliconchip.
com.au/Article/15057) to measure and
place these parts.
With most of the SMDs fitted, it is
a good time to clean the board of flux.
While the Pico and cell holder are
surface mounting, they will not need
much flux, if any. Remember to allow
any solvent to evaporate fully before
continuing.
If you have 2mm machine screws,
you can use these to align the Pico
(MOD1) with the holes in the PCB.
Remember that the USB socket hangs
off the edge of the board. If you don’t
have screws, tack one or two of the
module’s pads in place instead.
The pads are large enough that you
can apply solder directly after heating
the pad with the iron. Work around the
edge of the part, applying the iron and
solder to the point where the Pico’s
outermost half-holes meet the PCB.
If you prefer to use detachable headers, use the innermost row of holes on
the Pico and PCB. Once the Pico is soldered, you can remove any screws; the
40 solder joints should keep it secure.
Flip the PCB over to attach the cell
holder BAT1. The opening should face
the edge of the PCB. Rest the holder
in place, tack one lead down, solder
the other lead, then refresh the first.
Now snap S1 in place, ensuring it
is flat against the PCB, then solder all
its pins.
Consider how you plan to use the
IR receiver and whether it needs to be
bent up to receive a signal from the
desired direction. If you are unsure,
sit it up from the PCB slightly so that
there is room to change this later. You
could even mount it on the reverse of
the PCB, as long as the pins go to the
same pads.
The only parts left are the headers
March 2022 39
and jumpers. Depending on your
plans, either of the jumper headers
could be left off or replaced with wire
loops as a permanent jumper.
To run our example code, fit both
jumper headers, but place the shunt
for JP1 (LCD Backlight) on and leave
the shunt for JP2 (LCD MISO) off. You
can pre-fit the shunt to the header to
help you hold it in position while soldering the first pin.
Now add CON3 in the audio section.
It’s designed for jumper wires to take
these signals where they are needed.
You could solder wires directly to
these pins if desired. Depending on
your application, you might find that
fitting right-angled headers will work
better, and there is also the option of
fitting the headers to the underside of
the PCB if required, which is what we
did for our prototypes.
To ensure that the headers between
the LCD panel and main PCB are fitted
squarely, you can assemble the stack
using the machine screws and tapped
spacers, as seen in our photos.
Note that the four-pin header on the
LCD (for its onboard SD card socket)
should not be populated, as this will
foul the USB socket on the Pico. Fit
the female header to the male header
on the LCD panel and assemble the
stack. Then solder the female header
in place and separate the stack.
The last piece is the 20-pin I/O
header, CON2. If you wish to use the
Pico BackPack with a breadboard, fit
this underneath the PCB. Alternatively, use right-angle headers to bring
these connections out the side. Or you
can even leave it off for now, as none
of our examples need any external connections. You can always add it later.
Reattach the LCD panel to the
BackPack and secure it by screwing
the machine screws into the tapped
spacers.
Testing
Before diving in, you might like to
quickly test that everything is working
as expected with your BackPack. For
this, you can simply upload our compiled “BackPackTest.UF2” file.
Put the Pico into bootloader mode
by holding the bootloader button (on
the Pico) while resetting it (by pressing S1) or powering it up. Then copy
the UF2 file onto the RPI-RP2 disk
that appears. The demo should start
as soon as the file finishes copying –
see Screen 1.
This example uses PicoMite BASIC,
so you can also use this file as a starting point for your own BASIC program;
simply use Ctrl-C on a serial terminal
to stop the running program.
The demonstration programs all
provide buttons for interaction and
let you use the touchscreen to draw
on the LCD screen.
PicoMite BASIC demo
With PicoMite BASIC having native
support for the ILI9488 driver on the
3.5in LCD touchscreen, only a few
commands are needed to set everything up, if you prefer to do this manually. You’ll need a serial terminal
program such as TeraTerm or MMEdit
(on Windows) or minicom (on Linux).
If you haven’t already done so, load
PicoMite BASIC onto the Pico by
Screen 1: feature-wise, the PicoMite is about on par with
a Micromite Plus, although it has fewer pins, more flash
memory and more RAM. The demo program allows
drawing on the display and playing tones on button
presses. It can also decode IR signals that are received.
40
Silicon Chip
entering bootloader mode and copying
the PicoMite UF2 file. Find the serial
port of the Pico and open it with the
terminal program. As it is a virtual
serial port, no baud rate needs to be set.
The following options will configure the PicoMite to use the BackPack
hardware, including the LCD, touchscreen, micro SD card socket, I2C for
the RTCC, audio and the GUI controls
that are used in our demo:
OPTION SYSTEM SPI
GP18,GP19,GP16
OPTION SDCARD GP21
OPTION LCDPANEL ILI9488,
LANDSCAPE,GP14,GP13,GP12
OPTION TOUCH GP15,GP17
GUI CALIBRATE
OPTION SYSTEM I2C GP10, GP11
OPTION AUDIO GP8, GP9
OPTION GUI CONTROLS 20
Note that the PicoMite resets every
time an option is set, dropping the
serial connection; we like how Tera
Term reconnects automatically after a
reset as this makes issuing a string of
such commands easier.
After doing this, you can load our
example code. To do this via the terminal, enter the “AUTOSAVE” command and paste the BASIC program
into the terminal. The supplied file
ends with an ASCII code 26 (0x1A)
character, which BASIC interprets as
a Ctrl-Z keypress signifying the end of
the file. Then type “RUN” followed by
Enter to start the demo.
After this, the Pico is in much the
same state as if loaded with our example UF2 file, although possibly with
more accurate touchscreen calibration.
Screen 2: even though we wrote the display driver in
MicroPython, it is still very responsive. MicroPython
also provides a file system for the flash storage and has
numerous libraries for hardware interfacing.
Australia's electronics magazine
siliconchip.com.au
We recommend having a read
through the PicoMite manual to learn
the minor differences from the Micromite. However, most of the differences that we came across are in the
OPTIONs described above.
MicroPython demo
MicroPython has some parallels
with BASIC in that it features an interactive prompt, allowing commands
and programs to be easily tested.
MicroPython has been ported to several other 32-bit microcontrollers such
as the ESP32. If you’d like to find out
more, see https://micropython.org/
It is open-source, and you can find
the source code at https://github.com/
micropython/micropython but we’ve
also included a copy of the version
1.17 UF2 file that we used to develop
our examples.
Typically, you will need an IDE to
manage the code files, although it is
possible to get by with a serial terminal program. We used “Thonny” as
our Python IDE, as it appears in recent
Raspberry Pi OS distributions and is
also available on Windows.
You can load the “BackPack MicroPython Example.UF2” file directly via
bootloader mode. This is the easiest
method if you don’t have a Python IDE
installed. As with the PicoMite BASIC
example, you can interrupt code
loaded via the bootloader and interact with it through a serial terminal.
Otherwise, follow the steps below
to view and work with the source files
separately.
We are using MicroPython for Pico
version 1.17. To load our example
manually, first load the MicroPython
UF2 file onto the Pico, then use your
IDE to copy the “ILI9488LIB.py” and
“LSNBFONT.py” files to a “lib” folder
on the Pico’s internal storage. The way
this is done will vary depending on
the IDE you’re using.
These two modules constitute the
driver and font that are used in our
software, and keep the main program
file legible and to a manageable size.
Now load the “main.py” file and
run it. If all is well, you should see the
screen initialise – see Screen 2.
Unlike PicoMite BASIC, we had
to implement the display driver in
Python. While this makes it noticeably
slower than BASIC’s integrated driver,
it is certainly fast enough to be usable.
We haven’t delved into creating
libraries for the micro SD card, RTCC
siliconchip.com.au
The rear of the Pico
BackPack has the coin cell holder
and possibly also some of the headers.
or IR receiver as there are numerous
publicly available libraries for these
features.
Do not insert a micro SD card unless
you have already installed a library to
initialise it correctly. Otherwise, it will
interfere with the SPI bus operation of
the LCD and touch controllers.
Arduino demo
We used a board variant based on
the C SDK for our Arduino software,
which simplified developing software for the C SDK by itself. This is
the board variant we mentioned in the
Pi Pico Review (https://github.com/
earlephilhower/arduino-pico).
To add this variant to the Arduino IDE, add the text “https://github.
com/earlephilhower/arduino-pico/
releases/download/global/package_
rp2040_index.json” to the list of Board
Manager URLs under Arduino Preferences.
Next, install the “Raspberry Pi
Pico/RP2040” option from the Boards
Manager by selecting it and clicking
“Install” (as shown in Screen 3).
Our example code just needs one
example library; search for “rtclib”
in the Library Manager and install
the version provided by Adafruit. It
can also be downloaded and installed
manually from https://github.com/
adafruit/RTClib
The SD card library included with
the Arduino IDE is used by our code.
We’ve also written simple drivers
for the LCD touchscreen (including
backlight PWM) and audio output.
The files for these are included in our
sample code.
Unfortunately, it appears there
are no readily-available IR receiver
Screen 3: we’re using a custom board profile for the Pico under the Arduino
IDE. It can be installed easily, and because it is based on the C SDK, it supports
using C SDK functions in projects. It’s the bottom-most item in the screenshot
seen here (highlighted in red).
Australia's electronics magazine
March 2022 41
libraries for the Pico under Arduino
yet. We previously used the Arduino IRremote library (https://github.
com/Arduino-IRremote/Arduino-IRremote) and expect that it won’t be
long before someone ports this over
to the Pico.
The Arduino demo allows drawing
on the LCD by use of the touchscreen
– see Screen 4. It reads the SD card and
displays the first file found; pressing
the “Files” button on the screen will
look for additional files and show
their name.
The backlight brightness can be
adjusted by the slider at the bottom
of the screen. The time found on the
RTC chip is displayed. There is sample code in the RTClib library to set
the time in the DS3231 chip if that has
not been done already.
Sounds are played every time a button is pressed or released; you will
need a speaker or headphones connected to hear them. The sounds are
sinewaves defined in the “sounds.c”
file.
C SDK demo
We found it was a bit trickier to get
the C SDK working on its own. While
our previous article about programming the Pico discussed doing this
under Windows, we found that many
of the required tasks were easier in the
Raspberry Pi OS.
So if you have a Raspberry Pi, we
recommend using it to compile projects for the Pico, especially if you want
to work in C. The documentation is
written with this in mind, so it makes
sense. While a Raspberry Pi is a bit
slower than a modern Windows PC,
we saved time overall because things
seemed to work more often the first
time around.
You can load our demo firmware
file by putting the Pico into bootloader
mode and copying the UF2 file to the
RPI-RP2 drive.
It should show the LCD and touchscreen working – see Screen 5. You can
draw on the LCD by using the touchscreen. The backlight can be cycled
between several brightness levels by
the LIGHT button and a sound is produced every time a button is pressed
or released.
We haven’t found any libraries for
SD cards, IR receivers or real-time
clock modules to suit the C SDK, so we
have not implemented these features.
Still, we expect that the rapidly growing community around the Pico could
see these developed sooner or later.
One advantage of using C is that the
LCD is updated very quickly using
the native SPI interface. That could
be handy for projects that need rapid
screen updates.
Using the C SDK files
It is not easy to create a portable project, even with the Project Generator
program. Still, the following method
should allow you to build your own
projects from our example code.
Use the Project Generator to create a
project, being sure to check at least the
SPI peripheral option. The Pico review
Screen 4: our Arduino demo is one of the more
comprehensive tests of the Pico BackPack’s features,
primarily due to the extensive open-source libraries that
are available. You can test the LCD and touchscreen
by drawing on the screen, and if you have a speaker
connected, it will emit tones when a button is pressed.
42
Silicon Chip
article from December shows the Windows version of the Project Generator.
We also like to enable the USB console and disable the UART console if
we aren’t using the USB peripheral for
anything else. This makes it easier to
send debugging information directly to
a virtual USB serial port and frees up
the I/O pins that would otherwise be
used for the hardware console.
After the project is generated, there
will be a .c file in the project folder;
it will have the same name as the
project you just generated. Copy the
contents of the main.c file (from our
example) over the contents of this .c
file, replacing the boilerplate code that
the generator has created. Then copy
the remaining .c and .h files from our
example folder.
There will also be a CmakeLists.txt
file in the project folder. Open it and
find a line like this:
target_link_libraries(LCD_TEST
pico_stdlib)
The first item will be the project
name. Add a reference to “hardware_
pwm”:
target_link_libraries(LCD_TEST
pico_stdlib hardware_pwm)
Then save the file.
Switch to the “build” subdirectory
and run “nmake” on Windows or
“make” on Linux (including Raspberry
Pi OS). If all goes well, the compilation
will proceed, and it will create the UF2
file in the build subdirectory. This is
the firmware image you can transfer
Screen 5: the C SDK is trickier to work with than the
Arduino IDE or PicoMite BASIC, but it allows for highperformance operation of the Pico if needed. We found it
was easily the fastest of the lot when updating the display.
Our demo shows off the LCD, touchscreen, backlight
control as well as sounding tones when the buttons are
pressed.
Australia's electronics magazine
siliconchip.com.au
Screen 6: the 2MB of flash memory
on the Pico is generous, and flash file
systems like LittleFS are a great way
to make use of it. The Arduino IDE
even provides a tool for uploading
files to the file system via the serial
port (“Pico LittleFS Data Upload”).
The amount of flash memory set aside
for the file system is configurable.
to the Pico to run your new program.
Using the C SDK is quite different
to Arduino, BASIC or MicroPython,
but it appears that many questions
are being asked and answered on the
Raspberry Pi forums.
There is a Pico C SDK section of
the forum at siliconchip.com.au/link/
abc1 and a list of community provided libraries at siliconchip.com.au/
link/abc2
With the Pico being so cheap and
already having broad community support for several languages, as well as
official (Raspberry Pi Foundation) support for the C SDK and MicroPython,
we expect that what is possible will
expand quite rapidly.
More features
There are a couple of extra features
on the Pico that we should mention,
mainly because they are reasonably
novel or interesting.
The USB peripheral is not easily
usable from PicoMite BASIC or MicroPython. However, the Arduino IDE
provides examples to allow the Pico to
act as a CDC (serial) device, HID device
like keyboard or mouse, mass storage
and even a MIDI interface.
Being small, the Pico is ideal for
turning into a small USB widget with
a dedicated function. Having a dualcore processor also opens up other
possibilities, such as real-time monitoring and control.
Dual cores
The RP2040 on the Pico has two
ARM processor cores and these can
be used in a few different ways. The
Arduino IDE & C SDK provide means
of running programs on both cores.
Sharing memory between two processors is not always trivial, but it is
not too tricky with the Pico. Still, you
need to ensure that one core isn’t trying to access flash memory that the
other core is erasing, or you’ll crash it!
The Arduino IDE provides simple
setup1() and loop1() functions to allow
a second parallel process to start up,
while the C SDK provides some lowlevel interfaces to control this.
MicroPython can use threads to
run tasks concurrently using the
dual cores, but the dual cores are not
exposed at all in PicoMite BASIC.
Storing data in flash memory
The large, external flash chip on the
Pico also means that there is ample
siliconchip.com.au
onboard storage for large amounts of
data. This could be graphics, sounds
or lookup tables. It can be accessed as
constants from within your program,
but some languages provide ways of
treating the flash memory more like a
file system.
Another thing worth noting is that
the 2MB of flash available on the Pico
is pretty generous for a microcontroller. Like the ESP8266 and ESP32, there
are options to use some of this flash for
storage on the Pico in some of these
programming environments.
While the removable micro SD card
makes it easier to update data by simply popping it out and connecting it to
a computer, keep the internal storage
in mind if you need a small amount
of non-volatile storage.
MicroPython makes native use of
this to store files; it’s how our two
library files and the main.py file are
stored in our earlier example. The IDE
you use should have a way to read and
modify the internal storage. There are
also methods available to read and
write these files from within the MicroPython language.
The Arduino board profile we used
earlier supports the LittleFS file system. You can add a separate tool to the
Tools menu to manage uploading files
to the flash, and different program and
storage profiles can be set to share the
available space.
The Pico LittleFS Data Upload is
available (after being added) in the
Tools menu along with several different memory partitions – see Screen
6. Files to be added are placed into a
“data” folder in the sketch folder and
uploaded from there.
Australia's electronics magazine
There are example sketches under
the Examples → Examples for Raspberry Pi Pico → LittleFS menu; the
“FSUpload” example has a link to the
upload tool too.
The C SDK provides low-level routines for writing directly to flash memory, which can be handy if you know
what you are doing, but disastrous if
you do not. You might overwrite your
program! Or perhaps worse, perform
too many writes and wear out the flash.
Still, this can be handy if all you
need is a large block of non-volatile
storage to store data without needing
file type access.
PicoMite BASIC has ten flash memory slots for programs to be stored and
the VAR SAVE feature sets aside 16kB
for user data to be stored and accessed
by a BASIC program.
Conclusion
With four different ways of being
programmed, a generous amount of
RAM and flash, the Pico microcontroller board is bound to be used in a
variety of projects. And it’s inexpensive to boot.
Combined with our Pico BackPack,
we can see this combination being versatile enough to become the core of
many different projects in much the
same way that the Micromite Backpack did.
It’s easy to work with the Pico and
the Pico BackPack using either the
Arduino IDE or PicoMite BASIC. We
would not be surprised if a Pico BackPack programmed in one of these languages found a way into future Silicon
Chip projects. In fact, we’re already
planning more than one...
SC
March 2022 43
|