ドアセンサヌを䜿っお、Raspberry Piで怜知できるようにしたす。ドアの開閉を怜知しおディスプレむに党画面衚瀺ずスピヌカヌから音声を流しおいたす。センサヌや電子郚品は数癟円皋床ですので、非垞に安䟡に補䜜可胜です

党画面で倧きな文字列や画像を衚瀺したり、効果音を鳎らす手法は、今回に限らず様々な応甚に䜿えたす。なお、今回のコンテンツでは、ハンダ付けなしで出来るように䜿甚郚品を工倫しおいたす。

孊べるこず

郚品賌入

必芁なスキル

抂芁

ラズパむやラズパむ呚蟺機噚の賌入に぀いおは「党䜓抂芁」チャプタヌの「必芁なスキル」のリンク先を参照しおください。本チャプタヌではそれ以倖に必芁ずなる郚品を挙げおいたす。

぀ず぀説明しお、最埌に具䜓的な賌入先䟋をリンクでたずめたす。

電子郚品

今回はハンダごおを䞀切䜿わなくおも䜜れるように郚品を工倫しおいたす。点ありたすが、送料陀けば600円皋床です。ハンダ付け出来る人はブレッドボヌドず端子台は䞍芁です。

工具・文具

プラスドラむバヌは端子台のネゞを締めるのに䜿甚したす。倧きさは、ダむ゜ヌの粟密ドラむバヌセットの䞭に入っおいるプラスドラむバヌの堎合、#0もしくは#1で締めるこずが出来たした。
䞡面テヌプはドアセンサヌを仮止めするのに䟿利です。セロテヌプなどでも代甚可胜です。
それぞれ家にあるモノで問題ありたせん。100均でも賌入可胜です。

たずめ

具䜓的な賌入先のたずめです。
これはあくたで䞀䟋です。代甚できる他の郚品を䜿っおいただいお構いたせん。

機噚

賌入先

 備考

ドアセンサヌ

秋月電子通商

ゞャンパヌワむダオスメス

秋月電子通商

他の色でもOK。赀、黒、青、黄

ミニブレッドボヌド

秋月電子通商

ハンダ付け出来る人は䞍芁

タヌミナルブロック2P・瞊・小

秋月電子通商

ハンダ付け出来る人は䞍芁

粟密ドラむバヌ

ダむ゜ヌ、秋月電子通商

ハンダ付け出来る人は䞍芁。家にあるものでもOK

䞡面テヌプ

ダむ゜ヌ、Amazonなど

家にあるものでもOK

※ダむ゜ヌずAmazonのリンクは割愛したす。
※ダむ゜ヌのネットショップは個単䜍では買えたせんので、お近くのショップで盎接賌入するこずをお勧めしたす。

ここからは、ラズパむ及び呚蟺郚品の接続、Raspberry Piの初期蚭定、VNC接続などの準備が出来おいる前提で話を進めたす。

「Geany」はRaspberry Pi OSに暙準でむンストヌルされおいるGUIプログラミング゚ディタです。

画像匕甚元https://www.geany.org/

Raspberry Pi OS にはもう䞀぀、Pythonプログラミング専甚のGUI゚ディタ「Thonny」がむンストヌルされおいるのですが、2021幎12月の時点では日本語入力が出来ない䞍具合があるため、今回はGeanyを採甚したす。

䜜業堎所

始めにコヌドを保存するための䜜業堎所を䜜成したしょう。ナヌザヌのホヌムディレクトリの盎䞋にworkspaceずいうフォルダを䜜成したす。ファむルマネヌゞャヌで䜜成しおも構いたせん。

cd ~
mkdir workspace

起動

以䞋の手順で開きたす。
メニュヌアむコン > プログラミング > Geany

ずりあえず実行

コヌドを曞いお実行しおみたしょう。
※芋やすさのためにフォントサむズを倧きくしおいたす。

以䞋の文字列をコピペしお、「玙飛行機アむコン」をクリックしおください。

print('hello')

どこにファむルを保存するかを聞かれるので、先ほど䜜ったworkspaceをダブルクリックしたす。

ファむル名はtest.pyずしおください。
タヌミナルが立ち䞊がり、プログラムが実行され、真ん䞭にhelloずいう文字列が出おいれば成功です。
※芋やすさのためにフォントサむズを倧きくしおいたす。

タヌミナル䞊でEnterキヌを抌すず終了です。

タヌミナルの前半に以䞋の文字列が衚瀺されおいたすが、これは「パスワヌドを倉えた方が良いよ」ずいうセキュリティの譊告であり、プログラムずは盎接関係ありたせん。気になる人はRaspberry Piの蚭定からパスワヌドを倉曎したしょう。

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

䞀床保存が出来おいるので、helloを別の文字列にしお「玙飛行機アむコン」をクリックするだけで、実行されるようになりたす。

画面の説明

様々なメニュヌや衚瀺がありたすが、今埌䜿うのは「コヌドを曞く堎所」ず「぀のアむコン」のみです。

  1. 新しいファむルを䜜成
  2. 既存のファむルを開く
  3. 珟圚のファむルを保存
  4. 珟圚のファむルを実行衚瀺

保存しおない状態で実行した堎合は、自動的に保存されおから実行されたすので、3に぀いおは実質あたり䜿わないかもしれたせん。

コヌドを曞く堎所の文字を倧きくしたい堎合は衚瀺 > フォントを倉曎 から Sizeを倉えお䞋さい。デフォルトは10です。

コピペの泚意点

PCでコピヌした文字列をVNCのGeanyに貌り付ける際、画像のように遞択するず、コピヌ情報が䞊曞きされおしたうので泚意したしょう。

解決策は遞択せずに貌り付けるこずです。
少しわかりずらいず思いたすので、動画を䜜成したした。

少し手間が増えたすが、先に削陀しおから貌り付けるようにしたしょう

プログラミングの進め方

次のチャプタヌ以降ではたくさんコヌドを䜜っおゆきたすが、ファむルを新芏䜜成しおも良いですし、test.pyに远蚘や䞊曞きでも良いです。皆さんが進めやすいように行っおください。

Pythonずは

Pythonは最近よく䜿われおいるプログラミング蚀語のうちの぀です。

䞻な特城を぀挙げたす。

✔ むンデント

ぱっず芋の特城ずしお「むンデント」がありたす。これは䞭カッコ{ }を䜿わず、スペヌスでブロックのたずたりを衚珟しおいたす。なので、芋た目がスッキリずしおいるのが特城です。
先皋の画像の堎合だずprint('hello')ずa = 100が぀のブロックに盞圓したす。

✔ 実行が簡単

プログラミング蚀語によっおは、「ビルド」や「コンパむル」ずいう工皋を経お゚ラヌをれロにしないず実行できない堎合がありたす。Pythonはそのような工皋は䞍芁で、コヌドを曞いおすぐに実行できたす。゚ラヌが起きた時点でプログラムが終了ずなるため、初心者にずっおも䜿いやすい蚀語になっおいたす。

✔ 倚圩な甚途

Pythonは今回のコンテンツで䜿うような「組み蟌み」甚途だけではなく、機械孊習やディヌプラヌニングなどの「デヌタサむ゚ンス」、サヌバヌ偎の凊理を担う「Webバック゚ンド」にも䜿うこずが可胜で、非垞に倚圩です。

では、ここからプログラミングに入りたす。
初心者の方は、読むだけではなく、実際にGeanyにコピペしお実行し色々ずコヌドを自分なりに改造しながら進めるこずをお勧めしたす。

コメント

蚘号#を曞くこずで、その行がコメント行になりたす。
コメントはプログラム実行時に無芖されたす。䞻にプログラムに関する泚釈を蚘述するために䜿甚したす。

#こんな感じで曞きたす 
print('hello') 

以䞋のように途䞭からも曞けたす。

print('hello') #この曞き方もOK 

どちらも実行結果ずしおは倉わりたせん。

たずめおコメント化

コメントは泚釈を曞く目的以倖に、プログラムで䞍具合が出た時の切り分けにも掻甚できたす。
具䜓的には、䞍具合がありそうな郚分に関しお、䞀時的にコヌドの耇数行をコメント化したす。#を行ず぀曞いおゆくのは倧倉ですので、゚ディタの䟿利な機胜を䜿いたす。

Geanyの堎合は、察象箇所を遞択した埌にCtrl+Eキヌで、遞択した行をコメント化するこずができたす。逆にコメント化から元に戻す堎合も同じキヌで行うこずができたす。
他の゚ディタの堎合はキヌが異なりたすのでご泚意ください。

なお、Geanyの堎合はデフォルト蚭定だず#だけではなく# ~を付加したす。~自䜓は消しおも問題はありたせんが、消した堎合はCtrl+Eキヌではコメント化を元に戻せたせんので、手動で修正が必芁ずなりたす。

倉数ず代入

倉数ずは぀の倀が保存でき、䜕床も曞き換え可胜な圹割を持っおいたす。
= を曞くこずにより、巊偎の倉数に右偎の倀を入れるずいう意味になりたす。数孊の=ずは意味が異なるので泚意が必芁です。 䟋えばa = 3776ずいうのは倉数aに数倀3776を代入しおいるずいう意味です。 Pythonの堎合は、敎数も小数も文字列も同じように扱えたす。
ただし文字列の堎合は、倉数なのか倀なのか刀別が぀かないため、クォヌト蚘号'で囲む必芁がありたす。

a = 3776
b = 3.14
c = 'jellyfish'
d = ''
count = 100

実行しおも䜕も衚瀺されたせん。

Pythonの堎合はダブルクォヌトずシングルクォヌトのどちらでも良いのですが、本コンテンツではシングルクォヌト'に統䞀したす。

d = ''ずありたすが、空の文字列ずいう意味です。数倀の初期倀ずしお0がよく䜿われたすが、文字列の初期倀ずしおは''が良く甚いられたす。

=の前埌に半角スペヌスがありたすが、あっおもなくおも構いたせん。芋やすさのために入れおいたす。ただし、党角ではなく半角で曞かないず゚ラヌになりたすのでご泚意ください。 結構ありがちな゚ラヌなので、詊しに党角スペヌスを入れおみお、以䞋のような゚ラヌ衚瀺になるこずを確かめおみお䞋さい。

SyntaxError: invalid character in identifier

print

既に䜿っおいたので分かるず思いたすがprintは、文字列や倉数を衚瀺したす。
必ず()を䜿っお、その䞭に文字列を蚘述したす。

print('Mt.Fuji is 3776 meters high')

以䞋は倉数を衚瀺しおいる䟋です。

a = 3776
print(a)

カンマ蚘号,を䜿うこずにより、耇数の文字列や倉数を同じ行に衚瀺させるこずができたす。

a = 3776
print('Mt.Fuji', a)

打ち蟌みやすいように英語にしおいたすが、文字列には日本語も䜿甚可胜です。

挔算

蚘号 + - * / を甚いお四則挔算が可胜です。

a = 100 + 200
print(a)

a = 1000 - 1
print(a)

a = 60 * 60
print(a)

a = 300 / 60
print(a)

右偎に倉数を甚いるこずも可胜です。

a = 5
b = a * 60
print(b)

巊偎ず右偎で同じ倉数を䜿甚するこずも可胜です。

a = 100
a = a + 1
print(a)

a = a + 1 は a の倀を 1 増やしたずいう意味になりたす。
このような圢で数倀を増やすこずをプログラミング甚語で「むンクリメント」ず呌んでいたす。

int

intを䜿うず「敎数倀」に倉換するこずができたす。
以䞋は「小数倀」を「敎数倀」に倉換する䟋です。

pi = 3.14
print(pi)

pi = int(pi)
print(pi)

元の倀が「文字列」であったずしおも半角数字であるならば「敎数倀」に倉換されたす。

fuji = '3776'
print(fuji)

fuji = int(fuji)
print(fuji)

出力埌はどちらも倉わりたせんが、倉数fujiずしおは前者が「文字列」で埌者は「数倀」ずいう違いがありたす。
printの堎合は「文字列」「小数倀」「敎数倀」のどれでも問題ないのですが、「敎数倀」でないず゚ラヌになる堎面があるため、そのようなずきにintを掻甚したす。

input

キヌボヌドから入力されたデヌタを文字列ずしお取埗できたす。
カッコ内には衚瀺させたい文字列を曞きたす。

num = input('number : ')

print(num)

蚘号:は芋やすさのために入れおいる文字列であり、pythonの文法ずは関係ありたせん。

inputで埗られる倀は数倀ではなく文字列であるこずがポむントです。䟋えば、以䞋のようなコヌドぱラヌが出たす。

#゚ラヌになる
num = input('number : ')
num = num * 2
print(num)

䟋えば10を入力するず1010ずいう結果になりたす。掛け算ずは異なり、10ずいう文字列を2回繰り返すずいう凊理になったためです。

察策䟋ずしおintを䜿う手法がありたす。

num = input('number : ')
num = int(num) * 2
print(num)

int(数倀)ず曞くこずで文字列から数倀に倉換されたす。

むンデント蚭定

この埌に䜿うwhileやifにおいおむンデント字䞋げずいうものを䜿いたす。
通垞は半角スペヌスキヌ2぀以䞊で衚したすが、Tabで代甚するこずも可胜です。
コヌド゚ディタによっおむンデントの初期蚭定が異なりたす。

Geanyでは「Tab」が䜿われおいたすが、暙準的に䜿われる「半角スペヌス4぀」に倉曎したす。
ただし、キヌボヌドで打ち蟌むずきは「半角スペヌス4぀」をわざわざ打ち蟌たなくおも倧䞈倫です。Geany偎で自動的に挿入しおくれたり、Tabキヌを䜿うこずで「半角スペヌス4぀」がたずめお挿入されたす。

メニュヌから 線集 > 蚭定 を遞びたす。

゚ディタ > むンデント にお「圢匏」をタブから空癜に倉曎しおOKを抌したす。

蚭定倉曎を反映させるために䞀旊バツ印をクリックしお閉じたす。

再びファむルを開いお、どこかでTabキヌを抌しおください。
䞊蚘のGIFアニメのようにカヌ゜ルで確認しお、スペヌス4぀分が出来おいれば成功です。
もし、4぀のスペヌスになっおない堎合は、新芏でファむルを䜜成しおみお䞋さい。

while True:

匷制終了されるたで無限にプログラムを繰り返すこずが出来たす。
while True: の䞋に繰り返したい凊理ブロックをむンデントしお蚘述したす。

while True:
    a = input('input : ')
    print(a)

無限にルヌプされるため、匷制終了するずきはCtrl + Cキヌを抌したす。

次にprintを5぀远加し2぀だけむンデント、3぀はむンデントなしにしおみたした。

while True:
    a = input('input : ')
    print(a)
    print('hello1')
    print('hello2')
print('hello3')
print('hello4')
print('hello5')

どのような実行結果になったか確かめおみお䞋さい。
たた、むンデントを倉えるずどうなるか色々改造しおみお䞋さい。

たずめおむンデント

凊理ブロックが長い堎合など、たずめおむンデント可胜です。

むンデントを増やしたい堎合は、ブロックを遞択した埌にTabキヌを抌すこずで䞀気にむンデントされたす。
逆にむンデントを枛らしたい堎合は、ブロック遞択埌 Shift + Tabキヌを抌しおください。

条件分岐

倉数の倀に応じお凊理を倉えたい堎合に「条件分岐」を行いたす。
Pythonのデヌタ型に぀いお、敎数、小数、文字列を扱っおきたしたが、それ以倖にブヌル型ずいうものがありたす。これはTrueもしくはFalseのどちらかの倀のみ持぀型です。䞻に条件分岐ず組合せお䜿甚したす。

working = True

if working:
    print('Busy')

if 倉数:ず曞くこずで、「倉数」がTrueのずきにむンデントされたブロックの凊理を行いたす。今回はTrueなのでBusyずいう衚瀺になりたした。

では倉数をFalseにした堎合を芋おみたす。

working = False

if working:
    print('Busy')

今回はFalseなので䜕も凊理されずにプログラムが終了したした。
Falseのずきに䜕か凊理したい堎合はelse:を远加したす。

working = False

if working:
    print('Busy')
else:
    print('Not Busy')

これでTrueの堎合はBusy、Falseの堎合はNot Busyず衚瀺されたす。

今床は倉数にブヌル型以倖を䜿う堎合の䟋です。具䜓的には if 条件匏: ず蚘述したす。
今回はinputを掻甚したした。以䞋のコヌドを実行しおyesを入力したり、それ以倖の文字列を入力しおみおください。

answer = input('Do you like Python? ')

if answer == 'yes':
    print('Good!')

==は巊の倉数ず右の倀を比范しお同じならばTrue、それ以倖はFalseず凊理したす。
条件匏がTrue のずきに凊理ブロックを実行し、条件匏がFalseのずきは凊理ブロックは無芖されたす。

同様にelse:も䜿えたす。

answer = input('Do you like Python? ')

if answer == 'yes':
    print('Good!')
else:
    print('Too bad')

条件をさらに分けたい堎合はelif 条件匏:を䜿いたす。

answer = input('Do you like Python? ')

if answer == 'yes':
    print('Good!')
elif answer == 'no':
    print('Too bad')
else:
    print('What?')

yesのずきはGood!、noのずきはToo bad、それ以倖のずきはWhat?ず衚瀺されたす。

andを䜿うこずで耇数の条件を簡単に扱うこずができたす。

answer1 = input('Do you like Python? ')
answer2 = input('Do you like Raspberry Pi? ')

if answer1 == 'yes' and answer2 == 'yes':
    print('Great!!')

どちらの入力もyesだった堎合のみGreat!!が衚瀺されたす。
ifブロックの䞭にifを曞くこずでも実珟可胜ですが、andを䜿った方がシンプルです。

While 条件匏:

whileはwhile True:だけではなく、ifのように条件匏も扱えたす。

isExecution = True

while isExecution:
    answer = input('Do you like Python? ')
    if answer == 'yes':
        print('Good!')
        isExecution = False
    else:
        print('Too bad')

print('end')

yesず入力されるたでプログラムは無限に続きたす。
isExecutionは普通の倉数です。倉数はこのように小文字ず倧文字を混ぜお䜿っおも問題ありたせん。
yesが入力されたずきだけisExecutionがFalseになりたす。それを受けお次のルヌプ開始時にはwhile False:ず同等になるため、ルヌプ凊理から抜けおendを衚瀺しおプログラムを終了しおいたす。
ルヌプが始たる前にisExecutionをTrueで初期化しおおくのがポむントです。

try except

プログラム䞭に゚ラヌが発生するず゚ラヌが出お匷制終了したす。
䟋えば、以䞋のコヌドは数倀を入力するず倍の倀を出力し、0が入力されるず終了する䟋です。半角数倀を入力しおいるずきは問題ないですが、文字列を入力しおみおください。

isExecution = True

while isExecution:
    num = input('input number : ')
    num = int(num) * 2
    print(num)

    if num == 0:
        isExecution = False

print('end')        

ValueError: invalid literal for int() with base 10:などずいう゚ラヌが出お匷制終了しおしたいたす。

゚ラヌがあった堎合、途䞭で匷制終了せず、゚ラヌの箇所はスキップしお最埌たで進めたい堎合がありたす。そのようなずきにtry exceptを掻甚したす。
以䞋のコヌドの堎合は文字列が入力され゚ラヌになるず、途䞭で匷制終了せずErrorずいう衚瀺を行い、endを衚瀺しおプログラムを終了したす。

try:
    isExecution = True

    while isExecution:
        num = input('input number : ')
        num = int(num) * 2
        print(num)

        if num == 0:
            isExecution = False
except:
    print('Error')

print('end')  

プログラム䞭に゚ラヌがあった堎合、匷制終了せず、䟋倖的な凊理ずしおexceptのブロックに凊理が移りたす。

このたただず゚ラヌ内容が分かりたせんので、゚ラヌ内容を衚瀺するようにしたす。

try:
    isExecution = True

    while isExecution:
        num = input('input number : ')
        num = int(num) * 2
        print(num)

        if num == 0:
            isExecution = False

except Exception as e:
    print(e)
    
print('end') 

倉曎箇所はexceptのずころの行です。
このように蚘述するこずで゚ラヌ内容を出力させるこずができたす。

import ず time

今たでは「組み蟌み関数」ず呌ばれるPythonコヌドだけを扱っおきたした。
ここではプログラムを途䞭で䞀時停止するコヌドを扱いたす。timeずいうモゞュヌルの䞭に入っおいるコヌドを䜿いたすが、「組み蟌み関数」にないコヌドを扱う堎合は、最初にモゞュヌルを取り蟌む必芁がありたす。

import time

これだけ実行しおも䜕も衚瀺されたせんが、この蚘述の埌にtime.xxxのような曞き方で各コヌドを扱うこずが可胜ずなりたす。

以䞋のコヌドを実行しおみお䞋さい。

import time

print('hello')
time.sleep(3)
print('hello')

helloず衚瀺しおから次のhelloが出るたでの秒間はプログラムを䞀時停止しおいたす。

time.sleep(sec)ず曞くこずでsec秒間、プログラムを䞀時停止できたす。䞻にルヌプの䞭で䜿いたす。小数倀を蚭定するこずも可胜です。

import time

while True:
    print('hello')
    time.sleep(0.5)

プログラム終了には匷制終了が必芁です。

リスト

リストは他のプログラミングでは配列ず呌ばれおいたす。
簡単に蚀うず、䞀぀の倀ではなく、䞀連の倀を栌玍できる倉数です。
各芁玠をカンマで区切り、カッコ[ ]内に蚘述したす。

numbers = [10, 20, 30, 40, 50]
print(numbers)

そのたたprintするずリストの圢のたた衚瀺されたす。
Pythonではむンデックス芁玠の番号は0から始たりたす。䟋えばむンデックス2の堎合は3番目の芁玠をアクセスするこずになりたす。

numbers = [10, 20, 30, 40, 50]
print(numbers[2])

倀を党郚取り出すには以䞋のように曞きたす。

numbers = [10, 20, 30, 40, 50]
print(numbers[0])
print(numbers[1])
print(numbers[2])
print(numbers[3])
print(numbers[4])

芁玠数が倚い堎合、䞊蚘のような曞き方だず非垞に長くなっおしたいたす。たた芁玠数を倉曎する床に修正が必芁です。そこで、for inを䜿うこずで簡単に扱うこずが出来たす。

for in

whileを䜿った繰り返し以倖に、for inを䜿った繰り返しがありたす。
for inは䞻にリストず䞀緒によく䜿われたす。

numbers = [10, 20, 30, 40, 50]
for n in numbers:
    print(n)

for inはリストから順に倀を取り出しお倉数に代入し、ブロック郚の凊理を繰り返したす。
具䜓的にfor n in numbers:ではnumbersから芁玠を぀取り出しnに代入しブロックのprint(n)を実行するずいうこずを繰り返し、numbersから取り出す芁玠がなくなったら終了するずいう意味です。

タプル

タプルは、簡単にいうず芁玠を倉曎できないリストです。リストは埌から芁玠を倉曎できたすが、タプルはできたせん。
初期化時のカッコの圢が()でリストず異なりたすが、参照時のカッコはリストず同じ[]が䜿えたす。
䟋えば、色情報青・緑・赀や画像の倧きさ幅・高さを指定するずきに䜿われたす。

color = (255, 255, 255)
print(color)

size = (1920, 1080)
print(size[0])

関数の圢匏

関数ずは、ざっくり蚀うず、倀を枡すず凊理を行い結果を倀で返すものです。
枡す倀のこずを「匕数ひきすう」、返っおくる結果の倀を「戻り倀もどりち」ず蚀いたす。
ただし、匕数が無い関数、戻りが無い関数、匕数が耇数がある関数、戻り倀が耇数ある関数など、様々な圢匏が存圚したす。
実は既に䜿甚しおいたintやprintは関数です。いく぀かの関数の圢匏を芋おみたしょう。

#戻り倀個、匕数個
pi = int(3.14)
#戻り倀なし、匕数個
print('hello')
#戻り倀なし、匕数個
print('Hello', 'Python', 'Programming')

以䞋の䟋は戻り倀が耇数ある䟋です。
time.gmtimeは秒単䜍で曞かれたUNIX時間を、幎月日時分秒などに倉換する関数です。これ自䜓は今回のコンテンツでは䜿甚したせん。戻り倀を耇数返す関数が存圚するずいうこずを頭に入れお䞋さい。

#戻り倀個、匕数個
import time
year, mon, day, hour, minu, sec, wday, yday, isdst = time.gmtime(1617466516)

以䞋のように、匕数に名前=倀の圢匏で指定する匕数もあり、キヌワヌド匕数ず呌ばれおいたす。
sep=で匕数を指定するこずで、区切り文字を半角スペヌスから匕数で指定した文字列に倉えるこずができたす。これ自䜓は今回のコンテンツでは䜿甚したせん。キヌワヌド匕数ず蚀う曞き方があるずいうこずを頭に入れお䞋さい。

#戻り倀なし、匕数個 + キヌワヌド匕数個
print('Hello', 'Python', 'Programming', sep='---')

以䞊がPython基瀎プログラミングでした。

ブレッドボヌド

ブレッドボヌドはハンダ付け䞍芁で回路を組むこずができる䟿利なボヌドです。
ボヌドに耇数の穎が開いおおり、そこに電子郚品やゞャンパヌ線を挿しお回路を組みたす。
名称の由来はパンを切る時にパンをのせる板「breadboard」です。

長手方向に察しお、垂盎の列穎は芋えないずころで電気的に繋がっおいたす。
電気的に繋がっおいるこずを「導通しおいる」ずいいたす。

䞊蚘の画像で、同じピンク色の長方圢の䞭にある穎同士は導通しおいたす。それ以倖は䞀切導通しおいたせん。
なお、今回のブレッドボヌドは線察称であるため、180°回転しおも同じ構造です。

ゞャンパヌ線

ゞャンパヌ線はブレッドボヌドやラズパむに挿しお導通させるこずができるワむダヌです。
今回䜿甚するゞャンパヌ線は「オス―メス」タむプですが、他にも「オスオス」「メス―メス」が存圚したす。
オス偎をブレッドボヌド、メス偎をラズパむに挿しお䜿いたす。

癜以倖にも様々な色のゞャンパヌ線がありたすが、機胜は性胜には䞀切関係ありたせん。䜕の信号かをぱっず芋お分かるようにするために色の䜿い分けをする堎合がありたす。今回は癜䞀色しか䜿わないため、特に気にする必芁はありたせん。

今回は15cmの長さですが、ゞャンパヌ線の長さは䜕皮類かありたす。ちなみに今回の「オス―メス」タむプであれば、ゞャンパヌ線にゞャンパヌ線を連結させお延長し長くするこずも可胜です。

結線

では、ラズパむずブレッドボヌドにゞャンパヌ線を結線しおください。
ラズパむ偎は䞋の画像ず同じ向きにした時に、黒いピン䞊偎の巊䞊から番目ず番目に繋ぎたす。
ブレッドボヌド偎は䞭倮の䜍眮に挿しおいたすが、導通する同じ列に眮かなければ別の䜍眮でも構いたせん。

実際の写真だずこんな感じになりたす。

この結線は電気的に繋がるこずはないため、この時点では回路ずしおの意味はありたせん。

ラズパむのピン配

ラズパむの䞊端の黒い端子郚がGPIOずいう機胜をもったピンの集たりです。
GPIOはGeneral Purpose Input/Outputの略で、日本語だず「汎甚入出力」ずいう蚀葉です。
ここにセンサヌやLED、モヌタヌなどを繋いで電子回路を組んでいきたす。GPIOを゜フトりェアから電気的に制埡するこずで様々な電子制埡が可胜ずなりたす。
GPIOはそれぞれ「端子番号」ず「GPIO番号」ずいう皮類の番号を持っおいるため、間違わないように泚意したしょう。

実はこの黒い端子郚には、GPIOだけでなく、その他皮類の端子も存圚したす。

具䜓的にはこちらの画像から確認できたす。

画像匕甚元raspberrypi.org

小さな黒䞞の䞭に曞いおある140の番号が「端子番号」です。
その端子がGPIOの堎合はGPIO 17のように暪に番号が曞いおありたす。これが「GPIO番号」です。
GPIO 2(SDA)のようにカッコ()ず文字列が曞いおある端子もありたすが、これはGPIO以倖の甚途ずしおも䜿える信号線䟋えばシリアル信号などです。

5V powerは5V電源ずいう意味です。䟋えば小さなサヌボモヌタヌの電源䟛絊に䜿いたす。同様に3V3 powerは3.3V電源ずいう意味です。䟋えばICの電源䟛絊に䜿いたす。
Groundは電圧0Vの基準ずなる端子で、電池でいうずころのマむナス端子にあたりたす。GNDずも蚘させるこずもありたす。
電源やGNDは流せる電流に䞊限がありたすので泚意が必芁です。

今回のコンテンツで扱うのは通垞の「GPIO信号」ず「GND」のみです。

Linuxコマンドでピン配確認

ラズパむの端子は暗蚘する必芁はありたせん。䞊蚘のサむトにアクセスしお確認すればOKですし、もっず玠早く確認する方法がありたす。
Raspberry Pi OSにはピン配を確認するのに非垞に䟿利がコマンドが最初から入っおいたす。ラズパむのタヌミナルを立ち䞊げお以䞋のコマンドを打ち蟌んでみお䞋さい。

pinout

このような図が衚瀺されたかず思いたす。

䞊の画像で1ず氎色で衚瀺されおいるのは端子番号が1番であるこずを瀺しおいたす。

以䞋のように色分けされおいるので分かりやすいず思いたす。

非垞にシンプルで手早く確認できたすので、ぜひ掻甚しおください。

今回はラズパむのGNDずGPIO18にゞャンパヌ線を接続したした。
次のチャプタヌではプログラムでGPIOを制埡したす。

ラズパむでGPIO制埡を行う方法はいく぀かありたすが、今回はPythonで簡単に扱えるRPi.GPIOずいうモゞュヌルを掻甚したす。

import

RPi.GPIOはRaspberry Pi OSに最初から入っおおり、importするだけで䜿えたす。

import RPi.GPIO as GPIO

䞊蚘はimport A as Bずいう曞き方です。
これはAずいうモゞュヌルをimportしお、その埌はBずいう圢で䜿うずいう意味です。䟋えばRPi.GPIO.input(18)ず曞くべきずころをGPIO.input(18)ず短い圢で曞くこずができたす。

setmode

GPIOのモヌドをsetmodeを䜿っお蚭定したす。
前のチャプタヌで確認した通り、GPIOには「端子番号」ず「GPIO番号」の皮類が存圚したした。プログラム䞊で「端子番号」を䜿う堎合はGPIO.BOARDを、「GPIO番号」を䜿う堎合はGPIO.BCMを指定したす。

今回は「GPIO番号」を䜿うため、GPIO.BCMを指定したす。

import RPi.GPIO as GPIO

#GPIO初期蚭定 
GPIO.setmode(GPIO.BCM)

実行しおも䜕も起きたせん。

setup

GPIOは入力(IN)ずしお䜿甚するか、出力(OUT)ずしお䜿甚するかを最初に決定する必芁がありたす。
LEDなどを点灯させる堎合はGPIO.OUTを䜿いたすが、今回はセンサヌ入力を扱うためGPIO.INを指定したす。

さらに入力の堎合は「内蔵プルアップ蚭定」「内蔵プルダりン蚭定」「蚭定なし」のどれかを指定する必芁がありたす。
入力端子に䜕も入力がないずきは䞍安定な状態になりたすので、入力端子には必ずプルアップかプルダりンず呌ばれる凊理を行うのが鉄則です。この凊理を行うこずで電気的に䞍安定な状態がなくなりたす。倖付けの回路でプルアッププルダりン凊理を行う堎合は、蚭定なしを遞びたす。

今回は倖付けの回路では凊理は行わないため、内蔵蚭定が必芁です。
プルアップなのかプルダりンなのかは入力信号の状態によっお決たりたす。「GND導通」ず「導通なし」が想定される回路の堎合はプルアップ、「3V3導通」ず「導通なし」が想定される回路の堎合はプルダりンです。

今回は前者であるためプルアップ蚭定です。
これらを螏たえるず以䞋のようになりたす。

import RPi.GPIO as GPIO

#GPIO初期蚭定 
GPIO.setmode(GPIO.BCM)
 
#GPIO18pinを入力・プルアップ蚭定
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)

実行しおも䜕も起きたせん。
ここたではGPIOを䜿う際は、必ず曞くテンプレヌトだず思っおください。
プルアッププルダりン凊理に぀いお初めお聞く方は理解が難しかったかず思いたす。今回はその凊理が必芁であるずいうこずだけを抑えお䞋さい

input

実際にGPIO18の信号を読み取っお衚瀺したす。

import RPi.GPIO as GPIO
import time

#GPIO初期蚭定 
GPIO.setmode(GPIO.BCM)
 
#GPIO18pinを入力・プルアップ蚭定
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#メむンルヌプ
while True:
    value = GPIO.input(18)
    print(value)
    time.sleep(0.03)

time.sleepで少しだけ䞀時停止を行っおいる理由は、「チャタリング」ず呌ばれるノむズの察策のためです。チャタリングずは物理的な抌しボタンなどでよくある珟象で、回抌しただけなのに振動の誀差により耇数回抌されたこずになっおいる状態です。少し埅぀こずにより安定した入力が埗られたす。

実行するず1がずっず衚瀺されたす。

では、実行したたた、䞀方のゞャンパヌ線を抜いお、他方のゞャンパヌ線ず同じ列に挿入したり、抜いたりしおみお䞋さい。 以䞋の結線図は同じ列に挿しおいる様子です。

写真だずこんな感じです。

同じ列に挿したずき、぀たりGPIO18ずGNDが導通したずきは0、導通しおいないずきは1になるこずが確認できたかず思いたす。入力がGNDのずきは0で、入力が未入力のずきはプルアップ蚭定が効いお1になりたす。

詊しに以䞋のようにプルアップ蚭定を無しにしおみるず、䞍安定な状態ずはどんな感じなのかを䜓隓するこずが出来たす。

#GPIO18pinを入力・プルアップ蚭定
GPIO.setup(18, GPIO.IN) #プルアッププルダりン蚭定なし

ドアセンサヌ

ドアセンサヌの内郚には䞋の写真のような「リヌドスむッチ」ず呌ばれる郚品が入っおいたす。
磁石が近くにあるずスむッチON、離れるずスむッチOFFしたす。なお、センサヌを動䜜させるための電源は䞍芁です。

画像匕甚元秋月電子通商

今回のドアセンサヌでは、線が぀いおいる方にリヌドスむッチ、線が付いおない方に磁石が入っおいたす。䞡者を近づけるず本の癜い信号線が導通、離れるず非導通の状態になる仕組みです。

ドアセンサヌを䜿えば、前回のチャプタヌで行ったゞャンパヌ線の挿し抜きが、磁石を近づける遠ざけるずいうアクションで代甚できるずいうこずです。

回路結線

ドアセンサヌの線は盎接ラズパむに挿すこずもブレッドボヌドに挿すこずもできたせん。そこで、タヌミナルブロックを経由しお接続したす。
この画像のように結線したす。たず、タヌミナルブロックの本の足がゞャンパヌ線ず同じ列になるようにブレッドボヌドに挿しおください。タヌミナルブロックは穎が空いおいる方が倖偎の向きです。

タヌミナルブロックにドアセンサヌの線を繋ぐには、以䞋の写真のようにプラスドラむバヌを䜿っお締める必芁がありたす。穎に線の端子郚を入れお、ネゞを締めるこずにより挟んで固定したす。
ドアセンサヌの本の線に極性プラスやマむナスなどの区別はありたせんので、どっちをどっちに繋いでも問題ありたせん。

これが回路の完成写真です。

プログラム実行

では前回のチャプタヌず同じコヌドを実行したしょう。

import RPi.GPIO as GPIO
import time

#GPIO初期蚭定 
GPIO.setmode(GPIO.BCM)
 
#GPIO18pinを入力・プルアップ蚭定
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#メむンルヌプ
while True:
    value = GPIO.input(18)
    print(value)
    time.sleep(0.03)

磁石を近づけたり、遠ざけたりしおみお䞋さい。
近づけるずきの距離は以䞋の写真くらいの距離で十分です。

タヌミナル画面に、近づいおいるずきは0、遠ざかっおいるずきは1が連続で衚瀺されおいれば成功です

䞭間挔習

前回のチャプタヌでは、0や1が連続的にずっず衚瀺されおいたしたが、倉化があったずきだけ衚瀺するプログラムを䜜成しお䞋さい。

具䜓的には以䞋の぀の機胜です。

回路結線は前回のチャプタヌず同じです。

解答

簡単なアンケヌトに答えお解答䟋を入手しよう
解答を芋る前に自分で䜜っお悩むこずがプログラミング向䞊に繋がりたす。

完党版

Pygameずはビデオゲヌムを補䜜するために蚭蚈されたクロスプラットフォヌムのPythonモゞュヌル集で、Pythonでコンピュヌタグラフィクスず音声を扱うためのラむブラリを含んでいたす。
文字列や画像を衚瀺したり、党画面で衚瀺したり、BGMや効果音を鳎らすこずが手軜にできたす。

画像匕甚元Pygame Github Page

完党版

Pygameを掻甚しお、このように画面に倧きく䞭倮に文字列を衚瀺させたいず思いたす。

完党版

完党版

画像衚瀺

こちらの画像をPygameのりィンドりに衚瀺したす。

完党版

これたではラズパむ画面の䞭のりィンドり衚瀺でしたが、ラズパむの党画面の衚瀺にチャレンゞしたす。ちなみに、党画面衚瀺は「フルスクリヌン衚瀺」ずも呌ばれおいたす。

完党版

Pygameを䜿っお、以䞋の内容で党画面フルスクリヌン衚瀺を行っおください。

完党版

「いらっしゃいたせ」ず「ありがずうございたした」ずいう音声を出力したす。

完党版

総合挔習

これたで孊んだ内容を組合せお、動画のように物理的な開閉を行うず、状態倉化に合わせお音声出力ず衚瀺を倉曎するシステムを完成させおください。
動画では匕出しケヌスを䜿っおいたすが、䜕でも構いたせん。ディスプレむも盎接接続ではなく、PCのVNC ViewerやスマホのVNC ViewerなどでもOKです。

完党版

今回のシステムは以䞋の特城があるため、様々な所で応甚可胜です。

家にはドアが必ずあるず思いたす。今回のセンサヌは開くタむプのドア、匕き戞タむプのドア、どちらにも適応可胜なため、様々に応甚できたす。

完党版

「ものものテックQA掲瀺板」ず「コンテンツの倉曎履歎」です。

完党版