web-dev-qa-db-ja.com

OSError:[Errno 13] Permission denied: '/ dev / ttyACM0'-using pyserial from Python to Arduino

環境

  • Linux Mint 17.1
  • Python 2.7
  • pyserial 2.7
  • Arduino UNO rv3

望ましい行動

PythonアプリケーションからArduinoに3つの値を送信しようとしています。

端末から以下を実行すると機能します:

$ python
$ import serial
$ import struct
$ ser = serial.Serial('/dev/ttyACM0', 9600)
$ ser.write(struct.pack('>3B', 255, 0, 0))

現在の動作

Pythonファイルで同じコードを使用する場合、つまり、次のように動作しません。

import serial
import struct
ser = serial.Serial('/dev/ttyACM0', 9600)
ser.write(struct.pack('>3B', red_value, green_value, blue_value))

エラーメッセージ

$ Sudo tail -100 /var/log/Apache2/error.log
OSError: [Errno 13] Permission denied: '/dev/ttyACM0'

トラブルシューティング

権限

アプリケーションファイル:

$ ls -l
-rwxr-xr-x 1 myname mygroupname 114146 Jan  9 19:16 my_application.py

ttyACM0:

ls -l /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 Jan  9 20:12 /dev/ttyACM0

グループ

所有者が所属するグループ:

$ groups
mygroupname adm dialout cdrom Sudo dip plugdev lpadmin sambashare

インターネットでさまざまな提案があったため、[システム設定]> [ユーザーとグループ]で所有者をttyグループにも追加しました。これは効果がありませんでした。

使用可能なシリアルポート

$ dmesg | grep tty
[    0.000000] console [tty0] enabled
[ 3390.614686] cdc_acm 3-2:1.0: ttyACM0: USB ACM device

更新

次の条件下で機能するようにforceできます:

1。ワールドの権限はrwに設定する必要があります:

Sudo chmod 666 /dev/ttyACM0

2。 Arduino IDEシリアルモニターを開く必要があります。

ただし、これらの条件は次のように持続可能ではありません。

  • アクセス許可は、USBが接続されるたびにリセットされます。
  • Arduino IDEシリアルモニターを開いておく必要はありません。
9
user1063287

以下は、最初の回答のアイデアの一部を具体化しています(このコンテンツをその回答に追加して受け入れようとしましたが、編集は拒否されました)。私はその分野の専門家ではないので、この情報を使用してあなた自身の研究をサポートしてください。

次のいずれかを実行できます。

01。/dev/ttyACM0の権限を変更して、世界にreadおよびwrite権限(何かしたくない場合があります)-デバイスが接続されるたびにリセットされる場合があります。例:

Sudo chmod 666 /dev/ttyACM0  

02。デバイスの権限を設定するルールを/etc/udev/rules.dに作成します(再起動が必要になります):

# navigate to rules.d directory
cd /etc/udev/rules.d
#create a new rule file
Sudo touch my-newrule.rules
# open the file
Sudo vim my-newrule.rules
# add the following
KERNEL=="ttyACM0", MODE="0666"

これにより、worldの権限がreadwriteに設定されますが、これは不要な場合があります。

このアプローチの詳細については、次の回答を参照してください。

https://unix.stackexchange.com/a/48596/92486

https://stackoverflow.com/a/11848003/1063287

03。3番目のオプションは、私が実装したオプションで、Apacheユーザーをdialoutグループに追加して、スクリプトがApacheによって実行されている場合、デバイスにアクセスできます。

a)Apache構成ファイルの場所を見つけ、そのファイル内でUser設定を検索します。

# open file in editor
Sudo vim /etc/Apache2/Apache2.conf
# search for User setting
/User

あなたは次のようなものを見つけるかもしれません:

# These need to be set in /etc/Apache2/envvars
User ${Apache_RUN_USER}
Group ${Apache_RUN_GROUP}

b)vimを終了し、Apache_RUN_USER/etc/Apache2/envvarsを検索します(上記のシナリオが当てはまる場合)。

# open file in editor
Sudo vim /etc/Apache2/envvars
# search for Apache_RUN_USER
/Apache_RUN_USER

あなたは次のようなものを見つけるかもしれません:

export Apache_RUN_USER=www-data

c)ユーザーwww-datadialoutグループに追加します。

Sudo usermod -a -G dialout www-data

d)再起動します。

Apacheユーザーがdialoutグループに追加されたので、スクリプトはデバイスにアクセスできるはずです。

さらに読む

Apache構成ファイルの場所を見つける方法:

https://stackoverflow.com/a/12202042/1063287

20
user1063287

ファイルに対する権限は、プログラムが実行されるユーザーに違いを与えません。

インタラクティブにログインすると、/ dev/ttyACM0を使用する権限があります

スクリプトが実行されているとき(おそらくApacheユーザーとして)、権限がありません

/ dev/ttyACM0の権限を変更する必要があります

ここで2番目の回答を参照してください ファイルを正しい権限にするためにudev権限を変更する例については、charデバイスにプログラムで権限を設定するにはどうすればよいですか

2
Vorsprung