見出し画像

教室運営で思うこと(21)Arduinoにどっぷり

生徒の保護者様からご相談を受け、「Arduino」を使ったプログラミングを教えることになりました。
ご自身は開発のお仕事ではないものの仕事に関係したいろいろを理解するためにプログラムに挑戦されているとのこと。すばらしい。
独学で学んでいるようでしたので、”すでに知っていることを聞くのも辛かろう”と思い、知りたいことを先に伺ってそれについて調べて教えることにしました。


知りたいことにフォーカスして教える


今回新たに参加する大きなお友達に教えるのは「Arduino(”アルデュイノ”」というマイコンボードのプログラミングです。
エジソンアカデミーのカリキュラムを全て終了した生徒で、まだプログラミングを学びたいという生徒向けに、Arduino または Raspberry Pi の入門コースを用意していました。入会していただいた生徒と保護者様にはご案内していたので、大人でも入会できるかご相談いただいたというわけです。
席に余裕があり、私も久しぶりに大人に教える緊張感、レベルの高い抗議も久しぶりということで、子供たちと一緒の教室でも構わなければということでお受けしました。

さて、教えることになったのはいいのですが、テキストをどうするかという問題を解決しなければなりません。
子供たちに教えるときは、わかりやすい入門書が市販されているので、指定の書籍を購入していただきそれを教科書として使っていいます。しかし、今回はどうやらそのレベルはクリアしている様子です。
あらかじめ何をしたいのか目的がはっきりしていたので、それならば知りたいことを先に伺って、そのことについて教えるというやり方にしました。
テキストは基本的に用意せず、サンプルコードを印刷するかして、そのプログラムコードがどういう意図をもって、そのようなコードになっているのか解説するというスタイルにしました。

組み込み系のプログラミング

Arduino は、大きな分類ではパソコンと同じコンピュータです。
しかし、人々が日常的に使用するスマートフォンやパソコンとは違って、電化製品や工場の機械といった製品の中に組み込まれて使われます。いわゆる”組み込み系”と呼ばれるコンピュータで、専門的には”マイクロコントローラー”、または略して”マイコン”と呼ばれています。

プログラミングを勉強するさいも、パソコン系と組み込み系では初めの一歩が違います。
パソコン系プログラミンは、ディスプレイに”Hello World”と文字を表示するところから始まります。プログラムの結果を最もよく利用する出力装置に表示します。
一方組み込み系のプログラミングでは、マイコンにLEDをつないでプログラムで点灯・消灯を制御すること(通称”Lチカ”)から始まります。マイコンボードに初期搭載されているLEDの点灯・消灯を行うか、LEDと抵抗器をブレッドボードに刺して、汎用I/Oピンとの間をジャンバーケーブルでそれぞれつないでLEDの点灯・消灯を行うか、だいたいどちらかの方法で最初の一歩を踏み出します。私が指導する場合は、制御する電子部品をつなぐ練習もかねた方がいいと考えているので、後者の方法をとります。

組み込み系のプログラミングでは、プログラミング言語の知識のほかに、オームの法則のような電気の基礎知識や、回路図の知識も必要になります。
マイコンの制御する電子部品にはロジックICと呼ばれるICチップが使われているます。そのため、いくつもある端子をマイコン側のどの端子と接続するかは回路図を見なければなりません。加えて、「どのような信号を送れば、どういうデータを返してくるか」、「期待する動作をさせるためにはどのようなデータを送信しなければならないか」ということもそれぞれの電子部品ごとに決まっているので、それらが記載された「データシート」も読めるようにならないといけません。
専門的な知識があるに越したことはありませんが、なくても十分楽しめます。オームの法則は中学校で習うレベルの知識ですし、回路図だって見方がちょっとわかれば、どことどこがつながっているかわかるようになります。
データシートだって、電圧や電流の許容値が分かれば、それ以上のことがわからなくても結構なんとかなります。

ところが準備に苦戦

最初にいただいたお題は「無線通信を使った制御」です。
お仕事に関係した部分が理解できるようになりたいということでして、具体的に通信モジュールの品名を教えていただき、メーカーサイトから取扱説明書をダウンロードして、どういうことを知りたいのか下調べしました。
お仕事に関係する話なので詳しくは書きませんが、どうやらRTS/CTSハードウェアフロー制御のシリアル通信の仕組みを理解したいようです。
お手元にお持ちのマイコンボードが「Arduino UNO」ということでしたので、私の所持しているArduino UNOを1年ぶりぐらいに引っ張り出して準備を始めます。通信の仕組みなので、Arduino NANO を通信相手して送受信の確認をします。

単純なデータの送り受けは簡単に確認できたのですが、意図しない情報を受信しています。
「なんだこりゃ?」

物理的なエラーは電気的な導通しか確認できません。オシロスコープが無いので、どんな信号を送受信しているのか見ることができません。
マルチタスクで処理すれば改善できるかと考え、RTOSでの制御を試みたのですが、ことを余計に複雑にする結果に。
初めてFreeRTOSを使ったということもありますが、シングルコアでも優先制御でうまくタスクを制御できるつもりが、期待通りの結果がなかなか得られません。シリアルモニタに情報を表示しても、どうにも動作に納得できず悩んだりと、時間を浪費するばかりでした。
結局、マルチタスクを採用せず、余計な信号を受信しても無視するようにプログラム側で対処することにしたのですが、そこにたどり着くまで試行錯誤の繰り返しです。

お題を変えて苦戦パート2

何をどう伝えようか悩んでいたところにご連絡をいただき、無線通信よりも「LEDディスプレイに日本語を表示したい」という新たなお題をいただきました。
授業は90分の一コマです。時間的にどちらかに絞ったほうが良さそうなので伺ったところ、「LEDディスプレイ」を選ばれたので、今度はLEDディスプレイをについて調べることになりました。
ご自身で色々調べられて作られたプログラムをいただき、それを添削するイメージで解説することにしました。ご本人曰く、よく理解しないまま作ったプログラムということだったので、「何をどのように処理しているのか」「どこをどう直すか」お話するために、制御の基となるLEDディスプレイパネルのデータシートをインターネット上で検索します。しかし、今度は対象のLEDディスプレイのデータシートがどこを探しても見つけられません。HUB75という規格らしいのですが、ピンの配置については情報が簡単に見つかりますが、そのピンにどのように信号を流しているのか、その時の周波数の範囲だとか、パルスのタイミングだとか見つけることができません。
お預かりしたプログラムのソースコードは、うまく表示できないものの、全く表示できなかったわけではなかったので、プログラムの解析をしてプログラムのソースコードから、どのように制御しようとしているか把握します。実際のLEDディスプレイパネルの現物をお借りして動作を確認し、文字を表示するための修正を加えて授業に備えました。

まとめ?

約1年ぶりに触れるArduino。
新しいことや久しぶりのことについては、もはやルーティーンと化しているジタバタ劇をこなしながらの準備作業。(とほほ...)
なんだかんだいって気が付けば1カ月の時間が過ぎました。
なぜこんなに時間がかかったのか自分でもよくわかってません。(超非効率、泣き)
かけた時間が無駄にならないよう、同じ轍を踏まないため備忘録の意味でも、後日整理してArduino入門的な記事にまとめたいと考えています。


この記事が気に入ったらサポートをしてみませんか?