🍓

晩夏の自由研究 - はじめてのラズパイ🍓 -

2022/09/13に公開

動機

スマートホーム化に目がない筆者は、IoT開発の入門としてラズベリーパイ(以下、ラズパイと略)に触れてみようと企画。

今回は「ラズパイに慣れよう」ということで、目標は「コードを実行してラズパイのライトを付ける」として自由研究を進めました。

準備したもの

  • Raspberry Pi Starter Kit(Raspberry Pi Zeroが入っています)
  • Windows 10 Pro
  • microSDカード 16GB
  • カードリーダー(microSDカードをPCで読み込むため)
  • USBケーブル(USB A to USB microB)
    ※充電用ではなく、通信もできるもの(私はこれでハマったの注意してください)

大まかな流れ

microSDカードにRaspberry Pi OSをインストール

ラズパイをネットワークに接続

プログラムを実行して、ラズパイのライトを点灯させる

下記、順を追って進めていきます。

① Raspberry Pi Imagerを用いて、microSDカードへRaspberry Pi OSをインストール

ラズパイにはOSがインストールされていないので、まずはOSの準備から。
ラズベリーパイ用OS「Raspberry Pi OS」をmicroSDカードへインストールしていきます。
OSをインストールしたmicroSDカードをラズパイ本体に挿入することで、ラズパイが起動することができます。

ここで使ったのが、Raspberry Pi Imager

公式ページによると

Raspberry Pi Imager is the quick and easy way to install Raspberry Pi OS and other operating systems to a microSD card

とのことで、これを使えば、簡単にOSをmicroSDカードにインストールできるようです。

下記、Raspberry Pi OSをmicroSDカードへインストールする手順になります。

  1. こちらのURLに遷移
  2. ご自身のPCに合ったものをダウンロード
  3. ダウンロードしたものを実行してインストール
  4. ラズベリーがチャームポイントのRaspberry Pi Imagerの画面が現れます
  5. microSDカードをカードリーダーへ挿し、カードリーダーをPCに接続
  6. Raspberry Pi Imagerの画面にて、OSはラズベリーパイOS(32bit)、ストレージは 5.で接続して出現したUSBドライブを選択
  7. 設定からSSH接続のためのユーザー名、パスワードを設定する
    ※2022年版のRaspberry Pi OSではユーザー、パスワード設定が必須になりました。
  8. 「microSDカードの中身全部上書きするけど大丈夫?」という案内にYesをし書き込み開始
  9. 結構待ちます。。。
  10. インストールが完了したら安全にカードリーダーを取り出してください

これでインストール作業は完了です!

② USBケーブルを用いてネットワーク接続する

OSのインストールが完了したので、次はいよいよラズパイを起動&操作してみます。

起動は簡単。ラズパイに先ほどのmicroSDカードを挿し、ラズパイとPCをUSBケーブルで繋ぐのみ。ライトが点灯したら起動したサインです。

操作をするためにはラズパイをネットワーク接続する必要があるのですが、
下記のように、ラズパイをネットワーク接続するには複数の方法があるようで、今回はUSBケーブルを用いてラズパイをネットワーク接続しました。

Raspberry Pi Zeroのネットワーク接続には、外付けでLAN機器を接続する以外に、USBケーブルでPCと繋ぎ、PC経由でインターネットに接続するOTG(On-The-Go)という方法があります。

引用:https://www.boardgamepark.com/entry/USB-OTG

起動&ネットワーク接続の手順は下記になります。

  1. SSH接続のために前述のOSインストールでインストールしたファイルの一部を編集します
    1. microSDカードをカードリーダーへ挿し、カードリーダーをPCに接続
    2. /boot配下にあるconfig.txt、cmdline.txtの2つのファイルを編集
      1. config.txt:最終行にdtoverlay=dwc2を追加し保存
      2. cmdline.txt:rootwaitの後に、modules-load=dwc2,g_etherを追加(前後は半角で区切ってください)し、保存
    3. 安全にUSBを取り出す(ここで安全に取り出さなければ編集ファイルが保存されない)
  2. ラズパイへmicroSDカードを挿入
  3. ラズパイとPCをUSBケーブルで結び、ラズパイのランプが点灯したことを確認
    画像のようになります(USBケーブル挿す位置を間違えないように気をつけてください)
  4. デバイスドライバーのダウンロードのため、こちらのURLに遷移し、
    「:Acer Incorporated. - Other hardware - USB Ethernet/RNDIS Gadget 製品:Windows 7,Windows 8,Windows 8.1 and later drivers」のタイトルのものをダウンロード
    ※ USBケーブルでつないだRaspberry Piを有線LANとして認識するためにデバイスドライバーをインストールするようです
  5. ダウンロードしたCAB形式ファイルを解凍
    参考:コマンドでの解凍方法
    expand [ダウンロードしたファイル名] -F:* [解凍したファイルの保存先のパス]
  6. コントロールパネルのデバイスマネージャーを開き、ネットワークアダプターの項目に下記のように現れたらOK
  7. ネットワーク接続にて、新しいネットワークが現れるのを確認
  8. 現在使用中のネットワークを右クリックし、プロパティを開く
  9. 共有のタブにて、6. で新しく現れたネットワークを選択
  10. コマンドプロンプトを開き、ssh [ユーザー名]@[ホスト名].localを実行し(私は、ssh pi@raspberrypi.localを実行しました)、OSインストールの際に設定したパスワードを入力
  11. ssh接続できたことを確認

お疲れ様でした!これでネットワーク接続は完了です!

③ Sambaをインストールして、PCとラズパイで共有できるファイルサーバーを作る

ラズパイのライトを付けるためにプログラムを実行する必要があるので、ラズパイ側にプログラムの書かれたファイルを配置します。

PC側からラズパイを操作しているので、PCとラズパイが共有できるファイルサーバーを作ります。

手順は、ユーザー登録、smb.conf以外、こちらの記事の通りに進めました。

下記に実行したコマンドを順に羅列しています。
※ラズパイにssh接続した後に以下手順を進めています。

pi@raspberrypi:~ $ sudo apt-get install samba
pi@raspberrypi:~ $ cd /etc/samba
pi@raspberrypi:/etc/samba $ sudo mv smb.conf smb.conf.org
pi@raspberrypi:/etc/samba $ sudo nano smb.conf
---下記のように設定しました---
[global]
unix charset=UTF-8
dos charset=CP932
workgroup=raspi
[share]
path=/var/shared
read only=no
browseable=yes
guest ok = no
force user = pi
-----------------------------
pi@raspberrypi:/etc/samba $ sudo smbpasswd -a pi
pi@raspberrypi:/etc/samba $ sudo systemctl restart smbd
pi@raspberrypi:/etc/samba $ sudo systemctl restart nmbd
pi@raspberrypi:/etc/samba $ sudo mkdir /var/shared
pi@raspberrypi:/etc/samba $ sudo chmod -R 777 /var/shared
pi@raspberrypi:/etc/samba $ sudo chown -R pi:pi /var/shared

上記のコマンドを打ち、エクスプローラーにて「\\raspberrypi.local(\\ホスト名.local)」のパスを入力し、画像のように共有フォルダにアクセスできたら成功です!

④ Python書く

こちらのサイトに、ラズパイの配線方法やサンプルコードが載っているので、pythontest.pyの内容をコピーし、先ほど作成した共有フォルダの配下に配置します。

https://osoyoo.com/2017/06/23/python-light-led/

参考として下記にコピーしたコードを張りつけておきます。少しだけ解説を入れています。

#!/usr/bin/python

###########################################################################
#Filename      :pythontest.py
#Description   :blink LED
#Author        :alan
#Website       :www.osoyoo.com
#Update        :2017/06/20
############################################################################

import RPi.GPIO as GPIO
import time

#print message at the begining ---custom function
def print_message():
    print ('|********************************|')
    print ('|            blink LED           |')
    print ('|      ------------------------- |')
    print ('|        LED connect to GPIO0    |')
    print ('|                                |')
    print ('|        LED will blink at 500ms |')
    print ('|      ------------------------- |')
    print ('|                                |')
    print ('|                          OSOYOO|')
    print ('|********************************|\n')
    print ('Program is running...')
    print ('Please press Ctrl+C to end the program...')

#setup function for some setup---custom function
def setup():
    GPIO.setwarnings(False)
    #set the gpio modes to BCM numbering
    #GPIO.BOARDとGPIO.BCMの2種類があり、BCMはピン番号を指定するモードになります
    GPIO.setmode(GPIO.BCM)
    #set LEDPIN's mode to output,and initial level to LOW(0V)
    GPIO.setup(LEDPIN,GPIO.OUT,initial=GPIO.LOW)
    
# set Physical pin#11 as LED pin, in line 33 setmode to BCM , so Pin#11 actually GPIO# here is  17
#今回は下記を読み進めていただくとGPI017を使用しているので、17となります。
LEDPIN = 17
#main function
def main():
    #print info
    print_message()
    #無限ループ開始
    while True:
       #GPI017に電圧を出力
       GPIO.output(LEDPIN,GPIO.HIGH)
       print('...LED ON\n')
       time.sleep(0.5)
       
       #GPI017に電圧を出力しない
       GPIO.output(LEDPIN,GPIO.LOW)
       print('LED OFF...\n')
       time.sleep(0.5)
       pass
    pass

#define a destroy function for clean up everything after the script finished
def destroy():
    #turn off LED
    GPIO.output(LEDPIN,GPIO.LOW)
    #release resource
    GPIO.cleanup()
#
# if run this script directly ,do:
if __name__ == '__main__':
    setup()
    try:
            main()
    #when 'Ctrl+C' is pressed,child program destroy() will be executed.
    except KeyboardInterrupt:
        destroy()

⑤ いざ点灯!

それでは、ラズパイキットで配線を行い、プログラムを実行して、ライトを付けてみます。

準備するものは下記になります。

  • ラズパイ
  • ブレッドボード
  • GPIO拡張ボード
  • リボンケーブル
  • ジャンパワイヤ(オス~オス)
  • LED
  • 抵抗

下記の画像のように、ブレッドボードに、GPIO拡張ボード、LED、ジャンパワイヤ、抵抗を配置していきます。GPI017とGDNに配線をします。


※ 画像は https://osoyoo.com/2017/06/26/introduction-of-raspberry-pi-gpio/ より引用

できたのがこちらです。

次に、GPIO拡張ボードにリボンケーブルをくっつけ、リボンケーブルの端をラズパイのGPIOにくっつけます。画像のようになります。

その状態で下記コードを実行!

pi@raspberrypi:/etc/samba $ python /var/shared/light.py

LEDがチカチカと点灯と消灯を繰り返せば、成功です!

感想

今回、はじめてラズパイを触ってみましたが、ハードウェアに興味が出ました。
これで、IoT開発できたら楽しそうです。次は、ラズパイとSlackを連携させてみます。

おさらいメモ

expandコマンド

cab形式の圧縮ファイルを解凍。
cab形式で圧縮する際は、makecabコマンドを使用する。
EXPAND [オプション] <ファイル名>

/r 展開先ファイル名を省略する
/d cabファイルの中身を一覧表示する
(解凍は行わない)
/F:ファイル名 cabから展開するファイルを指定する
(ワイルドカード指定可)
/? コマンドのヘルプを表示する

参考:https://windows.command-ref.com/cmd-expand.html

chownコマンド

指定したファイルやディレクトリのユーザー所有権(所有者)やグループ所有権(グループ)を変更する。
chown [オプション] ユーザー[:グループ] ファイル

参考:https://webkaru.net/linux/chown-command/

Discussion