mBlockでArduinoを使う:セットアップ、ライブモードとアップロードモード、ブロック
mBlockでArduinoを使う方法を解説します。mBlock 5のインストール、Arduino Unoとファームウェアの追加、ライブモードとアップロードモード、LED・ボタン・センサーのブロック、Arduino Cのコード、9つの活動を紹介します。
mBlockでArduinoをプログラムするのは、コードを1行も書かずにArduino UnoでLEDを点滅させたり、ボタンやセンサーを読み取ったりできる、いちばん簡単な方法のひとつです。Makeblock社が無料で開発しているmBlock 5は、Scratch 3.0をもとにしたブロック型のプログラミング環境です。カラフルなブロックをパズルのように組み合わせると、mBlockが裏でそれをArduino Cのコードに変換し、コンパイルしてボードに書き込みます。ブロックをボード上ですぐに実行して、ステージ上のキャラクターと連動させることもできます。そのため、学校のロボットプログラミングの授業や科学コンテスト向けのプロジェクト、Arduinoへの最初の一歩として、最も人気のあるツールのひとつになっています。
このガイドでは、mBlockをパソコンにインストールする方法やブラウザで使う方法、Arduino Unoをデバイスとして追加して接続する方法、ライブモード用のファームウェアの書き込み、ライブモードとアップロードモードの違い、LED・ボタン・センサーのブロック、ブロックがどのArduino Cの行に変わるのか、授業で使える9つの活動、Arduino IDEへの移行の仕方、そしてよくある接続トラブルの直し方をステップごとに学びます。

mBlockとは?Arduinoとの連携の仕組み
mBlockは、MITで開発されたScratch 3.0をもとに作られたプログラミング環境です。Scratchとのいちばん大きな違いは、画面上のキャラクター(スプライト)だけでなく、実際のハードウェアもプログラムできることです。画面には2つのタブがあり、Sprites(スプライト)タブではステージ上のキャラクターを、Devices(デバイス)タブではArduino、micro:bit、Makeblockのロボットなどのボードをプログラムします。デバイスを選ぶと、そのボード専用のカテゴリーがブロックパレットに追加されます。Arduino Unoの場合はピンとシリアルポートのブロックです。アップロードモードでは、ブロックのスクリプトがArduino Cに変換され、機械語にコンパイルされて、USB経由でボードのフラッシュメモリに書き込まれます。つまり、mBlockはArduino IDEと同じ仕事をブロックの画面で行っていて、生成したコードを見せてくれるので、テキストのコードへの移行も楽になります。
| 項目 | mBlock 5 |
|---|---|
| 開発元 | Makeblock |
| ベース | Scratch 3.0(ScratchとmBlock 3のプロジェクトも開ける) |
| 価格 | 無料 |
| バージョン | WindowsとmacOSのデスクトップ版、ブラウザ版(ChromeかEdge)、AndroidとiOSのアプリ |
| Arduinoボード | Uno、Nano、Nano(old)、Mega 2560。Leonardo、Micro、Yunはデスクトップ版かmLink経由 |
| テキスト言語 | ArduinoボードではArduino C、MakeblockのボードとステージではPython |
| プロジェクトファイル | .mblock |
| 表示言語 | 英語を含む数十の言語 |
mBlockのインストール:デスクトップ版とWeb版
- ブラウザでmblock.ccを開き、Downloadページから自分のOS用のmBlock 5デスクトップ版をダウンロードします。執筆時点の最新版はV5.6で、64ビット版のWindows 7以降とmacOS 10.12以降に対応し、AppleのMシリーズ搭載Mac用には別のインストーラーがあります。
- Windowsではインストーラーを実行し、ウィザードに従います。セットアップ中にCH340ドライバのインストールをすすめられたら、同意してください。互換品のArduinoボードの多くはこのUSBシリアル変換チップを使っていて、ドライバがないとポートが表示されません。
- macOSでインストーラーが開かない場合は、ファイルを右クリックして開くを選ぶか、「システム設定」の「プライバシーとセキュリティ」にあるこのまま開くボタンを使います。
- mBlockを開き、上部メニューの地球のアイコンから言語を選びます。それ以降、メニューとブロックの名前はその言語で表示されます。
- ソフトウェアをインストールできない学校のパソコンでは、ブラウザでide.mblock.ccを開きます。Arduinoと接続するには、最新版のChromeかEdgeを使ってください。
Web版は長い間、mLinkという小さな補助プログラムを通じてボードに接続していました。新しいバージョンでは、ブラウザのシリアルポート機能を使う直接接続が標準の方法です。接続をクリックするとブラウザがウィンドウを開くので、Arduinoのポートを選べば、何も追加でインストールせずに接続できます。この方法はUno、Nano、Nano(old)、Mega 2560で使えます。Leonardo、Micro、YunのようにUSBの使い方が異なるボードには、今でもmLinkが必要です。mLinkの実行中は、タスクバーに小さなパンダのアイコンが表示されます。デスクトップ版とWeb版、あるいはmBlockのタブ2つを同時に開いたままにしないでください。どちらも同じポートを使おうとして、接続に失敗します。
| 項目 | デスクトップ版 | Web版 |
|---|---|---|
| インストール | 必要(Windows、macOS) | 不要、ブラウザで開く |
| ブラウザの条件 | なし | ChromeかEdge(シリアルポートに対応するため) |
| Arduinoとの接続 | USBケーブルとドライバだけでよい | 直接接続かmLink |
| Leonardo、Micro、Yun | 対応 | mLinkの場合のみ |
| ChromebookとLinux | デスクトップ版はない | Chromeで動く |
| プロジェクトの保存 | パソコンに.mblockファイルとして保存 | アカウントに保存、またはパソコンにダウンロード |
| 学校での使いやすさ | 遅いネットワークや制限のあるネットワークでも安定して動く | インストール権限のないパソコンで便利 |
デバイスの追加:Arduino UnoをmBlockにつなぐ
- ArduinoをUSBケーブルでパソコンにつなぎます。ボードのON(電源)LEDが点灯するはずです。
- mBlockで、ステージの下にあるDevices(デバイス)タブに切り替えます。最初から入っているMakeblockのデバイス(バージョンによってCodey RockyかCyberPi)は、隅の×印で削除します。
- + Add(追加)をクリックし、開いたデバイスライブラリの検索欄に「Arduino」と入力してArduino Unoを選び、OKをクリックします。ボードの左上にある星をクリックしておくと、次にmBlockを開いたときに最初から用意されます。
- Connect(接続)をクリックします。開いたウィンドウのUSBタブで、mBlockが見つけたポートを選びます。WindowsではCOM3やCOM4のような名前、macOSでは/dev/cu.usbmodem…、CH340搭載のボードでは/dev/cu.wchusbserial…のような名前が表示されます。ポートが一覧にない場合は、Show all connectable devices(接続可能なすべてのデバイスを表示)にチェックを入れます。
- もう一度Connect(接続)をクリックします。「Device connected」(デバイスが接続されました)というメッセージが出れば準備完了です。ブロックパレットにArduino専用のピンとシリアルポートのブロックが表示されます。
正しいデバイスを選べば、半分は成功したようなものです。純正品でも互換品でも、UnoならArduino Unoを、MegaならArduino Mega2560を選びます。安いArduino Nanoの互換品の多くは古いブートローダーを搭載していて、こうしたボードではArduino Nanoでは書き込みに失敗し、Arduino Nano (old)の選択肢なら成功します。Arduino Uno R4のようにプロセッサが異なる新しいボードは、mBlockのUnoデバイスではプログラムできません。その場合は直接Arduino IDEを使ってください。どのボードを買うかまだ決めていない場合はどのArduinoを買えばいい?を、Nanoのピン配置についてはArduino Nanoのピン配置のガイドを読んでください。

ライブモードとアップロードモードの違いは?
mBlockにはデバイスをプログラムするモードが2つあり、Devices(デバイス)タブの切り替えスイッチで切り替えます。ライブモードでは、プログラムは実際にはパソコンで動いています。mBlockがブロックを順番に読み、「13番ピンをオンにする」や「A0を読んで結果を返す」といった命令をUSB経由でArduinoに送ります。そのため、Arduinoにはこれらの命令を理解する専用のファームウェアが必要です。結果がすぐにわかり、センサーの値をステージで見たり、Arduinoとスプライトを連動させたりできますが、USBケーブルを抜いたりmBlockを閉じたりした瞬間にプログラムは止まります。アップロードモードでは、ブロックがArduino Cに変換され、コンパイルされてボードに恒久的に書き込まれます。ケーブルを抜いても、電池やACアダプターでプログラムが動き続けます。このモードでは、プログラムをwhen Arduino Uno starts up(Arduino Unoが起動したとき)のハットブロックの下に置く必要があります。緑の旗のようなステージのイベントはボードには転送されません。
| 項目 | ライブモード | アップロードモード |
|---|---|---|
| プログラムはどこで動く? | パソコンで動き、命令がUSB経由で届く | Arduino自身のプロセッサ上 |
| 開始ブロック | 「緑の旗が押されたとき」や「キーが押されたとき」などのイベント | when Arduino Uno starts up(Arduino Unoが起動したとき) |
| USBケーブル | つないだままにする必要がある | 書き込みのときだけ必要 |
| Arduino上のソフトウェア | mBlockのファームウェア | コンパイルした自分のプログラム |
| タイミング | 命令が毎回USBを行き来するので、遅くて不規則 | ミリ秒単位、さらにはマイクロ秒単位で正確 |
| スプライトとの連動 | 変数とメッセージのブロックで直接 | 対応しているデバイスでUpload Mode Broadcast拡張機能を使う場合のみ |
| 向いている用途 | テスト、デバッグ、ステージのゲーム | ロボット、アラーム、電池で動く完成品のプロジェクト |
ファームウェアの書き込み:Arduinoをライブモードに対応させる
- Arduinoを接続(Connect)し、モードの切り替えスイッチをLive(ライブ)にします。
- ボードにmBlockのファームウェアがない場合、たいていはmBlockが更新をすすめてきます。すすめてこない場合は、接続ボタンの隣にあるSetting(設定)メニューからUpdate Firmware(ファームウェアを更新)を選び、開いたウィンドウで更新を始めます。
- 書き込み中はボードのTXとRXのLEDがすばやく点滅します。進行状況バーが終わるまで、ケーブルを抜いたりmBlockを閉じたりしないでください。
- テストとして、ピンのブロックからset digital pin (13) output as (high)(デジタルピン13の出力をHIGHにする)ブロックをスクリプトエリアにドラッグし、1回クリックします。ボードの「L」LEDがすぐに点灯すれば、ライブモードは動いています。同じブロックを(low)にしてクリックすると、LEDが消えます。
Arduinoの基本ブロック:LED、ボタン、センサー
Arduino Unoを追加すると、ブロックパレットには、Scratchでおなじみのイベント、制御、演算、変数、ブロック定義のカテゴリーの隣に、ボード専用のピンとシリアルポートのカテゴリーが加わります。下の表では、ブロックを英語名で示し、その働きを説明しています。ブロックの名前はバージョンによって少し違うことがあります。どのブロックでも右クリックしてHelp(ヘルプ)を選ぶと、mBlockがそのブロックの説明を表示します。UnoでPWMが使えるのは3、5、6、9、10、11番ピンだけです。ピンの全体図はピン配置ツールで確認できます。
| ブロック(英語名) | 働き | 使用例 |
|---|---|---|
| when Arduino Uno starts up(Arduino Unoが起動したとき) | アップロードモードでプログラムが始まるハットブロック | ボードに書き込むすべてのプログラム |
| set digital pin (13) output as (high)(デジタルピンの出力を設定) | ピンをHIGH(5 V)かLOW(0 V)にする | LED、アクティブブザー、リレー |
| read digital pin (2)(デジタルピンを読み取る) | ピンのレベルを真か偽として読み取る | ボタン、PIR、赤外線障害物センサー |
| read analog pin (A) (0)(アナログピンを読み取る) | A0〜A5ピンの電圧を0〜1023の数値に変換する | LDR、ポテンショメーター、土壌水分センサー |
| set pwm pin (5) output as (128)(PWMピンの出力を設定) | 0〜255のPWM信号を出す | LEDの明るさ、DCモーターの速度 |
| set servo pin (9) angle as (90)(サーボの角度を設定) | サーボを0〜180度の角度に動かす | SG90の遮断機、ロボットアーム |
| play pin (8) with note (C4) for (0.25) beat(音符を鳴らす) | パッシブブザーで音符を鳴らす | メロディー、玄関チャイム |
| forever / repeat (10) / if … then … else(ずっと / 10回繰り返す / もし〜なら〜でなければ) | ループと条件のブロック | 常時チェック、数を数える、判断する |
| wait (1) seconds(1秒待つ) | 指定した時間だけプログラムを止める | 点滅、信号機 |







配線表:すべての活動に使える1つの授業用キット
毎週回路を組み直すと、授業の時間がむだになります。下の配線をブレッドボードに一度組んでおけば、ケーブルに触れずに9つの活動すべてを行えます。LEDの抵抗はLED抵抗計算ツールで、LDRの分圧回路が出す電圧は分圧計算ツールで確かめられます。これらの部品を初めて使う場合は、LED、ボタン、LDR、サーボモーターの記事でそれぞれの接続を詳しく説明しています。
| 部品 | Arduino Uno | ESP32 | Raspberry Pi Pico | 備考 |
|---|---|---|---|---|
| LED + 220 Ωの抵抗 | D5 | GPIO 18 | GP14 | 長い足(アノード)をピンに、短い足をGNDに |
| ボタン + 10 kΩのプルダウン抵抗 | D2 | GPIO 4 | GP2 | ボタンのもう一方はUnoでは5Vに、ESP32とPicoでは3V3に |
| LDR + 10 kΩの抵抗 | A0 | GPIO 34 | GP26(ADC0) | LDRを電源とピンの間に、抵抗をピンとGNDの間に |
| ポテンショメーター(中央のピン) | A1 | GPIO 35 | GP27(ADC1) | 両端のピンを電源とGNDに |
| SG90サーボ(信号) | D9 | GPIO 13 | GP16 | 赤い線を5 Vに(ESP32ではVIN、PicoではVBUS)、茶色の線をGNDに |
| パッシブブザー | D8 | GPIO 25 | GP15 | もう一方のピンをGNDに |
| HC-SR04のTrig / Echo | D11 / D12 | GPIO 26 / 27 | GP17 / GP18 | ESP32とPicoでは、Echoの線を分圧回路で3.3 Vまで下げる |
最初のプログラム:アップロードモードでLEDを点滅させる
- モードの切り替えスイッチをUpload(アップロード)にします。
- イベントのカテゴリーからwhen Arduino Uno starts up(Arduino Unoが起動したとき)ブロックをスクリプトエリアにドラッグします。
- その下に、制御のカテゴリーからforever(ずっと)ブロックをつなげます。
- foreverブロックの中に、set digital pin (13) output as (high)、wait (1) seconds、set digital pin (13) output as (low)、もう1つのwait (1) secondsの順に置きます(HIGHにする、1秒待つ、LOWにする、1秒待つ)。
- Upload(アップロード)をクリックします。mBlockがコードをコンパイルしてボードに送り、数秒後に書き込みが終わったことを知らせるメッセージが出ます。
- ボードの「L」LEDが1秒ごとに点滅し始めます。USBケーブルを抜いて、モバイルバッテリーや7〜12 VのACアダプターからボードに給電しても、プログラムは動き続けます。電源の選択肢はArduinoを電池で動かす方法で説明しています。
ブロックはどうやってArduino Cのコードになる?
アップロードモードで、右端にあるArduino Cのコードボタン(山かっこのアイコン)をクリックすると、mBlockがブロックに対応するコードをパネルに表示します。ブロックを変更するたびにコードもすぐに更新されるので、どのブロックがどの行を作るのかを学ぶいちばん簡単な方法です。上のBlinkプログラムにsayac(トルコ語で「カウンター」)という変数を追加し、1周ごとに1ずつ増やすと、生成されるコードはおおよそ次のようになります。コメント行は私たちが追加したものです。空白や、pinModeなど一部の行の位置は、バージョンによって少し違うことがあります。
1// generated by mBlock5 for <your product>
2// codes make you happy
3// mBlock'un ürettiği kodun yapısı: Blink + sayaç / Structure of mBlock-generated code: Blink + counter
4
5#include <Arduino.h>
6#include <Wire.h>
7#include <SoftwareSerial.h>
8
9float sayac = 0; // mBlock değişkenleri float olur / mBlock variables become float
10
11void _loop(); // ön bildirim, Arduino IDE de ekler / forward declaration, the Arduino IDE adds it too
12
13void _delay(float seconds) { // "wait (1) seconds" bloğu / the "wait (1) seconds" block
14 long endTime = millis() + seconds * 1000;
15 while (millis() < endTime) _loop();
16}
17
18void setup() { // "when Arduino Uno starts up" altındaki bloklar / blocks under "when Arduino Uno starts up"
19 pinMode(13, OUTPUT);
20 while (1) { // "forever" bloğu / the "forever" block
21 digitalWrite(13, 1); // pin 13 HIGH: dahili L LED'i yanar / pin 13 HIGH: the built-in L LED turns on
22 _delay(1);
23 digitalWrite(13, 0); // pin 13 LOW: LED söner / pin 13 LOW: the LED turns off
24 _delay(1);
25 sayac += 1; // "change sayac by 1" bloğu / the "change sayac by 1" block
26 _loop();
27 }
28}
29
30void _loop() { // uzantıların sürekli çalışan kodu buraya eklenir / extensions add their recurring code here
31}
32
33void loop() {
34 _loop();
35}このコードには注目すべき点が4つあります。1つ目に、forever(ずっと)ブロックはArduinoのloop()関数にはならず、setup()の中の無限ループwhile(1)になります。loop()は_loop()関数を呼び出すだけです。2つ目に、wait(待つ)ブロックはdelay()の代わりに_delay()関数を使います。この関数は待っている間も_loop()を呼び続けるので、一部の拡張機能がバックグラウンドで行う必要のある処理が止まりません。3つ目に、mBlockで作る変数はすべてfloat(小数)として宣言されます。Unoでは1つあたり4バイトのRAMを使い、等しいかどうかの比較で小さな丸め誤差を生むことがあります。たとえば、0.1ずつ増やした変数は10回後にぴったり1にならないことがあるので、「等しい」より「より大きい」や「より小さい」の比較のほうが安全です。4つ目に、先頭にあるWireとSoftwareSerialのライブラリは、使わなくてもたいてい読み込まれます。プログラムはそれでも動きますが、手で書いた場合より少し多くの容量を使うことがあります。
| ブロック | Arduino Cでの書き方 |
|---|---|
| when Arduino Uno starts up(Arduino Unoが起動したとき) | void setup() { … }の中のコード |
| forever(ずっと) | while(1) { … _loop(); } |
| repeat (10)(10回繰り返す) | for (int count = 0; count < 10; count++) { … }(10回の繰り返し) |
| wait (1) seconds(1秒待つ) | _delay(1); |
| wait until (condition)(〜まで待つ) | while (!(条件)) { _loop(); } |
| if (condition) then … else …(もし〜なら〜でなければ) | if (条件) { … } else { … } |
| set digital pin (13) output as (high)(デジタルピンの出力を設定) | pinMode(13, OUTPUT); digitalWrite(13, 1); |
| read digital pin (2)(デジタルピンを読み取る) | digitalRead(2) |
| read analog pin (A) (0)(アナログピンを読み取る) | analogRead(A0) |
| set pwm pin (5) output as (128)(PWMピンの出力を設定) | analogWrite(5, 128); |
| set servo pin (9) angle as (90)(サーボの角度を設定) | Servoライブラリ:attach(9)とwrite(90) |
| set [sayac] to (0) / change [sayac] by (1)(変数を0にする / 1ずつ変える) | sayac = 0; / sayac += 1; |
ロボットプログラミングの授業で使える活動例
下の9つの活動は、40分の授業向けにやさしいものから難しいものへ順に並べていて、どれも上の1つの配線キットで行えます。すべての活動をライブモードで始めるのがよい方法です。生徒はブロックをクリックするとすぐに結果を見られ、センサーの値をステージで確かめ、自分で間違いを見つけられます。プログラムが思いどおりに動いたら、同じブロックをアップロードモードに移してボードに恒久的に書き込むことで、「パソコンなしで動く装置」という考え方を学べます。これらの活動の背景にあるプログラミングの考え方は、Arduinoプログラミングの基本の記事でテキストのコードとしても紹介しています。
| 授業 | 活動 | 使うブロック | 学ぶ考え方 |
|---|---|---|---|
| 1 | 点滅する信号灯(D13かD5) | デジタルピンの出力、待つ、ずっと | 順次処理、無限ループ |
| 2 | 信号機(D5、D6、D7に3つのLED) | デジタルピンの出力、待つ | タイミング、状態の順番 |
| 3 | ボタンでLEDの点灯・消灯を切り替え | デジタルピンを読み取る、もし〜なら〜でなければ | 入力と出力、条件 |
| 4 | 自動で点く常夜灯 | アナログピンを読み取る、「より小さい」演算子 | アナログ値、しきい値 |
| 5 | ポテンショメーターで調光するLED | アナログピンを読み取る、PWMピンの出力、割り算 | スケーリング、PWM |
| 6 | サーボの遮断機 | サーボの角度、掛け算と割り算 | 比例、角度 |
| 7 | 玄関チャイムとメロディー | 音符を鳴らす、繰り返す | 周波数、音符、繰り返し |
| 8 | 駐車センサー(HC-SR04の拡張機能) | 拡張機能のブロック、もし〜なら〜でなければ、ブザー | 拡張機能の追加、距離の測定 |
| 9 | ポテンショメーターで操作するステージのパドルゲーム | ライブモード、変数、スプライトの動き | ハードウェアとソフトウェアの連動 |
授業でいちばん学びが多いのは、数値の変換です。ポテンショメーターは0〜1023の値を出しますが、PWMは0〜255を受け取るので、活動5では読み取った値を4で割ります(1023 ÷ 4 ≈ 255)。同じ値をサーボの角度に変えるには、演算のブロックで値 × 180 ÷ 1023を組み立てます。活動9では、ライブモードでArduinoに「緑の旗が押されたとき、ずっと、[pot]を(アナログピンA1を読み取る)にする」というスクリプトを与えます。スプライトでは同じ変数をx座標を(pot × 480 ÷ 1023 − 240)にするブロックで使い、パドルを−240から240までステージの幅いっぱいに動かします。変数を作るときに「すべてのスプライト用」を選ばないと、デバイスとスプライトが同じ変数を見られません。駐車センサーでは、ブロックパレットの下にある+ extension(拡張機能)ボタンで拡張機能センターを開き、超音波センサーの拡張機能を追加します。これらの拡張機能の多くはコミュニティの開発者が作ったものなので、ブロックの名前や対応するピンは拡張機能ごとに異なります。センサーの仕組みはHC-SR04距離センサーの記事で、音符の周波数はブザーの記事で紹介しています。
Arduino IDEへの移行:ブロックから本物のコードへ
ある時点で、ブロックでは物足りなくなります。プログラムが大きくなるとスクリプトエリアがごちゃごちゃになり、拡張機能センターにないセンサーのライブラリが必要になり、あるいはdelayを使わずに複数の処理を同時に動かしたくなります。そのときがArduino IDEのインストールとテキストのコードへの移行のタイミングです。新しいセンサーのためのライブラリの追加も、それからは自分でできるようになります。移行をスムーズにするいちばんの方法は、mBlockで作ったプロジェクトをArduino IDEで書き直すことです。同じロジックの2つの見え方を並べて比べられます。
- mBlockでArduino Cのパネルのコードを選択してコピーし、Arduino IDEで新しいスケッチを開いて貼り付けます。
- 「ツール」メニューからボード(Arduino Uno)とポートを選び、まず検証を、次に書き込みをクリックします。コードはmBlockのときと同じように動くはずです。
- 次にコードを簡単にします。pinModeの行をsetup()にまとめ、while(1)ループの中身をloop()に移し、_delay()の代わりにdelay()かmillis()を使います。
- float型の変数を必要に応じてintやboolに変え、ピン番号にはconst intでわかりやすい名前を付けます。
- 変数をシリアルモニタに表示して、プログラムの動きを追います。これがmBlockのライブ表示に当たる、テキストのコードでの方法です。
次は、活動3と4を組み合わせたプログラムで、ボタンでオン・オフを切り替える自動の常夜灯をArduino IDEで書いたものです。ピン番号は上の配線表と同じです。
1// mBlock gece lambası etkinliğinin Arduino IDE ile yazılmış hali
2// The mBlock night-light activity rewritten for the Arduino IDE
3const int LED_PIN = 5; // LED + 220 ohm direnç (PWM pini) / LED + 220 ohm resistor (PWM pin)
4const int BUTON_PIN = 2; // buton 5V'a, 10k pull-down GND'ye / button to 5V, 10k pull-down to GND
5const int LDR_PIN = A0; // LDR + 10k gerilim bölücü / LDR + 10k voltage divider
6const int ESIK = 400; // bu değerin altı "karanlık" sayılır / below this value counts as "dark"
7
8bool sistemAcik = true; // butonla açılıp kapanır / toggled with the button
9int oncekiButon = LOW; // önceki buton durumu / previous button state
10unsigned long sonYazma = 0; // son Seri Monitör yazma zamanı / last Serial Monitor print time
11
12void setup() {
13 pinMode(LED_PIN, OUTPUT);
14 pinMode(BUTON_PIN, INPUT); // harici pull-down olduğu için INPUT / INPUT because of the external pull-down
15 Serial.begin(9600); // Seri Monitör 9600 baud / Serial Monitor at 9600 baud
16}
17
18void loop() {
19 int buton = digitalRead(BUTON_PIN);
20 if (buton == HIGH && oncekiButon == LOW) { // yalnız basıldığı an / only at the moment of the press
21 sistemAcik = !sistemAcik;
22 delay(30); // basit debounce / simple debounce
23 }
24 oncekiButon = buton;
25
26 int isik = analogRead(LDR_PIN); // 0 karanlık, 1023 aydınlık / 0 dark, 1023 bright
27 if (sistemAcik && isik < ESIK) {
28 int parlaklik = map(isik, 0, ESIK, 255, 40); // karardıkça daha parlak / brighter as it gets darker
29 analogWrite(LED_PIN, parlaklik);
30 } else {
31 analogWrite(LED_PIN, 0);
32 }
33
34 if (millis() - sonYazma >= 500) { // delay olmadan yarım saniyede bir yaz / print every half second without delay
35 sonYazma = millis();
36 Serial.print("Isik: ");
37 Serial.print(isik);
38 Serial.print(" Sistem: ");
39 Serial.println(sistemAcik ? "acik" : "kapali");
40 }
41}mBlock版との違いを見てみましょう。setup()は1回だけ実行されてピンを準備し、loop()は自動的に繰り返されるので、while(1)は必要ありません。ボタンは前の状態と比較し、押された瞬間だけを記録します。そうしないと、指がボタンに乗っている間、システムは1秒間に何百回も切り替わってしまいます。map()関数はLDRの値を255から40の範囲にスケーリングするので、部屋が暗くなるほどLEDは明るく光ります。シリアルモニタへの表示はdelay()ではなくmillis()で0.5秒ごとに行うので、待っている間にボタンの押下を見逃しません。この手法の詳細はmillis()とdelay()の違いで、データの表示についてはArduinoのシリアルモニタの記事で詳しく紹介しています。
ESP32とRaspberry Pi Picoで同じプログラムを動かす
mBlockのデバイスライブラリには、CyberPiやHaloCodeのようなMakeblock独自のESP32搭載ボードは入っていますが、一般的なESP32開発ボードやRaspberry Pi Pico用の公式デバイスはありません。ときどき見かけるコミュニティの拡張機能も、バージョンごとに変わります。うれしいことに、ブロックで学んだロジックはボードが変わっても変わりません。ESP32をArduino IDEでプログラムするときは、ほぼ同じコードを使います。変わるのはピン番号、3.3 Vの動作電圧、そしてADCの12ビット(0〜4095)のスケールだけです。そのため、暗さのしきい値は400ではなく約1600になります。
1// Aynı gece lambası ESP32'de (Arduino IDE) / The same night light on the ESP32 (Arduino IDE)
2const int LED_PIN = 18; // LED + 220 ohm direnç / LED + 220 ohm resistor
3const int BUTON_PIN = 4; // buton 3V3'e, 10k pull-down GND'ye / button to 3V3, 10k pull-down to GND
4const int LDR_PIN = 34; // ADC1 girişi, LDR + 10k bölücü (3V3) / ADC1 input, LDR + 10k divider (3V3)
5const int ESIK = 1600; // ESP32 ADC 12 bit: 0-4095 / ESP32 ADC is 12-bit: 0-4095
6
7bool sistemAcik = true; // butonla açılıp kapanır / toggled with the button
8int oncekiButon = LOW; // önceki buton durumu / previous button state
9unsigned long sonYazma = 0; // son yazma zamanı / last print time
10
11void setup() {
12 pinMode(LED_PIN, OUTPUT);
13 pinMode(BUTON_PIN, INPUT); // harici pull-down / external pull-down
14 Serial.begin(115200); // ESP32 için yaygın hız / common speed for the ESP32
15}
16
17void loop() {
18 int buton = digitalRead(BUTON_PIN);
19 if (buton == HIGH && oncekiButon == LOW) { // yalnız basıldığı an / only at the moment of the press
20 sistemAcik = !sistemAcik;
21 delay(30); // basit debounce / simple debounce
22 }
23 oncekiButon = buton;
24
25 int isik = analogRead(LDR_PIN); // 0 karanlık, 4095 aydınlık / 0 dark, 4095 bright
26 if (sistemAcik && isik < ESIK) {
27 analogWrite(LED_PIN, map(isik, 0, ESIK, 255, 40)); // karardıkça daha parlak / brighter as it gets darker
28 } else {
29 analogWrite(LED_PIN, 0);
30 }
31
32 if (millis() - sonYazma >= 500) { // yarım saniyede bir yaz / print every half second
33 sonYazma = millis();
34 Serial.printf("Isik: %d Sistem: %s\n", isik, sistemAcik ? "acik" : "kapali");
35 }
36}Raspberry Pi Picoでは、いちばん一般的な方法はMicroPythonです。Thonnyエディターで実行する次のプログラムも同じ働きをします。read_u16()はADCの値を0〜65535で返し、duty_u16()はPWMのデューティ比を同じスケールで受け取ります。ブロックプログラミングの次のステップとしてPythonが適している理由は、MicroPythonの基本の記事で説明しています。
1# Aynı gece lambası Raspberry Pi Pico'da (MicroPython) / The same night light on Raspberry Pi Pico (MicroPython)
2from machine import Pin, ADC, PWM
3import time
4
5led = PWM(Pin(14)) # LED + 220 ohm direnç / LED + 220 ohm resistor
6led.freq(1000) # PWM frekansı 1 kHz / PWM frequency 1 kHz
7buton = Pin(2, Pin.IN, Pin.PULL_DOWN) # buton 3V3'e, pull-down / button to 3V3, pull-down
8ldr = ADC(26) # GP26 = ADC0, LDR + 10k bölücü / GP26 = ADC0, LDR + 10k divider
9ESIK = 25000 # 0-65535 arası karanlık eşiği / darkness threshold on 0-65535
10
11sistem_acik = True # butonla açılıp kapanır / toggled with the button
12onceki = 0 # önceki buton durumu / previous button state
13son_yazma = time.ticks_ms() # son yazma zamanı / last print time
14
15while True:
16 b = buton.value()
17 if b == 1 and onceki == 0: # yalnız basıldığı an / only at the moment of the press
18 sistem_acik = not sistem_acik
19 time.sleep_ms(30) # basit debounce / simple debounce
20 onceki = b
21
22 isik = ldr.read_u16() # 0 karanlık, 65535 aydınlık / 0 dark, 65535 bright
23 if sistem_acik and isik < ESIK:
24 # karardıkça daha parlak / brighter as it gets darker
25 led.duty_u16(65535 - isik * 55000 // ESIK)
26 else:
27 led.duty_u16(0)
28
29 if time.ticks_diff(time.ticks_ms(), son_yazma) >= 500: # yarım saniyede bir / every half second
30 son_yazma = time.ticks_ms()
31 print("Isik:", isik, " Sistem:", "acik" if sistem_acik else "kapali")同じプロジェクトをスマホでブロックとして開く
パソコンから離れているときも、mBlockで組み立てたブロックのロジックで学び続けたいなら、BlueGraysアプリを見てみてください。アプリにある100以上のArduino、ESP32、Raspberry Pi Picoのプロジェクトのコードは、Blocklyをもとにした独自のブロックでも用意されています。プロジェクトでブロックで表示をオンにすると、コードが同じプログラムのブロックに切り替わり、ブロック解説タブでそれぞれのブロックの働きをステップごとに説明します。このガイドのLED、信号機、ボタンでLED、LDRの常夜灯、ブザー、駐車センサー、ポテンショメーターでサーボの活動はすべてアプリにあり、ブロックとArduino Cのコードの両方で見られ、ワンタップで切り替えられます。mBlockで組み立てた順序をアプリのブロックと比べると、同じロジックが2つの異なるツールでどう組み立てられるのかが簡単にわかります。
前述のとおりmBlockに公式デバイスがないESP32とPicoについても、アプリにはブロック対応のプロジェクトがあります。まずブロック版を見てから、同じプロジェクトのArduino CやMicroPythonのコードに進んでください。アプリのコードガイドでは、digitalWrite、if/else、ループのような基本的な命令の例もブロックで表示されます。学んだことを定着させたいなら、今日のクイズでA1からC2までのレベルにわたって1日5問が出題され、週間ランキングとバッジもあります。
よくある接続トラブルと対策
| 症状 | 考えられる原因 | 対策 |
|---|---|---|
| ポートの一覧が空 | 充電専用ケーブル、またはCH340ドライバがない | データ通信用ケーブルを使い、CH340ドライバをインストールする。デバイスマネージャーに「USB-SERIAL CH340 (COM3)」のような行が表示されるはず |
| ポートは表示されるが接続できない | 別のプログラムがポートを使っている | Arduino IDEのシリアルモニタ、2つ目のmBlockのウィンドウ、またはWeb版のタブを閉じる |
| 接続できるが書き込みに失敗する | デバイスライブラリで違うボードを選んでいる | 正確なボードの機種を選ぶ。互換品のNanoならArduino Nano (old)を試す |
| Web版でポートの一覧が開かない | ブラウザがシリアルポートに対応していない | 最新版のChromeかEdgeを使う |
| Web版でLeonardoが接続できない | 直接接続はLeonardo、Micro、Yunに対応していない | mLinkをインストールするか、デスクトップ版を使う |
| ライブモードでブロックが反応しない | ファームウェアがない、または書き込んだプログラムで消えた | Setting(設定)> Update Firmware(ファームウェアを更新)でファームウェアを書き込み直す |
| 書き込みは終わったがプログラムが動かない | ブロックがwhen Arduino Uno starts up(Arduino Unoが起動したとき)の下にない | プログラムをハットブロックにつなげる。離れたブロックはコードに変換されない |
| プログラムが固まる、またはボードがリセットを繰り返す | サーボやモーターがUSBから電流を引きすぎている | サーボとモーターは5 Vの外部電源から給電し、GNDを共通にする |
| mLinkがインストールできない、または開かない | ウイルス対策ソフトかファイアウォールがブロックしている | インストールを許可し、mLinkを信頼済みリストに追加する |
問題がmBlockにあるのかボードにあるのかを手早く見分けるには、同じボードにArduino IDEで「Blink」のスケッチ例を書き込んでみます。Arduino IDEでもavrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00のようなエラー(同期できない)が出るなら、ボードとパソコンが通信できていません。原因はポート、ケーブル、ボードの種類、またはブートローダーにあります。このエラーのすべての原因はArduinoに書き込めないときのガイドで説明しています。CH340チップとそのドライバについてはUSB-TTL変換モジュールの記事を参照してください。サーボをつないでいるとボードが勝手にリセットされる場合は、Arduinoがリセットを繰り返すときの電源のヒントが役立ちます。
mBlockで作れるプロジェクトのアイデア
- 押しボタン式の歩行者用信号機:ボタンを押すと車用の信号が赤になり、歩行者用の青が点灯します。回路とコードはArduinoで信号機の記事を参照してください。
- 駐車センサー:HC-SR04で測った距離が短くなるほどビープ音が速くなり、点灯するLEDが増えます。
- 障害物を避けるロボット:2つのモーターと距離センサーを備え、前方の障害物を見つけて向きを変える車です。詳しくは障害物を避けるロボットのガイドにあります。
- ライントレースロボット:赤外線センサーで黒いテープをたどる競技用ロボットです(ライントレースロボット)。
- ステージのコントローラー:ポテンショメーターやジョイスティックでステージ上の宇宙船を操縦する、ライブモードのゲームです。
- 自動水やり:土壌水分センサーが土の乾きを検出すると、小さなポンプをオンにするシステムです。
- サーボレーダー:サーボに取り付けた距離センサーで周囲をスキャンし、ステージにレーダー画面を描くプロジェクトです(Arduinoレーダー)。
- ロボットカー:mBlockで学んだモーターとセンサーのロジックを、Arduinoロボットカーの作り方のプロジェクトに生かします。
mBlockは、ブロックプログラミングの手軽さで本物のArduinoをプログラムし、準備ができたらテキストのコードに進める、いちばんやさしい方法です。まだボードを持っていない場合は、TinkercadでArduinoをシミュレーションを使えば、同じ活動をブラウザで試せます。BlueGraysアプリでは、LED、信号機、ボタンでLED、LDRの常夜灯、ブザー、HC-SR04の駐車センサー、ポテンショメーターでサーボのプロジェクトについて、回路図とコードをステップごとに見られ、同じプロジェクトをブロックでも開けます。mBlockで作ったすべての活動のブロック版とテキストのコード版を、ワンタップで比べられます。
よくある質問
mBlockは無料ですか?
はい。mBlock 5のデスクトップ版、Web版、モバイル版は無料で、Arduinoをプログラムするのにアカウントも必要ありません。AIやクラウドサービスを使う一部の拡張機能だけに1日の利用上限があり、ログインを求められます。
mBlockがArduinoを認識しないのはなぜですか?
いちばん多い原因は、充電専用のUSBケーブルか、CH340ドライバがないことです。互換品のボードの多くはこのチップを使っています。データ通信用ケーブルでボードをパソコンに直接つなぎ、CH340ドライバをインストールし、Arduino IDEのシリアルモニタのようにポートを使うプログラムを閉じてください。ポートが表示されたら、接続ウィンドウで「Show all connectable devices」(接続可能なすべてのデバイスを表示)にチェックを入れ、正しいポートを手動で選びます。
mBlockのライブモードとアップロードモードの違いは何ですか?
ライブモードでは、プログラムはパソコンで動き、USB経由でArduinoに命令を送ります。結果がすぐにわかりますが、ケーブルを抜くとプログラムは止まり、ボードにはmBlockのファームウェアが必要です。アップロードモードでは、ブロックがArduino Cに変換されてボードに恒久的に書き込まれます。プログラムはケーブルなしで動き、when Arduino Uno starts up(Arduino Unoが起動したとき)ブロックから始める必要があります。
mBlockのコードをArduino IDEで使えますか?
はい。アップロードモードで右側のArduino Cのコードパネルを開いてコードをコピーし、Arduino IDEに貼り付けてコンパイルします。mBlockはforever(ずっと)ブロックをsetup()の中のwhile(1)ループに変え、変数をfloatとして宣言します。コードはそのままでも動きますが、読みやすくするために、通常のloop()の構成に整理するのがおすすめです。
mBlockはESP32やRaspberry Pi Picoに対応していますか?
mBlockはCyberPiやHaloCodeのようなMakeblockのESP32搭載ボードをプログラムできますが、一般的なESP32開発ボードやRaspberry Pi Picoには公式のデバイスとして対応していません。これらのボードでは、ESP32ならArduino IDEを、PicoならThonnyでMicroPythonを使うほうがよいでしょう。ブロックで学んだロジックはそのまま生かせます。
mBlock 3とmBlock 5のどちらを使えばよいですか?
これから始めるならmBlock 5を使ってください。mBlock 3のFlashベースのWebエディターは今のブラウザでは動かず、32ビット版のMac用はmacOS 10.15以降では開きません。mBlock 5はScratch 3.0をベースにしていて、mBlock 3やScratchのプロジェクトを開くことができ、新しいボードや拡張機能も追加されています。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
LEDの点滅
電子工作の第一歩は、1個のLEDを点けたり消したりすることです。Arduinoで短い間隔で点灯と消灯を繰り返すと、LEDが素早く点滅します。ボードが光を制御する仕組みを最もシンプルな形で確かめ、これから取り組むプロジェクトの基礎を身につけます。

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

ボタンでLEDの点灯・消灯を切り替え
部屋の照明スイッチのように、ボタンを1回押すと点灯し、もう1回押すと消灯します。Arduinoはボタンが押されるたびにLEDの状態を反転させます。ボタン内部の小さな接点の振動で誤動作しないよう、短い待ち時間も設けます。1つのボタンでオン・オフを切り替える、シンプルな仕組みです。

LDRで作る常夜灯
暗くなると自動で点灯し、朝になると消灯する小さな常夜灯です。光センサーが部屋の明るさを測定し、Arduinoが十分に暗くなったらLEDを点灯させ、明るくなったら消灯させます。街灯が夕方になると自動で点灯する仕組みも理解できます。

ブザーの使い方
呼び鈴やアラームがどうやって音を出すのか、気になったことはありませんか?Arduinoが小さなブザーを短い間隔で鳴らし、音を出す、止める、を繰り返します。電気で音が生まれる仕組みを学び、メロディーを演奏するプロジェクトへの第一歩を踏み出せます。

HC-SR04で距離を測定(シリアルモニタ表示)
HC-SR04センサーは、コウモリが暗闇で道を見つけるのと同じ仕組みで動作します。人には聞こえない音を出し、その反響を捉えて前方の物体までの距離を測ります。Arduinoは0.5秒ごとに距離をセンチメートル単位でコンピューターの画面に表示し、3〜100センチメートルの測定値を示します。駐車センサーや障害物を避けるロボットなどのプロジェクトの基礎になります。

ポテンショメーターでサーボモーターを操作
ポテンショメーターのつまみを回すと、サーボモーターのアームもそれに合わせて回ります。つまみの一方の端が0度、もう一方の端が半回転に対応します。Arduinoがつまみの位置を常に読み取り、サーボモーターが動きにすぐ反応します。ロボットアームや回転式カメラ台などのプロジェクトへの第一歩です。

HC-SR04で作る駐車センサー
車の駐車センサーを小さく再現します。物体が近づくほど、ビープ音の間隔が短くなります。距離センサーが前方の物体までの距離を測り、20センチメートルより遠ければ緑のLEDが点灯します。近づくと赤いLEDが点滅してブザーが鳴り、さらに近づくほど警告の間隔が短くなります。車が壁にぶつからずに駐車できる仕組みを、机の上で確かめられます。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

