📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
149行目: 149行目:
<br><br>
<br><br>


== RPi.GPIOを使用したサンプルコード ==
== LEDの点滅 ==
  <syntaxhighlight lang="python">
  <syntaxhighlight lang="python">
# Import necessary modules
  import RPi.GPIO as GPIO
  import RPi.GPIO as GPIO
  import time
  import time
   
   
  # Set up GPIO pins
  # 共通のセットアップ
  GPIO.setmode(GPIO.BCM)
  GPIO.setmode(GPIO.BCM)
  GPIO.setwarnings(False)
  GPIO.setwarnings(False)
   
   
# GPIO18にLEDを接続
# 1秒間隔で点滅
def basic_led_control():
    LED_PIN = 18
    GPIO.setup(LED_PIN, GPIO.OUT)
    try:
      while True:
          GPIO.output(LED_PIN, GPIO.HIGH)
          time.sleep(1)
          GPIO.output(LED_PIN, GPIO.LOW)
          time.sleep(1)
    finally:
      GPIO.cleanup()
</syntaxhighlight>
<br><br>
== PWMによるLEDの調光制御 ==
以下の例では、LEDの明るさを段階的に変化させている。<br>
<br>
  <syntaxhighlight lang="python">
import RPi.GPIO as GPIO
import time
# 共通のセットアップ
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# GPIO18にLEDを接続
# 徐々に明るく、徐々に暗くなる
def pwm_led_control():
    LED_PIN = 18
    GPIO.setup(LED_PIN, GPIO.OUT)
    pwm = GPIO.PWM(LED_PIN, 100)  # 100Hz
    pwm.start(0)
    try:
      while True:
          # 明るくする
          for duty in range(0, 101, 5):
            pwm.ChangeDutyCycle(duty)
            time.sleep(0.1)
          # 暗くする
          for duty in range(100, -1, -5):
            pwm.ChangeDutyCycle(duty)
            time.sleep(0.1)
    finally:
      pwm.stop()
      GPIO.cleanup()
</syntaxhighlight>
<br><br>
== デジタル入出力 ==
以下の例では、プッシュボタンを使用してデジタル入出力を行っている。<br>
<br>
<syntaxhighlight lang="python">
import RPi.GPIO as GPIO
import time
# 共通のセットアップ
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# GPIO18にLED、GPIO23にボタンを接続
# プッシュボタンを押下している間だけLEDが点灯
def button_led_control():
    LED_PIN    = 18
    BUTTON_PIN = 23
    GPIO.setup(LED_PIN, GPIO.OUT)
    GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    try:
      while True:
          button_state = GPIO.input(BUTTON_PIN)
          GPIO.output(LED_PIN, not button_state)  # プルアップなので論理を反転
          time.sleep(0.1)
    finally:
      GPIO.cleanup()
</syntaxhighlight>
<br><br>
== 割り込みカウンタ ==
以下の例では、プッシュボタンを押下して、リアルタイムでイベント検出している。<br>
<br>
<syntaxhighlight lang="python">
import RPi.GPIO as GPIO
import time
# 共通のセットアップ
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# GPIO23にボタンを接続
# ボタンが押されたときにカウントアップ
def interrupt_counter():
    BUTTON_PIN = 23
    counter = 0
    def button_callback(channel):
      nonlocal counter
      counter += 1
      print(f"ボタンが押されました!カウント: {counter}")
    GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callback=button_callback, bouncetime=200)
    try:
      while True:
          time.sleep(0.1)
    finally:
      GPIO.cleanup()
</syntaxhighlight>
<br><br>
== 超音波センサ (HC-SR04) での距離測定 ==
以下の例では、タイミング制御と距離計算を行い、測距している。<br>
<br>
<syntaxhighlight lang="python">
import RPi.GPIO as GPIO
import time
# 共通のセットアップ
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# TRIG_PIN: GPIO18
# ECHO_PIN: GPIO24
def ultrasonic_distance():
    TRIG_PIN = 18
    ECHO_PIN = 24
    GPIO.setup(TRIG_PIN, GPIO.OUT)
    GPIO.setup(ECHO_PIN, GPIO.IN)
    def measure_distance():
      GPIO.output(TRIG_PIN, GPIO.HIGH)
      time.sleep(0.00001)
      GPIO.output(TRIG_PIN, GPIO.LOW)
      while GPIO.input(ECHO_PIN) == 0:
          pulse_start = time.time()
      while GPIO.input(ECHO_PIN) == 1:
          pulse_end = time.time()
      pulse_duration = pulse_end - pulse_start
      distance = pulse_duration * 17150  # 音速から距離を計算
      return round(distance, 2)
    try:
      while True:
          dist = measure_distance()
          print(f"距離: {dist}cm")
          time.sleep(1)
    finally:
      GPIO.cleanup()
</syntaxhighlight>
<br><br>
== サーボモータ制御 ==
以下の例では、PWMを使用したサーボモータを角度制御している。<br>
<br>
<syntaxhighlight lang="python">
import RPi.GPIO as GPIO
import time
# 共通のセットアップ
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# GPIO18にサーボモータを接続
# 0度から180度まで往復
def servo_control():
    SERVO_PIN = 18
    GPIO.setup(SERVO_PIN, GPIO.OUT)
    pwm = GPIO.PWM(SERVO_PIN, 50)  # 50Hz
    pwm.start(0)
    def set_angle(angle):
      duty = angle / 18 + 2  # 角度をデューティ比に変換
      pwm.ChangeDutyCycle(duty)
      time.sleep(0.3)
    try:
      while True:
          # 0度から180度まで
          for angle in range(0, 181, 10):
            set_angle(angle)
          # 180度から0度まで
          for angle in range(180, -1, -10):
            set_angle(angle)
    finally:
      pwm.stop()
      GPIO.cleanup()
</syntaxhighlight>
<br><br>
== その他の使用例 ==
以下の例では、設定された回数だけ暖房サイクルを繰り返している。<br>
<br>
動作の流れを以下に示す。<br>
* 暖房を45分間運転
* 20分間の休止期間
* 次のサイクルに移行
<br>
<syntaxhighlight lang="python">
# 必要なモジュールのインポート
import RPi.GPIO as GPIO
import time
# GPIOの基本設定
GPIO.setmode(GPIO.BCM)      # Broadcomのピン番号方式を使用
GPIO.setwarnings(False)      # ピンの使用に関する警告を無効化
# 制御に使用するGPIOピンの定義(17番: メイン暖房制御, 18番: 予備用)
  pins = [17,18]
  pins = [17,18]
# すべてのピンを出力モードに設定し、安全のためHIGH(オフ)に初期化
  for pin in pins:
  for pin in pins:
    GPIO.setup(pin,GPIO.OUT)
    GPIO.setup(pin, GPIO.OUT)
    GPIO.output(pin,1)
    GPIO.output(pin, 1)     # 1 = オフの状態で初期化(安全のため)
   
   
  # Set variables (change these to change behaviour as desired)
  # システムの動作パラメータ設定
  runcycles = 2
  runcycles = 2               # 暖房サイクルの実行回数
  ontime = 45 # minutes
  ontime = 45               # 暖房のON時間(分)
  offtime = 20 # minutes
  offtime = 20               # サイクル間の休止時間(分)
   
   
  # Convert run times from minutes to seconds for sleep function
  # 時間の単位を分から秒に変換(sleep関数用)
  ontime *= 60
  ontime *= 60             # ON時間を秒に変換
  offtime *= 60
  offtime *= 60             # OFF時間を秒に変換
   
   
  # Run furnace on cycle
  # メインの制御ループ
  cycle = 0
  cycle = 0                 # サイクルカウンターの初期化
  try:
  try:
    while cycle < runcycles:
    # 指定された回数のサイクルを実行
        cycle += 1
    while cycle < runcycles:
        GPIO.output(17,0)
      cycle += 1       # サイクルカウンターを増加
        print("Furnace turned on for %d seconds. Cycle %d of %d." %(ontime, cycle, runcycles))
        time.sleep(ontime)
      # 暖房をONにする(GPIO17をLOW/0に設定)
        GPIO.output(17,1)
      GPIO.output(17, 0)
        if cycle == runcycles:
      print("暖房運転開始:%d秒間 (サイクル %d / %d)"  
            break
          %(ontime, cycle, runcycles))
        print("Furnace paused for %s seconds. %s heat cycles remaining." %(offtime, runcycles - cycle))
      time.sleep(ontime)   # 指定されたON時間だけ待機
        time.sleep(offtime)
  except KeyboardInterrupt: # if Ctrl C is pressed...
      # 暖房をOFFにする(GPIO17をHIGH/1に設定)
    GPIO.output(17,1) # shut off the boiler
      GPIO.output(17, 1)
    print("Program stopped and furnace shut off.") # print a clean exit message
      # 最終サイクルの場合はループを抜ける
      if cycle == runcycles:
          break
      # 次のサイクルまでの待機時間
      print("暖房休止中:%s秒間 (残りサイクル数:%s)"  
          %(offtime, runcycles - cycle))
      time.sleep(offtime)
# キーボード割り込み (Ctrl + C) の処理
  except KeyboardInterrupt:
    GPIO.output(17, 1)   # 安全のため暖房を確実にOFF
    print("プログラムが停止され、暖房をオフにしました") # 終了メッセージを表示
   
   
  print("Heat cycles completed.")
# 完了メッセージ
  print("全てての暖房サイクルが完了しました")
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>