diff --git a/components/micropython/vendor/ports/esp32/machine_pin.c b/components/micropython/vendor/ports/esp32/machine_pin.c
index 89515976e4993d88d00c07f114f33ab4965cf573..b0ce5f927c2ecc367e3602f4e4e54462af1b2861 100644
--- a/components/micropython/vendor/ports/esp32/machine_pin.c
+++ b/components/micropython/vendor/ports/esp32/machine_pin.c
@@ -460,6 +460,13 @@ STATIC mp_obj_t machine_pin_on(mp_obj_t self_in) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_on_obj, machine_pin_on);
 
+// pin.num()
+STATIC mp_obj_t machine_pin_num(mp_obj_t self_in) {
+    machine_pin_obj_t *self = MP_OBJ_TO_PTR(self_in);
+    return mp_obj_new_int(self->id);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_num_obj, machine_pin_num);
+
 // pin.irq(handler=None, trigger=IRQ_FALLING|IRQ_RISING)
 STATIC mp_obj_t machine_pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
     enum { ARG_handler, ARG_trigger, ARG_wake };
@@ -532,6 +539,7 @@ STATIC const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_off), MP_ROM_PTR(&machine_pin_off_obj) },
     { MP_ROM_QSTR(MP_QSTR_on), MP_ROM_PTR(&machine_pin_on_obj) },
     { MP_ROM_QSTR(MP_QSTR_irq), MP_ROM_PTR(&machine_pin_irq_obj) },
+    { MP_ROM_QSTR(MP_QSTR_num), MP_ROM_PTR(&machine_pin_num_obj) },
 
     // class constants
     { MP_ROM_QSTR(MP_QSTR_IN), MP_ROM_INT(GPIO_MODE_INPUT) },
diff --git a/docs/badge/badge_link.rst b/docs/badge/badge_link.rst
index 6c052bf35e75e68f3207ecb7128b1fd9239fac63..d279cb2b77034395b7fe4b27badb92c147bf360b 100644
--- a/docs/badge/badge_link.rst
+++ b/docs/badge/badge_link.rst
@@ -43,6 +43,16 @@ necessarily mean lower baud rates (higher cable capacity)
 
 .. _badge-link-midi:
 
+.. code-block:: pycon
+
+  >>> import badgelink
+  >>> jack = badgelink.right
+  >>> jack.enable()
+  True
+  >>> import machine
+  >>> uart = machine.UART(1, baudrate=9600, tx=jack.tip.pin.num(), rx=jack.ring.pin.num())
+  >>> uart.write('hello')
+
 MIDI
 ----