桐生高校SSH
プログラミング講座(アナログ信号編）

1

センサの出力信号
１

0か１のみ（第1回、第2回の講座で行った）

数値が変化

0
ディジタル信号（コンピュータが直接扱える）

アナログ信号（コンピュータが直接扱えない）
2

照度センサ（Cdsセル）の接続 ※センサが3.3V仕様のものがあるため、必ず3.3Vに接続

1.5k

1.5k
アノード

GND

カソード

3.3V

3

照度センサ（Cdsセル）の接続 ※センサが3.3V仕様のものがあるため、必ず3.3Vに接続

1.5k

[確認]
照度センサを手で覆い被せてみよう。

1.5k

GND

3.3V

LEDに加わる電圧が変化
照度センサ

アナログ信号
4

Raspberry Pi仕様
GPIO
アナログ信号を扱えない

I2C通信
シリアル通信ディジタル出入力（0 or 1の信号）
5Output value

アナログ信号からディジタル信号への変換
Analog signal

Digital signal

Time
アナログ信号（センサの出力電圧）
連続信号

変換が必要

AD変換器

ディジタル信号（コンピュータが扱える）
離散信号

6AD変換器(MCP3208)

12ビットAD変換器

MCP3008
名称
1CH02CH13CH24CH35CH46CH57CH68CH79
DGND
10CS/SHDN
11Din
12Dout13
CLK
14AGND
15
Vref
16
Vdd

役割
アナログ電圧入力
アナログ電圧入力
アナログ電圧入力
アナログ電圧入力
アナログ電圧入力
アナログ電圧入力
アナログ電圧入力
アナログ電圧入力
デジタルGND
チップセレクト/シャットダウン
シリアルデータIN
シリアルデータOUT
シリアルクロック
アナログGND
リファレンス電圧
電源電圧 (+2.7〜5.5V)
7

AD変換器の接続
MCP32088AD変換器の接続

AD信号※センサが3.3V仕様のものがあるため、必ず3.3Vに接続

０１２３４５６７

3.3V
GND

3.3V
GPIO11

GPIO9GND

GPIO10
GPIO89AD変換器への接続とソフトウェア（１）Analog_ADの中のad_3208_ch1.pyを利用します。
ch0[確認]
照度センサを手で覆い被せたときの出力値の変化を見てみよう。
10

ad_3208_ch1.py
from gpiozero import MCP3208
from time import sleep
data = []Max=4096 #12bit : 2^12=4096
count=0
for i in range(1): # Number of channel
data.append(MCP3208(channel=i))while True:
ch_0=int(Max* data[0].value)
print(count, ch_0)
sleep(0.05) #Sampling speed
count+=1

11

LEDの点灯への反映
GPIO17

ON-OFFの境界（しきい値）を決定しましょう。

270アノード
カソードGND[課題] 照度センサを手で覆うとLEDが点灯するプログラムを作成しましょう。

12圧力センサ

1.5k

GND

ターミナルから
cd Desktop
cd Analog_AD

1.5k3.3V※AD変換器（MCP3208）の周辺回路はそのままにします。
※照度センサと同じ位置に圧力センサを接続してください。

※ワニ口クリップを活用しましょう。
13

3.3V GND 3.3V

加速度センサX Y ZGNDch0X

ch1ch2

YZ[確認] ad_3208_ch1. pyを利用して、入力チャンネルを3つにしよう。
14

GND 3.3V Vout

紫外線センサの接続

ch0[確認]ad_3208_ch1. pyを利用して、紫外線の有無による値の変化を見てみよう。
15

センサの出力信号(1) 圧力センサ(2) 加速度センサ(3) 紫外線センサ
ch03.3V GND 3.3VGND

3.3VVout

X Y Z
ch0ch0

GND 3.3VGND
16

計測値の大きさでLEDの点灯を制御（ヒント）例えば、消灯（力を加えていない）が600、少し力を加えるときを500以上、さらに力を加えるときを500未満とすれば、※3段階の場合If value1 > =600: ※条件1
if value1 > =600:
print(“力を加えていない”)
print(“力を加えていない")
elif value1>=500: ※条件2
elif value1>=550:
print(“弱い”)
print(“弱い")
else:
※条件3
elifvalue1>=500:
print(“強い")print(“普通")条件1else:条件2
条件3
print(“強い")
500

600

17

圧力センサ（1個）

18

圧力センサ（3個）

19

色センサ

20

RCサーボモータ

RCサーボ
外部からの信号に応じて、一定の角度まで回転する小型モータ
用途
ロボットの関節、ラジコン飛行
機の翼の角度制御など

21

PWM制御22

PWM制御23

PWM制御によるLED

pwm_led.py
GPI23

GND
GPI23

24

pwm_led.py

import RPi.GPIO as GPIO
import time
import sys

Led_pin = 23
GPIO.setmode(GPIO.BCM)
GPIO.setup(Led_pin, GPIO.OUT)
Led = GPIO.PWM(Led_pin, 50)
Led.start(0)bright = 0
flag=0while True:
try:
Led.ChangeDutyCycle(bright)
time.sleep(0.01)
if flag == 0:
bright +=1
else: bright -= 1
if bright >= 100:bright = 100
flag=1elif bright <=0:bright = 0
flag=0except KeyboardInterrupt:
Led.stop()
GPIO.cleanup()
sys.exit()

25

RCサーボモータの説明書
黄色→GPIO4赤色→５V
茶色→GND26

rc.pyrc2.pyRCサーボモータ
コード色
茶線
赤線
オレンジ（黄色）役割
GND（0V）
電源+（5V）
信号線

黄色→GPIO4赤色→５V
茶色→GND27

rc.pyimport RPi.GPIO as GPIO
import time
import sys

Led_pin = 23
GPIO.setmode(GPIO.BCM)
GPIO.setup(Led_pin, GPIO.OUT)
Led = GPIO.PWM(Led_pin, 50)
Led.start(0)bright = 0
flag=0while True:
try:
Led.ChangeDutyCycle(bright)
time.sleep(0.01)
if flag == 0:
bright +=1
else: bright -= 1
if bright >= 100:bright = 100
flag=1elif bright <=0:bright = 0
flag=0except KeyboardInterrupt:
Led.stop()
GPIO.cleanup()
sys.exit()

rc2.pyimport RPi.GPIO as GPIO
import time
import sys
Servo_pin = 4
GPIO.setmode(GPIO.BCM)
GPIO.setup(Servo_pin, GPIO.OUT)
Servo = GPIO.PWM(Servo_pin, 50)
Servo.start(0)def servo_angle(angle):
duty = 2.5 + (12.0 - 2.5) * (angle +90) / 180
Servo.ChangeDutyCycle(duty)
time.sleep(0.1)
while True:try:
servo_angle(0)servo_angle(90)servo_angle(0)servo_angle(-90)
servo_angle(0)except KeyboardInterrupt:Servo.stop()
GPIO.cleanup()
sys.exit()

28

rc.py ポイント
while True:
try:
Servo.ChangeDutyCycle(2.5) #デューティ比[2.5%] = -90°
time.sleep(0.5)#0.5秒間待つ
Servo.ChangeDutyCycle(7.25) #デューティ比[7.25%] = 0°
time.sleep(0.5)#0.5秒間待つ
Servo.ChangeDutyCycle(12) #デューティ比[12%] = +90°
time.sleep(0.5)#0.5秒間待つ
except KeyboardInterrupt: #Ctrl+Cキーが押された
Servo.stop()#サーボモータをストップ
GPIO.cleanup()#GPIOをクリーンアップ
sys.exit()#プログラムを終了
29

ソース rc2.py#必要なモジュールをインポート
import RPi.GPIO as GPIO
#GPIO用のモジュールをインポート
import time
#時間制御用のモジュールをインポート
import sys#sysモジュールをインポート#ポート番号の定義
Servo_pin = X#変数"Servo_pin"にXを格納

GPIOをポート番号で扱う方法に設定#GPIOの設定
GPIO.setmode(GPIO.BCM)#GPIOのモードを"GPIO.BCM"に設定
GPIO.setup(Servo_pin, GPIO.OUT)#GPIO Xを出力モードに設定#PWMの設定#サーボモータSG90の周波数は50[Hz]#GPIO.PWM(ポート番号, 周波数[Hz])Servo = GPIO.PWM(Servo_pin, 50)30

ソース rc2.pyServo.start(0)#Servo.start(デューティ比[0-100%])#角度からデューティ比を求める関数
def servo_angle(angle):
duty = 2.5 + (12.0 - 2.5) * (angle + 90) / 180#角度からデューティ比を求める
Servo.ChangeDutyCycle(duty) #デューティ比を変更
time.sleep(0.3)#0.3秒間待つ[2.5%] = -90°
[7.25%] = 0°[12%] = +90°
31

ソース rc2.py#while文で無限ループ#サーボモータの角度をデューティ比で制御#Servo.ChangeDutyCycle(デューティ比[0-100%])
while True:try:
servo_angle(-90)#サーボモータ -90°
servo_angle(-60)#サーボモータ -60°
servo_angle(-30)#サーボモータ -30°
servo_angle(0)#サーボモータ 0°
servo_angle(30)#サーボモータ 30°
servo_angle(60)#サーボモータ 60°
servo_angle(90)#サーボモータ 90°
except KeyboardInterrupt:#Ctrl+Cキーが押された
Servo.stop()#サーボモータをストップ
GPIO.cleanup()#GPIOをクリーンアップ
sys.exit()#プログラムを終了

32