24 November 2025, Monday

ESP8266開発ボードをArduino IDE / Ubuntu Linuxでプログラミングする第一歩

数年ぶり(?)にESP8266の書き込みを行うことになり、Ubuntu LinuxにArduino IDEのセットアップを行うところから「試行錯誤」したメモ。

どうやるのか完全に忘れ去っているので、Google Gemini AIに質問しまくって、ほぼ1時間ほど掛かってシリアル出力とLEDフラッシュのテストプログラムの書き込みを完了した。

検証環境

OSは

・Ubuntu 22.04LTS

20251124-esp8266-devkit.jpg
利用したESP8266開発ボードは2種類

・WeMos X-8266
・WeMos D1 mini

Arduino IDEのセットアップ(インストール)

最近はdebパッケージやzipファイルの展開をする必要もなく、ダウンロードしたAppImageファイルを実行するだけなんですね。

Arduino IDEは公式Webから最新版の次のものをダウンロードした。

Arduino IDE 2.3.6 - Linux AppImage (64bit X86-64)

ダウンロードしたファイルを、適当なディレクトリに移動して、実行可能属性をつければ完了。

ファイルサイズをターミナルで表示した
$ ll ~/ArduinoIDE/
合計 196512
drwxrwxr-x  2 vm vm      4096 2025-11-24 12:06:30 ./
drwxr-x--- 57 vm vm      4096 2025-11-24 18:55:23 ../
-rwxrwxr-x  1 vm vm 200980456 2025-11-23 19:35:30 arduino-ide_2.3.6_Linux_64bit.AppImage*
-rw-rw-r--  1 vm vm    232496 2025-11-24 12:06:17 arduino_icon.svg

ターミナルから実行すると、IDEのメインウインドウが表示される。

20251124-ide-mainwindow.jpg
Arduino IDE Version 2.3のメインウインドウ (一連のセットアップ作業が完了した時点のもの)

日本語化

日本語リソースはデフォルトで組み込まれているので、基本設定ダイアログで次のように設定するだけ。

Arduino IDEメインウインドウの「ファイル」メニュー → 「基本設定」ダイアログ → 「エディター言語」を日本語に設定する。

ESP8266のボードマネージャを登録

Arduino IDEメインウインドウの「ファイル」メニュー → 「基本設定」ダイアログ → 「追加のボードマネージャのURL」に次のJSONリソースファイル名を設定する。

https://arduino.esp8266.com/stable/package_esp8266com_index.json

マイコンボード種別の選択

Arduino IDEメインウインドウの「ツール」メニュー → 「ボード」 → 「ボードマネージャ」で次の項目をインストールするする。

esp8266 by ESP8266 Comunity, Version 3.1.2(最新版の選択肢)

20251124-ide-add-board.jpg

リソースがインストールされたら、ESP8266関連のボードがメニューに表示される。

再びArduino IDEメインウインドウの「ツール」メニュー → 「ボード」 → 「ESP8266」 → 「Generic ESP8266 Module」を選択する。

20251124-ide-select-board.jpg

シリアルポートの選択、設定

次に接続ポートの設定を行う。

ESP8266をUSBに接続して、Arduino IDEメインウインドウの「ツール」メニュー → 「ポート」 → 「/dev/ttyUSB0」選択する。

さらに、接続スピードは 115,200 bps とするように、「ツール」メニューのUpload Speedで選択する。(シリアルモニタについても、利用時にはこの接続速度に設定すること)

最終確認

ボードとポートの設定が正しく行われたか、確認を行うこと。

20251124-ide-mainwindow-setup.jpg
"Arduino IDEでボードとポートが正しく設定されたか確認する

シリアルポートとして正常に認識しない、機能しない場合の対処法

/dev/ttyUSB* への書き込み権限の付与

はじめてシリアル/USB変換デバイスを利用する場合は、ユーザ権限で書き込み権限が無いはずだ。

シリアルポートデバイスの状態をターミナルで表示
$ ll /dev/ttyUSB0 
crw-rw---- 1 root dialout 188, 0 2025-11-24 16:19:52 /dev/ttyUSB0

この場合、次の方法のいずれかを実施する。

1) 現在のユーザをdialoutグループに追加する

グループに追加し、結果を確認する
$ sudo usermod -a -G dialout $USER

$ groups $USER
vm : vm dialout sudo video sambashare

2) udevルールを設定する

USBデバイスのVendor/Manufucture IDを得る
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 046d:c534 Logitech, Inc. Unifying Receiver
Bus 001 Device 004: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
Bus 001 Device 003: ID 8087:0a2a Intel Corp. Bluetooth wireless interface
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

udevルールを追加する

/etc/udev/rules.d/50-udev.rules に次の設定行を追加
# ESP8266 WeMos X-8266 DevBoard
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="0666"

brltty-udev.serviceと干渉してシリアルポートデバイスとして認識しない場合

エラーメッセージで次のように表示された場合、brlttyが干渉している。

エラーメッセージ
$ sudo dmesg |less
[ 1802.290868] usb 1-5: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.62
[ 1802.290879] usb 1-5: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[ 1802.290883] usb 1-5: Product: USB2.0-Serial
[ 1802.293017] ch341 1-5:1.0: ch341-uart converter detected
[ 1802.293730] usb 1-5: ch341-uart converter now attached to ttyUSB0
[ 1802.865843] input: BRLTTY 6.4 Linux Screen Driver Keyboard as /devices/virtual/input/input32
[ 1802.965617] usb 1-5: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1
[ 1802.967194] ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0
[ 1802.967226] ch341 1-5:1.0: device disconnected

この場合、次の3つの方法のいずれかを試す。

1) brltty パッケージを削除

同時に削除されてしまうパッケージに問題がなければ、パッケージ削除を行う。ただし、apt-cache rdepends brlttyコマンドで依存パッケージを観察すると、Ubuntuデスクトップのコアパッケージがズラッと列挙されるため、brlttyパッケージは削除しないほうが良いと思われる。

brltty パッケージを削除
$ sudo apt remove --simulate brltty

$ sudo apt remove brltty

2) サービスを無効化する

brltty-udevサービスの無効化
$ sudo systemctl disable brltty-udev.service

3) brltty が対象デバイスを検出するのを阻止する

brlttyのudevルールを修正する

/usr/lib/udev/rules.d/85-brltty.rules の特定箇所をコメントアウト
# Device: 1A86:7523 
# Baum [NLS eReader Zoomax (20 cells)] 
# ENV{PRODUCT}=="1a86/7523/*", ENV{BRLTTY_BRAILLE_DRIVER}="bm", GOTO="brltty_usb_run"

テストプログラムの書き込み

LEDフラッシュ、シリアル出力のテストプログラム

起動したら"ESP8266 start ..."をシリアル出力し、その後GPIO 0に接続したLEDを点滅させるとともに、"GPIO-0 ON"の文字列をシリアル出力するループ処理を行う。

ソースコードは次の通り。

テストプログラムのC言語ソースコード
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(500);
  Serial.println();
  Serial.println("ESP8266 start ...");
  
  pinMode(0, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
  Serial.println("GPIO-0 ON");
  digitalWrite(0, HIGH);
  delay(1000);
  digitalWrite(0, LOW);
}

コンパイルおよび書き込み

エラー確認のため、まずコンパイルを行う。エラーが報告されなければ、書き込みを行う。

20251124-ide-compile.jpg

コンパイル時の出力ウインドウの内容例
. Variables and constants in RAM (global, static), used 28196 / 80192 bytes (35%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ DATA     1496     initialized variables
╠══ RODATA   948      constants       
╚══ BSS      25752    zeroed variables
. Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 60267 / 65536 bytes (91%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ ICACHE   32768    reserved space for flash instruction cache
╚══ IRAM     27499    code in IRAM    
. Code in flash (default, ICACHE_FLASH_ATTR), used 236212 / 1048576 bytes (22%)
║   SEGMENT  BYTES    DESCRIPTION
╚══ IROM     236212   code in flash   
書き込み時の出力ウインドウの内容例
. Variables and constants in RAM (global, static), used 28196 / 80192 bytes (35%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ DATA     1496     initialized variables
╠══ RODATA   948      constants       
╚══ BSS      25752    zeroed variables
. Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 60267 / 65536 bytes (91%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ ICACHE   32768    reserved space for flash instruction cache
╚══ IRAM     27499    code in IRAM    
. Code in flash (default, ICACHE_FLASH_ATTR), used 236212 / 1048576 bytes (22%)
║   SEGMENT  BYTES    DESCRIPTION
╚══ IROM     236212   code in flash   
esptool.py v3.0
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 68:c6:3a:e1:53:ff
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0340
Compressed 270304 bytes to 198818...
Writing at 0x00000000... (7 %)
Writing at 0x00004000... (15 %)
Writing at 0x00008000... (23 %)
Writing at 0x0000c000... (30 %)
Writing at 0x00010000... (38 %)
Writing at 0x00014000... (46 %)
Writing at 0x00018000... (53 %)
Writing at 0x0001c000... (61 %)
Writing at 0x00020000... (69 %)
Writing at 0x00024000... (76 %)
Writing at 0x00028000... (84 %)
Writing at 0x0002c000... (92 %)
Writing at 0x00030000... (100 %)
Wrote 270304 bytes (198818 compressed) at 0x00000000 in 17.6 seconds (effective 123.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

Flashボタンのある開発ボードでの書き込み処理

WeMos X-8266では、Flashボタンを押し下げてから書き込みボタンを押す。そして、"Writing at 0x00000000... (7 %)"と書き込み開始の表示が出てからFlashボタンから手を離す。