基礎 · 読了まで14分

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 Unoボード:デジタルピン、~の付いたPWMピン、A0〜A5のアナログ入力
Arduino C++コースの最初の5枚のカードは、このボードの3種類のピン、つまりデジタルピン、~の付いたPWMピン、A0〜A5のアナログ入力を扱います。

コードガイドはどこにある?どう使う?

ガイドは下部の学ぶタブから開きます。上部のレッスンセクションでコードガイドのタイルをタップします。ガイドを開くと、上部に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での書き方
1pinModeピンが出力(LED、ブザー)か入力(ボタン、センサー)かをボードに伝えるPin(15, Pin.OUT) · Pin(14, Pin.IN, Pin.PULL_UP)
2digitalWrite出力ピンをオン(HIGH、5 V)またはオフ(LOW、0 V)にするled.value(1) · led.on() · led.off()(オン・オフ)
3digitalRead入力ピンがHIGHかLOWかを読み取るbutton.value() → 1か0
4analogReadA0〜A5の電圧を0〜1023の数値に変換するADC(26).read_u16() → 0〜65535
5analogWrite (PWM)~の付いたピンで、0〜255の値によりLEDを暗くしたりモーターを遅くしたりするPWM(Pin(15)) · freq(1000) · duty_u16(0〜65535)
6delay指定したミリ秒だけコードを止めるtime.sleep(0.5) · time.sleep_ms(500)(秒・ミリ秒)
7millis起動からのミリ秒数。コードを止めずに時間を計るtime.ticks_ms() · time.ticks_diff()
8変数と型int、float、bool、unsigned longなどの型で値を保存する型は書かない:count = 0、volts = 3.3
9if / else if / else条件に応じて別のコードを実行するif / elif / else
10比較演算子と論理演算子==、!=、<、>、&&、||、!で条件を組み立てる==、!=、<、> · and、or、not
11forループ決まった回数だけ処理を繰り返すfor i in range(10):
12whileループ条件が真の間、繰り返すwhile 条件:
13関数(void、パラメーター、return)コードを名前の付いた、使い回せる部品に分けるdef blink(times): … return(関数の定義)
14配列同じ型の値を1つの名前で順番に保持するリスト:pins = [2, 3, 4] · len(pins)
15Serial.begin / print / println(シリアル通信)文字や値をパソコン(シリアルモニタ)に送るprint(x) · f文字列。Serial.beginは不要
16mapある数値の範囲を別の範囲に変換する組み込みの命令はない:raw * 255 // 1023 か自作の関数
17random / randomSeed乱数を作るimport random · random.randint(1, 6)(乱数)
18tone / noToneブザーで指定した周波数の音を鳴らし、止めるPWM:freq(440) · duty_u16(32768)。止めるにはduty_u16(0)
書き方は1対1で対応するわけではなく、最大の違いは数値の範囲にあります。UnoではanalogReadが0〜1023を返し、analogWriteは0〜255を受け取ります。Picoでは、ADC.read_u16もPWM.duty_u16も0〜65535を使います。Picoでアナログ値を読めるのはGP26、GP27、GP28だけで、測れるのは最大3.3 Vなので、ポテンショメーターは5 Vではなく3V3(OUT)につないでください。また、MicroPythonには既製のmapやtoneの命令がありません。スケーリングは簡単な掛け算と割り算で行い、音はPWMのfreqの設定で鳴らします。

MicroPythonコース:18枚のカードとArduinoでの書き方

MicroPythonコースはRaspberry Pi Picoを想定して書かれていて、カードの例はPicoで、たとえばThonnyから実行できる短いプログラムです。順番はArduinoコースと少し違います。Pythonでは、importでモジュールを追加する、printで表示する、インデントとコロンのルールといった、まず言語そのもののルールに慣れる必要があるからです。MicroPythonのカードのArduinoタブにも同じプログラムのC++版があるので、Arduinoをすでに知っているなら、表を右から左へ読むこともできます。Picoを初めて使うなら、Raspberry Pi Picoとは?の記事が、セットアップとピンの準備に役立ちます。

番号カード何ができますか?Arduinoでの書き方
1importとfrom … importmachineやtimeなどのモジュールをプログラムに追加するライブラリには#include。pinModeやdelayなどの基本的な命令は最初から使える
2printと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()
5time.sleepとsleep_msプログラムを秒単位またはミリ秒単位で止めるdelay()
6while True:による無限ループPicoの電源が入っている間、その下の行を繰り返すloop()
7インデントとコロン(:)どの行がどのブロックに属するかを決める波かっこ{ }とセミコロン;
8変数:int、float、str、bool値を保存する。型は自動的に決まるint、float、String、bool
9if / elif / elseとand / or / not条件で分岐し、条件を組み合わせるif / else if / else · &&、||、!
10forとrange決まった回数だけ繰り返す。range(0, 10)は0から9まで数えるfor (int i = 0; i < 10; i++)
11リスト:[ ]、インデックス、len複数の値を順番に保持する。最初の要素はインデックス0配列:int pins[] = {2, 3, 4};
12defとreturn(関数)使い回せるコードに名前を付け、結果を返すvoidまたは型付きの関数、return
13ADC:read_u16でアナログ値を読み取るGP26、GP27、GP28の電圧を0〜65535で読み取るanalogRead() → 0〜1023
14PWM:freqとduty_u16LEDを暗くしたり、ブザーで音符を鳴らしたりするanalogWrite()とtone()
15time.ticks_msとticks_diffコードを止めずに経過時間を計るmillis()
16Pin.irq:割り込みでボタンを処理するボタンが押された瞬間に関数を実行するattachInterrupt()
17try / except(エラーの捕捉)エラーが起きてもプログラムが止まらないようにするArduinoには一般的な対応するものがなく、戻り値を確認する
18I2Cと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)プロジェクトで、まさにこの違いを解説しています。

C++ (Arduino IDE)
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}
MicroPython
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 ms

2つ目の例では入力を加えます。ボタンを押している間だけ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に押しボタンをつなぐ方法の記事で紹介しています。

C++ (Arduino IDE)
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}
MicroPython
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 pause

3つ目の例は、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とは?の記事で、値をリアルタイムで確認する方法はシリアルモニタのガイドで紹介しています。

C++ (Arduino IDE)
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}
MicroPython
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〜1023ADC(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、analogWrite1〜5:import、print、ピンの出力、ピンの入力、time.sleepLEDの点滅、ボタンでLEDを点灯(押している間のみ)。Pico:Raspberry Pi Picoの内蔵LEDを点滅(PicoとPico W)LEDを点滅させ、ボタンを読み取る。Arduinoではアナログ値も確認
2週目6〜10:delay、millis、変数、if / else、演算子6〜9:while True、インデント、変数、if / elif / elseLDRで作る常夜灯、ESP32でボタンによるLED制御(トグル)。Pico:Raspberry Pi Picoで2個のLEDを交互に点滅(GP14+GP13)読み取った値で判断し、プログラムを止めずに時間を計る
3週目11〜14:for、while、関数、配列10〜13:forとrange、リスト、def、ADCKnight Rider風LED、流れるLED。Pico:Raspberry Pi Picoで信号機(3個のLEDを順に点灯、GP11/GP12/GP13)繰り返しをループに、ピンを配列に、処理を関数にまとめる
4週目15〜18:Serial、map、random、tone14〜18:PWM、ticks_ms、Pin.irq、try / except、I2Cブザーの使い方、LDRで光の強さを測定。Pico:Raspberry Pi Picoで信号機の4モードをボタンで切り替え(ステートマシン、GP11-13 + GP4)値を表示し、音と明るさを調整し、小さなプロジェクトを一から作る

1日20分の練習メニュー

  1. 3分、ウォームアップ:「学ぶ」セクションの今日のクイズを解くか、前日のミニテストをもう一度解きます。前日の命令を今日も覚えているかを確かめるのがねらいです。
  2. 5分、新しいカード:何ができますか?、なぜ?、構文のセクションを読みます。構文を紙に手で書き写しましょう。書き出すと、かっこやセミコロンを目で読み飛ばしにくくなります。
  3. 3分、例:例を1行ずつ自分に説明し、それからタブを切り替えます。ArduinoのカードではMicroPythonタブを、MicroPythonのカードではArduinoタブを見て、2つのプログラムで同じ働きをする行を照らし合わせます。
  4. 2分、ミニテスト:2問とも答え、間違えた問題の解説を読みます。このタイミングでよくある間違いとヒントのボックスにもう一度目を通しましょう。
  5. 6分、プロジェクト:プロジェクトで確認の一覧から無料の簡単なプロジェクトを開き、コードの中でその命令を見つけて、待ち時間、ピン番号、しきい値のどれか1つの値を変えます。回路ができていればボードに書き込み、できていなければ結果を予想して「コードを理解」で確かめます。
  6. 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、最大の明るさは65535analogWrite・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

ブロックタブ:見て命令を理解する

「LEDの点滅」プロジェクトの英語のブロック:ピン9をOUTPUTに設定し、ずっと繰り返す中でピン9にHIGHを書き込み、100 ms待ち、ピン9にLOWを書き込み、100 ms待つ
無料の「LEDの点滅」プロジェクトのブロック:「セットアップ(1回だけ実行)」ブロックがsetup()に、「ずっと繰り返す」ブロックがloop()に対応します。

ブロックタブを使うと、とくにコースの最初のほうのカードで、コードを書かずに命令が何をするかを確認できます。上の画像では、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の点滅

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

4.6(188)
1127
ボタンでLEDを点灯(押している間のみ)
#9初級

ボタンでLEDを点灯(押している間のみ)

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

4.8(113)
229
LDRで作る常夜灯
#12初級

LDRで作る常夜灯

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

4.8(102)
205
ESP32でボタンによるLED制御(トグル)
#105初級

ESP32でボタンによるLED制御(トグル)

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

4.6(39)
57
Knight Rider風LED
#6中級

Knight Rider風LED

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

4.8(106)
202
Raspberry Pi Picoの内蔵LEDを点滅(PicoとPico W)
#147初級

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)出力で、切り替わる様子をリアルタイムに確認できます。

5.0(1)
10
Raspberry Pi Picoで2個のLEDを交互に点滅
#149初級

Raspberry Pi Picoで2個のLEDを交互に点滅

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

5.0(2)
19
Raspberry Pi Picoで信号機(3個のLEDを順に点灯)
#150初級

Raspberry Pi Picoで信号機(3個のLEDを順に点灯)

赤・黄・緑のLEDで本物の信号機を再現する、Picoシリーズ初の3個のLEDを使うプロジェクトです!緑が4秒間「進め」、黄が1.5秒間「準備」、赤が3秒間「止まれ」、赤と黄が1秒間「発進準備」を示します(ヨーロッパの信号機のパターン)。関数の定義(def all_off())、状態機械の仕組み(順序)、複数のGPIOの同期を学びます。回路はとても簡単です。GP11(緑)、GP12(黄)、GP13(赤)に3個のLEDを接続し、それぞれに220Ωの電流制限抵抗を使います。

4.0(1)
12