TomM
TomM

Reputation: 175

SparkFun RP2040 and MicroPython

I am a software engineer working on a microcontroller system for a side project. The microcontroller I am using is the SparkFun ProMicro (based on the RP2040 board). I am trying to flash the board so that I can write data to the onboard flash memory.

All of the tutorials I have found online suggest starting in boot mode, dragging and dropping the UF2 file, and done!

When I do this, the microcontroller ejects from my computer. Is that meant to happen? It just reboots then doesn't reboot in bootloader?

Once I got MicroPython installed I moved on to writing and flashing code to the board.

I am using the Thonny IDE which identified the correct board (albeit the PICO), then saved the following file as main.py (taken from RPI foundation). It prints toggle, and I believe the output shows that it is being printed from the board, but the light on the board isn't blinking. (code and output below)

I considered that the pinout could be different from this board and the PICO, but some research shows they both use Pin 25 for the LED control.

All this leads me to believe I am on the right path, but I think I am missing something that is taken for granted in the tutorials. My end goal is to write arbitrary text data to flash storage, but I understand it can only take about 8000-10,000 writes before it becomes unreliable, so I want to test that I can write working code before I use some of those.

Is there something I am missing, or am I not thinking about this in the right way?

Output

Upvotes: 1

Views: 406

Answers (4)

MattyT
MattyT

Reputation: 6651

That's not a simple LED connected to pin 25 on the Pro Micro RP2040 - it's a WS2812 RGB LED, sometimes called a NeoPixel. There's a one-wire protocol to drive these devices.

MicroPython has support for NeoPixel's built-in:

from machine import Pin
from neopixel import NeoPixel

pin = Pin(25, Pin.OUT)  # set Pin 25 to output to drive a NeoPixel
np = NeoPixel(pin, 1)   # create NeoPixel driver on Pin 25 for a single pixel
np[0] = (255, 0, 0)     # set the first pixel to red (R, G, B)
np.write()   

See the rp2 Quickref for more details.

Upvotes: 1

AndyS
AndyS

Reputation: 816

With the RPi Pico W, you can now identify the led pin with "LED" instead of pin 25 (or another pin). This change is due to pin 25 being used for the Wifi chip on the Pico W. This works on Pico W as below

from machine import Pin
import time

led = Pin("LED", Pin.OUT)

while True:
   led.toggle()
   time.sleep(0.5)

I have verified this working on a RPi Pico W with MicroPython - using the unstable python version - rp2-pico-w-20220719-unstable-v1.19.1-181-gc947c2529.uf2.

I believe this is intended to become the standard way to access an on board led, since the port can be changed for different boards without changing source code.

Upvotes: 1

TurboGus
TurboGus

Reputation: 183

Blinking this LED was harder than I expected. I ended up finding this sample code from AdaFruit and using the commented out neopixel code. The... bright side was that there was way more control over this led that I had realized.

Dont forget you have to add the neopixel.mpy from the bundle to your board.

Upvotes: 2

OysterShucker
OysterShucker

Reputation: 5531

When I do this, the microcontroller ejects from my computer. Is that meant to happen? It just reboots then doesn't reboot in bootloader?

Yep.

but the light on the board isn't blinking.

Maybe your LED is busted, cause your code is right.

My end goal is to write arbitrary text data to flash storage

That's a terrible idea, unless you just like burning up boards for no good reason. Get an SD Card reader or concoct one out of a solution like this one, and use this sdcard library that will even mount your card, and add it to the syspath. Then you can essentially write all the arbitrary text data you like without burning up your RP2040.

Upvotes: 2

Related Questions