シェルスクリプトマガジン

特集1 ラズパイで電子回路の作成と制御(Vol.60掲載)

著者:麻生二郎

 電子回路を触ってみたい、作ってみたい、制御してみたいと思ったときに、人気の小型コンピュータボード「Raspberry Pi」(ラズパイ)と組み合わせるのが意外と簡単です。本特集では、市販のモジュールと、ラズパイを使って電子回路
の作成や制御を素早く実現する方法を紹介します。

シェルスクリプトマガジン Vol.60は以下のリンク先でご購入できます。

図5 制御プログラム(bme280_sensor.py)

#!/usr/bin/env python3

import smbus2
import bme280
i2c = smbus2.SMBus(1)

data = bme280.sample(i2c, 0x76)
print('気温 :' + str(round(data.temperature, 1)) + '度')
print('湿度 :' + str(round(data.humidity, 1)) + '%')
print('気圧 :' + str(round(data.pressure, 1)) + 'hPa')

図8 制御プログラム(atd1602_lcd.py)

#!/usr/bin/env python3

from lcd_st7032 import ST7032

lcd = ST7032()
lcd.write("Shellscript")
lcd.setCursor(1, 0)
lcd.write([0xbc, 0xaa, 0xd9, 0xbd, 0xb8, 0xd8, 0xcc, 0xdf, 0xc4])

図11 制御プログラム(bh1750_sensor.py)

#!/usr/bin/env python3

import smbus2
from i2csense.bh1750 import BH1750

bus = smbus2.SMBus(1)
sensor = BH1750(bus)

sensor.update()
print(sensor.light_level)
print(sensor.current_state_str)

図14 制御プログラム(rain_sensor.py)

#!/usr/bin/env python3

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)

try:
  while True:
    rain = GPIO.input(17)
    if rain == 0:
      print("雨が降り始めました")
      GPIO.cleanup()
      break
except KeyboardInterrupt:
  GPIO.cleanup()

図17 制御プログラム(fire_sensor.py)

#!/usr/bin/env python3

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)

try:
  while True:
    fire = GPIO.input(17)
    if fire == 0:
      print("火災が発生しました")
      GPIO.cleanup()
      break
except KeyboardInterrupt:
  GPIO.cleanup()

図20 制御プログラム(pir_sensor.py)

#!/usr/bin/env python3

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)

try:
  while True:
    pir = GPIO.input(17)
    if pir == 1:
      print("人が侵入しました")
      GPIO.cleanup()
      break
except KeyboardInterrupt:
  GPIO.cleanup()

図26 制御プログラム(doorphone.py)

#!/usr/bin/env python3

from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)

try:
  for i in range(0,3):
    GPIO.output(17, GPIO.HIGH)
    GPIO.output(17, GPIO.LOW)
    sleep(2)
except KeyboardInterrupt:
  GPIO.cleanup()

図28 制御プログラム(sound_sensor.py)

#!/usr/bin/env python3

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)

try:
  while True:
    if GPIO.wait_for_edge(17, GPIO.RISING):
      print("指パッチン!")
      GPIO.cleanup()
      break
except KeyboardInterrupt:
  GPIO.cleanup()

図31 制御プログラム(soil_sensor.py)

#!/usr/bin/env python3

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)

try:
  while True:
    rain = GPIO.input(17)
    if rain == 1:
      print("水分量が足りません")
      GPIO.cleanup()
      break
except KeyboardInterrupt:
  GPIO.cleanup()

図34 制御プログラム(slope_sensor.py)

#!/usr/bin/env python3

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)

try:
  while True:
    if GPIO.wait_for_edge(17, GPIO.FALLING):
      print("傾きました")
      GPIO.cleanup()
      break
except KeyboardInterrupt:
  GPIO.cleanup()

図38 制御プログラム(distance_sensor.py)

#!/usr/bin/env python3

import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(27, GPIO.OUT)
GPIO.setup(17, GPIO.IN)

GPIO.output(27, GPIO.LOW)
time.sleep(0.3)
GPIO.output(27, GPIO.HIGH)
time.sleep(0.00001)
GPIO.output(27, GPIO.LOW)

try:
  while GPIO.input(17) == 0:
    palse_start = time.time()
  while GPIO.input(17) == 1:
    palse_end = time.time()
  palse_width_time = palse_end - palse_start
  distance = palse_width_time * 1000000 / 58
  print("距離は {0} cmです".format(distance))
  GPIO.cleanup()
except KeyboardInterrupt:
  GPIO.cleanup()

図42 制御プログラム(music_box.py)

#!/usr/bin/env python3

from time import sleep
import RPi.GPIO as GPIO
import sys

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)

for _ in range(args):
  GPIO.output(17, GPIO.HIGH)
  sleep(0.01)
  GPIO.output(17, GPIO.LOW)
  sleep(0.05)
GPIO.cleanup()