Arduinoの命令一覧:36枚のカードでC++とMicroPythonを並べて学ぶ
学ぶ順に並べたArduinoの命令一覧。pinModeからtoneまでの18枚のカードとMicroPythonでの書き方、並べて比べるコード例、4週間の学習プラン、よくある間違い8つを紹介します。
Arduinoの命令を身につけるいちばん確実な方法は、長い一覧を暗記することではなく、小さな例と実際のプロジェクトを1つずつ添えて、順番に進めることです。BlueGraysアプリには、まさにそのためのコードガイドが学ぶタブのレッスンセクションにあります。Arduino C++コースにはpinModeからtoneまでの18枚、MicroPythonコースにはimportからI2Cまでの18枚、合わせて36枚のカードがあります。どのカードも同じ構成で、何ができますか?、なぜ?、構文、例(ブロック、Arduino、MicroPythonのタブ付き)、よくある間違い、ヒント、プロジェクトで確認、そして2問のミニテストが並びます。順番も決まっています。まずピン(pinMode、digitalWrite、digitalRead、analogRead、analogWrite)、次に時間(delay、millis)、続いて変数、条件分岐、ループ、関数、最後にSerial、map、random、toneです。Raspberry Pi Picoを使うなら、MicroPythonコースでPin、Pin.value、time.sleep、ADC.read_u16、PWMを使って同じ考え方を学びます。
この記事はガイドの地図です。まずカードの中身を紹介し、次に各コースの18枚のカードをアプリでの実際の順番どおりに、もう一方の言語での書き方とあわせて紹介します。その後、同じプログラムのC++版とMicroPython版を並べた3つの短い例、ミニテストと進捗の記録の仕組み、4週間の学習順序、1日20分の練習メニュー、これらの命令でよくある8つの間違いを取り上げます。各命令の詳しい説明を探しているなら、例つきのArduino命令一覧の記事で命令ごとに1つの節を設けて解説しています。この記事のテーマは、どの順番で学び、どう練習するかです。

コードガイドはどこにある?どう使う?
ガイドは下部の学ぶタブから開きます。上部のレッスンセクションでコードガイドのタイルをタップします。ガイドを開くと、上部にArduino C++とMicroPythonの2つのタブがあり、アプリは最後に開いたコースを覚えています。タブの下には学習した内容のカウンターと次のカードの行があるので、どこまで進んだかを探す必要はありません。カードはテーマごとに、ピン、時間、変数、条件分岐、ループ、関数、シリアルポート、数学、音のグループに分かれていて、MicroPythonコースにはさらに基本構造とエラー処理があります。コードガイドは無料です。カードを読む、例を見る、ミニテストを解くのにプレミアムは必要ありません。カードは10言語で用意されているので、アプリを使っている言語で説明を読めます。
カードの中身は?
どのカードも同じ骨組みなので、3枚目を過ぎればどこを見ればよいかすぐにわかります。次の表では、Arduinoコースの7枚目のカードmillisを例に各セクションを紹介します。右の列は、カードに実際に書かれている内容の短い要約です。セクションの並び自体が学ぶ順番になっています。まず命令が何をするかを1文で知り、次に身近なたとえでなぜ必要かを理解し、書き方を見て、動く例を読み、いちばん多い落とし穴を知り、最後に2問で自分を確かめます。
| セクション | 内容 | millisのカードでは |
|---|---|---|
| 何ができますか? | 命令の役割を1文で | ボードが起動してから何ミリ秒たったかを教えてくれます。 |
| なぜ? | なぜ必要かを身近なたとえで | ケーキをオーブンに入れて、ときどき時計を見るようなものです。待っている間にほかのことができます。 |
| 構文 | 命令の書き方 | unsigned long now = millis();(起動からの時間を取得) |
| 例 | 短い動くプログラム。ブロック、Arduino、MicroPythonのタブ | 500 msごとにLEDを切り替えるコード。Picoではtime.ticks_msで同じ処理 |
| よくある間違い | 初心者がいちばんはまりやすい落とし穴 | millisをintに入れると、約33秒後に数値がおかしくなります。 |
| ヒント | 作業が楽になる小さなルール | 判定は必ずnow - previous >= intervalの形で書きます。 |
| プロジェクトで確認 | その命令を使うプロジェクトを、簡単なものから難しいものへ | 50件以上のプロジェクト。一覧は無料のESP32のボタンのプロジェクトから始まります |
| ミニテスト | 2問。答えるたびに短い解説 | millis()は何を返しますか?millisの値は、どの型で保存すべきですか? |
例セクションは、カード自身のコースのタブで開きます。ArduinoのカードならArduinoタブが、MicroPythonのカードならMicroPythonタブが最初です。ただし、もう一方のタブもいつも用意されていて、これがガイドを辞書のように使えるものにしています。たとえばMicroPythonコースのピンの出力:Pin(15, Pin.OUT)のカードでは、ArduinoタブにpinModeとdigitalWriteで同じ処理をするコードがあり、コメントでどの行が何に対応するか(led.toggle()の代わりになる行など)を説明しています。ほとんどのカードには3つ目のタブブロックもあり、例のプログラムをブロックで表示します。ArduinoからPicoに移るなら、いちばん早い方法はこうです。知っているカードを開き、タブを切り替えて、2つのプログラムを1行ずつ照らし合わせます。
Arduino C++コース:18枚のカードとMicroPythonでの書き方
次の表は、アプリでのArduinoコースの実際の順番です。最後の列は、Raspberry Pi PicoのMicroPythonで同じ処理をする方法を示しています。ピン番号はカードの例と同じです。LEDはUnoで13か9、PicoでGP15、ボタンはUnoで2、PicoでGP14、アナログ読み取りはUnoでA0、PicoでGP26です。最初の5枚はピン、6枚目と7枚目は時間、8枚目から14枚目はプログラミングの基本、最後の4枚はシリアルポート、スケーリング、乱数、音を扱います。この順番には意味があります。まずボードが外の世界にどう触れるかを学び、次に変数、条件、ループでその触れ方を制御します。
| 番号 | カード | 何ができますか? | MicroPythonでの書き方 |
|---|---|---|---|
| 1 | pinMode | ピンが出力(LED、ブザー)か入力(ボタン、センサー)かをボードに伝える | Pin(15, Pin.OUT) · Pin(14, Pin.IN, Pin.PULL_UP) |
| 2 | digitalWrite | 出力ピンをオン(HIGH、5 V)またはオフ(LOW、0 V)にする | led.value(1) · led.on() · led.off()(オン・オフ) |
| 3 | digitalRead | 入力ピンがHIGHかLOWかを読み取る | button.value() → 1か0 |
| 4 | analogRead | A0〜A5の電圧を0〜1023の数値に変換する | ADC(26).read_u16() → 0〜65535 |
| 5 | analogWrite (PWM) | ~の付いたピンで、0〜255の値によりLEDを暗くしたりモーターを遅くしたりする | PWM(Pin(15)) · freq(1000) · duty_u16(0〜65535) |
| 6 | delay | 指定したミリ秒だけコードを止める | time.sleep(0.5) · time.sleep_ms(500)(秒・ミリ秒) |
| 7 | millis | 起動からのミリ秒数。コードを止めずに時間を計る | time.ticks_ms() · time.ticks_diff() |
| 8 | 変数と型 | int、float、bool、unsigned longなどの型で値を保存する | 型は書かない:count = 0、volts = 3.3 |
| 9 | if / else if / else | 条件に応じて別のコードを実行する | if / elif / else |
| 10 | 比較演算子と論理演算子 | ==、!=、<、>、&&、||、!で条件を組み立てる | ==、!=、<、> · and、or、not |
| 11 | forループ | 決まった回数だけ処理を繰り返す | for i in range(10): |
| 12 | whileループ | 条件が真の間、繰り返す | while 条件: |
| 13 | 関数(void、パラメーター、return) | コードを名前の付いた、使い回せる部品に分ける | def blink(times): … return(関数の定義) |
| 14 | 配列 | 同じ型の値を1つの名前で順番に保持する | リスト:pins = [2, 3, 4] · len(pins) |
| 15 | Serial.begin / print / println(シリアル通信) | 文字や値をパソコン(シリアルモニタ)に送る | print(x) · f文字列。Serial.beginは不要 |
| 16 | map | ある数値の範囲を別の範囲に変換する | 組み込みの命令はない:raw * 255 // 1023 か自作の関数 |
| 17 | random / randomSeed | 乱数を作る | import random · random.randint(1, 6)(乱数) |
| 18 | tone / noTone | ブザーで指定した周波数の音を鳴らし、止める | PWM:freq(440) · duty_u16(32768)。止めるにはduty_u16(0) |
MicroPythonコース:18枚のカードとArduinoでの書き方
MicroPythonコースはRaspberry Pi Picoを想定して書かれていて、カードの例はPicoで、たとえばThonnyから実行できる短いプログラムです。順番はArduinoコースと少し違います。Pythonでは、importでモジュールを追加する、printで表示する、インデントとコロンのルールといった、まず言語そのもののルールに慣れる必要があるからです。MicroPythonのカードのArduinoタブにも同じプログラムのC++版があるので、Arduinoをすでに知っているなら、表を右から左へ読むこともできます。Picoを初めて使うなら、Raspberry Pi Picoとは?の記事が、セットアップとピンの準備に役立ちます。
| 番号 | カード | 何ができますか? | Arduinoでの書き方 |
|---|---|---|---|
| 1 | importとfrom … import | machineやtimeなどのモジュールをプログラムに追加する | ライブラリには#include。pinModeやdelayなどの基本的な命令は最初から使える |
| 2 | printとf文字列 | Thonnyのシェルに文字や値を表示する | Serial.begin(9600) + Serial.println() |
| 3 | ピンの出力:Pin(15, Pin.OUT) | GPピンを出力にする。value()、on()、off()、toggle() | pinMode(13, OUTPUT) + digitalWrite() |
| 4 | ピンの入力:Pin.IN, PULL_UP, PULL_DOWN | ピンを入力にし、内部抵抗を選び、value()で読み取る | pinMode(2, INPUT_PULLUP) + digitalRead() |
| 5 | time.sleepとsleep_ms | プログラムを秒単位またはミリ秒単位で止める | delay() |
| 6 | while True:による無限ループ | Picoの電源が入っている間、その下の行を繰り返す | loop() |
| 7 | インデントとコロン(:) | どの行がどのブロックに属するかを決める | 波かっこ{ }とセミコロン; |
| 8 | 変数:int、float、str、bool | 値を保存する。型は自動的に決まる | int、float、String、bool |
| 9 | if / elif / elseとand / or / not | 条件で分岐し、条件を組み合わせる | if / else if / else · &&、||、! |
| 10 | forとrange | 決まった回数だけ繰り返す。range(0, 10)は0から9まで数える | for (int i = 0; i < 10; i++) |
| 11 | リスト:[ ]、インデックス、len | 複数の値を順番に保持する。最初の要素はインデックス0 | 配列:int pins[] = {2, 3, 4}; |
| 12 | defとreturn(関数) | 使い回せるコードに名前を付け、結果を返す | voidまたは型付きの関数、return |
| 13 | ADC:read_u16でアナログ値を読み取る | GP26、GP27、GP28の電圧を0〜65535で読み取る | analogRead() → 0〜1023 |
| 14 | PWM:freqとduty_u16 | LEDを暗くしたり、ブザーで音符を鳴らしたりする | analogWrite()とtone() |
| 15 | time.ticks_msとticks_diff | コードを止めずに経過時間を計る | millis() |
| 16 | Pin.irq:割り込みでボタンを処理する | ボタンが押された瞬間に関数を実行する | attachInterrupt() |
| 17 | try / except(エラーの捕捉) | エラーが起きてもプログラムが止まらないようにする | Arduinoには一般的な対応するものがなく、戻り値を確認する |
| 18 | I2Cとscan() | I2Cバス上のデバイスのアドレスを見つける | Wire.begin() + I2Cスキャナーのコード |
同じプログラムを2つの言語で:並べて比べる3つの例
最初の例は、どの言語でもおなじみの「Hello World」、つまりボード上のLEDを0.5秒ごとに点滅させるプログラムです。Unoでは内蔵LEDが13番ピンにつながっているので、回路を組む必要はありません。Picoは少し違います。無印のPicoではボード上のLEDがGP25にありますが、Pico WではLEDが無線チップにつながっていて、Pin(25)では点灯しません。そのためMicroPythonではPin("LED", Pin.OUT)と書くほうが確実です。最近のMicroPythonのバージョンでは、この名前でPicoでもPico Wでもボード上のLEDを見つけられます。ボードのファームウェアが「LED」という名前を認識しない場合は、Picoに最新のMicroPythonをインストールしてください。無料のRaspberry Pi Picoの内蔵LEDを点滅(PicoとPico W)プロジェクトで、まさにこの違いを解説しています。
1// Örnek 1: dahili LED'i yakıp söndür / Example 1: blink the built-in LED
2void setup() {
3 pinMode(13, OUTPUT); // Uno'da dahili LED 13. pinde / built-in LED is on pin 13 on the Uno
4}
5
6void loop() {
7 digitalWrite(13, HIGH); // LED yanar / LED on
8 delay(500); // 500 ms bekle / wait 500 ms
9 digitalWrite(13, LOW); // LED söner / LED off
10 delay(500); // 500 ms bekle / wait 500 ms
11}1# Örnek 1: dahili LED'i yakıp söndür / Example 1: blink the onboard LED
2from machine import Pin
3import time
4
5led = Pin("LED", Pin.OUT) # Pico ve Pico W'de dahili LED / onboard LED on Pico and Pico W
6# Pin(25, Pin.OUT) yalnız düz Pico'da çalışır / Pin(25, Pin.OUT) works only on the plain Pico
7
8while True: # Arduino'daki loop() gibi / like loop() in Arduino
9 led.on() # LED yanar / LED on
10 time.sleep_ms(500) # 500 ms bekle / wait 500 ms
11 led.off() # LED söner / LED off
12 time.sleep_ms(500) # 500 ms bekle / wait 500 ms2つ目の例では入力を加えます。ボタンを押している間だけLEDが点灯します。ボタンはUnoでは2番ピンとGNDの間に、PicoではGP14とGNDの間につなぎます。Unoでは再び13番ピンの内蔵LEDを使い、Picoでは220 Ωの抵抗を通して外付けLEDをGP15につなぎます(自分のLEDに合った値は「LED用抵抗」ツールで計算できます)。どちらの言語でも内部プルアップ抵抗を有効にします。ArduinoではINPUT_PULLUP、MicroPythonではPin.PULL_UPです。この配線では論理が逆になります。ボタンを押すとピンがGNDに引っぱられるので、ArduinoはLOW、Picoは0を読み取ります。最後の20 msの待ち時間はボタンの機械的なチャタリングを完全には解決しませんが、ごく短いちらつきを減らします。ボタンの配線について詳しくはArduinoに押しボタンをつなぐ方法の記事で紹介しています。
1// Örnek 2: butona basılıyken LED yanar / Example 2: LED on while the button is pressed
2const int BUTTON_PIN = 2; // buton: 2. pin ile GND arasında / button between pin 2 and GND
3const int LED_PIN = 13; // dahili LED / built-in LED
4
5void setup() {
6 pinMode(BUTTON_PIN, INPUT_PULLUP); // iç pull-up direnci açık / internal pull-up on
7 pinMode(LED_PIN, OUTPUT);
8}
9
10void loop() {
11 if (digitalRead(BUTTON_PIN) == LOW) { // basılıyken LOW okunur / reads LOW while pressed
12 digitalWrite(LED_PIN, HIGH);
13 } else {
14 digitalWrite(LED_PIN, LOW);
15 }
16 delay(20); // kısa bekleme / short pause
17}1# Örnek 2: butona basılıyken LED yanar / Example 2: LED on while the button is pressed
2from machine import Pin
3import time
4
5button = Pin(14, Pin.IN, Pin.PULL_UP) # buton: GP14 ile GND arasında / button between GP14 and GND
6led = Pin(15, Pin.OUT) # LED: GP15 + 220 ohm direnç / LED on GP15 with 220 ohm
7
8while True:
9 if button.value() == 0: # basılıyken 0 okunur / reads 0 while pressed
10 led.value(1)
11 else:
12 led.value(0)
13 time.sleep_ms(20) # kısa bekleme / short pause3つ目の例は、2つの言語の最も重要な違いである数値の範囲を示します。ポテンショメーターの中央のピンはUnoではA0、PicoではGP26につなぎます。両端のピンはUnoでは5VとGND、Picoでは3V3(OUT)とGNDにつなぎます。LEDはUnoでは9番ピン(~の印あり)、PicoではGP15に、それぞれ220 Ωの抵抗を通してつなぎます。ArduinoではanalogReadが0〜1023を返しますが、analogWriteは0〜255を受け取るので、間にmap(raw, 0, 1023, 0, 255)が入ります。Picoではread_u16もduty_u16も0〜65535を使うので、読み取った値をそのままPWMに渡せます。PWMの仕組みはPWMとは?の記事で、値をリアルタイムで確認する方法はシリアルモニタのガイドで紹介しています。
1// Örnek 3: potansiyometreyle LED parlaklığı / Example 3: LED brightness with a potentiometer
2const int POT_PIN = A0; // potansiyometrenin orta ucu / potentiometer wiper
3const int LED_PIN = 9; // ~ işaretli PWM pini / PWM pin marked with ~
4
5void setup() {
6 pinMode(LED_PIN, OUTPUT);
7 Serial.begin(9600);
8}
9
10void loop() {
11 int raw = analogRead(POT_PIN); // 0-1023
12 int brightness = map(raw, 0, 1023, 0, 255); // 0-255 aralığına ölçekle / scale to 0-255
13 analogWrite(LED_PIN, brightness);
14 Serial.println(raw); // Seri Monitör'de izle / watch in the Serial Monitor
15 delay(50);
16}1# Örnek 3: potansiyometreyle LED parlaklığı / Example 3: LED brightness with a potentiometer
2from machine import Pin, ADC, PWM
3import time
4
5pot = ADC(26) # GP26 = ADC0, orta uç / wiper on GP26 (ADC0)
6led = PWM(Pin(15)) # LED: GP15 + 220 ohm direnç / LED on GP15 with 220 ohm
7led.freq(1000) # saniyede 1000 aç-kapa / 1000 cycles per second
8
9while True:
10 raw = pot.read_u16() # 0-65535
11 led.duty_u16(raw) # aynı aralık, ölçekleme gerekmez / same range, no scaling needed
12 print(raw) # Thonny kabuğunda izle / watch in the Thonny shell
13 time.sleep_ms(50)| 考え方 | Arduino C++ | MicroPython(Pico) |
|---|---|---|
| 1回だけ実行 | void setup() { … } | while True:より前の行 |
| ずっと繰り返す | void loop() { … } | while True:とその下のインデントされた行 |
| コードのブロック | 波かっこ{ }と行末の; | 行末の:と4文字分のインデント |
| コメント | // コメント | # コメント |
| 出力ピン | pinMode(13, OUTPUT); digitalWrite(13, HIGH); | led = Pin(15, Pin.OUT) · led.value(1)(出力に設定してオン) |
| 入力ピン | pinMode(2, INPUT_PULLUP); digitalRead(2) | Pin(14, Pin.IN, Pin.PULL_UP) · button.value() |
| アナログ読み取り | analogRead(A0) → 0〜1023 | ADC(26).read_u16() → 0〜65535 |
| PWM出力 | analogWrite(9, 0〜255) | PWM(Pin(15)).duty_u16(0〜65535) |
| 待つ | delay(500) | time.sleep_ms(500)またはtime.sleep(0.5) |
| 表示 | Serial.begin(9600); Serial.println(x); | print(x) |
ミニテスト、「理解した」、そしてマイレベルでの進捗
- ミニテスト:どのカードも最後に2問あり、見出しにはミニテスト・1/2と表示されます。選択肢をタップすると、すぐに正解です。か不正解です。と短い解説が表示され、次の問題で先に進みます。
- スコア:2問とも終わると、2問中2問正解のようなスコアが表示されます。テストを解かないとカードは完了できず、ボタンの代わりにミニテストを解いて、このカードの学習を完了してください。と表示されます。
- 理解した:テストが終わると理解した、次へボタンが表示されます(コースの最後のカードでは理解しただけです)。タップするとカードが学習済みとしてアカウントに保存され、よくできました!5/18枚のような短いお祝いで進捗が表示されて、次のカードが開きます。
- マークとカウンター:学習したカードには一覧で学習済みのマークが付き、ガイド上部の学習した内容のカウンターが増えます。コースのすべてのカードを終えると、このコースのすべてのカードを学習しました。と表示されます。
- マイレベル:学ぶセクションのマイレベル画面では、コードガイドの見出しと学習済みのカードのメモの下に、Arduino C++ x/18とMicroPython x/18の2本のバーがあります。これらのバーが数えるのは、コードガイドのカードだけです。
- 自分のための正直なルール:アプリは間違えた答えの後でも先に進ませてくれます。テストが終われば理解したボタンが表示されるからです。だからタップする前に、両方の答えがなぜ正しいのかを声に出して説明できるか確かめてください。できなければ例セクションに戻り、コードをもう一度1行ずつ読みましょう。
プロジェクトで確認:実際のコードの中で命令を見つける
命令を学ぶ最後のステップは、ほかの人が書いた動くプロジェクトの中でその命令を見分けることです。カードのプロジェクトで確認セクションには、選ばれたいくつかのプロジェクトと、その下に何件のプロジェクトのコードでその命令が使われているかを伝える1文が表示されます。すべてのリンクで一覧全体が開きます。一覧は簡単なものから難しいものの順に並び、すべて、無料、プレミアムの絞り込みで絞れます。たとえばmillisは50件以上のプロジェクトのコードに登場します。一覧は無料のESP32でボタンによるLED制御(トグル)から始まり、Raspberry Pi Picoのボタンピアノ(ボタン5個+ブザー+メロディー録音)やRaspberry Pi Picoの駐車センサー(HC-SR04+LED3個+ブザー)などの初級のPicoプロジェクトに続き、ボタンとタイミングを組み合わせたRaspberry Pi Picoで信号機の4モードをボタンで切り替え(ステートマシン、GP11-13 + GP4)のような中級のプロジェクトへと進みます。おすすめの使い方は、一覧から無料のプロジェクトを開き、コードの中でその命令を見つけ、値を1つ変えて、まず結果を予想することです。コードの各行が何をするかを知るには、プロジェクトの「コードを理解」タブに進むのが自然な次のステップです。
おすすめの学習順序:4週間のプラン
1日約20分、週5日を使えると仮定しましょう。1つのコースを4週間で終えるには、ほとんどの日に1枚のカードで十分です。残りの日は新しいカードの代わりに、復習とプロジェクトに取り組みます。Arduinoを持っているならArduinoの列だけを、Picoを持っているならMicroPythonの列だけを進めてください。両方持っているなら、まずArduinoコースを終え、2か月目にMicroPythonに移りましょう。考え方は同じなので、2つ目のコースはずっと早く進みます。表のプロジェクトはすべてBlueGraysで無料です。もっと幅広いプランが欲しいなら、30日間のArduinoロードマップの記事がこの表と一緒に使えます。Picoで教えているなら、PicoとMicroPythonの授業計画がMicroPythonのカードを6週間の授業に割り振っています。
| 週 | Arduino C++のカード | MicroPythonのカード | 今週の無料プロジェクト | 週の終わりにできること |
|---|---|---|---|---|
| 1週目 | 1〜5:pinMode、digitalWrite、digitalRead、analogRead、analogWrite | 1〜5:import、print、ピンの出力、ピンの入力、time.sleep | LEDの点滅、ボタンでLEDを点灯(押している間のみ)。Pico:Raspberry Pi Picoの内蔵LEDを点滅(PicoとPico W) | LEDを点滅させ、ボタンを読み取る。Arduinoではアナログ値も確認 |
| 2週目 | 6〜10:delay、millis、変数、if / else、演算子 | 6〜9:while True、インデント、変数、if / elif / else | LDRで作る常夜灯、ESP32でボタンによるLED制御(トグル)。Pico:Raspberry Pi Picoで2個のLEDを交互に点滅(GP14+GP13) | 読み取った値で判断し、プログラムを止めずに時間を計る |
| 3週目 | 11〜14:for、while、関数、配列 | 10〜13:forとrange、リスト、def、ADC | Knight Rider風LED、流れるLED。Pico:Raspberry Pi Picoで信号機(3個のLEDを順に点灯、GP11/GP12/GP13) | 繰り返しをループに、ピンを配列に、処理を関数にまとめる |
| 4週目 | 15〜18:Serial、map、random、tone | 14〜18:PWM、ticks_ms、Pin.irq、try / except、I2C | ブザーの使い方、LDRで光の強さを測定。Pico:Raspberry Pi Picoで信号機の4モードをボタンで切り替え(ステートマシン、GP11-13 + GP4) | 値を表示し、音と明るさを調整し、小さなプロジェクトを一から作る |
1日20分の練習メニュー
- 3分、ウォームアップ:「学ぶ」セクションの今日のクイズを解くか、前日のミニテストをもう一度解きます。前日の命令を今日も覚えているかを確かめるのがねらいです。
- 5分、新しいカード:何ができますか?、なぜ?、構文のセクションを読みます。構文を紙に手で書き写しましょう。書き出すと、かっこやセミコロンを目で読み飛ばしにくくなります。
- 3分、例:例を1行ずつ自分に説明し、それからタブを切り替えます。ArduinoのカードではMicroPythonタブを、MicroPythonのカードではArduinoタブを見て、2つのプログラムで同じ働きをする行を照らし合わせます。
- 2分、ミニテスト:2問とも答え、間違えた問題の解説を読みます。このタイミングでよくある間違いとヒントのボックスにもう一度目を通しましょう。
- 6分、プロジェクト:プロジェクトで確認の一覧から無料の簡単なプロジェクトを開き、コードの中でその命令を見つけて、待ち時間、ピン番号、しきい値のどれか1つの値を変えます。回路ができていればボードに書き込み、できていなければ結果を予想して「コードを理解」で確かめます。
- 1分、メモ:ノートに1行書きます。命令の名前、1文での意味、もう一方の言語での書き方です。4週間が終わるころには、そのページが自分だけの命令辞典になっています。
これらの命令でよくある間違い8つ
| 間違い | 症状 | 対策 | カード |
|---|---|---|---|
| pinModeを書き忘れる | LEDがまったく点灯しない、またはとても暗い | setup()にpinMode(pin, OUTPUT)を書く。PicoではPin(15, Pin.OUT)でピンを作る | pinMode・ピンの出力 |
| 条件で==の代わりに=と書く | if (x = 5)は常に真になり、プログラムはいつも同じ分岐を実行する | 比較には==を使う。Pythonではif x = 5と書くとすぐにSyntaxErrorになる | if / else・演算子 |
| 長いdelayでコードを止めてしまう | ボタンを押しても反応が遅い、または反応しない | 待ち時間はmillisで処理する。Picoではtime.ticks_msとticks_diffを使う | delay・millis・ticks_ms |
| analogReadの範囲を取り違える | Arduinoからコピーしたしきい値がPicoではいつまでも反応しない | UnoのanalogReadは0〜1023、Picoのread_u16は0〜65535。新しい範囲に合わせてしきい値を計算し直す | analogRead・ADC |
| analogWriteの値をそのままduty_u16に使う | Picoでduty_u16(255)にすると、LEDはほとんど暗いまま | duty_u16は0〜65535を受け取る。半分の明るさは32768、最大の明るさは65535 | analogWrite・PWM |
| millisをintに入れる | Unoでは約33秒後にタイミングがおかしくなる | 時間の変数をunsigned longにし、判定をnow - previous >= intervalの形で書く | millis |
| INPUT_PULLUPの論理を逆に考える | ボタンを押したらHIGHや1になると思ったのに、LOWや0になる | プルアップでは、押すとLOW(0)、離すとHIGH(1) | digitalRead・ピンの入力 |
| Picoでsleep(500)と書く | Picoが0.5秒ではなく500秒、つまり8分以上待つ | sleepの単位は秒。sleep(0.5)かsleep_ms(500)と書く | time.sleep |
ブロックタブ:見て命令を理解する

ブロックタブを使うと、とくにコースの最初のほうのカードで、コードを書かずに命令が何をするかを確認できます。上の画像では、pinModeが「ピン 9 を 出力 に設定」のブロックに、digitalWriteが「ピン 9 に HIGH を書き込む」に、delayが「100 ms待つ」になっています。pinModeのカードでは、ブロック表示の下のメモにドロップダウンの選択肢(出力、入力、入力(PULLUP)、つまりOUTPUT、INPUT、INPUT_PULLUP)も載っています。ブロックはアプリの言語で表示され、読むためのものです。アプリの中でブロックをドラッグしてプログラムを作るわけではなく、ボードにはいつも本物のコードが書き込まれます。おすすめの使い方は、まずブロックタブでプログラムが何をするかを予想し、それからArduinoタブに切り替えて、各ブロックがどの行にあたるかを見つけることです。ブロック表示のあるプロジェクトでは、プロジェクトページのブロックで表示スイッチを使って、プロジェクト全体で同じ照らし合わせができます。基本はブロックプログラミングとは?の記事で紹介しています。
まとめると、Arduinoの命令を覚えるのに長い一覧は必要ありません。正しい順番、命令ごとの小さな動く例、2問の確認、そしてその命令を使う実際のプロジェクトがあれば十分です。今日pinModeのカードから始めれば、4週間後には18枚すべてのカードを終え、どの命令も少なくとも1つのプロジェクトの中で自分の目で確かめているはずです。Picoに移るときも、MicroPythonコースで同じ考え方をずっと早く身につけられます。カードとその中のプロジェクトを試してみたい方は、スマホにBlueGraysをインストールして、「学ぶ」セクションの最初のカードを開いてください。
よくある質問
Arduinoの基本的な命令には何がありますか?
よく使われるArduinoの命令は、ピンの命令(pinMode、digitalWrite、digitalRead、analogRead、analogWrite)、時間の命令(delay、millis)、Serialのシリアルポートの命令、そしてmap、random、toneなどの補助的な命令です。これらに加えて、if、for、whileなどのC++の構文と関数がプログラムの流れを作ります。BlueGraysのコードガイドのArduino C++コースでは、これらのテーマを18枚のカードで順番に取り上げています。
Arduinoの命令はどれから覚えればいいですか?
pinModeとdigitalWriteから始めましょう。この2つだけでLEDを点灯でき、結果がすぐに見えるからです。次にdelayでタイミングを、digitalReadでボタンの読み取りを加えます。analogRead、millis、if、forはどれも、この4つの命令の上に成り立っています。
ArduinoとMicroPythonの命令の違いは何ですか?
考え方は同じで、書き方が違います。pinModeとdigitalWriteの代わりにPin(15, Pin.OUT)とled.value(1)、delayの代わりにtime.sleep_ms、loop()の代わりにwhile Trueを使います。数値の範囲も変わり、UnoのanalogReadは0〜1023を返しますが、Picoのread_u16は0〜65535を返します。Pythonでは、C++の波かっことセミコロンの代わりにインデントとコロンを使います。
MicroPythonにdelayの命令はありますか?
delayという名前の命令はありません。timeモジュールのsleep(秒)、sleep_ms(ミリ秒)、sleep_us(マイクロ秒)が同じ働きをします。Arduinoのdelay(500)は、Picoではtime.sleep_ms(500)かtime.sleep(0.5)になります。コードを止めずに時間を計るには、millisの代わりにtime.ticks_msとtime.ticks_diffを使います。
Raspberry Pi Picoのボード上のLEDはどのピンですか?
無印のPicoでは、ボード上のLEDはGP25につながっています。Pico WではLEDが無線チップにつながっているので、Pin(25)では点灯しません。最近のMicroPythonのバージョンでは、Pin("LED", Pin.OUT)でどちらのボードでもボード上のLEDを見つけられます。
BlueGraysのコードガイドは無料ですか?
はい、コードガイドは無料です。36枚すべてのカードを読み、例を見て、ミニテストを解けます。カードの「プロジェクトで確認」の一覧には無料とプレミアムの両方のプロジェクトが含まれていて、「無料」の絞り込みを使うと無料のものだけが表示されます。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
LEDの点滅
電子工作の第一歩は、1個のLEDを点けたり消したりすることです。Arduinoで短い間隔で点灯と消灯を繰り返すと、LEDが素早く点滅します。ボードが光を制御する仕組みを最もシンプルな形で確かめ、これから取り組むプロジェクトの基礎を身につけます。

ボタンでLEDを点灯(押している間のみ)
呼び鈴のように、押している間は点灯し、離すと消灯します。Arduinoはボタンの状態を常に読み取り、押されている間はLEDを点灯させ、指を離した瞬間に消灯させます。このシンプルな回路で、ボードが外部からの操作を検知する仕組みを学べます。

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

ESP32でボタンによるLED制御(トグル)
ボタンを押すたびにLEDの状態が切り替わり、点灯中なら消灯し、消灯中なら点灯します。基本的なトグル動作です。チャタリング対策でボタンの機械的なノイズを除去し、1回の操作で1回だけ切り替わるようにします。

Knight Rider風LED
Knight Riderでおなじみの、光が左右に往復する動きです。6個のLEDの上を光の点が端から端へ進み、折り返します。Arduinoが各LEDを10分の1秒ずつ点灯させ、端に着くたびに向きを変えて往復し続けます。装飾用の照明や警告灯作りの第一歩にぴったりです。

Raspberry Pi Picoの内蔵LEDを点滅(PicoとPico W)
Raspberry Pi Picoシリーズの最初のプロジェクトです!ボード上の緑色LEDを点滅させて動作を確認する、定番の「Hello World」に相当する実験です。外付け部品は不要で、PicoとUSBケーブルだけで始められます。コードはMicroPython(Raspberry Pi Foundationが公式にサポートする言語)で書きます。Thonny IDEでmachine.Pinクラス、Pin.OUTモード、led.on()/off()メソッド、time.sleep()を学びます。シリアル(REPL)出力で、切り替わる様子をリアルタイムに確認できます。

Raspberry Pi Picoで2個のLEDを交互に点滅
PicoでLEDを1個点滅させた次は、2個のLEDを交互に点滅させる定番のフリップフロップパターンです。一方が消えるともう一方が点灯する、複数のGPIOを連動させる最も基本的な例です。このプロジェクトでは、色の異なる2個のLED(GP14に赤、GP13に緑)が500msごとに点灯状態を入れ替えます。MicroPythonのPin.toggle()メソッドを使うと、コードを短く読みやすくできます。同じ基本的な仕組みが、信号機、パトカーの点滅灯、流れるLEDなど、複数のLEDを使ったアニメーションの基礎になります。回路はとても簡単で、各LEDに220Ωの抵抗を使います。

Raspberry Pi Picoで信号機(3個のLEDを順に点灯)
赤・黄・緑のLEDで本物の信号機を再現する、Picoシリーズ初の3個のLEDを使うプロジェクトです!緑が4秒間「進め」、黄が1.5秒間「準備」、赤が3秒間「止まれ」、赤と黄が1秒間「発進準備」を示します(ヨーロッパの信号機のパターン)。関数の定義(def all_off())、状態機械の仕組み(順序)、複数のGPIOの同期を学びます。回路はとても簡単です。GP11(緑)、GP12(黄)、GP13(赤)に3個のLEDを接続し、それぞれに220Ωの電流制限抵抗を使います。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

