ちぎっては投げるブログ

Programming, Android, RaspberryPi, Digital Devices, Kinkuma Hamster...

Raspberry PiでLEDを光らせる

denpa-shinbun.com

で買ったLEDを光らせる。

3色フルカラーSMD LEDモジュールで、RGBの各PINに0-255のアナログ値を書き込むことで色を表現する。

ところが、Raspberry Piにはアナログ出力がない。デジタル出力をPWM制御し疑似アナログ化するらしいが、今回はひとまず光らせることだけを目標とする。

RaspberryPiの設定

接続は単純に、

  • B:17
  • R:27
  • G:22
  • GND:GNDPIN

とした。

f:id:mczh:20160718181457j:plain

まず、/sys/class/gpio/exportに、書き込み用のファイルを生成する。 ここでは、17,27,22のGPIOを利用するものとして、

echo 17 > /sys/class/gpio/export
echo 27 > /sys/class/gpio/export
echo 22 > /sys/class/gpio/export

とした。

続いて、Raspberry PiのGPIOを入力に使うのか出力に使うのかを設定する。 ここでは出力なので、outに設定する。

echo out > /sys/class/gpio/gpio17/direction
echo out > /sys/class/gpio/gpio27/direction
echo out > /sys/class/gpio/gpio22/direction

最後に、出力(0or1)を設定する。

echo 1 > /sys/class/gpio/gpio17/value

これで、青色に光る。

スクリプト化

こんなファイル名を覚えておけるわけがないので、スクリプト化しておく。

#!/bin/sh

func_led_on ()
{
    echo 1 > /sys/class/gpio/gpio${1}/value
}

func_led_off ()
{
    echo 0 > /sys/class/gpio/gpio${1}/value
}

BLUE=17
RED=27
GREEN=22

echo "Conncet GPIO ${BLUE}:B."
echo "Connect GPIO ${RED}:R."
echo "Connect GPIO ${GREEN}:G."
echo "Connect GND."

sudo echo $BLUE > /sys/class/gpio/export
sudo echo $RED > /sys/class/gpio/export
sudo echo $GREEN > /sys/class/gpio/export

sudo echo out > /sys/class/gpio/gpio${BLUE}/direction
sudo echo out > /sys/class/gpio/gpio${RED}/direction
sudo echo out > /sys/class/gpio/gpio${GREEN}/direction

echo "done."

echo "Test Start."

func_led_on $BLUE
sleep 1
func_led_off $BLUE
func_led_on $RED
sleep 1
func_led_off $RED
func_led_on $GREEN
sleep 1
func_led_off $GREEN

echo "Test End."

再起動後も有効にする

これらのファイルは再起動すると削除されるようなので、/etc/rc.localに追記して起動に自動で実行されるようにする。

sudo emacs /etc/rc.local
/home/pi/tweetTenki/setupGpioForLed.sh

Raspberry Piで温度取得

denpa-shinbun.com

で購入したDS18B20を温度センサーとして用いる。

モジュール有効化

sudo modprobe w1-gpio
sudo modprobe w1-therm

内蔵プルアップ抵抗を有効にする

ここではGPIOピン4番を用いる。

sudo emacs /boot/config.txt
dtoverlay=w1-gpio-pullup,gpiopin=4

を追記し、再起動する。

認識されているか確認する

$ ls /sys/bus/w1/devices
28-0115c11746ff  w1_bus_master1

28-hogehogeがいればOK。

値の簡易確認

$ cat /sys/bus/w1/devices/28-0115c11746ff/w1_slave
80 01 4b 46 7f ff 0c 10 67 : crc=67 YES
80 01 4b 46 7f ff 0c 10 67 t=24000

t=24000が摂氏*1000した温度である。

値の切り出し

こういったファイルから特定位置の値を切り出すには正規表現が楽である。

cat /sys/bus/w1/devices/28-0115c11746ff/w1_slave | grep -o 't=[0-9]*' | grep -o '[0-9]*'

切り出し方はあまり綺麗ではない。もっと簡単にとれそうな感じもあるが・・・。ひとまずこれで値は取得できる。

BitBucket

Boxil / ds18b20_sensor / source / — Bitbucket

ピンの接続

SがValueなのでGPIOの4番に接続する。 -はGNDに接続する。 残りの真ん中が電源で3.3Vに接続する。 間違えると、センサーが高熱になってくさい臭いがし始めるので注意。

ところで、DS18B20でググるとプルアップ抵抗を繋いでいる記事が多いが、内蔵プルアップ抵抗を有効にするのでは駄目なのだろうか?電子工作の知識が足りていないのでよくわからない。

f:id:mczh:20160718185852j:plain