2023年9月26日火曜日

2023年9月報

1.9月授業まとめ
2.9月の課題
3.8月の解答
4.10月の授業予告
5.今後の授業スケジュール
6.お知らせ


1. 9月授業まとめ


1.0 <スタートアップ(全コース)>


 割愛します。


1.1 <プレプライマリーコース『カヤックン』>


 割愛します。

1.2 <プライマリーコース『ロボットしょうぼうたい』>


 割愛します。

1.3 <ベーシックコース『ジャイアントホッパー』>


 バッタ型ロボットです。ギアを介(かい)してモーターが駆動(くどう)するのは、本体の側面で時計の針のように回転するロッド3アナだけです。

それだけなのに、後ろ脚(あし)を折り曲げたり、伸ばしたりを繰(く)り返し、尺取(しゃくと)り虫のように前進します。どうしてでしょうか?

 ロッド3アナが1回転ごとに後ろ脚を跳(は)ね上げています。
このような回転体に当てることによる周期(しゅうき)的な運動機構をカムと呼び、例えば、自動車のエンジンが吸気(きゅうき)と排気(はいき)を切り替(か)えるために使われています。

後ろ脚が跳ね上がる時に関節(かんせつ)が折れ曲がって、後ろのタイヤLを前方へ引きずります。
この時、本体は進みませんが、次に輪(わ)ゴムの力で脚が伸びる時、後ろのタイヤLは滑(すべ)らず、前輪のタイヤSが転(ころ)がりながら本体を前へ進めます。

 後ろのタイヤLは回転しないのに、どうして前進するよう都合(つごう)良く引きずられたり踏(ふ)み止まったりしてくれるのでしょうか?
タイヤLは回転しないのですよ。だったら、タイヤLは動かず、後ろ脚の屈伸(くっしん)運動に合わせて本体(前輪)が前後に往復(おうふく)するだけではないでしょうか
(尺取り虫も、次の一歩をまよってそのような動きをすることがありますね)

 それは摩擦力(まさつりょく=すべらせない力)の効(き)き方がちがうからです。

ちょっと難(むずか)しいのですが、脚を折り曲げる(引っ込める)時は、タイヤLを斜(なな)め前方上向きに引き上げる力が働き、重い本体を後退(こうたい)させるほどの地面との摩擦力はなくなります
その結果、タイヤLの方が引きずられるのですが、逆(ぎゃく)に脚を伸ばす時は、斜め後方下向きに蹴(け)り出すので、地面との摩擦力が強力に働き、すべらずに本体を推進(すいしん)させるのです。

 消(け)しゴムをノートに軽く当てた場合強く押し付けた場合とでは、すべらせるのに必要な力が全然ちがいますよね?
また、消しゴムをノートに斜めに当てると、引く時は軽くすべりますが、押す時は摩擦力を強く感じますね。タイヤLにも同じように作用しているのです。

タイヤLが地面から跳ね上がるほどのパワーがあれば分かりやすいのですが、ずっと地面を引きずっていますので、見た目では分かりません
タイヤLを消しゴムだと思ってください。

 タイヤLを回転しないよう止めている理由が分かったでしょうか?
試(ため)しに、自由回転するようクランクを取り外してみてください。

 最後の競技は“バッタレース”をしました。スピード勝負です。
推進はゴムの張力(ちょうりょく)、そのゴムにエネルギーを充填(じゅうてん)するのがモーターの仕事と言えますから、ゴムはきつく、モーターはパワフルに、というのが理想(りそう)ですが、限界(げんかい)もあります。


限(かぎ)られたモーターパワーをロッド3アナの回転トルク(脚の力)に振(ふ)るか回転数(脚のスピード)に振るかでギア比(ひ)を決めたり、それに適(てき)した輪ゴムの掛(か)け方や本数を探(さぐ)ったりするのが戦略(せんりゃく)になります。

これまでに下記のような素晴(すば)らしい改造(かいぞう)が生まれています。
1) モーター軸のピニオンギアギアMへ交換(脚が3倍速く動く)(*1)
2) 側面のロッド3アナ回転中心を端っこ中心へ変更(脚が2倍速く動く)(*2)
3) 2)のロッド3アナに、ロッド5アナを被(かぶ)せ、2)の弱点を解消(*3)
4) タイヤLに代わり、グロメットをはめて、後ろ脚を軽量化(*4)
5) タイヤLのクランク(回転止め)に代わり、(前方向のみ回転させる)ラチェット機構を取り付けて、スーッとすべるように前進する(*5)


 登坂(とうはん)チャレンジも、面白い競技になります。
テキスト通りのロボットでは、坂がきつくなると、後ろ足(タイヤL)の摩擦力が減(へ)ってすべったり、せっかく蹴(け)っても次に蹴るまでに前足(タイヤS)が後(あと)ずさりしたりして、あまり登(のぼ)れません。

過去(かこ)には、後ろ足を重くしたり、腹(はら)で支えたり、前足にもラチェット機構を取り付けたり(!)して、すべり止めの改良(かいりょう)が様々に生まれていました。

 ベーシックコースの総(そう)仕上げにもなりそうな、奥(おく)の深(ふか)いロボットでした。


*1 力は1/3に弱くなり、モーターが力負けして停止しやすい弱点がありますので、あまり欲張(よくば)れません。

*2 回転半径(はんけい)が半分(2アナ分⇒1アナ分)になるので、動きの幅(ストローク)が半分になり、あまりスピードアップしない弱点があります。

*3 ロッド5アナの中心を回転軸としても、回転半径を2アナ分とれ、ストロークを減らさずに脚を2倍速く動かせます。

*4 バッタらしい力強い脚に見えなくなりますが、電池が弱くても動きやすいですね!

*5 これだけで圧倒(あっとう)的に速くなります。ミドルコースレベルの改造です。


1.4 <ミドルコース『ダンゴム』>


 音に驚(おどろ)いて丸まるプログラムが愛らしい変形ロボットです。
と言っても、プログラムに変形させる機能があるわけではありません。

このロボットは、プログラミング無しの旧ミドルコースからあり、ラチェット機構によって、ダンゴムシのように多数の足で歩いたり、丸まったりします。

マイコンは、モーターの正逆回転/停止のトリガリング(切替タイミング)や継続(けいぞく)時間を手動スイッチ操作に代わって制御するのみですので、プログラム編はテキストに委(ゆだ)ねます。

ロボットの動き
 モーターは回転する力しか生み出しませんね。
その回転する力でロボットの足を動かし前進するのか、本体を変形させる(丸まる)のかはどこで決まるのでしょうか。

1日目のロボットは丸まらず、スイッチを切り替えても前進・後退するだけです。
(これだけでも、虫ぎらいな人をゾクゾクさせるには十分な仕上がりですが)
2日目のテキストに丸まるためのミソが隠(かく)されています。

丸まる改造
 テキストに倣(なら)い、写真のようにラチェットをギアに噛(か)ませてみました。
これでスイッチを入れると…、前に進んだり、丸まったりしましたね。 
なぜ2通りの働きをするのか、皆さんは既(すで)に理解していると思います。

スイッチを一方に入れて前進するのは変わりませんが、逆方向に入れるとラチェットがギアに噛み、後退する代わりに変形するようになりました。

 ここで、1つ疑問が浮かびます。
ラチェットが噛むと、そのギアは回転できなくなり、ロボットがその場に止まったまま動けなくなるだけではないでしょうか?  
ちょうど車のタイヤを回らないように固定した場合のイメージです。

力の逃げ道
 写真のように、赤矢印のギアを回した場合、隣(となり)のギアへ回転が伝わります。
青矢印のギアは回転する以外に動きようがないですね。

 そこで、ギアの土台を変えてみます。
写真のように、ビーム2本にシャフトを1本通し、ハサミのようにクロスさせます。
シャフトにギアを通し、もう1組のシャフトとギアを上部のビーム1本だけに通して噛み合わせます。
(実際に作って体験してみることが理解への一番の近道です)

赤矢印の示すシャフトを回してみます。当然、青矢印のシャフトも回転すると思います。
同時に、なんとなく上部のビームもオレンジ矢印の向きに回転しようとしませんか?
赤矢印のシャフトを急に回そうとするほど(*1)、オレンジ矢印のビームもつられて回りやすいと思います。

 この場合、赤矢印の回す力は青矢印のギアを回すかオレンジ矢印のビームを回すかの2通り、“逃げ道”があるわけです。
力の逃げ道がいくつかある場合、より簡単に動かせる(抵抗が小さい)方に逃げます
その結果、青矢印のギアが回ったり、オレンジ矢印のビームが回ったりします。
回しやすさ(抵抗)が同程度の場合は、両方とも回ることになります。

 ここで、力の逃げ道の1つを閉ざすとどうなるでしょうか。
写真の赤丸のように、ストッパーを取り付けてみました。
このストッパーの役割は、ダンゴムの(ギアと噛んだ)ラチェットと同じで、接触しているギアを回らなくしています。

この状態で、赤矢印のシャフトを回してみてください。
上部のビームをオレンジ矢印の向きにダイレクトに回転させる感じがすると思います。

 なぜそうなるのでしょうか?
赤矢印の力の逃げ道として、ストッパーを破壊して青矢印のギヤを回すよりビームを回した方がはるかに楽(抵抗が小さい)ですね。
その結果、青矢印のギアのギアを回すことなく、ビームを回すことに専念するのです。

これがダンゴムを後退させるか、丸めるかを分かつ仕組みの原理です。
7月の『シュート君』、8月の『サカアガリン』にも使われていました。

丸まる仕組み
 力の逃げ道がダンゴムの変形にどのように作用しているのかを見ていきましょう。
モーター軸(ピニオンギア)を、側面のギアMを左からA,B,C,Dと名付けます。

ギアに注目すると、これはラチェットにより回らなくなっています。
全てのギアは噛み合っていますので、このままではモーターは回転できません。
ここで何が起こるでしょう。力は“逃げ道”を常に探しています。

 スイッチを入れると、ピニオンギアは回転しようとしますが、ラチェットにより固定された一連のギアを回すことはできません
代わりに、モーター(頭部)自身が赤矢印の向きに回ることで、ピニオンギアがべベルギアの周りを回ることができますね。

ある程度までモーター(頭部)が回転すると、写真の青丸のように、ダンゴムののパーツ同士がぶつかってしまい、回転できなくなります。
逃げ道は他にないでしょうか?

実験した2本のビーム同士のように、頭⇔胸以外にも、胸⇔腹腹⇔尻の間に、折れ曲がる関節がありますね。
これらが折れ曲がることで、ギアの周りを、の周りを、の周りを回る仕事ができ(*2)、その結果、ダンゴムは丸まっているのです。

 さて、ダンゴムが丸まる仕組みは以上ですが、丸まる動作に不必要なギアがあります
それは、ギアA,B,C,Dのうち、どれを指しているでしょうか?


ダンゴムは、3つの関節で分けられた頭・胸・腹・尻の4部位それぞれに、ギアA,B,C,Dが取り付けられ、関節の両側のギアが互いの周りを回ろうとする(*3)力で折れ曲がっています。
だから、一見無駄がなさそうですが、この力の伝達に寄与(きよ)していないギアがあります。
つまり、それを外しても丸まる動作に影響はありません(*4)。それはどれでしょうか。
そのギアの記号不必要な理由、そのギアの別の役割を考えてみてください。


*1 物体を素早く加速させようとするほど、それを妨げようとする抗力が大きくなり、その分、大きな力を要します。慣性(かんせい)の法則といいます。

*2 実際は、回転方向を整えるために、間にピニオンギアを介(かい)していますが、関節を挟(はさ)んだギア同士が互いの周りを回る作用としては同様に考えられます。

*3 どちらがどちらの周りを回っていると考えるかは、基準(カメラの設置場所=動いていないと感じる方)によって変わる相対的なものです。

*4 ギアA,B,C,Dは両側面にあることに注意してください。両側セットで考えます。


1.5 <アドバンスコース『バグモジョラ②』>


 後半の3・4日目として、完成したバクモジョラによるレースがテキストp.18に提示されています。
バグモジョラを壁に向かって歩かせ、タッチスイッチで壁への衝突を検知すると後ろ向きに歩き、スタートラインへ戻るといったものです。

 この動作を実現させるプログラムを考えてみます。
一度分かれば簡単、分かろうとしなければ難しいままです。
タッチスイッチはいつ押されるか分かりませんので、ずっと監視し続ける必要があります。

このような処理には、繰り返し命令「ループ」を使います(左図)。

IF」を使うという生徒さんもいましたが、これも正解です。
ただし、「IF」ではタッチスイッチの状態を1回調べると処理を終えるため、「ループ」の中で使う必要があります(右図)。


どのみち「ループ」が必要なら、短い書き方がスマートですね。

 プログラムを転送してバグモジョラを動かしてみると、まっすぐ歩かせるのは案外に難しかったですね。
左右の足の推進力を調整できれば、バグモジョラの方向を修正できます。

この問題解決には、2つの視点からのアプローチが考えられます。
1) 脚の位相や足先の摩擦力などを調整する、機械的なアプローチ
2) 左右の脚の運動量をプログラムから調整する、制御的なアプローチ

 1) は多くの生徒さんがトライする方法です。
各脚で向きをずらしたり、足先の形状やグロメットの取り付け方を工夫することで、推進力が変わります。

片側3本ずつあり、反対側の状態にも相互に影響し合いますから、全体の脚が生み出す推進力を位相の組合せで調整するのは困難を極めましたね。
地面に着いたり離れたりする部品の摩擦力による調整も、思うように効かせられませんでした。

 2) の方法はアドバンスコースならではです。
バグモジョラの左右の脚は、それぞれ独立したモーターで駆動しています。
左右で推進力に差があるのならば、強い方の脚を時々休めてあげれば良いというアイデアです。

例えば、左に曲がりやすければ、左脚に比べて右脚の推進力が大きいと考えられます。
この場合、右脚のモーターの回転数を落とすか、右脚の動きを間欠(時々停止)運転することで、左右の推進力のバランスを調整できます。

 この2つの解決法は対照的ですね。
機械的なアプローチでは、何度もロボットを分解しては、ギアの噛み合い(位相)をずらしたり、足先を作り変えてみたりと手間がかかります。
良い調整なんて無いのかもと疑いたくなります。

制御的なアプローチでは、機械の調整はそこそこにして、プログラム上の数字を何回か変更するだけでベストな値が見えてきます。

毎回、制御的なアプローチが近道とは限りませんよ。機械的なアプローチの方が能率的な場合も大いにあります。
状況に合わせて、どちらの解決手段が向いているか見極めましょう。


1.6 <プロ1年目コース『不思議アイテムI-1③』>


 不思議アイテムの世界も、最終月を迎えました。

 1日目は、“ラーメンタイマー”を作ります。
時間を計る(というより休め!の指示)命令としては delay がありますので、所望の時間だけ静止した後、ブザーでも鳴らせば一先ず完成ですが、経過状況も知りたいのが人情です。

delay(1000) と命令する度に何かをすれば、1秒毎の経過が分かります。
delay(100) を10回繰り返して、0.1秒単位のカッコイイ表示もできます。
秒数を2桁の数字で表したければ putd2、大きな1文字を表示したければ putch、任意の大きさで円や四角を描画したければ circlerectangle、1ドット光らせたければ write、1音を鳴らしたければ play、メロディを奏でたければ play_rtttl、モーターを回したければ rotate等、いろんな命令が紹介されています。

 サンプルプログラムでは、タッチセンサーの入力検出に listenonPress、繰り返しに forwhile、条件分岐に ifswitch-case を使って、初めに秒数やアラーム方法を選ばせる実用的タイマーに仕上げていました。
中には「ピッ、ピッ」と音を発しながら10秒からカウントダウン表示し始める、その名も時限爆弾の CountBom もありました(*1)。

 最終日の2日目は、ちょっと遊んで一息つくのにふさわしい「人工生命とシンセサイザー」がテーマでした。

 人工生命といっても、8x8ドットのそれぞれを生命体(細胞=セル)になぞらえ、周囲の生存セル数に依存した単純な規則によって誕生・生存・死滅を世代展開していく様子を観察して楽しむものです。“ライフゲーム”と呼ばれます。

それの何が面白いといって、“カオス的”なのです。簡単なルールで動いているのに、先行きが読めないのです。
初期状態のちょっとした違いが全く異なる結果を生み、にわかには予測不可能なパターンを繰り広げます。
このような多数の要素が相互に絡み合って状態遷移していくシステムを複雑系と呼びます。

ただ、複雑系には、局所的な要素間の相互作用からは挙動が乱雑で予見できなくても、全体として何らかの秩序や機能の“創発”が見られる場合があります。

現代のコンピュータが、入力信号に従って電流をON/OFFするだけのトランジスタという単純な“条件付きスイッチ”で構成されているように、
実は、周囲の状態に応じて各セルの生死が決まるライフゲームでも、論理回路を構成してコンピュータを再現できること(チューリング完全)が証明されています。

ここから(*2)、生命現象や神経回路網の再現、人工知能の研究へと発展していきました。
コンピュータの登場がこのような楽しみと学問の道を開いたのですね。

ライフゲームの途方もなく奥深い世界は、下記YouTube動画で味わいましょう。

■ THE RECURSIVE COSMOS: Conway's Game of Life - PART 1
 https://youtu.be/yw-j-4xYAN4

■ THE RECURSIVE COSMOS: Conway's Game of Life - PART 2
 https://youtu.be/m4LtaZNHN9E

■ THE RECURSIVE COSMOS: Conway's Game of Life - PART 8
 https://youtu.be/1l5ie_owyik

■ ∞ L I F E
 https://youtu.be/D6aP9S9rEQk


 シンセサイザーの方は、先月の“電子ピアノ”を改造したプログラムです。
無線リンクしたゲームパッドのボタンが鍵盤になっている点は変わりませんが、アナログスティックを倒す量に応じて周波数を増減させる、エフェクター(ピッチシフター)機能が搭載されました。

プログラム上では、“play(NOTE_C4 + effect)”のように、音名を表す記号 NOTE_** にスティック傾倒量 effect を足しています。
“ド”に数値を足すって、どういうことでしょうか?

 先月の1日目に学びました。音名記号は、プログラムの転送前(コンパイル時)に音の周波数に置き換えているのです。
例えば、440Hzの“ラ”ボタンを押しながら、+54相当分スティックを前に倒せば494Hzの“シ”に、-48相当分スティックを引けば392Hzの“ソ”に変わる、という具合です。

 デジタルの世界では、すごく簡単な計算で豊かな効果を演出できる、という一例です。
ロック・ギタリストにでもなった気分で、ブイブイ演奏してみましょう。

 ここまでで、もう、光と音を自在に操れる魔法を手に入れたようなものです。


*1 ジョーク・プログラムなのですが、むき出しの配線や電子基板の中で赤いLED数字がカウントダウンを始めると、かなり物騒な雰囲気を醸し出します。
 テロが心配される国では冗談どころか、誤解から自身を危険に晒すことになるでしょう。
 日本でも、公共の場でいたずらに利用するのは厳に慎みましょう。警察沙汰になるか、配線が切断される被害(?!)に合うこと請け合いです。

*2 ライフゲームそのものというより、上位概念のセル・オートマトンと呼ばれる格子状セルで構成した計算機モデルから。
《ライフゲーム》https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0


1.7 <プロ2年目コース『アームロボット③』>


 最終月は、サーボモーター式アームロボットを使った仕事(?)編です。

 アームロボットが高精度に動いたとして(*1)、決まった文字を書く自動書記や、決まった位置の荷物を運ぶ自動搬送など、
決め打ち”プログラムで人を楽しませることはできますが、センサー入力による制御がなければ、時計の針と大差ありません。

 台座(ベース)部に超音波センサーを取り付け、荷物までの距離を測れるようにしました。


Ultrasonic xxx(US1);
  // US1接続センサーへのアクセス用インスタンス(オブジェクト変数)xxx生成

long  us = xxx.timing();

float cm = xxx.convert(us, Ultrasonic::CM);
float mm = xxx.convert(us, Ultrasonic::MM);


と書けば、超音波センサーからの時間(マイクロ秒)を us に読み取り、音速から距離を計算し、cmmm に変換してくれます(*2)。

これで、アームロボット自身が荷物までの距離を計測し、掴みに向かうプログラム [ArmRobot5/SensorArmRobot3_4] ができます(*3)。
掴む位置(計測値による動作)が掴んで欲しい位置よりも15mm遠方であれば、setPosition(mm - 15, …) のように補正するだけです。

 あるいは、超音波センサーをハンド部に取り付けて、手を近づければ逃げ、遠ざければ追ってくる不気味なハンド [ArmRobot5/SensorArmRobot2Ans] にして遊ぶこともできます(*4)。

 他に、超音波センサーを使わず、“決め打ち”や手動コントローラーで遊ぶサンプルプログラムが用意されています。

・[ArmRobot6/Block] … 位置と高さを決め打ちした、ブロック積み
 ⇒ 3個くらい積み上げられますか?

・[ArmRobot6/semiAutoArmCustom] … コントローラーによる手動操縦
 ⇒ [ArmRobot3/semiAutoArm] と同等ですが、速度調整(リミット)され、可動範囲を広げています

・[ArmRobot6/UFOcatcher] … UFOキャッチャー
 ⇒ どのような動作か、説明がありませんが、プログラムを解析できますか?

自由に改変してプログラミング力を上げておきましょう。


*1 前回書いたように、プラスチック製の長いアームを付け根のモーターで振り回すので、精度はイマイチですが…

*2 音速を340m/sとすれば、cm(片道距離) = 340 * 100 * us(往復時間) / 1000 / 1000 / 2 で求まります。

*3 旋回角度 0°限定方向です。持ち上げて旋回(搬送)する先は適当に決めます。

*4 もっと生き物っぽさを出したければ、あまりに手を近づけ過ぎるとハンドを閉じては開くという動作を加えて、噛みつき攻撃を表現するのもよいのではないでしょうか。


1.8 <プロ3年目コース『六脚ロボット③』>


 ロボティクスの名に相応しい六脚(カブトムシ型)ロボットの総仕上げに、
先月第4回までの自動シーケンス制御[HexRobot4/RemoteWalk*]をベースに、
  第5回:障害物センシングによる自律歩行制御[HexRobot5/HexCrawler*]
  第6回:与えたデータ通りのモーション再生制御[HexRobot6/HexMotion*]
を足しました。

本ロボットの制御に使用したプログラミング技術は、

現在値目標値を管理し、一次関数で補間することによるサーボモーターの滑らかな制御
● サーボ制御と異なる周期でのタイマー割り込みによるコントローラー読出し
ステートマシン(状態機械)モデルによる歩行モードおよびシーケンス(ステップ)管理
乱数によるランダム分岐制御
モーションデータ二次元配列への格納とアクセス

など、てんこ盛りです。

ソースコードは700行(コメント・空行を除いても450行)を超え、全体像を把握するにも精神力が要ります(*1)。
それを知りたいと思って、ここを読む人はいないし、その必要もありません。
それぞれの技術をもう一度知りたいと思ったときに、テキストやサンプルプログラムが参考になるでしょう。

今は100%理解しなくても、将来、何らかのロボット制御プログラムを書く段になったとき、この経験や考え方が大いに役立つでしょう。

ここでは、ゲーム制作に役立つ(というより必須の)テクニックをピックアップしておきます。

 じゃんけんプログラムを作りたい場合、コンピュータにグー・チョキ・パーをランダムに出させたいですね。
random(3) でランダムに出てくる 0, 1, 2 を対応させます。
サイコロの目なら、random(6) + 1 または random(1, 7)1~6 が出ます。

ここで知っておくべきことは、ランダムと言っても「真にデタラメな順番ではない」という事実です。
プログラム通りのビット演算しかできないCPUに対して、「何か適当な数字を出して!」は難しい注文なのです。
だから、十分ランダムに見えるように、何かしら“最初の数”をこねくり回す関数で“ちゃんと計算して”出します。

全く適当じゃないですね。これを「疑似ランダム」とか「疑似乱数」といいます。
一回限りのゲームならこれで良いのですが、問題は、プログラムを起動する度に、毎回同じ順番で数(グー・チョキ・パー)が出てくるという現象です。
これは、ゲーム機としては致命的と言って憚(はばか)れないでしょう。

 そのために、疑似乱数列生成関数に“シード値”(種となる初期化番号)を与えて、乱数列を変えられるようになっています(*2)。
Arduinoでは randomSeed(シード値) と書き、シード値はlong型整数(-2147483648~2147483647)です。

randomSeed(0)randomSeed(1) では、その後に呼び出される random() が出す数の順番が異なります。
一方で、シード値が同じなら同じ乱数列になることが“保証される”ので、シード値を毎回ランダムに与えないとなりません!

randomSeed( random(100) ) とやっても無駄です。
毎回起動後に ramdom(100) が同じ値を出すので、どうにかしてランダムな数を“拾ってくる”必要があります。

乱数列を生成するのに乱数が要るって、堂々巡りやん!
そう聞こえますね。

 Arduino等の小規模(組み込みシステム用)マイコン環境では、未接続(オープン)のアナログ入力ピンがあれば、そこから読み取ったアナログ値(ノイズ)をシード値に使う手がよく使われます(*3)。

 randomSeed( analogRead(0) );  // 0番ピンがオープンの場合

もしくは、ゲームのスタートボタン等、幸運にも(?)ユーザーの不定な行動タイミングを読み取るチャンスがあるならば、プログラム開始時からの経過時間をミリ秒単位で返す millis() を使う手もあります。

 pinMode(D2, INPUT_PULLUP);  // D2をタッチセンサー入力ピンに使う設定
 while( digitalRead(D2)==LOW );  // D2が押されるまで待つ
 randomSeed( millis() );  // ランダムな経過時間を取得できる

その他、温度(熱雑音)時刻GPS情報などが取得できるシステムでは、それらが使えます。
いずれにせよ、融通の利かない決定論的コンピュータには、カオスに満ちた外界からの情報が新鮮というわけです(*4)。

ならば、最初から analogRead(0) % 3 でじゃんけん、millis() % 6 でサイコロを振ればいいやん!
そう思いますよね。

6通りのサイコロ程度ならそれで十分かもしれませんが、広範囲の乱数を取得するには、分布の一様性(均等性)が問題となり得ます。
例えば、0~999 までの乱数が欲しい場合、analogRead()0~1023 を出すと言っても、
その時の静電的・電磁的条件によって 400~500 に偏るかもしれませんし、
起動と同時にスタートボタンを連打するせっかちな坊やに1000ミリ秒もの時間の揺らぎはありません。

暗号化の鍵データ生成等、セキュリティ用途にはまた別格の品質(不確定性・予測不可能性)が求められますが、ゲームや一般用途なら randomSeed()random() で十分です(*5)。

 もう分かっていると思いますが、プログラムは自分で書き、デバッグに苦労してみないと“絶対に”身に付きません。
何度もプログラミングして、虫(バグ)に「君の思考は相変わらず浅はかだね」と言われ続け、それに冷徹に向き合い、論理的に解決することでしか本当のスキルにならないのが人間の性(さが)です。


*1 何より、他人の書いたプログラムを読み解くのは面白くないし、苦行です。
 かと言って、自分で書いてデバッグするのはもっと大変ですが…。
 少なくとも、強い興味があるか、必要に迫られた時でないとムリですね。

*2 あくまでソフトウェア(ライブラリ)的な実装で、マイコンのハードウェア機能ではありません。

*3 オープン入力ピンは、他の電気ノード(電源等)に対してハイインピーダンス(高抵抗)かつ静電容量が小さいために、周辺の電磁ノイズに影響されて電位が揺らぎやすい。
 「フローティング」ともいう。

*4 量子コンピュータで量子乱数が扱えるその日まで…。

*5 簡易な電子機器(イルミネーション制御等)には random() が十分過ぎて、プログラムメモリが1KBしか無いようなマイコン(AVR ATtiny13等)に占めるコード量が数十%と邪魔な場合、適当な乱数列生成関数を書くこともあります。


2. 9月の課題


 <スタートアップ(全コース)>
  特にありません

 <プレプライマリーコース> (プライマリーではありません)
  - オリジナル図形プリント
  http://robocobo.sakura.ne.jp/blog/HW/RobotPP2309-Q.pdf

 <プライマリーコース>
  - オリジナル図形プリント
  http://robocobo.sakura.ne.jp/blog/HW/RobotP2309-Q.pdf

 <ベーシックコース>
  - 授業まとめを精読する(概ね3年生以上/低学年は補助の下で)
  - オリジナル課題プリント(3面図+設問)
  http://robocobo.sakura.ne.jp/blog/HW/RobotB2309-Q.pdf

 <ミドルコース>
  - 授業まとめを精読する
  - オリジナル課題プリント(3面図+設問)
  http://robocobo.sakura.ne.jp/blog/HW/RobotM2309-Q.pdf

 <アドバンスコース>
  - 授業まとめを精読する
  - オリジナル課題プリント(見取図+設問)
  http://robocobo.sakura.ne.jp/blog/HW/RobotA2308-Q.pdf (8月配信済み)

 <プロ1年目コース>
  - 授業まとめを精読する(該当テキストページを見ながら)
  - 授業まとめに紹介した動画(YouTube)を視聴する
  - [CountTimer1](2桁表示+終了メロディ)または
  [CountTimer4](+メロディ選択+ドット順次点灯)をベースに、
  LEDドットパターンや数字表示で「経過秒数が分かる」タイマーを作る
   Lv.1 8個の点を順次点灯または消灯させる8秒タイマー
   Lv.2 60個の点を順次点灯または消灯させる60秒タイマー(ヒント:%演算子)
   Lv.3 表示方法を独自に工夫した3分間(180秒)タイマー
   Lv.4 表示方法を独自に工夫した1~9分間設定モード付きタイマー
  (Lv.3以上を指示/Lv.1~順にクリアしていくと先が見える)

 <プロ2年目コース>
  - 授業まとめを精読する(該当テキストページを見ながら)

 <プロ3年目コース>
  - 授業まとめを精読する(該当テキストページを見ながら)


3. 8月の解答


 <プレプライマリーコース>
  http://robocobo.sakura.ne.jp/blog/HW/RobotPP2308-A.pdf
 <プライマリーコース>
  http://robocobo.sakura.ne.jp/blog/HW/RobotP2308-A.pdf
 <ベーシックコース>
  http://robocobo.sakura.ne.jp/blog/HW/RobotB2308-A.pdf
 <ミドルコース>
  http://robocobo.sakura.ne.jp/blog/HW/RobotM2308-A.pdf
 <アドバンスコース>
  翌テーマ1ヶ月目(来月)に配信します


4. 10月の授業予告

 http://robocobo.sakura.ne.jp/blog/hap/robo-2310.pdf

 <プレプライマリーコース>『ロボレール』
 <プライマリーコース>『SLロボロコ』
 <ベーシックコース>『ぐるぐる進む君』
 <ミドルコース>  『ロボワーム』
 <アドバンスコース>『ドレミボット①』
 <プロ1年目コース>『リンクロボット①』
 <プロ2年目コース>『センサーロボット①』
 <プロ3年目コース>『不思議アイテムIII-2①』


5. 今後の授業スケジュール


◆中間は【ハピネスなかま】他での開催が多発します。
◆八幡東11/4は【真鶴会館】小倉北区真鶴1-5-15で開催します。

――――――――――【佐藤教室長】――――――――――

[東福間]第1・3土原則<学習ルームでこぼこ>
   - 13:30~ ベーシック/プライマリ
   - 15:30~ ミドル
   - 17:30~ アドバンス

 ⇒ 10/7, 21,  11/4, 18,  12/2, 16


[東福間プロ]第2・4日原則<学習ルームでこぼこ>
   - 10:00~ プロ1年目
   - 13:00~ プロ2年目
   - 16:00~ プロ3年目

 ⇒ 10/8, 22,  11/12, 26,  12/10, 24


[中間]第2・4土原則
   - 13:30~ ベーシック/プライマリ
   - 15:30~ ミドル
   - 17:30~ アドバンス/プロ1・2・3年目

 ⇒10/14※第1回 総合会館ハピネスなかま2F研修室①
  10/28 第2回 なかまハーモニーホール3F会議室4(和室)
  11/11※, 25※,  12/9※, 23(未定)

 ※10/14, 11/11, 25, 12/9は【ハピネスなかま】で開催します


[小倉北]第1・3日原則<ムーブ>
   - 10:30~ ベーシック/プライマリ
   - 13:00~ ミドル
   - 15:00~ アドバンス

   - 12:30~ プロ1年目
   - 15:00~ プロ2・3年目

 ⇒10/ 1 第1回 5F企画ルーム1・2
  10/15 第2回 5F企画ルーム1・2
  11/5, 19,  12/3, 17


――――――――――【中野教室長】――――――――――

[八幡東]第1・3土原則<レインボープラザ4F>
   - 13:30~ ベーシック/プライマリ
   - 15:30~ ミドル
   - 17:30~ アドバンス

 ⇒ 10/7, 21,  11/4※, 18,  12/2, 16

 ※11/4は【真鶴会館】4F 第2会議室で開催します


[小倉南]第2・4日原則<総合農事センター2F>
   - 10:30~ ベーシック/プライマリ
   - 13:00~ ミドル
   - 15:00~ アドバンス

 ⇒ 10/8, 22,  11/12, 26,  12/10, 24


6. お知らせ


1) 第13回ロボット教室 全国大会 レポート・フォトギャラリー

 去る8/26(土)、東大 安田講堂に32名の出場者が集い開催されました全国大会の報告ページが上がりました。

《大会レポート・フォトギャラリー》… 新着
 https://kids.athuman.com/robo/event/convention/2023/national/resultandphotogallery/

《大会詳細》
 https://kids.athuman.com/robo/event/convention/2023/national/

《大会ライブ全編》… ダイジェスト版は未だのようです
 https://youtu.be/xgPJWTqNMbE


2) 中間教室の閉鎖について

 先月報でお伝えしました通り、中間教室の会場確保に窮するようになり、
運営計画も綱渡りでままならず、ひいては生徒募集も停止状態にあります。

 つきまして、多くのご支持を賜りながら誠に申し訳ありませんが、
下記の予定にて、中間教室を閉鎖方向で調整させて下さい。

 ●新規募集の停止 … 即日
 ●ベーシック終了 … 11月~来年3月
 ●ミドル  終了 … ~来年12月
 ●アドバンス終了 … ~来年11月
 ●プロ   終了 … ~来年9月

 上記はいずれも「最長のケース」と考えており、各コースの最終的な終了月については、前倒しを含めて、会場や在籍の状況を伺いながら決定して参りたいと存じます。

 代替教室などの候補については、生徒さんのミドル/アドバンス進級が発生する12月・1月の前月までに提示いたします。

 何卒ご理解下さいますようお願い申し上げます。


3) 8月課題 高得点者  []内は教室と学年

 ◆プレプライマリ【4名平均 図形3.5】
   5点…高村[東福間1]

 ◆プライマリ【8名平均 図形3.6】
   5点…棚町[八幡東2], 末永[小倉北2]

 ◆ベーシック【19名平均 図面2.8+設問2.1=4.9】
  10点…なし
   9点…なし
   8点…宮尾[八幡東5]
   7点…染森[東福間3], 亀平[八幡東2], 有松[小倉南4]

 ◆ミドル【13名平均 図面2.9+設問2.3=5.2】
  10点…なし
   9点…なし
   8点…なし
   7点…福永[東福間5], 鑓水[八幡東4], 本田[小倉北5], 渡辺[小倉南6]


東福間・中間・小倉北教室 佐藤 / 八幡東・小倉南教室 中野