aboutsummaryrefslogtreecommitdiff
path: root/docs/blog/01-kudzu.rst
blob: 5eb13391b640e87fd3880eb1ee259e13b919da0f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
.. _docs-blog-01-kudzu:

==========================
Pigweed Eng Blog #1: Kudzu
==========================
.. admonition:: A note from the Pigweed Eng Blog editors

   Welcome to the Pigweed Eng Blog! This is an informal blog where Pigweed
   teammates, contributors, and users can share ideas and projects related to
   Pigweed.

   Our first post comes from Erik Gilling, a software engineer on the
   Pigweed team. Today, Erik is going to tell you about Kudzu,
   "Pigweed's whimsical take on a development board"…

   Please note that **while Kudzu is open source, its hardware isn't publicly
   available**. Pigweed users may find the `Kudzu source
   code <https://pigweed.googlesource.com/pigweed/kudzu/+/refs/heads/main>`_
   to be a helpful example of a complex Pigweed integration.

.. card::
    :img-background: https://storage.googleapis.com/pigweed-media/kudzu-finished-photo-diagonal.jpg
    :link: https://storage.googleapis.com/pigweed-media/kudzu-finished-photo-diagonal.jpg
    :img-alt: A single Kudzu badge face-up on a table viewed at a diagonal.

----------------------------
It all started so innocently
----------------------------
The Pigweed team is taking a field trip to the
`Bay Area Maker Faire <https://makerfaire.com/bay-area/>`_ because
unsurprisingly, that's the kind of good time we're up for! While discussing
the plans at a team meeting I suggested: "We should make PCB badges that run
Pigweed and wear that to the Faire!" I've always wanted to make a PCB badge
and this seemed like the perfect opportunity to make a simple PCB that we could
do a little bit of hacking on.

--------
"Simple"
--------
The idea resonated with the team… perhaps too well. What started as
something simple in my head quickly started creeping features. Hence
the name `Kudzu <https://en.wikipedia.org/wiki/Kudzu>`_: a vine
considered invasive in many parts of the world. Pigweed's a weed.
Our RFCs are called "seeds". We're all about the plant puns…

Anyways, the conversation went something like this:

  "We should have some sort of sensor so it does something…"

  "How should we power it? Let's do LiPo charging…"

  "Let's add a display to highlight our recent
  :ref:`Display Support SEED <seed-0104>`!"

  "Touch screen?"

  "D-Pad and buttons?"

  "Speaker?"

  "Wireless?"

  "No!… but also yes…"

We quickly realized that what we wanted was more than a badge. We wanted a
showcase for Pigweed. We wanted a project we can point people at to show them
Pigweed running at it's best. And thus Kudzu was born. Part badge, part
development board, part handheld gaming system, and all Pigweed.

----------------
The laundry list
----------------
We settled on the following laundry list of features and components:

`RP2040 Microcontroller <https://www.raspberrypi.com/documentation/microcontrollers/rp2040.html>`_
  There's a lot to love about the RP2040: a reasonable amount of SRAM,
  support for large/cheap/execute-in-place external flash, a wicked cool
  programmable I/O block, and most importantly: easy and cheap to source!

`16 MB of Flash <https://www.winbond.com/resource-files/w25q128jv%20revf%2003272018%20plus.pdf>`_
  We're adding the maximum amount of flash that the RP2040 can support. This
  way we can pack as much awesome into the firmware as possible. Realistically
  16 MB is an embarrassingly large amount of space for an embedded project and I
  can't wait to see what cool stuff we fill it with!

USB-C Connector
  While we're not adding USB Power Delivery to the board, the USB C connector
  is robust and common. Many of us on the team are tired of digging micro
  (or even mini) USB cables out of our desk drawers to hook up brand new dev
  boards or JTAG programmers!

LiPo Battery with `charger <https://www.microchip.com/en-us/product/mcp73831>`_ and `fuel gauge <https://www.analog.com/en/products/max17048.html>`_
  Once we decided on a portable gaming form factor, we wanted to have a
  built-in, rechargeable battery. The battery is 900mA and is set to charge at 500mA
  from USB when the system is off and 250mA when the system is running. As an
  added bonus we threw in a fuel gauge chip. Partly because it's really nice to
  have an accurate view of the battery charge state and partly because it's
  a neat chip to write software for.

`3.2" IPS display with capacitive touch <https://www.buydisplay.com/3-2-inch-240x320-ips-tft-lcd-display-optl-capacitive-touchscreen-st7789>`_
  This display is 240x320 which presents two challenges. First, it's naturally
  portrait instead of landscape. We solve this by rotating the buffers once
  they're rendered. The second is that a single 16-bit x 320 x 240 frame buffer
  is ~150K which is over half of the 264K of SRAM in the RP2040. Instead, we're
  rendering at 160x120 and using the PIO module to `pixel double
  <https://github.com/32blit/32blit-sdk>`_ the buffer as we're sending it to the
  display. As an added bonus, the chunkier pixels gives Kudzu a nice retro feel.

Directional Pad and Buttons
  Here we're leaning on off-the-shelf buttons and silicone pads. Game
  controller design is a whole rabbit hole and we're going to rely on the
  collective wisdom of the retro modding community to give us nice-feeling
  controls.

`Six Axis IMU <https://invensense.tdk.com/products/motion-tracking/6-axis/icm-42670-p/>`_
  An IMU is a great general purpose peripheral to demonstrate Pigweed's HAL
  layer. Plus, there's all sorts of cool demos you can write with an IMU and
  a display.

`I2S Audio DAC/Amplifier <https://www.analog.com/media/en/technical-documentation/data-sheets/max98357a-max98357b.pdf>`_ and Speaker
  Chip tunes are best tunes. A couple of us on the team would love to
  port/write a tracker or FM synthesis engine.

Gameboy Advance Link Port
  As a simple way of hooking two devices together, we added link port. Again
  we're using an existing link port and cable to avoid reinventing to wheel.
  Plus, there's something awful nostalgic about that port!

... and `One More Thing <https://www.espressif.com/en/products/socs/esp32-c3>`_
  I kinda snuck an ESP32-C3 module onto the board at the last minute. Having
  wireless is something we wanted but didn't want to burden the initial design
  and bring up with it. My thinking is that we'll leave the module un-populated
  for now. My hope is that adding it to the board now may keep these boards from
  becoming landfill when we decide to tackle wireless.

--------------------------
Design, build, and rollout
--------------------------
I used `KiCad <https://www.kicad.org/>`_ to design the board. It's an open
source PCB design package that has been making incredible strides in
functionality and usability in the past few years. It comes with a high-quality
library of symbols and footprint which is supplemented by community-maintained
open source libraries.

.. card::
   :img-top: https://storage.googleapis.com/pigweed-media/kudzu-schematic.png
   :link: https://storage.googleapis.com/pigweed-media/kudzu-schematic.png
   :img-alt: A screenshot of Kudzu's schematic.
   :text-align: center

   Kudzu schematic

After some careful design review from the team and a few friends of Pigweed we
sent off the board to get fabbed and "patiently" waited for it to be delivered.

An EE at a previous company I worked at had a saying: "If you haven't found
three problems with your board, you're not done looking". The three problems
we found in order from least to most crushing are:

.. card::
   :img-top: https://storage.googleapis.com/pigweed-media/kudzu-display-connector.jpeg
   :link: https://storage.googleapis.com/pigweed-media/kudzu-display-connector.jpeg
   :img-alt: The reworked display connector with many bodge wires.
   :text-align: center

   The reworked display connector and the unpopulated footprint for the "one more thing"
   that "we'll get to eventually"

#. **The BOOT and RESET labels were reversed.** This led to some initial
   confusion on why the boards would not come up in bootloader mode.

#. **One of the FETs (Q3) had the wrong pinout.** This caused the power
   switch to be stuck on and the charge rate switching to not work.

#. **The pins on the display FPC connector were swapped.** This one was really
   crushing. The connector was fairly fine-pitched and 40 pins!

We were able to bring up the whole board including the display by rotating the
connector. Sadly the display would not fit in the 3D printed parts
we'd designed when plugged into the rotated connection. To validate our 3D
printed parts, I painstakingly reworked on-board to get the connector oriented
correctly. However, that was too much work and too fragile for all the boards.
We had to do a re-spin and Maker Faire was approaching quickly! Time to lather,
rinse, and repeat.

Fast forward to Monday night before Maker Faire. The boards come in and I spent
the evening preparing for a build party. On Tuesday, with some
`robotic help <https://www.opulo.io/>`_, we managed to build and test 8 boards
and get them in team members' hands on Wednesday.

.. card::
   :img-top: https://storage.googleapis.com/pigweed-media/kudzu-pnp.jpg
   :link: https://storage.googleapis.com/pigweed-media/kudzu-pnp.jpg
   :img-alt: A photo of the Opulo LumenPnP
   :text-align: center

   Our robotic help (Opulo LumenPnP)

Thankfully, because Pigweed is modular and portable, we were able to get our
software working on it quickly, freeing us to spend the next couple days hacking
together some simple fun demos for Maker Faire!

------
Photos
------
.. grid:: 1 1 2 2

   .. grid-item-card::
      :img-background: https://storage.googleapis.com/pigweed-media/kudzu-finished-photo-diagonal.jpg
      :link: https://storage.googleapis.com/pigweed-media/kudzu-finished-photo-diagonal.jpg
      :img-alt: A single Kudzu badge face-up on a table viewed at a diagonal.

   .. grid-item-card::
      :img-background: https://storage.googleapis.com/pigweed-media/kudzu-finished-photo-back.jpg
      :link: https://storage.googleapis.com/pigweed-media/kudzu-finished-photo-back.jpg
      :img-alt: A single Kudzu badge face-down on a table viewed at a diagonal.

.. grid:: 1 1 2 2

   .. grid-item-card::
      :img-background: https://storage.googleapis.com/pigweed-media/kudzu-finished-photo-top-down.jpg
      :link: https://storage.googleapis.com/pigweed-media/kudzu-finished-photo-top-down.jpg
      :img-alt: A single Kudzu badge face-up on a table viewed from above.

   .. grid-item-card::
      :img-background: https://storage.googleapis.com/pigweed-media/kudzu-finished-photo-front-standing.jpg
      :link: https://storage.googleapis.com/pigweed-media/kudzu-finished-photo-front-standing.jpg
      :img-alt: A single Kudzu badge standing up on a table viewed from the front.

.. card::
   :img-top: https://storage.googleapis.com/pigweed-media/kudzu-badges.jpg
   :link: https://storage.googleapis.com/pigweed-media/kudzu-badges.jpg
   :img-alt: A photo of 6 of the Kudzu badges
   :text-align: center

   Six Kudzu badges for Maker Faire 2023

----------
Learn more
----------
We don't have any plans to distribute hardware outside of our team but are
excited to publish the living project to serve as an example of how to build
firmware integrated with Pigweed. Over the coming months we'll be publishing
more functionality to the repository.

Head over to the `Kudzu repo <https://pigweed.googlesource.com/pigweed/kudzu>`_
where you'll find:

* KiCad PCB Design
* Example firmware demonstrating:
   * :ref:`module-pw_system` integration
   * :ref:`module-pw_rpc` and :ref:`module-pw_log` support
   * Use of Pigweed's :ref:`module-pw_digital_io`, :ref:`module-pw_i2c`,
     and :ref:`module-pw_spi` hardware abstraction layers

.. pigweed-live::