環境
望ましい行動
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シリアルモニターを開く必要があります。
ただし、これらの条件は次のように持続可能ではありません。
以下は、最初の回答のアイデアの一部を具体化しています(このコンテンツをその回答に追加して受け入れようとしましたが、編集は拒否されました)。私はその分野の専門家ではないので、この情報を使用してあなた自身の研究をサポートしてください。
次のいずれかを実行できます。
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の権限がread
とwrite
に設定されますが、これは不要な場合があります。
このアプローチの詳細については、次の回答を参照してください。
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-data
をdialout
グループに追加します。
Sudo usermod -a -G dialout www-data
d)再起動します。
Apacheユーザーがdialout
グループに追加されたので、スクリプトはデバイスにアクセスできるはずです。
さらに読む
Apache構成ファイルの場所を見つける方法:
ファイルに対する権限は、プログラムが実行されるユーザーに違いを与えません。
インタラクティブにログインすると、/ dev/ttyACM0を使用する権限があります
スクリプトが実行されているとき(おそらくApacheユーザーとして)、権限がありません
/ dev/ttyACM0の権限を変更する必要があります
ここで2番目の回答を参照してください ファイルを正しい権限にするためにudev権限を変更する例については、charデバイスにプログラムで権限を設定するにはどうすればよいですか