不惑にしてまだ何者でもない者のブログ

Arduino関連、Raspberry Pi関連、プログラミング学習

CrowPiレッスン9:超音波センサーを使用して距離情報を取得する

2020-11-07 17:18:05 | CrowPi

Getting distance information using the Ultrasonic sensor.

レッスン9"超音波センサーを使用して距離情報を取得する"をやっていく。

何を学習するか

このレッスンを終了すると、次のことができるようになります。
  • 超音波センサーを制御し、出力として距離を取得します

何が必要か

  • 初期設定後のCrowPiボード

Requires switching modules using the switch

  • いいえ

CrowPi上の超音波センサーの位置




超音波距離センサーの操作

このレッスンで使用するPythonスクリプトは以下の通り。

Examples/distance.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Author : www.modmypi.com
# Link: https://www.modmypi.com/blog/hc-sr04-ultrasonic-range-sensor-on-the-raspberry-pi

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

TRIG = 16
ECHO = 12

print("Distance Measurement In Progress")

GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)

GPIO.output(TRIG, False)
print("Waiting For Sensor To Settle")
time.sleep(2)

GPIO.output(TRIG, True)
time.sleep(0.00001)
GPIO.output(TRIG, False)

while GPIO.input(ECHO)==0:
 pulse_start = time.time()

while GPIO.input(ECHO)==1:
 pulse_end = time.time()

pulse_duration = pulse_end - pulse_start

distance = pulse_duration * 17150

distance = round(distance, 2)

print("Distance: %scm" % distance)

GPIO.cleanup()

例のごとく、GPIO.setmodeとpin番号を修正。

修正後
GPIO.setmode(GPIO.BOARD)

TRIG = 36
ECHO = 32


このスクリプトを実行すると、障害物までの距離がターミナルに表示される。


どのくらいの精度なのかは不明だけど工夫次第で色々遊べそうだな。
例えば、ぶつからないロボットカー🚙とか

CrowPiレッスン8:ーションセンサーを使用してモーションを検出する

2020-11-07 16:45:20 | CrowPi

Detect motion using the motion sensor.

レッスン8"モーションセンサーを使用してモーションを検出する"をやっていく。

What will you learn

このレッスンを終了すると、次のことができるようになります。
  • モーションセンサーから出力を取得し、CrowPiの周りの動きを検出します。

What will you need

  • 初期設定後のCrowPiボード

Requires switching modules using the switch

  • いいえ

CrowPi上のモーションセンサーの位置



感度の設定

↑プラスドライバーで感度を調節できる。

モーションセンサーの操作

このレッスンで使用するPythonスクリプトは以下の通り。

Examples/motion.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# http://elecrow.com/

import RPi.GPIO as GPIO
import time

# define motion pin
motion_pin = 23

# set GPIO as GPIO.BOARD
GPIO.setmode(GPIO.BCM)
# set pin mode as INPUT
GPIO.setup(motion_pin, GPIO.IN)

try:
while True:
if(GPIO.input(motion_pin) == 0):
print("Nothing moves ...")
elif(GPIO.input(motion_pin) == 1):
print("Motion detected!")
time.sleep(0.1)
except KeyboardInterrupt:
GPIO.cleanup()

例のごとく、GPIO.setmodeとpin番号を修正。

修正後
# define motion pin
motion_pin = 16

# set GPIO mode to GPIO.BOARD
GPIO.setmode(GPIO.BOARD)

このスクリプトを実行すると、ターミナルに"Nothingu moves ..."が表示され、モーションセンサーが動きを検出すると、"Motion detected!"が表示される。


無限ループとなるので、終了するには、CTRL+C。

CrowPiレッスン7:室温と湿度を検出する

2020-11-07 16:26:15 | CrowPi

Detect room temperature and humidity

レッスン7"室温と湿度を検出する"をやっていく。
この辺はそのまま実用できそうだな。

What will you learn

このレッスンを終了すると、次のことができるようになります。
  • DH11センサーから湿度と温度を制御および取得する方法を学習します

What will you need

  • 初期設定後のCrowPiボード

Requires switching modules using the switch

  • いいえ

CrowPi上のDH11センサーの位置



サウンドセンサーからの入力の取得

このレッスンで使用するPythonスクリプトは以下の通り。

Examples/dh11.py
import sys
import Adafruit_DHT

# set type of the sensor
sensor = 11
# set pin number
pin = 4

# Try to grab a sensor reading. Use the read_retry method which will retry up
# to 15 times to get a sensor reading (waiting 2 seconds between each retry).
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

# Un-comment the line below to convert the temperature to Fahrenheit.
# temperature = temperature * 9/5.0 + 32

# Note that sometimes you won't get a reading and
# the results will be null (because Linux can't
# guarantee the timing of calls to read the sensor).
# If this happens try again!
if humidity is not None and temperature is not None:
 print(' Temp={0:0.1f}* Humidity={1:0.1f}%'.format(temperature, humidity))
else:
 print('Failed to get reading. Try again!')

このスクリプトでもGPIOは使わないようで、代わりにAdafruit_DHTライブラリを使用するようだ。

このスクリプトを実行すると、気温と湿度がターミナルに表示される。

↑温度の単位は摂氏なのかな?華氏じゃないよね?🤔

CrowPiレッスン6:光センサーを使用して、弱い光または明るい光を検出する

2020-11-07 14:38:00 | CrowPi

Detect low or bright light using the Light sensor.

レッスン6"光センサーを使用して、弱い光または明るい光を検出する"をやっていく。

What will you learn

このレッスンを終了すると、次のことができるようになります。
  • 光センサーを使用して、弱い光と明るい光を検出する方法を学習します

What will you need

  • 初期設定後のCrowPiボード

Requires switching modules using the switch

  • いいえ

CrowPi上での光センサーの位置



↑ここの上を手で覆うと表示される値が小さくなる

光センサーの操作

このレッスンで使用するPythonスクリプトは以下の通り。

Examples/light_sensor.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Author: Matt Hawkins
# Author's Git: https://bitbucket.org/MattHawkinsUK/
# Author's website: https://www.raspberrypi-spy.co.uk
# http://elecrow.com/

import RPi.GPIO as GPIO
import smbus
import time

# Find the right revision for bus driver
if(GPIO.RPI_REVISION == 1):
 bus = smbus.SMBus(0)
else:
 bus = smbus.SMBus(1)

class LightSensor():

 def __init__(self):

  # Define some constants from the datasheet

  self.DEVICE = 0x5c # Default device I2C address

  self.POWER_DOWN = 0x00 # No active state
  self.POWER_ON = 0x01 # Power on
  self.RESET = 0x07 # Reset data register value

  # Start measurement at 4lx resolution. Time typically 16ms.
  self.CONTINUOUS_LOW_RES_MODE = 0x13
  # Start measurement at 1lx resolution. Time typically 120ms
  self.CONTINUOUS_HIGH_RES_MODE_1 = 0x10
  # Start measurement at 0.5lx resolution. Time typically 120ms
  self.CONTINUOUS_HIGH_RES_MODE_2 = 0x11
  # Start measurement at 1lx resolution. Time typically 120ms
  # Device is automatically set to Power Down after measurement.
  self.ONE_TIME_HIGH_RES_MODE_1 = 0x20
  # Start measurement at 0.5lx resolution. Time typically 120ms
  # Device is automatically set to Power Down after measurement.
  self.ONE_TIME_HIGH_RES_MODE_2 = 0x21
  # Start measurement at 1lx resolution. Time typically 120ms
  # Device is automatically set to Power Down after measurement.
  self.ONE_TIME_LOW_RES_MODE = 0x23

 def convertToNumber(self, data):

  # Simple function to convert 2 bytes of data
  # into a decimal number
  return ((data[1] + (256 * data[0])) / 1.2)

 def readLight(self):

  data =  bus.read_i2c_block_data(self.DEVICE,self.ONE_TIME_HIGH_RES_MODE_1)
  return self.convertToNumber(data)

def main():

 sensor = LightSensor()
 try:
  while True:
   print("Light Level : " + str(sensor.readLight()) + " lx")
   time.sleep(0.5)
 except KeyboardInterrupt:
  pass

if __name__ == "__main__":
 main()

光センサーは、I2Cを使うため、通常のGPIOを使用しない。

このスクリプトを実行すると、環境の明るさを検出して、照度を表す数値(lx)がターミナルに表示される。


無限ループとなるので、終了するには、CTRL+C。