参加者・保護者の皆様へ
9月9日のプログラミング教室の復習とプログラミングの理論説明
2020年度から小学校に導入されるプログラミング教育は、コンピューターを用いて文字、音声、画像、など各種表現ができるのかの基本を理解することが目的です。そのための授業内容は各学校に任されています。それを、ここでは“かかし作り”という遊びの中で、光の点滅はスイッチングとそれをコントロールする数値計算で出来上がっていることに気づいてもらおうというのが狙いです。小学生を主たる対象として、そこに保護者の方々も参加していただき、小学生の感性での作品に向けて、保護者の方々にコントロール方法を体験していただこうというものでした。
そのためには、プログラムの構成とその意味の説明が不足していたかと思います。この点は最後に説明できる事と考えておりました。子供さんから、LEDの点滅にリズムをつけたいという希望があった場合の変更方法の説明が必要になると考えており、質問を受ける事で対応できるかと思っておりましたが、ここに基本的な内容について説明をします。
さらに理解が深まることを期待しています。
講習時に使用した資料(pdf 約20MB)のダウンロードはこちらから

プログラミング・ホームワーク3

がんばってネ


2018-09-23


=====code01=====
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void setup() {
}
void loop() {
int a = 0; //aの初期値は0
for (a = 0; a <= 255; a++) //0〜255までの間を1づつ増加
{
analogWrite(11, a); //ledがゆっくり点灯
// LEDを a の明るさで点灯
delay(5); //5÷1000=0.005秒待つ?
//LEDが a の明るさで光ったまま0.005秒待つことになります.
}
for (a = 255; a >= 0; a--) //255〜0までの値を1づつ減少
{
analogWrite(11, a); //ledがゆっくり消灯
delay(5); //5÷1000=0.005秒待つ
}
delay(500); //500÷1000=0.5秒待つ
}
=====code02=====
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void setup() {
pinMode( 12, OUTPUT ); //12番ピンが出力
}
void loop() {
digitalWrite(12, HIGH); //LEDが点灯
delay(10); //1000分の10秒(0.01秒)待つ
digitalWrite(12, LOW); //LEDが消灯
delay(random(0,1000)); //0〜1秒の間ランダムな値で待つ
}
=====code03=====
code03では,「brightnessの値を0からある一定量増加させていき,上限の255に達したら,
255から同量減少させ,増減を繰り返し行う処理」を行っています.
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
int brightness = 0; //LEDの明るさの初期値
int fadeAmount =5; //LEDの調光階段値の初期値
void setup() {
pinMode(12, OUTPUT); //12番ピンが出力
}
void loop() {
analogWrite(12, brightness); //12番ピンに0V
brightness = brightness + fadeAmount; //LEDの明るさを指定している brightness を fadeAmount の値分増加させます.別の表現ですと,brightness に brightnessの値と fadeAmountの値を足した値を代入しています.brightnessが二つでてきてこんがらがりますが,最初のbrightnessは計算後,二つ目のbrightnessは計算前の値になります.
if (brightness == 0 || brightness == 255) {
fadeAmount = -fadeAmount ;
}
//もしbrightnessの値が0もしくは255であれば,fadeAmountの符号(+ / -)を反転する」という処理です.ここでは,brightnessの値を0から255の間で増減させることです.そのため,0もしくは255に達した時点で,増減する方向を反転させる必要があります.
delay(30); //30÷1000=0.03秒待つ
}
=====code04=====
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void setup() {
pinMode(12, OUTPUT); //12番ピンが出力
}
void loop()
{
float in, out; //floatは小数点のinとoutという変数(code03でのbrightnessの扱いと同じですが整数でした)を使いますよ,と宣言する必要があります.
for (in = 0; in < 6.283; in = in + 0.001)
{
out = sin(in) * 127.5 + 127.5;
analogWrite(12, out);
}
}
ここでは,三角関数の知識が必要です.まず,角度を表す方法として,度数法や弧度法というものがあります.度数法では,45度,30度,180度など分度器を使って測ったことがあると思いますが,一周を360度と決めて分割した尺度になります.一方,弧度法は円弧の長さが尺度となります.
半径1の円を単位円と呼びますが,その単位円を想像してください.単位円の円周は(直径 x 円周率π)で計算できます.つまり,単位円の円周は2π = 2 x 3.1415…= 6.283...です.
プログラムに戻りますが,forループの処理で,
一つの円をぐくりとまわるかのように,0から6.283と0.001ずつ増加させています.
sin(in)は,弧度法表現で角度inのときの正弦関数の値を出力してくれます.sin(in)の正弦関数では-1から1までの値になります.しかし,Arduinoでは0から255の値しか受け付けません.そこで,sin(in) * 127.5 +127.5
という処理を行うことで,127.5を中心として,0から255まで変化するように有効範囲の変換を行っています.
analogWrite(12, out) としていますが,12を11に変えて,ワイヤーの差し口も
11に変更して試してください.すると,なめらかに明るさが変化する様子が観察できると思います.
=====code05=====
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
int val = 0; //val という変数を使う宣言が必要になります.最初の値として 0 を入力しています.
void setup() {
pinMode(12, OUTPUT); //12番ピンが出力
}
void loop() {
val = analogRead(0); //読み込み用の差込口0番に挿しているセンサの値を読み込みます.
読み込んだ値は,valに代入されます.
analogWrite(12, val/4); //上で読み込んだセンサの値の4分の1の値でLEDを光らせます.(こちらも12を11にして試してみてください)
delay(10); //1000分の10秒,つまり0.01秒待ちます.
}
=====code06=====
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void setup() {
}
void loop() {
int a = 0; //aを0に初期化する
for (a = 0; a <= 255; a++) //0〜255段階で1づつ増加
{
analogWrite(11, a); //11番のLEDを段階的に光らせる
delay(5); //5÷1000=0.005秒待つ
analogWrite(10, 255 - a); //10番ピンLEDを段階的に減光する
delay(5); //5÷1000=0.005秒待つ
}
for (a = 255; a >= 0; a--) //255〜0段階で1づつ減少
{
analogWrite(11, a); //11番LEDを段階的に減光する
delay(5); //5÷1000=0.005秒待つ
analogWrite(10, 255 - a); //10番LEDを段階的に光らせる
delay(5); //5÷1000=0.005秒待つ
}
delay(1000); //1000÷1000=1秒待つ
}
=====code08=====
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void setup() {
pinMode(12,OUTPUT); //12番ピンを出力
}
void loop() {
digitalWrite(12,HIGH); //LEDをオン
delay(1000); //1000÷1000=1秒待つ
digitalWrite(12,LOW); //LEDをオフ
delay(1000); //1000÷1000=1秒待つ
}
=====code07=====
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void setup() {
}
void loop() {
int a = 0; //aを0
for (a = 0; a <= 255; a++) //0〜255段階で1づつ増加
{
int b = 255 - a; //bは255からaの値だけ引く?
analogWrite(11, a); //11番LEDを段階的に光らせる
delay(5); //5÷1000=0.005秒待つ?
analogWrite(10, b); //10番LEDを段階的に消す
delay(5); //5÷1000=0.005秒待つ?
}
for (a = 255; a >= 0; a--) //255から1づつ引く?
{
int b = 255 - a; //255からaの値を引く?
analogWrite(11, a); //LEDを段階的に消す
delay(5);
analogWrite(10, b); //LEDを段階的に光らせる
delay(5); //5÷1000=0.005秒待つ?
}
delay(1000); //1000÷1000=1秒待つ?
}
=====code10=====
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void setup() {
Serial.begin(9800); //シリアルモニターに表示
}
void loop() {
int hikari = analogRead(0); //hikariという変数に,差し口0番に接続したセンサの読み込み値を代入します.
Serial.println( hikari ); //センサーの詠み込み値が表示される
}
=====code09=====
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void setup() {
}
void loop() {
int a = 0; //aの値を0とする
for (a = 0; a <= 255; a++) //0から255までの段階で1づつ増加させる
{
analogWrite(11, a); //11番ピンLEDを同時に段階的に光らせる
delay(5); //5÷1000=0.005秒待つ
analogWrite(10, a); //10番ピンLEDを同時に段階的に光らせる
delay(5); //5÷1000=0.005秒待つ
}
for (a = 255; a >= 0; a--) //255から0までの段階で1づつ減少させる
{
analogWrite(11, a); //11番LEDを同時に段階的に消す
delay(5); //5÷1000=0.005秒待つ
analogWrite(10, a); //10番LEDを同時に段階的に消す
delay(5); //5÷1000=0.005秒待つ
}
delay(1000); //1000÷1000=1秒待つ
}
=====code11=====
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
int val=0; //val という変数を使う宣言をし,0を初期値と設定する.
void setup() {
pinMode(11,OUTPUT); //11番ピンが出力
}
void loop() {
val=analogRead(0); //0番ピンに接続しているセンサ値を読み込みます.
analogWrite(11,val/4); //valに入っている読み込み値の4分の1をLEDの明るさとして出力します.
delay(10); //10÷1000=0.01秒待つ
}
=====code12=====
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
int val=0; //初期化0にする
void setup() {
pinMode(11,OUTPUT); //シリアルモニターを見るにはcode10をarduinoに書き込む
}
void loop() {
val=analogRead(0); //Readなので,読み込む処理です.読み込み用の0番ピンに接続されたセンサの値を読み込みます.
if (val>400) { //valの数字を小さくするとシリアルモニターの数字が小さくなる
int a = 0; //aを0
for (a = 0; a <= 255; a++) //0から255までの段階で1づつ増加
{
analogWrite(11, a); //11番ピンのLEDが少しづつ明るくなる
delay(5); //5÷1000=0.005秒待つ?
}
for (a = 255; a >= 0; a--) //255から0までの段階で1づつ減少
{
analogWrite(11, a); //11番ピンのLEDが少しづつ暗くなる
delay(5); //5÷1000=0.005秒待つ
}
delay(500); //500÷1000=0.5秒待つ
}
else { //ifは「もし...ならば」という処理をしますが,その条件に合わなかった場合に行う処理を記述します.
int a = 0; //aを0
for (a = 0; a <= 255; a++) //0から255までの段階で1づつ増加
{
analogWrite(11, a); //11番ピンのLEDが少しづつ明るくなる
delay(1); //1÷1000=0.001秒待つ
}
for (a = 255; a >= 0; a--) //255から0までの段階で1づつ減少
{
analogWrite(11, a); //11番ピンのLEDが少しづつ暗くなる
delay(1); //1÷1000=0.001秒待つ
}
delay(500); //500÷1000=0.5秒待つ
}
}