W1 はじめての開発環境
タイトル:Arduino IDE / MicroPython / ESP-IDF を10分でセットアップ【Windows/Mac】
ゴール:LED点滅まで。
必要な物
- ボード:ESP32-C6 または Raspberry Pi Pico または Arduino Uno R4
- PC、USBケーブル
手順(概要)
- Arduino IDE:ボードマネージャで対象ボードを追加→サンプル「Blink」を書き込み。
- MicroPython(Pico):ThonnyでMicroPython FWを書き込み→REPLで点滅。
- ESP-IDF(ESP32):
idf.py create-project
→idf.py -p PORT flash monitor
で点滅。
コピペ用コード
Arduino(共通)
void setup(){ pinMode(LED_BUILTIN, OUTPUT); }
void loop(){ digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); delay(500); }
MicroPython(Pico)
from machine import Pin
import utime
led=Pin(25, Pin.OUT)
while True:
led.toggle(); utime.sleep_ms(500)
ESP-IDF(ESP32-C系)
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define LED GPIO_NUM_8
void app_main(void){
gpio_set_direction(LED, GPIO_MODE_OUTPUT);
while(1){ gpio_set_level(LED, 1); vTaskDelay(pdMS_TO_TICKS(500));
gpio_set_level(LED, 0); vTaskDelay(pdMS_TO_TICKS(500)); }
}
トラブルFAQ
- ポートが見えない:ケーブルのデータ線有無、ドライバ確認。
- 書き込み失敗:別のシリアルモニタを閉じる。
W2 配線の基本
タイトル:ブレッドボード超入門:LED・抵抗・ボタンの正しい挿し方
ゴール:スイッチでLEDをON/OFF。
必要な物
LED×1、抵抗220Ω×1、タクトスイッチ×1、ジャンパ線、ブレッドボード
手順
- LEDアノード→抵抗→GPIO、カソード→GND。
- スイッチを内蔵プルアップで使用。片側をGPIO、もう片側をGND。
- 押下で
LOW
となる前提で判定。
コピペ用コード(Arduino)
const int LED=13, BTN=2;
void setup(){ pinMode(LED,OUTPUT); pinMode(BTN,INPUT_PULLUP); }
void loop(){ digitalWrite(LED, digitalRead(BTN)==LOW); }
トラブルFAQ
- LED極性逆:長い脚がアノード。
- ボタン誤配線:内部で2端子が短絡している向きを確認。
W3 シリアル出力の読み方
タイトル:はじめてのSerial.printとprintf:デバッグは文字で見る
ゴール:センサー値をPCに表示。
必要な物
任意センサー(可変抵抗でも可)
手順
- ボーレートを決める(例 115200)。
- 初期化→ループで値を出力。
- CSV形式にすると後で分析しやすい。
コピペ用コード(Arduino)
void setup(){ Serial.begin(115200); }
void loop(){ int v=analogRead(A0);
Serial.print("adc,"); Serial.println(v); delay(200); }
ESP-IDF
#include "esp_log.h"
void app_main(){ while(1){ ESP_LOGI("APP","adc,%d", 123); vTaskDelay(pdMS_TO_TICKS(200)); } }
FAQ
- 文字化け:PC側ボーレートを一致。
- 出力が止まる:長い
delay()
でウォッチドッグに留意。
W4 デジタル入力の実践
タイトル:チャタリング対策の基礎:内蔵プルアップで安定ボタン
ゴール:押下/長押し/連打の判定。
手順
INPUT_PULLUP
でノイズ耐性。- ソフトウェア・デバウンス(10〜30ms)。
- 長押し判定は経過時間で閾値化。
コピペ用コード(Arduino)
const int BTN=2; unsigned long t_down=0; bool prev=HIGH;
void setup(){ pinMode(BTN,INPUT_PULLUP); Serial.begin(115200); }
void loop(){
bool now=digitalRead(BTN);
static unsigned long last=0; if(millis()-last<20) return; last=millis(); // debounce
if(prev==HIGH && now==LOW){ t_down=millis(); Serial.println("down"); }
if(prev==LOW && now==HIGH){
unsigned long dur=millis()-t_down;
Serial.println(dur>800?"long":"short");
}
prev=now;
}
W5 アナログ入力の基礎
タイトル:可変抵抗で明るさ調整:PWMとADCを同時に学ぶ
ゴール:ノブでLED調光。
コピペ用コード(Arduino)
const int POT=A0, LED=9; // 9はPWMピン
void setup(){}
void loop(){
int a=analogRead(POT); int pwm=map(a,0,1023,0,255);
analogWrite(LED,pwm); delay(10);
}
FAQ
- ちらつく:PWM周波数変更や容量追加で平滑。
W6 I2Cセンサー入門
タイトル:温湿度センサー(DHT20/SHTC3)を最短で読む
ゴール:温度/湿度を1秒ごとに表示。
手順
- SDA/SCLにプルアップ。
- ライブラリ導入→初期化→1秒周期で取得。
コピペ用コード(Arduino + AHT20互換)
#include <Wire.h>
#include <Adafruit_AHTX0.h>
Adafruit_AHTX0 aht;
void setup(){ Serial.begin(115200); Wire.begin(); aht.begin(); }
void loop(){ sensors_event_t h,t; aht.getEvent(&h,&t);
Serial.print(t.temperature); Serial.print(","); Serial.println(h.relative_humidity);
delay(1000);
}
W7 SPIデバイス入門
タイトル:小型OLEDにメニューを描く:SPIとフォント表示
ゴール:上下ボタンでメニュー操作。
コピペ用コード(Arduino + SSD1306 SPI)
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define W 128
#define H 64
Adafruit_SSD1306 disp(W,H,&SPI, /*DC*/9, /*RST*/8, /*CS*/10);
const char* items[]={"Temp","Config","Info"}; int idx=0;
void setup(){ disp.begin(SSD1306_SWITCHCAPVCC); disp.clearDisplay(); }
void draw(){
disp.clearDisplay(); for(int i=0;i<3;i++){ disp.setCursor(0, i*16);
disp.setTextSize(i==idx?2:1); disp.print(items[i]); }
disp.display();
}
void loop(){ draw(); /* BTNでidxを更新する処理を追加 */ delay(200);}
W8 無線のはじめの一歩(ESP32系)
タイトル:Wi-Fiに繋いでHTTPで値を送る【REST/JSON超入門】
ゴール:センサー値をWebにPOST。
コピペ用コード(Arduino + ESP32)
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid="SSID"; const char* pass="PASS";
void setup(){ Serial.begin(115200); WiFi.begin(ssid,pass);
while(WiFi.status()!=WL_CONNECTED) delay(300);
}
void loop(){
HTTPClient http; http.begin("http://example.com/api");
http.addHeader("Content-Type","application/json");
String body="{"temp":25.0}";
int code=http.POST(body); Serial.println(code);
http.end(); delay(5000);
}
W9 BLEのはじめの一歩(ESP32系)
タイトル:BLEビーコンとGATT:スマホから値を読む
ゴール:スマホアプリで温度を受信。
コピペ用コード(Arduino + ESP32 BLE)
#include <NimBLEDevice.h>
NimBLEServer* server; NimBLECharacteristic* ch;
void setup(){
NimBLEDevice::init("Demo");
server=NimBLEDevice::createServer();
auto svc=server->createService("1809");
ch=svc->createCharacteristic("2A1C", NIMBLE_PROPERTY::READ|NIMBLE_PROPERTY::NOTIFY);
svc->start(); server->getAdvertising()->start();
}
void loop(){
static float t=25.0; t+=0.1;
uint8_t buf[1]={0}; ch->setValue(buf,1); ch->notify(true); delay(1000);
}
W10 RTOS超入門
タイトル:FreeRTOSで“並行”を体験:タスク/キュー/ミューテックス
ゴール:計測と表示を別タスク化。
コピペ用コード(ESP-IDF)
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
QueueHandle_t q;
void sensor_task(void*){
int v=0; while(1){ v++; xQueueSend(q,&v,0); vTaskDelay(pdMS_TO_TICKS(500)); }
}
void display_task(void*){
int v; while(1){ if(xQueueReceive(q,&v,portMAX_DELAY)) { /* 表示 */ } }
}
void app_main(){ q=xQueueCreate(4,sizeof(int));
xTaskCreate(sensor_task,"s",2048,NULL,1,NULL);
xTaskCreate(display_task,"d",2048,NULL,1,NULL);
}
W11 ログと異常復帰
タイトル:ウォッチドッグで固まらせない:例外→自動リセット
ゴール:想定バグでWDT動作を確認。
コピペ用コード(ESP-IDF)
#include "esp_task_wdt.h"
void app_main(){
esp_task_wdt_init(3, true);
esp_task_wdt_add(NULL);
while(1){
// esp_task_wdt_reset(); // 故意に呼ばずリセットを体験
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
W12 省電力の基本
タイトル:スリープで電池長持ち:Deep-sleepと起床イベント
ゴール:1分ごとに起床→計測→送信→再スリープ。
コピペ用コード(ESP-IDF Deep Sleep)
#include "esp_sleep.h"
void app_main(void){
esp_sleep_enable_timer_wakeup(60ULL*1000*1000);
// 計測・送信処理
esp_deep_sleep_start();
}
省電力ポイント
- 無線は必要時のみON。
- ログは最小に。
- レギュレータの静止電流に注意。