2025年3月30日日曜日

2025年3月報

1.3月授業まとめ
2.3月の課題
3.2月の解答
4.4月の授業予告
5.今後の授業スケジュール
6.お知らせ


1. 3月授業まとめ


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


 割愛します。


1.1 <プレプライマリーコース『ロボコング』>


 対象者はいません。


1.2 <プライマリーコース『のびーるハンド』>


 割愛します。

1.3 <ベーシックコース『シカッくん』>


 新作の自動起き上がり&走行ロボです。

 四角い大きなボディと、体の割(わり)に小さなタイヤ。
スマホかタブレットのようにシンプルな見た目です。


腕(うで)を回してスタンドにすると、走行モードに早変わり。
腕をたたんで収納(しゅうのう)モードにすると、バッグに入れて持ち運びしやすいですね。

キーボード付きのタブレットPCに似(に)せたのか・・・



あるいは・・・コイツか?!
 体を支(ささ)えられるように、腕には「回せる」ことと、「固定できる」ことが必要です。
これらは矛盾(むじゅん)しているようですが、腕が一方向だけに回転してくれれば両立(りょうりつ)できそうです。

腕は  後ろ向きに回る  前向きには回らない  

この一方向の回転のみを許(ゆる)す仕組みをラチェットと呼(よ)びます。

1日目のロボットでは、ラチェットは胸(むね)の中央あたりに取り付けられています。
はぐるま(ギアM)ツメ(シャフトペグ)だけで構成され、
はぐるまツメにつっかえる回転方向と、つっかえない回転方向があることが分かります。
腕が後ろ向きにしか回せないおかげで、体を起こした位置(いち)で支えられます。

 さて、2日目に、収納モードから走行モードへ自動で切り替(か)わるように改造します。

まず、1日目に作った内臓(ないぞう)をほとんどバラして、
そこに新たなラチェットカム(*1)、クラッチ(*2)の機構(きこう)を組み込(こ)んで・・・
見た目こそ1日目と大差(たいさ)ありませんが、中身は別物。
フランケンシュタインばりの大手術でした。

 改造も大変ですが、調整(ちょうせい)も大変です。
クラッチのロックが外(はず)れなかったり、ラチェットが噛(か)まなかったり、ギアからバキバキ音がして止まったり・・・
対処(たいしょ)も一様(いちよう)ではありません。

テキスト通りに作ったのに動かないロボットが続出(ぞくしゅつ)しましたが、
これは設計が悪いせいではなく、摩耗(まもう)や精度(せいど)など、パーツの微妙(びみょう)な違(ちが)いで起こります。

問題をよく観察(かんさつ)して、原因(げんいん)を推察(すいさつ)して、対策(たいさく)を考える。
これこそがエンジニアリングなのですが、ちょっと難(むずか)しすぎましたね…。

 2日目の最後に、遊びたい盛(ざか)りのお友だちは早々に改造をあきらめ、リンボーダンス(?)ゲームをしました。

カーテンをぶら下げたゲートを構(かま)え、カーテンに触(ふ)れるようにロボットの腕の角度を調節(ちょうせつ)して進ませます。
スタートラインから狙(ねら)いを定(さだ)めて、よーいドン!!
おっと、ゲートを倒(たお)してはいけませんよ!

腕が固定される角度は、カム(Tジョイント)がロック(ロッド7アナ)を外すタイミングで設定できるので、案外(あんがい)、ゲートの高さが変わっても対応できましたね!


*1 回転する出っぱり(Tジョイント)がレバー(ロッド7アナ)などを押し上げる機構。
 これにより、腕を回すギア同士の噛(か)み合わせロックを外(はず)していますね。

*2 回転を伝える状態(じょうたい)と、伝えない状態を切り替(か)える機構。
 Tジョイントがロッド7アナを押し上げ、クラッチのロック状態が外れると、回転が腕へ伝わらなくなります。


1.4 <ミドルコース『メカポンロボ』>


 対戦型ゲーム機という新ジャンルで4年前に登場した唯一無二のマシンです。





 1日目の手動型ロボットでは、輪ゴムで吊(つ)られた背中のTロッドを押し下げることで、攻撃と防御の両腕を振り下ろしますが、ここに工夫があります。

背中のTロッドはギアM(うす)を中心に、腕はピニオンギア(うす)を中心に回転し、これらのギアは噛(か)み合っています。
歯数24のギアMから歯数8のピニオンギアを回すと、回転が3倍速くなります。
つまり、背中のTロッドを動かした角度の3倍も大きく腕の向きが変わるのです。

その分、Tロッドの動きは重く、腕を振る力は弱くなりますが、君たちの手はモーターより強い力を出せますし、Tロッドの可動範囲(ストローク)にも制約がありますから、この方がすばやく攻撃できて良い感じですね。

防御の隙(すき)を狙ってうまくヒットすると首が飛ぶゲームバランスの設計にも優れ、負けると悔(くや)しくて、ついムキになって熱中してしまう面白さがあります。


 2日目に片側をマイコン反応型に作り替え、動力にモーターを使いました。

モーターは手よりも弱く、そして速く、無制限に回りますから、手動型のように増速せず、ギアM同士を噛み合わせて、等速で腕を回しています
これで手動型に対抗できる腕力と俊敏(しゅんびん)性を備えました。


 さて、バトルプログラミングしたコンピュータとの決闘です。
人間が攻撃しようものなら、必ずその音に反応して反撃してきます。
自分の首が取れようが、手がもげようが、お構いなしに腕を振りかざし、襲ってきます。

そう、その様は、復讐の他に観念を持たない落ち武者の亡霊のように、不気味で、イイ・・・

1.5 <アドバンスコース『メクリン②』>


 前半(1・2日目)の複雑でメカメカしい作りから、シンプルなロボットへと作り変えました。
前半のロボットでページをめくるには、機械的な微調整が不可欠でした。
後半のロボットでは、可動部がモーターに直結されているため、機械的な調節の余地は少なくなりました。

 ページをめくろうとするとき、適度な力でゴムタイヤを紙に押し付ける必要がありました。
後半のロボットでは、タイヤを取り付けた腕を振り下ろした後もモーターを駆動させ続け、この力を生み出しています。
しかし、ずっとタイヤを紙に押し付けたままページをめくってしまうと、紙が折れ曲がってしまい、上手くいきません。
そこで、ロボット本体が左に移動したある時点で、腕モーターの駆動を止め(もしくは弱く持ち上げ)、ページの折れ曲がりを防いでいます。


 後半のロボットの良さは、微調節を機械的に行うのではなく、ソフトウェア的に行える点にあります。
紙を押さえ付ける圧力を調整したければ、モーターの出力値を変更すれば済みます。
圧力を解放する/持ち上げるタイミング等も、プログラムから制御できますね。


 4日目の教室では、「ページめくりを極めるも良し。ロボットを使った遊びを考えるも良し。」として、
一部ではプログラムを改造して、「叩いて、かぶって(の代わりに逃げて)」ゲーム機にして対戦しました。  

この遊びに対応するのに、ロボットの機械的な改造は不要です。
右タッチスイッチを押すと、腕を振り下ろし、相手を叩きます。
左タッチスイッチを押すと、相手の攻撃をかわすためにロボットを左に移動させればよいわけです。

機械構造的には同じでも、プログラムで機能がガラッと変わるのは面白いですね。

 プログラム次第で機能を変更できるのは、コンピュータの最大のメリットです。
小型のコンピュータ(マイコン)が開発される前は、製品ごとに専用設計のICチップを開発していました。
例えば、電卓には電卓専用設計のチップを、時計には時計用、オーディオにはオーディオ用といった具合にです。
専用チップを作るためには、回路図や露光マスクから作り変える必要があるので、時間もお金も多く必要です。
また、一旦チップを作ってしまうと後から機能の追加や変更はできません。その時は、また一から作り直しです。

ところが、マイコンの登場により、この状況は一変しました。
マイコンであれば、多くの機能がプログラムだけで変更できます。
電卓にも洗濯機にも、同じマイコンチップを搭載することが可能になるのです。  
マイコンを使うことで、電気製品の開発コストは下がり、開発期間も短くなりました。



皆さんがよく遊ぶゲーム機も、ゲームごとに本体を買い直す必要はありませんよね。
無料ダウンロードだけでも、いっぱい遊べちゃうわけです。
そこでも、コンピュータとプログラムの恩恵を受けているわけですね。 
昔のゲーム機は1つのゲームしかプレイできないのが当たり前だったんですよ!
(それはそれで新しいハードを手に入れるのがとびきり楽しみな時代でしたが…)


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


 冬タームの最終月を「ウルトラソニックロボット」で仕上げます。

 自律型ロボットといえば、障害物や段差を感知して、衝突や落下を回避しながら進むものを先ず想起するのではないでしょうか。
お掃除ロボット『ル○バ』などもそうですね。

感知に最も良く使われるのが、この超音波センサーです(*1)。
イルカやコウモリ等の生物から魚群探知機まで、反射音(方向・時間・強弱・周波数)の状態や変化を探ることで、視覚の代わりに(時にはそれ以上に)なるのです。

反響定位(エコーロケーション)と呼ばれますが、本ロボットや一般の障害物センサーでは、そこまでの解析能力はありません。
特定方向の(一定以上の大きさの障害物から)反射音が返ってくる時間(=距離)だけを計測しています(*2)。

 1日目では、2つのセンサーを別々にモニターすることでの可能性を垣間(かいま)見ました。
センサー1つでも、手をかざせば近寄り、近づけすぎると後ずさるなどプログラムできますが、両目のように左右に並べれば、左右の(状況の違いが分かる)感覚を生み出せます。

左右での感知距離(dist1, dist2)の差に応じて旋回させれば、かざした手の方向にフラフラと追跡するまでになります[step3]。
しかし、2つの距離情報を扱うのは、プログラムの条件文(判定式や分岐)が複雑になります。

センサー情報を2値(デジタル判定)化するだけでも2×2=4通りに場合分けされることのみならず、スマートな動きを実現するには、センサー2個の変化・判断の順序やタイミングなど、気にすることが増えるからです。

 2日目では、センサー1つを様々な位置に取り付け、プログラムを適応させることで、
・ 障害物を避けるロボット[avoider]
・ 机から落ちないロボット[nofall]
・ 机の端を沿うロボット [tablerunner]
壁ぎわを沿うロボット [walltracer]
を実現できることが紹介されています。

あの『ル○バ』に勝るとも劣らず、生き物らしく見えるでしょう。

 センサーで拾うたった1つの値と、それを条件に動作を分ける論理(プログラム)とで、これだけの(これ以上の)ことができます。
どれも、プログラミングのレベルに大差ありません。

勿論、これらを2つのセンサーで制御すれば、プログラムが高度になる分、よりスマートな動作で報いてくれます。


ちょっと難しく見える“おまじない”や数値処理上の工夫(*3)がありますが、核心の論理“if(条件) {動作1;} else {動作2;}”は、非常に単純明快で必然的なものです。

もっと場合分け(条件分岐)したければ、“if(条件1) {動作1;} else if(条件2) {動作2;} else if(条件3) {動作3;} else {動作4;}”等ですね。

こうして自分のロボットにを吹き込んでみれば、君はもうフランケンシュタイン(怪物の創生者)であり、鉄腕アトムのお茶の水博士です。


*1 GHz級クロックの電子回路など、技術の発達した現在では、光(電磁波)を用いたレーザー距離計やGPSセンサーも安価に手に入るようになりましたが、生物の感覚器官ではとても追いつけません。視覚が光を利用するのとは別の話ですよ。

*2 音の伝わる速さとして、空気中で340m/秒、水中で1500m/秒を覚えておきましょう。
 すなわち、地上と水中で計算式が変わりますが、時間から距離が求まります。

*3 dist/=10; または dist=dist/10; で dist値 1~99[cm] を 0~9(整数) に粗くし、大雑把に扱えるようにしています。
 例えば、if(dist==1) と書くだけで 10~19[cm] の範囲を指定することができるようになります。


1.7 <プロ2年目コース『倒立振子ロボット③』>


 今タームの最終月にして、倒立振子ロボットは終(つい)に日の目を見るのか?

 1日目は、この倒立振子ロボットを製作しました。
前後方向にだけ倒れる、左右2輪のリヤカー(大八車)タイプです。

 ここで、振り子の特性について、整理します。
振り子と言えば、今は飾りにしか使われなくなった振り子時計を想起しますね。
振り子は、支点から質点(≒おもりの重心)までの棒の長さによって揺れる周期が決まり、意外に、おもりの重さとは無関係です。
この、一定のリズムで振れる性質を“等時性”と呼び、昔の時計の進み具合に利用していました(*1)。

これを逆さに立てた場合(倒立)も同様に、棒が長いほど、倒れるのに時間が掛かるようになります。
ペンは一瞬で倒れますが、箒(ほうき)は1~2秒、テレビで見る倒木や煙突の倒壊には数秒以上を要しますね。
だから、手のひらに箒を立てることはできても、鉛筆が無理なのは、立て直す時間が足りないからです(人間には…)。

このロボットの高さ20cm程度でも、人間には難しい仕業でしょうから、立てたら凄いですね。
クララが立った(*2)時に匹敵する感動が味わえそうです。

 2日目です。

 不安定な足(タイヤ)で立てる原理は、箒と同じです。傾いた方向(前後)に動けば良いのです。
そのためには、今の状態[現在値を知り、あるべき状態[目標値との誤差を計算し、その誤差に適切な比例係数[ゲインを掛けて、制御量[出力値を発揮することを高速に繰り返すのです。

 ゲイン × 誤差(現在値[入力] - 目標値) = 制御量[出力]

前月で学んだフィードバック制御ですね。常に北を向くように旋回するオムニホイールロボットがそうでした。
北を0°として、方角(角度)のズレ(±)に比例した強さでモーターを正逆回転させれば、強弱の効いた滑らかなフィードバック制御が実現しました。

これを、P(Proportional:比例)制御と呼びます。これが基本です。

しかし、わずかな方角のズレでも素早く戻すようモーターを強力に駆動すると、ブルブルと振動してしまい、いつまでも目標値に収束(しゅうそく)しなくなりました。
1年目で嫌と言うほど経験してきたように、摩擦力が大きなタイヤの回転は、弱いパワーでは停止し易いですので、比例ゲイン Kp を抑えるだけで収束しましたが、振り子の運動は摩擦力が低いのが特徴です。

加えて、垂直付近では、重力による回転トルク(倒す力)がゼロになり、速度(勢い)を抑える外力が消えるため、慣性の法則により、勢い余って反対側に倒れ易くなります。
つまり、P制御だけでは、いつまでもグラグラすることになります(*3)。

 そこで、D(Differential:微分)制御を加えます。

これで、速度を抑える作用が働きます(*4)。
現在の(角)速度を割り出し、目標(角)速度ゼロとの誤差に微分ゲイン Kd を掛けて、制御量に加えます。
D制御は、現在値の変化に機敏に応答する特性があるため、意地悪に手で突ついたり、段差等で不意な外力が加わったりして倒れそうな場合でも、素早く立て直す作用に貢献します。

 3つ目に、I(Integral:積分)制御も加えます。

テキストで「静止に近い状態で作用する微調整」とはぐらかしていますが、高校数学の積分の概念が難しい故です。
簡単に言えば、微妙なズレを続いている時間分積算し、これに積分ゲイン Ki を掛けて、それを正すように作用させます。
短時間的に算出するP制御D制御による制御量が、目標値近傍においてゼロになり、長時間的なズレの補正に作用し辛いからです。

これら3つの要素によるフィードバック方式を『PID制御』と呼びます。

 最後に、「姿勢ゼロ点設定の調整」なんかも持ち出されて、混乱に拍車を掛けます。

これは、ロボットの重心の違いや、姿勢センサーの固定具合によってP制御やI制御の入力となる倒立角度の検出値に生じる誤差など、個体差を補正するものです。
これがなければ、倒れないには倒れないが、下手な一輪車がバランスを保とうとして、ひたすら前に進むような状態になったりします。

 いやー、絶妙な倒立振子ならではの制御ですね。
これでも、まだ、電源電圧によって各種ゲインを調整しなければ、プルプル震えながら立つのがやっとです。
「倒立ロボが、倒立ロボが、立ったー!」と叫びたければ好適な様子ですが。

 ところで、モーター端子に大小のコンデンサが半田付けされているのは、モーター駆動の電磁ノイズが姿勢検出値を乱さないようにするためで、初期のモーターには付いておらず、うまく立てずに暴走しがちでした。

「それで、結局、どのプログラムを走らせれば倒立するの?」
というのが多勢の興味でしたが、曲芸はそう簡単には実現できないのですね。
エンジニアリングの一端を垣間見た気がします。


*1 ロボット教室ミドルコース『チクタクロック』で学習しました。
 電池で動くインテリア時計の振り子は、ただのフェイクです。

*2 昭和アニメ「アルプスの少女ハイジ」中の名ゼリフです。近頃はめっきり通じなくなりました…

*3 バネによる懸架も天然のP制御で、自動車のサスペンションがコイルバネだけだと、段差を乗り越えた後いつまでもボヨンボヨン揺れ続けてしまいます。

*4 高校数学/物理ですが、位置(角度)を時間で微分したものが速度(角速度)になります。
 自動車のサスペンション(天然の地上高制御)機構で言えば、ダンパーに相当し、速い振動を抑えます。
 ダンパーはドアにも取り付けられ、急に開閉すると抵抗を感じますね。


1.8 <プロ3年目コース『二足歩行ロボット③』>


 二足歩行の制御シーケンスをプログラムに落とし込み、ボタン一発で自動歩行させる最終月です。

両足首のサーボモーター3個を個別に制御する手動操縦プログラム[BiRobotTest4_libまで]では、





1) 体を右傾させる     (左足を浮かせる)
2) 着地した右足首を左に捻る(左半身を進める)
3) 体を左傾させる     (右足を浮かせる)
4) 着地した左足首を右に捻る(右半身を進める)
という一連の動作(シーケンス)を繰り返せば前進、逆順で後退できました。

この順をそのままプログラムに記述すれば自動で歩行しますが、もう少し整理して、
a) 腰も足首も捻らず(原点位置で)直立した静止状態を挿入し、
b) 2)と4)の両足首を捻る方向の組合せで前進・後退・左旋回・右旋回の4動作を切り替える
ことを実現したのが、ボタン一発型の自動歩行プログラム[BiRobotTest5_lib]です。

 この機能レベルになると、ある時点ではどうなっており(状態)、何ができて(動作)、次にどうなるか(遷移)をしっかり設計し、プログラム中でも管理する必要がでてきます。

それには、逐次処理的な制御フローを図示するのに向いたフローチャートよりも、
各状態・動作・遷移に注目した制御フローを図示する状態遷移図が向いています。

状態遷移図は、「有限個の状態と遷移と動作の組合せからなる機械モデル」の設計図です。
この機械モデルを有限オートマトン(finite automaton)または有限ステートマシン(finite state machine)と呼びます。
機械モデルの実装はロボットでも、ソフトウェアでも、ピタゴラスイッチでもあり得ます。

 何やら小難しい響きに聞こえますが、プログラムが組めない人でも、テレビのリモコン操作を不思議に思ってなければ、裏で流れる制御ソフトの仕業として感覚的に理解していることです。

例えば、「入力切替」で画面モード(状態)を切り替え(動作・遷移)ますね。
さらに、同じ数字ボタンを押しても、地デジではチャンネルが替わり、ビデオ入力では無効になり、ブラウザではカーソルキーとして働くなど、現在の状態によって、可能な動作と遷移先の状態が変わります

 複雑な制御シーケンスや分岐・繰返し構造を場当たり的に記述していくと、バグによる思わぬ動作不良を招き易くなります。
これを、とり得る状態の数(無限にはない)に分解して、各状態における動作と遷移先の状態を規定していけば、比較的簡単に信頼性の高いシステムが設計できるというアイデアです。

状態遷移図(または表)や、より拡張された表記法である統一モデリング言語(UML)等を利用して、様々な製品が設計されています。

 さて、プログラム中で状態を管理するには、現在および遷移先の状態値(番号・記号)を記憶しておくための変数を用意します。
このような変数名には、"flag", "mode", "state", "step"等の文字列を入れると良いでしょう。
あとは、状態値に応じて、if文やswitch/case文による分岐ブロック{ }内に、動作(関数呼び出し)や状態値の書き換え(遷移)と、それに必要な条件(無条件なら不要)を記述するだけでも形になります。

独学でプログラミングを始めても、全員が発明しそうな必然の工夫です。

今回の二足歩行プログラムには、超音波センサー等の入力(条件)による自律的な状態遷移はありませんが(*1)、
前述の通り、無線コントローラーのボタン操作(条件)により足首の捻る方向(動作)を変え、4つの歩行モードを切り替えています。


 その他、下記のような制御の工夫点がありました。

繰返し周期の多重化
 1つのメインループ loop() 内で、高頻度なサーボモーターの位置更新と、
中頻度なコントローラー操作や超音波センサーからの読出しとディスプレイ更新、
低頻度な音の更新を両立させるテクニックです。


void loop() {
  if (CounterA == 0) {
    xxx.read_gamepad();
// コントローラ読出[100ms毎]
    yyy.ping();       
// 超音波センサ計測[100ms毎]
    updateDisplay();   
// ディスプレイ更新[100ms毎]

    if (CounterB == 0) {
      updateTone();   
// 音の更新[300ms毎]
    }
  }

  updateServo();       
// サーボモータ更新[20ms毎]

  CounterA++;         
// 0→1→2→3→4[20ms毎]
  if (CounterA == 5) {
    CounterA = 0;     
// 0リセット[100ms毎]

    CounterB++;       
// 0→1→2 [100ms毎]
    if (CounterB == 3) {
      CounterB = 0;   
// 0リセット[300ms毎]
    }
  }

  delay(20);   
// 毎秒50回ループ[20ms毎]
}


サーボ移動量の緩和
 上記でコントローラー操作を100ms毎にしか読み出さないのに、サーボモーター位置を20ms毎に更新するのは動きを滑らかにするためですが、
そのために足首は1/5ずつ、腰は(反動で倒れやすいので)1°ずつに毎回の更新量を制限するテクニックです。


diffLF = (targetLF - currentLF)/5; 
// 左足首の移動量/5
diffRF = (targetRF - currentRF)/5; 
// 右足首の移動量/5

currentLF += diffLF;           
// 左足首サーボモータ角度
currentRF += diffRF;           
// 右足首サーボモータ角度

servoLF.write(currentLF);     
// 左足首サーボモータ更新
servoRF.write(currentRF);     
// 右足首サーボモータ更新

if (currentBD < targetBD) {
  currentBD++;                 
// 腰サーボモータ+1°
else if (currentBD > targetBD) {
  currentBD--;                 
// 腰サーボモータ-1°
}
servoBD.write(currentBD);     
// 腰サーボモータ更新



 この二足歩行ロボットは、3個と少ないサーボモーターで多様な歩行動作ができるだけでなく、上体を左右に振り、片足を浮かせて両足首を曲げられるので、シーケンス制御のセンス次第では、ダンスのような動きも見せられるでしょう。
胸のディスプレイ演奏力も武器にして、ロビに勝るエンターテイメントロボに仕上げてみてはどうでしょうか。


*1 目玉に見せかけた超音波センサーが付いていますが、計測した距離に応じてメーター表示や鼓動音を変えているだけであり、歩行制御には関与していません。


2. 3月の課題


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

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

 <プライマリーコース> (難しければプレプライマリー↑でもOK)
  - オリジナル図形プリント
  https://robocobo.sakura.ne.jp/blog/HW/RobotP2503-Q.pdf

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

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

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

 <プロ1年目コース>
  - 授業まとめを精読する(該当テキストページを見ながら)
  - 単一距離センサーロボット[avoider/nofall/tablerunner/walltracer]のいずれかを改良し、
  ダブル距離セ ンサーロボットとして、より洗練された動きを設計・実装する

  例えば、
  ・壁と壁の間を往復するプロ版“う王さ王”[avoider改]
  ・左/後退/右から安全な方向を選ぶ    [nofall改]
  ・左/直進/右を選びつつ崖っぷちを沿う  [tablerunner改]
  ・左/直進/右を選びつつ壁伝いに迷路を進む[walltracer改]

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

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


3. 2月の解答


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


4. 4月の授業予告

 https://robocobo.sakura.ne.jp/blog/hap/robo-2504.pdf

 <プレプライマリーコース>『キックボーダー』
 <プライマリーコース>『がたごとレスキューたい』
 <ベーシックコース>『ケンドーロボ』
 <ミドルコース>  『ロボキャッチ』
 <アドバンスコース>『ブランカー①』
 <プロ1年目コース>『オムニホイールロボット①』
 <プロ2年目コース>『不思議アイテムII①』
 <プロ3年目コース>『不思議アイテムIII-1①』


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


◆5月は小倉南を除く全教室(東福間・古賀・八幡東・小倉北)で一週ずつ遅れます。
 5月は小倉北⇔小倉南で(同日の為)振替できません。
◆6月も日曜日の教室(東福間プロ・小倉北・南)は一週ずつ遅れます。
小倉南5/11は〔山田緑地〕で開催します。

――――――――――<佐藤教室長>――――――――――

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

 ⇒ 4/5, 19,  5/10※, 24※,  6/7, 21

 ※5月は一週ずつ遅れます

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

 ⇒ 4/13, 27,  5/18※, 6/1※,  6/15※, 29※

 ※5月・6月は一週ずつ遅れます

[サンリブ古賀]第2・4土原則<文化サークル>
   - 10:30~ ベーシック/ミドル/アドバンス

 ⇒ 4/12, 26,  5/17※, 31※,  6/14, 28

 ※5月は一週ずつ遅れます

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

   - 12:30~ プロ1・2年目/卒業制作
   - 15:00~ プロ3年目

 ⇒4/ 6 第1回 5F企画ルーム1
  4/20 第2回 5F企画ルーム1
  5/11※, 25※,  6/8※, 22※

 ※5月は一週ずつ遅れ、小倉南と同日(振替不可)となります
 ※6月も一週ずつ遅れます

――――――――――<中野教室長>――――――――――

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

 ⇒ 4/5, 19,  5/10※, 24※,  6/7, 21

 ※5月は一週ずつ遅れます

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

 ⇒ 4/13, 27,  5/11※, 25,  6/15※, 29※

 ※5/11は農事センター利用不可につき〔山田緑地〕で開催します
 ※6月は一週ずつ遅れます


【振替教室ご利用条件(ロボプロを除く)】――――――――
 振替先の1週間前までにメール下さい(許可制)
 振替手数料550円/回をご負担下さい(お引落し)
 (東福間⇔小倉北のみ無料)
 所定コース内容・時間のみお受けします


6. お知らせ


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

 ◆プライマリ【2名平均 図形2.5】
  高得点なし

 ◆ベーシック【15名平均 図面3.0+設問1.4=4.4】
  10点…なし
   9点…なし
   8点…なし
   7点…福田[八幡東3]
   6点…小川[小倉北3], 姥[小倉南4]

 ◆ミドル【13名平均 図面3.5+設問1.8=5.3】
  10点…なし
   9点…なし
   8点…土屋[小倉北4]
   7点…荒川[小倉北4]


東福間・小倉北・サンリブ古賀教室 佐藤 / 八幡東・小倉南教室 中野

2025年2月26日水曜日

2025年2月報

1.2月授業まとめ
2.2月の課題
3.1月の解答
4.3月の授業予告
5.今後の授業スケジュール
6.お知らせ


1. 2月授業まとめ


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


 割愛します。


1.1 <プレプライマリーコース『サイコロン』>


 対象者はいません。


1.2 <プライマリーコース『ロボドーザー』>


 割愛します。

1.3 <ベーシックコース『ジャンピングトビー』>


 なわとびロボットです。

 ぴょんぴょん跳(は)ねるのが11月の『ホッピンバード』と似(に)てますか?
あちらと違(ちが)って、ゆっくりジャンプできますが、どうしてでしょうか?

それは、シーソーになっているからですね。
公園のシーソーで自分の方が上がっているとき、相手が急にどくと、自分がストンと落ちてしまいますね。

2人で遊べば、自分と相手で重力を打ち消し合い、月面のようにふわふわとジャンプできるようになります。

 『ジャンピングトビー』では、トビー(人形)の反対側に重たい電池ボックスをくくり付けて、トビーの重力を軽くしています。
それでも、トビーの方が重たいので、ジャンプしてもゆっくり下りてきます。

電池ボックス側にタイヤLを2個もくくり付けて重くすると、トビーが上がったまま下りられなくなりますね。

 さて、トビーがジャンプするメカニズムにも工夫(くふう)があります。

『ホッピンバード』では、モーターで直接バードを持ち上げました。
トビーの足もモーターで動かしているようですが、輪ゴムも使っています。
どういう関係でしょうか?

 実は、トビーをジャンプさせているのは輪ゴム(だけ)の力です。
モーターは、足を引っこめながら輪ゴムをゆっくり引き伸(の)ばして、元に戻(もど)ろうとする力を貯(た)めさせています(*1)。
復元(ふくげん)とか、弾性(だんせい)エネルギーとも言います。

輪ゴムの方が強い瞬発(しゅんぱつ)を出せるからで、そのお陰(かげ)で、シャフトペグによるロックが外れると、地面を蹴(け)った勢(いきお)いで宙に上がることができます。
モーターだけでは、力不足か、スピードがおそくて、ジャンプというより屈伸(くっしん)運動になってしまうでしょう。

 2日目でなわを取り付けて回せば、余裕(よゆう)でなわとびできました。
電池ボックス側をさらに重くすれば、さらにジャンプがゆっくりになり、2重とびもできました(*2)。

2重とびが苦手(にがて)な人は、ヒントになるでしょうか??


*1 モーターで力をゆっくり貯めるのは、輪ゴムを強い力で引っぱれるよう、ギアを使って回転をおそくし、力を大きくしているからです。

*2 2重とびどころか、3重とび、4重とび、5重とびが3回連続できた人もいました。


1.4 <ミドルコース『バシャリン』>


 第8回アイデアコンテスト全国大会(2018年)最優秀賞作品(当時小3)がベースの、馬車ロボットです。

当時、中国広東省の少女が会場で披露(ひろう)するのを見たとき、「これは優勝かも」と直感させるのに十分な動きでした。
“馬車”というテーマが特段に優れたアイデアとは思いませんでしたが、“動き”の作り込みが秀逸(しゅういつ)なのです。

機械的に、特に生体(例えば馬)を模(も)したロボットとしては、それらしい見た目動き方に対する期待が高い分、この両立がとても難しいのです。
ですから、ミドルコース生なら、「作るのが簡単」というだけでこのロボットを評価せず、随所(ずいしょ)の工夫を参考にして欲しいと思います。

 加えて、馬車ロボットとして、メカニズム面の特徴や利点は何でしょうか。

● 荷車を引いている
● 荷車にモーター・電池ボックスを載(の)せている
● 荷車からのシャフトドライブにより、馬の脚を駆動している
など、“荷車”が目を引く特徴となっています。

これを、「馬ロボットの胴体に入らないから/馬のデザイン優先のため、荷車を引いて馬車にした」と見ると、秀(ひい)でたポイントを見誤ります。

 荷車は、重量物を車輪で支え、容積も大きく自由に取ることができるため、人や荷物の運搬能力が高くなります。
例えば、馬の背中に載せられる重さ・大きさの何倍もの荷物を軽々と引くことができます。

そして、そのことにより、馬の荷重が軽くなり、足取りも軽く、省エネルギーで、疲れにくく(壊れにくく)もなります。
平らな路面では、乗り心地防振性(ぼうしんせい=揺れから守る能力)も向上しますね(*1)。

全体として重量が大きく増えるのに、多大な恩恵(おんけい)があるのですね。
車輪が大発明と言われる所以(ゆえん)です。

 こうして見ると、馬車は、生体と機械の優れた融合体なのですね。
上下左右に揺れやすい馬ロボットとしては、どっしり重い荷車で後ろから支えるため、倒れにくく安定する効果もあります(*2)。

 脚を回すギアM(歯数24)は、モーター直結のドライブシャフトをマイタギア同士で転向し、ピニオンギア(歯数8)を経由して回していますから、1/3に減速(3倍遅く)しているだけです。

動きが遅いロボットでは、よく1/9に減速(力を9倍に)していますが、軽量な馬の脚を回すには、これで十分なようです。

 こうして、パカパカ軽やかに小走りする馬ができあがりました。
背が高く、一見重そうに見える割には速い」という意外性も、快走感を出すのに一役買っています。

 モーターのパワーにもまだ余力があり、長い首もテンポよく振ることができます。

ロッド3アナの中心軸を回すことで、1回転につき2回、首のビーム14ポチを押しのけるカム機構を利用しています。
ロッド3アナはギアMと同じ回転数ですので、脚が1回転する間に首を2回振る関係です。

 観光地に行って実物に乗りたくなる情景を醸(かも)し出してくれました。


*1 自動車のように、サスペンションの採用でさらに性能を上げやすいです。

*2 加速後は慣性重量により後ろから押されるため、一定のスピードを保ちやすく、馬ロボット単体より速くなる効果もありそうなほどスムーズに走ります。


1.5 <アドバンスコース『メクリン①』>



 読書支援(ページめくり)ロボットは、思いの外、様々な形態で実用化・製品化されています。

ここは、文章よりも、興味深いYouTube動画で学びましょう。


■自動ページめくり機「りーだぶる3」 ダブル技研株式会社
【紹介動画】https://youtu.be/gA6nZJLYaCM
【製品説明】https://j-d.co.jp/fukushikiki-readable.html
【機構的特徴】
 めくりアームの先端にページ押さえとローラが取り付けてある。
 ページを押さえつつめくりローラを回転させることで、1枚のみめくれるよう工夫されている。

■電子書籍化支援システム「ブックターナー BT-100」 CASIO計算機
【紹介動画】https://youtu.be/lXqDOikdC38
【製品説明】https://web.casio.jp/bookturner/
【機構的特徴】
 アームの先端に取り付けた粘着ローラで紙を吸着する。
 吸着したあと、紙を押さえつつ端からめくることで、下の紙が一緒にめくれないよう工夫されている。

■高速・高精細書籍電子化システム「BFS-Auto」 東京大学 石川妹尾研究室
【紹介動画】https://youtu.be/03ccxwNssmo
【製品説明】
〔アーカイブ〕https://web.archive.org/web/20250128030104/https://ishikawa-vision.org/vision/BFS-Auto/index-j.html
〔紹介サイト〕https://gigazine.net/news/20121129-bfs-auto-book-scanner/
【機構的特徴】
 紙をパラパラめくる方式。
 ページを固定しているストッパーを1枚分のみずらしてめくる。
 ストッパーの動きを高精度で制御している。

■自動ページめくり器「ブックタイム」 西澤電機計器製作所
【紹介動画】https://youtu.be/Cj-fGT_lfFk
【製品説明】
〔アーカイブ〕https://web.archive.org/web/20170408093021/https://www.nisic.co.jp/products/assistive/booktime.html
〔紹介サイト〕https://suwa.monozukuri.or.jp/hitowaza/00066/
【機構的特徴】
 1・2日目(今月)の『メクリン』と同じ仕組み。
 ページの表面をラバーでさらい、隙間にロッドを差し込み、ページを送る。


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


 センサー類を駆使する、冬タームの2ヶ月目です。

 1日目のテーマは、「ベースロボットの組み立て」です。
何のことはない、左右両輪(2モーター)を独立駆動して、前進・後退・左右旋回を自在にこなす土台のロボットを製作します(*1)。

戦車型ラジコンプログラム[Tank]を転送して操縦したり、時間制御プログラムで決まったコース(円・四角・8の字など)を自動的に走らせることはできますが、まだセンサー類が無いので、外界からの入力情報を基に考える”ことはできません

 2日目のテーマが、「カラーセンサーロボット」です。

 その1つ目は、「ライントレーサー」です。
カラーセンサーを下向きに取り付け、地面の明暗(白黒)情報だけを処理し、黒いライン(の縁)をたどるロボット[Tracer]に仕立てます。
「白なら右へ、黒なら左へ」旋回するように片輪を交互に駆動する制御方式は、アドバンスコースSUのそれと同じですね。

マイコンが認識する明度(明るさの数値)は、環境光反射率はもちろん、センサーの個体差電源電圧(*2)にも左右されるため、各々のロボットで閾(しきい)値 colorIsBlack(1000) を変更する必要がありました(*3)。

 2つ目は、「カラートレーサー」です。
カラーセンサーをヘッドライトのように前向きに取り付け、前方景色の色相(色味)情報だけ(*4)を処理し、特定の色に向かうロボット[ColorTracer]に仕立てます。

サンプルプログラム中、色相 h を使って“if(h>180 && h<270) {前進せよ;} else {停止せよ;}”となっています。
これは、数学的には 180°<h<270°のことで、色相環(テキスト第2回p.16, 第4回p.15)で確かめると“”ですね。
”なら“if(h>60 && h<150) …”くらいでしょうか。

”は難しいです。2つの変域 0°≦h<30°, 300°<h<360°がありますので、“もし(hが0以上 かつ hが30未満)または(hが300超 かつ hが360未満)ならば”のように論理的に記述しなければなりません。
if( (h>0 && h<30) || (h>300 && h<360) ) …”となります(*5)。

走り方(タイミング、スピード、軌跡など)に変化をもたせて、好きな色を見ると近づいて行く愛らしいロボット(闘牛?)に仕上げてみましょう。
鳴く”と面白そうですね。

 最終月は、「ウルトラソニックロボット」で今タームを仕上げます。


*1 これだけで普通の自動車(1エンジン)を遥かに凌駕する自由度を獲得できるのですから、将来は電気自動車に替わっていくわけです。

*2 パソコンからのUSB給電の場合と、電池駆動とで数値が変わるという…盲点があります。

*3 よりスマートに、調整用プログラム[ColorSensor2]実行中、Arduino“シリアルモニタ”を起動し、USBケーブル経由で白地と黒ライン上の数値をモニタリングし、その中間値を閾値として設定することもできます。

*4 1ドットカメラなので、人間なら瞼(まぶた)を瞑(つむ)ったまま外光の色を感じるようなものです。

*5 論理積(AND)演算子 && は、論理和(OR)演算子 || より優先順位が高い(先に演算される)ので、“if(h>0&&h<30||h>300&&h<360)…”と続けて書いてもOKですし、h=0~359の値しか取らないので、実は“if(h<30 || h>300)…”だけでもOKです。


1.7 <プロ2年目コース『倒立振子ロボット②』>


 倒立振子? 2ヶ月目ですが、まだまだ、もったいぶりますよ。
自転車のムラタセイサク君(2005年)や、一輪車のムラタセイコちゃん(2008年)が誇らしげにCMに登場してからまだ十余年、ホットな技術なのです。順を追いましょう。

 1ヶ月目で、チップに集積された3種の姿勢センサーのうち、加速度センサー角速度センサーの機能を学びました。
ここまでの出力手段は、LEDマトリクスや7セグへの“表示”だけでしたが、「感じて、考えて、動く」のがロボットです。運動能力を与えましょう。

少ないハードでも、高い自由度で動き回れるロボットの形態と言えば、3輪のオムニホイールロボットですね。
2日目にこれを組み立て、マイコンボード、I/Fシールドに姿勢検出シールドを搭載します。

動くと、やはり面白いことになります。
角速度センサー(Z軸)を使って、どういう向きに置き直してもクルッと回って元の向きに戻りたがる奴[AngCtrlOmni](*1)を目にすると、どうしても生命感を感じてしまいます。

 ここで、「向きを検知して表示するのもモーターを回すのも同じくらい簡単にできるけど、やっぱり動いた方が面白いよね!」と実感することだけが目的ではありません。
出力先がディスプレイなら、処理結果を送るだけで、ちゃんと表示されたかどうかなど調べる必要はありませんが、
物体の運動には様々な外乱要因が加わりますので、「あるべき状態(目標値)」と「今の状態(現在値)」にズレが生じることを前提にしなければ、高精度な制御はできません。

このズレを最小化するよう頑張り続ける方式を“フィードバック制御”と呼びます。
片や、決められた手順や時間・回数分だけ逐次実行して、結果を省みない無責任な処理方式を“シーケンス制御”と呼びます。
タッチセンサーやボタンの押下状態(1ビット=2値)を調べて条件分岐するくらいでは、とてもフィードバック制御と言えません。

身の回りの製品では、
シーケンス制御 … 目覚まし時計、炊飯器、洗濯機、リモコン(高機能品を除く)
フィードバック制御 … エアコン、給湯器、CD/DVDプレーヤ、車の自動ブレーキ(*2)

など、やはり賢そうな機械ほどフィードバック制御が多用されています。

 ここで、わずかな位置のズレでも素早く戻すようモーターを強力に駆動すると、振り子のように振動してしまい、いつまでも目標値に収束(しゅうそく)しなくなります(*3)。

つまり、「理想と現実のズレを解消しようとがむしゃらに努力すれば必ず報われるほど、甘くはない」という真理を突き付けられる訳です。
悲しいですね。もう一段、スマートさが必要なんです。

制御工学(理論)において、目標値とのズレを「誤差」、出力値の大きさを決めるために誤差に掛ける係数を「フィードバックゲイン」(または単にゲイン利得)と呼びます。
ゲインを増やすほど素早くなりますが、必要以上に大きくして、ギクシャクした動きや振動にならないよう注意します。

 元の向きに戻るプログラム[AngCtrlOmni]中、現在の角(速)度 ang目標値 Ref誤差 Errゲイン Kp が見つかります(*4)。

大事なのは、「確定的な結果の保証よりも、現在の状態を客観的に知り、目標に近づこうと働き続ける」点です。心に響きましたか?

 次月こそ、いよいよ倒立振子ロボットの製作です。


*1 角速度センサーを使った積分プログラムで、どれだけ回転したかを求めていますが、累積誤差がつきもので次第にずれが拡大していくことと、最初に初期状態(地球の自転や個体差の影響)を計測せねばならない欠点もあります。

*2 車を持ち出したら、エンジン燃焼、カーエアコン、定速走行、スリップ防止など、枚挙に暇(いとま)がありませんが。

*3 手のひらに箒(ほうき)を逆さに立てる時など、皆さんも無意識に同じことをやっていますよ。ずっと全速力で手を動かすマヌケはいませんよね。

*4 ゲインKpはトライアル用[AngCtrlOmni_Challenge]で追加されています。
 Kp = 1 のままでは[AngCtrlOmni]と同等です。


1.8 <プロ3年目コース『二足歩行ロボット②』>


 2ヶ月目で、両目+舞踏仮面(超音波センサー+カバー)と両腕を取り付けて、外観が完成しました。あとは“ハート”です。

Pepperくんモドキに、胸にディスプレイ(8×8マトリクスLED)があります。
左胸だから(ニクい設計!?)、ドキドキハートのアニメーションを表示させようという魂胆です。
1年目から幾度も使ってきた <Sprite.h>, <Matrix.h> 両ライブラリを読み込んで(*1)、
大中小3パターンのハートマークを順次書き換えるプログラムで簡単に実現しました(*2)。

ハートマークの変化に合わせて、スピーカーから高中低3音を鳴らし分ければ、それはもう心臓の鼓動。愛想が生まれます。
見た目と相まって、私達の目に擬人化されて映るのに十分過ぎる表現力です。

役に立たない?
いえいえ、人間と共生し、楽しませる人型ロボットには大切な要素です(*3)。

 このロボットの両目は超音波センサーですから、外界を少し“見る”能力があります。
目の前にかざした手(反射体)までの距離をプログラム [BiRobot4/USSTest0] で計測し、PC画面でシリアルモニタリングしてみました。

すると、200cm以上遠くまで計測できるスペックなのに、手を退(の)けても50cm前後で数値が揺らいでいます。
(50cm先に見えない“何か”が存在する?!)

 原因は、8×8マトリクスLED表示に伴う電気ノイズにありました。
この表示デバイスは64個のLEDを1ドットずつ書き換えられる(ように見える)のに、
1) 裏面には8+8=16本のピンしか生えてなく、
2) 現在の表示パターンを保持しておくメモリや駆動回路も無い受動デバイスですから、
ダイナミック点灯方式で外部から“動的に”駆動してやらなければなりません。

つまり、8+8本のピンは、X座標Y座標の指定ピンとして機能し、
X座標用のどれか1ピンに電源(+)、
Y座標用のどれか1ピンにGND(-)を繋いだ時、
その交点のLEDドットだけが点灯するという、単にそれだけの表示器なのです。

ある瞬間には、ある座標のLEDがせいぜい1個だけ点灯(画像データによってはそれも消灯)している状態を、全64個のLEDについて高速に切り替えてやる必要があります。
即ち、全てのLEDドットはこの周期で点滅しているのですが、30~40Hz以上の点滅は連続点灯しているように見えるという残像効果を狙った使い方で設計されています。

 このダイナミック点灯方式は、駆動回路(またはプログラム)として面倒なことには違いありません。
当然、64個のLEDに個別のスイッチを配線して“静的に”画像を保持できる(分かり易い)スタティック点灯方式もありますが、
これでは高々8×8ドット画像のために少なくとも65本(1本は共通GND等)のピンが必要になり、マイコンのピンが幾らあっても足りなくなります。
それを16本に削減することで、普通のマイコンで(安く)済むという大事な恩恵が得られるのです。

 但し、超音波センサーやスピーカー等、他にも接続したいデバイスが多数ある28~40ピンのマイコンにとって、このLEDに16本も消費されるのは依然として勿体無く、拡張性も乏しくなります。

そこで、マイコンボードマトリクスLEDの間に挟まっている「マトリクスLEDシールド」というボードが一役買います。
このシールドボードには、パターンメモリや駆動回路が組み込まれたドライバーチップが搭載され、LEDのダイナミック点灯を代行してくれます。

マイコンは、オブジェクト初期化宣言 Matrix my_mat = Matrix(11, 13, 1); のように、僅か3ピンを使って、シリアル通信方式でこのドライバーに更新データを送り付けるだけで済むのです(*4)。

 このように、ダイナミック点灯は多数のLEDから成る表示デバイスに欠かせない方式ですが(*5)、
電気回路には、電流が急変すると、それが電気ノイズとして他の配線に回り込んだり、電磁ノイズとして空間に飛び出したりする宿命(アンテナの原理)があります。

激しくLEDのON/OFFを切り替えるダイナミック点灯方式では、このようなスイッチングノイズが他のデバイスの信号レベルを乱し、誤動作させる場合があります。

これが原因で、超音波センサーからのEcho(反響検知)信号が50cmの障害物と同じタイミングで乱れて誤判定されていたのですね。

 この問題は、
1) NewPing::ping_cm() 関数で超音波計測する“”に、
2) Matrix::clear() 関数でLEDを“全消し”しておくことでスイッチング電流を控え、
3) “計測後”に Matrix::write() 関数でドキドキハートや距離バーメーターを表示することで、
同時使用が可能になって解決しました。


それでも、LED表示が一瞬消えるようには見えませんでしたね。
即ち、ソフトウェア的にもダイナミック点灯(人間の残像効果)を利用したことになります。

 他にも、シリアルモニタ通信 vs. マトリクスLED1番ピン)や、超音波センサー vs. スピーカータイマー2)等、
複数のデバイス同士で、使用するマイコンのピンタイマー機能競合に纏(まつ)わる問題が発生し、それを解決していく疑似体験をしました。

 このように、ロボットや電子機器(頭脳としてマイコン)に様々なデバイスを統合する際には、限られたリソース(処理速度や機能数)を問題が起こらないように分け合い、有効活用する“知恵”が求められます。
それは、面倒なことですが、実利性のある製品を作るために必須の営みです。

 最終月で、いよいよ二足歩行ロボットの頭脳をプログラミングして参りましょう。


*1 #include <xxx.h> は、本来(ベースのC/C++言語環境で)は、
「ライブラリ格納フォルダから"xxx.h"という名のヘッダファイル(ライブラリ本体ではなく、定数やクラス・関数プロトタイプ宣言等の定義情報の寄せ集め)を探して読み込み、一緒にコンパイル(翻訳)せよ」
という指示であり、ライブラリ本体プログラム"xxx.cpp"との結合(リンク)は別物なのですが、使い易く実装されたArduino環境がこれらの作業を代行してくれます。

*2 if/else構文の代わりに、多分岐構造に適した switch/case構文を使いました。

*3 そもそも人型ロボットにするところから、擬人化で人の感情を揺さぶる要請があります。
 高橋智隆先生が創る“役に立たない”ロボットもここを重視しています。

*4 実際は、11番ピンがクロック信号、1番ピンがチップセレクト(デバイス選択)信号のようですので、13番ピンだけを使って画像データやアドレス(座標)情報を送っています。
 SPI(Serial Peripheral Interface)通信と呼ばれる方式です。

*5 光るデジタル時計などもそうです。安いものでは、表示が少しチラついているように見えたことがありませんか?
 ダイナミック点灯方式で点滅しているからです。


2. 2月の課題


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

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

 <プライマリーコース> (難しければプレプライマリー↑でもOK)
  - オリジナル図形プリント
  https://robocobo.sakura.ne.jp/blog/HW/RobotP2502-Q.pdf

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

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

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

 <プロ1年目コース>
  - 授業まとめを精読する(該当テキストページを見ながら)
  - カラートレーサープログラム[ColorTracer]を改変し、
  赤(好き!)へ突進、青(怖い!)からはゆっくり後ずさり、
  それ以外では停止するロボットに仕立てる

  《ハイレベル挑戦》さらに、緑(臭い!)で旋回する動作を足せるかな?

  【注意】色は色相 h で表し、赤:h<15 or h>315、青:195<h<255、緑:75<h<135 等で与えます。
   照明ライトのレンズ反射光で誤動作し易いので、//ColorSensor.led(3); のようにコメントして消灯します。
   動作を足すほど不意に動き回って危険ですので、特に後退時はスピードを抑え、忙(せわ)しすぎる場合は反応する色相範囲を狭め(停止範囲を広げ)ます。

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

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


3. 1月の解答


 <プレプライマリーコース>
  https://robocobo.sakura.ne.jp/blog/HW/RobotPP2501-A.pdf
 <プライマリーコース>
  https://robocobo.sakura.ne.jp/blog/HW/RobotP2501-A.pdf
 <ベーシックコース>
  https://robocobo.sakura.ne.jp/blog/HW/RobotB2501-A.pdf
 <ミドルコース>
  https://robocobo.sakura.ne.jp/blog/HW/RobotM2501-A.pdf
 <アドバンスコース>
  https://robocobo.sakura.ne.jp/blog/HW/RobotA2412-A.pdf


4. 3月の授業予告

 https://robocobo.sakura.ne.jp/blog/hap/robo-2503.pdf

 <プレプライマリーコース>『ロボコング』… 対象者はいません
 <プライマリーコース>『のびーるハンド』
 <ベーシックコース>『シカっくん』
 <ミドルコース>  『メカポンロボ』
 <アドバンスコース>『メクリン②』
 <プロ1年目コース>『不思議アイテムI-2③』
 <プロ2年目コース>『倒立振子ロボット③』
 <プロ3年目コース>『二足歩行ロボット③』


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


◆5月は小倉南を除く全教室(東福間・古賀・八幡東・小倉北)で一週ずつ遅れます。
 5月は小倉北⇔小倉南で(同日の為)振替できません。
◆6月も日曜日の教室(東福間プロ・小倉北・南)は一週ずつ遅れます。
小倉南5/11は〔山田緑地〕で開催します。

――――――――――<佐藤教室長>――――――――――

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

 ⇒ 3/1, 15,  4/5, 19,  5/10※, 24※

 ※5月は一週ずつ遅れます

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

 ⇒ 3/9, 23,  4/13, 27,  5/18※, 6/1※,  6/15※, 29※

 ※5月・6月は一週ずつ遅れます

[サンリブ古賀]第2・4土原則<文化サークル>
   - 10:30~ ベーシック/ミドル/アドバンス

 ⇒ 3/8, 22,  4/12, 26,  5/17※, 31※

 ※5月は一週ずつ遅れます

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

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

 ⇒3/ 2 第1回 4F和室
  3/16 第2回 4F和室
  4/6, 20,  5/11※, 25※,  6/8※, 22※

 ※5月は一週ずつ遅れ、小倉南と同日(振替不可)となります
 ※6月も一週ずつ遅れます

――――――――――<中野教室長>――――――――――

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

 ⇒ 3/1, 15,  4/5, 19,  5/10※, 24※

 ※5月は一週ずつ遅れます

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

 ⇒ 3/9, 23,  4/13, 27,  5/11※, 25,  6/15※, 29※

 ※5/11は農事センター利用不可につき〔山田緑地〕で開催します
 ※6月は一週ずつ遅れます


【振替教室ご利用条件(ロボプロを除く)】――――――――
 振替先の1週間前までにメール下さい(許可制)
 振替手数料550円/回をご負担下さい(お引落し)
 (東福間⇔小倉北のみ無料)
 所定コース内容・時間のみお受けします


6. お知らせ


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

 ◆プライマリ
  高得点なし

 ◆ベーシック【12名平均 図面2.5+設問2.3=4.8】
  10点…なし
   9点…なし
   8点…なし
   7点…福田[八幡東3]
   6点…高村[東福間2]

 ◆ミドル【16名平均 図面3.6+設問2.3=5.8】
  10点…宮尾[八幡東6]
   9点…なし
   8点…亀平[八幡東3], 山根[八幡東3], 荒川[小倉北4]
   7点…木村[小倉北2], 土屋[小倉北4]

 ◆アドバンス
  高得点なし


東福間・小倉北・サンリブ古賀教室 佐藤 / 八幡東・小倉南教室 中野