ワークショップ「コンピュータの仕組みを学ぶ電子工作入門」を開催しました

こんにちは、サイボウズ・ラボの内田です。2024 年 7 月に 3 件の電子工作入門ワークショップの講師を務めました。本記事ではワークショップの内容や開催当日の様子などを紹介します。

電子工作入門ワークショップについて

正式名称は「コンピュータの仕組みを学ぶ電子工作入門」です。3 時間ほどの構成で、Raspberry Pi Pico を用いた電子工作入門から始まり、最終的にプログラミング言語インタプリタの作成を目指します。マイコンを用いた電子工作を通じて、コンピュータが動作する仕組みを学ぶことが目的です。

ワークショップの様子(at SAJセミナールーム)

U-22 プログラミング・コンテスト実行委員会が主催となり、2024 年 7 月に 3 件開催されました。私はワークショップの設計、テキストの作成、および当日の講師を担当しました。サイボウズ・ラボの川合にはワークショップに全面的に協力してもらい、大変助かりました。ちなみに、親会社であるサイボウズが U-22 プログラミング・コンテスト2024 をスポンサーしており、私は審査委員を拝命しています。

ワークショップの内容

ワークショップ参加者にはテキスト、Raspberry Pi Pico と USB ケーブル、各種電子部品が配られます。参加者は配られたテキストに沿って自分のペースで演習を進めます。演習が 100% で、座学はありません。講師(私と川合)が参加者の座席を巡り、問題なく進められているか・質問はないかを聞いて回ります。

参加者自らブレッドボードを使って実験回路を組む

ワークショップは前半と後半に分かれます。前半はコンピュータと現実世界との繋がりを、後半はコンピュータがソースコードを認識する過程を体験します。

前半:Raspberry Pi Picoというマイコンを用いて、LEDやスピーカーなどの出力機器、スイッチや測距センサーなどの入力機器の制御を学びます。身の回りで広く使われているコンピュータの一種であるマイコンの世界を体験できます。プログラミングと物理世界を結び付け、地に足の着いた知識を得られます。

後半:Raspberry Pi Pico上で動作するプログラミング言語処理系を作ります。プログラマにとって最も重要で身近なプログラミング言語は、実は自分でも作れるということを体験できます。自作したプログラミング言語を使って入出力機器を制御するプログラムを作るのは、めったにないわくわくする体験になることでしょう。

テキスト

このテキストは今回のワークショップのためだけに書いたものです。書いてみたら 60 ページの大作になりました。といっても、ワークショップを前提としていて、細かい部分の説明を省いているところが多く、60 ページ以上のカバー範囲になっていると思います。

目次

始めに目次を紹介し、次にいくつかピックアップして内容を紹介します。

  • 基本課題
    • Arduino IDEのセットアップ
    • Lチカ
    • プログラムを改造してみよう
    • PWMで明るさを変える(調光)
    • Arduinoライブラリを活用する
    • A/Dコンバータで電圧を読み取る
    • 可変抵抗器で点滅パターンを選ぶ
    • スピーカーを鳴らす
    • 音階を鳴らす
    • キャラクタ液晶ディスプレイ
    • その他の入出力
    • 部品リスト
    • パソコンだって作れちゃう!?
  • 発展課題
    • キーボード入力
    • キーパッドとLCDで電卓を作る
    • プログラミング言語を作る:準備編
    • プログラミング言語を作る:実装編
    • LEDの輝度とスピーカーの音階の指定に対応しよう
    • 音楽を演奏する

L チカ

L チカとは「LED チカチカ」の略で、LED を点滅させることです。LED の点滅は最も手軽に「目に見える動作」をさせられるプログラムの 1 つです。未経験のマイコンや基板を使うにあたり、とりあえず L チカをするのが典型的な「電子工作愛好家しぐさ」です。ということで、本書でもまず Raspberry Pi Pico で L チカをやります。

このワークショップは Arduino IDE を使って進めます。受講者の多くは電子工作未経験で、もちろん Arduino IDE を初めて使います。人生で初めて Arduino IDE に入力するプログラムはこんな感じです。

LチカのプログラムをArduino IDEに入力する

L チカのプログラム自体はとても単純ですが、しかし L チカが動くまでの難易度は高いです。人によってはワークショップの一番の難所かもしれません。なぜなら、L チカが動くまでには Arduino IDE を適切にセットアップしたり、Raspberry Pi Pico がきちんと認識されるようにしたりといった作業が必要だからです。使っている PC の環境により必要な作業が異なるため、ワークショップでは受講生それぞれの事情に合わせてサポートしました。

PWMで明るさを変える(調光)

PWM は Pulse Width Modulation(パルス幅変調)の略で、矩形波のパルス幅を変えて対象を制御する方式のことです。受講者の多くは PWM にあまりなじみがなく、詳しく説明したら興味深そうな様子でしたので、この記事でも説明してみます。

PWMでLEDの明るさを変化させる

直角に山と谷が繰り返される波形を「矩形波」と呼びます。1 つ 1 つの山を「パルス」と呼び、パルスの幅を変化させる制御方式を PWM(パルス幅変調)というわけです。普通、パルスの開始タイミングは常に一定で、パルス幅だけを変化させます。今回もパルス間隔は 20ms で固定し、パルス幅を 0~20ms の間で変化させました。(ちなみに ms は millisecond(ミリ秒)、つまり 1/1000 秒のことを意味します。)

PWM はいろいろな制御に応用できます。今回は LED の明るさを変えること(調光)に使いました。山の間は LED が光り、谷の間は消灯します。山の幅が広く、谷の幅が狭いほど明るくなります。PWM では「山の幅 / PWM 周期」を「デューティ比」と呼びます。今回の例では山の幅が 0ms でデューティ比 0%、山の幅が 20ms でデューティ比 100% となります。デューティ比がそのまま LED の明るさを表す尺度になっています。

テキストではデューティ比を時間変化させることでなめらかに点滅するプログラミングを紹介しています。徐々に点灯、徐々に消灯を繰り返すとホタルが光っているような印象になります。

A/D コンバータで電圧を読み取る

ここまでは LED への出力だけだったのですが、この節で入力が登場します。普通、一番最初に学ぶ「入力」はスイッチによる ON/OFF のデジタル入力かなと思いますが、このワークショップでは可変抵抗器のアナログ値を読みます。デジタル入力より楽しいかなと思って、アナログ入力を先に扱うことにしました。

受講者は次のような A/D(Analog to Digital)コンバータの出力を PC へ送信するプログラムを入力します。

void setup() {
  Serial.begin(9600);
}

void loop() {
  int val = analogRead(A0);
  Serial.println(val);
  delay(300);
}

非常に単純なプログラムです。これを Raspberry Pi Pico に書き込んだ状態で Arduino IDE のシリアルプロッタを開くことで、可変抵抗器のつまみの角度がグラフとなって描画されます。

シリアルプロッタで可変抵抗の電圧を読む

このプログラムも L チカ同様とても単純ですが、きちんと動かすのは意外と難しいようです。一番の難関は Raspberry Pi Pico と可変抵抗器の接続です。ブレッドボード上で配線するのですが、ブレッドボードの仕様に慣れていないと、なかなか正しい場所に配線するのに苦労します。一度、ジャンパワイヤが断線していたためうまく動かない(期待した値が取れない)ことがありました。その際はいくら配線やプログラムを確認しても間違いを見つけられず途方に暮れました。こちらから配布した部品の不具合だったので、申し訳ないことをしてしまいました。

スピーカーを鳴らす

圧電スピーカーを鳴らす課題です。圧電スピーカーは直流電圧を加えただけでは鳴らず、加える電圧を高速で変化させる必要があります。そのため、digitalWrite を高速で繰り返し、1 と 0 を交互に出すようなプログラムを作ります。電圧が変化することで圧電スピーカーの振動板が動き、空気の振動となって音が発生します。

この課題を作ったときは考えていなかったのですが、ワークショップの進行状況を確認するのに便利なことが分かりました。スピーカーの音が聞こえてくると、受講者がここまでたどり着いたことがすぐに分かるのです。

キーパッドとLCDで電卓を作る

0~9 とその他いくつかボタンが付いたキーパッドと、16 文字が 2 行表示できる LCD(液晶ディスプレイ)を使い、電卓を作ります。キーパッドで数式を入力し、最後に「#」キーを押すと計算して結果を表示します。ここまで来ると、かなり「コンピュータ」っぽくなります。

電卓で計算しているところ

数式は「再帰下降型構文解析」により解析し、計算しています。そのため、演算子の優先順位をきちんと処理できるようになっています。例えば「1+2×3」は 9 ではなく 7 と計算されます。一般的な電卓は「1+2」を入力した時点で「3」となってしまいますが、今回作った「電卓」は数式を全部入力してから計算する凄い電卓なのです。

ここで実装した電卓プログラムは、その後の「プログラミング言語を作る」課題で再利用されます。プログラミング言語の式の処理は数式の処理をベースにして作れるのです。

アンケート結果

ワークショップ開催後に取ったアンケートの結果を一部紹介します。まずは全体を通した満足度。5 段階評価で 3 以上の回答しかなく、かなり高い評価をいただけたと思います。準備を頑張って開催した甲斐がありました!

  • とてもよかった:63.2%
  • よかった:31.6%
  • 普通だった:5.3%

次に説明資料のわかりやすさについての結果を示します。こちらも良い評価をいただけた気がしますが、改善の余地はありそうな感じがします。

  • とてもわかりやすかった:47.4%
  • わかりやすかった:36.8%
  • 普通だった:15.8%

自由記述の感想では、実際の電子回路を触るのが楽しいという意見が多かったです。普段のプログラミングの授業ではパソコン画面しか見ないため、現実世界で光や音が出るのが新鮮な体験という方がたくさんいました。

テキストに載せたサンプルコードは、あえてコピペではなく手入力してもらいました。キーボード入力に慣れてもらおうという狙いです。多くの受講者は何らかの入力間違い(スペルミスや大文字小文字など)を経験していたように思います。テキスト中の 0(ゼロ)と O(オー)が区別しにくいのは改善したいなと思いました。(筆者の TeX 力の問題で、自分の好きなフォントにする方法がよく分かっていないのです…。)

受講者の多くは大学生(あるいは大学生相当の課程)で、高校生は 1/4 くらいかなと思います。いろいろなレベル感の方が参加していただきましたが、自分のペースで進める形を取ったため、みんなが満足できたと思います。

ハマりポイント

ワークショップを 3 回開催する中でいろいろハマったところがあります。いくつか紹介します。

  • Arduino IDE に Raspberry Pi Pico が認識されない
  • Arduino IDE のインストールに管理者権限が必要
  • 断線していたジャンパワイヤ
  • USB Type-A ポートがないパソコン

Arduino IDE に Raspberry Pi Pico が認識されない

Raspberry Pi Pico の初回接続時、多くの受講者がこの問題に遭遇しました。1 回目のワークショップ中にいろいろ探る中で、ある程度統一的な手順を見つけたので、2 回目以降では少しスムーズになったかなと思います。

ポイントは、初回は USB メモリモードで接続(BOOTSEL ボタンを押しながら USB ケーブルを挿す)し、エラーのないプログラムを書き込み、改めて Raspberry Pi Pico との接続を行うことです。一旦エラーのないプログラムを書けば、次から Arduino IDE ときちんと接続されるようです。

Arduino IDE のインストールに管理者権限が必要

1 回目と 2 回目のワークショップは学校で開催したため、一部の受講生は学校から貸与されたノートパソコンを持ってきました。そのような貸与パソコンは管理者ではなく通常ユーザーで使う設定になっていて、Arduino IDE のインストール過程で問題が生じました。

最新版の Arduino IDE が入った状態のパソコンもありましたが、入っていない場合はワークショップ中にインストールします。Arduino IDE は途中で仮想 COM ポートドライバなどがインストールされるため、管理者権限を要求されます。それらをすべて「いいえ」で飛ばした場合、Arduino IDE 自体は使えても、Raspberry Pi Pico と通信できず、とても困りました。

Arduino IDE の普通の使い方は、IDE の書き込みボタンを使って対象のマイコンにプログラムを書き込むというものです。しかし実は、書き込みを行わず、書き込むべきファイル(UF2 ファイル)を出力するだけのモードもあり、そのモードを使ってなんとかワークショップを進めることができました。Raspberry Pi Pico を USB メモリモードで接続し、そこに生成された UF2 ファイルをコピーします。

USB Type-A ポートがないパソコン

USB Type-C のポートしかないパソコン(Mac)をお持ちの受講者がいました。ワークショップでは USB A to Micro-B ケーブルを準備していたため、そのようなパソコンには Raspberry Pi Pico を接続できず、困りました。

結局、会場にたまたまあった C to A 変換アダプタや Type-A 端子が付いたパソコンを借りるなどして対処できました(貸していただきありがとうございます!)。ワークショップをまたやることがあれば、前提条件として Type-A ポートを用意するか、C to Micro-B ケーブルのようなものが必要だと明記しておこうと思いました。

作例の展示

一緒に講師をしてくれた川合には、毎回 Raspberry Pi Pico を使った作品を展示してもらいました。自分たちが学んだ知識を応用するとこんなこともできる、という一例になればと思っています。例えばこんな鉄道模型を展示しました。

Raspberry Pi Picoで鉄道模型の速度を制御する

Raspberry Pi Pico を使って鉄道模型を制御する作品です。Raspberry Pi Pico にモータードライバを接続し、線路に流れる電流を変化させ、ゆっくり発車・停車させます。

速度の指示はパソコンから逐一出しています。実は、パソコン側の制御ソフトは川合が自作したプログラミング言語でやっています。Raspberry Pi Pico はパソコンから受け取った速度指令に従ってモータードライバに信号を出す目的で使われています。

何人かの受講者が川合の周りに集まり、この作品の仕組みを興味深そうに聞いていたのが印象的です。

将来の展望

計画していた 3 回のワークショップは終わりましたが、ワークショップの準備(テキストの執筆とか)に結構なコストをかけたため、これだけだともったいないと思っています。機会があればまたどこかで開催したいと思います。オンライン開催も検討しているのですが、Raspberry Pi Pico の初期接続のサポートなどを考えると、今のところうまくできる自信がありませんので、とりあえずオンサイト開催で。東京(特に山手線沿線から近いところ)で開催して欲しいなという方がいましたら、内田までご連絡いただければ、開催を検討させていただきます。