計測・制御のプログラミングによる問題解決
Python版

教員用

目次
導 入
基本学習

身近なプログラミング …………………………………………………2ページ
センサー・アクチュエーターを活用したプログラムによる計測・制御の学習を行います。

………………………………………………………………7ページ
テーマ１ Pythonの基礎
Python の基本を学習し、メインユニットやロボットを制御するための Python ライブラリを使用する
準備をします。

1. Pythonの基礎 ………………………………………8ページ
2. スタンドアローンプログラム ……………………23ページ
付録 ……………………………………………………25ページ

テーマ2 LEDの制御 / ブザーの制御 ……………………………………………27ページ
メインユニットのフルカラー LED やブザーを活用して、信号機の制御やセンサーライトを再現しながらプログラムによる制御の基本を学習します。

1. 順次処理のプログラム ……………………………28ページ
2. 繰り返しのプログラム ……………………………32ページ
3. 条件分岐のプログラム ……………………………35ページ
付録 ……………………………………………………44ページ

テーマ3 ロボットカーの制御 ……………………………………………………47ページ
DCモーターと赤外線フォトリフレクタを活用して、衝突回避やライントレースなどロボットカー
による計測と制御を学習します。

1. DCモーターの制御 ………………………………48ページ
2. 車の制御 ……………………………………………55ページ
3. 衝突回避カーの製作 ………………………………62ページ
4. 落下回避カーの製作 ………………………………70ページ
5. ライントレースカーの製作 ………………………77ページ
付録 ……………………………………………………82ページ

1

導入

身近なプログラミング＜学習内容＞●身近な計測・制御システム●プログラミング環境の基本操作

2

１. 身の回りの計測・制御
私たちの身の回りにある電気製品は、計測・制御の仕組みを使って自動的に様々な仕事をしています。決まった動作を繰り返したり、外部の情報を元に柔軟に対応したりすることができるのは、コンピューターやセンサーが使われているからです。このような計測・制御システムは、センサー／コンピューター／アクチュエータの三つの要素から構成されています。
エアコンの例を見てみましょう。

例

エアコン

センサー

コンピューター

アクチュエータ

人 感センサー（赤外線センサ

センサーで感知・計測した情報をコンピューターからの指令をー）
・温感センサーで人の 位置処理・判断する。それを元に温度受けてモーターの回転数を変や 体 温・室 内 の 温度を計測すや風力を設定しモーターへ指示

え温度の調整をする。

る。

を出す。

人感センサー

モーター

コンピューター

身近な製品でどういうものがコンピューターやセンサーを活用しているか探してみましょう。
製品名

センサーで計測しているもの

計測結果からコンピューターが行う動作

風呂給湯器

水量

給湯する / 給湯を止める

お掃除ロボ

壁や障害物の有無

壁や障害物を避けるように動く

3

２. プログラミングとはエアコンの例のように、コンピューターが使われている機械はセンサーから得た情報を元に、あらかじめ人間が決めた手
順通りにアクチュエータを動かします。

例

エアコンを動かすとき人間が決めたエアコンの動作手順

起動スイッチが押される

設定温度を読み取る

現在の温度を計測する

繰り返す

設定温度に近づくように送風する

このようにコンピューターの動作手順を示したものをプログラムと言います。
プログラムは人間が話すときに使う言葉とは違う、特別な言葉を使って表します。
この言葉をプログラミング言語といい、プログラミング言語でプログラムを書くことをプログラミングと言います。本書では Python（パイソン）言語を使用し、プログラミングを学びます。

【Python 言語を使用したプログラム例（LED の点灯・消灯）】

from pystubit.board import display
import time
display.set̲pixel(1, 1, display.GREEN)
time.sleep(1)display.clear()4３. 計測・制御システムとArtecRobo2.0パーツの対応
ArtecRobo2.0のパーツは以下のようなコンピューターによる計測・制御システムで使われる各要素に対応しています。
自動ドアの動作の流れ

押しボタン式信号の動作の流れ

センサー
周囲の情報を計測する
赤外線フォトリフレクタ

ボタン

物体の有無を調べる

押されたことを調べる

コンピューターセンサーで得た情報を判断しアクチュエータに動メインユニット（Studuino:bit)

作命令を出すアクチュエータ

仕事を行う部分コンピューターからの命令に従って動作する

DCモーター

サーボモーター

電気を回転する力に変える

LEDライトブザー

電気を光に変える

電気を音に変える※アクチュエータとはエネルギーを動きに変えるものを指すため、動きのないLEDやブザーはアクチュエータに含まれません。

5

４. プログラミング環境
Studuino:bit の MicroPython プログラミング環境として、下記 ArtecRob2.0 の Python ページに推奨エディタを挙げています。
ドキュメント参考にダウンロード、
インストールしてください。

https://www.artec-kk.co.jp/artecrobo2/ja/software/python.php

6基本学習 テーマ 1
Python の基礎＜学習内容＞●プログラミング環境の準備●Python の基礎●Studino:bit ライブラリ解説

7

１. Python の基礎
Python の対話型インタープリタ REPL（Read-Evaluate-Print Loop）を使って、Python 言語でプログラミングする際の基礎を学びます。Mu の REPL を使用する手順を下記に記します。
①Studuino:bit と PC を接続します。
②Mu を起動して、
下図のように「モード」ボタンをクリックして、「Artec Studuino:bit MicroPython」をダブルクリッ
クしてください。

①モードをクリック②Studuino:bit をダブルクリック③REPL ボタンをクリックすると、Ｍｕウィンドウの下にウィンドウが表示され、入力待ちを示す「>>>」が表示されます。

このウィンドウで REPL を使用します。

8

REPLの自動エコーによって、ウィンドウの「>>>」の後にプログラムを入力すると、すぐに結果を見ることができます。
この章では、REPLを使ってPythonの基礎（データ型、変数、関数、
オブジェクト）を学び、Studuino:bitライブラリを使ってメ
インユニットを制御するプログラムを書くための基礎知識を身に着けます。

1.1

データ型

データ型は単に型と呼ばれることもあり、データ型によってできる処理が決まります。Pythonのデータ型は、整数、浮動小
数点数、文字列、ブール値です。それぞれの型について説明します。

1.1.1

整数と浮動小数点数

整数と浮動小数点数は、数値を表すデータ型です。整数は、5や-5など小数点以下がない数値、浮動小数点数は、3.14などの小数点以下の部分がある数値です。
整数と浮動小数点数は、次の演算子を使って数値間で計算することができます。
演算子

演算

例

意味

+

加算

a+b

aにbを加える

-

減算

a-b

aからbを引く

*

乗算

a*b

aにbをかける

/

徐算

a/b

aをbで割る//

除算（切り捨て）a//b

aをbで割る（整数部のみ）

%

剰余

a%b

aをbで割った余り

**

指数

a**b

aをb乗するREPLに計算式を入力することで結果を得ることができます。演算子の特徴を確かめましょう。
>>> 10 + 3
13>>> 10 - 3
7>>> 10 * 3
30>>> 10 / 3
3.333333>>> 10 // 3
3>>> 10 % 3
1>>> 10 ** 3
1000

9各演算子を使って、異なる数値間（整数と浮動小数点数）の計算もできます。
>>> 3.14 * -10-31.4
演算子には優先順位があります。下記の例では乗算の方が加算よりも優先順位が高いため結果は、14になります。
>>> 2 + 3 * 4
14
かっこを使って先に計算したい式を明示的に囲むことで、演算の優先順位を決めることができます。
>>> (2 + 3) * 4
20

1.1.2

文字列

文字列は、ʼHello, Worldʼのような文字の並びです。シングルクォーテーション（'）
かダブルクォーテーション
（"）
で文字を囲
んで作ります。下記のように ' を使用しても " を使用しても文字列を表現できます。REPLに文字列を入力してみましょう。

>>> 'Hello, World.''Hello, World.'>>> "Hello, World."'Hello, World.'

3個のシングルクォーテーション（'''）
かダブルクォーテーション（"""）
を使うことで、複数行の文字列を作ることができます。

>>> '''Hello, World.
... Hello, Python.''''Hello, World.\nHello, Python.'>>>
最初のトリプルクォーテーション（'''）
で、REPLは複数行の文字列を受け付けます。2行目以降は、>>>でなく…が表示され、入力状態が続いていることを表します。最後のトリプルクォーテーションを入力すると入力が終わり、結果を出力し、次の入力待ち(>>>)になります。
出力結果は、複数行でなく改行しているところに\nが表示され1行で表示されました。この文字（\n）
について次に記します。

10

1.1.2.1

エスケープシーケンス

文字そのものでなく改行などの特殊な文字列をエスケープシーケンスと言います。エスケープシーケンスは、特定の文字の前にバックスラッシュ（\）
を入れて作ります。代表的なエスケープシーケンスは、改行
（\n）
、
タブ
（\t）
、
シングルクォーテー
ション（\ʼ）
、ダブルクォーテーション（\”）
です。REPLで試してみましょう。
>>> 'Hello,\nPython.''Hello,\nPython.'\nがそのまま出力されます。これは、REPLのエコー表示は結果をそのまま表示するためです。エスケープシーケンスを解釈した表示にする場合は、print()関数を使用します。関数については、1.3で説明します。以下のようにprintの後の括弧()の中に文字列を入れて、結果を確認しましょう。
>>> print('Hello,\nPython.')Hello,
Python.
>>> print('\tHello, Python.')Hello, Python.
>>> print('Hello,\'Python.\'')
Hello,'Python.'>>> print('\"Hello\", Python.')"Hello", Python.

REPLの結果に改行コードやタブやクォーテーションが表示されました。
文字列を表すのに2種類のクォーテーション（'または"）がある理由は、クォーテーション文字を含む文字列を作りやすくするためです。下記のようにエスケープシーケンスを使用しなくてもクォーテーションを表現することができます。
>>> print('"Hello", Python.')"Hello", Python.

11ただし、下記のように同じ種類のクォーテーションを使用する場合は、エスケープシーケンスを使用しなければなりません（
エラーが出力されます）。
>>> print(''Hello', Python.')Traceback (most recent call last):
File "<stdin>", line 1
SyntaxError: invalid syntax
前出の複数行の文字列をprint()関数を使ってREPLで表示してみましょう。
>>> print('''Hello, World.
... Hello, Python.''')
Hello, World.
Hello, Python.
改行が解釈されて複数行の文字列が表示されました。

文字列は次の演算子が利用できます。
演算子

演算

意味

例

+

連結

ʻaʼ+ʼbʼʻaʼとʼbʼを連結する

*

くり返し

ʻaʼ*b

ʻaʼをb回繰り返す>>> 'Hello, ' + 'Python''Hello, Python'>>> 'Hello, ' * 2 + 'Python''Hello, Hello, Python'

1.1.3

ブール値

ブール値はTrueまたはFalseです。主に条件式（条件式は、基本学習テーマ2で学びます）の判定に使用されます。

12

1.2 変数
Pythonの変数は、値をさす名前のことです。値とは、前節で見てきた数値や文字列などです。
＝を使って変数に値を代入したり、変数名をつかって値を参照したりできます。
下記は、aという名前の変数に7（値）を代入し、print()関数で変数aの値を表示します。
>>> a = 7>>> print(a)7
REPLに変数名を入力するだけでも変数の値を表示できます（REPLのエコー表示機能で、変数に代入された値を表示します）
。
>>> a
7
変数名は下記の文字の組み合わせで作れますが、数字は変数名の先頭に使えません。
● 小文字の英字 (a 〜 z)

● 大文字の英字 (A 〜 Z)
● 数字 (0 〜 9)

● アンダースコア (̲)>>> 1a = 7

Traceback (most recent call last):
File "<stdin>", line 1

SyntaxError: invalid syntax for integer with base 10
数字を先頭に持つ変数名を使用するとエラー（SyntaxError）になります。

また、下記のPythonの予約語は、変数名に使用できません。
False

await

else

import

pass

True

class

ﬁnallyisreturn

None
and
as

assert
async

break

exceptcontinue for
def

del
elif

from

globalifinlambdaraise
try

nonlocal

while

or

yield

not

with

13

下記に、
これまで学習したデータ型の値を変数に代入し、出力する例を示します。
>>> a = 7>>> print(a)7>>> abc = 3.14>>> print(abc)
3.14>>> a̲b = 'Hello'>>> print(a̲b)
Hello>>> ̲abc = True>>> print(̲abc)
True

変数は、書き換えることができます。
>>> a = 5>>> print(a)5>>> a = 10>>> print(a)10次のように書くことによって、演算結果を変数に代入することができます。
>>> a = 95>>> a = a - 3>>> print(a)92

変数aに95が代入された後、a = a ‒ 3で、右辺がまず計算され（a - 3）、次に右辺の結果(a -3の結果)が左辺の変数に代入

されます。

14

1.3 関数関数とは決められた処理を実行する名前が付いたコードです。ユーザーは、関数を呼び出す（コールする）
ことで処理された結果を取得します。関数によっては、コールする際に入力引数が必要な場合や、結果を出力しない場合もあります。
ユーザー

関数を呼び出す

関数

処理
結果を返す
Pythonでは、次のように記述することで関数をコールする事ができます。引数には、関数コール時に必要な値を設定します。

関数名 ( 引数 )前節で既にPythonの組み込み関数（Pythonであらかじめ用意された標準で使用できる関数）のprint()関数を使っていました。

>>> print('Hello, Python.')Hello, Python.

print()関数は、関数名がprintで、引数に表示したい文字列を受け取り、受け取った文字列を出力する関数です。下記でPythonの組み込み関数一覧を確認できます。

https://docs.python.org/ja/3/library/functions.html

1.3.1 データ型の確認
ここまでデータ型を学びましたが、組み込み関数のtype()関数を使うことでデータ型を調べることができます。type関数は引数に値を受け取り、受け取った値の型を出力する関数です。REPLで下記のようにtype()関数を使ってそれぞれの型を確かめましょう。

>>> type(5)<class 'int'><class ʻintʼ>のintは、integer（整数）を表しており、5が整数であることを示しています。
>>> type(3.14)<class 'ﬂoat'><class ʻﬂoatʼ>のﬂoatは、ﬂoating point（浮動小数点数）を表しており、3.14が浮動小数点数であることを示しています。
>>> type('Hello')<class 'str'>>>> type("Hello")<class 'str'><class ʻstrʼ>のstrは、string（文字列）を表しており、ʼHelloʼも”Hello”も文字列であることを示しています。

15

>>> type(True)<class 'bool'>>>> type(False)<class 'bool'><class ʻboolʼ>のboolは、boolean（ブーリアン）
を表しており、TrueもFalseもブール値であることを示しています。

1.3.2

その他の組み込み関数

組み込み関数から、べき乗計算するpow()関数を使ってみます。pow()関数は、引数を２つ必要とします。引数が複数必要な場合、最初の引数を第一引数、次の引数を第二引数、その次を第三引数というように呼びます。各引数は、コンマ(,)で区切って渡します。

pow()関数は、第一引数に底を、第二引数に指数を受け取り、べき乗した結果を出力する関数です。
>>> pow(10, 3)
1000

引数で渡した底(10)と指数(3)から10の３乗の結果(1000)が返ります。

文字列の長さを調べるlen()関数を使ってみましょう。len()関数は、文字列を受け取り、文字数を出力する関数です。
>>> len('abcde')5

引数で渡した文字列(ʻabcdeʼ)の文字数(5)が返ります。len()関数は、数値を渡すとエラー（TypeError）になります。関数の引数には、定義されたデータ型の値を渡さなければなりません。
>>> len(12345)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: object of type 'int' has no len()str()関数を使用する事で文字列以外のデータ型を文字列に変換できます。
>>> str(12345)'12345'

下記のようにstr()関数で文字列に型変換された戻り値をlen()関数の引数に渡すことができます。
>>> len(str(12345))
512345の文字数を調べることができました。

関数は定義することができます。関数の定義は、基本学習テーマ2で学びます。

16

1.4 オブジェクト
オブジェクトには、データ
（変数）
とコード
（関数）
の両方が含まれています。オブジェクトのデータは属性（プロパティ）、関数
はメソッドと呼ばれます。下図にオブジェクト、属性、メソッドのイメージを記します。

ユーザー

メソッド 1() をコールする

メソッド 1()
メソッド 2()

オブジェクト
属性 1
属性 2

ユーザーはオブジェクトが提供するメソッドをコールし結果を得ます。オブジェクトのメソッドをコールする場合、次のように
オブジェクト名をタイプしてからドット、
さらにメソッド名をタイプして、メソッドに必要な引数を指定します。

オブジェクト名 . メソッド名 ( 引数 )Pythonではすべて（整数、浮動小数点数、文字列、
ブール値、その他のデータ型、関数、プログラム）
がオブジェクトです。オ
ブジェクトの例として文字列を使ってメソッドを使用してみましょう。まずは、REPLで文字列（'helloʼ）を調べてみましょう。
>>> help('hello')
結果は、次のように「object hello is of type str（文字列型のhelloオブジェクト）」と表示された後にメソッド一覧が表示されます。
object hello is of type str
encode -- <function>ﬁnd -- <function>rﬁnd -- <function>…
isupper -- <function>
islower -- <function>
メソッド一覧の中のupper()メソッドは、文字列をすべて大文字にして返すメソッドです。REPLで下記を実行します。
>>> 'hello'.upper()'HELLO'
文字列オブジェクトʼhelloʼのupper()メソッドを引数なしでコールして、ʼHELLOʼ文字列オブジェクトが結果として出力されます。
Pythonでは、独自のオブジェクトを定義することもできます。この章では、オブジェクトのイメージと使い方の学習にとどめます。

17

1.5 データ構造
基本データ型を組み合わせて、複雑なデータ構造をつくることができます。以下にPythonの代表的なデータ構造であるリ
スト、
タプル、辞書を説明します。

1.5.1 リスト
リストは、複数の要素をまとめて扱えることができます。下記のように[]でリストを作成できます。
>>> l = [1, 'Hello', 3.14]>>> l[1, 'Hello', 3.14]
下記のようにオフセットを指定することでリストの要素を取り出せます。
>>> l[0]1>>> l[1]'Hello'>>> l[2]3.14
下記のようにオフセットを指定して代入することでリストの要素を変更できます。
>>> l[1] = 5>>> l[1, 5, 3.14]
また、下記のようにhelp()関数を使用する事でリストのメソッドを調べることができます。
>>> help(l)[出力結果は割愛します]
リストのように内容を直接変更できる型をミュータブルと言います。

1.5.2 タプル
タプルもリストと同様複数の要素をまとめて扱えることができますが、一度定義すると要素を変更することができません。
下記のように()でタプルを作成できます。
>>> t = (1, 'Hello', 3.14)>>> t(1, 'Hello', 3.14)18

リストと同様、下記のようにオフセットを指定することでタプルの要素を取り出せます。
>>> t[1]'Hello'
一度定義した要素を変更することはできませんので、下記のようにオフセットを指定して代入することはできません。
>>> t[1] = 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item assignment
タプルのように内容を変更できない型をイミュータブルと言います。
また、下記のようにhelp()関数を使用する事でタプルのメソッドを調べることができます。
>>> help(t)[出力結果は割愛します]

1.5.3 辞書
辞書は、キー : 値のペアで要素をまとめて扱えることができます。下記のように{}で辞書を作成できます。
>>> d = {'apple' : 100, 'orange' : 120, 'banana' : 90}>>> d{'orange': 120, 'banana': 90, 'apple': 100}
下記のようにキーを指定することで辞書の値を取り出せます。
>>> d['apple']100>>> d['orange']120>>> d['banana']90
下記のようにキーを指定して代入することで辞書の値を変更できます。
>>> d['apple'] = 80>>> d{'orange': 120, 'banana': 90, 'apple': 80}
また、下記のようにhelp()関数を使用する事で辞書のメソッドを調べることができます。
>>> help(ｄ)[出力結果は割愛します]191.6 モジュール
モジュールは、Pythonコード（関数やオブジェクト）をまとめたファイルです。

モジュール

ユーザー

オブジェクト 1
オブジェクト 2

モジュールを取り込んでプログラムで使用する

関数 1
関数 2

REPLで下記を実行することで利用可能なモジュール一覧を見ることができます。
>>> help('modules')[出力結果は割愛します]
モジュール一覧から算術演算用のmathモジュール、ハードウェアを制御するmachineモジュールを使ってみます。モジュールを使用するにはimport文を使います。import文のもっとも単純な使い方は下記です。

import モジュール名
REPLで下記を実行し、mathモジュールをインポートします。
>>> import math
これでmathモジュールにアクセスすることができます。REPLで下記（mathの後にドット(.)）
を入力し、タブキーを押すとmathモジュールで提供している関数やオブジェクトの一覧が表示されます。
>>> math.
[出力結果は割愛します]
REPLで下記を実行し、mathモジュールのpow()関数でべき乗計算をします。
>>> math.pow(10, 3)
1000.0
また、下記のようにasを使うことで、別名でインポートできます。

20

import モジュール名 as 別名
REPLで下記を実行し、mathモジュールを別名mでインポートし、pow()関数を実行します。
>>> import math as m>>> m.pow(10, 3)
1000.0pow()関数を実行するときに使用するモジュール名がmになります。
また、下記のようにfromを使うことでモジュールに含まれる使いたい関数やオブジェクトのみをインポートできます。

from モジュール名 import オブジェクト名または関数名
REPLで下記を実行し、mathモジュールのpow()関数のみインポートし、pow()関数を実行します。
>>> from math import pow>>> pow(10, 3)
1000.0mathモジュールからpow()関数をインポートしたため、pow()関数を実行するときにモジュール名が不要になります。
最後にmachineモジュールのreset()関数を使って、Studuino:bitのMicroPythonをリセットしましょう。
>>> import machine>>> machine.reset()
起動時の情報が出力されて、再び「>>>」が表示されます。

21

1.6

Studuino:bitライブラリ

メインユニット（Studuino:bit）を制御する、オブジェクトや関数をまとめたモジュールとしてStuduino:bitライブ
ラリを提供しています。
メインユニット（Studuino:bit）は下図のハードウェアを持っています。

（おもて）⑤フルカラーＬＥＤマトリクス５×５①温度センサー（うら）⑨電子ブザー⑥光センサー
③Ｂボタン

②Ａボタン

⑦通信ランプ（青）④電源ランプ（緑）⑩９軸センサー⑪エッジコネクター(３軸加速度＋３軸ジャイロ＋３軸コンパス)⑧アーテックブロック
接続カバー

Studuino:bitライブラリを使用することで、Studuino:bitのハードウェアを簡単に制御できます。ライブラリには、Studuino:bitの各ハードウェアに対応したオブジェクトが定義されています

番号ハードウェアオブジェクト機能概要①

温度センサーtemperature

温度センサーの値の取得

②

ボタンA

button̲a

ボタンAのON/OFF判定など

③

ボタンB

button̲b

ボタンBのON/OFF判定など⑤

フルカラーLEDマトリクス５×５

display

各LEDのON/OFFやLEDを使ったアニメーションなど

⑥

光センサー

lightsensor

光センサーの値の取得

⑨

電子ブザー

buzzer電子ブザーで鳴らす音の高さやをON/OFFなど

３軸加速度センサー

accelerometer

加速度センサーの値の取得

３軸ジャイロセンサー

gyro

加速度センサーの値の取得

３軸地磁気センサー

compass

地磁気センサーの値に取得

エッジコネクター

P0〜P16、P19、P20

エッジコネクターの入出力制御⑩⑪

各オブジェクトは、pystubit.boardモジュールに定義されています。
REPLで下記を実行し、Studuino:bitメインユニットの画面に文字列”Hello, MicroPython”がスクロール表示されることを確認してください。
>>> from pystubit.board import display>>> display.scroll(ʻHello, MicroPythonʼ)22

2. スタンドアローンプログラム
ここまでREPLに入力して実行し結果を確認してきました。次のテーマでは、REPLを使用せず実行するプログラムを作成します。

2.1

MuエディタMuエディタのテキストエディタにプログラムを書きます。

ここにプログラムを書きます。

「1.6 Studuino:bitライブラリ」で、REPLで実行したプログラムをテキストエディタに記述し実行しましょう。

①下記をテキストエディタに入力します。

from pystubit.board import display
display.scroll(ʻHello from Editorʼ)②転送ボタンをクリックします。

※転送ボタンが無効（灰色表示）になっている場合は、REPLボタンをクリックし、REPLウィンドウを閉じることで、転送ボタンが有効になります。

23

③表示されるダイアログで、プログラムの転送先0〜9のいずれかのTransferボタンをクリックします。

ステータスバーに「Finished transfer.」と表示されたら、転送完了です。

Studuino:bitメインユニットの画面に文字列”Hello from Editor”がスクロール表示されることを確認してください。
プログラムは転送されているため、標示終了後は、Studuino:bitメインユニットのリセットボタンを押すことで再度プログラムが実行されます。

24

付録A.

Studuino:bitソフトウェア Pythonエディタ

次章からは、Studuino:bitソフトウェアのPythonエディタにプログラムを書いて実行することもできます。

①Studuino:bitソフトウェアを起動し、ロボットモードを選択します。
ロボットモードを選択してください。

②Pythonタブを選択します。
メニュー

Pythonタブ

スクリプトエリア：プログラムを作ることができます25

③下記をスクリプトエリアに入力します。

1: from pystubit.board import display
2: display.scroll(ʻHello from Editorʼ)④以下の手順で、プログラムを転送します。
Windows/Mac の場合①コンピューターと Studuino:bit を USB ケーブルで接続します。

Android/iPad/Chromebook の場合①表示されるメッセージに従い、Studuino:bit の B ボタンを押しながらリセットボタンをおしてください。

リセットボタン
Bボタン②「編集」
から転送を選択します。
②Studuino:bit の LED に表示された点灯パターンと同じデバイスを選択してください。

⑤プログラムの転送する先を指定してください。※0 〜 9 まで選択できます。

転送が完了すると、自動的にプログラムが実行されます。再度動かしたい場合はリセットボタンをおしてください。

26

基本学習 テーマ 2
LED の制御＜学習内容＞●LED の制御 / ブザーの制御●順次処理●繰り返し処理●条件分岐処理27

１. 順次処理のプログラム
命令を順番通りに行う処理のことを「順次処理」といいます。LED を使った信号機をつくる中で、順次処理のプログラム
を学びましょう。
青信号を５秒点灯

赤信号を５秒点灯

黄信号を１秒点灯

1.1 「信号機」の組み立て
⋇

⋈

⋉

%$77

28

1.2

LED を点灯させるプログラム

下記に LED を緑色に点灯するプログラムを記します。

1: from pystubit.board import display
2:
3: display.set̲pixel(1, 1, display.GREEN)
メインユニット（以下、Studuino:bit）のハードウェアの制御には、Studuino:bitライブラリを使用します。
1行目のfrom pystubit.board import displayで、Studuino:bitライブラリのpystubit.boardモジュールから、display
オブジェクトをインポートします。displayオブジェクトは、LEDディスプレイのON/OFFを制御するメソッドや色の情報などを持ちます。displayオブジェクトの機能は、付録Aを参照してください。
displayオブジェクトのset̲pixel()メソッドを使用します。set̲pixel()メソッドは、LEDディスプレイの特定のLEDを点灯するメソッドで、次のように定義されています。

set̲pixel(x, y, color)set̲pixel()メソッドの引数にLEDディスプレイのどのLEDを何色に点灯するかを指定します。3行目のdisplay.set̲pixel(1, 1, display.GREEN)と記述することで、LEDディスプレイの位置(x, y) = (1, 1)を緑色(display.GREEN）に点灯します（下図）。

X
0 1 2 3 4
0Y

12

display.set̲pixel(1, 1, display.GREEN)

3

X座標

4

Y座標

LED の座標は上図のとおり
display.GREENは、displayオブジェクトのGREENプロパティで、緑色を表します。
Studuino:bitに転送して、動作確認しましょう。

29

色

1.3

LED を 1 秒間だけ点灯させるプログラム

下記に LED を緑色に 1 秒間だけ点灯するプログラムを記します。

1: from pystubit.board import display
2: import time3:
4: display.set̲pixel(1, 1, display.GREEN)
5: time.sleep(1)6: display.clear()

2行目のimport timeは、Python標準ライブラリのtimeモジュールを使用することを表します。timeモジュールには、Studuino:bitが起動してからの経過時間やスリープ（停止）
処理などの機能が用意されています。timeモジュールのsleep()関数は、引数で指定した時間プログラムを停止します。5行目time.sleep(1)で1秒間プログラムを停止します。6行目のdisplay.clear()でLEDディスプレイのすべてのLEDを消灯します。clear()メソッドは引数がないため、()の中に値を設定する値はありません。
time.sleep(1)の引数を変えることで、LEDの点灯時間を変えることができます。また、引数には浮動小数点数も設定することができます。引数を自由に変えて動かしてみましょう。

プログラムは必ず上から順番に実行されます。

1:from pystubit.board import display

2:

import time3:
4:

display.set̲pixel(1, 1, display.GREEN)

5:

time.sleep(1)6:display.clear()

また、time.sleep(1)を入れないとどうなるでしょうか。下記のプログラムで動作をさせた場合、LEDはほとんど点灯しません。これはStuduino:bitがプログラムを非常に高速で処理していることが原因です。つまり、「LED点灯」の命令の直後に、「LED消灯」の命令が行われてしまうため、LEDを点灯している時間がありません。

30

1:

from pystubit.board import display

2:

import time3:
4:

display.set̲pixel(1, 1, display.GREEN)

5:

display.clear()

練習課題

自動車用信号機のプログラムの作成

次の動作の手順をフローチャートにまとめたあと、プログラムをつくりましょう。

青信号を５秒点灯

黄信号を１秒点灯

赤信号を５秒点灯

プログラム例

はじめ

1:from pystubit.board import display

青信号を点灯2:

import time

５秒待つ

3:
4:

display.set̲pixel(1, 2, display.GREEN)

5:

time.sleep(5)6:display.clear()7:

display.set̲pixel(2, 2, display.YELLOW)

黄信号を消灯

8:

time.sleep(1)

赤信号を点灯

9:display.clear()

５秒待つ

10:

display.set̲pixel(3, 2, display.RED)

赤信号を消灯

11:

time.sleep(5)12:display.clear()

青信号を消灯黄信号を点灯
１秒待つ

おわり

31

２. 繰り返しのプログラム
ある命令を繰り返し行う処理のことを「繰り返し処理」といいます。前のページで作成した信号機のプログラムは赤信号の点灯が完了すると消灯し、その後、プログラムは動きません。実際の信号機のように繰り返し動作させるには、この「繰り返し処理」が必要になります。

Python の繰り返し処理は、決められた回数や処理したい要素の回数分繰り返す for ループと、条件を満たす間、処理を繰り返す while ループがあります。

2.1 フローチャートと Python の構文
指定回数を繰り返す処理をフローチャートと Python で表現する方法を下記に示します。Python の for 文の最後には必ずコロン (:) を付けます。Python は、空白を使ってプログラムの構造を定義します。
「 繰り返したい処理」は、必ず先頭にインデント（4 つのスペース）を付けます。
フローチャート

Python

繰り返し○回

繰り返し処理の開始

繰り返し戻る

繰り返し処理の終了

for 変数名 in range(回数):繰り返したい処理繰り返したい処理は先頭にインデントを付けます。

前章の信号機の動作を繰り返すフローチャートと Python の疑似コード（※）を下図に示します。下図のように自動車

信号機のプログラム全体（繰り返す処理）をインデントで字下げする点を注意してください。

※：疑似コード（pseudocode）とは、実際にコードを書く前に、言葉を使って記述することで処理の流れをまとめるコードです。取り決めはありません。

32

フローチャート

Pythonはじめ

for 変数名 in range(回数)：繰り返し○回

青信号を点灯インデント

青信号を点灯5秒待つ

５秒待つ

青信号を消灯

青信号を消灯黄信号を点灯黄信号を点灯1秒待つ

１秒待つ
黄信号を消灯黄信号を消灯赤信号を点灯赤信号を点灯5秒待つ

５秒待つ

赤信号を消灯

赤信号を消灯繰り返し戻るおわり

2.2

プログラムの改造（繰り返し処理の追加）

下図に 10 回繰り返す自動車信号機のプログラムを記します。

1:

from pystubit.board import display

2:

import time3:
4:

for i in range(10):5:display.set̲pixel(1, 2, display.GREEN)

6:

time.sleep(5)7:display.clear()8:

display.set̲pixel(2, 2, display.YELLOW)

9:time.sleep(1)10:display.clear()11:

display.set̲pixel(3, 2, display.RED)

12:time.sleep(5)13:display.clear()

33

練習課題

歩行者用信号機のプログラムの作成

次の動作の手順をフローチャートにまとめたあと、プログラムをつくりましょう。
青信号を５回点滅
点滅周期（１秒）

青信号を５秒点灯

赤信号を５秒点灯

ずっと繰り返し

永久ループは、フローチャートで下の左図のように表すことができます。Python で、永久ループで処理を繰り返したい

場合は、下の右図ように while を使用します。for 文と同様に繰り返したい処理は、必ず先頭にインデント（4 つのスペース）を付けます。

フローチャート

Pythonwhile True:

はじめ繰り返したい処理繰り返したい処理繰り返したい処理は先頭にインデントを付けます。

終了しないプログラム例

はじめ

青信号を点灯
５秒待つ
繰り返し

５回

青信号を点灯

1:from pystubit.board import display

2:

import time

3:
4:

while True:5:

display.set̲pixel(1, 2, display.GREEN)

6:

time.sleep(5)7:for i in range(5):0.5 秒待つ8:

display.set̲pixel(1, 2, display.GREEN)

青信号を消灯

9:

time.sleep(0.5)

0.5 秒待つ10:

display.clear()11:

time.sleep(0.5)

繰り返し戻る12:

display.set̲pixel(3, 2, display.RED)

赤信号を点灯

13:

time.sleep(5)

５秒待つ

14:

display.clear()

赤信号を消灯34

３. 条件分岐のプログラム
条件によって動作を分ける処理のことを「条件分岐処理」といいます。
押しボタン式信号機のプログラム作成を通して、条件分岐のプログラムを学びましょう。Python の条件分岐処理は、if-else を使用します。

3.1 フローチャートと Python の構文
分岐処理をフローチャートとPythonで表現する方法を以下に示します。Pythonで「条件が成り立つときの処理」と「条件が成り立たないときの処理」
は、必ず先頭にインデント（4つのスペース）を付けます。
フローチャート

Pythonif 条件式:

No

条件

条件式が成り立つときの処理

条 件で処 理を分ける

else:

Yes

条件式が成り立たないときの処理

条件判定後の処理は先頭にインデントを付けます。
上図の Python の「条件式」には次の比較演算子を使用します。
比較演算子

条件式の書き方の例

意味==

A == B

AとBは等しい!=A != B

AとBは等しくない>

A>B

AはBよりも大きい>=

A >= B

AはB以上

<

A<B

AはBより小さい<=A <= B

AはB以下

3.2 A ボタンを押している間 LED が点灯するプログラム
フローチャートと疑似コードは下図のようになります。
フローチャート

Pythonif Aボタンが押された：

はじめ

LEDを点灯
Ａボタンが
押された？

else：

No

LEDを消灯Yes
LED を点灯

LED を消灯

おわり

35

3.3 ボタンの数値
Studuino:bitライブラリのbutton̲aオブジェクトを使用する事で、Studuino:bitのAボタンを簡単に制御することができます。displayオブジェクトと同様、下記と記述することでbutton̲aオブジェクトを使用できます。

from pystubit.board import button̲abutton̲aオブジェクトのget̲value()メソッドを使うことで、Aボタンが押されているかどうかを1または0で取得できます。
ボタンオブジェクトの機能の詳細は、付録Bを参照してください。
Aボタンが押されている間LEDが点灯する処理を表すフローチャートとプログラムを下記に示します。
フローチャート

Python1:

はじめfrom pystubit.board import display, button̲a

2:

Ａボタンが
押された？

3:

No

while True:4:

if button̲a.get̲value() == 0:

5:

Yes

display.set̲pixel(0, 0, display.RED)

6:

LED を点灯

LED を消灯else:

7:

display.clear()

1行目のfrom pystubit.board import display, button̲aは、Studuino:bitライブラリからLEDディスプレイを制御する
displayオブジェクトとAボタンを制御するbutton̲aオブジェクトを使用することを表します。
4行目のbutton̲aオブジェクトのget̲value()メソッドで、Aボタンの状態を取得し、0の場合（押されている場合）、LEDディ
スプレイの(x, y)=(0, 0)のLEDを赤色に点灯し（5行目）、0以外の場合（押されていない場合）、LEDディスプレイを消灯します（7行目）。4行目〜7行目全体が先頭にインデントしており、3行目のwhile True:で永久ループの処理になっています。
while文を使用しないとどうなるでしょうか。while文を使用しない場合のフローチャートとプログラムは下記のようになります。
フローチャート
はじめ

Ａボタンが
押された？

No

Yes
LED を点灯

LED を消灯

Python

1:
2:
3:
4:
5:
6:

from pystubit.board import display, button̲aif button̲a.get̲value() == 0:
display.set̲pixel(0, 0, display.RED)
else:
display.clear()おわり

このプログラムを動作させると、A ボタンを押しても全く反応しなくなります。
これは、プログラムが非常に高速で処理されることで、プログラムを動作させた瞬間にプログラムが終了してしまうからです。
while 文を使用する事で A ボタンの値を常に確認するようになるため想定通りの動作をするようになります。

36

練習課題
＜押しボタン式信号機のプログラム＞

次の動作の手順をフローチャートにまとめたあと、プログラムをつくりましょう。
赤信号を点灯もしA ボタンが押されたら5 秒間待って赤信号を消灯

青信号を５秒点灯

青信号を５回点滅
点滅周期（１秒）

ずっと繰り返しプログラム例

はじめ

Yes
５秒待つ
赤信号を消灯from pystubit.board import display, button̲a2:

import time3:

赤信号を点灯

ボタンが
押された？

1:

4:
No

while True:5:

display.set̲pixel(3, 2, display.RED)

6:

if button̲a.get̲value() == 0:

7:time.sleep(5)8:display.clear()9:display.set̲pixel(1, 2, display.GREEN)

青信号を点灯

10:

time.sleep(5)

５秒待つ

11:

for i in range(5):

５回

12:

display.set̲pixel(1, 2, display.GREEN)

青信号を点灯

13:

time.sleep(0.5)

14:display.clear()15:

time.sleep(0.5)

繰り返し

0.5 秒待つ
青信号を消灯
0.5 秒待つ
繰り返し戻る37

4 ブザーをつかった制御（発展学習①）＜音響装置付信号機のプログラム＞
目の不自由な人のために、信号がかわったことを音で知らせてくれる信号機があります。
これを音響装置付き信号機といいます。
押しボタン式信号機のプログラムで青信号が点灯している間、ブザーの音を鳴らすプログラムを追加して音響装置付き信号機にしてみましょう。

この間、
音を流す
赤信号を点灯もしA ボタンが押されたら5 秒間待って赤信号を消灯

青信号を点灯青信号を５回点滅
点滅周期（１秒）

ずっと繰り返しプログラム例

はじめ

赤信号を点灯

ボタンが
押された？

No

Yes
５秒待つ
赤信号を消灯青信号を点灯

この処理の間、ブザーを鳴らすプログラムを追加します。

５秒待つ
繰り返し

５回

青信号を点灯
0.5 秒待つ
青信号を消灯
0.5 秒待つ
繰り返し戻る38

4.1 ブザーの音を鳴らすプログラム
Studuino:bitのブザー制御には、Studuino:bitライブラリのbuzzerオブジェクトを使用します。下記にブザーから音を鳴らすプログラムを記します。buzzerオブジェクトの機能の詳細は、付録Cを参照してください。

1:from pystubit.board import buzzer

2:

import time3:
4:

buzzer.on('60')

5:time.sleep(1)6:buzzer.oﬀ()

1行目のfrom pystubit.board import buzzerは、Studuino:bitライブラリからブザーを制御するbuzzerオブジェクトを使用することを表します。
4行目のbuzzer.on(ʻ60ʼ)で、ブザーからド(60)の音が出力されます。5行目のtime.sleep(1)で1秒スリープした後、6行目のbuzzer.oﬀ()でブザーを停止します。onメソッドに設定した値は、MIDIコードと呼ばれるものです。
ドが60、
ド#が61のよ
うにドレミに対応した番号になります。付録Eを参考にbuzzerオブジェクトのonメソッドやtimeオブジェクトのsleepメソッドの設定を変えて、出力する音の高さや音の長さを変えてみましょう。

4.2 カッコウの音をつくろう「カッコウ」の 音は音ぷにすると「ミ（ 6 4 ）・ド (6 0 )」です。

ミ「カッコウ」の音の長さの決め方「カッコウ」の音の楽譜

ド「カッコウ」の音のプログラム

buzzer.on('64')

1

音楽には音の長さや音同士の間隔などが決められた「楽譜」があります。
カッコウの曲にも楽譜があり、今time.sleep(0.1)

1回のプログラムの 2 つの音と 2 回の休みの長さも実際の楽譜に合わ

1
1

2

カッコウの音を5回繰り返す場合は、右記のようにfor文で繰り返します。

time.sleep(0.2)

2

2time.sleep(0.3)
buzzer.on('60')

2

せて設定しています。

buzzer.oﬀ()

buzzer.oﬀ()
time.sleep(0.6)

1:from pystubit.board import buzzer

2:

import time

3:

39

4:

for i in range(5):5:buzzer.on('64')

6:

time.sleep(0.1)

7:buzzer.oﬀ()

8:time.sleep(0.3)

9:buzzer.on('60')

10:

time.sleep(0.2)

11:buzzer.oﬀ()

12:time.sleep(0.6)

4.3 青信号が点灯している間音が鳴るようにしよう
まとまった処理を関数にすることでプログラムの見通しが良くなります。
Pythonでの関数定義は、
下記のように作成します。
def 関数名(引数):処理先頭にインデントを付けます。
関数で定義する「処理」
は、必ず先頭にインデント（4つのスペース）を付けます。関数名は、変数名と同じ規則に従います
（先
頭は英字か
「̲ 」
でなければならず、英字、数字、「̲ 」
以外は使えません）。また引数は、受け取らない場合は何も書きません。複数受け取る場合は、「, 」
で区切ります。

1: from pystubit.board import buzzer
2: import time3:
4: def kakko():5:

for i in range(5):6:buzzer.on('64')

7:

time.sleep(0.1)

8:buzzer.oﬀ()

9:time.sleep(0.3)

10:buzzer.on('60')

11:

time.sleep(0.2)

12:buzzer.oﬀ()

13:time.sleep(0.6)

kakko関数は、引数で値を受け取らないため、4行目のようにdef kakko():となります。5行目〜13行目の先頭にインデン
トを入れてkakko（）
関数の処理であることを表しています。
3.「条件分岐のプログラム」の練習課題で作成した押しボタン式信号機のプログラムの10行目（青信号が点灯した後のtime.sleep(5)）
をkakko関数の関数コールに置き換えます。

40

1: from pystubit.board import display, button̲a, buzzer
2: import time3:
4: def kakko():5:

for i in range(5):6:buzzer.on('64')

7:

time.sleep(0.1)

8:buzzer.oﬀ()

9:time.sleep(0.3)

10:buzzer.on('60')

11:

time.sleep(0.2)

12:buzzer.oﬀ()

13:time.sleep(0.6)

14:
15: while True:
16:

display.set̲pixel(3, 2, display.RED)

17:

if button̲a.get̲value() == 0:

18:time.sleep(5)19:display.clear()20:

display.set̲pixel(1, 2, display.GREEN)

21:

kakko()

22:for i in range(5):23:display.set̲pixel(1, 2, display.GREEN)

24:

time.sleep(0.5)

25:display.clear()26:

time.sleep(0.5)

4行目のkakko()関数は、21行目のkakko()で実行されます。

41

5 光センサーをつかった制御（発展学習②）＜センサーライトのプログラム＞
周囲が暗くなったら自動で照明が点灯する、センサーライトのプログラムを考えましょう。
周囲の明るさを調べるために、Studuino:bitの光センサーを使用します。光センサーは、明るさを0（暗い）〜4095（明るい）の値で返します。
センサーライトは、光センサーの値を利用して、ある一定以上の暗さになったらLEDを点灯させます。
このような点灯させる条件となる値を「しきい値」といいます。

0

しきい値より小さければしきい値より大きければ暗いと判断

明るいと判断4095

しきい値
しきい値を決めるために、光センサーの値を確認しましょう。

5.1 Mu で光センサーの値を確認する
本節の内容をStuduino:bitソフトウェアのPythonエディタで実施する場合は、付録Fを参照してください。Muエディタのテ
キストエディタに下記を入力します。

1: from pystubit.board import lightsensor
2: import time3:
4: while True:
5:value = lightsensor.get̲value()

6:

print(value)

7:time.sleep(1)光センサーの制御には、Studuino:bitライブラリのlightsensorオブジェクトを使用します。lightsensorオブジェクトのget̲value()メソッドを使用することで光センサーの値を取得することができます。光センサーオブジェクトの機能の詳細は付録Dを参照してください。
4行目のwhile True:以降に書かれた処理が永久ループします。5行目のvalue = lightsensor.get̲value()で光センサーの値をvalue変数に代入して、6行目のprint(value)で、REPLにvalueの値を表示します。7行目のtime.sleep(1)で1秒間スリープします。
Muエディタの実行ボタンをクリックすると、しばらくしてREPLに光センサーの値が１秒間隔で表示されます。光センサーを手で覆ったりして光センサーの値の変化を確認しましょう。

42

プログラムを終了したいときは、MuエディタのREPLボタンをクリックしてREPLを閉じます。

5.2 センサーライトの実現
下図にセンサーライトの例を示します。
フローチャート

1: from pystubit.board import display, lightsensor

はじめ

2: import time3:

LED を消灯

周囲が暗い（光センサー＜700）
Yes

4: while True:No5:display.clear()6:

if lightsensor.get̲value() < 700:

LED を点灯

7:display.set̲pixel(0, 0, display.RED)

5 秒待つ

8:

time.sleep(5)43

付録
付録 A. display オブジェクトの機能一覧
メソッド

説明

get̲pixel(x, y)

x 列 y 行の LEDの色を返します。返り値は(R,G,B)です。

set̲pixel(x, y, color)x 列 y 行の LEDの色をcolorで設定します。colorは、(R,G,B), [R,G,B], #RGBで指定します。

clear()

すべての LED の明るさを 0 (オフ)に設定します。

show(iterable, delay=400, *,iterable(イメージ/文字列/数字)を順番に表示します。

wait=True, loop=False,
clear=False, color=None)
scroll(string, delay=150, *,value(文字/数字) を水平方向にスクロールさせます。

wait=True, loop=False,
color=None)on()

ディスプレイの電源をONにします。

oﬀ()

ディスプレイの電源をOFFにします。(ディスプレイに関連づけられた
GPIO 端子を他の目的に再利用できるようにします)。

is̲on()

ディスプレイの電源がONであればTrueを、OFFであればFalseを返します。

LEDの色を設定する下記のプロパティを持ちます。
BLACK
（消灯）
、WHITE
（白）
、RED
（赤）
、LIME
（ライム）
、BLUE （青）、YELLOW
（黄）
、CYAN
（シアン）
、MAGENTA（マゼン
タ）、SILVER
（銀）
、GRAY
（灰）
、MAROON（茶色）、OLIVE（オリーブ）、GREEN（緑）、PURPLE
（紫）
、TEAL
（青緑）
、NAVY
（紺）

付録 B. button̲a オブジェクトのメソッド一覧
メソッド

説明

get̲valuel()

ボタンが押されている場合0を、押されていない場合1を返します。

is̲pressed()

ボタンが押されている場合Trueを返します。

was̲pressed()

ボタンオブジェクトは、ボタンが押された情報を内部にもっています。
本メソッドは、
ボタンが過去に押されていたらTrueを返します。
コール時に情報をリセットします。

get̲presses()

ボタンオブジェクトは、ボタンが押された情報を内部にもっています。
本メソッドは、ボタンが押された回数を返します。コール時に回数をリ
セットします。

44

付録 C. buzzer オブジェクトのメソッド一覧
メソッド

説明
sound引数に音名(ʻC3ʼ〜ʼG9ʼの文字列)、またはMIDIノートナンバー

on(sound, *, duration=-1)(ʻ48ʼ〜ʼ127ʼの文字列)、
または周波数（整数）を、duration引数に音の出力
時間(ms)を指定して、ブザーを制御します。duration引数を指定しない場
合は、oﬀメソッドがコールされるまで音を出力します。
bzr.on('50', duration=1000)# MIDIノートナンバーの50番の高さの音が1秒間出力されます。
bzr.on('C4', duration=1000)# 音名のC4の高さの音が1秒間出力されます。
bzr.on(440)oﬀ()

ボタンが押されている場合Trueを返します。

付録 D. lightsensor オブジェクトのメソッド一覧
メソッド

説明

get̲value()

基板上の光センサーの値（0-4095）を返します。

付録 E. buzzer オブジェクトの MIDI コード一覧
音名

オクターブ

ド

ド♯

レ

レ♯

ミ

ファ ファ♯

ソ

ソ♯

ラ

ラ♯

シ

3

48

49

50

51

52

53

54

55

56

57

58

59

4

60

61

62

63

64

65

66

67

68

69

70

71

5

72

73

74

75

76

77

78

79

80

81

82

83

6

84

85

86

87

88

89

90

91

92

93

94

95

7

96

97

98

99

100

101

102

103

104

105

106

107

8

108

109

110

111

112

113

114

115

116

117

118

119

9

120

121

122

123

124

125

126

127

45

付録 F. Studuino:bit ソフトウェアで光センサーの値を確認する
Studuino:bitソフトウェアのPythonエディタを使用する場合（REPLを使用できない場合）、displayオブジェクトのscroll()
メソッドを使用し、光センサーの値をLEDディスプレイにスクロール表示することができます。下記をPythonエディタに入力し、Studuino:bitに転送してください。

1: from pystubit.board import display, lightsensor
2:
3: while True:
4:value = lightsensor.get̲value()5:

display.scroll(str(value))

3行目のwhile True:以降に書かれた処理が永久ループします。4行目のvalue = lightsensor.get̲value()で光センサーの値（整数）をvalue変数に代入して、7行目のdisplay.scroll(str(value))で、value変数の値をLEDディスプレイにスクロー
ル表示します。display.scroll()メソッドは、文字列を引数に受け取るため、str()関数で整数を文字列に型変換しています。

46

基本学習 テーマ3
ロボットカーの制御＜学習内容＞● DCモーターの制御● 車の制御● 赤外線フォトリフレクタ● 衝突回避カー● 落下回避カー● ライントレースカー

47

１. DC モーターの制御
1.1 組み立て
⋇

⋈

⋉

⋊

⋋

⋌ ¼

⋎

⋏

⋈

⋍
⋋

48

⋐

%$77

0
0

1.2 ArtecRobo2.0 ライブラリについて
ロボット拡張ユニットに接続したパーツを使用する場合、ArtecRobo2.0ライブラリ（pyatcrobo2）
を使用します。
ライブラ
リには、ロボット拡張ユニットに接続可能なパーツのクラスが定義されています。
クラスとは、オブジェクトの機能を定義したコードです。「基本学習テーマ１」で displayオブジェクトを使用し Studuino:bitの LEDディスプレイを制御しましたが、
displayオブジェクトは StuduinoBitDisplayクラスから作成されています。StuduinoBitDisplayクラスには、Studuino:bitの LEDディスプレイを制御するコード（変数や関数）が書かれています。ArtecRobo2.0ライブラリの詳細は、付録 Aを参照してください。
下記のように記述することでクラスからオブジェクトを作成し変数に代入します。
変数名 = クラス名(引数)491.3 DCモーターの動作確認
DC モーターを動かして、プログラムと動作の関係を調べましょう。M1 につないだ左の DC モーターのタイヤに注目しましょう。
※DC モーターを動かす場合は必ず電池ボックスをロボット拡張ユニット側に接M1続するようにしてください。

下記に、DCMotorパーツのオブジェクトを作成するプログラムを記します。

1: from pyatcrobo2.parts import DCMotor2:
3: dcm1 = DCMotor('M1')
1行目のfrom pyatcrobo2.parts import DCMotorで、ArtecRobo2.0ライブラリのpyatcrobo2.partsモジュールからDCMotorクラスをインポートします。DCMotorクラスの機能は、付録Bを参照してください。3行目のdcm1 =DCMotor(ʻM1ʼ)でロボット拡張ユニットM1に接続されたDCモーターのオブジェクトを作成し、変数dcm1に代入します。
作成したオブジェクトのプロパティやメソッドを使用してDCモーターを制御します。
DCモーターは回転の速さと向きを設定するプログラムで制御されます。
どちらか一方でも設定が抜けているとDCモータ
ーは動きません。

1.3.1 DCモーターの速度設定
DCモーターオブジェクトのpower()メソッドでDCモーターの回転する速さを制御します。power()メソッドの引数で0（遅
い）
〜255
（速い）
で設定します。

最小０

設定できる数値

〜

20

動かない

遅い

最大
255

power(p)のp引数

速い

1: from pyatcrobo2.parts import DCMotor2:
3: dcm1 = DCMotor('M1')
4: dcm1.power(255)
5: dcm1.cw()
4行目で、作成したDCモーターオブジェクト（3行目）のpowerメソッドに255を設定しています。5行目で、DCモーターの回転の向きを設定しています
（後述）。

50

1.3.2 DC モーターの回転
DC モーターオブジェクトの cw(), ccw() メソッドで DC モーターの回転する向きを制御します。
cw() メソッド名 cw は、clock-wise の略で、DC モー

ロボットカーのタイヤは左右両方の DC モーターを逆

ターを正転で回転します。
また、ccw() メソッド名 ccw

転させる方向に回転させたとき下図のように前進しまは、counter-clock-wise の略で、DC モーターを逆転す。

で回転します。

正転
前進
逆転

逆転

1.3.3 DC モーターの停止
DC モーターオブジェクトの stop()、brake() メソッドで DC モーターの停止を制御します。stop() メソッドは、DC モータ
ーにかかる電圧を 0 にして、惰性でゆっくりと止めます。brake() メソッドは、DC モーターを短絡させて負荷をかけ、ぴった
りと止めます。

1.4 プログラミング
車を 1 秒だけ前進させるプログラムを作りましょう。
前進する

1秒待つ

51

停止

1: from pyatcrobo2.parts import DCMotor
2: import time3:
4: dcm1 = DCMotor('M1')
5: dcm2 = DCMotor('M2')
6: dcm1.power(255)
7: dcm2.power(255)
8: dcm1.ccw()
9: dcm2.ccw()
10: time.sleep(1)
11: dcm1.brake()
12: dcm2.brake()
両方のタイヤの DC モーターが同じ速さで回転すると、車は前に進みます。4 行目〜 9 行目で、M1 と M2 の DC モータ
ーの速さをともに 255 にして、逆転させています。10 行目で、DC モーターが回転したまま、処理を１秒間停止します。11行目、12 行目で M1 と M2 の DC モーターを停止します。

プログラム転送後、USB ケーブルを外して動かす場合、
ロボット拡張ユニット
側面の電源ボタンを長押し（2 秒）
して電源を ON にしてください。
電源ボタン

1: from pyatcrobo2.parts import DCMotor
2: imprt Time3:
4: dcm1 = DCMotor('M1')
5: dcm2 = DCMotor('M2')
6: dcm1.power(255)
7: dcm2.power(255)
8: dcm1.ccw()
9: dcm2.ccw()
10: dcm1.brake()
11: dcm2.brake()
10 行目の time.sleep(1) を削除したプログラムを左図に記します。
この場合、車はほとんど動きません。
これはコンピューターがプログラムを非常に高速で処理していることが原因です。
つまり、「DC モーターを回転」の命令の直後に、「DC モー
ターを止める」の命令が行われてしまうため、車が前に進む時間がありません。

52

「１秒待つ」を入れない場合「１秒待つ」を入れる場合DCモーターが回転する時１秒間前進間がないため前に進めない

前進

停止

前進

車がまっすぐ進まない場合は、power メソッドの引数を変更して、調整しましょう。

53

停止

練習課題
次の動作の手順をフローチャートにまとめたあと、プログラムをつくりましょう。
前進する

3秒待つ

はじめ
DCモーターM1の速さを255にする
DCモーターM2の速さを255にする
DCモーターM1を逆転
DCモーターM2を逆転
3秒待つ
DCモーターM1を正転
DCモーターM2を正転
3秒待つ
DCモーターM1を停止
DCモーターM2を停止
おわり

後退する

3秒待つ

停止する

1: from pyatcrobo2.parts import DCMotor
2: import time3:
4: dcm1 = DCMotor('M1')
5: dcm2 = DCMotor('M2')
6: dcm1.power(255)
7: dcm2.power(255)
8: dcm1.ccw()
9: dcm2.ccw()
10: time.sleep(3)11: dcm1.cw()
12: dcm2.cw()
13: time.sleep(3)14: dcm1.brake()
15: dcm2.brake()

54

(cm)

28
27
26

25
24

2. 車の制御
1 秒間前進させたときの距離を調べましょう。
また、車をぴったり９０度曲げたり、回転させるときに DC モーターを動かす
時間を調べましょう。
※進む距離や曲がったり回転する時間は DC モーターの個体差や電池の残量によって異なる場合があります。

直進する

23

曲がる

回転する

22

90度右回転

21
20
19

90度右折

18
17

90度左折
前進

90度左回転

16
15
14
13
12
11
10
9
8
7
6

2.1 前進１秒間前進させるプログラムをつくり、ページ右側の定規に沿って車を動かし移動した距離を調べましょう。

1: from pyatcrobo2.parts import DCMotor
2: import time3:
4: dcm1 = DCMotor('M1')
5: dcm2 = DCMotor('M2')

テキスト

6: dcm1.power(255)5

7: dcm2.power(255)

4

9: dcm2.ccw()

8: dcm1.ccw()

3

10: time.sleep(1)2

12: dcm2.brake()

11: dcm1.brake()

1秒間で

cm進む。

1
0

55

2.2 右折左（M1)のDCモーターだけを逆転させることで右折ができます。イラストに合わせて、ぴったり90度右折するために必要な時間を調べましょう。

左のプログラムをつくり、7行目time.sleepメソッ

1: from pyatcrobo2.parts import DCMotor

ドの時間を調整しましょう。

2: import time3:
4: dcm1 = DCMotor('M1')

秒で90度右折する。

5: dcm1.power(255)
6: dcm1.ccw()
7: time.sleep()

8: dcm1.brake()56

2.3 左折左（M2)のDCモーターだけを逆転させることで左折ができます。イラストに合わせて、ぴったり90度左折するために必要な時間を調べましょう。

左のプログラムをつくり、7行目time.sleepメソッ

1: from pyatcrobo2.parts import DCMotor

ドの時間を調整しましょう。

2: import time3:
4: dcm2= DCMotor('M2')

秒で90度左折する。

5: dcm2.power(255)
6: dcm2.ccw()
7: time.sleep()

8: dcm2.brake()57

2.4 右回転
左（M1)のDC モーターを逆転させ、右(M2)のDCモーターを正転させることで右回転ができます。イラストに合わせて、ぴったり90度右に回転するために必要な時間を調べましょう。

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:

from pyatcrobo2.parts import DCMotor
import time
dcm1 = DCMotor('M1')
dcm2 = DCMotor('M2')
dcm1.power(255)
dcm2.power(255)
dcm1.ccw()
dcm2.cw()
time.sleep()
dcm1.brake()dcm2.brake()

左のプログラムをつくり、10行目time.sleepメソ
ッドの時間を調整しましょう。

秒で90度右に回転する。

58

2.5 左回転
右（M2)のDCモーターを逆転させ、左（M1)のDCモーターを正転させることで左回転ができます。イラストに合わせて、ぴったり90度左に回転するために必要な時間を調べましょう。

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:

from pyatcrobo2.parts import DCMotor
import time
dcm1 = DCMotor('M1')
dcm2 = DCMotor('M2')
dcm1.power(255)
dcm2.power(255)
dcm1.cw()
dcm2.ccw()
time.sleep()
dcm1.brake()dcm2.brake()

左のプログラムをつくり、10行目time.sleepメソ
ッドの時間を調整しましょう。

秒で90度左に回転する。

59

練習課題
直進と右回転を繰り返すことで、1周回るプログラムをつくりましょう。

②直進して90度右回転①直進して90度右回転③直進して⑤停止

90度右回転④直進して90度右回転① フローチャート
直進と右回転を4回繰り返すと1周回ることになります。同じ動作を複数回繰り返す場合、以下の記号を使います。動作を表すフローチャートをまとめま
しょう。

はじめ
DCモーターM1の速さを255にする
DCモーターM2の速さを255にする
繰り返し4回

繰り返し○回

繰り返し処理の開始

DCモーターM1を逆転
DCモーターM2を逆転

繰り返し戻る

繰り返し処理の終了

1秒待つ
DCモーターM1を逆転
DCモーターM2を正転※右回転する秒数は2.4で確認した秒数を参考にしてください。

秒待つ
繰り返し戻る
DCモーターM1を停止
DCモーターM2を停止
おわり60② プログラミング
まとめたフローチャートをもとにプログラムをつくりましょう。同じ動きを複数回繰り返す場合、for文を利用すると簡単にプ
ログラムをつくることができます。

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:

from pyatcrobo2.parts import DCMotor
import time
dcm1 = DCMotor('M1')
dcm2 = DCMotor('M2')
dcm1.power(255)
dcm2.power(255)
for i in range(4):dcm1.ccw()
dcm2.ccw()
time.sleep(1)dcm1.ccw()
dcm2.cw()
time.sleep()
dcm1.brake()dcm2.brake()③ 無限に繰り返しをするプログラム
同じ動きをずっと繰り返させたい場合は、while文を使用します。前
出のfor文を使用するプログラムからwhile文を使用するプログラムに変更しましょう。
「終了」がなくなり、繰り返し続けることは右のフローチャートのように矢印で表すこともできます。
※停止する必要がなくなるので、前出のプログラムの15行目、16行
目（dcm1.brake() / dcm2.brake()）
は削除してください。

はじめ
DCモーターM1の速さを255にする

DCモーターM2の速さを255にする

DCモーターM1を逆転

DCモーターM2を逆転

1秒待つ

DCモーターM1を逆転

DCモーターM2を正転

秒待つ

終了しない

61

3. 衝突回避カーの製作
赤外線フォトリフレクタを利用して衝突回避カーをつくりましょう。
前進する

障害物を感知する

停止する

前進する

障害物がなくなるまで待つ

繰り返し

自動車の運転を補助するシステム
自動車にはセンサーを用いた運転を補助する様々なシステムが存在します。

自動ブレーキシステム
前を走る自動車や歩行者、障害物にぶつか
りそうになったときに自動でブレーキをかけて停止します。
緊急ブレーキSTOP

速度自動調整システム
高速道路などで前を走る自動車と安全な距離を保ちながら、自動で速さを調整します。長い時間の運転や、渋滞中の負担を少なくす

100km
80km

80km

ることができます。

80km

80km

62

3.1 赤外線フォトリフレクタとは赤外線フォトリフレクタは
「赤外線」
という光の
「反射」
を利用したセンサーです。中央の２つの丸い部分は透明な方が赤外線を発光し、黒い方は赤外線を検出します。発光部から出た赤外線が対象物にぶつかって反射してきたところを検出部で読み取ります。そのときの赤外線の強さで、対象物が存在するかどうかを知ることができます。
検出

赤外線を検出するところ

反射した光

検出部

対象物

センサー本体

赤外線

赤外線
発光部

赤外線を発光するところ

赤外線フォトリフレクタの使い方
・太陽光には赤外線が多く含まれています。太陽光が検出部に当たらないように注意してください。

太陽光

対
象
物

対
象
物

反射光

反射光
太陽光を強く検出してしまう

対象物で反射した光を強く検出できる

・黒系の色は赤外線を吸収しやすく反射しにくいため、反射光の検出量が少なくなります。

ほとんど反射せずに吸収する

反射する

赤外線
発光部

赤外線

白い
ブロック

発光部

63

黒い
ブロック

3.2 「衝突回避カー」の組み立て

⋇

⋈

⋉

P0

஧ਗ଍ইज़ॺজইঞॡॱ

64

3.3 Mu で赤外線フォトリフレクタの値を確認する
本節の内容をStuduino:bitソフトウェアのPythonエディタで実施する場合は、付録Dを参照してください。
衝突回避カーは前に障害物が存在したときにセンサーで感知して衝突を避けるため自動で停止します。この「感知」の役割を赤外線フォトリフレクタで行います。
「基本学習テーマ２」の5.1で光センサーの値を調べたように、赤外線フォトリフレクタの値を調べましょう。

1: from pyatcrobo2.parts import IRPhotoReﬂector
2: import time3:
4: irp = IRPhotoReﬂector('P0')
5: while True:
6:value = irp.get̲value()

7:

print(str (value))

8:time.sleep(1)

上記プログラムでは、赤外線フォトリフレクタの制御にIRPhotoReﬂectorクラスを使用しています。IRPhotoReﬂectorクラスの詳細は、付録Cを参照してください。
下のイラストに合わせて、車を置きます。赤外線フォトリフレクタの前 10cm、5cm、3cm、2cm、1cm、0cm に障害物
（ブロック白四角）があるときの値をREPLで確認しましょう。
※赤外線フォトリフレクタの値は太陽光の影響を受けるため、日光のあたる窓に向けないようにしてください。

0

距離

1

0cm

2

3

4

1cm

5

6

7

2cm

値
※赤外線フォトリフレクタの個体差で、同じ距離でも数値が異なる場合があります。

65

3cm

8

9

5cm

10

10cm

3.4 しきい値の決定
赤外線フォトリフレクタの値で障害物があるときとないときを区別する場合は、２つの状態の境目となる値を決めて判断します。このような境目となる値のことを「しきい値」と言います。

0

障害物がない4095

障害物がある

しきい値

今回は車の前５cmに障害物があるときとないときを区別するようにしきい値を決めましょう。

0

1

2

3

4

5

6

7

8

9

10

障害物が

障害物が

5cm前にない

5cm前にある

しきい値

66

3.5 フローチャート
衝突回避カーの動作を実現できるように、手順を考えてフローチャートをまとめましょう。条件の部分を決めたしきい値を利用して書き換えましょう。また、「障害物が無くなるまで待つ」
は下記のフローチャートのブロックを使いましょう。
赤外線フォトリフレクタP0の値 ＜

まで待つ

はじめ

DCモーターM1の速さを255にする

DCモーターM2の速さを255にする

DCモーターM1を逆転

DCモーターM2を逆転

No

赤外線フォトリフレクタのP0の値 ＞
Yes
DCモーターM1を停止

DCモーターM2を停止

赤外線フォトリフレクタP0の値 ＜DCモーターM1を逆転

DCモーターM2を逆転

67

まで待つ

3.6 プログラミング
3.5の下図のフローチャートのブロックは、while文で表現することができます。
フローチャート
赤外線フォトリフレクタP0の値 ＜Pythonwhile (赤外線フォトリフレクタP0の値 >

まで待つ

):

pass
先頭にインデントを付けます。
pass文は、「何も行わない」という命令になります。上図のPythonのように記述することで、条件式が満たしている間（赤外
線フォトリフレクタP0の値が閾値よりも大きい間）はpassを実行し、プログラムの処理を待つことができます。

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:

from pyatcrobo2.parts import DCMotor, IRPhotoReﬂector
dcm1 = DCMotor('M1')
dcm2 = DCMotor('M2')
irp = IRPhotoReﬂector('P0')
dcm1.power(255)
dcm2.power(255)
dcm1.ccw()
dcm2.ccw()
while True:
if (irp.get̲value() >):dcm1.brake()dcm2.brake()while (irp.get̲value() >pass
dcm1.ccw()
dcm2.ccw()):

683.6.1 衝突回避カーの別解
以下のプログラムでも衝突回避カーの動作が実現できます。

はじめ
DCモーターM1の速さを255にする

DCモーターM2の速さを255にする

DCモーターM1を逆転
DCモーターM2を逆転

No

赤外線フォトリフレクタのP0の値＞
Yes

DCモーターM1を停止

DCモーターM2を停止
赤外線フォトリフレクタP0の値 ＜

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:

まで待つ

from pyatcrobo2.parts import DCMotor, IRPhotoReﬂector
dcm1 = DCMotor('M1')
dcm2 = DCMotor('M2')
irp = IRPhotoReﬂector('P0')
dcm1.power(255)
dcm2.power(255)
while True:
dcm1.ccw()
dcm2.ccw()
if (irp.get̲value() >):dcm1.brake()dcm2.brake()while (irp.get̲value() >
pass

):

69

4. 落下回避カーの製作
赤外線フォトリフレクタの使い方を工夫することで、机から落下しそうになったときに後退して落下を避ける車をつくることができます。
前進する

床がなくなったことを感知する

1秒後退する

前進する

右に90度回転する

床なし

床あり

4.1 落下回避カーの組み立て
今回は床の有無を感知するので、赤外線フォトリフレクタの向きを下向きに付け替えましょう。

70

⋇

⋈

⋉

஧ਗ଍ইज़ॺজইঞॡॱ

3

71

4.2 しきい値の決定
3.3（※）のプログラムを使用して、床があるときとないときの赤外線フォトリフレクタの値を確認して、しきい値を決めましょう。
※：Studuino:bitソフトウェアのPythonエディタの場合は、付録Dを参照してください。

床があるとき床がないとき04095
床がないときしきい値

床があるとき

しきい値の決定
しきい値を 1 や 3 のように調べたどちらかの値の近くに決めてしまうと、赤外線フォトリフレクタの値がそこから少し変わるだけで、ブロックの有無を区別してしまいます。センサの値は周りの環境によって変わりやすいため誤って判断しないように、 2 のように調べた２つの値の中央あたりをしきい値として決めましょう。

1

2

3

0

4095

床があるときの値

床がないときの値72

4.3 落下回避カーの動作整理
動作とプログラムの関係を整理しましょう。

順番

動作

プログラム

前進する

DCモーター M1 の速さを255にする

床なし

DCモーター M2 の速さを255にする①

DCモーター M1 を逆転

床あり

DCモーター M2 を逆転

床がなくなったことを感知する

赤外線フォトリフレクタ P0 の値②＜ しきい値

1秒後退する

DCモーター M1 を正転③

DCモーター M2 を正転
1秒待つ

右に90度回転する

DCモーター M1 を逆転④

DCモーター M2 を正転
秒待つ

前進する

DCモーター M1 を逆転⑤

DCモーター M2 を逆転②〜⑤をずっと繰り返す※右に90度回転させる秒数は4.2で調べたものを参考にしてください。

73

4.4 フローチャート
4.3で整理した動作をフローチャートにまとめましょう。

はじめ
DCモーターM1の速さを255にする
DCモーターM2の速さを255にする
DCモーターM1を逆転
DCモーターM2を逆転

赤外線フォトリフレクタのP0の値 ＜Yes
DCモーターM1を正転

DCモーターM2を正転

1秒待つ

DCモーターM1を逆転

DCモーターM2を正転

秒待つ

DCモーターM1を逆転

DCモーターM2を逆転

74

No4.5 プログラミング
4.4のフローチャートを参考にプログラムを完成させましょう。

1:from pyatcrobo2.parts import DCMotor, IRPhotoReﬂector

2:

import time3:
4:

dcm1 = DCMotor('M1')

5:

dcm2 = DCMotor('M2')

6:

irp = IRPhotoReﬂector('P0')

7:8:

dcm1.power(255)9:

dcm2.power(255)10:

dcm1.ccw()

11:

dcm2.ccw()

12:

while True:13:

if (irp.get̲value() <14:

dcm1.cw()

15:

dcm2.cw()

16:

time.sleep(1)17:dcm1.ccw()

18:

dcm2.cw()

19:

time.sleep(20:

dcm1.ccw()

21:

dcm2.ccw()

):

)

75

4.5.1 落下回避カーの別解
以下のプログラムでも落下回避カーの動作が実現できます。
はじめ
DCモーターM1の速さを255にする

1:

from pyatcrobo2.parts import DCMotor, IRPhotoReﬂector

2:

import time3:
DCモーターM2の速さを255にする
DCモーターM1を逆転
DCモーターM2を逆転

赤外線フォトリフレクタのP0の値＜

4:

dcm1 = DCMotor('M1')

5:

dcm2 = DCMotor('M2')

6:

irp = IRPhotoReﬂector('P0')

7:

No

Yes

DCモーターM1を正転

DCモーターM2を正転

1秒待つ

DCモーターM1を逆転

DCモーターM2を正転

秒待つ

8:

dcm1.power(255)9:

dcm2.power(255)10:while True:

11:

dcm1.ccw()

12:dcm2.ccw()

13:

if (irp.get̲value() <14:

dcm1.cw()

15:

dcm2.cw()

16:

time.sleep(1)17:dcm1.ccw()

18:

dcm2.cw()

19:

time.sleep():)

プログラムのつくり方は一つとは限りません。想定する動作が実現できればどのようなプログラムでも構いません。自分なりに考えてプログラムをつくることが大切です。

765. ライントレースカーの製作
色によって赤外線の反射率が違うことを利用すると、赤外線フォトリフレクタで黒い線を認識することができます。ライント
レースとは、センサーに線を認識させて線に沿って車を走らせることを言います。

車は「4. 落下回避カーの製作」
で組み立てたものをそのまま使いましょう。

775.1 しきい値の決定
3.3（※）のプログラムを使用して、黒のときと白のときの赤外線フォトリフレクタの値を確認して、しきい値を決めましょう。
※：Studuino:bitソフトウェアのPythonエディタの場合は、付録Dを参照してください。

黒のとき

白のと
とき

0

4095
5
黒のとき

しきい値

黒のとき

白の
のとき

白のとき

0

4095
黒のとき

しきい値

黒のとき

白のとき

白のとき

0

4095
黒のとき

しきい値

78

白のとき

5.2 ライントレースカーの動作整理
黒い線に沿って走らせる方法の一つとして、黒い線の上ではなく、黒い線のふち（黒い線とまわりとの境界線）に沿って走らせるものがあります。

黒い線のふち

黒い線のふちに沿って走らせるには、例えば線の上にいるとき（黒色）と、そうでないとき（白色）で次のようにDCモーターを制御します。

線の上にいるとき（黒色）

そうでないとき（白色）

黒い線のふちに近づくように右折する

黒い線のふちに近づくように左折する

この動きを繰り返すことで、線の上
（黒色）
とその外
（白色）
を行ったり来たりしながら線のふちに沿って走るようにな
ります。

79

この動きをまとめると、以下のようになります。
線の上にいるとき（黒色）

そうでないとき（白色）状態

赤外線フォトリフレクタ P0の値

条件

左の条件以外のとき

＜しきい値
右折する

左折する

DCモーター M1 を逆転

DCモーター M1 を停止

DCモーター M2 を停止

DCモーター M2 を逆転

動作
プログラム

5.3 フローチャート
整理した動作を実現できるように手順を考えてフローチャートをまとめましょう。今回はしきい値を超えるときと超えないときでそれぞれ違う動作をする必要があることに注意しましょう。

はじめ

DCモーターM1の速さを255にする

DCモーターM2の速さを255にする

No

赤外線フォトリフレクタのP0の値＜

Yes
DCモーターM1を逆転

DCモーターM1を停止

DCモーターM2を停止

DCモーターM2を逆転

80

5.4

プログラミング

まとめたフローチャートをもとにプログラムを作成しましょう。if-else文を使用する事で、指定した条件が成り立つときと成り立たないときで処理を分けることができます。
1:from pyatcrobo2.parts import DCMotor, IRPhotoReﬂector

2:

import time3:
4:

dcm1 = DCMotor('M1')

5:

dcm2 = DCMotor('M2')

6:

irp = IRPhotoReﬂector('P0')

7:8:

dcm1.power(255)9:

dcm2.power(255)10:while True:11:

if (irp.get̲value() <12:

dcm1.ccw()

13:

dcm2.brake()

14:

):

else:

15:

dcm1.brake()16:

dcm2.ccw()

5.4.1 ライントレースカーの別解
以下のプログラムでもライントレースカーの動作が実現できます。if-else文の代わりに、if文 を２つ並べているだけで、行っている処理は同じです。

1:from pyatcrobo2.parts import DCMotor, IRPhotoReﬂector

2:

import time3:
4:

dcm1 = DCMotor('M1')

5:

dcm2 = DCMotor('M2')

6:

irp = IRPhotoReﬂector('P0')

7:8:

dcm1.power(255)9:

dcm2.power(255)10:while True:11:

if (irp.get̲value() <12:

dcm1.ccw()

13:

dcm2.brake()14:

if (irp.get̲value() >=15:

dcm1.brake()16:

dcm2.ccw()

):

):

81

付録
付録A. ArtecRobo2.0ライブラリについて
メインユニット（Studuino:bit）にロボット拡張ユニットを接続することで、ArtecRoboのモーターやセンサーを使用できます（下図）。
メインユニット

（右側面）

（左側面）

（正面）

⑥I2C通信端子①電源スイッチ

P16

I2C

P15

P2
④DCモーター出力端子（底面）③デジタル出力端子

ロボット拡張ユニット

P14 P13 M1

M2 P0 P1

⑤アナログ入力端子②電源コネクター

モーターやセンサーなどのパーツは、ロボット拡張ユニットの端子に接続します。端子とパーツの組み合わせを下に記します。

番号

③

④

⑤

⑥

端子名

デジタル出力端子

DCモーター出力端子

アナログ入力端子

I2C 通信端子

パーツ

機能概要

LED

LEDを点灯/消灯します。

ブザー

音を出力します。

サーボモーター

設定した角度に動きます。

DCモーター

設定した方向と速さで回転します。

光センサー

明るさを検出します。

音センサー

音の大きさを検出します。

タッチセンサースイッチのON/OFFを検出します。

赤外線フォトリフレクタ

距離や色の濃さを検出します。

加速度センサー

傾きなどを検出します。

ArtecRobo2.0ライブラリを使用することで、ロボット拡張ユニットに接続したパーツを簡単に制御できます。
ArtecRobo2.0ライブラリはpyatcrobo2という名前です。

82

付録 B. DCMotor クラスの機能一覧
メソッド
̲̲init̲̲(pin)説明
コンストラクタ。オブジェクトの作成に使用します。
pin引数には拡張基板のM1、M2ポートを表すʼM1ʼまたはʼM2ʼを設定します。

cw()

DCモーターを正転方向に回転します。

ccw()

DCモーターを逆転方向に回転します。

stop()

DCモーターの回転を解放します。

brake()

DCモーターの回転を停止します。

power(p)p引数にパワー（0〜255）を指定して、DCモーターの回転の速さを制御します。

付録 C. IRPhotoReﬂector クラスの機能一覧
メソッド
̲̲init̲̲(pin)get̲value()説明
コンストラクタ。オブジェクトの作成に使用します。
pin引数には拡張基板のP0、P1、P2ポートを表すʼP0ʼ、ʼP1ʼ、ʼP2ʼを設定します。
赤外線フォトリフレクタの値を取得します。

83

付録 D. Studuino:bit ソフトウェアで赤外線フォトリフレクタの値を確認する
Studuino:bitソフトウェアのPythonエディタを使用する場合（REPLを使用できない場合）、displayオブジェクトの
scroll()メソッドを使用し、赤外線フォトリフレクタの値をStuduino:bitのLEDディスプレイにスクロール表示することができます。下記をPythonエディタに入力し、Studuino:bitに転送してください。

1:from pystubit.board import display

2:

rom pyatcrobo2.parts import IRPhotoReﬂector

3:4:

irp = IRPhotoReﬂector('P0')

5:

while True

6:value = irp.get̲value()7:

display.scroll(str((value))

上記プログラムでは、赤外線フォトリフレクタの制御にIRPhotoReﬂectorクラスを使用しています。IRPhotoReﬂectorクラスの詳細は、付録Cを参照してください。

84

MEMO

85

MEMO

86

082556

K1119