Pythonロボティクスコース レッスン 9 *
テーマ.2-4 PythonによるStuduino:bitの制御
Python のプログラムで Studuino:bitのLED ディスプレイを制御しよう
チャプター1
このレッスンで学ぶこと
このレッスンでは、ここまでで学習したことを踏まえて、Studuino:bitのLEDディスプレイをPythonで制御して作品を制作する実践的な課題に取り組みます。順番に取り組むことで、Studuino:bitに用意されている各クラスのメソッドを理解し、オリジナルの作品を制作する力が身に着きます。また、自分で考える発展的な課題も設定していますので、できるだけプログラム例を見ずに、取り組むようにしてください。
チャプター2
作品例①:イメージの表示
LEDディスプレイには文字列だけでなく、5×5マスを使用した簡単なイメージを表示することができます。練習として、下の笑顔のイメージを表示するプログラムを作成してみましょう。
2. 1 プログラムの作り方
StuduinoBitImageクラスを利用してイメージの作成を行います。このクラスはコンストラクタ(__init__()
メソッド)の引数として、LEDの点灯パターンを表す文字列を指定します。この文字列は次のようにフォーマットが決まっており、〇には0または1の数字が入り、対応するLEDをONにする場合は1を、OFFにする場合は0を指定します。
'○○○○○:○○○○○:○○○○○:○○○○○:○○○○○:'
この文字列は「:
(コロン)」までの5つの数字が1行のLEDの並びを表しており、左から順に「1行目:2行目:3行目:4行目:5行目」となっています。このフォーマットに従うと、笑顔のイメージを表す文字列は次のようになります。
これを踏まえた上で、作成したプログラムが以下になります。
【 サンプルコード 2-1-1 】
1. from pystubit.board import display, Image
2.
3. image = Image('00000:01010:00000:10001:01110:')
4. display.show(image)
1行目では、StuduinoBitDisplayクラスのインスタンスdisplay
とStuduinoBitImageクラスのクラス名を省略したImage
を取り込んでいます。3行目では、笑顔のイメージになる点灯パターンでStuduinoBitImageクラスのインスタンスを作成しています。そして、最後の4行目でLEDディスプレイのshow()
メソッドで作成したイメージを表示しています。完成したプログラムを実行して結果を確認しましょう。
2. 2 発展的な課題
次の飛行機を表したイメージをLEDディスプレイに表示してください。
■ プログラム例
飛行機の点灯パターンは以下の文字列で表すことができます。
そのため、以下のコードでLEDディスプレイに飛行機のイメージを表示することができます。
【 サンプルコード 2-2-1 】
1. from pystubit.board import display, Image
2.
3. image = Image('00100:00100:01110:11111:01010:')
4. display.show(image)
チャプター3
作品例②:複数のイメージを使ったアニメーション
2つ以上のイメージを順番に表示すると簡単なアニメーション表現ができます。例えば、次の2つの犬のイメージを繰り返し交互に切り替えると、歩いているように見えるアニメーションができます。
実際にプログラムを書いて、このアニメーションを制作してみましょう。
3. 1 プログラムの作り方
Studuio:bitに使われているLEDは「フルカラーLED」といい、1つのLEDの中に赤・緑・青の3色の小さなLEDが組み込まれています。この赤・緑・青の3色を「光の3原色」といい、それぞれの色を強弱を変えて重ねることで様々な色を作ることができます。
LEDの点灯色はプログラムで調整できます。これまで作成してきたプログラムでは特に色の指定をしていなかったため、初期設定の赤色で点灯するようになっていました。
LEDの点灯色はイメージの作成時と作成後のどちらでも設定することができます。作成後に設定するときは、StuduinoBitImageクラスのset_base_color()
メソッドを使います。このメソッドの引数は、赤・緑・青の3色の強さを表したタプルで、各色の強さは0~31の整数値で指定します。
StuduinoBitImage.set_base_color( ( 赤色の強さ, 緑色の強さ, 青色の強さ ) )
・・・作成したイメージに含まれる全てのLEDの点灯色を引数に指定した色に変更します。
以上のことを踏まえてプログラムを作成します。始めに、StuduinoBitImageクラスのインスタンス display
と、StuduinoBitImageクラスの省略名 Image
を取り込みます。
from pystubit.board import display, Image
次に、2つのイメージのインスタンスをそれぞれ下の図の点灯パターンで作成します。
追加【3行目~4行目】
1. from pystubit.board import display, Image
3. image1 = Image('00000:00100:11001:11110:01001')
4. image2 = Image('00000:01000:11001:11110:00110')
続けて、2つのイメ―ジの色を黄色に設定します。黄色は赤色と緑色の光を同じ強さで混ぜると作成できます。そのため、(31,31,0)
のタプルが黄色を表します。引数にこのタプルを指定して、set_base_color()
メソッドを呼び出します。
追加【6行目~7行目】
1. from pystubit.board import display, Image
3. image1 = Image('00000:00100:11001:11110:01001')
4. image2 = Image('00000:01000:11001:11110:00110')
5.
6. image1.set_base_color((31, 31, 0))
7. image2.set_base_color((31, 31, 0))
最後に2つのイメージを交互に繰り返しLEDディスプレイに表示します。while文を使った永久ループ内で、display
オブジェクトのshow()
メソッドを呼び出しましょう。
【 サンプルコード 3-1-1 】
追加【9行目~11行目】
1. from pystubit.board import display, Image
2.
3. image1 = Image('00000:00100:11001:11110:01001')
4. image2 = Image('00000:01000:11001:11110:00110')
5.
6. image1.set_base_color((31, 31, 0))
7. image2.set_base_color((31, 31, 0))
8.
9. while True:
10. display.show(image1)
11. display.show(image2)
これでプログラムの完成です。実行して動作を確認しましょう。
■ アニメーションの速さを変える
show()
メソッドには複数の引数が用意されており、2番目の引数で表示時間の長さを変更できます。そのため、アニメーションの速さを変更したい場合は、show()
メソッドの2番目の引数に、イメージの表示時間をミリ秒単位で指定します。例えば、以下のようにコードを変更した場合、100ミリ秒(0.1秒)ごとに2つのイメージが切り替わるようになり、犬が走るアニメーションになります。
【 サンプルコード 3-1-2 】
変更【10行目~11行目】
1. from pystubit.board import display, Image
2.
3. image1 = Image('00000:00100:11001:11110:01001')
4. image2 = Image('00000:01000:11001:11110:00110')
5.
6. image1.set_base_color((31, 31, 0))
7. image2.set_base_color((31, 31, 0))
8.
9. while True:
10. display.show(image1, 100)
11. display.show(image2, 100)
3. 2 発展的な課題
次の4つのイメージを順番に繰り返し表示して、プロペラが回転するアニメーションを作成してください。
※ヒント:水色(シアン)は緑色と青色の光を同じ強さで混ぜて作成します。そのため、(0,31,31)
のタプルで表すことができます。
■ プログラム例
それぞれのイメージの点灯パターンは以下の文字列で表すことができます。
そのため、以下のコードのように各イメージのインスタンスを作成し、色を変えた上で、繰り返しLEDディスプレイに表示することで、回転するアニメーションが作成できます。
【 サンプルコード 3-2-1 】
1. from pystubit.board import display, Image
2.
3. image1 = Image('11100:01100:00100:00110:00111')
4. image2 = Image('10000:11000:11111:00011:00001')
5. image3 = Image('00001:00111:11111:11000:10000')
6. image4 = Image('00111:00110:00100:01100:11100')
7.
8. image1.set_base_color((0, 31, 31))
9. image2.set_base_color((0, 31, 31))
10. image3.set_base_color((0, 31, 31))
11. image4.set_base_color((0, 31, 31))
12.
13. while True:
14. display.show(image1, 200)
15. display.show(image2, 200)
16. display.show(image3, 200)
17. display.show(image4, 200)
チャプター4
作品例③:幼児向け英語学習教材
LEDディスプレイへの2種類の表示方法を組み合わせて、英語のアルファベットとそれぞれのアルファベットを頭文字とする果物や野菜を表す英単語を学習する教材を制作します。
この作例では、以下の順番でアルファベットと英単語を表示し、これを繰り返します。
- 「A」を1500ミリ秒表示:
show()
メソッド - 「Apple」をスクロール表示:
scroll()
メソッド - 1秒だけ間を空ける:
time.sleep_ms(1000)
- 「B」を1500ミリ秒表示:
show()
メソッド - 「Banana」をスクロール表示:
scroll()
メソッド - 1秒だけ間を空ける:
time.sleep_ms(1000)
- 「C」を1500ミリ秒表示:
show()
メソッド - 「Carrot」をスクロール表示:
scroll()
メソッド - 1秒だけ間を空ける:
time.sleep_ms(1000)
プログラムの作り方
始めに、StuduinoBitImageクラスのインスタンス display と、途中で一定の秒数だけ処理の間を空けるために使うtime
機能を取り込みます。
1. from pystubit.board import display
2. import time
まずは、アルファベットの「A」とAから始まる英単語「Apple(りんご)」を表示します。show()
メソッドが2番目の引数で表示を切り替える時間を変更できたように、scroll()
メソッドもスクロール表示の時間を2番目の引数で変更することができます。例えば次のように「50」を指定した場合、50ミリ秒でLED1個分だけ左にスクロールするようになります。
追加【4・5行目】
1. from pystubit.board import display
2. import time
3.
4. display.show('A', 1500)
5. display.scroll('Apple', 50)
time
機能のslee_ms()
メソッドで1秒間だけ空けて、続けて「B」と「Banana」、「C」と「Carrot」を順番に表示します。これをwhile文の永久ループで囲みます。
【 サンプルコード 4-1-1 】
追加・変更【4行目~13行目】
1. from pystubit.board import display
2. import time
3.
4. while True:
5. display.show('A', 1500)
5. display.scroll('Apple', 50)
7. time.sleep_ms(1000)
8. display.show('B', 1500)
9. display.scroll('Banana', 50)
10. time.sleep_ms(1000)
11. display.show('C', 1500)
12. display.scroll('Carrot', 50)
13. time.sleep_ms(1000)
これでプログラムの完成です。実行して、動作を確認しましょう。
発展的な課題
アルファベットと単語の間に単語が表す果物や野菜のイメージを1500ミリ秒間表示するようにプログラムを変更してください。
それぞれ表示するイメージは次の通りです。
■ プログラム例
イメージを作成するため、StuduinoBitImageクラスの省略名 Image を取り込みます。そして、それぞれのイメージをもつインスタンスを作成し、set_base_color()
メソッドで色を変更します。それらをStuduinoBitDisplayクラスのshow()
メソッドで間に表示することでプログラムが完成します。`
【 サンプルコード 4-2-1 】
追加【4行目~9行目、13行目、17行目、21行目】
1. from pystubit.board import display, Image
2. import time
3.
4. image_apple = Image('00100:01110:11111:11111:01110:')
5. image_apple.set_base_color((31, 0, 0))
6. image_banana = Image('00010:00110:00110:01100:11000:')
7. image_banana.set_base_color((31, 31, 0))
8. image_carrot = Image('01110:01110:01110:01110:00100:')
9. image_carrot.set_base_color((31, 10, 0))
10.
11. while True:
12. display.show('A', 1500)
13. display.show(image_apple, 1500)
14. display.scroll('Apple', 50)
15. time.sleep_ms(1000)
16. display.show('B', 1500)
17. display.show(image_banana, 1500)
18. display.scroll('Banana', 50)
19. time.sleep_ms(1000)
20. display.show('C', 1500)
21. display.show(image_carrot, 1500)
22. display.scroll('Carrot', 50)
23. time.sleep_ms(1000)
チャプター5
作品例④:イルミネーションライト
Studuino:bitでは、LEDを1つずつ指定して、色を変化させることができます。これを利用して、次のように次第に色が変化するイルミネーションライトを作りましょう。
5. 1 プログラムの作り方
各LEDの位置は、次のx-y座標で決められています。y軸の向きと左上のLEDが原点の(0, 0)となることに注意してください。
LEDを座標で指定して点灯させるときは、StuduinoBitDisplayクラスのset_pixel()
メソッドを使います。set_pixel()
メソッドの、第1引数が点灯するLEDのx座標で、第2引数がy座標になります。また、第3引数で点灯時の色を指定します。
StuduinoBitDisplay.set_pixel(x座標, y座標, LEDの点灯色)
・・・指定したx-y座標にあるLEDを指定した色で点灯します。
練習として、上の右図のように (1, 1)
と (4, 3)
の位置にあるLEDを赤色に点灯する下記のプログラムを書いて実行してみましょう。
【 サンプルコード 5-1-1 】
1. from pystubit.board import display
2.
3. display.set_pixel(1, 1, (31,0,0))
4. display.set_pixel(4, 3, (31,0,0))
■ イルミネーションライトのプログラム
制作するイルミネーションライトでは、LEDを「赤色 ⇒ 黄色 ⇒ 緑色 ⇒ シアン ⇒ 青色 ⇒ マゼンタ」の順番に変化させます。また、この変化は左の列から順番に右に向かって行われていきます。
この動作を実現するために、1つのLEDを点灯させるためのコードを1行ずつ地道に書いていては大変です。そこで、for文を使いプログラムを短くまとめます。まずは、左上の (0, 0)
から順番にLEDを赤色に点灯させ、一面を埋めるところまでを作成してみましょう。
■ 1列に並んだLEDを順番に点灯する
始めに、「x座標が0」の列のLEDを上から順番に点灯させます。x軸の座標は「0」に固定し、y軸方向の座標を「0, 1, 2, 3, 4」と順番に指定できれば良いので、このプログラムは次のように書くことができます。
1.from pystubit.board import display
2.import time
3.
4. display.clear()
5.
6. for y in range(0, 5):
7. display.set_pixel(0, y, (31, 0, 0))
8. time.sleep_ms(100)
4行目の display.clear()
は、繰り返しプログラムの動作結果を確認するときに、既に点灯しているLEDをすべて消灯する目的で入れています。そして、6行目のfor y in range(0, 5):
で、変数y
の値を0~4まで変えながら内部のコードを繰り返し実行しています。7行目の display.set_pixel(0, y, (31, 0, 0))
の第2引数に変数y
を指定することで、(0, 0)
、(0, 1)
、(0, 2)
、(0, 3)
、(0, 4)
の順に座標を指定して、LEDを点灯しています。8行目の time.sleep_ms(100)
は、100ミリ秒(0.1秒)おきにLEDを点灯させるために入れています。これを省略した場合は、1列のLEDが一瞬ですべて点灯します。
では、このプログラムを実行して、LEDが順番に点灯することを確認しましょう。
■ LEDを順番に点灯させ1面を埋める
次に、x軸方向へ同じ動作を繰り返すためのコードを追加していきます。同じくfor文を使って、x軸方向の座標が「0, 1, 2, 3, 4」と順番に変わるようにします。x軸方向の座標が変化したあと、再びy軸方向の座標を0から順番に変えることで、一面が点灯するようになります。
追加・変更【6行目~9行目】
1.from pystubit.board import display
2.import time
3.
4. display.clear()
5.
6. for x in range(0, 5):
7. for y in range(0, 5):
8. display.set_pixel(x, y, (31, 0, 0))
9. time.sleep_ms(100)
6行目の for x in range(0, 5):
の中に、7行目の for y in range(0, 5):
があることに注意してください。これによって、変数x
の値が変化するたびに、変数y
の値が繰り返し0~4まで変化するようになっています。また、8行目のdisplay.set_pixel(x, y, (31, 0, 0))
の第1引数が変数 x
に変わっていることにも注意してください。
これで、一面が埋まるように順番に点灯するプログラムができました。実行して動作を確認しましょう。
■ LEDの点灯色を順番に変える
最後に、色が繰り返し変化するようにコードを追加していきます。色は以下の順に変化させます。こちらもfor文で繰り返せるように、この順番でタプルにまとめます。タプルは、中に別のタプルを入れることができるため、色を表す複数のタプルを1つにまとめたタプル colors
を作成します。
追加【4行目】
1.from pystubit.board import display
2.import time
3.
4. colors = ((31, 0, 0), (31, 31, 0), (0, 31, 0), (0, 31, 31), (0, 0, 31), (31, 0, 31))
5.
6. display.clear()
7.
8. for x in range(0, 5):
9. for y in range(0, 5):
10. display.set_pixel(x, y, (31, 0, 0))
11. time.sleep_ms(100)
このタプルcolors
の要素をfor文で1番目から順番に取り出し、set_pixel()
メソッドの引数として指定すると、順番に色を変化させることができます。次のようにコードを追加・変更しましょう。
追加・変更【8行目~12行目】
1.from pystubit.board import display
2.import time
3.
4. colors = ((31, 0, 0), (31, 31, 0), (0, 31, 0), (0, 31, 31), (0, 0, 31), (31, 0, 31))
5.
6. display.clear()
7.
8. for color in colors:
9. for x in range(0, 5):
10. for y in range(0, 5):
11. display.set_pixel(x, y, color)
12. time.sleep_ms(100)
8行目の for color in colors:
でタプルcolors
の要素を順番に変数color
に入れています。そして、11行目の display.set_pixel(x, y, color)
の第3引数に変数color
を指定することで、変化後の色で繰り返し点灯するようになっています。
上のプログラムの実行結果が確認できたら、for color in colors:
以下をすべてwhile文を使った永久ループの中に入れてずっと繰り返し色が変わるようにしましょう。
【 サンプルコード 5-2-1 】
追加・変更【8行目~13行目】
1.from pystubit.board import display
2.import time
3.
4. colors = ((31, 0, 0), (31, 31, 0), (0, 31, 0), (0, 31, 31), (0, 0, 31), (31, 0, 31))
5.
6. display.clear()
7.
8. while True:
9. for color in colors:
10. for x in range(0, 5):
11. for y in range(0, 5):
12. display.set_pixel(x, y, color)
13. time.sleep_ms(100)
これでプログラムの完成です。完成したプログラムの13行目にあるtime.sleep(100)
の引数に指定する時間を自分なりに調整して、イルミネーションライトの表現を楽しみましょう。
5. 2 発展的な課題
下のように、1行(横に並んだ5つのLED)ずつLEDが点灯していくように、上のプログラムを変更してください。
■ プログラム例
さきほどのプログラムと違い、先にx軸方向に変化し、その後でy軸方向へと変化させます。そのため、for文の変数x
とy
を繰り返す順番を入れ替える必要があります。また、LEDは1行(x軸方向の0~4まで)を一斉に点灯させるため、time.sleep_ms(100)
を実行する場所も変える必要があります。これを踏まえて完成したプログラムが以下になります。
【 サンプルコード 5-2-2 】
変更【8行目~9行目、11行目】
1.from pystubit.board import display
2.import time
3.
4. colors = ((31, 0, 0), (31, 31, 0), (0, 31, 0), (0, 31, 31), (0, 0, 31), (31, 0, 31))
5.
6. display.clear()
7.
8. while True:
9. for color in colors:
10. for y in range(0, 5):
11. for x in range(0, 5):
12. display.set_pixel(x, y, color)
13. time.sleep_ms(100)
10行目がy軸方向に繰り返す for y in range(0, 5):
となり、11行目が x軸方向に繰り返すfor x in range(0, 5):
となっていることに注意してください。また、13行目のtime.sleep_ms(100)
のインデントの位置にも注意してください。x軸方向を全て点灯してから100ミリ秒待つようにしています。ここまでできたらクリック
チャプター6
おわりに
6. 1 このレッスンのまとめ
このレッスンでは、テーマ.1-1~テーマ.2-3までで学習したPythonの基本構文を組み合わせて、Studuino:bitのLEDディスプレイを様々な方法で制御しました。他にもブザーを利用したり、内蔵されているセンサーと組み合わせることで、様々な作品を制作することができます。また、ここまでのレッスンを終えて後で、もう一度始めのレッスンから読んでいくと、より理解が深まります。ぜひ時間を取って復習するようにしてください。
6. 2 次回のレッスンについて
入門編のレッスンはこれで終わりです。次回のレッスンでは、ロボット拡張ユニットを使用して、DCモーターやサーボモーター、3種類のセンサーの使い方を確認します。