.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_led:
1.1 LEDの点滅
==================
**はじめに**
最初のプロジェクトへようこそ! このチュートリアルでは、Python プログラミングと GPIO ピンを使って LED を点滅させる方法を学びます。このプロジェクトは、ハードウェアとソフトウェアの連携を理解するための優れた入門編であり、シンプルなコードで現実の電子部品を制御できることを体験できます。
始める前に、まず基本を簡単に確認しておきましょう。
* **LEDとは?**
LED(Light Emitting Diode、発光ダイオード)は、電流が流れると点灯する小型の電子部品です。LED は高効率で長寿命なため、さまざまな電子機器で広く使われています。
* **GPIOピンとは?**
GPIO は **General Purpose Input/Output** の略です。これらのピンを使うことで、Raspberry Pi は LED、センサー、ボタンなどの外部デバイスとやり取りできます。各ピンは、信号を出力したり(output)、信号を読み取ったり(input)するようにプログラムできます。
このチュートリアルでは、LED を GPIO ピンに接続し、Python プログラムを書いて点滅させます。では、始めましょう!
----------------------------------------------
**必要なもの**
このプロジェクトで使用する部品とその用途は次のとおりです。
.. list-table::
:widths: 30 20
:header-rows: 1
* - 部品
- 購入リンク
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_led`
- |link_led_buy|
* - :ref:`cpn_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**回路図**
抵抗は LED に流れる電流を制限し、LED が焼損するのを防ぎます。抵抗を入れないと、LED に過大な電流が流れ、LED と Raspberry Pi の両方を損傷する可能性があります。
.. image:: img/fzz/1.1.1_sch.png
:width: 80%
:align: center
----------------------------------------------
**配線図**
以下の配線図を参考にして、各部品を接続してください。
.. image:: img/fzz/1.1.1_bb.png
:width: 80%
:align: center
----------------------------------------------
**コード**
それでは、LED を制御する Python コードを書いてみましょう。一定間隔で LED を点灯・消灯するスクリプトを作成します。
1. **コードディレクトリへ移動する:**
ターミナルを開き、次のコマンドを入力します。
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python
2. **プログラムを実行する:**
以下のコマンドでスクリプトを実行します。
.. raw:: html
.. code-block:: shell
sudo python3 1.1_LED.py
LED が一定間隔で点滅するはずです。
3. **コードを編集する(任意):**
プログラムを変更したい場合は、テキストエディタでコードファイルを開きます。
.. raw:: html
.. code-block:: shell
nano 1.1_LED.py
変更を加えたら、 ``Ctrl+X`` を押して終了します。保存するかどうか尋ねられたら ``Y`` を入力してください。もう一度スクリプトを実行して、変更内容を確認しましょう。
----------------------------------------------
**コード**
以下が、このプロジェクトの完全な Python スクリプトです。
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from fusion_hat.pin import Pin, Mode
from time import sleep
# Initialize an LED connected to GPIO pin 17 as an output pin.
led = Pin(17,mode=Mode.OUT)
try:
# Start an infinite loop to toggle the LED state.
while True:
# Turn on the LED and print a message to the console.
led.high()
print('...LED ON')
# Wait for 0.5 seconds with the LED on.
sleep(0.5)
# Turn off the LED and print a message to the console.
led.low()
print('LED OFF...')
# Wait for 0.5 seconds with the LED off.
sleep(1)
except KeyboardInterrupt:
# Gracefully handle a keyboard interrupt (Ctrl+C) by breaking the loop.
pass
この Python スクリプトは、Raspberry Pi の GPIO 17 に接続された LED を制御します。実行すると、LED は一定間隔で点灯と消灯を繰り返します。同時に、コンソールには LED の現在の状態を示すために "LED is ON" と "LED is OFF" が表示されます。ユーザーが ``Ctrl+C`` を押して中断するまで、プログラムは継続して動作します。
----------------------------------------------
**コードの理解**
1. **インポート:**
``fusion_hat`` ライブラリを使うと、GPIO デバイスの制御を簡単に行えます。 ``Pin`` クラスを使えば、 ``on()`` や ``off()`` のような基本的なメソッドで LED を制御できます。 ``sleep`` 関数は、各コマンドの間に待機時間を入れるために使います。
.. note:: fusion-hat の使い方については、|link_api_fusion_hat| を参照してください。
2. **初期化:**
``led = Pin(17,mode=Mode.OUT)`` という行は、LED が GPIO 17 に接続されていることを Raspberry Pi に知らせています。
3. **メインループ:**
``while True`` ループの中では、LED を点灯( ``led.on()`` )し、消灯( ``led.off()`` )し、その間に 0.5 秒の待機( ``sleep(0.5)`` )を入れています。
4. **安全な終了:**
``try...except`` ブロックにより、プログラムは中断された場合(たとえば ``Ctrl+C`` を押した場合)でも安全に終了できます。
----------------------------------------------
**トラブルシューティング**
1. **LEDが点灯しない**
- **原因**: GPIO ピンの指定ミス、または配線不良。
- **対処方法**: LED が GPIO 17 に正しく接続されているか確認し、抵抗が正しい位置に入っているかも確認してください。抵抗がないと LED が破損する可能性があります。
2. **KeyboardInterrupt が機能しない**
- **原因**: プログラムが正常に終了できていない。
- **対処方法**: スクリプトをバックグラウンド実行ではなく、 ``Ctrl+C`` を受け取れるターミナル上で実行してください。
3. **GPIOの設定が正しくない**
- **原因** : ``fusion_hat`` ライブラリがインストールされていない。
- **対処方法** ::ref:`install_fusion_hat` を参照してください。
4. **LEDがちらつく、または不安定に動作する**
- **原因**: 電源が不安定、または接続が不十分。
- **対処方法**: 安定した電源を使用し、配線がしっかり接続されていることを確認してください。
----------------------------------------------
**発展アイデア**
1. **点滅速度を可変にする**: ユーザー入力によって LED の点滅速度を動的に変更できるようにします。
.. code-block:: python
interval = float(input("Enter blink interval in seconds: "))
while True:
led.on()
sleep(interval)
led.off()
sleep(interval)
2. **複数LEDの制御**: 複数の LED を別々の GPIO ピンに接続し、順番に点灯させたり、同時に点滅させたりするパターン制御を試してみましょう。
----------------------------------------------
**まとめ**
おめでとうございます! これで最初の Raspberry Pi プロジェクトが完了しました。LED を制御することで、GPIO ピンの使い方と、ハードウェアを操作する Python スクリプトの書き方を学びました。この基礎知識は、より高度なプロジェクトへ進むための大切な土台になります。ぜひ引き続き、いろいろ試しながら学んでいってください。