RasPiのLEDをボタンで操作

先週買ったRasPiの部品が到着したので試してみる。

一番簡単そうなアドオンボードから試す。

 

まず、RasPiのGPIOピン部分に触るにはカバーが邪魔なので
カバーの天板部分だけを外した。

RasPiのカバー天板を外した

 

アドオンボードをどのピンに差したら良いか分からなかったが
取付例の写真の通り端から差した。

取付例

 

まず緑のLEDを光らせるべく調べてみた。

購入したアドオンボードの
GPIOポート対応表はこれ。

GPIOポート対応表

 

参考にしたのはこちらのサイト。

Raspberry PiのGPIO制御方法を確認する(GPIO制御編その1)

 

分かりやすく説明されているので下に引用する。

1. GPIOピンを使うよ!って宣言する
例えばGPIO18ピンを使う場合、仮想ファイルの/sys/class/gpio/exportにGPIOの番号を書き込みます。これを行うことにより、/sys/class/gpio/ディレクトリにGPIO18ピン制御に必要な仮想ファイルが生成されます。具体的には次のセクションで詳しくみてみます。

2. 使う宣言をしたGPIOピンが入力なのか出力なのか指定する
(1)で使う宣言したGPIOピンが入力なのか出力なのか指定します。

3. GPIOを制御する
これでやっとGPIOの制御ができるようになります。GPIO18ピンであれば、/sys/class/gpio/gpio18/valueに0(ゼロ)か1(いち)を書き込みます。

4. GPIOピンを使い終わったよ!って宣言する
GPIOピンの制御が終わったら使い終わったよ、って教えてあげます。

 

まず /sys/class/gpio でlsを打ってみる。

GPIOディレクトリの中身

 

このexportに使いたいGPIOの番号をechoで書き込む。
するとgpio*というディレクトリができている。

exportにGPIO番号を書き込む

 

そのディレクトリの中身はこんな感じ。

gpio*ディレクトリの中身

 

catコマンドでdirectionの中身を見ると
デフォルトではin(出力)となっている。

このdirectionに、先程exportに書き込んだのと同じように
echoで入力か出力かを書き込む。
今回はLEDを光らせるのでout(出力)を書き込む。

directionにoutを書き込む

 

この状態でvalueに1を書き込めばLEDが光る。
いまのvalueの中身は0だ。

valueの中身

 

echoでvalueに1を書き込む。

valueに1を書き込む

 

無事にLEDが光った。

緑のLEDが光った

 

valueに0を書き込めばLEDは消える。

valueに0を書き込む

 

もうGPIOピンを使わないのであれば
最初に使ったexportではなく、unexportにechoで番号を書き込む。
すると、使っていたgpio*ディレクトリが消える。

unexportに番号を書き込む

 

同じ要領でGPIOピン番号を変えて試してみると、違うLEDを光ったし、
ブザーも変な音だったが一応鳴った。

緑以外のLEDを光らせた

 

ボタンの場合は入力になるので、
directionにはoutを書き込まずデフォルトのinのままで良い。

ボタンを押してない時のvalueは0で、
ボタンを押している時にvalueを見ると1になっている。

ボタン(入力)の場合

 

続いて、パーツを買ったWebサイトに記載されている
サンプルのコードを試しに実行してみた。

#!/bin/sh

## GPIO設定
LG1=4
LG2=17
LY1=22
LY2=10
LR1=9
LR2=11
BTN=7
BUZ=8
LEDS="$LG1 $LG2 $LY1 $LY2 $LR1 $LR2"
LEDSR="$LR2 $LR1 $LY2 $LY1 $LG2 $LG1"

## サブルーチン
beep1() {
  gpio -g write $BUZ 1 ; sleep 0.03 ; gpio -g write $BUZ 0 ; sleep 0.02
}
beep2() {
  gpio -g write $BUZ 1 ; sleep 0.2 ; gpio -g write $BUZ 0 ; sleep 0.2
}
led() {
  gpio -g write $1 $2
}

## 初期化
for io in $LEDS $BUZ ; do
  gpio -g mode $io out
  led $io 0
done
gpio -g mode $BTN in

## メイン
beep1
beep1
while true ; do
  btnstat=`gpio -g read $BTN`
  if [ $btnstat -eq 1 ] ; then
    beep2
    for i in 1 2 ; do
      for io in $LEDS; do led $io 1; sleep 0.1; done
      for io in $LEDSR; do led $io 0; sleep 0.1; done
      beep1
    done
    for i in 1 2 ; do
      for io in $LEDSR; do led $io 1; sleep 0.1; done
      for io in $LEDSR; do led $io 0; sleep 0.1; done
      beep1
    done
    sleep 1
  fi
  sleep 0.1
done

 

WiringPiというライブラリ使用が前提のようなので
下記ページを参考にしてインストールをした。

Raspberry PiのGPIO制御方法を確認する(GPIO制御編その2)

 

sudo apt-get install libi2c-dev
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

WiringPiのインストールに特に問題はなかった。

 

では、参考サイトのサンプルコードを試してみる。

まずtouchコマンドでsample.shというファイルを作ってから
viでsample.shにコードをコピペする事にした。

sample.shを作成

 

viはあまり詳しくないが、
i で現在のカーソル位置から挿入、
shift + insert でペースト。

shift + insert

続いてescを押してから、:wq で保存して終了でできた。

 

sample.shのパーミッションに実行権限をつけたいので
chmod 700 sample.sh
してから
./sample.sh で実行。

./sample.shで実行

 

すると、参考サイトの動画どおりに
ボタンを押すとLEDが光り、ブザーがなった。

 

Ctrl+Cでsample.shを終了させると、
ボタンを押しても反応しなくなった。

ctrl + Cでsample.shを終了

 

サンプルコードの実行は以上。

長くなってきたので一旦ここまでにする。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です