Программа Arduino работает только при запуске от имени root

Загрузка простых скетчей, кажется, работает, когда я запускаю программу Arduino как root (sudo). Я хотел бы запустить ее как обычный пользователь. Кто-нибудь сталкивался с такой же проблемой и исправил ее?

Вот что я получил от lsusb:

$ lsusb
Bus 002 Device 022: ID 2341:0043 Arduino SA Uno R3 (CDC ACM)

И программа Arduino идентифицирует его как /dev/ttyACM0. Вот его разрешения:

$ ls -l /dev/ttyACM0 
crw-rw---T 1 root dialout 166, 0 Mar 14 22:03 /dev/ttyACM0

Вот вывод id

groups=1000(abhiram),20(dialout),24(cdrom),25(floppy),29(audio),
30(dip),44(video),46(plugdev),105(scanner),110(bluetooth),112(netdev)

Когда загружаю скетч из примеров, как обычный пользователь, я сталкиваюсь с этой ошибкой:

avrdude:stk500_recv(): programmer not responding

Любые предложения приветствуются.

, 👍20

Обсуждение

Посмотрите, поможет ли [это](http://playground.arduino.cc/Linux/All#.UyM2QpX7Zwc), раздел «УСТАНОВКА РАЗРЕШЕНИЙ», @alexan_e

И +1 за то, что не смирились с ситуацией и не запустили IDE от имени root, а попытались выяснить, как правильно решить проблему., @jippie

Какую именно ошибку вы получаете, когда пытаетесь запустить IDE под непривилегированным пользователем? Возможно, вам нужно включить подробный вывод в меню Preferences., @jippie

Убедитесь, что вы подключаетесь к правильному устройству, отсоединив его, подождав несколько секунд, затем снова подключив его, затем проверьте вывод dmesg для зарегистрированного файла устройства., @jippie

Проверил, устройство правильно обнаружено как /dev/ttyACM0: USB ACM device. Так что мне это не кажется проблемой. С другой стороны, логи компиляции и загрузки (пришлось включить их в настройках) кажутся многообещающими. Я просто не могу скопировать их из программы arduino :(. (может быть, они пишутся в какой-то файл?), @feverDream

Что происходит, когда вы avrdude -p atmega328 -carduino -P /dev/ttyACM0 -b 57600 -D -Uflash:r:/tmp/project.hex:i ? Дважды проверьте устройство и скорость передачи данных., @jippie

Я понимаю, что вы имеете в виду, мне пришлось немного изменить команду. Вот как это выглядит /usr/share/arduino/hardware/tools/avrdude -C/usr/share/arduino/hardware/tools/avrdude.conf -v -v -v -v -patmega328p -carduino -P/dev/ttyACM0 -b115200 -D -Uflash:w:/tmp/build6432672958845434451.tmp/Blink.cpp.hex:i И это работает, когда я запускаю его как обычный пользователь :). Хотя не уверен, почему это тормозит с инструментом arduino., @feverDream

Скорость передачи данных странная, я ожидал 57600, по крайней мере, я использую ее для подключения к Arduino. Вы нашли эту скорость передачи данных в журнале Arduino? Я использую другую плату, это может объяснить разницу., @jippie


3 ответа


13

Самое простое решение — добавить себя в группу dialout.

Сначала запишите вывод из id. Сохраните его в файле (не в /tmp, так как он очищается при перезагрузке). Если вы посмотрите на вывод, вы заметите, что ваш пользователь зарегистрирован в нескольких группах, и эти группы представляют дополнительные привилегии в системе. По умолчанию ваш Arduino назначен в группу dialout, потому что он регистрируется как последовательный интерфейс, и в старые времена они часто использовались для ... исходящих звонков с использованием модема.

Чтобы добавить себя в группу dialout, введите следующую команду:

sudo usermod -a -G dialout $USER

Не забудьте флаг -a (для добавления групп, а не для замены), иначе у вас будут совершенно другие проблемы. Вот почему нужно копировать вывод id в файл, чтобы в случае, если вы все-таки ошибетесь, вы хотя бы знали, как был настроен ваш пользователь раньше.

Затем выйдите из системы и войдите в систему, и с этого момента все должно заработать.

При желании вы можете дважды проверить вывод для id по сравнению с выводом, который вы сохранили ранее.

,

спасибо @jippie за вдумчивый ответ. Я добавил себя в группу dialout, но проблема, похоже, все еще сохраняется. Я изменил свой вопрос с выводом команды id., @feverDream

Мое впечатление от вашего обновления таково, что точная причина проблемы переместилась в следующую проблему. Вы на пути к ее решению. Что происходит, когда вы cat /dev/ttyACM0? Выдает ли это ошибку?, @jippie

Нет, файл устройства, похоже, пустеет, когда я его cat., @feverDream

Оставить пустым — нормально, если только не появится сообщение об ошибке., @jippie


9

Часто повторяемый совет «просто сделайте sudo usermod -aG dialout <username>» никогда не работал для меня, и я наконец понял, почему. На моем компьютере /dev/ttyUSB0 относится к группе serial, а не dialout, поэтому добавление моего имени пользователя в dialout ничего не дало.

# ls -l
# crw-rw---- 1 root serial 188, 0 Mar 31 20:52 /dev/ttyUSB0
                    ^^^^^^ (название группы)

Наконец-то: sudo usermod -aG <group-name> <username> исправил это для меня.

Как ни странно, это также явно указано здесь в разделе «УСТАНОВИТЬ РАЗРЕШЕНИЕ». Вздох.

,

Да, стоит проверить фактическую группу владельцев. Кроме того, файл устройства может иметь формат ttyUSB# или ttyACM# (или теоретически любой другой) в зависимости от типа платы, драйвера ядра и, в конечном счёте, конфигурации udev или того, что создаёт узлы., @Chris Stratton

Об этом также упоминается на https://www.arduino.cc/en/Guide/Linux#toc6, @Roberto Tyley


0

Со мной такое случается. В моем случае я обновил версию Arduino, и, похоже, проблема была в файле настроек. Просто удалите файл ~/.arduino/preferences.txt (при закрытой среде Arduino IDE).

Шаги:

  1. Закрыть Arduino IDE
  2. выполнить это:

    rm ~/.arduino/preferences.txt

  3. Запустить Arduino IDE

Это сработало для меня, надеюсь, сработает и для кого-то ещё. Я использую Linux Mint 17 и обновился с Arduino 1.05 до Arduino 1.06, извлекая Arduino IDE. Я не использую ту, что в репозитории. (Разумеется, после добавления вашего пользователя в соответствующую группу, как упоминалось другими, но если это не поможет, попробуйте это)

,

Возможно, с этим связано то, что одним из побочных эффектов запуска инструментов от имени пользователя root является то, что вы можете оставить после себя временные, конфигурационные или проектные файлы, которые ваша обычная учетная запись не сможет изменить или очистить., @Chris Stratton