Arduinoで理科の実験:センサーでデータを集めて表とグラフに
授業で使えるArduinoの理科実験。DS18B20、LDR、HC-SR04を使う3つの実験、CSVを出力するコード、シリアルプロッタ、グラフ、2コマの授業計画と実験レポートを紹介します。
Arduinoで理科の実験を行う手順は6つです。まず生徒が測定できる問いと仮説を書き、適切なセンサーをArduinoにつなぎます。ボードは測定値を1つずつタイムスタンプ付きで「zaman_ms,deger」(ミリ秒単位の時間、値)の形でシリアルポートに出力し、曲線をシリアルプロッタでリアルタイムに観察します。シリアルモニタの行をCSVファイルとして表計算ソフトにコピーし、表からグラフを描き、グラフと仮説を比べて結論を書きます。温度計とストップウォッチを使う手作業の測定と違い、Arduinoは10分間に60点を等間隔で、疲れることも読み間違えることもなく集めます。そのため生徒は数値を書き写す代わりに、データの解釈に集中できます。
この記事では、理科・物理・生物の授業に合う、すぐに使える3つの実験を紹介します。DS18B20で測るお湯の冷却曲線、LDRで調べる光の強さと距離の関係、HC-SR04で測る斜面上の運動(おまけとして音速の測定)です。どの実験にも、問い、変数、材料、配線の概要、そのままコンパイルできるコード、データ表のテンプレート、予想される結果をそろえました。続いて、シリアルプロッタの使い方と表計算ソフトへのデータの取り込み手順、測定誤差とキャリブレーションの表、2 × 40分の授業の流れ、短い実験レポートのテンプレート、安全上の注意をまとめています。例は次の前提で組み立てました。24人のクラスで、生徒は4人ずつ6グループに分かれ、各グループにArduino Uno 1台とパソコン1台があるとします。各センサーの配線の詳細はここでは扱わず、必要な箇所でそれぞれのセンサーのガイドにリンクしています。
Arduinoで理科の実験を6ステップで:問いから結論まで
- 問いと仮説:測定できる問いを選び(「お湯が冷めるのは最初の5分と次の5分のどちらが速い?」)、仮説を「もし…なら…になる。なぜなら…」の形で生徒に書かせます。仮説には向きか数値を入れます。「変化する」だけでは不十分です。
- 変数:独立変数(変えるもの:時間、距離、傾き)、従属変数(センサーが測るもの:温度、光、位置)、制御変数(そろえる条件:水の量、同じ懐中電灯、同じ板)を生徒に表へ書かせます。実験がうまくいかないとき、原因はたいてい一定に保たれなかった変数です。
- センサーとコード:センサーをつなぎ、コードを書き込みます。コードは各行を「zaman_ms,deger」の形で出力し、1行目は列の名前を示すヘッダー行です。時間はボード自身のmillis()カウンターで計るので、ストップウォッチは要りません。
- リアルタイム観察:本番の記録の前に、短い試運転をシリアルプロッタで観察します。曲線が思いがけず跳ねる場合(配線のゆるみ、影、手の接触)は、その場で直します。測定が終わってから気づいたのでは遅すぎます。
- データと表:シリアルモニタの行をコピーして.csvファイルとして保存し、表計算ソフトに取り込み、単位の換算(ms → s)と計算用の列を加えます。
- グラフと結論:XY(散布図)グラフを描き、両方の軸に名前と単位を書き、グラフを仮説と比べて、データに基づいた文で結論を書きます。「仮説は支持された(または支持されなかった)。なぜなら…」。
材料リストと配線の概要
| 材料 | 1グループあたり | クラス合計(6グループ) | 実験 |
|---|---|---|---|
| Arduino Uno + USBケーブル | 1 | 6 | すべて |
| パソコン(Arduino IDEをインストール済み) | 1 | 6 | すべて |
| ブレッドボード + オス・オスのジャンパーワイヤー10本 | 1セット | 6セット | すべて |
| 防水型DS18B20プローブ + 4.7 kΩの抵抗 | 1 + 1 | 6 + 6 | 1 冷却 |
| 耐熱マグカップ(約250 mL)+ 計量カップ | 1 + 1 | 6 + 6 | 1 冷却 |
| お湯(約60 °C、先生が配る) | 200 mL | 1.2 L + 予備 | 1 冷却 |
| LDR + 10 kΩの抵抗 | 1 + 1 | 6 + 6 | 2 光 |
| 小型のLED懐中電灯またはスマホのライト + メジャー | 1 + 1 | 6 + 6 | 2 光 |
| HC-SR04距離センサー | 1 | 6 | 3 運動 |
| 1〜1.5 mの平らな板、本2〜3冊、おもちゃの車 + 10 × 10 cmの厚紙 | 1セット | 6セット | 3 運動 |
| 実験用温度計(比較用) | ― | 1 | キャリブレーション |
| 実験 | センサー | Arduino Unoへの配線 | 追加の部品とメモ |
|---|---|---|---|
| 1 冷却 | DS18B20プローブ | 赤 → 5V、黒 → GND、黄(DQ) → D2 | 黄色の線と5Vの間に4.7 kΩの抵抗。ライブラリはOneWireとDallasTemperature |
| 2 光 | LDR | 片方の足 → 5V、もう片方の足 → A0 | A0とGNDの間に10 kΩの抵抗(分圧回路)。ライブラリは不要 |
| 3 運動と音 | HC-SR04 | VCC → 5V、GND → GND、Trig → D9、Echo → D10 | 追加の部品なし。センサー前方の約15°の円すい状の範囲には何も置かない |
実験1:お湯の冷却曲線(DS18B20)

問い:お湯は毎分同じだけ冷めるのでしょうか、それとも冷め方はだんだん遅くなるのでしょうか?仮説の例:「水と室温の温度差が大きいうちは速く冷め、差が小さくなるにつれて遅くなる。」独立変数は時間、従属変数は水温です。制御変数は水の量(200 mL)、容器の種類、机の上の置き場所、室温です。グループに2つ目の問いを出すこともできます。ふた付きとふたなしのマグカップ、あるいはガラスのコップと紙コップで違いはあるでしょうか?その場合は容器が独立変数になり、2つのグループが同時に測定して曲線を比べます。配線とライブラリのインストールはDS18B20のガイドを参照してください。DHT11しかない場合は、絶対に水に入れないでください。DHT11でできる安全な代わりの実験は、センサーを1分間手のひらで温めてから机に置き、空気中で冷めていく様子を測ることです(DHT11ガイド)。
1// Deney 1: Sıcak suyun soğuma eğrisi / Experiment 1: cooling curve of hot water
2// Kütüphaneler: OneWire + DallasTemperature / Libraries: OneWire + DallasTemperature
3#include <OneWire.h>
4#include <DallasTemperature.h>
5
6const int ONE_WIRE_PIN = 2; // DS18B20 veri (DQ) pini / data (DQ) pin
7const unsigned long INTERVAL_MS = 10000; // 10 saniyede bir ölçüm / one reading every 10 s
8const bool PLOTTER_MODE = false; // true: Serial Plotter için yalnız değer / value only for Serial Plotter
9
10OneWire oneWire(ONE_WIRE_PIN);
11DallasTemperature sensors(&oneWire);
12unsigned long startMs = 0;
13unsigned long lastMs = 0;
14
15void setup() {
16 Serial.begin(9600);
17 sensors.begin();
18 if (!PLOTTER_MODE) {
19 Serial.println("zaman_ms,sicaklik_C"); // CSV başlık satırı / CSV header line
20 }
21 startMs = millis();
22 lastMs = startMs - INTERVAL_MS; // ilk ölçüm hemen / first reading right away
23}
24
25void loop() {
26 unsigned long now = millis();
27 if (now - lastMs < INTERVAL_MS) {
28 return; // daha zamanı gelmedi / not time yet
29 }
30 lastMs += INTERVAL_MS; // kaymayan zamanlama / drift-free timing
31
32 sensors.requestTemperatures(); // ölçümü başlat (~750 ms) / start conversion (~750 ms)
33 float tempC = sensors.getTempCByIndex(0);
34 if (tempC == DEVICE_DISCONNECTED_C) { // sensör yanıt vermedi / sensor did not respond
35 return;
36 }
37
38 if (PLOTTER_MODE) {
39 Serial.print("sicaklik_C:");
40 Serial.println(tempC, 2);
41 } else {
42 Serial.print(now - startMs); // deney başından beri ms / ms since start
43 Serial.print(",");
44 Serial.println(tempC, 2);
45 }
46}| 時間(s) | 水温 T(°C) | 室温 T_room(°C) | 差 ΔT = T − T_room(°C) | 残っている割合 ΔT / ΔT₀ |
|---|---|---|---|---|
| 0 | … | … | … | 1.00 |
| 60 | … | … | … | … |
| 120 | … | … | … | … |
| 300 | … | … | … | … |
| 600 | … | … | … | … |
| 900 | … | … | … | … |
| 1200 | … | … | … | … |
コードは10秒ごとに1行を出力するので、20分の測定で120行になります。時間はボードのmillis()カウンターから取り、lastMsに毎回ちょうど10,000を足しているため、測定の間隔がずれていきません。この手法は「millis()とdelay()の違い」の記事で詳しく説明しています。コードの先頭にあるPLOTTER_MODEをtrueにすると時間の列が消え、シリアルプロッタは温度だけを描きます。上のテンプレートはレポートに載せる要約の表で、全データはCSVファイルに残ります。室温は実験の初めに同じセンサーで空気中の温度を測って書いておきます。予想される結果:曲線は直線ではなく、だんだん平らになっていく曲線です。最初の数分は温度が速く下がり、その後は下がり方がゆるやかになります。これはニュートンの冷却の法則によるもので、冷める速さは物体と周囲の温度差に比例します。最後の列を計算した生徒は、等しい時間ごとに温度差がほぼ同じ割合で小さくなることに気づきます。たとえば最初の8分で差が半分になったなら、次の8分でもまた半分になります。ふた付きのマグカップは、蒸発で失われる熱が少ないため、ゆっくり冷めます。生物の授業では、同じ実験を小さな容器と大きな容器で繰り返し、小さな動物ほど熱を速く失うのはなぜかという話し合いにつなげられます。
実験2:光の強さと距離(LDR)

問い:光源から離れるにつれて、光の強さはどのように弱くなるのでしょうか?距離が2倍になると、光は半分になるのでしょうか、それとも4分の1になるのでしょうか?仮説の例:「距離が2倍になると、光の強さは4分の1になる。」独立変数は懐中電灯からLDRまでの距離(10、15、20、30、40、50 cm)、従属変数はA0から読み取った値です。制御変数は同じ懐中電灯、同じ電池、懐中電灯をLDRに正面から向けること、周囲の明るさです。実験はブラインドを閉め、できれば教室の照明を暗くして行います。周囲の光が強いと、遠い距離では懐中電灯による光の分が埋もれてしまいます。この配線では光が強くなるほど読み取り値が大きくなります。分圧回路のしくみはLDRのガイドにあります。懐中電灯をメジャーに沿って動かし、各距離で値が落ち着くまで5秒待ち、シリアルモニタに出た連続する3つの値を表に書きます。初めに懐中電灯を消した状態で1回測っておきます。これが部屋の背景値です。いちばん遠い距離の値が背景値にとても近い場合は、その距離をグラフから外します。
1// Deney 2: Işık şiddeti ve mesafe / Experiment 2: light intensity and distance
2// Bağlantı: 5V - LDR - A0 - 10 kΩ - GND / Wiring: 5V - LDR - A0 - 10 kΩ - GND
3const int LDR_PIN = A0; // bölücünün orta noktası / divider midpoint
4const unsigned long INTERVAL_MS = 500; // yarım saniyede bir satır / one line every 0.5 s
5const int SAMPLES = 16; // ortalama için örnek sayısı / samples per average
6const bool PLOTTER_MODE = false; // true: Serial Plotter için yalnız değer / value only for Serial Plotter
7
8unsigned long startMs = 0;
9unsigned long lastMs = 0;
10
11int readAverage() {
12 long sum = 0;
13 for (int i = 0; i < SAMPLES; i++) {
14 sum += analogRead(LDR_PIN); // 0 (karanlık) ... 1023 (aydınlık) / dark ... bright
15 delay(2);
16 }
17 return (int)(sum / SAMPLES); // gürültüyü azaltır / reduces noise
18}
19
20void setup() {
21 Serial.begin(9600);
22 if (!PLOTTER_MODE) {
23 Serial.println("zaman_ms,ldr_ham"); // CSV başlık satırı / CSV header line
24 }
25 startMs = millis();
26 lastMs = startMs - INTERVAL_MS; // ilk ölçüm hemen / first reading right away
27}
28
29void loop() {
30 unsigned long now = millis();
31 if (now - lastMs < INTERVAL_MS) {
32 return;
33 }
34 lastMs += INTERVAL_MS;
35
36 int raw = readAverage();
37 if (PLOTTER_MODE) {
38 Serial.print("ldr_ham:");
39 Serial.println(raw);
40 } else {
41 Serial.print(now - startMs); // deney başından beri ms / ms since start
42 Serial.print(",");
43 Serial.println(raw);
44 }
45}| 距離 d(cm) | 1 / d²(1/cm²) | 測定値1 | 測定値2 | 測定値3 | 生の値の平均 | LDRの抵抗(Ω) |
|---|---|---|---|---|---|---|
| 懐中電灯オフ | ― | … | … | … | … | … |
| 10 | 0.0100 | … | … | … | … | … |
| 15 | 0.0044 | … | … | … | … | … |
| 20 | 0.0025 | … | … | … | … | … |
| 30 | 0.0011 | … | … | … | … | … |
| 40 | 0.0006 | … | … | … | … | … |
| 50 | 0.0004 | … | … | … | … | … |
コードは0.5秒ごとに16回の測定の平均を出力します。これで、1回ごとのanalogReadの値の小さなばらつきがならされます。LDRの抵抗を計算するには、生の値の平均がF列にあるなら、G列に=10000*(1023-F3)/F3と入力して下へコピーします(10 kΩの固定抵抗と、5VにつないだLDRの場合)。予想される結果:距離が大きくなるほど読み取り値は下がり、近くでは速く、遠くではゆっくり下がります。ただし、10 cmから20 cmになっても生の値は4分の1にはなりません。生の数値は光の強さではなく、分圧された電圧を表すものだからです。逆二乗の法則を確かめるには、距離とLDRの抵抗を両対数グラフにプロットします。点はほぼ一直線に並びます。光の強さは距離の2乗に反比例し、LDRの抵抗は光の強さのおよそγ乗に反比例します。そのため直線の傾きは2ではなく2 × γになります。一般的なLDRではγはたいてい0.5〜0.9なので、傾きは1〜1.8くらいになると予想されます。高校物理では、「測定器そのものの性質は結果にどう影響するのか?」という問いを考えるよいきっかけになります。
実験3:斜面上の運動と音速(HC-SR04)

問い:斜面で手を離した車は一定の速さで下るのでしょうか、それともどんどん速くなるのでしょうか?傾きを大きくすると、加速の仕方はどう変わるのでしょうか?仮説の例:「車は等しい時間ごとに進む距離がだんだん長くなるので、速くなっていく。傾きが急なほど速く加速する。」独立変数は時間(2回目の測定では傾き:本1冊、2冊、3冊)、従属変数はセンサーから車までの距離です。制御変数は車、手を離す位置、板です。準備:1〜1.5 mの平らな板の片方の端を本で持ち上げ、低い側の端にHC-SR04を板の上方へ向けて置きます。おもちゃの車の後ろに10 × 10 cmの厚紙を貼ります。センサーは小さくて丸い物体からは安定した反響を得られませんが、平らな厚紙なら強い反響が返ってきます。車をセンサーから約100 cmの位置で持ってから手を離し、車がセンサーにぶつからないよう、センサーの前に本を置きます。センサーのしくみと測定範囲はHC-SR04のガイドで説明しています。
1// Deney 3: Eğik düzlemde hareket ve ses hızı / Experiment 3: motion on a ramp and speed of sound
2const int TRIG_PIN = 9; // tetik / trigger
3const int ECHO_PIN = 10; // yankı / echo
4const unsigned long INTERVAL_MS = 60; // ölçümler arası en az ~60 ms / at least ~60 ms between pings
5const bool PLOTTER_MODE = false; // true: Serial Plotter için yalnız değer / value only for Serial Plotter
6const bool RAW_ECHO_US = false; // true: ses hızı deneyi için yankı süresi (µs) / echo time for speed of sound
7
8unsigned long startMs = 0;
9unsigned long lastMs = 0;
10
11void setup() {
12 pinMode(TRIG_PIN, OUTPUT);
13 pinMode(ECHO_PIN, INPUT);
14 digitalWrite(TRIG_PIN, LOW);
15 Serial.begin(9600);
16 if (!PLOTTER_MODE) {
17 Serial.println(RAW_ECHO_US ? "zaman_ms,yanki_us" : "zaman_ms,mesafe_cm"); // CSV başlığı / CSV header
18 }
19 startMs = millis();
20 lastMs = startMs - INTERVAL_MS; // ilk ölçüm hemen / first reading right away
21}
22
23void loop() {
24 unsigned long now = millis();
25 if (now - lastMs < INTERVAL_MS) {
26 return;
27 }
28 lastMs += INTERVAL_MS;
29
30 digitalWrite(TRIG_PIN, LOW);
31 delayMicroseconds(2);
32 digitalWrite(TRIG_PIN, HIGH); // 10 µs tetik darbesi / 10 µs trigger pulse
33 delayMicroseconds(10);
34 digitalWrite(TRIG_PIN, LOW);
35
36 unsigned long echoUs = pulseIn(ECHO_PIN, HIGH, 25000UL); // en fazla 25 ms (~4 m) / max 25 ms (~4 m)
37 if (echoUs == 0) { // yankı yok, satırı atla / no echo, skip the line
38 return;
39 }
40 float distanceCm = echoUs * 0.0343 / 2.0; // 343 m/s, gidiş-dönüş / round trip
41
42 if (PLOTTER_MODE) {
43 Serial.print("mesafe_cm:");
44 Serial.println(distanceCm, 1);
45 } else {
46 Serial.print(now - startMs); // deney başından beri ms / ms since start
47 Serial.print(",");
48 if (RAW_ECHO_US) {
49 Serial.println(echoUs);
50 } else {
51 Serial.println(distanceCm, 1);
52 }
53 }
54}| 列 | 見出し | 内容または数式 | 表すもの |
|---|---|---|---|
| A | zaman_ms | CSVから | 測定開始からの経過時間(zamanはトルコ語で「時間」) |
| B | mesafe_cm | CSVから | センサーから車までの距離(mesafeはトルコ語で「距離」) |
| C | zaman_s | =A2/1000 | グラフの横軸 |
| D | yol_cm | =B$2-B2 | 手を離した位置から進んだ距離(yolはトルコ語で「道のり」) |
| E | hiz_cm_s | =(D7-D2)/(C7-C2)、E7から開始 | 約0.3 sの区間の平均の速さ(hizはトルコ語で「速さ」) |
| F | kosul | 本1冊、2冊、3冊 | その行がどの試行のものか(kosulはトルコ語で「条件」) |
コードは60 msごと、つまり1秒間に約16行を出力します。HC-SR04の反響が混ざらないよう、測定の間にはこのくらいの間隔をあけることが推奨されています。反響が戻らない場合(物体が測定範囲の外にある、または斜めを向いている)、その行は飛ばされます。速さは連続する2行からではなく、5行離れた行から計算します。60 msの間隔では、1〜2 mmの測定のばらつきでも速さが大きく揺れるためです。予想される結果:位置-時間グラフは直線ではなく、だんだん傾きが急になる曲線(放物線)になり、速さ-時間グラフはほぼ直線になります。つまり車は一定の加速度で速くなり、その直線の傾きが加速度を表します。摩擦のない斜面なら加速度はg × sin θになります。1.5 mの板を10 cm持ち上げるとsin θ ≈ 0.067なので、およそ65 cm/s²です。測定値がこれより小さくなるのは摩擦と車輪の回転のためで、誤差の原因としてレポートに書きます。音速を測るバリエーション:RAW_ECHO_USをtrueにし、センサーの正面20、40、60、80、100 cmの位置に平らな厚紙を置き、各距離で反響時間の平均を取ります。横軸に往復の距離(2 × d)、縦軸に時間をとったグラフでは、傾きが1/vになります。vは室温で約340 m/sになり、温度が上がると大きくなります(およそv ≈ 331 + 0.6 × T m/s)。傾きを使う方法なら、センサー内部の一定の遅れも自動的に取り除かれます。
シリアルプロッタと表計算ソフトへのデータの取り込み
- コードを書き込んだら「ツール」>「シリアルモニタ」を開き、速度をコードと同じ9600ボーにします。タイムスタンプのボタンはオフにしておきます。オンだと各行の先頭にパソコンの時刻が付き、CSVが崩れます。
- 測定を始める前に出力をクリアし、ボードのRESETボタンを押します。これで時間が0から始まり、1行目はzaman_ms,sicaklik_Cのようなヘッダー行になります(sicaklikはトルコ語で「温度」)。
- リアルタイムのグラフを見るには、コードのPLOTTER_MODEをtrueにして書き込み直し、「ツール」>「シリアルプロッタ」を開きます。シリアルプロッタはデータを表示するだけで保存はしません。試運転で使い、本番の記録ではPLOTTER_MODEをfalseに戻します。
- 測定が終わったら、シリアルモニタの行をヘッダー行から最後の行までマウスで選択し、Ctrl+C(macOSではCmd+C)でコピーします。テキストエディターに貼り付け、group2-cooling-1104.csvのようにグループ、実験、日付を含む名前で保存します。
- 表計算ソフトにファイルを取り込みます。Excelでは「データ」>「テキストまたはCSVから」、Googleスプレッドシートでは「ファイル」>「インポート」を使い、LibreOffice Calcではそのままファイルを開きます。区切り文字にはコンマを選びます。
- 小数点の記号に注意してください。Arduinoは23.50のようにドットで数値を書きますが、ヨーロッパの多くの地域設定の表計算ソフトはコンマを想定しています(日本語の設定ではドットなので通常は問題ありません)。必要なら取り込み時に地域を「英語(米国)」にするか、ドットをコンマに置き換えます。そうしないと23.50が文字列や日付として読み込まれ、グラフが空になります。
- 計算用の列(ms → s、差、割合、速さ)を加え、グラフはXY散布図で描きます。折れ線グラフは横軸を等間隔のカテゴリーとして扱うため、飛ばされた行があると時間軸がゆがみます。
よい実験グラフには4つの要素があります。横軸に独立変数、縦軸に従属変数、両方の軸に名前と単位(「時間(s)」「温度(°C)」)、そして何を表すかを示すタイトル(「ふたなしのマグカップに入れた200 mLの水の冷却」)です。同じグラフに2つの条件(ふた付きとふたなし、本1冊と3冊)を違う色で示すと、ひと目で比較できます。生徒がグラフを見る前に、「仮説が正しければ、グラフはどんな形になるはず?」という問いに紙の上のラフスケッチで答えさせます。実際のグラフをスケッチと並べるのが、結論を書くいちばん簡単な方法です。結論は必ず数値に基づかせます。「水は最初の5分で…°C、次の5分で…°C冷めた。」シリアルプロッタで目盛りを固定したり線にラベルを付けたりする方法はシリアルモニタのガイドで説明しています。長い測定を手でコピーしたくない場合は、Pythonでデータを直接ファイルに書き出すこともできます。パソコンなしで測定するならSDカードモジュールにCSVを記録します。
測定誤差とキャリブレーション
| 項目 | 知っておくこと | 授業でやること |
|---|---|---|
| DS18B20の精度 | −10〜+85 °Cで±0.5 °C。12ビットでは1回の測定に約750 msかかります。 | 測定前に、すべてのプローブを同じ氷水の容器に入れます。それぞれが0 °Cからどれだけずれているかを記録し、表で補正します。 |
| DHT11の精度 | 0〜50 °Cで±2 °C。測定は最大で1秒に1回、反応が遅い。 | 絶対に水に入れず、空気中の実験だけに使います。1秒に1回より頻繁に読み取らないようにします。 |
| LDR | 線形ではなく、部品ごとに特性が違います。光が変わってから値が落ち着くまで時間がかかります。 | 実験の間は同じLDRを使い、各距離で5 s待ち、結果はそのグループのデータの中だけで解釈します。 |
| HC-SR04 | 2〜400 cm、分解能は約3 mm。音速は1 °Cあたり約0.6 m/s変わります。約15°の円すい状の範囲。 | メジャーで20 cmと50 cmの位置を確認します。対象は平らでセンサーの正面を向いていて、間にほかの物がないようにします。 |
| サンプリングの頻度 | 測定が少なすぎると曲線の形を見逃し、多すぎるとノイズと不必要に大きなファイルが生じます。 | 現象の長さで選びます。冷却は10 s、光は0.5 s、運動は60 ms。現象の間に少なくとも20〜30点を目標にします。 |
| 繰り返し測定 | 1回だけの測定は偶然かもしれません。繰り返すことで、結果がどれだけ信頼できるかがわかります。 | 各条件を少なくとも3回測ります。平均と、最大値と最小値の差(ばらつき)をレポートに書きます。 |
| 時間 | 手で持つストップウォッチでは、人の反応時間が約0.2 sあります。 | 時間の計測はボードのmillis()カウンターに任せます。手での計時は確認用にだけ使います。 |
授業の流れ:2 × 40分
以下の流れは3つの実験のどれにも使えます。初めての授業では、全グループに実験1を割り当てるのがおすすめです。準備がいちばん簡単で、測定が自動で進んでいる間にグループは表の準備ができます。クラスが慣れてきたら、6グループを2グループずつ3つのステーションに分けられます。同じ実験を2グループが行うと、結果を互いに比べることもできます。授業前にボードへコードを書き込んでおくと、1コマ目の8〜10分を節約できます。大人数のクラスでの役割カードとステーションの配置は「大人数のクラスでArduinoを教える」の記事を、材料と机の配置は「学校にArduinoラボをつくる」のガイドを参照してください。
| 授業と時間(分) | 先生 | グループ | 成果物 |
|---|---|---|---|
| 1コマ目、0〜5 | 身近な観察から問いを投げかける:「お茶が最初の数分でいちばん速く冷めるのはなぜ?」 | 問いをノートに書き、最初の予想を発表する。 | 実験の問い |
| 1コマ目、5〜12 | 仮説の型と変数の種類を説明し、役割を割り当てる:実験係、時間・確認係、データ係、報告係。 | 仮説と変数の表を書く。 | 仮説と変数の表 |
| 1コマ目、12〜20 | 配線の表を示す。コードは事前に書き込んでおいてもよい。 | 回路を組み、シリアルモニタでヘッダー行と最初の値を確認する。 | 動作する回路 |
| 1コマ目、20〜35 | グループを回り、制御変数を確認する。 | 測定する:冷却は15分、光は7条件 × 3回、運動は3種類の傾き × 3回。 | 生データ |
| 1コマ目、35〜40 | ファイル名の付け方のルールを確認する。 | データをコピーして.csvで保存し、共有フォルダーに入れる。 | CSVファイル |
| 2コマ目、0〜10 | 小数点の記号と取り込みの手順を黒板で示す。 | CSVを表計算ソフトに取り込み、計算用の列を加える。 | 整理された表 |
| 2コマ目、10〜22 | 軸の名前、単位、タイトルのルールを確認する。 | XYグラフを描き、仮説のスケッチと比べる。 | グラフ |
| 2コマ目、22〜32 | 誤差の表のどの行がそのグループの実験に当てはまるかを尋ねる。 | 結論と誤差の原因を書く。 | 結論と誤差の段落 |
| 2コマ目、32〜37 | グラフ巡りを進行する。 | 隣のグループに自分たちのグラフを1分で説明し、質問を1つ受ける。 | 相互フィードバック |
| 2コマ目、37〜40 | 下のまとめの質問から2つを出す。 | 短い答えを紙に書く。 | まとめの質問カード |
- 独立変数と従属変数は何でしたか?どの変数を一定に保ちましたか?
- グラフのどの部分で変化がいちばん速いですか?それはグラフのどこからわかりますか?
- 仮説は支持されましたか?どの2つの数値をもとにそう言えますか?
- 10秒ごとではなく60秒ごとに測っていたら、グラフはどう変わったでしょうか?
- いちばん大きな誤差の原因は何でしたか?もう一度実験するとしたら、何を変えますか?
評価:短い実験レポートのテンプレート
- タイトルと問い:実験の名前、グループのメンバー、日付、1文で書いた実験の問い。
- 仮説:「もし…なら…になる。なぜなら…」の形で、測定前に書いたとおりのもの。あとから直しません。
- 変数:独立変数、従属変数、少なくとも2つの制御変数。
- 材料と方法:センサー、配線の概要、測定間隔、繰り返しの回数。ほかのグループが同じ実験を再現できるくらい明確に、6ステップ以内で。
- データ:テンプレートのような要約の表と、CSVファイルの名前。
- グラフ:軸の名前、単位、タイトルの入ったXYグラフ。
- 結論:仮説は支持されたか?1つか2つの数値に基づいた2〜3文。
- 誤差の原因と改善点:少なくとも2つの誤差の原因と、実験を繰り返すなら何を変えるか。採点には、「Arduinoプロジェクト評価のルーブリック」の記事の観点をこれらの項目に合わせて使えます。
アプリにある既製のセンサープロジェクト、「コードを理解」、ツール
BlueGraysには、これらの実験で使うすべてのセンサーについて、回路図、部品リスト、コードのそろった既製のプロジェクトがあります。生徒は実験の前に、これを使ってセンサーに慣れておけます。無料のものはLDRで光の強さを測定、HC-SR04で距離を測定(シリアルモニタ表示)、DHT11で温度と湿度を測定です。ESP32を使う場合は、ESP32とLDRモジュールで光の強さを読み取る、ESP32とHC-SR04で作る超音波距離計、ESP32 DHT22温湿度計(LCDディスプレイ付き)も無料です。無料のプロジェクトではブロックと「コードを理解」のセクションも使えます。生徒はコードの働きをステップごとに読み、「自分で試す」の課題で小さな変更を自分で加えます。授業でのこのセクションの使い方は「コードを理解」のガイドにあります。LDRの実験で分圧された電圧を計算するには「分圧回路」ツール(プレミアム)が、抵抗の確認には無料の「カラーコード」ツールと「オームの法則」ツールが役立ちます。温度をLCDに表示するNTCと2x16 LCDディスプレイで温度を測定や、データをmicroSDカードに保存するESP32温度データロガー(DHT22 + DS1307 RTC + microSD + OLED)のようなプレミアムのセンサープロジェクトをクラス全員に開放したい場合は、1回限りの購入の教育者向けパッケージが用意されています。生徒はカードを登録せずにプレミアムを使えます。
安全:お湯、電気、水の近くでの作業
- お湯:沸騰したお湯は使いません。約60 °Cで十分で、それでもはっきりした曲線が得られます。お湯は先生が配り、マグカップはケーブルが引っかからない机の中央に置きます。測定中はマグカップを手で持ったり動かしたりしません。
- 水と電気:水に入れるのは防水型プローブの金属の先端だけです。Arduino、ブレッドボード、パソコンは水から少なくとも30 cm離し、できれば別のトレーに置きます。机に水がこぼれたら、まずUSBケーブルを抜いてから拭き取ります。
- 電源はUSBだけ:これらの実験はすべてパソコンのUSBポートから給電します。商用電源につながる機器(電気ケトル、ライト、ヒーター)をArduinoの回路に接続することは決してありません。
- 配線:配線の作成や変更は、必ずUSBを抜いた状態で行います。部品が熱くなったり、においがしたりしたら、すぐにUSBを抜きます。
- 光:懐中電灯を人の目に向けないでください。強いLED懐中電灯を近くで見ると、目に負担がかかります。
- 斜面:板が机の端からはみ出さないようにし、車はセンサーにぶつかる前に本で止め、板の下の本は滑らないように置きます。
1つのセンサー、整ったCSV出力、よく練られた問いがあれば、理科の実験は教科書の結果をなぞる作業から本物の測定研究に変わります。生徒は自分でグラフを描き、自分たちの誤差の原因を話し合い、自分たちの数値で結論を説明します。実験の前にセンサーに慣れ、スマホで回路をステップごとに組んでみたい場合は、BlueGraysアプリの無料のLDR、HC-SR04、DHT11のプロジェクトから始められます。
よくある質問
Arduinoでどんな理科の実験ができますか?
センサーで測れる量なら、どれも実験になります。温度(冷却、加熱、断熱)、光(距離、カラーフィルター)、距離と運動(斜面、振り子)、土壌水分(植物の実験)、音、気圧などです。最初は、冷却曲線、光と距離、斜面の実験の3つが、準備がいちばん簡単で結果もいちばんはっきり出ます。
ArduinoのデータをExcelに取り込むには?
いちばん簡単なのは、コードでデータを「zaman_ms,deger」のようなコンマ区切りの行としてシリアルポートに出力する方法です。シリアルモニタの行をコピーして.csvファイルとして保存し、Excelの「データ」>「テキストまたはCSVから」で取り込みます。Excelが小数点の記号にコンマを使う設定になっている場合は、取り込み時に地域を「英語(米国)」にしてください。そうしないと数値が文字列として読み込まれます。
Arduinoのシリアルプロッタはデータを保存しますか?
いいえ。シリアルプロッタはリアルタイムのグラフを表示するだけで、データをファイルには書き出しません。データを残すには、シリアルモニタのCSVの行をコピーするか、Pythonのスクリプトでファイルに書き出すか、SDカードモジュールを使う必要があります。
理科の実験にはDS18B20とDHT11のどちらを使うべきですか?
水やほかの液体を測るなら、防水プローブ版のDS18B20を使います。±0.5 °Cの精度と水に入れられる先端で、冷却の実験に向いています。DHT11は空気の温度と湿度を±2 °Cの精度で測るもので、水には入れられず、反応も遅いため、空気中の実験だけに使います。
Arduinoで音速を測るには?
HC-SR04の反響時間をマイクロ秒単位で出力し、センサーの正面のいろいろな距離に平らな厚紙を置きます。往復の距離(2 × 距離)と反響時間の関係をグラフにすると、直線の傾きから音速が求まります。室温では約340 m/sになります。
Arduinoの理科の実験には何コマの授業が必要ですか?
1つの実験には40分の授業が2コマあれば十分です。1コマ目で仮説、準備、測定を、2コマ目で表、グラフ、結論、レポートを行います。授業前にボードへコードを書き込んでおけば、1コマ目の測定に使える時間が増えます。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
LDRで光の強さを測定
部屋の明るさを数値で見てみませんか?光に反応する小さな部品、LDRで周囲の光を測定し、Arduinoが0.5秒ごとにその値をコンピューターの画面に表示します。手で覆うと数値が変わる様子を確認できます。自動で点灯する常夜灯などのプロジェクトへの第一歩です。

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

DHT11で温度と湿度を測定
部屋の温度は何度で、空気は湿っているでしょうか、それとも乾燥しているでしょうか?DHT11センサーが温度と湿度を測定し、Arduinoが2行のLCDディスプレイに値を表示して、数秒ごとに更新します。センサーに異常があればエラーメッセージが表示されます。自分だけの小さな気象観測装置を作る第一歩です。

ESP32とLDRモジュールで光の強さを読み取る
LDRモジュールの生のADC値と、暗い状態・明るい状態の基準値から計算した相対的な明るさの割合を、シリアルモニタでリアルタイムに確認します。この割合はルクスの測定値ではありません。モジュールの校正の仕組みを学べます。しきい値の決定に使うため、プロジェクト10の前に取り組むのが適しています。

ESP32とHC-SR04で作る超音波距離計
HC-SR04超音波センサーは、発した音波が物体に反射して戻るまでの時間(Time of Flight)を測定して距離を計算します。このプロジェクトでは、ESP32からセンサーのTRIGピンに10マイクロ秒のパルスを送り、ECHOピンからの反射波の持続時間をpulseIn()で読み取ります。計算した距離をcm単位で16x2 I2C LCDに表示します。HC-SR04は5Vで動作するため、ECHOピンには分圧回路が必須です。分圧しないとESP32の3.3V GPIOが破損します。

ESP32 DHT22温湿度計(LCDディスプレイ付き)
DHT22センサーで周囲の温度と湿度を測定し、16x2 I2C LCDにリアルタイムで表示するプロジェクトです。Adafruit DHTライブラリを使い、1本の信号線を使うプロトコルでセンサーからデータを読み取ります。IoT気象観測装置やスマートホームの自動化、温室の環境監視システムの基礎となります。ESP32のGPIO 4ピンを介してDHT22と通信します。

NTCと2x16 LCDディスプレイで温度を測定
小さなビーズのようなセンサーで周囲の温度を測ります。NTCというこの部品は、温まるほど電気が流れやすくなります。Arduinoがその変化を読み取り、数式で摂氏温度に変換して、2行のLCDディスプレイに0.5秒ごとに表示します。手のひらでセンサーを温めて、数値が上がる様子を見るのも楽しみの1つです。

ESP32温度データロガー(DHT22 + DS1307 RTC + microSD + OLED)
ESP32で日時付きの温度・湿度記録システムを作ります!DHT22で1分ごとに温度と湿度を読み取り、DS1307 RTCから取得した日時とともにmicroSDカードへCSV形式で記録します。OLEDには最新の温度を大きな文字で表示し、湿度のパーセント値、日時、総記録数も表示します。SDカードの/temp_log.csvファイルはExcel、Google Sheets、Pythonのpandasで開いて分析できます。温室の監視、家や部屋の温度管理、実験室のデータ収集、食品の保管環境や養蜂箱の監視に適しています。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

