[1]HTMLとWebIOPiマクロ関数
●WebブラウザでGPIOサーバーを呼び出す
●HTMLファイルのページ表示
●表示された画面でボタンをクリック
●HTMLファイルでWebIOPiのマクロ関数が呼び出されて実行
    WebIOPiのマクロ関数はJavascript
              WebIOPiのマクロ関数WebIOPiライブラリでGPIOを制御
①HTMLファイルの作成
WebIOPiが備える関数ライブラリ(Javascript)
■WebIOPiが持つJavascriptで記述された関数ライブラリを呼び出しながら記述する
■GPIOを直接制御するボタンを生成する関数
  create GPIOButton()
■GPIOの入出力モドを設定する関数
  setFunction
■記述
3個のボタンで赤、緑、青のLEDを点灯./消灯するHTMLファイルのソースコード(webiopi1.html)
ページタイトルに続いてWebIOPiのJavascriptを使うことを宣言
最初にWebIOPiのインスタンス(IOPI)を生成し。以降はこのIOPIを使う
続いてIOPI.ready関数の中で3個のボタンを出力モードに設定し、さらに特定のGPIOピンに割り付け表示名称を指定
スタイルシートとの連携をとるための関数$を実行
次にスタイルシートでボタンのサイズと表示位置、名称の文字サイズを指定
最後が実際の表示ページの制御で、表題の設定と3個のボタン表示を設定
■こうして作成したHTMLファイルはラズベリーパイの /home/pi/workにwebiopi.htmlで保存
■ラズベリーパイがWebブラウザからポート番号8030で呼ばれたらHTMLファイルを読みだしてWebブラウザに送るように設定する
pi@raspberry:~$ sudo nano /etc/webiopi/config
①ページのポート番号を8030に変更
②HTMLファイルのあるディレクトリを指定
③HTMLファイル名を指定
[Ctrl] +[o] でファイルを上書き
[Ctrl] +[x] でnanoエディターを終了
pi@raspberry:~$ sudo systemctl start webiopi
[2]Pythonマクロ関数でHTMLファイルを呼び出す
●WebブラウザでGPIOサーバーを呼び出す
●HTMLファイルのページ表示
●表示された画面でボタンをクリック
●HTMLファイルでWebIOPiのマクロ関数が呼び出される
●Pythonスクリプト内のマクロ関数が呼び出される
    Python用のGPIOライブラリがラズベリーパイのGPIOを制御
HTMLファイル
Pythonのマクロ関数を呼び出すPythonスクリプト(webiopi2.py)の作成
pi@raspberry:~$ sudo nano /etc/webiopi/config
WebIOPiのコンフィギュレーションに手を加える
①ページのポート番号を8030に変更
②HTMLファイルのあるディレクトリを指定
③HTMLファイル名を指定
[Ctrl] +[o] でファイルを上書き
[Ctrl] +[x] でnanoエディターを終了
 
 
 
 

ラズベリーパイのGPIO・40pから5pを選びパチスロの信号線に割り込み配線する。
パチスロ側      ラズベリーパイ側
MAXBET--------GPIO2       3番ピン
START----------GPIO3  5番ピン
STOP1----------GPIO4  7番ピン
STOP2----------GPIO5  29番ピン
STOP3----------GPIO6  31番ピン
GNDもつないで共通にする
 
 
 

WEBIOPiのインストール/起動/停止
●ダウンロード
●圧縮ファイル解凍
pi@raspberry:~$ sudo tar xvzf WebIOPi-0.7.1.tar.gz
●ラズベリーパイモデル3に対応させるパッチを適用  
まずディレクトリーの移動
cd  WebIOPi-0.7.1.
 
pi@raspberry:~$ patch -p -i webiopi -pi2bplus.patch
●セットアップ・スクリプト実行
pi@raspberry:~$ sudo ./setup.sh
 Do you want to access WebIOPi over Internet?[y/n] に[n]と回答
● OSをリブート
これでWebIOPiの動作準備OK
●WebIOPiの開始/停止
▶デバッグモードで開始/停止
pi@raspberry:~$ sudo webiopi -d -c /etc/webiopi/config
HTMLの不具合の場合ターミナルがエラーメッセージを表示するので間違い
を発見しやすい。
停止は[Ctrl] + [c]
▶通常起動/停止
sudo /etc/init.d/webiopi start
sudo /etc/init.d/webiopi stop
WebブラウザでGPIOをリモート操作
ラズベリーパイでWebサイトを起動⇒アドレスバーに http://IPあどれす:8000を入力⇒ENTER
ユーザー名:webiopi  パスワード:raspberry
メインメニューのGPIO Header をクリック⇒GPIOヘッダーが開く
[IN] 表示をクリックすると[OUT]に変わる。再クリックすると[IN]に戻る
[数字]ボタンをクリックするとラズベリーパイの対応入出力端子の機能が変化し、ボタンの色が変わって表示される。Hレベル⇒オレンジ Lレベル⇒クロ
 
 

C言語によるラズベリーパイ入出力GPIO制御
STEP1 テキストエディターでプログラムを記述
 
/home/pi/Testに保存(test1.c
 
STEP2 gccコンパイラでプログラムを実行形式に変換
STEP3 プログラムを実行
(1)Wiring Piのインストール&設定
Wiring Piとは、ラズパイでGPIOを制御するのに必要なC言語用のライブラリィ。C言語でGPIOを使うのにこのライブラリが必要なので最初にインストールする。WiringPiをインストールするとgpioというコマンドもインストールされる。このコマンドを使うと、シェル上でGPIOを制御することができる。
 
 Wiring Pi のソースコードを Git で入手するための準備 
$ sudo apt-get install libi2c-dev 
$ sudo apt-get install git-core
ユーザーのホームディレクトリに移動し、ソースコードを入手 
$ cd ~ 
Wiring Pi のソースコードが wiringPiディレクトリとしてクローンされるので、ディレクトリ内に移動してビルドする。
$ cd WiringPi 
$ ./build
gpio -vとコマンド入力するとversion: 2.70が表示され、正常インストールが確認できました。
gpio readall
(2)C言語でWiringPiを操作
●インクルード宣言とライブラリ追加
プログラムの先頭でヘッダーファイルをインクルード
   #include  
コンパイルするとWiringPiのライブラりが付加される
          sudo gcc filename.c -o objname -lwiringPi
実行コマンド
          sudo ./objname
●入出力端子の機能設定
WiringPi設定用関数
①pinMode
指定したピンの動作モード設定
書式
void  pinMode(int pin, int mode);
mode: 次のいずれか
  INPUT
  OUTPUT
  PWM_OUTPUT(pin1(GPIO18)だけ)
  GPIO_CLOCK(pin7GPIO4)だけ)
記述例
  pinMode(2,OUTPUT):
②pullupDnControl
指定したピンのプルアップとプルダウンの設定
書式
void pillUpDncontrol (int pin, int pud):
pud:次のいずれか
  PUD_OFF
       PUD_DOWN, PUD_UP
記述例
  pullUpDnControl(3, PUD_UP)
③digitalWrite
GPIOピンに出力
書式
void digitalWrite(int pin, int value);
value :次のいずれか
  HIGH, LOW, 1,0
記述例
  digitalWrite(2, HIGH);
④pwmWrite
pin1(GPIO18)のPWM出力のデューティ設定
書式
void pwmWrite(int pin, int value);
value: 0~1024の範囲
⑤digitalRead
GPIOピンから入力する
書式
int digitalRead(int pin);
戻り値:HIGH, LOW ,1, 0のいずれか
記述例
if(digitalRead(3))
(3)C言語xWiringPiでI/O!3色LEDの点滅
GPIO2,GPIO3,GPIO4の接続したLEDを順番に点滅させるプログラム
GPIO17端子の入力レベル(HまたはL)によって一定間隔を0.5秒と1秒に切り替えて点滅
最初にwiringPiのヘッダーファイルをインクルード
BCMのピン番号ですべてを制御
コマンドでコンパイル  
      sudo gcc test2.c -o test2 -lwiringPi
実行
   sudo ./test2 
 
 
 
 
Python スクリプトでラズベリーパイの入出力ピン(GPIO)を制御
STEP1
Python標準装備のライブラリRPi.GPIOをインポート
インポートした後は"GPIO"というインスタンスが使えるようになる
import  RPi.GPIO  as  GPIO
STEP2
GPIOピンを指定する
指定方法1  GPIO.setmode(GPIO.BCM)       #GPIOの番号で指定する
指定方法2  GPIO.setmode(GPIO.BOARD)     #コネクタピン番号で指定する
STEP3
I/O端子を出力または入力に設定
①出力に設定 
GPIO.setup(ピン番号、GPIO.OUT. initial = GPIO.HIGH)
   initial記述はオプションで初期状態をHレベルかLレベルかを指定できる
 出力ピンのL/Hを制御
GPIO.output(ピン番号、GPIO.HIGH)  #デジタル出力をHレベル
GPIO.output(ピン番号、GPIO.LOW)  #デジタル出力をLレベル
②入力に設定
GPIO.setup(ピン番号、GPIO.IN. pull_up_down = GPIO.PUD_UP)
 pull_up_down以降はオプション プルアップ(PUD_UP)プルダウン(PUD_DOWN)を指定できる。
信号を取り込むときの記述
value = GPIO.input(ピン番号)
ポーリングでピンの入力レベルの変化を待つ
while GPIO.input(ピン番号) = =GPIO.HIGH:time.sleep(0.01)
whileは他の処理の実行をブロックする。
time.sleepで10msecの待ち時間を挿入し、この間は他の処理に実行権を渡している。
ラズベリーパイの入出力ピンを制御するPythonスクリプト例 sample6.py
GPIOピンの入力信号のレベル変化を検出して割り込み処理ができる。
記述例
GPIO.add_event_detect(ピン番号, GPIO.RISING,callback = my Func, bouncetime = 200)
●立ち上がり(GPIO.RISING)
●立ち下がり(GPIO.FALLING)
●両方(GPIO.BOTH)
bouncetimeはスイッチを押したときのチャタリングを回避する時間(単位msec)。イベント検出後、指定した時間だけ次のイベント検出は行わない。callbackで指定した関数myFuncはイベント検出時に実行する関数。
イベント検出を終了させる記述
GPIO.remove_event_detect
 
入力割り込み処理記述例
GPIOヘッダーのGPIO17(11ピン)またはGPIO18(12ピン)をLレベルにすると緑または青LEDが5秒点灯して消灯。
12ピンは、入力信号の変化を巡回モニタ(ポーリング)によって検出。緑LED点灯中に12ピンの入力をLレベルに変化させても5秒間点灯する。
11ピンは割り込みで処理される。青LEDが点灯中に11ピンをLレベルに変化させると、割り込み処理が行われて、連続2回(10秒間)点灯する。
GPIO.cleanup()  これはプログラム終了時にGPIOピンを入力モードにして、プルアップ/プルダウンなしの状態に戻す記述。
永久ループを[Ctrl] +[C]キーで強制終了のときや、アプリケーション終了時、この解放処理を確実に実行するには、次の例外処理を追加。
try
    while True
           (繰り返し処理)
except KeyboardInterupt    #キー入力でジャンプ
    pass
GPIO.cleanup()
 
RPiGPIOのプログラム実行時、警告 "This channel is already in use" が出るときは、最初の初期化記述に 
GPIO.setwarnigs(False)
を追加する。
 
 
Pythonプログラムの記述
テキストエディターで作成し、sample1.py で保存⇒ターミナルからコマンドで実行。
関数定義や条件文の記述
関数定義(def)や条件文(if や case)の行末には":(コロン)"が必要
関数定義に続く実行文は必ず字下げする
字下げにはTabキー、またはスペースキーを使うが混在させるとエラーになるので、いずれかに統一する
コメントの記述
"#"が行頭にあると以降はコメントになり、以降1行分は無視される
”””~”””(ダブルクォーテーション3個連続の間)は複数行でもすべてコメントになる
コメントには日本語が使える
スクリプトの最初には初期設定とメッセージ出力を記述
最初に記述した文はモジュール・ロード時に実行されます。Pythonスクリプトは上から順に実行されるので、最初の部分には初期設定やメッセージ出力を記述。
関数を定義する方法
     
関数はdefで定義します。
引数のパラメーターはいくつでも使え、初期値を代入することもできます。
戻り値があるときだけreturn文を使います。
定義文の行末はコロン”:”で終えます。
関数内部の実行文は字下げ(イデント)します。
メイン部
関数定義の後に記述する部分がメイン実行文です。
メイン部で永久ループするときは、while true文を使います。
 
Pythonは複数の要素で構成されたデーターを定義する2つの方法があります。
(1)List(リスト)
複数の要素で構成されたデータ列をひとつの値として扱うことができる。「 [ ]でまとめて初期化定義したデータ群をListと呼ぶ。
Data = [data1, data2, data3,・・・・]   #データ1は0番目のデータ
Data[1]のようにインデックスで指定すると値を取り出せる。
 
List(リスト)として定義されたDataがあるとき、次のメソッドを利用できる
①Listに値を追加
●メソッド1  Data.append(data) : Listの最後に追加。
●メソッド2  Data. insert(n , data) : Listのn番目に追加。nは0から始まりnが0のときは最初に追加。
②Listからデータを削除
●メソッド1  Data. remove(data) :指定したdataを削除する。最初に見つかったものだけ削除。
●メソッド2  Data.pop(n) : n番目のデータを削除して値を返す。nがないときは最後のデータを削除。
③List内のデータの個数や位置を調べる
●メソッド1  Data.count(data): 戻り値でdataが出現する回数を返す。
●メソッド2  Data.index(data): dataが最初に見つかった位置を返す。
(2)Dict(ディクショナリ)
Dictは key : dataという構成のデータ列を{}(中かっこ)でくくるデータ塊の定義関数で、次のように定義する。
Dict = {key1 : data1, key2:data2,key3:data3・・・・}
記述
Dict = {’Mon’ : 5, 'Tue':6,'Wed':7 ,'Thu' :8 ,'Sat':9 ,'Sun':10}
keyの項目を利用して値を取り出したり変更したりできる。
①値を取り出す
Dict1.get(, )  //keyに対応する値を返す。keyが無い時はdefalt値を返す。
Dict1.get('Sun', 'notfound')
②値を追加する
Dict1[key1] = data1  //key1 : data1という値をDict1に追加する
Dict ['Sun'] = 11  //Dict1に'Sun' : 11という値を追加する
③値を削除
del  Dict1 ['Wed]    //「'Wed':7」を削除する
④keyの項目だけを取り出す
print Disk1.keys( )
⑤for文のインデックスとしてkeyを使う
インデックスの”i”にkeyの値が順番に」適用されてすべてのkeyが順番に出力されます。
for  i in Dict1:
制御文(if文 while文 for文)の記述
①if文
 if    条件式:
    実行文
 elif 条件式:
    実行文
 else :
   実行文
elif以降は必要がないときはなくてもよい
条件式やelseの最後には”:コロン”が必要
条件式に使える比較用演算子 <,> = = ,!=, >=, <=
複数の条件式の論理積はandで、論理和はorで結合できる。
②for文
for in range(count) :
行末に”:”コロンが必要
while文の内部の実行文は字下げ
"in"の後ろに記述するループ対象オブジェクトの1要素がvalue変数に毎ループ入る
rangeオプションを使うとcountで回数を制限できる
range以降はなくてもよい
③While文
while  条件式:
  実行文
条件式の後に:コロンが必要
While文の内部の条件式は字下げ
④print文
print ”文字列:フォーマット”%
フォーマット部に代入する変数 
%s:文字列 %d :数値
出力先はターミナル
 
 
 
 
ラズベリーパイのパイはパイソンのパイ。プログラム言語にパイソンが推奨されています。シェルコマンドと同様にコマンド一行入力⇒即実行⇒結果が帰ってくるプログラム言語のひとつです。
シェルスクリプトと同様に複数の命令を記述したファイルを作って一気に実行できます。このパイソンのファイルをモジュールと呼び、複数のモジュールをまとまたものをパッケージと呼びます。
Thonnyの起動
デスクトップのメニューアイコン⇒プログラミング⇒Thonny Python IDEをクリック。
 
 
 
 
 
シェルスクリプトとはテキストファイルに書かれたコマンド列のこと
一連のコマンドが書かれたファイルを作り一括実行できます。テキストファイルの拡張子は.shです。このテキストファイルをターミナルから呼び出すと、たくさんのコマンドが一気に実行されます。このとき、シェルはインタープリタとして機能します。
シェルスクリプトの記述方法
基本ルール
①スクリプトの先頭行に " # ! / bin / sh "と記述
②コメント行の先頭に" # "を付ける
③表示出力にはechoコマンドを使う
    例  
          #!/bin/sh
          echo  "Hello World"
④変数には任意の文字列が使え、数値や文字列を代入できる
 例
   変数=データー 
   "="の前後にスペースを入れてはいけない
   変数の内容を参照するときは変数の前に"$"を付加する。これが付加されないと単なる文字列になる。
⑤計算式は"$(( 式 ))"と記述
 例
   z=$(( x+y ))
⑥キーボードからの入力を読み込ませるときはreadコマンドを使う
 例 read -p 'Input Data = ' data
          これは「プロンプトtp"Input Data = "を出力したあと入力を待ち、入力データーは変数dataに代入される」という意味です。
if文を使う
①構文の基本形
条件式の記述に[ ]コマンドを使う” [ "の前後にスペースが必要
if [ 条件式 ] :then
 コマンド・リスト 条件成立時に実行する内容
else
 コマンド・リスト 条件成立時に実行する内容
fi  if文の終了
②条件式の書き方
条件式に使うコマンド 前後にスペースが必要
文字列を比べる
 = :文字列が等しい
!= :文字列が等しくない
数値を比べる
 -eq :等しい
 -gt  :より大きい
 -ge :以上
 -lt  :より小さい
 -le :以下
 -ne :等しくない
③条件式に使う比較演算子の書き方  パラメーターの前後にスペースが必要
-n :文字列が空白ではない。
-z :文字列が空白である。
-d :ファイルが存在しかつディレクトリーである。
-e :ファイルが存在する。
-f :ファイルが存在しかつ通常ファイルである。
-s :ファイルが存在しかつ空ではない。
④複数式の論理和や論理積の書き方
● -a :論理積AND
記述例 ["$data" -gt 5 -a "$data" -lt 12]
● -o :論理和OR
記述例 ["$data" -lt -10 -o "$data" -gt 10]
case文を使う
①構文の基本形
各パターンの場合のコマンド・リストの最後は ”;;” で終わってcase文から抜け出す。
    case 式 in 条件を指定
    (パターン1)
                 コマンド・リスト;; パターン1の場合に実行する内容
    (パターン2)
     コマンド・リスト;; パターン2の場合に実行する内容
     ・・・
     esac     case文の終わり
②パターンの書き方
* :文字列すべての合致 *aはaから始まる文字列という意味
? :1文字に合致
[...]:...のいずれか1文字に合致
[a-z]:aからzのいずれかに合致
[!...]:...の文字以外の文字に合致
for文を使う
①構文の基本形
in 以下はオプションです。
in 以下の値がある場合は、値を順次代入して繰り返す。
in 以下がない場合は、変数に含まれる値を順次代入し最後の値まで繰り返す。
for 変数 in 値1 値2 値3... 値n 条件を指定do
コマンド・リスト;; 繰り返し実行する内容 done
while文を使う
①構文の基本形
条件文の書式はifと同じ
whileとuntilでは条件の真偽が逆
   while(またはuntil) [条件式]
          do
          コマンド・リスト  条件の真偽を変えるコマンドが必要
   done
②永久ループの書き方
”:”もヌルコマンドなので前後にスペースが必要。
永久ループを抜け出すときはbreakを使う。
   while : 
          do
          コマンド・リスト
   コマンド・リスト
   done
           
 
 
 
 
 
 
ディレクトリー操作コマンド
ls (エルエス)
listingの略であり、カレントディレクトリの内容を一覧表示する。このコマンドには引数としてディレクトリを指定することもできる。例えば、ls/homeと入力すると、カレントディレクトリに関係なく、/homeの内容が一覧表示される。Windowsのdirコマンドに相当する。
cd(シーディー)
change directoryの略で、ファイルシステム内を移動するためのコマンド。cdと入力すると、ホームディレクトリに戻る。引数として移動先のディレクトリへのパス(道順)を指定すると、そのディレクトリに移動する。ディレクトリパスとして絶対パスか相対パスのどちらかを指定できる。たとえば、cd bootはカレントディレクトリの下にあるbootディレクトリに相対パスで移動するが、cd /bootはカレントディレクトリに関係なく、/bootディレクトリに絶対パスで移動する。
pwd(ピーダブルディー)
カレントディレクトリーを表示
mv(エムヴイ)
Linuxのmvコマンドには2つの目的がある。ひとつは、ファイルを別のディレクトリに移動することであり、もうひとつは、ファイルの名前を変更することである。2つ目の機能は筋つがいに思えるかもしれないが、Linux環境では、ファイルをある名前から別の名前に移動すると解釈される。このコマンドは 
 mv <現状のファイル名><新しいファイル名 >形式で実行される。
rm(アールエム)
removeの略で、引数として指定されたファイルまたは一連のファイルを削除する。Windowsのdel コマンドに相当する。どちらの場合も、正しいファイルが削除されるように注意しなければならない。
rmdir(アールエムディーアイアール)
通常rmだけではディレクトリを削除できない。このため、rmを使ってファイルが削除された後のディレクトリを削除するために、rmdirが使用される。
mkdir(エムケイディーアイアール)
rmdirの逆で、新しいディレクトリを作成する。たとえば、ターミナルにmkdir myfolder と入力すると、カレントディレクトリにmyfolderという名前の新しいサブディレクトリが作成される。cdと同様に、引数として指定するディレクトリパスは絶対パスか、相対パスかのどちらかになる。
 
システム制御コマンド
sudo shutdown
記述方法
sudo shutdown [-h|-r][-fqs][now|hh:ss|+mins][message]
-h:システムをシャットダウン
-r :システムを再起動
-f :再起動の際、ファイルシステムのチェックを行わず高速起動
-q :メッセージを表示しない
now :すぐにシャットダウンか再起動
hh:ss :時間指定
+mins :指定分後にシャットダウンか再起動
message :シャットダウン/再起動時に表示するメッセージ
sudo reboot システム再起動
 
アプリケーションをインストールするコマンド
sudoコマンド
管理者権限でコマンドを実行
sudo apt-get install xrdp
apt-getコマンド
コンパイル済のバイナリと関連ファイルの一式(パッケージ)をダウンロードしてインストールしたりアップデートしたりできます。指定されたパッケージが存在するサーバーに問い合わせ、ほしいパッケージをダウンロードしてインストールする一連の処理を自動的に実行します。このとき、動作に必要な依存関係にアルパッケージも自動的に入手インストールします。システムに導入済のパッケージのアップデートもできます。
記述方法
apt-get (オプション)(コマンド)(パッケージ名)
オプション
-y :問い合わせにはすべて「y」と答える
使用できるコマンド
update :サーバーから最新のパッケージリストを入手
upgrade :パッケージを最新にする
remove :パッケージをアンインストールする
clean :キャッシュ・ファイルを削除
wgetコマンド
URLで指定したファイルをダウンロードします。指定したFTPサーバーやWebサーバーから希望のファイルをダウンロードします。
記述方法
sudo wget (URL)
例 sudo wget http://w.vmeta.jp/temp/km-0411.ini
tarコマンド
ファイルをtar. gz. tgz拡張子のファイルに書籍化(アーカイブ)したり展開したりします。
記述方法
tar(オプション)(アーカイブ先)(アーカイブ元)
例 tar xzvf aquestalkpi-2013827.tgz
オプション
c :書庫を新規作成
v :実行結果を表示
z :zipとしてアーカイブ
t :アーカイブ内容を表示
x :アーカイブからファイルを抽出
f :指定されたファイルにアーカイブデーターを出力
k :展開するとき同名ファイルやディレクトリーがあるときは警告して中止
 
 
 
 
 
 
ラズベリーパイのターミナルアプリケーションはラズベリーパイのデスクトップに置かれています。
起動すると次のように見えます。
ターミナルを起動して現れるメッセージをプロンプト(prompt)と呼びます。
ユーザー名@ホスト名:カレントディレクトリー$
$は一般ユーザー権限であることを示しています。
#が表示されていたらルートの管理者権限です。
 
権限のレベルは、
    ● root(管理者)
    ● 一般ユーザー の2種類だけです。
rootはLinuxシステムの全てを扱うことができます。常時root権限で使っていると外部から侵入される可能性があります。通常は一般ユーザー権限で利用できるようになっています。一般ユーザーが一時的にroot権限を利用するコマンドがsudoです。これはsuperuser doの略です。
Linuxはファイルアクセス権限の与えられ方がWindowsとは異なります。何も指定しないで作られたファイルをコントロールでのは製作者だけです。製作者以外は読み取りしかできません。ファイルのアクセス権限はシェルコマンドを使って指定できます。
    ● r :読み取り
    ● w:書き込み
    ● x :実行