A couple months back I started working on an “Okay to Wake” clock for
Yeah, yeah, honey – I know I could just buy one on [insert website
named after rainforest], but that’s no fun.
I decided on an ItsyBitsy
for a few reasons; inexpensive, more powerful than a Pro Micro, lots
of PWM pins, ‘native’ USB, etc. It’s also really tiny.
Anyway, it should just be plug-and-play on any Linux machine, but
instead… it’s had issues with all my computers, covering Windows 10,
Fedora, and Archlinux. Maybe it’s just a finicky device? I don’t
know, but I figured out how to get it working with my Archlinux
install after way too long spent on troubleshooting.
The main issue I had was due to permissions on the
device. In Arch, the default ownership is
wr-wr---- , so you would think ‘add your user to
uucp and off
we go’… but no. After power-cycling into the bootloader mode, for
only a short second, the device is set to
wr-------w , so it doesn’t matter which groups my user is in, I
can’t access it. That results in this nice error when I try to upload
to the board:
avrdude: Version 6.3-20190619
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "/home/brandon/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf"
User configuration file is "/home/brandon/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : /dev/ttyACM0
Using Programmer : avr109
Overriding Baud Rate : 57600
avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied
avrdude done. Thank you.
I chased a theory for way too long on this: the bootloader enumerates
with a difference USB
productID , so I figured my system needed a
udev rule added to set the permissions correctly for the
bootloader device. A couple hours of learning udev rules and I
realized that the device, no matter what I did, would always be
root:root for a short time after. I finally did get a udev rule
to set the user and group, and the permissions to
rw-rw-rw- , but
it wasn’t instant so the device was still locked off to
The easy way
Eventually, I ended up in the #arduino channel on freenode asking,
when I realized that I just need the IDE to wait a moment before
trying to upload the code using
avrdude . I was looking around in
the Arduino IDE code for where it calls avrdude, when a moment of
replace the avrdude executable with a script that waits a second,
then calls avrdude.
Yup, that’s what this whole post leads up to. I hope it’s helpful to
someone. Here are the (very simple) two steps to fix this issue if
you hit the same problem:
First, move the
avrdude binary in the Arduino folder, the path
will change with new IDE releases:
$ cd ~/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/
$ mv avrdude avrdude-bin
Then, create this script named
Now the Arduino IDE will have to wait one second after noticing that
/dev/ttyACM0 exists before trying to upload your code, and
hopefully the device has settled by then. You can try increasing the
sleep duration if you still have issues, but it really shouldn’t
require longer than 2 seconds – you likely have a different problem
if 2 doesn’t work.