user49642: I installed the Arduino IDE according to the arduino.cc instructions (invoking install.sh) rather than sudo apt install .... The ports /dev/ttyACM* were present when the following Linux command is issued.
ls -l /dev/ttyACM*
This shows that the devices have membership in the dialout group. It is necessary to add myself as a user to the group dialout. 
sudo usermod -a -G dialout <username>
I selected the board and the port and did a download which eventually completed but it seemed to take a long time. The program probably wasn't working since the program was to flash an LED at a 2 second period but the flash rate was definitely much faster so it seems the download did not work. 
I deleted the IDE and reinstalled and the ports disappeared. 
I have applied this fix for using the Arduino IDE on Linux.
From the description of the fix the instruction is to issue the following commands:
wget https://github.com/adafruit/Trinket_Arduino_Linux/raw/master/99-adafruit-boards.rules

sudo cp 99-adafruit-boards.rules /etc/udev/rules.d/

Next reboot Linux.
According to this page on Arduino for Linux there ought to be some devices at /dev/ttyACM* but mine are missing. What is the solution to this problem? I have replaced the USB cable and it makes no difference. 
The board is Adafruit Feather 32u4 which has an ATmega32u4. The OS is Ubuntu 16.04.

user49642: If the Arduino IDE does not show the port or does not allow you to select the port, load a known to be working program (such as Example > Blink), start a download, and then double-click the board's reset button.
For the same advice plus extraneous information view this help page on the particular Feather, the 32u4 micro-controller board, which seems to suggest the use of a verbose download mode but that seems to be unnecessary because you can just try again if it failed. The verbose download mode is enabled in preferences. Even though it is unnecessary I eventually decided to always use the verbose download mode because it gives what appears, to me at least, more immediate and obvious feedback about success and failure.

user58593: So I tried EVERYTHING... turns out my USB cable was a cheaper cable that didn't have the data pins in it. It is worth making sure your cable supports data transfer by plugging it into something else to make sure it w

user61307: ttyACM* didn't show up on my /dev/ also, but as soon as I changed the USB port I was working with, the arduino board started blinking differently. So I checked the IDE again and under Tools > port > Serial Port I saw ttyACM0 came up. Didn't make sense to me but it worked.

user48274: 
/dev/ttyACM* mine are missing.

I think that something udev rules issue, you can define another rules with add Feather32u4.rules and remove 99-adafruit-boards.rules file before.
SUBSYSTEM=="usb", ATTRS{idProduct}=="0c9f", ATTRS{idVendor}=="1781", MODE="0660", GROUP="dialout"
ATTRS{idVendor}=="239a", ENV{ID_MM_DEVICE_IGNORE}="0"
ATTRS{idVendor}=="239a", MODE="0660", GROUP="dialout"
SUBSYSTEM=="tty", ATTRS{idProduct}=="8011", ATTRS{idVendor}=="239a", MODE="0660", GROUP="dialout"
SUBSYSTEM=="tty", ATTRS{idProduct}=="0011", ATTRS{idVendor}=="239a", MODE="0660", GROUP="dialout"

after saved and copy your files to /etc/udev/rules.d/
sudo cp Feather32u4.rules /etc/udev/rules.d/

and then restart your udev
sudo reload udev

or,
sudo udevadm control --reload-rules
sudo udevadm trigger

don't forget to restart your service
sudo systemctl restart ModemManager.service

check again your port with following ll /dev/tty*, if it appear with named /dev/ttyUSBx or /dev/ttyACMx add a user to your group
sudo usermod -a -G plugdev <user>

also try to automatically reset button with add a delay into your sketch
while(!Serial){
  delay(1000);
}
Serial.begin(115200);

if it not showed port on /dev/tty list, try

Enabled verbose upload in the Arduino Preferences.
Open the Blink example.
and add automatically reset above.

that will showed as the Bootloader COM/Serial Port with bootloading mode. 
If didn't work, i advice install driver on Adafruit_Driver Windows only using Wine or PlayOnLinux, and remove udev files. also check again your /dev/tty* list.
Hope this helps.

user4143: 
According to this page on Arduino for Linux there ought to be some devices at /dev/ttyACM*

That is not the case. On a "traditional" Arduino board, like the Uno, you have two chips: the main MCU which you program, and a USB interface chip, which is pre-programmed with code to present a CDC/ACM interface to the computer (which it then creates a /dev/ttyACMx device for).
With the feather you don't have that. You have one single chip. That chip is both the USB interface and the chip that you program - and most importantly, it is your program that provides the CDC/ACM device if you choose. If your program doesn't provide a CDC/ACM device then the computer will never see one, so it will never create /dev/ttyACMx.
In general the Arduino core always adds a CDC/ACM device whether or not you ask for it, since it is often used to initiate a reset into the bootloader. However if your sketch stops working for whatever reason then the CDC/ACM port is no longer there.
The M0 on the feather has a neat trick though - if you reset the board with the reset button twice the startup code recognises that fact and forces it to run the bootloader. That bootloader then presents the needed CDC/ACM device to the computer allowing you to upload new code.
Of course, if your program that you upload then doesn't initialise its own CDC/ACM device, or crashes, the CDC/ACM device will not be presented until you do the double-reset trick again.

49642: <p>I installed the Arduino IDE according to the arduino.cc instructions (invoking <code>install.sh</code>) rather than <code>sudo apt install ...</code>. The ports <code>/dev/ttyACM*</code> were present when the following Linux command is issued.</p>

<p><code>ls -l /dev/ttyACM*</code></p>

<p>This shows that the devices have membership in the <code>dialout</code> group. It is necessary to add myself as a user to the group <code>dialout</code>. </p>

<p><code>sudo usermod -a -G dialout &lt;username&gt;</code></p>

<p>I selected the board and the port and did a download which eventually completed but it seemed to take a long time. The program probably wasn't working since the program was to flash an LED at a 2 second period but the flash rate was definitely much faster so it seems the download did not work. </p>

<p>I deleted the IDE and reinstalled and the ports disappeared. </p>

<p>I have applied this <a href="https://learn.adafruit.com/adafruit-arduino-ide-setup/linux-setup" rel="noreferrer">fix for using the Arduino IDE on Linux</a>.</p>

<p>From the description of the fix the instruction is to issue the following commands:</p>

<pre><code>wget https://github.com/adafruit/Trinket_Arduino_Linux/raw/master/99-adafruit-boards.rules

sudo cp 99-adafruit-boards.rules /etc/udev/rules.d/
</code></pre>

<p>Next reboot Linux.</p>

<p>According to <a href="https://www.arduino.cc/en/Guide/Linux/" rel="noreferrer">this page on Arduino for Linux</a> there ought to be some devices at <code>/dev/ttyACM*</code> but mine are missing. What is the solution to this problem? I have replaced the USB cable and it makes no difference. </p>

<p>The board is Adafruit Feather 32u4 which has an ATmega32u4. The OS is Ubuntu 16.04.</p>
 49642: <p>If the Arduino IDE does not show the port or does not allow you to select the port, load a known to be working program (such as Example > Blink), start a download, and then double-click the board's reset button.</p>

<p>For the same advice plus extraneous information view this <a href="https://learn.adafruit.com/adafruit-feather-32u4-basic-proto/feather-help" rel="nofollow noreferrer">help page on the particular Feather, the 32u4 micro-controller board</a>, which seems to suggest the use of a verbose download mode but that seems to be unnecessary because you can just try again if it failed. The verbose download mode is enabled in preferences. Even though it is unnecessary I eventually decided to always use the verbose download mode because it gives what appears, to me at least, more immediate and obvious feedback about success and failure.</p>
 58593: <p>So I tried EVERYTHING... turns out my USB cable was a cheaper cable that didn't have the data pins in it. It is worth making sure your cable supports data transfer by plugging it into something else to make sure it w</p>
 61307: <p><code>ttyACM*</code> didn't show up on my /dev/ also, but as soon as I changed the USB port I was working with, the arduino board started blinking differently. So I checked the IDE again and under <code>Tools</code> > <code>port</code> > <code>Serial Port</code> I saw ttyACM0 came up. Didn't make sense to me but it worked.</p>
 48274: <blockquote>
  <p>/dev/ttyACM* mine are missing.</p>
</blockquote>

<p>I think that something udev rules issue, you can define another rules with add <code>Feather32u4.rules</code> and remove <code>99-adafruit-boards.rules</code> file before.</p>

<pre><code>SUBSYSTEM=="usb", ATTRS{idProduct}=="0c9f", ATTRS{idVendor}=="1781", MODE="0660", GROUP="dialout"
ATTRS{idVendor}=="239a", ENV{ID_MM_DEVICE_IGNORE}="0"
ATTRS{idVendor}=="239a", MODE="0660", GROUP="dialout"
SUBSYSTEM=="tty", ATTRS{idProduct}=="8011", ATTRS{idVendor}=="239a", MODE="0660", GROUP="dialout"
SUBSYSTEM=="tty", ATTRS{idProduct}=="0011", ATTRS{idVendor}=="239a", MODE="0660", GROUP="dialout"
</code></pre>

<p>after saved and copy your files to /etc/udev/rules.d/</p>

<pre><code>sudo cp Feather32u4.rules /etc/udev/rules.d/
</code></pre>

<p>and then restart your udev</p>

<pre><code>sudo reload udev
</code></pre>

<p>or,</p>

<pre><code>sudo udevadm control --reload-rules
sudo udevadm trigger
</code></pre>

<p>don't forget to restart your service</p>

<pre><code>sudo systemctl restart ModemManager.service
</code></pre>

<p>check again your port with following ll <code>/dev/tty*</code>, if it appear with named <code>/dev/ttyUSBx</code> or <code>/dev/ttyACMx</code> add a user to your group</p>

<pre><code>sudo usermod -a -G plugdev &lt;user&gt;
</code></pre>

<p>also try to automatically reset button with add a delay into your sketch</p>

<pre><code>while(!Serial){
  delay(1000);
}
Serial.begin(115200);
</code></pre>

<p>if it not showed port on <code>/dev/tty</code> list, try</p>

<ul>
<li>Enabled <strong>verbose upload</strong> in the Arduino Preferences.</li>
<li>Open the Blink example.</li>
<li>and add automatically reset above.</li>
</ul>

<p>that will showed as the Bootloader COM/Serial Port with bootloading mode. </p>

<p><strong>If</strong> didn't work, i advice install driver on <a href="https://learn.adafruit.com/adafruit-feather-32u4-adalogger/using-with-arduino-ide#install-drivers-windows-only-6-7" rel="nofollow noreferrer">Adafruit_Driver Windows only</a> using Wine or PlayOnLinux, and remove udev files. also check again your <code>/dev/tty*</code> list.</p>

<p>Hope this helps.</p>
 4143: <blockquote>
  <p>According to this page on Arduino for Linux there ought to be some devices at /dev/ttyACM*</p>
</blockquote>

<p>That is not the case. On a "traditional" Arduino board, like the Uno, you have two chips: the main MCU which you program, and a USB interface chip, which is pre-programmed with code to present a CDC/ACM interface to the computer (which it then creates a /dev/ttyACMx device for).</p>

<p>With the feather you don't have that. You have one single chip. That chip is both the USB interface and the chip that you program - and most importantly, it is <em>your</em> program that provides the CDC/ACM device <em>if you choose</em>. If your program doesn't provide a CDC/ACM device then the computer will never see one, so it will never create /dev/ttyACMx.</p>

<p>In general the Arduino core always adds a CDC/ACM device whether or not you ask for it, since it is often used to initiate a reset into the bootloader. However if your sketch stops working for whatever reason then the CDC/ACM port is no longer there.</p>

<p>The M0 on the feather has a neat trick though - if you reset the board with the reset button <em>twice</em> the startup code recognises that fact and forces it to run the bootloader. That bootloader then presents the needed CDC/ACM device to the computer allowing you to upload new code.</p>

<p>Of course, if your program that you upload then doesn't initialise its own CDC/ACM device, or crashes, the CDC/ACM device will not be presented until you do the double-reset trick again.</p>
