基礎 · 読了まで11分

Arduinoのブロックプログラミング:LEDの点滅をブロックとC++で並べて学ぶ

初心者向けのArduinoブロックプログラミング。220 Ωの抵抗でLEDを配線し、各ブロックの裏にあるC++の行を確認し、100 msの待ち時間を変えてから信号機を作ります。

Arduinoのブロックプログラミングで最初に作るプログラムは、ほぼ決まってLEDの点滅です。この記事では、それを最初から最後まで通して行います。ピン9に220 Ωの抵抗を通してLEDをつなぎ、BlueGraysのLEDの点滅プロジェクトのブロックを1つずつ読みながら、各ブロックがボードに書き込まれるC++コードのどの行になるのかを並べて確認します。「100 ms待つ」ブロックの100という数字を1つ変えるだけで、LEDの点滅の速さがどう変わるかも試してみます。

この記事はブロックからコードへシリーズの第2回です。ブロックとは何か、ブロックがどのように本物のコードになるのかはブロックプログラミングとは?で説明しました。次回はボタンを加えて、「もし」ブロックとif/elseを取り上げます。

LED1つで終わりにはしません。同じ考え方を少しずつ広げて、2つのLEDを交互に点滅させるプログラム、信号機のように動くプログラム、パトランプのように光るプログラムへと進みます。そのあと、同じ考え方をESP32と、MicroPythonを使ったRaspberry Pi Picoでも見ていきます。最後には、初心者のほとんどが一度はやってしまうミスを表にまとめました。この記事のプロジェクトはすべて、ブロックとコードを含めてBlueGraysで無料です。ブロック付きのプロジェクトはブロックプログラミングのページでプラットフォーム別に一覧できます。

必要なもの

部品数量備考
Arduino Uno(またはNano)1USBケーブルでパソコンにつなぎます
5 mmのLED(赤がいちばん簡単)1長い足が+、短い足が-
220 Ωの抵抗1カラーコード:赤・赤・茶
ブレッドボード1はんだ付け不要
オス-オスのジャンパーワイヤー2D9とGND用
Arduino IDEを入れたパソコン1コードをボードに書き込むため

回路:LEDをピン9につなぐ

LEDには2本の足があり、向きが重要です。長い足がアノード(+)、短い足がカソード(-)で、カソード側はプラスチックの本体が平らになっています。電流はアノードからカソードへの一方向にしか流れないため、LEDを逆向きに挿すと何も起きません。Arduinoのピン9を220 Ωの抵抗の一端につなぎ、抵抗のもう一端をLEDの長い足につなぎます。次に、短い足をGNDにつなぎます。抵抗は電流を制限します。5 Vから赤色LEDに必要な約2 Vを引くと抵抗には3 Vが残り、3 V / 220 Ωで約14 mAになります。これはLEDにとって無理がなく、Arduinoのピンにとっても安全な電流です。手持ちのLEDの色に合った値はLED抵抗計算ツールで確認できます。LEDのしくみはLEDとは?で、ブレッドボードの列が内部でどうつながっているかはブレッドボードとは?で解説しています。

接続Arduino Uno(LEDの点滅)ESP32(ESP32でLEDを点滅)Raspberry Pi Pico(外付けLED)
LEDの長い足(アノード、+)220 Ωを通してD9220 Ωを通してGPIO 5220 Ωを通してGP14
LEDの短い足(カソード、-)GNDGNDGND
ブロックとコードでのピン95LED_PIN = 14
プロジェクトの待ち時間100 ms500 ms0.5秒
ピンの電圧5 V3.3 V3.3 V
LEDを抵抗なしで直接ピンにつないではいけません。抵抗がないと電流を制限するものが何もなくなり、LEDは明るくなりすぎて熱を持ち、すぐに壊れることがあります。Arduinoのピンが傷むおそれもあります。LEDを逆に挿してしまっても心配はいりません。光らないだけなので、向きを変えて挿し直せば大丈夫です。ボードのピンの位置はピン配置ツールで確認できます。

最初のプログラムをブロックで:LEDの点滅

回路ができたら、プログラムを見てみましょう。BlueGraysでLEDの点滅プロジェクトを開き、コードの欄でブロックで表示をオンにすると、下のブロックが表示されます。ブロックは全部で7つあり、大きく2つのグループに分かれています。上がセットアップ(1回だけ実行)、その下がずっと繰り返すです。ブロックはアプリの言語で表示されます。英語では「write HIGH to pin」、トルコ語では同じブロックが「numaralı pine YÜKSEK yaz」、日本語では「ピン 9 に HIGH を書き込む」と表示されます。

LEDの点滅プロジェクトのブロック:「セットアップ」でピン9を出力に設定し、「ずっと繰り返す」の中でHIGHを書き込む、100 ms待つ、LOWを書き込む、100 ms待つ
LEDの点滅(プロジェクト1)のブロック:「セットアップ」でピン9を一度だけ出力に設定し、「ずっと繰り返す」の中の4つのブロックが延々と繰り返されます。

セットアップ(1回だけ実行)の中のブロックは、ボードの電源が入ったときやリセットボタンを押したときに一度だけ実行されます。ここにあるブロックは「ピン 9 を 出力 に設定」の1つだけです。Arduinoのデジタルピンは、入力にも出力にもなります。LEDを駆動するので、ボードに「このピンから電気を出します」と伝えているわけです。ずっと繰り返すのグループはセットアップが終わってから始まり、ボードの電源が入っている間、上から下へと何度も繰り返し実行されます。中の4つのブロックは、LEDを点灯し、100ミリ秒待ち、LEDを消灯し、さらに100ミリ秒待ちます。最後のブロックのあと、プログラムは先頭に戻り、LEDがまた点灯します。点滅とは、この4つのステップが1秒間に5回繰り返されているだけのことです。

ブロック → C++の行:各ブロックは何になる?

ブロックC++の行動作
セットアップ(1回だけ実行)void setup() { ... }電源投入時に中身を一度だけ実行
ピン 9 を 出力 に設定pinMode(9,OUTPUT);ピン9を出力にする
ずっと繰り返すvoid loop() { ... }中身を永遠に繰り返す
ピン 9 に HIGH を書き込むdigitalWrite(9,HIGH);ピンに5 Vを出力し、LEDが点灯
100 ms待つdelay(100);プログラムを0.1秒止める
ピン 9 に LOW を書き込むdigitalWrite(9,LOW);ピンを0 Vにし、LEDが消灯
100 ms待つdelay(100);消灯したまま0.1秒待つ
C++ (Arduino IDE)
1// Led Yakma (proje 1): D9'daki LED 100 ms yanar, 100 ms söner
2// LED Blink (project 1): the LED on D9 is on for 100 ms, off for 100 ms
3void setup() {
4  pinMode(9,OUTPUT);     // LED pini çıkış / LED pin as output
5}
6
7void loop() {
8  digitalWrite(9,HIGH);  // LED'i yak / turn the LED on
9  delay(100);            // 100 ms bekle (1000 ms = 1 s) / wait 100 ms (1000 ms = 1 s)
10  digitalWrite(9,LOW);   // LED'i söndür / turn the LED off
11  delay(100);            // 100 ms bekle / wait 100 ms
12}
13

表とコードを並べると、ブロックが代わりに何を処理してくれているのかがわかります。「セットアップ」と「ずっと繰り返す」のグループの形は、void setup()とvoid loop()関数の波かっこに対応しています。ブロックがどのグループに入っているかで、その行がどの波かっこの中に書かれるかが決まります。ブロックなら、各命令の末尾のセミコロン、大文字と小文字の区別(pinMode、digitalWrite)、かっこのことを考える必要はありません。ただし、Arduino IDEで自分でコードを書き換えるようになると、これらが重要になります。セミコロンが1つ抜けただけでもコンパイルエラーになります。ここにブロックの本当の利点があります。まずプログラムのロジックをしっかり固め、それから同じロジックをコードでどう書くかを学べるのです。

「100 ms待つ」を変えるとどうなる?

待ち時間の単位はミリ秒(ms)で、1000 msが1秒です。プロジェクトでは2つの待ちブロックがどちらも100 msなので、LEDは0.1秒点灯し、0.1秒消灯します。1周期は200 msで、つまりLEDは1秒間に5回点滅します。両方のブロックの数字を大きくするとLEDの点滅は遅くなり、小さくすると速くなります。ある値より短くなると、目は点滅を見分けられなくなり、LEDはずっと点灯しているように見えます。2つの待ち時間を変えたときに見える様子を、次の表にまとめました。

待ちブロック1周期1秒あたりの点滅回数見え方
10 ms + 10 ms20 ms50ちらつかずに点灯しているように見え、少し暗い
100 ms + 100 ms(プロジェクトの値)200 ms5速く、はっきりした点滅
250 ms + 250 ms500 ms2目で追いやすい点滅
500 ms + 500 ms1秒11秒に1回の落ち着いたリズム
1000 ms + 1000 ms2秒0.51秒点灯、1秒消灯
100 ms + 900 ms1秒1短く光って、長く消える
2つの待ちブロックを同じ値にする必要はありません。1つ目を100、2つ目を900にすると、LEDは1秒ごとに短く1回光ります。多くの機器にある「動作中」ランプのような光り方です。コードではdelay(100);とdelay(900);になります。数字を1つ変えて書き込み直すのは、ブロックとコードのつながりを実感するいちばんの近道です。

プログラムを広げる:2つのLED、信号機、パトランプ

LEDを1つ点滅させられるようになれば、複数のLEDを制御するのに新しい知識は必要ありません。同じ3つのブロックを、ピンを変えて繰り返すだけです。2個のLEDを点灯プロジェクトでは、セットアップで2つのピン、8と9を出力にします。「ずっと繰り返す」の中では、まず「ピン 8 に HIGH を書き込む」と「ピン 9 に LOW を書き込む」が来て、そのあとに「200 ms待つ」が続きます。次に逆の状態を書き込み、もう一度200 ms待ちます。ポイントは、2つの書き込みブロックが間に待ちを挟まずに続けて実行されるため、2つのLEDが同じ瞬間に入れ替わるように見えることです。それぞれの状態がどれくらい続くかは、待ちブロックが決めます。

信号機プロジェクトは、同じ考え方を3つのLEDに広げたものです。赤をD2、黄をD3、緑をD4につなぎます。「ずっと繰り返す」のグループは4つのフェーズからなり、どのフェーズも同じパターンです。3つのLEDそれぞれに「HIGH を書き込む」か「LOW を書き込む」のブロックを1つずつ置き、そのあとに待ちブロックを1つ置きます。どのLEDを点灯させておくかは書き込みブロックが、どれくらいの時間点灯させるかは待ちブロックが決めます。ブロックが増えても難しくなるわけではなく、長くなるだけです。歩行者用ボタンを加えて実際の交差点に近づけたバージョンは、Arduinoで信号機の記事で紹介しています。

信号機プロジェクトのブロック:ピン2、3、4を出力に設定し、4つのフェーズでHIGHとLOWを書き込むブロック、2000 msと300 msの待ち
信号機(プロジェクト3)のブロック:どのフェーズにも書き込みブロックが3つと待ちブロックが1つあります。
フェーズ赤(D2)黄(D3)緑(D4)待ち
1HIGHLOWLOW2000 ms(2秒)
2LOWHIGHLOW300 ms
3LOWLOWHIGH2000 ms(2秒)
4LOWHIGHLOW300 ms
C++ (Arduino IDE)
1// Trafik Lambası (proje 3) / Traffic Light (project 3)
2void setup() {
3  pinMode(2,OUTPUT);    // Kırmızı / Red
4  pinMode(3,OUTPUT);    // Sarı / Yellow
5  pinMode(4,OUTPUT);    // Yeşil / Green
6}
7
8void loop() {
9  // Kırmızı yanar, 2 s bekle / Red on, wait 2 s
10  digitalWrite(2,HIGH);
11  digitalWrite(3,LOW);
12  digitalWrite(4,LOW);
13  delay(2000);
14  // Sarı yanar, 0,3 s bekle / Yellow on, wait 0.3 s
15  digitalWrite(2,LOW);
16  digitalWrite(3,HIGH);
17  digitalWrite(4,LOW);
18  delay(300);
19  // Yeşil yanar, 2 s bekle / Green on, wait 2 s
20  digitalWrite(2,LOW);
21  digitalWrite(3,LOW);
22  digitalWrite(4,HIGH);
23  delay(2000);
24  // Sarı yanar, sonra başa (kırmızıya) dön / Yellow on, then back to red
25  digitalWrite(2,LOW);
26  digitalWrite(3,HIGH);
27  digitalWrite(4,LOW);
28  delay(300);
29}
30

LEDの警察車両風点滅プロジェクトでは、新しい種類のブロックが2つ登場します。1つ目はいちばん上にあるグローバル変数(最初に宣言)のグループで、中には「宣言:整数(int) delayTime = 60」というブロックがあります。これはコードのint delayTime = 60;の行にあたり、点滅の時間に名前を付けています。待ちブロックには数字ではなくdelayTimeが入っているので、速さを変えたいときは4つのブロックを別々に直すのではなく、60だけを変えれば済みます。2つ目は緑色の「3 回繰り返す」ブロックです。中の4つのブロックを3回実行し、C++ではfor(int i=0;i<3;i++)のループになります。

LEDの警察車両風点滅プロジェクトのブロック:変数delayTime、ピン2と3を出力に設定、2つの「3 回繰り返す」ブロック
LEDの警察車両風点滅(プロジェクト4)のブロック:赤色LED(D2)が3回点滅し、続いて青色LED(D3)が3回点滅します。

計算してみましょう。赤色LEDは1回の点滅で60 ms点灯して60 ms消灯するので、1回の点滅は120 msです。3回で360 msになり、青色LEDも同じです。1周期は約0.7秒かかります。delayTimeを30にすると点滅は2倍の速さになり、120にすると遅くなります。変数とループはシリーズ第4回のテーマで、「ずっと繰り返す」・「数える」・配列ブロックの記事で詳しく解説します。LEDの列に沿って光を走らせる流れるLEDプロジェクトが、同じ道の次のステップです。

ESP32とRaspberry Pi Picoでも同じ考え方

ESP32もArduino IDEを使ってC++でプログラムするため、ESP32のブロックはArduinoのものとほぼ同じです。ESP32でLEDを点滅プロジェクトでは、LEDはGPIO 5につながっていて、待ちブロックは500 msです。コードの行も同じで、pinMode(5, OUTPUT); digitalWrite(5, HIGH); delay(500);となります。違いはピン番号と、ESP32のピンが3.3 Vを出力すること、そしてArduino IDEでボードとしてESP32を選ぶことだけです。Unoで学んだことは、そのままESP32に持ち込めます。

Raspberry Pi Picoのプロジェクトでは、ブロックはMicroPythonのコードになり、ブロック名も少し変わります。Picoの外付けLEDプロジェクトでは、LEDはGP14につながっています。「ピン led : GP LED_PIN , 出力」ブロックはled = Pin(LED_PIN, Pin.OUT)に、「ピン led を オンにする(on)」はled.on()に、「0.5 秒待つ」はtime.sleep(0.5)に、「ずっと繰り返す」はwhile True:のループに対応します。MicroPythonでは待ち時間の単位がミリ秒ではなく秒である点に注意してください。Arduinoのdelay(500)は、ここではtime.sleep(0.5)になります。配線なしで試したいなら、Picoの内蔵LEDプロジェクトでボード上のGP25のLEDを点灯できます。Pico Wでは、内蔵LEDにGP25ではなく「LED」という名前でアクセスします。

MicroPython
1# Pico harici LED (proje 8163), seri port satırları çıkarıldı
2# Pico external LED (project 8163), serial print lines removed
3from machine import Pin
4import time
5
6LED_PIN = 14                    # GP14, herhangi bir boş GPIO / any free GPIO
7led = Pin(LED_PIN, Pin.OUT)     # pini çıkış yap / set the pin as output
8
9while True:                     # sürekli tekrarla / loop forever
10    led.on()                    # LED'i yak / turn the LED on
11    time.sleep(0.5)             # 0,5 saniye bekle / wait 0.5 s
12    led.off()                   # LED'i söndür / turn the LED off
13    time.sleep(0.5)
14

よくあるミスと直し方

ミス症状対処
LEDを逆向きに挿したLEDがまったく光らない長い足を抵抗経由でピンに、短い足をGNDに。LEDの向きを変えて挿し直す
抵抗がないLEDが明るすぎて熱くなり、すぐに壊れることがあるLEDと直列に220 Ωの抵抗を入れる
ブロックのピンと回路のピンが違う書き込みは成功するが、LEDが光らないブロックの9と配線したD9を一致させる。配線か数字のどちらかを直す
2つ目の待ちブロックを忘れたLEDがずっと点灯して見える「LOW を書き込む」ブロックのあとにも待ちブロック(delay)が必要
待ち時間が短すぎる(例:5 ms)LEDがちらつかず、少し暗く点灯して見える少なくとも50〜100 msを試す
LEDの2本の足がブレッドボードの同じ列にあるLEDがまったく光らない足を別々の列に挿す。同じ列の穴は内部でつながっている
ボードまたはポートの選択が違うArduino IDEで書き込みエラーが出る「ツール」メニューで正しいボードとポートを選ぶ

アプリでステップごとに:ブロックからボードへ

  1. BlueGraysで、プロジェクト一覧でブロックのバッジが付いているLEDの点滅プロジェクトを開きます。絞り込みで、ブロック付きのプロジェクトだけを表示することもできます。
  2. 回路図を見ながら、LED、220 Ωの抵抗、2本のワイヤーをブレッドボードに配置します。
  3. コードの欄でブロックで表示をオンにします。コードの代わりにブロックが表示されます。画像をタップすると全画面で開きます。
  4. ブロック解説タブに移ります。プログラムがステップごとに説明され、各ステップではそのステップのブロックと、その働きだけが表示されます。
  5. スイッチをオフにして実際のコードに戻り、コードをコピーしてArduino IDEに貼り付けます。ブロックがボードに直接書き込まれることはなく、ボードに入るのはいつもこのコードです。
  6. Arduino IDEでボードとしてArduino Unoを選び、正しいポートを選んで「書き込み」を押します。まだIDEをインストールしていない場合は、Arduino IDEのインストール方法の記事で手順を説明しています。
  7. LEDが点滅し始めたら、2つのdelay(100)の行をdelay(1000)に変えてもう一度書き込み、違いを自分の目で確かめてください。

この記事では、LEDはいつも同じリズムで点滅していました。プログラムが外の世界の様子をうかがうことは一度もありませんでした。次のステップは、ボードに判断をさせることです。シリーズ第3回のボタンと「もし」ブロックでは、ボタンを押すとLEDが点灯するプログラムと、「もし … 実行 … そうでなければ」ブロックがC++のif/elseにどう変わるかを解説します。

BlueGraysアプリでは、LEDの点滅、2個のLEDを点灯、信号機、LEDの警察車両風点滅、そしてESP32とPicoのLEDプロジェクトを、回路図とコード付きで見られます。ブロックで表示で同じプログラムのブロック版に切り替え、ブロック解説で各ステップの働きを1つずつ読むことができます。

よくある質問

Arduinoのブロックプログラミングとは何ですか?

Arduinoのプログラムを、文字で書く代わりに、パズルのピースのように組み合わせるブロックで表す方法です。「ピン 9 に HIGH を書き込む」や「100 ms待つ」のような各ブロックは、ボードに書き込まれるC++コードの1行に対応します。セミコロンやかっこを気にする必要がないので、初心者はまずプログラムのロジックに集中できます。

ブロックプログラミングでLEDを点滅させるには?

「セットアップ」のグループに「ピン 9 を 出力 に設定」を置き、「ずっと繰り返す」のグループに「ピン 9 に HIGH を書き込む」「100 ms待つ」「ピン 9 に LOW を書き込む」「100 ms待つ」を順に置きます。回路では、LEDを220 Ωの抵抗を通してD9につなぎます。これらのブロックは、pinMode、digitalWrite、delayの行になります。

LEDが点滅せずにずっと点灯しているのはなぜですか?

いちばん多い原因は、「LOW を書き込む」ブロックのあとの待ちブロックを忘れていることです。その場合、LEDが消えているのはほんの数マイクロ秒だけなので、目では気づけません。待ち時間がとても短い場合(例えば5 ms)も、LEDはずっと点灯しているように見えます。100 ms以上を試してください。

ArduinoでLEDに使う抵抗はどれですか?

Arduino Unoの5 Vのピンでは220 Ωがいちばん一般的で、赤色LEDに約14 mAの電流が流れます。330 Ωでも使えますが、LEDは少し暗くなります。抵抗はLEDのどちらの足の側につないでも電流を制限します。大事なのは直列につながっていることです。

ブロックをArduinoに直接書き込めますか?

いいえ。BlueGraysのブロックはプログラムを読みやすく、理解しやすくするためのもので、ボードにはいつもプロジェクトの実際のコードが書き込まれます。そのコードをArduino IDE(Picoの場合はThonny)にコピーし、そこから書き込みます。

1000 msは何秒ですか?点滅の速さはどう変えますか?

1000ミリ秒は1秒です。待ちブロックの数字を大きくするとLEDの点滅は遅くなり、小さくすると速くなります。両方のブロックが100 msならLEDは1秒間に5回、500 msなら1秒に1回点滅します。PicoのMicroPythonのブロックでは時間を秒で書くので、0.5と書けば0.5秒(半秒)です。

全プロジェクトを見る
LEDの点滅
#1初級

LEDの点滅

電子工作の第一歩は、1個のLEDを点けたり消したりすることです。Arduinoで短い間隔で点灯と消灯を繰り返すと、LEDが素早く点滅します。ボードが光を制御する仕組みを最もシンプルな形で確かめ、これから取り組むプロジェクトの基礎を身につけます。

4.6(188)
1127
2個のLEDを点灯
#2初級

2個のLEDを点灯

2個のLEDが素早く交互に点滅します。一方が点くともう一方が消え、まるでボールを投げ合っているようです。ArduinoがそれぞれのLEDを5分の1秒ずつ点灯させ、次のLEDに切り替えます。1個のLEDの次に、複数の光をまとめて制御する方法を学ぶのに最適なステップです。

4.6(105)
343
信号機
#3初級

信号機

毎日道路で見かける信号機の小さな模型です。赤が2秒点灯し、黄が一瞬点灯した後、緑が2秒点灯します。その後、再び黄を経て赤に戻り、この動作を繰り返します。3個のLEDを順番に点けたり消したりしながら、タイミングの組み立て方を学びます。

4.8(131)
397
LEDの警察車両風点滅
#4初級

LEDの警察車両風点滅

警察車両の警光灯のように、赤いLEDが素早く3回点滅し、続いて青いLEDが3回点滅します。このパターンを途切れることなく繰り返します。Arduinoに2個のLEDと2個の抵抗をつなぐだけで、数分で組み立てられる、目を引く入門プロジェクトです。

4.7(103)
258
流れるLED
#5中級

流れるLED

LEDが次々に点灯し、光が走るように進みます。Arduinoが6個のLEDを1個ずつ短く点灯して消灯させることで、光が端から端へと移動し、また最初に戻ります。この簡単なプロジェクトで、1つのパターンで複数の光を制御する方法を学びます。

4.6(85)
207
ESP32でLEDを点滅
#103初級

ESP32でLEDを点滅

ESP32のGPIO出力の基本を学びます。デジタルピンからLEDを点灯・消灯させて、点滅させます。Arduino UNOの定番のLED点滅プロジェクトのESP32版です。Arduino環境で使う基本的な点滅コマンドは同じですが、ESP32のピン配置と3.3 VのGPIO電圧レベルはArduino UNOとは異なります。

4.7(37)
99
ESP32の信号機
#107初級

ESP32の信号機

赤・黄・緑の3個のLEDで、実際の信号機を再現します。赤は長く、黄は短く、緑は長く点灯させ、実際の信号機に近いタイミングで動かします。GPIOを順番に制御する基本例です。

4.4(21)
44
Raspberry Pi Picoで外付けLEDを点灯(ブレッドボード)
#148初級

Raspberry Pi Picoで外付けLEDを点灯(ブレッドボード)

Picoの内蔵LEDの次は、ブレッドボードに外付けLEDを接続し、GP14ピンで制御します。このプロジェクトでは、Picoの汎用GPIOピンを出力として使う方法、LEDの極性(長い足=アノード/+、短い足=カソード/−)、電流制限抵抗(220Ω)が必要な理由を学びます。抵抗を入れないと、LEDに過大な電流が流れて壊れることがあります。回路はとても簡単です。Pico GP14 → 220Ω抵抗 → LED(+)→ LED(−)→ Pico GND。Wokwiでシミュレーションできます。

4.5(2)
7