How to fix ESP32 MicroPython 'ValueError: pin can only be input'
Problem:
You are trying to initialize an ESP32 pin in MicroPython using
import machine
machine.Pin(34, machine.Pin.OUT)
but you see an error message like
>>> machine.Pin(34, machine.Pin.OUT)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: pin can only be input
Solution
On the ESP32, pins with numbers >= 34
are input-only pins!
You need to use other pins < 34
if you need output capability!
For reference, see the relevant MicroPython source code section:
// configure mode
if (args[ARG_mode].u_obj != mp_const_none) {
mp_int_t pin_io_mode = mp_obj_get_int(args[ARG_mode].u_obj);
if (self->id >= 34 && (pin_io_mode & GPIO_MODE_DEF_OUTPUT)) {
mp_raise_ValueError("pin can only be input");
} else {
gpio_set_direction(self->id, pin_io_mode);
}
}