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 <ボーレート> シリアルモニタ
|