diff options
Diffstat (limited to 'content')
-rw-r--r-- | content/posts/2022-11-11-pico-ws.md | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/content/posts/2022-11-11-pico-ws.md b/content/posts/2022-11-11-pico-ws.md new file mode 100644 index 0000000..4fb66dd --- /dev/null +++ b/content/posts/2022-11-11-pico-ws.md @@ -0,0 +1,249 @@ +--- +slug: pico-ws +title: "Pico Ws" +date: "2022-11-11T05:30:53-04:00" + +pics: + reel: + css: "image" + tip: "Reel of Raspberry Pi Pico Ws." + sources: + - src: "/files/posts/pico-ws/pico-w-reel.jpg" + width: 1024 + height: 768 + single: + css: "image" + tip: "Individual Pico W." + sources: + - src: "/files/posts/pico-ws/pico-w-single.jpg" + width: 1024 + height: 768 + testing: + css: "image" + tip: "Advanced Pico W testing facility." + sources: + - src: "/files/posts/pico-ws/pico-w-testing.jpg" + width: 1024 + height: 768 +--- +Last month I got a reel of [Raspberry Pi Pico Ws][pico-w]. Several +will eventually be paired with [BME280s][bme280] and used to measure +temperature, humidity, and barometric pressure throughout the house. + +That project will have to wait a few weeks until I can unpack my +soldering iron. + +In the mean time I've been fiddling [MicroPython][]. My thoughts so far +are below... + +### Ordering and Delivery + +Ordering was a bit of a headache. The sites that I normally buy +from all had one or more of the following annoyances: + +* Ridiculous markup +* Outrageous shipping fees +* Comically low quantity limit + +The [Pico][] and [Pico W][pico-w] are not supply chain constrained like +the [Raspberry Pi 4B][pi-4b] and [Raspberry Pi Zero 2 W][pi-zero-2-w], +so I'm not sure why retailers are doing this. + +I finally checked [DigiKey][], and they had plenty of [Pico Ws][pico-w] +in stock and none of the aforementioned shenanigans. I ordered a reel +of 20 [Pico Ws][pico-w] for $6.00 apiece on October 3rd. The package +arrived on October 5th. + +As of this writing, [DigiKey][] still has [over 15,000 Pico Ws in +stock][stock]. + +### Hardware + +Thoughts: + +* 264 kB of RAM feels quite roomy on a microcontroller. +* Built-in [wifi][] is incredibly useful because you don't have to + sacrifice a bunch of pins for external communication. +* PIO looks promising, although I haven't really used it yet. +* The onboard temperature sensor is not very accurate. + +### Flashing [MicroPython][] + +Flashing via [USB mass storage][] is great. I didn't have to install an +[SDK][], fight with finicky wiring, or use an obscure microcontroller +flashing tool. + +To get up and running with [MicroPython][], you can follow [these +instructions][flash-instructions]. The basic steps in [Linux][] are as +follows: + +1. Press the BOOTSEL button on the [Pico W][pico-w]. +2. Connect the [Pico W][pico-w] to your computer via [USB][]. It +appears as [USB mass storage][] device. +3. Mount the mass storage device. Many distributions will automatically +mount the device for you as `/media/RPI-RP2`. +4. Copy a [UF2][] image to the mounted disk. +5. The [Pico W][pico-w] will flash itself and reboot. + +If you've flashed [MicroPython][], then at this point you can connect to +a [REPL][] via [USB][] serial (e.g. `screen /dev/ttyACM0`). + +The [Pico][] and [Pico W][pico-w] have [SWD][] pins, so you can still +flash via [SWD][] if you want to; instructions are available in the +[documentation][]. + +### MicroPython + +[MicroPython][] is fantastic. I was able to blink the onboard [LED][], +read the onboard temperature sensor, connect to [wifi][], and make web +requests less than an hour after unpacking the [Pico W][pico-w]. + +#### Example: Blink [LED][] + +```python +MicroPython v1.19.1 on 2022-10-06; Raspberry Pi Pico W with RP2040 +Type "help()" for more information. +>>> led = machine.Pin('LED', machine.Pin.OUT) # get LED +>>> led.toggle() # enable LED +>>> led.value() # check status +1 +>>> led.toggle() # disable LED +>>> led.value() # check status +0 +>>> +``` + + +#### Example: Connect to [Wifi][] and send an [HTTP][] request + +```python +MicroPython v1.19.1 on 2022-10-06; Raspberry Pi Pico W with RP2040 +Type "help()" for more information. +>>> import network +>>> wifi = network.WLAN() +>>> wifi.active(True) # enable wifi +>>> wifi.connect('ssid', 'password') # replace 'ssid' and 'password' with your SSID and password +>>> wifi.status() # wait until wifi is connected (e.g., status = 3) +3 +>>> import urequests +>>> data = urequests.get('https://pablotron.org/').content # send http request, get response body +>>> len(data) # print number of bytes received +48693 +``` + + +One useful tip: `machine.unique_id()` returns a unique ID for the +device. This is useful because it allows you to flash the same image to +several [Pico Ws][pico-w] and then use `machine.unique_id()` to uniquely +identify them. Example: + +```python +>>> import binascii +>>> binascii.hexlify(machine.unique_id()) +b'e6614c311b867937' +``` + + +Miscellaneous [MicroPython][] notes: + +* Many of the libraries in the [MicroPython standard library][] are + reasonable subsets of their counterparts from the + [Python standard library][]. +* [MicroPython][] does not have [Pip][] or [PyPI][]. Instead you + install packages via [mip][]. I used it [mip][] install and use the + [MQTT][] library. +* You can build a Unix version of [MicroPython][] by following the + [instructions in the `ports/unix` directory][build-unix] of the + [MicroPython Git repository][]. +* You can exhaust the RAM fairly easily by trying to fetch web content + which is larger than the available RAM. Not that I would make such a + silly mistake... + +### Pictures + +{{< pe-figure "reel" >}} +{{< pe-figure "single" >}} +{{< pe-figure "testing" >}} + +Description of the last picture: + +* Foreground: [Pico W][pico-w] connected via [USB][] to a + [Raspberry Pi 4B (4GB)][pi-4b], sitting in a delivery container. The + [Pi 4B][pi-4b] is used for miscellaneous `aarch64` testing like the + [hash benchmarks from June][hash]. +* Background: [Raspberry Pi 3B][pi-3b] in a proper case with a + [BME280][] soldered to it to the [I²C][i2c] pins. The [Pi 3B][pi-3b] + is the bedroom [HTPC][] (running [Kodi][]) and temperature monitor. + +[pico]: https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html + "Raspberry Pi Pico" +[pico-w]: https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html + "Raspberry Pi Pico W" +[bme280]: https://www.bosch-sensortec.com/products/environmental-sensors/humidity-sensors-bme280/ + "BME280 temperature, pressure, and humidity sensor." +[i2c]: https://en.wikipedia.org/wiki/I%C2%B2C + "I²C microcontroller serial communication bus" +[micropython]: https://micropython.org/ + "Efficient Python 3 implementation for microcontrollers." +[led]: https://en.wikipedia.org/wiki/Light-emitting_diode + "Light-emitting diode." +[usb]: https://en.wikipedia.org/wiki/USB + "Universal Serial Bus" +[usb mass storage]: https://en.wikipedia.org/wiki/USB_mass_storage_device_class + "USB mass storage device." +[uf2]: https://github.com/microsoft/uf2 + "UF2 flash file format" +[sdk]: https://en.wikipedia.org/wiki/Software_development_kit + "Software Development Kit" +[pico-sdk]: https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html#software-development + "Raspberry Pi Pico and Pico W SDK." +[flash-instructions]: https://www.raspberrypi.com/documentation/microcontrollers/micropython.html + "Instructions to flash MicroPython to a Pico W" +[linux]: https://en.wikipedia.org/wiki/Linux + "Linux operating system" +[repl]: https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop + "Read Evaluate Print Loop" +[http]: https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol + "HyperText Transfer Protocol" +[digikey]: https://digikey.com/ + "DigiKey" +[stock]: https://www.digikey.com/en/products/detail/raspberry-pi/SC0918/16608263 + "Raspberry Pi Pico W at DigiKey" +[pi-4b]: https://www.raspberrypi.com/products/raspberry-pi-4-model-b/ + "Raspberry Pi 4B" +[pi-3b]: https://www.raspberrypi.com/products/raspberry-pi-3-model-b/ + "Raspberry Pi 3B" +[pi-zero-2-w]: https://www.raspberrypi.com/products/raspberry-pi-zero-2-w/ + "Raspberry Pi Zero 2 W" +[swd]: https://en.wikipedia.org/wiki/JTAG#Similar_interface_standards + "Serial Wire Debug" +[documentation]: https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html#documentation + "Raspberry Pi Pico and Pico W Documentation" +[build-unix]: https://github.com/micropython/micropython/tree/master/ports/unix + "ports/unix directory of MicroPython Git repository" +[micropython git repository]: https://github.com/micropython/micropython + "MicroPython Git repository" +[wifi]: https://en.wikipedia.org/wiki/Wi-Fi + "Wireless networking standard" +[micropython standard library]: https://docs.micropython.org/en/latest/library/index.html#python-standard-libraries-and-micro-libraries + "MicroPython standard library" +[python]: https://python.org/ + "Python programming language" +[python standard library]: https://docs.python.org/3/ + "Python standard library" +[micropython-lib]: https://github.com/micropython/micropython-lib/ + "micropython-lib Git repository" +[mqtt]: https://en.wikipedia.org/wiki/MQTT + "MQ Telemetry Transport" +[pip]: https://pypi.org/project/pip/ + "Python package installer" +[pypi]: https://pypi.org/ + "Python package index" +[mip]: https://docs.micropython.org/en/latest/reference/packages.html#package-management + "micropython package management library" +[htpc]: https://en.wikipedia.org/wiki/Home_theater_PC + "Home theater PC" +[kodi]: https://kodi.tv/ + "Kodi entertainment center" +[hash]: {{< relref "posts/2022-06-10-hash-speeds.md" >}} + "OpenSSL Hash Benchmarks" |