プログラムはなぜ動く?LEDやモーターに届く仕組みを手を動かして学ぶ

0
20
プログラムはなぜ動く?LEDやモーターに届く仕組みを手を動かして学ぶ

画面に書いた数行のコードでLEDが光り、モーターが回り、3Dプリンタが形をつくる。最初は魔法のように見えるかもしれません。しかし、プログラムはなぜ動くのでしょうか。答えは、文字として書いた命令が、コンピュータの中で電気信号に置き換えられ、決められた順番で実行されるからです。

この仕組みを知ると、エラーが出たときに「何となく書き直す」のではなく、どこで命令が止まったのかを考えられるようになります。電子工作なら配線、コード、電源のどこを調べるべきかが見えます。ものづくりでは、思い通りに動かない経験も大切な材料です。

プログラムはなぜ動く? コンピュータは命令を実行している

プログラムは、人間が読める形で書いた「命令の並び」です。たとえばPythonなら `print(“こんにちは”)`、Arduinoなら `digitalWrite(13, HIGH)` のように記述します。ただし、CPUは英語や日本語、PythonやC++の文法をそのまま理解しているわけではありません。

CPUが直接扱えるのは、0と1の並びで表した非常に単純な命令です。「この値を足す」「この場所からデータを読む」「条件が合えば次の命令へ進む」といった処理を、驚くほど高速に繰り返しています。プログラムが動くとは、CPUがこの命令列を一つずつ取り出し、処理し、次の命令へ進むことです。

人間が書いたコードをCPU向けの命令へ変える方法は、言語によって異なります。Arduinoでよく使うC/C++系のコードは、一般にコンパイルによって機械語に近い形へ変換してからマイコンへ書き込みます。一方、Pythonではインタプリタがコードを読み取りながら実行する方法がよく使われます。

この違いは、優劣ではありません。Pythonは試しながら書きやすく、Raspberry Piでセンサーの値を確認する用途にも向いています。コンパイルしたプログラムは、限られた性能のマイコンでも軽快に動かしやすいという利点があります。使う機材とつくりたい作品に合わせて選びましょう。

命令を置いておくメモリと、計算するCPU

CPUを作業者だとすれば、メモリは作業台や引き出しのようなものです。プログラム本体、計算途中の数値、センサーから受け取った値などは、実行中にメモリへ置かれます。CPUはメモリから命令を読み、計算し、結果を再びメモリへ書き込みます。

たとえば温度が30度を超えたらファンを回すプログラムを考えてみましょう。温度センサーの値を読み取る、30と比べる、条件に合えばモーター制御の命令を出す、という順番です。人間には一つの判断に見えても、内部では小さな処理が連続しています。

変数は、この作業を整理するための名前です。`temperature` という変数に温度を入れておけば、どの数値が何を表すかを人間が追いやすくなります。コンピュータにとっては最終的にメモリ上の場所と値ですが、わかりやすい名前はバグを減らす実用的な道具になります。

条件分岐と繰り返しが「反応する作品」をつくる

センサーに反応する装置やロボットは、主に条件分岐と繰り返しで動いています。条件分岐は「もし暗ければLEDを点灯する」、繰り返しは「ずっと明るさを測る」という考え方です。

Arduinoでは、`setup()` が電源投入後に一度だけ実行され、`loop()` が何度も繰り返されます。この構造を意識すると、初期設定と継続的な動作を分けて考えられます。ピンの設定を `loop()` に何度も書くより、最初に一度だけ設定するほうが意図が明確です。

コードはどうやってLEDを光らせるのか

LEDを光らせる例では、プログラムは画面の中だけで完結しません。マイコンのピンへ「HIGH」または「LOW」という電気的な状態を出力し、その電圧差によって電流が流れます。適切な抵抗を通したLEDは、その電流によって発光します。

“`cpp const int ledPin = 13;

void setup() { pinMode(ledPin, OUTPUT); }

void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); } “`

このコードでは、まず13番ピンを出力用に設定します。その後、電圧を出す状態と出さない状態を1秒ごとに切り替えます。CPUが命令を実行し、マイコン内部の回路がピンの状態を変え、その結果として電流が流れる。コード、電子回路、光という三つがつながった瞬間です。

ただし、モーターはLEDより大きな電流を必要とすることがあります。マイコンのピンに直接つなぐと、動かないだけでなく故障につながる場合があります。トランジスタやモータードライバを使い、別電源を用意し、GNDを共通にするなど、回路側の設計も必要です。プログラムだけが正しくても、電気の条件が合わなければ作品は動きません。

動かないときは、命令の通り道を分けて確認する

電子工作でLEDが点かないとき、原因を一度に探そうとすると迷います。「プログラムから物理的な出力までの通り道」を区切って確認しましょう。確認する順番は、コードが書き込めているか、対象のピン番号が合っているか、配線と部品の向きが正しいか、電源とGNDがつながっているか、という流れが基本です。

シリアルモニタへセンサー値や処理の途中経過を表示するのも有効です。値が表示されなければ、問題は出力装置より前にある可能性が高くなります。反対に値が正しいなら、配線やドライバ回路を重点的に調べられます。見えないプログラムの動きを、文字や数値として見える形にするのがデバッグです。

また、エラーが出た直後に多くの場所を同時に変更しないことも大切です。一つだけ変更して試し、結果を記録します。これは遠回りに見えて、原因を確実に絞り込む近道です。3Dプリンタの造形不良をノズル温度、材料、データ、速度に分けて確認するのと同じ考え方です。

デジタルファブリケーションでも「命令」が形をつくる

プログラムは、マイコンを動かすためだけのものではありません。CADで設計したデータは、スライサーやCAMソフトによって、機械が理解できる加工手順へ変換されます。3Dプリンタならノズルをどこへ動かし、どれだけ材料を押し出すか。レーザー加工機ならどの線を、どの出力と速度で加工するか。その命令をファームウェアが実行します。

ここでは、設計データが正しくても加工条件が合わなければ失敗します。薄いアクリルと厚い合板では、必要なレーザー出力や速度が違います。モデルの壁を薄くしすぎれば、3Dプリントした部品は割れやすくなります。デジタルの命令を現実の形に変えるには、材料の性質を知り、テスト加工で確かめる工程が欠かせません。

最初の一歩には、LEDを点滅させる小さなプログラムがおすすめです。次はボタンで点灯を切り替え、明るさセンサーで反応させ、ケースを3Dプリンタやレーザー加工機でつくってみましょう。コードが電気を変え、部品を動かし、あなたの設計が手で触れられる作品になる。そのつながりを一つずつ確かめることが、つくる力を育てます。