HOME | Raspberry Pi | ビジネス書籍紹介 | 2026-01-04 (Sun) Today's Access : 157 Total : 1260855. Since 10 Sep. 2019

Arduiono開発環境 PlatformIO
2019.12.26 / 2023.10.14更新

YouTube 動画でポイントを説明しています。
上記画像をクリックすると再生できます。

今回は、PlatformIOを用いて、Arduiono の開発環境を構築します。 PlatformIOは、ESP32やArduinoなど、様々な組込みデバイスを対象とした統合開発環境です.

構成図では、Raspberry Pi Zero W に Raspbian Stretch Lite をインストールしてあります。 Zero は Wifi経由で、SSH接続によりパソコンから制御しています。

ちょっとしたシールドのテストであれば、Arduino Nano をブレッドボードに挿して、Raspberry Pi Zero WとUSB接続して、 シリアル通信すれば足りてしまいます。


■pythonのインストール
まずは、python3-pip をインストールします。pip は、Pythonパッケージのインストールなどを行うユーティリティです。
$ sudo apt install python3-pip
$ pip3 --version
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.5)
■platformioをインストール
$ sudo pip3 install -U platformio
※platformioインストール時に短縮コマンドとしてpioも設定されます。

$ platformio --version
This system supports the C.UTF-8 locale which is recommended.
You might be able to resolve your issue by exporting the
following environment variables:

    export LC_ALL=C.UTF-8
    export LANG=C.UTF-8
上記のようなエラーが発生した場合には、現在のロケール確認します
$ locale
LANG=
LANGUAGE=
.........
対応しているロケール一覧を表示します
$ locale -a
C
C.UTF-8
POSIX
en_GB.utf8
$ sudo raspi-config
4.Locatisation Options
  → I1 Change Locale
  → ja_JP.UTF-8 UTF-8
  → ja_JP.UTF-8
  

Generating locales (this might take a while)...
  en_GB.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.
再度、ロケール一覧を表示します
$ locale -a
C
C.UTF-8
POSIX
en_GB.utf8
ja_JP.utf8
設定を反映させます
$ sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"

確認します
$ cat /etc/default/locale
LANG=ja_JP.UTF-8
LANGUAGE=ja_JP:ja
ログインし直します
$ locale (あるいは $ localectl status)
LANG=ja_JP.UTF-8
LANGUAGE=ja_JP:ja
....
$ platformio --version
PlatformIO, version 4.1.0
■platformioのPATH の確認

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:
/usr/local/games:/usr/games

$ which platformio
/usr/local/bin/platformio

PATHが通っていない場合は
$ echo 'export PATH=${PATH}:/usr/local/bin' >> ~/.bashrc

■udevの設定 (Ubuntuのみ)

dialoutグループに自分を追加します。
$ cat /etc/group | grep dialout
dialout:x:20:pi

$ sudo usermod -a -G dialout ${USER}
※Raspbianの場合、ユーザ pi は既に含まれているので、実際には必要ありません

■udev rulesの設定

platformioが、動的にデバイスを管理するために、ルールファイルを追加します。

$ cd /etc/udev/rules.d
$ ls
99-com.rules

$ sudo wget https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules

$ ls
99-com.rules 99-platformio-udev.rules

$ sudo udevadm control --reload-rules

■利用できるボードの確認

$ platformio boards

$ platformio boards "arduino uno" ← 絞り込みたい場合
Platform: atmelavr
---------------------------------------------------------------------
ID                 MCU          Frequency  Flash   RAM    Name
---------------------------------------------------------------------
uno                ATMEGA328P   16MHz     31.50KB 2KB    Arduino Uno
$ platformio boards "arduino nano"
Platform: atmelavr
----------------------------------------------------------------------
ID                 MCU        Freq.  Flash RAM  Name
----------------------------------------------------------------------
nanoatmega168      ATMEGA168  16MHz  14KB  1KB  Arduino Nano ATmega168
nanoatmega328      ATMEGA328P 16MHz  30KB  2KB  Arduino Nano ATmega328
nanoatmega328new   ATMEGA328P 16MHz  30KB  2KB  Arduino Nano ATmega328
                                                  (New Bootloader)
$ platformio boards "Leonard"
Platform: atmelavr
---------------------------------------------------------------------
ID               MCU        Freq.  Flash  RAM    Name
---------------------------------------------------------------------
leonardo         ATMEGA32U4 16MHz  28KB   2.50KB Arduino Leonardo
leonardoeth      ATMEGA32U4 16MHz  28KB   2.50KB Arduino Leonardo ETH

Arduino Nano と Raspberry Pi Zero W をUSB接続します。

■シリアルデバイスの確認
$ platformio device list
/dev/ttyUSB0
------------
Hardware ID: USB VID:PID=1A86:7523 LOCATION=1-1
Description: USB2.0-Serial

/dev/ttyAMA0
------------
Hardware ID: 20201000.serial
Description: ttyAMA0
Arduino Nano が /dev/ttyUSB0 として認識されているのがわかります。

■プロジェクトの作成
$ mkdir -p /home/pi/Arduino/sample
$ cd /home/pi/Arduino/sample

$ platformio init

/home/pi/Arduino/sample
                   ├── .gitignore
                   ├── .travis.yml
                   ├── include/
                   ├── lib/
                   ├── platformio.ini
                   ├── src/
                   └── test/

$ cat platformio.ini

;PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
オプションを付けずに init コマンドを実行すると platformio.ini には実際の設定は追加されません。
Arduino Nano を指定して実行してみます。
$ platformio init -b nanoatmega328

$ cat platformio.ini

;PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:nanoatmega328]
framework = arduino
board = nanoatmega328
platform = atmelavr
Arduino Uno を指定して実行してみます。
$ platformio init -b uno

$ cat platformio.ini

;PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:nanoatmega328]
framework = arduino
board = nanoatmega328
platform = atmelavr

[env:uno]
platform = atmelavr
framework = arduino
board = uno
■L チカ・プログラム
$ vi src/led.ino
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}
ino ファイル名は、プロジェクトディレクトリ名と一致する必要はありません。
ただし、複数のinoファイルをsrcディレクトリに配置した際、void setup()関数が複数存在すると、ビルド時にエラーになります。
/home/pi/Arduino/sample/src/SerialMonitor.ino: In function 'void setup()':
/home/pi/Arduino/sample/src/SerialMonitor.ino:2:6: error: redefinition of 'void setup()'

$ platformio run
Processing nanoatmega328 (framework: arduino; board: nanoatmega328; platform: atmelavr)
.....
Processing uno (platform: atmelavr; framework: arduino; board: uno)
.....
Environment Status Duration
------------- -------- ------------
nanoatmega328 SUCCESS 00:00:38.913
uno SUCCESS 00:00:35.662

Nano と Uno に対して、それぞれビルドが実行されます。 特定の環境だけビルドしたい場合は -e オプションで指定します。

$ platformio run -e nanoatmega328
Processing nanoatmega328 (framework: arduino; board: nanoatmega328; platform: atmelavr)
.....
Environment Status Duration
------------- -------- ------------
nanoatmega328 SUCCESS 00:00:20.188
uno IGNORED

環境を指定しないで run コマンドを実行した時のデフォルトの環境を platfromio.ini で指定できます。

$ vi platformio.ini
[platformio]
default_envs=nanoatmega328

■アップロード

$ platformio run -e nanoatmega328 -t upload

複数の環境定義を列記してある場合に、環境指定を行わないで、アップロードしようとすると、 該当する環境(ここではnanoatmega328)はアップロードされますが、接続されていない Uno に関してはエラーとなります。

$ platformio run -t upload

Processing nanoatmega328 (framework: arduino; board: nanoatmega328; platform: atmelavr)
.....
avrdude done. Thank you.
========== [SUCCESS] Took 38.59 seconds ==========

Processing uno (platform: atmelavr; framework: arduino; board: uno)
....
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
.......


LEDが光ります(写真向かって一番左のLED)。

備考:Arduinoボード インジケーター
L:「DIGITAL 13番PIN」から電圧が出力されているときに点灯
TX:トランミッション、つまりデータを送信しているときに光る
RX:レセプション、つまりデータを受信しているときに光る

■ライブラリーを利用する


温湿度センサーDHT11を使用して「温度、湿度、体感温度」を取得します。

$ mkdir -p /home/pi/Arduino/dht11
$ cd /home/pi/Arduino/dht11

$ platformio init -b nanoatmega328
$ vi src/dht11.ino

#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println(F("DHT11 test!"));

  dht.begin();
}

void loop() {
  delay(2000);

  float humidity    = dht.readHumidity();
  float temperature = dht.readTemperature();
  float heatIndex   = dht.computeHeatIndex(temperature, humidity, false);
  if (isnan(humidity) || isnan(temperature) || isnan(heatIndex)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  Serial.print("Humidity:");
  Serial.print(humidity);
  Serial.print("%  Temperature:");
  Serial.print(temperature);
  Serial.print("°C Heat index:");
  Serial.print(heatIndex);
  Serial.println("°C");
}
DHT系の専用ライブラリを使用しています
https://github.com/adafruit/DHT-sensor-library

$ platformio run
/home/pi/Arduino/dht11/src/dht11.ino:1:17: fatal error: DHT.h: No such file or directory

*************************************************************
* Looking for DHT.h dependency? Check our library registry!
*
* CLI > platformio lib search "header:DHT.h"
* Web > https://platformio.org/lib/search?query=header:DHT.h
*
*************************************************************

DHT.h がないので、エラーとなりますが、親切にライブラリの探し方を教えてくれてます。

■ライブラリのインストール

$ platformio lib search "header:DHT.h"
Found 16 libraries:

DHT sensor library
==================
#ID: 19
Arduino library for DHT11, DHT22, etc Temp & Humidity Sensors

Keywords: sensors
Compatible frameworks: Arduino
Compatible platforms: Atmel AVR, Atmel SAM, Espressif 32, Espressif 8266, GigaDevice GD32V, Infineon XMC, Intel ARC32, Kendryte K210, Microchip PIC32, Nordic nRF51, Nordic nRF52, ST STM32, ST STM8, Teensy, TI MSP430
Authors: Adafruit
......

16個のライブラリーが登録されていて、一番最初に見つかりました。
表示されているIDを用いて、さらに詳しい情報を確認してみます。
$ platformio lib show 19
.....
ライブラリーをインストールします。
$ platformio lib install 19
Library Storage: /home/pi/Arduino/dht11/.pio/libdeps/nanoatmega328
LibraryManager: Installing id=19
DHT sensor library @ 1.3.8 has been successfully installed!
ライブラリーのホルダーが生成されています。
$ ls /home/pi/Arduino/dht11/.pio/libdeps/nanoatmega328
DHT sensor library_ID19

フォルダーの中を見てみます。
$ ls -al "/home/pi/Arduino/dht11/.pio/libdeps/nanoatmega328/DHT sensor library_ID19"
drwx------ 4 pi pi 4096 12月 20 20:39 .
drwxr-xr-x 3 pi pi 4096 12月 20 20:39 ..
drwxrwxr-x 2 pi pi 4096 12月 20 20:39 .github
-rw-rw-r-- 1 pi pi 67 11月 3 15:00 .gitignore
-rw-rw-r-- 1 pi pi 1144 11月 3 15:00 .library.json
-rw-rw-r-- 1 pi pi 679 11月 3 15:00 .travis.yml
-rw-rw-r-- 1 pi pi 1288 11月 3 15:00 CONTRIBUTING.md
-rw-rw-r-- 1 pi pi 11765 11月 3 15:00 DHT.cpp
-rw-rw-r-- 1 pi pi 2519 11月 3 15:00 DHT.h
-rw-rw-r-- 1 pi pi 6733 11月 3 15:00 DHT_U.cpp
-rw-rw-r-- 1 pi pi 3078 11月 3 15:00 DHT_U.h
-rw-rw-r-- 1 pi pi 4705 11月 3 15:00 README.md
drwxrwxr-x 4 pi pi 4096 12月 20 20:39 examples
-rw-rw-r-- 1 pi pi 529 11月 3 15:00 keywords.txt
-rw-rw-r-- 1 pi pi 353 11月 3 15:00 library.properties

環境設定ファイルにライブラリーを指定します。
$ vi platformio.ini
[env:nanoatmega328]
platform = atmelavr
framework = arduino
board = nanoatmega328
lib_deps =
  19
$ platformio run

.pio/libdeps/nanoatmega328/DHT sensor library_ID19/DHT_U.h:36:29: fatal error: Adafruit_Sensor.h: No such file or directory

*************************************************************
* Looking for Adafruit_Sensor.h dependency? Check our library registry!
*
* CLI > platformio lib search "header:Adafruit_Sensor.h"
* Web > https://platformio.org/lib/search?query=header:Adafruit_Sensor.h
*
*************************************************************

再度、ビルドを実行してみると、今度はDHTライブラリーが参照しているヘッダーファイルがないためにエラーになります。
同様にライブラリーを検索して、インストール、環境設定ファイルにライブラリーを追記します。

$ platformio lib search "header:Adafruit_Sensor.h"

Found 12 libraries:

Adafruit Unified Sensor
=======================
#ID: 31
Required for all Adafruit Unified Sensor based libraries.

Keywords: sensors
Compatible frameworks: Arduino
Compatible platforms: Atmel AVR, Atmel SAM, Espressif 32, Espressif 8266, Intel ARC32, Microchip PIC32, Nordic nRF51, Nordic nRF52, ST STM32, ST STM8, Teensy, TI MSP430
Authors: Adafruit
......
$ platformio lib install 31

Library Storage: /home/pi/Arduino/dht11/.pio/libdeps/nanoatmega328
LibraryManager: Installing id=31
Downloading  [####################################]  100%
Adafruit Unified Sensor @ 1.0.3 has been successfully installed!

$ vi platformio.ini
[env:nanoatmega328]
platform = atmelavr
framework = arduino
board = nanoatmega328
lib_deps =
  19
  31

複数のライブラリを指定する場合はライブラリごとに改行して記述します
$ platformio run -e nanoatmega328 -t upload

■platformio シリアルモニター
$ platformio device monitor -p /dev/ttyUSB0 -b 9600
--- Miniterm on /dev/ttyUSB0  9600,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
DHT11 test!
Humidity:40.00%  Temperature:21.60°C Heat index:16.73°C
Humidity:40.00%  Temperature:21.60°C Heat index:16.73°C
使用しているポートが1つの場合は、ポート指定をしなくても動くようですが、
$ platformio device monitor -b 9600
接続しているシリアルボートを確認して
$ platformio device list
明示的にポート指定したほうがよいと思います。
$ platformio device monitor -p /dev/ttyUSB0 -b 9600

■ライブラリーを削除する
$ platformio lib uninstall 19
Uninstalling DHT sensor library @ 1.3.8:        [OK]
■ビルドオプションを指定する
ESP8266はTCP/IPスタックとマイクロコントローラを備えたWi-Fiモジュールです。

https://github.com/itead/ITEADLIB_Arduino_WeeESP8266
ESP8266.h

たとえば ESP8266 というライブラリはソフトウェアシリアルを利用できますが、利用するにはマクロで ESP8266_USE_SOFTWARE_SERIAL という値が定義されていなければなりません。
#ifdef ESP8266_USE_SOFTWARE_SERIAL
    ESP8266(SoftwareSerial &uart, uint32_t baud = 9600);
#else /* HardwareSerial */
    ESP8266(HardwareSerial &uart, uint32_t baud = 9600);
#endif
このようなばあいには build_flags を使ってコンパイラにオプションを渡すことができます。
$ vi platformio.ini

[env:uno]
platform = atmelavr
board = uno
framework = arduino
lib_deps =
  ESP8266
build_flags = -D ESP8266_USE_SOFTWARE_SERIAL
これで ESP8266 に SoftwareSerial を渡すことができるようになります。

■共通変数の設定

任意の共通セクション名を用意して、各セクションが参照するようにします。
$ vi platformio.ini

[common]
lib_deps =
  19
  31
build_flags = -D ESP8266_USE_SOFTWARE_SERIAL

[env:nanoatmega328]
platform    = atmelavr
board       = nanoatmega328
framework   = arduino
build_flags = ${common.build_flags}
lib_deps    = ${common.lib_deps}

[env:uno]
platform    = atmelavr
board       = uno
framework   = arduino
build_flags = ${common.build_flags}
lib_deps    = ${common.lib_deps}
■基本コマンド
platformio update                  パッケージのアップロード
platformio upgrade                 パッケージのアップグレード
platformio boards                  ボード一覧表示
platformio init --board=<ボード名> プロジェクト作成
platformio run                     ビルド
platformio run --target=upload     ビルドとアップロード
platformio run --target=clean      クリーン
platformio device list            	シリアルポート一覧表示
platformio device monitor -p <デバイス> -b <ボーレート>	シリアルモニタ
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
2019.12.19 ファイル共有 dokany + Win-sshfs
2019.12.26 Arduino開発環境構築 PlatformIO
2022.02.08 Zero 2 W と Bullseye
2022.07.15 NAS導入とApache2パス設定
2023.04.01 秋月・amazon・PIMORONI・tindie
2023.07.16 ログ表示
2024.04.23 NASリプレース
2024.10.24 Bookworm & PlatformIO
2025.08.09 ESP32 WEB SERVER

たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」 「一念発起して何かを始めても、いつも三日坊主で終わってしまう」 「色んなことを先延ばしにしたまま、時間だけが過ぎていく」 そこで本書では、そんな著者が独自に開発した、 まったく新しい目標達成メソッド「100日デザイン」について、 その知識と技術を、余すところなくご紹介します。

まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。 ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。

今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。

ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。 29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!

【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。 基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。

Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説! 500以上のサンプルを掲載。実行結果も確認。 全24章の包括的なチュートリアル。

ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS… 全WEB媒体で効果バツグン! カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術

小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。

Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード

電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)

Copyright © 2011-2027 Sarako Tsukiyono All rights reserved®.