PlatformIO

2021年5月19日 (水)

Arduino-CLIのインストール

2021/5/19
初版

Arduino-CLI Install

Arduino-CLI Install

概要

Arduino-CLIのインストール方法について記述する。
これはArduino-IDEを使わずにCLIだけでArduinoのcompile/uploadなどができる。
ホスト環境はubuntuを想定する。
なお、(インストールしたライブラリなどを流用する関係上)既にArduino-IDEがインストール済みであることが前提となる。

インストール手順

以下の手順を実行する:

cd ~ curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh #出力例 Installing in /home/USER/bin ARCH=64bit OS=Linux Using curl as download tool TAG=0.18.3 CLI_DIST=arduino-cli_0.18.3_Linux_64bit.tar.gz Downloading https://downloads.arduino.cc/arduino-cli/arduino-cli_0.18.3_Linux_64bit.tar.gz arduino-cli not found. You might want to add /home/USER/bin to your $PATH arduino-cli alpha Version: 0.18.3 Commit: d710b642 Date: 2021-05-14T12:36:58Z installed successfully in /home/USER/bin # 実行パスを設定する(.bashrcにも登録する) export PATH=$PATH:$HOME/bin/

動作確認

mkdir ard_ws cd ard_ws/ # configファイルを初期化する arduino-cli config init #出力例 Config file written to: /home/USER/.arduino15/arduino-cli.yaml # arduino-cli.yamlファイルが$HOME/.arduino15/にできる # 新規のスケッチの作成 arduino-cli sketch new MyFirstSketch #出力例 Sketch created in: /home/USR/ard_ws/MyFirstSketch # 新規スケッチの内容の確認 cat MyFirstSketch/MyFirstSketch.ino void setup() { } void loop() { } # インストールされているボード・ライブラリの確認 arduino-cli board listall uno #出力 Board Name FQBN Arduino Uno arduino:avr:uno Arduino Uno WiFi arduino:avr:unowifi arduino-cli board listall xiao #出力 Board Name FQBN Seeeduino XIAO Seeeduino:samd:seeed_XIAO_m0 arduino-cli board listall wio #出力 Board Name FQBN Seeed Wio Link esp8266:esp8266:wiolink Seeeduino Wio GPS Board Seeeduino:samd:WioGPS Seeeduino Wio Terminal Seeeduino:samd:seeed_wio_terminal Seeeduino Wio lite MG126 Seeeduino:samd:Wio_Lite_MG126 arduino-cli board listall pico #出力 Board Name FQBN Adafruit Feather RP2040 (Picoprobe) rp2040:rp2040:adafruitfeatherpicoprobe Generic RP2040 (Picoprobe) rp2040:rp2040:genericpicoprobe Raspberry Pi Pico rp2040:rp2040:rpipico Raspberry Pi Pico arduino:mbed_rp2040:pico Raspberry Pi Pico (Picoprobe) rp2040:rp2040:rpipicopicoprobe #--------------------------------- # Install the core for your board arduino-cli core install Seeeduino:samd #出力 Platform Seeeduino:samd@1.8.1 already installed #Arduino-IDEでインストール済みなので「already installed」 arduino-cli core update-index #出力 Updating index: package_index.json downloaded Updating index: package_index.json.sig downloaded #---------------------------------- # 任意のスケッチに編集する gedit MyFirstSketch/MyFirstSketch.ino # Compile and upload the sketch #compile arduino-cli compile -b arduino:avr:uno MyFirstSketch #出力例 Sketch uses 932 bytes (2%) of program storage space. Maximum is 32256 bytes. Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes. #upload arduino-cli upload -p /dev/ttyUSB0 -b arduino:avr:uno MyFirstSketch #特に出力はないようだ

既存のスケッチのcompile/upload

既存のスケッチのcompile/uploadについては
以下のように行なう:

cd ~/Arduino # ディレクトリ内容の確認 ls ASCIITablePico ASCIITable_M5Atom BlinkPico MB_graphicstest libraries # ビルドしたいスケッチのディレクトリに入る cd ASCIITablePico # compile arduino-cli compile -b rp2040:rp2040:rpipico #出力例 Sketch uses 214480 bytes (10%) of program storage space. Maximum is 2093056 bytes. Global variables use 17064 bytes (6%) of dynamic memory, leaving 245080 bytes for local variables. Maximum is 262144 bytes. # upload arduino-cli upload -p /dev/ttyACM0 -b rp2040:rp2040:rpipico #出力例 Resetting /dev/ttyACM0 Converting to uf2, output size: 442880, start address: 0x2000 Flashing /media/USER/RPI-RP2 (RPI-RP2) Wrote 442880 bytes to /media/USER/RPI-RP2/NEW.UF2 #------------------------------ # 同じスケッチでboardを切り替える # ボード確認 arduino-cli board listall Atom #出力例 Board Name FQBN M5Stack-ATOM m5stack:esp32:m5stack-atom # compile arduino-cli compile -b m5stack:esp32:m5stack-atom #出力例 Sketch uses 213585 bytes (16%) of program storage space. Maximum is 1310720 bytes. Global variables use 15380 bytes (4%) of dynamic memory, leaving 312300 bytes for local variables. Maximum is 327680 bytes. # upload arduino-cli upload -p /dev/ttyUSB0 -b m5stack:esp32:m5stack-atom #出力例 esptool.py v3.0-dev Serial port /dev/ttyUSB0 Connecting..... Chip is ESP32-PICO-D4 (revision 1) Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None Crystal is 40MHz MAC: 50:02:91:90:04:e4 Uploading stub... Running stub... Stub running... Changing baud rate to 1500000 Changed. Configuring flash size... Auto-detected Flash size: 4MB Compressed 8192 bytes to 47... Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds (effective 15527.2 kbit/s)... Hash of data verified. Compressed 15856 bytes to 10276... Wrote 15856 bytes (10276 compressed) at 0x00001000 in 0.1 seconds (effective 1129.5 kbit/s)... Hash of data verified. Compressed 213696 bytes to 108970... Wrot  e 213696 bytes (108970 compressed) at 0x00010000 in 1.8 seconds (effective 960.5 kbit/s)... Hash of data verified. Compressed 3072 bytes to 128... Wrote 3072 bytes (128 compressed) at 0x00008000 in 0.0 seconds (effective 6202.5 kbit/s)... Hash of data verified. Leaving... Hard resetting via RTS pin...

3rd-partyのボード・ライブラリのインストール

例:

# install arduino-cli core update-index --additional-urls https://arduino.esp8266.com/stable/package_esp8266com_index.json #出力例 Updating index: package_index.json downloaded Updating index: package_index.json.sig downloaded Updating index: package_esp8266com_index.json downloaded # check arduino-cli core search esp8266 --additional-urls https://arduino.esp8266.com/stable/package_esp8266com_index.json #出力例 ID Version Name esp8266:esp8266 3.0.0 esp8266 # ボード・ライブラリ確認 arduino-cli board listall 8266 #出力例 Board Name FQBN 4D Systems gen4 IoD Range esp8266:esp8266:gen4iod Adafruit Feather HUZZAH ESP8266 esp8266:esp8266:huzzah Amperka WiFi Slot esp8266:esp8266:wifi_slot Arduino esp8266:esp8266:arduino-esp8266 DOIT ESP-Mx DevKit (ESP8285) esp8266:esp8266:espmxdevkit Digistump Oak esp8266:esp8266:oak ESPDuino (ESP-13 Module) esp8266:esp8266:espduino ESPectro Core esp8266:esp8266:espectro ESPino (ESP-12 Module) esp8266:esp8266:espino <省略>

参照情報

Arduino-CLI関連:
Arduino-CLI
getting-started
Arduino-cli: compile, upload and manage libraries, cores, and boards

Arduino-CLI内部関連:
Platform specification
Pre-Processing

以上

続きを読む "Arduino-CLIのインストール"

| | コメント (0)

2021年4月30日 (金)

LCDをmicrobit_arduinoで動かす

2021/5/3
スケッチをハードウェアSPIに切り替えた。

2021/4/30
初版

pio Microbit Arduino ST7735S

pio Microbit Arduino ST7735S

概要

以下のLCDをmicrobit_arduinoで動かす
1.8inch colorful display module for micro:bit, 160x128 (ST7735S)
(ホストはubuntu20.04を想定している)
platformioが既にインストールされている前提で説明する。

platformioのインストールについては以下などを参照のこと:
arduinoフレームワーク用platformio.ini集

platformio.ini

以下の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:bbcmicrobit] platform = nordicnrf51 board = bbcmicrobit framework = arduino build_flags = -DMICROBIT -DNRF51_S110 monitor_speed = 115200 lib_ldf_mode = deep+ #upload_port = /media/USER/MICROBIT #upload_protocol = mbed upload_protocol = cmsis-dap lib_deps = https://github.com/adafruit/Adafruit_BusIO/archive/master.zip https://github.com/sparkfun/SparkFun_MAG3110_Breakout_Board_Arduino_Library/archive/master.zip https://cdn-learn.adafruit.com/assets/assets/000/046/217/original/MMA8653.zip https://github.com/stm32duino/LSM303AGR/archive/master.zip https://github.com/adafruit/Adafruit-GFX-Library/archive/master.zip # https://github.com/sandeepmistry/arduino-BLEPeripheral/archive/master.zip https://github.com/adafruit/Adafruit_Microbit/archive/master.zip # https://github.com/ht-deko/microbit_Screen/archive/master.zip # adafruit/Adafruit ST7735 and ST7789 Library @ ^1.7.2

graphicstest.ino

テスト用プログラムを以下のように作成する:
src/graphicstest.ino

// modified for Waveshare 1.8inch LCD for micro:bit, controler:ST7735S (2021/4/30) /************************************************************************** This is a library for several Adafruit displays based on ST77* drivers. Works with the Adafruit 1.8" TFT Breakout w/SD card ----> http://www.adafruit.com/products/358 The 1.8" TFT shield ----> https://www.adafruit.com/product/802 The 1.44" TFT breakout ----> https://www.adafruit.com/product/2088 The 1.14" TFT breakout ----> https://www.adafruit.com/product/4383 The 1.3" TFT breakout ----> https://www.adafruit.com/product/4313 The 1.54" TFT breakout ----> https://www.adafruit.com/product/3787 The 2.0" TFT breakout ----> https://www.adafruit.com/product/4311 as well as Adafruit raw 1.8" TFT display ----> http://www.adafruit.com/products/618 Check out the links above for our tutorials and wiring diagrams. These displays use SPI to communicate, 4 or 5 pins are required to interface (RST is optional). Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Written by Limor Fried/Ladyada for Adafruit Industries. MIT license, all text above must be included in any redistribution **************************************************************************/ #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library for ST7735 #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 #include <SPI.h> #ifndef MICROBIT #if defined(ARDUINO_FEATHER_ESP32) // Feather Huzzah32 #define TFT_CS 14 #define TFT_RST 15 #define TFT_DC 32 #elif defined(ESP8266) #define TFT_CS 4 #define TFT_RST 16 #define TFT_DC 5 #else // For the breakout board, you can use any 2 or 3 pins. // These pins will also work for the 1.8" TFT shield. #define TFT_CS 10 #define TFT_RST 9 // Or set to -1 and connect to Arduino RESET pin #define TFT_DC 8 #endif // OPTION 1 (recommended) is to use the HARDWARE SPI pins, which are unique // to each board and not reassignable. For Arduino Uno: MOSI = pin 11 and // SCLK = pin 13. This is the fastest mode of operation and is required if // using the breakout board's microSD card. // For 1.44" and 1.8" TFT with ST7735 use: Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // For 1.14", 1.3", 1.54", and 2.0" TFT with ST7789: //Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); // OPTION 2 lets you interface the display using ANY TWO or THREE PINS, // tradeoff being that performance is not as fast as hardware SPI above. //#define TFT_MOSI 11 // Data out //#define TFT_SCLK 13 // Clock out // For ST7735-based displays, we will use this call //Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); // OR for the ST7789-based displays, we will use this call //Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); #endif #ifdef MICROBIT // setup for Waveshare LCD #define TFT_CS 16 #define TFT_RST 8 #define TFT_DC 12 #define TFT_MOSI 15 // Data out #define TFT_SCLK 13 // Clock out #define BL_EN 1 // backlit enable //Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // use Hardware SPI #endif float p = 3.1415926; void setup(void) { //pinMode(BL_EN, OUTPUT); //digitalWrite(BL_EN, HIGH); //Serial.begin(9600); Serial.begin(115200); Serial.print(F("Hello! ST77xx TFT Test")); #ifndef MICROBIT // Use this initializer if using a 1.8" TFT screen: tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab // OR use this initializer if using a 1.8" TFT screen with offset such as WaveShare: // tft.initR(INITR_GREENTAB); // Init ST7735S chip, green tab // OR use this initializer (uncomment) if using a 1.44" TFT: //tft.initR(INITR_144GREENTAB); // Init ST7735R chip, green tab // OR use this initializer (uncomment) if using a 0.96" 160x80 TFT: //tft.initR(INITR_MINI160x80); // Init ST7735S mini display // OR use this initializer (uncomment) if using a 1.3" or 1.54" 240x240 TFT: //tft.init(240, 240); // Init ST7789 240x240 // OR use this initializer (uncomment) if using a 2.0" 320x240 TFT: //tft.init(240, 320); // Init ST7789 320x240 // OR use this initializer (uncomment) if using a 1.14" 240x135 TFT: //tft.init(135, 240); // Init ST7789 240x135 // SPI speed defaults to SPI_DEFAULT_FREQ defined in the library, you can override it here // Note that speed allowable depends on chip and quality of wiring, if you go too fast, you // may end up with a black screen some times, or all the time. //tft.setSPISpeed(40000000); #endif #ifdef MICROBIT tft.initR(INITR_GREENTAB); // Init ST7735S chip, green tab for WaveShare //tft.setRotation(1); // landscape (microbit board upside) tft.setRotation(2); // portrait (microbit board leftside) tft.setSPISpeed(40000000); #endif Serial.println(F("Initialized")); uint16_t time = millis(); tft.fillScreen(ST77XX_BLACK); time = millis() - time; Serial.println(time, DEC); delay(500); // large block of text tft.fillScreen(ST77XX_BLACK); testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", ST77XX_WHITE); delay(1000); // tft print function! tftPrintTest(); delay(4000); // a single pixel tft.drawPixel(tft.width()/2, tft.height()/2, ST77XX_GREEN); delay(500); // line draw test testlines(ST77XX_YELLOW); delay(500); // optimized lines testfastlines(ST77XX_RED, ST77XX_BLUE); delay(500); testdrawrects(ST77XX_GREEN); delay(500); testfillrects(ST77XX_YELLOW, ST77XX_MAGENTA); delay(500); tft.fillScreen(ST77XX_BLACK); testfillcircles(10, ST77XX_BLUE); testdrawcircles(10, ST77XX_WHITE); delay(500); testroundrects(); delay(500); testtriangles(); delay(500); mediabuttons(); delay(500); Serial.println("done"); delay(1000); } void loop() { tft.invertDisplay(true); delay(500); tft.invertDisplay(false); delay(500); } void testlines(uint16_t color) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, 0, x, tft.height()-1, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, 0, tft.width()-1, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, 0, 0, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, tft.height()-1, x, 0, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, tft.height()-1, tft.width()-1, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color); delay(0); } } void testdrawtext(char *text, uint16_t color) { tft.setCursor(0, 0); tft.setTextColor(color); tft.setTextWrap(true); tft.print(text); } void testfastlines(uint16_t color1, uint16_t color2) { tft.fillScreen(ST77XX_BLACK); for (int16_t y=0; y < tft.height(); y+=5) { tft.drawFastHLine(0, y, tft.width(), color1); } for (int16_t x=0; x < tft.width(); x+=5) { tft.drawFastVLine(x, 0, tft.height(), color2); } } void testdrawrects(uint16_t color) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color); } } void testfillrects(uint16_t color1, uint16_t color2) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=tft.width()-1; x > 6; x-=6) { tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1); tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2); } } void testfillcircles(uint8_t radius, uint16_t color) { for (int16_t x=radius; x < tft.width(); x+=radius*2) { for (int16_t y=radius; y < tft.height(); y+=radius*2) { tft.fillCircle(x, y, radius, color); } } } void testdrawcircles(uint8_t radius, uint16_t color) { for (int16_t x=0; x < tft.width()+radius; x+=radius*2) { for (int16_t y=0; y < tft.height()+radius; y+=radius*2) { tft.drawCircle(x, y, radius, color); } } } void testtriangles() { tft.fillScreen(ST77XX_BLACK); uint16_t color = 0xF800; int t; int w = tft.width()/2; int x = tft.height()-1; int y = 0; int z = tft.width(); for(t = 0 ; t <= 15; t++) { tft.drawTriangle(w, y, y, x, z, x, color); x-=4; y+=4; z-=4; color+=100; } } void testroundrects() { tft.fillScreen(ST77XX_BLACK); uint16_t color = 100; int i; int t; for(t = 0 ; t <= 4; t+=1) { int x = 0; int y = 0; int w = tft.width()-2; int h = tft.height()-2; for(i = 0 ; i <= 16; i+=1) { tft.drawRoundRect(x, y, w, h, 5, color); x+=2; y+=3; w-=4; h-=6; color+=1100; } color+=100; } } void tftPrintTest() { tft.setTextWrap(false); tft.fillScreen(ST77XX_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST77XX_RED); tft.setTextSize(1); tft.println("Hello World!"); tft.setTextColor(ST77XX_YELLOW); tft.setTextSize(2); tft.println("Hello World!"); tft.setTextColor(ST77XX_GREEN); tft.setTextSize(3); tft.println("Hello World!"); tft.setTextColor(ST77XX_BLUE); tft.setTextSize(4); tft.print(1234.567); delay(1500); tft.setCursor(0, 0); tft.fillScreen(ST77XX_BLACK); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(0); tft.println("Hello World!"); tft.setTextSize(1); tft.setTextColor(ST77XX_GREEN); tft.print(p, 6); tft.println(" Want pi?"); tft.println(" "); tft.print(8675309, HEX); // print 8,675,309 out in HEX! tft.println(" Print HEX!"); tft.println(" "); tft.setTextColor(ST77XX_WHITE); tft.println("Sketch has been"); tft.println("running for: "); tft.setTextColor(ST77XX_MAGENTA); tft.print(millis() / 1000); tft.setTextColor(ST77XX_WHITE); tft.print(" seconds."); } void mediabuttons() { // play tft.fillScreen(ST77XX_BLACK); tft.fillRoundRect(25, 10, 78, 60, 8, ST77XX_WHITE); tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_RED); delay(500); // pause tft.fillRoundRect(25, 90, 78, 60, 8, ST77XX_WHITE); tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_GREEN); tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_GREEN); delay(500); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_BLUE); delay(50); // pause color tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_RED); tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_RED); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_GREEN); }

・「Adafruit ST7735 and ST7789 Library 」にあるExamplesを修正したもの。
・「#ifdef MICROBIT ... #endif」などで囲まれた部分が修正部分になる。

ビルド&書き込み

以下の手順でビルトと書き込みができる:

cd pico_proj # ツールなどのインストール(最初の1回のみ) pio run -t clean # ビルド&書き込み pio run -t upload # この時点で書き込みが完了する

書き込みが上手く行かない場合は、platformio.iniを以下のように変更すると正常に動作するようだ。
いったん、書き込みが正常動作した跡は、元に戻しても書き込みが正常動作するようだ。

#upload_port = /media/USER/MICROBIT #upload_protocol = mbed upload_protocol = cmsis-dap → upload_port = /media/USER/MICROBIT upload_protocol = mbed #upload_protocol = cmsis-dap

・USERは環境依存なので、実際の環境に合わせて変更する。

micro:bit-V2対応

以下のplatformio.iniでmicrobit-v2でビルド&書き込みができるが、正常動作しないようだ。
(原因不明)

platformio.ini

[env:bbcmicrobit_v2] platform = nordicnrf52 board = bbcmicrobit_v2 framework = arduino ;build_flags = -DMICROBIT_V2 build_flags = -DMICROBIT monitor_speed = 115200 lib_ldf_mode = deep+ #upload_port = /media/USER/MICROBIT #upload_protocol = mbed upload_protocol = cmsis-dap lib_deps = https://github.com/adafruit/Adafruit_BusIO/archive/master.zip https://github.com/sparkfun/SparkFun_MAG3110_Breakout_Board_Arduino_Library/archive/master.zip https://cdn-learn.adafruit.com/assets/assets/000/046/217/original/MMA8653.zip https://github.com/stm32duino/LSM303AGR/archive/master.zip https://github.com/adafruit/Adafruit-GFX-Library/archive/master.zip # adafruit/Adafruit ST7735 and ST7789 Library @ ^1.7.2

参考情報

LCD関連:
1.8inch LCD for micro:bit
1.8inch colorful display module for micro:bit, 160x128

Microbit_Arduino関連:
micro:bit Arduino/MBED開発ツール(v2)(micro:bit-v2対応,linux版)
micro:bitでmicrobit_screenライブラリを利用する(micro:bit-v2対応,linux版)
arduinoフレームワーク用platformio.ini集

platformio関連:
PlatformIO Core (CLI)
Arduino-IDEとPlatformioのコンパイラーの挙動の違いについて
arduinoフレームワーク用platformio.ini集
ubuntu20.04をインストールする

以上

続きを読む "LCDをmicrobit_arduinoで動かす"

| | コメント (0)

2021年4月26日 (月)

Display_Packをpico_arduinoで動かす

2021/4/28
LEDとSWの制御スケッチを追加した。

2021/4/25
初版

pio Pico Arduino Display Pack

pio Pico Arduino Display Pack

概要

以下のDisplay_Packをpico_arduinoで動かす
Pico Display Pack
(ホストはubuntu20.04を想定している)
platformioが既にインストールされている前提で説明する。

platformioのインストールについては以下などを参照のこと:
arduinoフレームワーク用platformio.ini集

platformio.ini

以下のplatformio.iniを利用する:

[env:pico] platform = https://github.com/platformio/platform-raspberrypi.git framework = arduino board = pico build_flags = -DPICO upload_port = /dev/ttyACM0 monitor_port = /dev/ttyACM0 monitor_speed = 115200 lib_ldf_mode = deep+ lib_deps = adafruit/Adafruit BusIO @ ^1.7.3 adafruit/Adafruit ST7735 and ST7789 Library @ ^1.7.1

graphicstest.ino

テスト用プログラムを以下のように作成する:
src/graphicstest.ino

// modified for pimoroni display pack (2021/4/25) /************************************************************************** This is a library for several Adafruit displays based on ST77* drivers. Works with the Adafruit 1.8" TFT Breakout w/SD card ----> http://www.adafruit.com/products/358 The 1.8" TFT shield ----> https://www.adafruit.com/product/802 The 1.44" TFT breakout ----> https://www.adafruit.com/product/2088 The 1.14" TFT breakout ----> https://www.adafruit.com/product/4383 The 1.3" TFT breakout ----> https://www.adafruit.com/product/4313 The 1.54" TFT breakout ----> https://www.adafruit.com/product/3787 The 2.0" TFT breakout ----> https://www.adafruit.com/product/4311 as well as Adafruit raw 1.8" TFT display ----> http://www.adafruit.com/products/618 Check out the links above for our tutorials and wiring diagrams. These displays use SPI to communicate, 4 or 5 pins are required to interface (RST is optional). Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Written by Limor Fried/Ladyada for Adafruit Industries. MIT license, all text above must be included in any redistribution **************************************************************************/ #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library for ST7735 #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 #include <SPI.h> #ifndef PICO #if defined(ARDUINO_FEATHER_ESP32) // Feather Huzzah32 #define TFT_CS 14 #define TFT_RST 15 #define TFT_DC 32 #elif defined(ESP8266) #define TFT_CS 4 #define TFT_RST 16 #define TFT_DC 5 #else // For the breakout board, you can use any 2 or 3 pins. // These pins will also work for the 1.8" TFT shield. #define TFT_CS 10 #define TFT_RST 9 // Or set to -1 and connect to Arduino RESET pin #define TFT_DC 8 #endif // OPTION 1 (recommended) is to use the HARDWARE SPI pins, which are unique // to each board and not reassignable. For Arduino Uno: MOSI = pin 11 and // SCLK = pin 13. This is the fastest mode of operation and is required if // using the breakout board's microSD card. // For 1.44" and 1.8" TFT with ST7735 use: Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // For 1.14", 1.3", 1.54", and 2.0" TFT with ST7789: //Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); // OPTION 2 lets you interface the display using ANY TWO or THREE PINS, // tradeoff being that performance is not as fast as hardware SPI above. //#define TFT_MOSI 11 // Data out //#define TFT_SCLK 13 // Clock out // For ST7735-based displays, we will use this call //Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); // OR for the ST7789-based displays, we will use this call //Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); #endif #ifdef PICO // setup for pico display pack #define TFT_CS 17 #define TFT_RST -1 #define TFT_DC 16 #define TFT_MOSI 19 // Data out #define TFT_SCLK 18 // Clock out #define BL_EN 20 // backlit enable Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); #endif float p = 3.1415926; void setup(void) { //pinMode(BL_EN, OUTPUT); //digitalWrite(BL_EN, HIGH); //Serial.begin(9600); Serial.begin(115200); Serial.print(F("Hello! ST77xx TFT Test")); #ifndef PICO // Use this initializer if using a 1.8" TFT screen: tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab // OR use this initializer if using a 1.8" TFT screen with offset such as WaveShare: // tft.initR(INITR_GREENTAB); // Init ST7735S chip, green tab // OR use this initializer (uncomment) if using a 1.44" TFT: //tft.initR(INITR_144GREENTAB); // Init ST7735R chip, green tab // OR use this initializer (uncomment) if using a 0.96" 160x80 TFT: //tft.initR(INITR_MINI160x80); // Init ST7735S mini display // OR use this initializer (uncomment) if using a 1.3" or 1.54" 240x240 TFT: //tft.init(240, 240); // Init ST7789 240x240 // OR use this initializer (uncomment) if using a 2.0" 320x240 TFT: //tft.init(240, 320); // Init ST7789 320x240 // OR use this initializer (uncomment) if using a 1.14" 240x135 TFT: //tft.init(135, 240); // Init ST7789 240x135 // SPI speed defaults to SPI_DEFAULT_FREQ defined in the library, you can override it here // Note that speed allowable depends on chip and quality of wiring, if you go too fast, you // may end up with a black screen some times, or all the time. //tft.setSPISpeed(40000000); #endif #ifdef PICO tft.init(135, 240); // Init ST7789 240x135 //tft.setRotation(3); // landscape tft.setRotation(2); // rotate for matching printing chars on the board tft.setSPISpeed(40000000); #endif Serial.println(F("Initialized")); uint16_t time = millis(); tft.fillScreen(ST77XX_BLACK); time = millis() - time; Serial.println(time, DEC); delay(500); // large block of text tft.fillScreen(ST77XX_BLACK); testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", ST77XX_WHITE); delay(1000); // tft print function! tftPrintTest(); delay(4000); // a single pixel tft.drawPixel(tft.width()/2, tft.height()/2, ST77XX_GREEN); delay(500); // line draw test testlines(ST77XX_YELLOW); delay(500); // optimized lines testfastlines(ST77XX_RED, ST77XX_BLUE); delay(500); testdrawrects(ST77XX_GREEN); delay(500); testfillrects(ST77XX_YELLOW, ST77XX_MAGENTA); delay(500); tft.fillScreen(ST77XX_BLACK); testfillcircles(10, ST77XX_BLUE); testdrawcircles(10, ST77XX_WHITE); delay(500); testroundrects(); delay(500); testtriangles(); delay(500); mediabuttons(); delay(500); Serial.println("done"); delay(1000); } void loop() { tft.invertDisplay(true); delay(500); tft.invertDisplay(false); delay(500); } void testlines(uint16_t color) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, 0, x, tft.height()-1, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, 0, tft.width()-1, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, 0, 0, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, tft.height()-1, x, 0, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, tft.height()-1, tft.width()-1, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color); delay(0); } } void testdrawtext(char *text, uint16_t color) { tft.setCursor(0, 0); tft.setTextColor(color); tft.setTextWrap(true); tft.print(text); } void testfastlines(uint16_t color1, uint16_t color2) { tft.fillScreen(ST77XX_BLACK); for (int16_t y=0; y < tft.height(); y+=5) { tft.drawFastHLine(0, y, tft.width(), color1); } for (int16_t x=0; x < tft.width(); x+=5) { tft.drawFastVLine(x, 0, tft.height(), color2); } } void testdrawrects(uint16_t color) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color); } } void testfillrects(uint16_t color1, uint16_t color2) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=tft.width()-1; x > 6; x-=6) { tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1); tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2); } } void testfillcircles(uint8_t radius, uint16_t color) { for (int16_t x=radius; x < tft.width(); x+=radius*2) { for (int16_t y=radius; y < tft.height(); y+=radius*2) { tft.fillCircle(x, y, radius, color); } } } void testdrawcircles(uint8_t radius, uint16_t color) { for (int16_t x=0; x < tft.width()+radius; x+=radius*2) { for (int16_t y=0; y < tft.height()+radius; y+=radius*2) { tft.drawCircle(x, y, radius, color); } } } void testtriangles() { tft.fillScreen(ST77XX_BLACK); uint16_t color = 0xF800; int t; int w = tft.width()/2; int x = tft.height()-1; int y = 0; int z = tft.width(); for(t = 0 ; t <= 15; t++) { tft.drawTriangle(w, y, y, x, z, x, color); x-=4; y+=4; z-=4; color+=100; } } void testroundrects() { tft.fillScreen(ST77XX_BLACK); uint16_t color = 100; int i; int t; for(t = 0 ; t <= 4; t+=1) { int x = 0; int y = 0; int w = tft.width()-2; int h = tft.height()-2; for(i = 0 ; i <= 16; i+=1) { tft.drawRoundRect(x, y, w, h, 5, color); x+=2; y+=3; w-=4; h-=6; color+=1100; } color+=100; } } void tftPrintTest() { tft.setTextWrap(false); tft.fillScreen(ST77XX_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST77XX_RED); tft.setTextSize(1); tft.println("Hello World!"); tft.setTextColor(ST77XX_YELLOW); tft.setTextSize(2); tft.println("Hello World!"); tft.setTextColor(ST77XX_GREEN); tft.setTextSize(3); tft.println("Hello World!"); tft.setTextColor(ST77XX_BLUE); tft.setTextSize(4); tft.print(1234.567); delay(1500); tft.setCursor(0, 0); tft.fillScreen(ST77XX_BLACK); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(0); tft.println("Hello World!"); tft.setTextSize(1); tft.setTextColor(ST77XX_GREEN); tft.print(p, 6); tft.println(" Want pi?"); tft.println(" "); tft.print(8675309, HEX); // print 8,675,309 out in HEX! tft.println(" Print HEX!"); tft.println(" "); tft.setTextColor(ST77XX_WHITE); tft.println("Sketch has been"); tft.println("running for: "); tft.setTextColor(ST77XX_MAGENTA); tft.print(millis() / 1000); tft.setTextColor(ST77XX_WHITE); tft.print(" seconds."); } void mediabuttons() { // play tft.fillScreen(ST77XX_BLACK); tft.fillRoundRect(25, 10, 78, 60, 8, ST77XX_WHITE); tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_RED); delay(500); // pause tft.fillRoundRect(25, 90, 78, 60, 8, ST77XX_WHITE); tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_GREEN); tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_GREEN); delay(500); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_BLUE); delay(50); // pause color tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_RED); tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_RED); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_GREEN); }

・「Adafruit ST7735 and ST7789 Library 」にあるExamplesをDisplay_Pack向けに修正したもの。
・「#ifdef PICO ... #endif」などで囲まれた部分が修正部分になる。

ビルド&書き込み

以下の手順でビルトと書き込みができる:

cd pico_proj # ツールなどのインストール(最初の1回のみ) pio run -t clean # ビルドと書き込み # bootselボタンを押しながらホストにUSB接続して # その後、bootselボタンを離すると、書き込み用ストレージが出現する pio run -t upload # この時点で書き込みが完了する

Pico_LED_SW.ino (2021/4/28)

Display_PackのLEDとSWの制御スケッチを以下に紹介する:

src/Pico_LED_SW.ino

// for pimoroni Display Pack (2021/4/28) // setup LEDs & SWs #define LED_R 6 #define LED_G 7 #define LED_B 8 #define SW_A 12 #define SW_B 13 #define SW_X 14 #define SW_Y 15 int swn = 0; int sSW_A = LOW; int sSW_B = LOW; int sSW_X = LOW; int sSW_Y = LOW; int brightness = 0; // how bright the LED is int fadeAmount = 5; // how many points to fade the LED by void setup(void) { // init LEDs (negative logic) pinMode(LED_R, OUTPUT); digitalWrite(LED_R, HIGH); pinMode(LED_G, OUTPUT); digitalWrite(LED_G, HIGH); pinMode(LED_B, OUTPUT); digitalWrite(LED_B, HIGH); //digitalWrite(LED_R, LOW); //digitalWrite(LED_G, LOW); //digitalWrite(LED_B, LOW); // setup SWs pinMode(SW_A, INPUT_PULLUP); pinMode(SW_B, INPUT_PULLUP); pinMode(SW_X, INPUT_PULLUP); pinMode(SW_Y, INPUT_PULLUP); Serial.begin(115200); Serial.print(F("LEDs and SWs Test")); } void loop() { // set the brightness switch(swn) { case 0: analogWrite(LED_R, brightness); // other LEDs off pinMode(LED_G, OUTPUT); digitalWrite(LED_G, HIGH); pinMode(LED_B, OUTPUT); digitalWrite(LED_B, HIGH); break; case 1: analogWrite(LED_G, brightness); // other LEDs off pinMode(LED_R, OUTPUT); digitalWrite(LED_R, HIGH); pinMode(LED_B, OUTPUT); digitalWrite(LED_B, HIGH); break; case 2: analogWrite(LED_B, brightness); // other LEDs off pinMode(LED_R, OUTPUT); digitalWrite(LED_R, HIGH); pinMode(LED_G, OUTPUT); digitalWrite(LED_G, HIGH); break; default: pinMode(LED_R, OUTPUT); digitalWrite(LED_R, HIGH); pinMode(LED_G, OUTPUT); digitalWrite(LED_G, HIGH); pinMode(LED_B, OUTPUT); digitalWrite(LED_B, HIGH); analogWrite(LED_R, brightness); analogWrite(LED_G, brightness); analogWrite(LED_B, brightness); } // change the brightness for next time through the loop: brightness = brightness + fadeAmount; // reverse the direction of the fading at the ends of the fade: if (brightness <= 0 || brightness >= 255) { fadeAmount = -fadeAmount; } sSW_A = digitalRead(SW_A); sSW_B = digitalRead(SW_B); sSW_X = digitalRead(SW_X); sSW_Y = digitalRead(SW_Y); if (sSW_A == LOW) {swn=0; Serial.println("SW_A: pressed");} if (sSW_B == LOW) {swn=1; Serial.println("SW_B: pressed");} if (sSW_X == LOW) {swn=2; Serial.println("SW_X: pressed");} if (sSW_Y == LOW) {swn=3; Serial.println("SW_Y: pressed");} do { sSW_A = digitalRead(SW_A); sSW_B = digitalRead(SW_B); sSW_X = digitalRead(SW_X); sSW_Y = digitalRead(SW_Y); delay(50); } while ((sSW_A == LOW)||(sSW_B == LOW)||(sSW_X == LOW)||(sSW_Y == LOW)) ; }

(1)スイッチ(SW_A,SW_B,SW_X,SW_Y)を押すとスイッチの状態がシリアル出力される。
(2)SW_Aを押すとLEDが赤、SW_Bを押すとLEDが緑、SW_Xを押すとLEDが青、SW_Yを押すと白に、明るさが変化しながら光る。

ただし、Arduino純正ボードライブラリ(platformio,Arduino-IDEとも)にバグがあるようで、SW_Yは動作せず、LEDの色も混じった色になり意図したものと異なる。(pinModeのbug??)

earlephilhower版Arduino-IDE(以下のjsonファイルを設定するもの)のボードライブラリは問題が無いようで、SW_Yも正常動作するし、LEDの色も混ざらない。

https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json

参考情報

Arduino-IDE関連:
Arduino-IDEでPicoを動かす

Pico-Platformio(Arduino)関連:
platformioでpicoを動かす
Official PlatformIO + Arduino IDE support for the Raspberry Pi Pico is now available!

platformio関連:
PlatformIO Core (CLI)
Arduino-IDEとPlatformioのコンパイラーの挙動の違いについて
arduinoフレームワーク用platformio.ini集
ubuntu20.04をインストールする

以上

続きを読む "Display_Packをpico_arduinoで動かす"

| | コメント (0)

2021年4月22日 (木)

platformioでpicoを動かす

2021/4/24+
arduino-frameworkの対応を追加した、

2021/4/22
初版

Pico Platformio Pico-SDK/Arduino

Pico Platformio Pico-SDK/Arduino

概要

platformioでpicoを動かす
(ホストはubuntu20.04を想定している)
platformioが既にインストールされている前提で説明する。

platformioのインストールについては以下などを参照のこと:
arduinoフレームワーク用platformio.ini集

プロジェクトの作成

プロジェクトのディレクトリを作成して、その中に以下に述べるファイルを作成する:
(このディレクトリ名は任意だが、ここでは、pico_projとする)

# platformioの環境に入っている前提 mkdir pico_proj cd pico_proj # platformio.iniを作成する gedit platformio.ini

platformio.ini

[env:raspberry-pi-pico] platform = https://github.com/Wiz-IO/wizio-pico.git ;platform = wizio-pico board = raspberry-pi-pico framework = baremetal upload_port = /media/USER/RPI-RP2/ ; directory for mass-storage monitor_port = /dev/ttyACM0 ; directory for usb-over-serial monitor_speed = 115200 board_build.bynary_type = copy_to_ram build_flags = -D PICO_STDIO_USB ; enable stdio over USB build_unflags = -D PICO_STDIO_UART ;lib_deps =

・USERは環境依存なので、自分の環境に合わせて変更すること。
・frameworkとしては、baremetal(Pico-SDK)を設定する。

テスト用プログラムを以下のように作成する:
src/main.c

/* * --------------------------------------- * Copyright (c) Sebastian Günther 2021 | * | * devcon@admantium.com | * | * SPDX-License-Identifier: BSD-3-Clause | * --------------------------------------- */ #include <stdio.h> #include <stdbool.h> #include "pico/stdlib.h" int LED_BUILTIN = 25; int LED_GREEN = 15; void setup() { stdio_init_all(); gpio_init(LED_BUILTIN); gpio_set_dir(LED_BUILTIN, GPIO_OUT); gpio_init(LED_GREEN); gpio_set_dir(LED_GREEN, GPIO_OUT); } void blink() { gpio_put(LED_BUILTIN, 1); gpio_put(LED_GREEN, 1); //sleep_ms(750); sleep_ms(200); gpio_put(LED_BUILTIN, 0); gpio_put(LED_GREEN, 0); //sleep_ms(1050); sleep_ms(200); } int main() { setup(); printf("Starting...\n"); while (true) { printf("Hello World\n"); //printf("."); blink(); } return 0; }

・「Raspberry Pico: The Simple Startup with PlatformIO 」にあるサンプルを一部修正したものになる。

ビルド&書き込み

以下の手順でビルトと書き込みができる:

cd pico_proj # ツールなどのインストール(最初の1回のみ) pio run -t clean # ビルドと書き込み # bootselボタンを押しながらホストにUSB接続して # その後、bootselボタンを離すると、書き込み用ストレージが出現する pio run -t upload # この時点で書き込みが完了する

出力例:

<省略> Archiving .pio/build/raspberry-pi-pico/sdk/libSDK.a Indexing .pio/build/raspberry-pi-pico/sdk/libSDK.a Linking .pio/build/raspberry-pi-pico/APPLICATION.elf Building .pio/build/raspberry-pi-pico/APPLICATION.bin Checking size .pio/build/raspberry-pi-pico/APPLICATION.elf DONE Advanced Memory Usage is available via "PlatformIO Home > Project Inspect" RAM: [ ] 2.2% (used 5848 bytes from 262144 bytes) Flash: [ ] 2.0% (used 41728 bytes from 2097152 bytes) Configuring upload protocol... AVAILABLE: cmsis-dap, dap, picoprobe, uf2 CURRENT: upload_protocol = uf2 Uploading... Converting to UF2 Start address: 0x10000000 FamilyID: 0xe48bff56 Output size: 84480 bytes Wrote 84480 bytes to /media/USER/RPI-RP2/APPLICATION.uf2 DONE ========================= [SUCCESS] Took 3.39 seconds =========================

・書き込み終了後、プログラムが起動する。ボード上のLEDが点滅して、
USBシリアルには「Hello World」の文字列が繰り返し出力される。

他のサンプル(morse_blinky)

morse_blinky
src/main.c

cat src/main.c // morse_blinky // modified on 2021/2/6 /** * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. * * SPDX-License-Identifier: BSD-3-Clause */ #include <stdio.h> #include "pico/stdlib.h" #include "hardware/gpio.h" char str[100]; const uint LED_PIN = 25; const uint DOT_PERIOD_MS = 100; const char *morse_letters[] = { ".-", // A "-...", // B "-.-.", // C "-..", // D ".", // E "..-.", // F "--.", // G "....", // H "..", // I ".---", // J "-.-", // K ".-..", // L "--", // M "-.", // N "---", // O ".--.", // P "--.-", // Q ".-.", // R "...", // S "-", // T "..-", // U "...-", // V ".--", // W "-..-", // X "-.--", // Y "--.." // Z }; void put_morse_letter(const char *pattern) { for (; *pattern; ++pattern) { gpio_put(LED_PIN, 1); if (*pattern == '.') sleep_ms(DOT_PERIOD_MS); else sleep_ms(DOT_PERIOD_MS * 3); gpio_put(LED_PIN, 0); sleep_ms(DOT_PERIOD_MS * 1); } sleep_ms(DOT_PERIOD_MS * 2); } void put_morse_str(const char *str) { for (; *str; ++str) { if (*str >= 'A' && *str <= 'Z') { put_morse_letter(morse_letters[*str - 'A']); } else if (*str >= 'a' && *str <= 'z') { put_morse_letter(morse_letters[*str - 'a']); } else if (*str == ' ') { sleep_ms(DOT_PERIOD_MS * 4); } } } int main() { stdio_init_all(); gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); while (true) { printf("Enter String for Morse\n"); fflush(stdin); scanf("%s",str); //gets(str); // does not work?? printf("morse: %s\n", str); //puts(str); //put_morse_str("Hello world"); put_morse_str(str); //sleep_ms(1000); } }

・USBシリアル経由で文字列を入力すると、それに対応したモールス信号でLEDが点滅する。

Arduino framework 対応(2021/4/24)

arduinoのframeworkとして使用する場合は以下のplatformio.iniを使用する:

platformio.ini

[env:pico] platform = https://github.com/platformio/platform-raspberrypi.git framework = arduino board = pico upload_port = /media/USER/RPI-RP2/ ; directory for mass-storage monitor_port = /dev/ttyACM0 ; directory for usb-over-serial monitor_speed = 115200 ;lib_deps =

・USERは、環境依存なので、自分の環境の合わせること。

(1)プログラム(スケッチ)のファイルタイプは.cppではなく.inoを使用すること。
(2)platformio.ini,src/main.inoを作成した後、
以下を実行してudev-ruleを登録する:(src/main.inoはダミーで良い)

# プロジェクト・ディレクトリの中で以下を実行して関係ツールをダウンロードする pio run -t clean # udev-ruleを登録する cd ~/.platformio/packages/framework-arduino-mbed sudo bash ./post_install.sh

udev-rule登録が完了して、書き込みが正常に動作した場合、
以下のような出力になる:

$ pio run -v -t upload # 詳細情報を出力するために「-v」を付けている <省略> Advanced Memory Usage is available via "PlatformIO Home > Project Inspect" RAM: [== ] 18.7% (used 50500 bytes from 270336 bytes) Flash: [ ] 3.5% (used 73048 bytes from 2097152 bytes) .pio/build/pico/firmware.elf : section size addr .boot2 256 268435456 .text 53048 268435712 .rodata 8620 268488760 .ARM.exidx 8 268497380 .ram_vector_table 192 536870912 .data 11372 536871104 .uninitialized_ram.magic_location 12 536882476 .uninitialized_data 0 536882488 .scratch_x 0 537133056 .scratch_y 0 537137152 .bss 39128 536882488 .heap 210416 536921616 .ARM.attributes 40 0 .comment 132 0 .debug_frame 5144 0 .stab 60 0 .stabstr 118 0 Total 328546 <lambda>(["upload"], [".pio/build/pico/firmware.elf"]) AVAILABLE: cmsis-dap, raspberrypi-swd, stlink BeforeUpload(["upload"], [".pio/build/pico/firmware.elf"]) Use manually specified: /media/USER/RPI-RP2/ Forcing reset using 1200bps open/close on port /media/USER/RPI-RP2/ # バグ?で間違ったシリアルポートが選択されているので、ボートがリセットできない /home/USER/.platformio/packages/tool-rp2040tools/rp2040load -v -D .pio/build/pico/firmware.elf rp2040load 1.0.1 - compiled with go1.15.8 .Loading into Flash: [ ] 0% Loading into Flash: [= ] 5% Loading into Flash: [=== ] 11% Loading into Flash: [==== ] 16% Loading into Flash: [====== ] 22% Loading into Flash: [======== ] 27% Loading into Flash: [========= ] 33% Loading into Flash: [=========== ] 39% Loading into Flash: [============= ] 44% Loading into Flash: [=============== ] 50% Loading into Flash: [================ ] 55% Loading into Flash: [================== ] 61% Loading into Flash: [=================== ] 66% Loading into Flash: [===================== ] 72% Loading into Flash: [======================= ] 78% Loading into Flash: [======================== ] 83% Loading into Flash: [========================== ] 89% Loading into Flash: [============================ ] 94% Loading into Flash: [==============================] 100% ========================= [SUCCESS] Took 2.73 seconds =========================

重要:
・現状、バグ?で、USBシリアル経由のボード・リセットができない。
そのため、書き込み前に、ボードのbootselボタンを押しながらホストのUSBに接続して、
その後、bootselボタンを離して、書き込みストレージを出現させる必要がある。
・または、以下のようにplatformio.iniを一部修正すると ボード・リセットが正常に動き、書き込みが成功するようだ。
(もしかして、これが仕様なのかも知れない)

upload_port = /dev/ttyACM0 ;upload_port = /media/USER/RPI-RP2/ ; directory for mass-storage


Arduino用デモ・スケッチ

ASCIITablePico:
src/main.ino

/* ASCII table Prints out byte values in all possible formats: - as raw binary values - as ASCII-encoded decimal, hex, octal, and binary values For more on ASCII, see http://www.asciitable.com and http://en.wikipedia.org/wiki/ASCII The circuit: No external hardware needed. created 2006 by Nicholas Zambetti <http://www.zambetti.com> modified 9 Apr 2012 by Tom Igoe This example code is in the public domain. http://www.arduino.cc/en/Tutorial/ASCIITable */ void setup() { //Initialize serial and wait for port to open: //Serial.begin(9600); Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // prints title with ending line break Serial.println("ASCII Table ~ Character Map"); } // first visible ASCIIcharacter '!' is number 33: int thisByte = 33; // you can also write ASCII characters in single quotes. // for example, '!' is the same as 33, so you could also use this: // int thisByte = '!'; void loop() { // prints value unaltered, i.e. the raw binary version of the byte. // The Serial Monitor interprets all bytes as ASCII, so 33, the first number, // will show up as '!' Serial.write(thisByte); Serial.print(", dec: "); // prints value as string as an ASCII-encoded decimal (base 10). // Decimal is the default format for Serial.print() and Serial.println(), // so no modifier is needed: Serial.print(thisByte); // But you can declare the modifier for decimal if you want to. // this also works if you uncomment it: // Serial.print(thisByte, DEC); Serial.print(", hex: "); // prints value as string in hexadecimal (base 16): Serial.print(thisByte, HEX); Serial.print(", oct: "); // prints value as string in octal (base 8); Serial.print(thisByte, OCT); Serial.print(", bin: "); // prints value as string in binary (base 2) also prints ending line break: Serial.println(thisByte, BIN); // if printed last visible character '~' or 126, stop: if (thisByte == 126) { // you could also use if (thisByte == '~') { thisByte = 33-1; Serial.println("----------------------------------------------"); Serial.println(""); delay(500); /* // This loop loops forever and does nothing while (true) { continue; } */ } // go on to the next character thisByte++; }

・標準のスケッチをベースにPicoボードにリセットがないので繰り返し実行するように変更したもの

Blink:
src/main.ino

/* Blink Turns an LED on for one second, then off for one second, repeatedly. Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to the correct LED pin independent of which board is used. If you want to know what pin the on-board LED is connected to on your Arduino model, check the Technical Specs of your board at: https://www.arduino.cc/en/Main/Products modified 8 May 2014 by Scott Fitzgerald modified 2 Sep 2016 by Arturo Guadalupi modified 8 Sep 2016 by Colby Newman This example code is in the public domain. http://www.arduino.cc/en/Tutorial/Blink */ // the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(LED_BUILTIN, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }

・標準のスケッチ(変更なし)

参考情報

Pico-Platformio(Pico-SDK)関連:
Raspberry Pico: The Simple Startup with PlatformIO
BAREMETAL(pico-sdk)
Examples
Raspberry Pi Pico RP2040 - PlatformIO (Pico-SDK & Arduino)

Pico-Platformio(Arduino)関連:
Official PlatformIO + Arduino IDE support for the Raspberry Pi Pico is now available!

platformio関連:
PlatformIO Core (CLI)
Arduino-IDEとPlatformioのコンパイラーの挙動の違いについて
arduinoフレームワーク用platformio.ini集
ubuntu20.04をインストールする

以上

続きを読む "platformioでpicoを動かす"

| | コメント (0)

2021年3月10日 (水)

platfomioを使ってnaitive(linux/windows)のプログラムをビルドする方法

2021/3/10
初版

platformio naitive build

platformio naitive build

概要

platfomioを使ってnaitive(linux/windows)のプログラムをビルドする方法について述べる。
ここでは、platformioがインストール済みを前提とする。
実行環境はubuntuとwindows10を前提にする。

windows10の場合

ここでは既にscoopなどでplatformioがインストール済みとする。
以下の2つのファイルをプロジェクト・デレクトリに用意する:
platformio.ini

; PlatformIO Project Configuration File ; ; Build options: build flags, source filter, extra scripting ; Upload options: custom port, speed and extra flags ; Library options: dependencies, extra library storages ; ; Please visit documentation for the other options and examples ; http://docs.platformio.org/page/projectconf.html [env:windows_x86] # Stable version #platform = windows_x86 # Development version platform = https://github.com/platformio/platform-windows_x86.git

src/main.c

#include <stdio.h> int main() { printf("Hello World from PlatformIO!\n"); return 0; }

ビルド/実行の例:
PowerShell

mkdir win cd win notepad platformio.ini #上の内容になるように編集する。 mkdir src notepad src/main.c #上の内容になるように編集する。 pio run -t clean #必要なツールのダウンロードとインストールが行われる。 # ビルド pio run # 実行 .\.pio\build\windows_x86\program.exe #(実行・出力例) Hello World from PlatformIO!

ubuntuの場合

ここでは既にplatformioがインストール済みとする。
以下の2つのファイルをプロジェクト・デレクトリに用意する:
platformio.ini

; PlatformIO Project Configuration File ; ; Build options: build flags, source filter, extra scripting ; Upload options: custom port, speed and extra flags ; Library options: dependencies, extra library storages ; ; Please visit documentation for the other options and examples ; http://docs.platformio.org/page/projectconf.html [env:linux_x86_64] # Stable version #platform = linux_x86_64 # Development version platform = https://github.com/platformio/platform-linux_x86_64.git

src/main.c

#include <stdio.h> int main() { printf("Hello World from PlatformIO!\n"); return 0; }

ビルド/実行の例:
bash

mkdir pc cd pc gedit platformio.ini #上の内容になるように編集する。 mkdir src gedit src/main.c #上の内容になるように編集する。 pio run -t clean #必要なツールのダウンロードとインストールが行われる。 # ビルド pio run # 実行 ./.pio/build/linux_x86_64/program #(実行・出力例) Hello World from PlatformIO!

参考情報

platformio関連:
windows10にplatformioをインストールする(scoop版)
arduinoフレームワーク用platformio.ini集(linux版PlatformIOのインストール方法)

PlatformIO Core (CLI)
Arduino-IDEとPlatformioのコンパイラーの挙動の違いについて
ubuntu20.04をインストールする

以上

続きを読む "platfomioを使ってnaitive(linux/windows)のプログラムをビルドする方法"

| | コメント (0)

2021年3月 7日 (日)

platformioのプログラムをArduino-IDEにインポートする方法

2021/3/6
初版

import platformio to Arduino-IDE

import platformio to Arduino-IDE

概要

platformioのプログラムをArduino-IDEにインポートする方法について述べる。
以下を前提とする:
(1)platformioのframeworkとして、arduinoに設定している
(2)Arduino-IDEは、インストール済みで使用するボードのボードマネージャーでの設定が完了している
(3)Arduino-IDEのディレクトリ構成はデフォルトのままとする
(4)ホストPCのOSとしてubuntuを使用している

インポート作業の流れとしては以下になる:
(1)platformioのプログラムをArduinoのディレクトリにコピーする
(2)platformioで使用しているライブラリをArduino/librariesにコピーする

実際の手順

ここでは例として、platformioのwiot-nixie-NTP(ディレクトリ)のプログラムを Arduino-IDEにインポートすることにする。

cd pio_ws # プログラムをコピーする cp -r wiot-nixie-NTP/src ~/Arduino/wiot-nixie-NTP mv ~/Arduino/wiot-nixie-NTP/*.ino ~/Arduino/wiot-nixie-NTP/wiot-nixie-NTP.ino cd wiot-nixie-NTP # ライブラリをダウンロードする # (以前、ビルドしたことがあれば不要) pio run # ライブラリをコピーする cp -r .pio/libdeps/seeed_wio_terminal/* ~/Arduino/libraries/

ここで「seeed_wio_terminal」は、ボード名称になるので、自分の状況にあわせて変更すること。

参考情報

スケッチ関連:
nixieクロックにNTPクライアントの機能を追加する(V2)
Wio-Terminal/ESP8622/ESP32ボードを共通のスケッチで動かす(NTP-CLIENT編)

PlatformIO関連:
arduinoフレームワーク用platformio.ini集
windows10にplatformioをインストールする(scoop版)
WSL2でのplatformioやPico-SDKの利用方法
PlatformIO Core (CLI)

Arduino-IDE関連:
Arduino IDEをUbuntu 20.04にインストールする
How to add boards in the board manager
Customizing the Arduino IDE
Arduino IDEライブラリのインストールとディレクトリ(フォルダ)構成 (Windows, Mac, Linux対応)
A Tour Inside Arduino Core: Source Files, How to Make A New Core and Arduino Building Steps

以上

続きを読む "platformioのプログラムをArduino-IDEにインポートする方法"

| | コメント (0)

2021年3月 1日 (月)

windows10にplatformioをインストールする(scoop版)

2021/3/1

platformio windows10

platformio windows10

概要

windows10にplatformioをインストールする(scoop版)
windows10にscoopでplatformioをインストールする方法について述べる。

platformioをインストールする

PowerShell

# scoopをインストール Set-ExecutionPolicy RemoteSigned -scope CurrentUser iwr -useb get.scoop.sh | iex # pythonをインストールする scoop install python pip3 install platformio # (必要があれば)windows用VScodeをインストールする scoop bucket add extras scoop install vscode # 別の機能が割り当てられているaliasを削除する del alias:curl del alias:wget # curl, wgetをインストールする scoop install curl scoop install wget # その他の必要となるツールをインストールする scoop install git

scoopの簡単な説明:

# xxxxをインストール scoop install xxxx # Scoop自身とローカル内にあるアプリの更新情報を更新 scoop update # 最新バージョンでないアプリがあるかをチェック scoop status # xxxxを更新 scoop update xxxx # すべてのアプリを更新 scoop update * # xxxxをアンインストール scoop uninstall xxxx

platformioの使い方

# プロジェクトのディレクトリを作る # (一つのスケッチごとに一つのディレクトリ) mkdir proj cd proj # ソースを置くディレクトリsrcを作る mkdir src # スケッチを作成する # (テスト・スケッチとして以降にASCIITable.inoがある) notepad src/main.ino # 使うボードに対応したplatformio.iniを作る # (内容については以降を参照のこと) notepad platformio.ini # スケッチをビルドする # (最初の1回はライブラリ・ツールを自動的にダウンロードする) pio run # ボードをUSB接続して書き込む pio run -t upload

platformio.iniの具体的な内容は「arduinoフレームワーク用platformio.ini集」を参照のこと

その他の使い方

# build結果をクリアする pio run -t clean # キャッシュをクリアする # (ツールやライブラリがダウンロードし直しになるので注意のこと) rm -r .pio # 環境を切り替えて書き込む pio run -e f303 -t upload pio run -e f103 -t upload

環境を切り替えて書き込む場合のplatformio.iniは
以下のように複数の環境[env:xxx]を持っていること:
platformio.ini

[env:f103] platform = ststm32 board = nucleo_f103rb framework = arduino build_flags = -DNUCLEO_F103RB monitor_speed = 115200 lib_ldf_mode = deep+ upload_protocol = stlink #lib_deps = [env:f303] platform = ststm32 board = nucleo_f303k8 framework = arduino build_flags = -DNUCLEO_F303K8 monitor_speed = 115200 lib_ldf_mode = deep+ upload_protocol = stlink #lib_deps =

[env:xxxx]のxxxxの部分は環境名にあたり、 ダブらない任意の名前であること。

テスト用スケッチ

src/ASCIItable.ino

/* ASCII table Prints out byte values in all possible formats: - as raw binary values - as ASCII-encoded decimal, hex, octal, and binary values For more on ASCII, see http://www.asciitable.com and http://en.wikipedia.org/wiki/ASCII The circuit: No external hardware needed. created 2006 by Nicholas Zambetti <http://www.zambetti.com> modified 9 Apr 2012 by Tom Igoe This example code is in the public domain. http://www.arduino.cc/en/Tutorial/ASCIITable */ void setup() { //Initialize serial and wait for port to open: Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // prints title with ending line break Serial.println("ASCII Table ~ Character Map"); } // first visible ASCIIcharacter '!' is number 33: int thisByte = 33; // you can also write ASCII characters in single quotes. // for example, '!' is the same as 33, so you could also use this: // int thisByte = '!'; void loop() { // prints value unaltered, i.e. the raw binary version of the byte. // The Serial Monitor interprets all bytes as ASCII, so 33, the first number, // will show up as '!' Serial.write(thisByte); Serial.print(", dec: "); // prints value as string as an ASCII-encoded decimal (base 10). // Decimal is the default format for Serial.print() and Serial.println(), // so no modifier is needed: Serial.print(thisByte); // But you can declare the modifier for decimal if you want to. // this also works if you uncomment it: // Serial.print(thisByte, DEC); Serial.print(", hex: "); // prints value as string in hexadecimal (base 16): Serial.print(thisByte, HEX); Serial.print(", oct: "); // prints value as string in octal (base 8); Serial.print(thisByte, OCT); Serial.print(", bin: "); // prints value as string in binary (base 2) also prints ending line break: Serial.println(thisByte, BIN); // if printed last visible character '~' or 126, stop: if (thisByte == 126) { // you could also use if (thisByte == '~') { // This loop loops forever and does nothing while (true) { continue; } } // go on to the next character thisByte++; }

本スケッチはarduinoのサンプルそのもの(bpsのみ変更)である。

alias削除の永続化

インストール時に以下でalias削除したものは、PowerShellのセッションを閉じると無効になり復活する。

# 別の機能が割り当てられているaliasを削除する del alias:curl del alias:wget

したがって、削除を永続化するためにセッション起動時に自動実行されるPowerShellのスクリプト(Microsoft.PowerShell_profile.ps1)の 末尾に以下を追加する: Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
(存在しない場合、新規に作成する)

del alias:curl del alias:wget

ビルド・エラー

Arduino-IDEのコンパイラと異なり、platformioのコンパイラは、関数定義の後方参照を許さないので、 この場合、関数の未定義エラーになる。したがって、Arduino-IDEでビルドできているソースでもエラーになることがある。このときの対応方法は、未定義エラーになる関数定義をプロトタイプ宣言としてソースの先頭に置き、後方参照を解消する。(関数定義の本体の位置はそのままで移動させる必要はない)

参考情報

WindowsコマンドラインツールScoopのすすめ(基礎編)
Windowsでパッケージ管理したいなら、先ずScoopより始めよ
PowerShell コンソール内で curl や wget が実行できないとお嘆きのあなたへ

PlatformIO M5ATOM on Windows10
TinyGO Install XIAO on Windows10

M5Stack関連:
PlatformIO M5Stack開発の現状
・https://github.com/m5stack/M5StickC-Plus.git
・https://github.com/m5stack/M5StickC.git
・https://github.com/m5stack/M5Stack.git

micro:bit関連:
micro:bit Arduino/MBED開発ツール(v2)(micro:bit-v2対応,linux版)
micro:bit v2 で遊ぶ

platformio関連:

https://docs.platformio.org/en/latest/platforms/creating_board.html Installation 1.Create boards directory in core_dir if it doesn’t exist. 2.Create myboard.json file in this boards directory. 3.Search available boards via pio boards command. You should see myboard board.

PlatformIO Core (CLI)
Arduino-IDEとPlatformioのコンパイラーの挙動の違いについて
ubuntu20.04をインストールする
Advanced Scripting - Before/Pre and After/Post actions

以上

続きを読む "windows10にplatformioをインストールする(scoop版)"

| | コメント (0)

2021年2月27日 (土)

WSL2でのplatformioやPico-SDKの利用方法

2021/4/20++
arduinoボードにリセットをかけて書き込み用ストレージを出現させるスクリプトを追加した。

2021/4/12
uf2やmbedの書き込みのドライブを自動検出に改良した。

2021/3/10
さらにextra_script.pyを改良して mbed,uf2のファイルによる書き込みも自動化した。

2021/3/8+
さらにextra_script.pyを改良して XIAO,wio-terminalの書き込みをサポートした。

2021/3/4
さらにextra_script.pyを改良して 書き込み用ストレージがないボード(UNO,M5ATOMなど)でも プログラムが書き込めるようにした。

2021/3/1
extra_script.pyを改良して uf2まで自動生成するようにした。

2021/2/27
初版

WSL2 platformio Pico-SDK

WSL2 platformio Pico-SDK

概要

WSL2(Windows Subsystem for Linux version2)でのplatformioやPico-SDKの利用方法
WSL2でplatformioやPico-SDKを利用した場合、WSL2はUSBデバイスをサポートしていないので、そのままでは、ビルドまではできるが、書き込みができない。本記事では、その解決方法について述べる。
(ホストはubuntu20.04を想定している)

基本的な考え方は、書き込み用ストレージが現れるボードに限定されるが、 書き込み用ストレージのためのファイル(.uf2または.hex)を作成して、 それをWSL2側からPowerShellを使って該当ストレージにコピーすることで 書き込みを行う。

したがって、書き込みストレージがないボード(Arduno-UNOやESP32ボードなど)は書き込めないが、 それ以外のボード(XIAO,Wio-Terminal,Nucleo,micro:bitなど)は書き込みが可能となる。

追記1:
書き込みストレージがないボード(Arduno-UNO、M5ATOM(ESP32ボード))でも、windows側の書き込みツールを利用することでプログラムが書き込めるよう extra_script.pyを改良した。(2021/3/4)

追記2:
XIAO、wio-terminalにおいて、 windows側の書き込みツール(bossac)を利用することでプログラムが書き込めるよう extra_script.pyを改良した。(2021/3/8)

追記3:
mbedボードとuf2ファイルによる書き込みをサポートしているボードにおいて 自動的に書き込むように extra_script.pyを改良した。(2021/3/10)

準備(インストール)

platformioやPico-SDKのインストールについては 以下の記事がほとんどそのまま参考になる。 (ただし、udev登録などUSB関連は除く)

arduinoフレームワーク用platformio.ini集
PicoボードにPico_SDKでC言語をビルドする

platformioの場合

ビルド時にhexファイルが必要となるので platformio.iniに以下の行を追加する:
# 任意の位置で良いが、例えば「board=」の次の行に追加する

extra_scripts = post:extra_script.py

実行するスクリプトをカレントディレクトリに 以下の内容で作成する:
extra_script.py

Import("env") # Custom HEX from ELF env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "$OBJCOPY", "-O", "ihex", "-R", ".eeprom", "$BUILD_DIR/${PROGNAME}.elf", "$BUILD_DIR/${PROGNAME}.hex" ]), "Building $BUILD_DIR/${PROGNAME}.hex") )

参照:Add a new option which could generate .hex file in platformio.ini #240

ここで「pio run」の実行すると、.hexが生成される。

mbed系ボード(nucleo,micro:bitなど)は、書き込むファイルのフォーマットが.hexなので、
以下の手順で書き込みができる:

PowerShell.exe copy .pio/build/*/firmware.hex e:

ただし、「e:」は書き込みストレージのドライブ・レターなので環境に依存するので自分の環境でのドライブ・レターに置き換える。
(windows側のエクスプローラーなどで該当のドライブ・レターを確認できる)

Microchip(Almel)SAMD21/SAMD51ボード(XIAO,Wio-Terminalなど)の場合、書き込むフォーマットは、.uf2なので変換する必要がある。

このため以下の手順でツールをインストールする:

wget https://raw.githubusercontent.com/microsoft/uf2/master/utils/uf2conv.py chmod +x uf2conv.py

参照:
uf2conv -- Packing and unpacking UF2 files

XIOA(SAMD21)ボードの場合、以下のコマンドで.uf2に変換する:

./uf2conv.py .pio/build/*/firmware.hex -f 0x68ed2b88 -c -o hex2.uf2

Wio-Termial(SAMD51)ボードの場合、以下のコマンドで.uf2に変換する:

./uf2conv.py .pio/build/*/firmware.hex -f 0x55114460 -c -o hex2.uf2

他のチップに対応する場合、「-f xxxxx」のxxxxxがfamilyID(=ChipID)なので、その部分を該当IDに置き換える。
familyIDは以下を参照のこと:
Family list vs familyID

.uf2に変換後、以下の手順で書き込む:

PowerShell.exe copy hex2.uf2 e:

ただし、「e:」は書き込みストレージのドライブ・レターなので環境に依存するので自分の環境でのドライブ・レターに置き換える。
(windows側のエクスプローラーなどで該当のドライブ・レターを確認できる)

なお、以下のスクリプトで書き込みを自動化できる:
cp_wiot.sh
# SAMD51用

#!/bin/bash ./uf2conv.py .pio/build/*/firmware.hex -f 0x55114460 -c -o hex2.uf2 PowerShell.exe copy hex2.uf2 e:

注意:familyIDがチップごとに異なることに注意のこと。

Pico-SDKの場合

ビルドすると、自動的に.uf2まで作成するので、以下の手順で書き込むことができる:

PowerShell.exe copy xxxx.uf2 e:

ただし、「e:」は書き込みストレージのドライブ・レターなので環境に依存するので自分の環境でのドライブ・レターに置き換える。
(windows側のエクスプローラーなどで該当のドライブ・レターを確認できる)

extra_script.pyの改良

以下のように改良して、uf2生成までを自動化した:
extra_script.py

Import("env") board = env.GetProjectOption("board") #print("board:"+board) # set familyID(chip ID) familyID = 'undefined!' if "seeed_wio_terminal" == board: familyID = "0x55114460" if "adafruit_feather_m4" == board: familyID = "0x55114460" if "adafruit_grandcentral_m4" == board: familyID = "0x55114460" if "seeed_xiao" == board: familyID = "0x68ed2b88" if "adafruit_circuitplayground_m0" == board: familyID = "0x68ed2b88" if "nucleo_f103rb" == board: familyID = "mbed" if "nucleo_f303k8" == board: familyID = "mbed" if 'mbed' == familyID: # Custom HEX from ELF env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "$OBJCOPY", "-O", "ihex", "-R", ".eeprom", " $BUILD_DIR/${PROGNAME}.elf", "$BUILD_DIR/${PROGNAME}.hex" ]), "(1)Building $BUILD_DIR/${PROGNAME}.hex") ) elif 'undefined!' != familyID: # Custom HEX from ELF env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "$OBJCOPY", "-O", "ihex", "-R", ".eeprom", " $BUILD_DIR/${PROGNAME}.elf", "$BUILD_DIR/${PROGNAME}.hex" ]), "(1)Building $BUILD_DIR/${PROGNAME}.hex") ) # uf2 from HEX env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "python3 uf2conv.py $BUILD_DIR/${PROGNAME}.hex -f ", familyID, " -c -o $BUILD_DIR/${PROGNAME}.uf2" ]), "(2)Converting $BUILD_DIR/${PROGNAME}.uf2") ) # copy uf2 to current dir env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "cp $BUILD_DIR/${PROGNAME}.uf2 ." ]), "(3)Copying ${PROGNAME}.uf2 in current dir") )

以下が改良点になる:
(1)boardチェック
boardをチェックして自動的にfamilyIDを設定する。
# 定義がないboardの場合、追加する必要あり。
(2)mbed対応
boardをチェックしてmbed系ボードの場合、自動的にhexを生成する。
(2)uf2をカレントディレクトリにコピーする
書き込みドライブにコピーする際の利便性の向上

プログラミング・ヒント:
以下の部分において「 "$BUILD_DIR/${PROGNAME}.elf",」は、
「 "$BUILD_DIR/${PROGNAME}.hex",」にしたくなるが、
通常のビルド・プロセスで生成したファイルである必要がある。

# uf2 from HEX env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf",

extra_script.pyの改良(2021/3/4,2021/3/8,2021/3/10)

以下のように、さら改良して、UNO,M5ATOM,XIAO,wio-terminal,mbedボートやuf2ファイルでの書き込みするボードを書き込めるようにした:
extra_script.py

Import("env", "projenv") # access to global construction environment #print("env:") #print(dir(env)) # access to project construction environment #print("projenv:") #print(dir(projenv)) board = env.GetProjectOption("board") #print("board:"+board) ext = env.GetProjectOption("ext") print("ext:"+ext) # set familyID(chip ID) familyID = 'undefined!' if "seeed_wio_terminal" == board: familyID = "0x55114460" if "adafruit_feather_m4" == board: familyID = "0x55114460" if "adafruit_grandcentral_m4" == board: familyID = "0x55114460" if "seeed_xiao" == board: familyID = "0x68ed2b88" if "adafruit_circuitplayground_m0" == board: familyID = "0x68ed2b88" if "nucleo_f103rb" == board: familyID = "mbed" if "nucleo_f303k8" == board: familyID = "mbed" if "bbcmicrobit" == board: familyID = "mbed" if 'esp32dev' == board: # Custom BIN from ELF env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "esptool.py --chip esp32 elf2image $BUILD_DIR/${PROGNAME}.elf" ]), "(1)Building $BUILD_DIR/${PROGNAME}.bin") ) if '' != ext: env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "./"+ext ]), "(2)Doing something for ESP32 board") ) elif 'm5stick-c' == board: # Custom BIN from ELF env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "esptool.py --chip esp32 elf2image $BUILD_DIR/${PROGNAME}.elf" ]), "(1)Building $BUILD_DIR/${PROGNAME}.bin") ) if '' != ext: env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "./"+ext ]), "(2)Doing something for m5Stick-c/M5Atom board") ) if 'uno' == board: # Custom HEX from ELF env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "$OBJCOPY", "-O", "ihex", "-R", ".eeprom", " $BUILD_DIR/${PROGNAME}.elf", "$BUILD_DIR/${PROGNAME}.hex" ]), "(1)Building $BUILD_DIR/${PROGNAME}.hex") ) if '' != ext: env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "./"+ext ]), "(2)Doing something for UNO board") ) # check familyID(include mbed) if 'mbed' == familyID: # Custom HEX from ELF env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "$OBJCOPY", "-O", "ihex", "-R", ".eeprom", " $BUILD_DIR/${PROGNAME}.elf", "$BUILD_DIR/${PROGNAME}.hex" ]), "(1)Building $BUILD_DIR/${PROGNAME}.hex") ) if '' != ext: env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "./"+ext ]), "(2)Doing something for mbed board") ) elif 'undefined!' != familyID: # Custom BIN from ELF env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "$OBJCOPY", "-O", "binary", " $BUILD_DIR/${PROGNAME}.elf", "$BUILD_DIR/${PROGNAME}.bin" ]), "(0)Building $BUILD_DIR/${PROGNAME}.bin") ) # Custom HEX from ELF env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "$OBJCOPY", "-O", "ihex", "-R", ".eeprom", " $BUILD_DIR/${PROGNAME}.elf", "$BUILD_DIR/${PROGNAME}.hex" ]), "(1)Building $BUILD_DIR/${PROGNAME}.hex") ) # uf2 from HEX env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", # "$BUILD_DIR/${PROGNAME}.hex", env.VerboseAction(" ".join([ "python3 uf2conv.py $BUILD_DIR/${PROGNAME}.hex -f ", familyID, " -c -o $BUILD_DIR/${PROGNAME}.uf2" ]), "(2)Converting $BUILD_DIR/${PROGNAME}.uf2") ) # copy uf2 to current dir env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "cp $BUILD_DIR/${PROGNAME}.uf2 ." ]), "(3)Copying ${PROGNAME}.uf2 in current dir") ) if '' != ext: env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", env.VerboseAction(" ".join([ "./"+ext ]), "(4)Doing something for uf2 board") )

動作原理:
WSL2側で書き込みに必要なファイルを作成したあと、 windows10側のc:/tempのデイレクトリに、そのファイルをコピーして PowerShell経由でwindows側の書き込みツールを起動して ボードにプログラムを書き込む。

準備として以下を実行しておく:

#WSL2側 #ファイルをwindows10側に引き渡すディレクトリを作成する mkdir /mnt/c/temp #windows10側(PowerShell側) #windows10側の書き込みツールをインストールする scoop install avrdude pio install esptool # bossacをインストールする cd $HOME mkdir msi cd msi wget https://github.com/shumatech/BOSSA/releases/download/1.9.1/bossa-x64-1.9.1.msi Start-Process -filepath "$HOME\msi\bossa-x64-1.9.1.msi" # 実行パスを設定する $Env:Path += ";C:\Program Files (x86)\BOSSA\" # 別の機能が割り当てられているaliasを削除する del alias:curl del alias:wget # curl, wgetをインストールする scoop install curl scoop install wget # その他の必要となるツールをインストールする scoop install git

・参照:WindowsコマンドラインツールScoopのすすめ(基礎編)
・注意:設定した実行パスやalias削除は、セッションが閉じると無効になるので
PowerScriptの以下の起動スクリプト

$HOME\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

の末尾に次の行を追加する。(スクリプトファイルがない場合、新規作成する)

del alias:curl del alias:wget $Env:Path += ";C:\Program Files (x86)\BOSSA\"


UNOの場合、以下のファイルをWSL2側に用意する:
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:uno] platform = atmelavr board = uno extra_scripts = post:extra_script.py ext = f_UNO.sh framework = arduino #build_flags = -Dxxxx upload_protocol = arduino monitor_speed = 115200 lib_ldf_mode = deep+ #lib_deps =

f_UNO.sh

#!/bin/bash # Arduino UNO flash writing # for debug #ls .pio/build/uno/ rm /mnt/c/temp/* cp $HOME/.platformio/packages/tool-avrdude/avrdude.conf /mnt/c/temp/ cp .pio/build/uno/firmware.hex /mnt/c/temp/ PowerShell.exe avrdude -v -p atmega328p -C c:/temp/avrdude.conf -c arduino -b 115200 -D -P COM14 -U flash:w:c:/temp/firmware.hex:i exit 0

・COM14は(window10側の)通信ポートになるが環境依存なので、自分の環境での通信ポートに変更すること。
・実行属性を与えること。


M5ATOMの場合:
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:esp32dev] platform = espressif32 board = m5stick-c extra_scripts = post:extra_script.py ext = f_M5ATOM.sh framework = arduino build_flags = -DM5ATOM monitor_speed = 115200 lib_ldf_mode = deep+ lib_deps = # use M5Atom lib 3113 # use "FastLED" 126

f_M5ATOM.sh

#!/bin/bash # M5ATOM flash writing # for debug #ls .pio/build/uno/ rm /mnt/c/temp/* cp $HOME/.platformio/packages/framework-arduinoespressif32/tools/sdk/bin/bootloader_dio_40m.bin /mnt/c/temp/ cp .pio/build/esp32dev/partitions.bin /mnt/c/temp/ cp $HOME/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin /mnt/c/temp/ cp .pio/build/esp32dev/firmware.bin /mnt/c/temp/ PowerShell.exe esptool.py --chip esp32 --baud 1500000 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 c:/temp/bootloader_dio_40m.bin 0x8000 c:/temp/partitions.bin 0xe000 c:/temp/boot_app0.bin 0x10000 c:/temp/firmware.bin exit 0

・自動検出になっているので通信ポートの設定はない。
・実行属性を与えること。

XIAOの場合:
platformio.ini

<ヘッダー省略> [env:seeed_xiao] platform = atmelsam board = seeed_xiao extra_scripts = post:extra_script.py ext = f_XIAO.sh framework = arduino build_flags = -DXIAO upload_protocol = sam-ba monitor_speed = 115200 lib_ldf_mode = deep+ lib_deps = # Accept new functionality in a backwards compatible manner and patches olikraus/U8g2 @ ^2.28.7

f_XIAO.sh

#!/bin/bash # XIAO flash writing # for debug #ls .pio/build/seeed_xiao/ rm /mnt/c/temp/* cp .pio/build/seeed_xiao/firmware.bin /mnt/c/temp/ PowerShell.exe bossac -p COM18 -i -e -w -v -R -o 0x2000 c:/temp/firmware.bin exit 0

・COM18は(window10側の)通信ポートになるが環境依存なので、自分の環境での通信ポートに変更すること。
・実行属性を与えること。

wio-terminalの場合:
platformio.ini

<ヘッダー省略> [env:seeed_wio_terminal] platform = atmelsam board = seeed_wio_terminal extra_scripts = post:extra_script.py ext = f.WIOT.sh framework = arduino build_flags = -DWIO_TERMINAL upload_protocol = sam-ba monitor_speed = 115200 lib_ldf_mode = deep+ lib_deps = <以下、省略>

f_WIOT.sh

#!/bin/bash # wio-terminal flash writing # for debug #ls .pio/build/seeed_wio_terminal/ rm /mnt/c/temp/* cp .pio/build/seeed_wio_terminal/firmware.bin /mnt/c/temp/ PowerShell.exe bossac -p COM15 -i -e -w -v -R -o 0x4000 c:/temp/firmware.bin exit 0

・COM15は(window10側の)通信ポートになるが環境依存なので、自分の環境での通信ポートに変更すること。
・実行属性を与えること。

wio-terminalの場合(ファイルコピーによる書き込み):
platformio.ini

<ヘッダー省略> [env:seeed_wio_terminal] platform = atmelsam board = seeed_wio_terminal extra_scripts = post:extra_script.py ext = f_UF2.sh framework = arduino build_flags = -DWIO_TERMINAL upload_protocol = sam-ba monitor_speed = 115200 lib_ldf_mode = deep+ lib_deps = <以下、省略>

/***** 書き込みドライブを自動検出にしたので、以下、廃止 *****

f_UF2.sh

#!/bin/bash rm /mnt/c/temp/* cp firmware.uf2 /mnt/c/temp/ PowerShell.exe copy c:/temp/firmware.uf2 e: exit 0

・「e:」はドライブ・レターになるが環境依存なので、自分の環境のものに変更すること。
・実行属性を与えること。
***********************************************************/

// 改良版(2021/4/12)
f_UF2.sh

#!/bin/bash rm /mnt/c/temp/* cp firmware.uf2 /mnt/c/temp/ DRIVE=`PowerShell.exe get-volume|grep FAT|awk '{print $1}'` if [ "${DRIVE}" = "" ]; then echo "bootloader-mode is not activated!" exit 1 fi PowerShell.exe copy c:/temp/firmware.uf2 ${DRIVE}: exit 0

・書き込みのドライブを自動検出に改良した。
 (ただし、接続しているドライブとしてFATタイプが1台である前提)
・実行属性を与えること。

F103RBの場合(ファイルコピーによる書き込み):
platformio.ini

<ヘッダー省略> [env:nucleo_f103rb] platform = ststm32 board = nucleo_f103rb extra_scripts = post:extra_script.py ext = f_MBED.sh framework = arduino build_flags = -DNUCLEO_F103RB monitor_speed = 115200 lib_ldf_mode = deep+ upload_protocol = stlink #lib_deps =

/***** 書き込みドライブを自動検出にしたので、以下、廃止 *****

f_MBED.sh

#!/bin/bash rm /mnt/c/temp/* cp .pio/build/*/firmware.hex /mnt/c/temp/ PowerShell.exe copy c:/temp/firmware.hex e: exit 0

・「e:」はドライブ・レターになるが環境依存なので、自分の環境のものに変更すること。
・実行属性を与えること。
***********************************************************/

// 改良版(2021/4/12)
f_MBED.sh

#!/bin/bash rm /mnt/c/temp/* cp .pio/build/*/firmware.hex /mnt/c/temp/ DRIVE=`PowerShell.exe get-volume|grep FAT|awk '{print $1}'` if [ "${DRIVE}" = "" ]; then echo "MBED board is not connected!" exit 1 fi PowerShell.exe copy c:/temp/firmware.hex ${DRIVE}: exit 0

・書き込みのドライブを自動検出に改良した。
 (ただし、接続しているドライブとしてFATタイプが1台である前提)
・実行属性を与えること。

ビルド/書き込み
以下を実行する:

pio run -t clean pio run # extra_script.py(とf_xxxx.sh)のほうで書き込みを行うので「-t upload」は不要となる

対応ボードの追加:
現状は、UNO,M5ATOM,XIAO,wio-terminal,mbedボードになるが
対応ボードを追加する場合、 「extra_script.py」の変更と、実際の書き込みを実行する「f_xxxx.sh」を追加することになる。 「f_xxxx.sh」には実際の書き込みツールのコマンドラインの記述が必要となるが、 それを知るには、[pio run -v -t upload]を実行すると実際のコマンドラインが表示されるので それを参考に「f_xxxx.sh」に記述することになる。(当然のことながら、windows10側にインストールされていないツールであれば、windows10側に、そのツールをインストールする必要がある)

(参考)PowerShell.exe get-volume の出力例

raspberry-pi-picoを接続した場合: $ PowerShell.exe get-volume DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus ----------- ------------ -------------- --------- ------------ ---------------- E RPI-RP2 FAT Removable Healthy OK D Volume NTFS Fixed Healthy OK NTFS Fixed Healthy OK System NTFS Fixed Healthy OK C Windows NTFS Fixed Healthy OK micro:bitを接続した場合: $ PowerShell.exe get-volume DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus ----------- ------------ -------------- --------- ------------ ---------------- D Volume NTFS Fixed Healthy OK NTFS Fixed Healthy OK System NTFS Fixed Healthy OK C Windows NTFS Fixed Healthy OK E MICROBIT FAT Removable Healthy OK wio-terminalを接続した場合: $ PowerShell.exe get-volume DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus ----------- ------------ -------------- --------- ------------ ---------------- D Volume NTFS Fixed Healthy OK NTFS Fixed Healthy OK System NTFS Fixed Healthy OK C Windows NTFS Fixed Healthy OK E Arduino FAT Removable Healthy OK

arduinoボードをリセットするスクリプト(2021/4/20)

USBシリアルが有効のボードでシリアル経由でリセットをかけて、書き込み用ストレージを出現させるスクリプトを紹介する。(raspberry-pi-picoボードでも有効)

windows側の準備:

.wslconfigを以下のように設定する:
C:\Users\USER\.wslconfig

[wsl2] localhostForwarding=true

以下を実行する:

#以下をインストールする(scoopがインストールされている前提) scoop install python scoop install grep scoop install gawk pip install pyserial # スクリプトを置くディレクトリを作成する mkdir ¥py

以下のスクリプトを用意する:

C:¥py¥reset_arduino.py

#!/usr/bin/env python3 import sys args = sys.argv # reset arduino board via serial import serial try: arduino = serial.Serial(args[1], baudrate=1200) arduino.close() except serial.SerialException as e: #if e.errno == 13: # raise e pass

C:¥py¥reset_arduino.ps1

$env:COMPORT=(Get-WMIObject Win32_SerialPort | Select-Object DeviceID | grep COM | gawk 'END{print}') python.exe c:\py\reset_arduino.py $env:COMPORT

・複数のシリアルが接続されている場合、一番最近接続されたものが選ばれる。
状況を単純化するためにも書き込みするボードのみを接続することを進める。

WSL側:

wsl.confは以下のように設定する:
/etc/wsl.conf

[automount] enabled=true mountFsTab=true root="/mnt/" options="" crossDistro=true [network] generateHosts=true generateResolvConf=true [interop] enabled=true appendWindowsPath=true

reset_arduino.sh

#!/bin/bash PowerShell.exe C:/py/reset_arduino.ps1

・実行属性を与えること

実行例
以下を実行するとボードにリセットがかかり書き込み用ストレージが出現する。

# ボードをホストとUSBで接続する ./reset_arduino.sh # この時点で接続されているボードがリセットされ書き込み用ストレージが出現する

参考情報

WSL関連:
wsl.conf と .wslconfig
WSLのアーキテクチャ

scoop関連:
scoopインストール方法(windows10にplatformioをインストールする(scoop版))
WindowsコマンドラインツールScoopのすすめ(基礎編)
Windowsでパッケージ管理したいなら、先ずScoopより始めよ
PowerShell コンソール内で curl や wget が実行できないとお嘆きのあなたへ

書き込みツール関連:
BOSSA
AVRDUDE - AVR Downloader/UploaDEr
esptool.py
Open source version of the STMicroelectronics STlink Tools
stlink Tools Tutorial

micro:bit関連:
micro:bit Arduino/MBED開発ツール(v2)(micro:bit-v2対応,linux版)
micro:bit v2 で遊ぶ

platformio関連:

https://docs.platformio.org/en/latest/platforms/creating_board.html Installation 1.Create boards directory in core_dir if it doesn’t exist. 2.Create myboard.json file in this boards directory. 3.Search available boards via pio boards command. You should see myboard board.

PlatformIO Core (CLI)
Arduino-IDEとPlatformioのコンパイラーの挙動の違いについて
ubuntu20.04をインストールする
【小ネタ】WSL利用時のRaspberry Pi Picoへの書き込みをコマンドラインから行う

Advanced Scripting - Before/Pre and After/Post actions

以上

続きを読む "WSL2でのplatformioやPico-SDKの利用方法"

| | コメント (0)

2021年2月21日 (日)

arduinoフレームワーク用platformio.ini集

2021/2/21+
初版

platformio.ini for arduino

platformio.ini for arduino

概要

arduinoフレームワーク用platformio.ini集
本記事は。各ボード用のplatformio.iniを集め、platformioの使い方を説明したものである。
(ホストはubuntu20.04を想定している)

準備

開発ツールをインストールする前に 必要なものをインストールする:

sudo apt update sudo apt install net-tools sudo apt install git curl sudo apt install gcc-arm-none-eabi build-essential sudo apt install cmake sudo apt install libusb-dev sudo apt install libusb-1.0-0-dev sudo apt install picocom sudo apt install python3-distutils sudo apt install python3-venv # lib for Arduino IDE for microbit sudo apt install libudev1:i386 # for Arduino IDE for ESP32/ESP8266 sudo apt install python-is-python3 pip install pyserial pip uninstall serial

bt(bootterm)のインストール

git clone https://github.com/wtarreau/bootterm cd bootterm make sudo make install

本ツールは、コマンドとして「bt」と入力すると最近有効になった「/dev/ttyACMx または /dev/ttyUSBx」に接続する。
参照:Bootterm – a developer-friendly serial terminal program

PlatformIOのインストール

python3 -m venv pio_env source pio_env/bin/activate pip install platformio インストール後も、このツールを使用する場合 同じディレクトリで以下を実行する: source pio_env/bin/activate # 「source」は、「.」でも良い

udev登録

以下を実行して、udevのrulesを登録する:

curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/master/scripts/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules sudo udevadm control --reload-rules sudo usermod -a -G dialout $USER sudo usermod -a -G plugdev $USER

platformioの使い方

# プロジェクトのディレクトリを作る # (一つのスケッチごとに一つのディレクトリ) mkdir proj cd proj # ソースを置くディレクトリsrcを作る mkdir src # スケッチを作成する # (テスト用には以降に出てくるsrc/ASCIItable.inoを使用する) gedit src/xxxx.ino # 使うボードに対応したplatformio.iniを作る # (内容は以降に出てくるplatform.iniをそのままコピーする) gedit platformio.ini # スケッチをビルドする # (最初の1回はライブラリ・ツールを自動的にダウンロードする) pio run # ボードをUSB接続して書き込む pio run -t upload # USBシリアルを使っているスケッチならば # 以下のコマンドでシリアル接続して出力を表示させる bt # または picocom -b115200 /dev/ttyACM0 (または/dev/ttyUSB0)

その他の使い方

# build結果をクリアする pio run -t clean # キャッシュをクリアする # (ツールやライブラリがダウンロードし直しになるので注意のこと) sudo rm -r .pio # 環境を切り替えて書き込む pio run -e f303 -t upload pio run -e f103 -t upload

環境を切り替えて書き込む場合のplatformio.iniは
以下のように複数の環境[env:xxx]を持っていること:
platformio.ini

[env:f103] platform = ststm32 board = nucleo_f103rb framework = arduino build_flags = -DNUCLEO_F103RB monitor_speed = 115200 lib_ldf_mode = deep+ upload_protocol = stlink #lib_deps = [env:f303] platform = ststm32 board = nucleo_f303k8 framework = arduino build_flags = -DNUCLEO_F303K8 monitor_speed = 115200 lib_ldf_mode = deep+ upload_protocol = stlink #lib_deps =

[env:xxxx]のxxxxの部分は環境名にあたり、 ダブらない任意の名前であること。

テスト用スケッチ

src/ASCIItable.ino

/* ASCII table Prints out byte values in all possible formats: - as raw binary values - as ASCII-encoded decimal, hex, octal, and binary values For more on ASCII, see http://www.asciitable.com and http://en.wikipedia.org/wiki/ASCII The circuit: No external hardware needed. created 2006 by Nicholas Zambetti <http://www.zambetti.com> modified 9 Apr 2012 by Tom Igoe This example code is in the public domain. http://www.arduino.cc/en/Tutorial/ASCIITable */ void setup() { //Initialize serial and wait for port to open: Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // prints title with ending line break Serial.println("ASCII Table ~ Character Map"); } // first visible ASCIIcharacter '!' is number 33: int thisByte = 33; // you can also write ASCII characters in single quotes. // for example, '!' is the same as 33, so you could also use this: // int thisByte = '!'; void loop() { // prints value unaltered, i.e. the raw binary version of the byte. // The Serial Monitor interprets all bytes as ASCII, so 33, the first number, // will show up as '!' Serial.write(thisByte); Serial.print(", dec: "); // prints value as string as an ASCII-encoded decimal (base 10). // Decimal is the default format for Serial.print() and Serial.println(), // so no modifier is needed: Serial.print(thisByte); // But you can declare the modifier for decimal if you want to. // this also works if you uncomment it: // Serial.print(thisByte, DEC); Serial.print(", hex: "); // prints value as string in hexadecimal (base 16): Serial.print(thisByte, HEX); Serial.print(", oct: "); // prints value as string in octal (base 8); Serial.print(thisByte, OCT); Serial.print(", bin: "); // prints value as string in binary (base 2) also prints ending line break: Serial.println(thisByte, BIN); // if printed last visible character '~' or 126, stop: if (thisByte == 126) { // you could also use if (thisByte == '~') { // This loop loops forever and does nothing while (true) { continue; } } // go on to the next character thisByte++; }

本スケッチはarduinoのサンプルそのもの(bpsのみ変更)である。

plaformio.ini

(1)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

(2)追加するライブラリがある場合は以下のように 「lib_dep= 」以降にライブラリのurlなどを追加する:

lib_deps = #https://github.com/arduino-libraries/NTPClient.git arduino-libraries/NTPClient@^3.1.0

(3)以下、各ボード用のplatformio.iniになる。

Arduino Uno

[env:uno] platform = atmelavr board = uno framework = arduino #build_flags = -Dxxxx upload_protocol = arduino monitor_speed = 115200 lib_ldf_mode = deep+ #lib_deps =

wio-temirnal

[env:seeed_wio_terminal] platform = atmelsam board = seeed_wio_terminal framework = arduino build_flags = -DWIO_TERMINAL upload_protocol = sam-ba monitor_speed = 115200 lib_ldf_mode = deep+ lib_deps = https://github.com/Seeed-Studio/Seeed_Arduino_mbedtls/archive/dev.zip https://github.com/Seeed-Studio/Seeed_Arduino_rpcUnified/archive/master.zip https://github.com/Seeed-Studio/Seeed_Arduino_rpcBLE/archive/master.zip https://github.com/Seeed-Studio/Seeed_Arduino_rpcWiFi/archive/master.zip https://github.com/Seeed-Studio/Seeed_Arduino_FreeRTOS/archive/master.zip https://github.com/Seeed-Studio/Seeed_Arduino_FS/archive/master.zip https://github.com/Seeed-Studio/Seeed_Arduino_SFUD/archive/master.zip # https://github.com/Seeed-Studio/Seeed_Arduino_LCD/archive/master.zip # 551 #https://github.com/arduino-libraries/NTPClient.git arduino-libraries/NTPClient@^3.1.0

XIAO

[env:seeed_xiao] platform = atmelsam board = seeed_xiao framework = arduino build_flags = -DXIAO upload_protocol = sam-ba monitor_speed = 115200 lib_ldf_mode = deep+ lib_deps = olikraus/U8g2 @ ^2.28.7

Feather M4

[env:adafruit_feather_m4] platform = atmelsam board = adafruit_feather_m4 framework = arduino build_flags = -DFEATHER_M4 upload_protocol = sam-ba monitor_speed = 115200 lib_ldf_mode = deep+ #lib_deps =

Grand Central M4

[env:adafruit_grandcentral_m4] platform = atmelsam board = adafruit_grandcentral_m4 framework = arduino build_flags = -DGRANDCENTRAL_M4 upload_protocol = sam-ba monitor_speed = 115200 lib_ldf_mode = deep+ #lib_deps =

M5Atom

[env:esp32dev] platform = espressif32 #board = esp32dev board = m5stick-c framework = arduino build_flags = -DM5ATOM monitor_speed = 115200 lib_ldf_mode = deep+ lib_deps = # use M5Atom lib 3113 # use "FastLED" 126

M5StickC

[env:esp32dev] platform = espressif32 board = m5stick-c framework = arduino build_flags = -DM5STICK_C monitor_speed = 115200 lib_ldf_mode = deep+ lib_deps = m5stack/M5StickC @ ^0.2.0

リセット方法:
(1)「M5」と書かれたボタンを正面に見て左側にあるボタンを6秒長押して電源を切る。
(2)そのボタンを再度、2秒長押しをして電源を入れる。(リセットになる)



M5StickCPlus

[env:esp32dev] platform = espressif32 board = m5stick-c framework = arduino build_flags = -DM5STICK_CP monitor_speed = 115200 lib_ldf_mode = deep+ lib_deps = m5stack/M5StickCPlus @ ^0.0.1

リセット方法:
(1)「M5」と書かれたボタンを正面に見て左側にあるボタンを6秒長押して電源を切る。
(2)そのボタンを再度、2秒長押しをして電源を入れる。(リセットになる)



M5Stack Fire

[env:esp32dev] platform = espressif32 board = m5stack-fire framework = arduino build_flags = -DM5STACK_FIRE monitor_speed = 115200 lib_ldf_mode = deep+ lib_deps = m5stack/M5Stack https://github.com/lovyan03/LovyanGFX.git

Power on/off:
・Power on: click the red power button on the left
・Power off: Quickly double-click the red power button on the left



ESP32

[env:esp32dev] platform = espressif32 board = esp32dev framework = arduino build_flags = -DESP32 monitor_speed = 115200 lib_ldf_mode = deep+ #lib_deps =

ESP8266

[env:huzzah] platform = espressif8266 board = esp_wroom_02 framework = arduino build_flags = -DESP8266 monitor_speed = 115200 lib_ldf_mode = deep+ #lib_deps =

micro:bit

[env:bbcmicrobit] platform = nordicnrf51 board = bbcmicrobit framework = arduino build_flags = -DMICROBIT -DNRF51_S110 monitor_speed = 115200 lib_ldf_mode = deep+ upload_protocol = cmsis-dap lib_deps = https://github.com/adafruit/Adafruit_BusIO/archive/master.zip https://github.com/sparkfun/SparkFun_MAG3110_Breakout_Board_Arduino_Library/archive/master.zip https://cdn-learn.adafruit.com/assets/assets/000/046/217/original/MMA8653.zip https://github.com/stm32duino/LSM303AGR/archive/master.zip https://github.com/adafruit/Adafruit-GFX-Library/archive/master.zip # https://github.com/sandeepmistry/arduino-BLEPeripheral/archive/master.zip https://github.com/adafruit/Adafruit_Microbit/archive/master.zip # https://github.com/ht-deko/microbit_Screen/archive/master.zip

Nucleo STM32F103RB

[env:nucleo_f103rb] platform = ststm32 board = nucleo_f103rb framework = arduino build_flags = -DNUCLEO_F103RB monitor_speed = 115200 lib_ldf_mode = deep+ upload_protocol = stlink #lib_deps =

Nucleo STM32F303K8

[env:nucleo_f303k8] platform = ststm32 board = nucleo_f303k8 framework = arduino build_flags = -DNUCLEO_F303K8 monitor_speed = 115200 lib_ldf_mode = deep+ upload_protocol = stlink #lib_deps =

TeensyLC

[env:teensylc] platform = teensy board = teensylc framework = arduino #build_flags = -Dxxxx monitor_speed = 115200 lib_ldf_mode = deep+ upload_protocol = teensy-cli #lib_deps =

Teensy3.6

[env:teensy36] platform = teensy board = teensy36 framework = arduino #build_flags = -Dxxxx monitor_speed = 115200 lib_ldf_mode = deep+ upload_protocol = teensy-cli #lib_deps =

Teensy4.0

[env:teensy40] platform = teensy board = teensy40 framework = arduino #build_flags = -Dxxxx monitor_speed = 115200 lib_ldf_mode = deep+ upload_protocol = teensy-cli #lib_deps =

ビルド・エラー

Arduino-IDEのコンパイラと異なり、platformioのコンパイラは、関数定義の後方参照を許さないので、 この場合、関数の未定義エラーになる。したがって、Arduino-IDEでビルドできているソースでもエラーになることがある。このときの対応方法は、未定義エラーになる関数定義をプロトタイプ宣言としてソースの先頭に置き、後方参照を解消する。(関数定義の本体の位置はそのままで移動させる必要はない)

参考情報

M5Stack関連:
PlatformIO M5Stack開発の現状
・https://github.com/m5stack/M5StickC-Plus.git
・https://github.com/m5stack/M5StickC.git
・https://github.com/m5stack/M5Stack.git

micro:bit関連:
micro:bit Arduino/MBED開発ツール(v2)(micro:bit-v2対応,linux版)
micro:bit v2 で遊ぶ

platformio関連:

https://docs.platformio.org/en/latest/platforms/creating_board.html Installation 1.Create boards directory in core_dir if it doesn’t exist. 2.Create myboard.json file in this boards directory. 3.Search available boards via pio boards command. You should see myboard board.

PlatformIO Core (CLI)
Arduino-IDEとPlatformioのコンパイラーの挙動の違いについて
ubuntu20.04をインストールする

以上

続きを読む "arduinoフレームワーク用platformio.ini集"

| | コメント (0)

2021年2月18日 (木)

nixieクロックにNTPクライアントの機能を追加する(V2)

2021/2/18:
第2版

pio nixie NTP Client v2

pio nixie NTP Client v2

概要

以下のnixieクロックにNTPクライアントの機能を追加する(V2)

Wio nixie tube clock

本記事は「 nixieクロックにNTPクライアントの機能を追加する 」の第2版にあたる。 これは、wio-terminalのWiFiファームウェアのアップグレードに対する対応になる。(wio-terminalのファームウェア・アップデートについて(v2)(linux版))

NTPクライアントの機能を追加しているので、RTCのハードを追加する必要はない。 (ホストPCとしてはubuntuを想定している)

プロジェクト wiot-nixie-NTP のディレクトリを作成する

mkdir wiot-nixie-NTP cd wiot-nixie-NTP # 以下を実行して必要なファイルを作成する pio init --board seeed_wio_terminal # platformをupdateする pio platform update nano 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:seeed_wio_terminal] platform = atmelsam board = seeed_wio_terminal framework = arduino build_flags = -DWIO_TERMINAL upload_protocol = sam-ba monitor_speed = 115200 lib_ldf_mode = deep+ lib_deps = https://github.com/Seeed-Studio/Seeed_Arduino_mbedtls/archive/dev.zip https://github.com/Seeed-Studio/Seeed_Arduino_rpcUnified/archive/master.zip https://github.com/Seeed-Studio/Seeed_Arduino_rpcBLE/archive/master.zip https://github.com/Seeed-Studio/Seeed_Arduino_rpcWiFi/archive/master.zip https://github.com/Seeed-Studio/Seeed_Arduino_FreeRTOS/archive/master.zip https://github.com/Seeed-Studio/Seeed_Arduino_FS/archive/master.zip https://github.com/Seeed-Studio/Seeed_Arduino_SFUD/archive/master.zip # https://github.com/Seeed-Studio/Seeed_Arduino_LCD/archive/master.zip # 551 #https://github.com/arduino-libraries/NTPClient.git arduino-libraries/NTPClient@^3.1.0

該当スケッチのダウンロード

cd wiot-nixie-NTP wget https://macsbug.files.wordpress.com/2020/05/wio_nixie_tube_clock.zip_-4.pdf mv wio_nixie_tube_clock.zip_-4.pdf wio_nixie_tube_clock.zip unzip wio_nixie_tube_clock.zip cp Wio_nixie_tube_clock/*.* src/

デモ・スケッチ

上でダウンロートしたスケッチにNTPクライアント機能を追加して以下のようなソースに編集する:

src/Wio_nixie_tube_clock_NTP.ino

// NTP Client part added on 2020/08/01 by xshige //#include <AtWiFi.h> #include <rpcWiFi.h> #include <NTPClient.h> #include <WiFiUdp.h> const char *ssid = "your_ssid"; const char *password = "your_passwd"; //<---------------------------------------------------------- // derived/forked from http://mrkk.ciao.jp/memorandom/unixtime/unixtime.html #define ARRAYSIZE(_arr) (sizeof(_arr) / sizeof(_arr[0])) #define TIME_OFFSET 0 #define SECONDS_IN_A_DAY (24*60*60) #define EPOCH_DAY (1969*365L + 1969/4 - 1969/100 + 1969/400 + 306) // days from 0000/03/01 to 1970/01/01 #define UNIX_EPOCH_DAY EPOCH_DAY #define YEAR_ONE 365 #define YEAR_FOUR (YEAR_ONE * 4 + 1) // it is YEAR_ONE*4+1 so the maximum reminder of day / YEAR_FOUR is YEAR_ONE * 4 and it occurs only on 2/29 #define YEAR_100 (YEAR_FOUR * 25 - 1) #define YEAR_400 (YEAR_100*4 + 1) // it is YEAR_100*4+1 so the maximum reminder of day / YEAR_400 is YEAR_100 * 4 and it occurs only on 2/29 void ConvertUnixTimeToLocalTime(uint64_t unixtime, uint32_t *pyear, uint8_t *pmonth, uint8_t *pday, uint8_t *phour, uint8_t *pminute, uint8_t *psecond) { uint32_t unixday; uint16_t year = 0; uint8_t leap = 0; uint32_t n; uint8_t month, day, weekday; uint8_t hour, minute, second; static const uint16_t monthday[] = { 0,31,61,92,122,153,184,214,245,275,306,337 }; unixtime += TIME_OFFSET; second = unixtime % 60; minute = (unixtime / 60) % 60; hour = (unixtime / 3600) % 24; unixday = (uint32_t)(unixtime / SECONDS_IN_A_DAY); weekday = (uint8_t)((unixday + 3) % 7); // because the unix epoch day is thursday unixday += UNIX_EPOCH_DAY; // days from 0000/03/01 to 1970/01/01 year += 400 * (unixday / YEAR_400); unixday %= YEAR_400; n = unixday / YEAR_100; year += n * 100; unixday %= YEAR_100; if (n == 4){ leap = 1; } else { year += 4 * (unixday / YEAR_FOUR); unixday %= YEAR_FOUR; n = unixday / YEAR_ONE; year += n; unixday %= YEAR_ONE; if (n == 4) { leap = 1; } } if (leap != 0) { month = 2; day = 29; } else { month = (unixday * 5 + 2) / 153; day = unixday - monthday[month] + 1; // month += 3; if (month > 12) { ++year; month -= 12; } } *psecond = second; *pminute = minute; *phour = hour; *pyear = year; *pmonth = month; *pday = day; } //>---------------------------------------------------------- char *weekday[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; uint32_t year; uint8_t month, day, hour, minu, sec; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "ntp.nict.jp", 3600*9, 60000); // set JST // You can specify the time server pool and the offset, (in seconds) // additionaly you can specify the update interval (in milliseconds). // NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000); //================================================================ // added NTP Client feature: 2020.08.01 xshige // Woi Terminal nixie tube clock : 2020.05.25 macsbug // https://macsbug.wordpress.com/2020/05/25/wio-nixie-tube-clock/ // M5Stack nixie tube clock : 2019.06.16 macsbug // https://macsbug.wordpress.com/2019/06/16/m5stack-nixie-tube-clock/ // M5StickC Nixie tube Clock : 2019.06.06 macsbug // https://macsbug.wordpress.com/2019/06/06/m5stickc-nixie-tube-clock/ // RTC DS3231 : https://wiki.52pi.com/index.php/Raspberry_Pi_Super_Capacitor_RTC(English) // RTClib : https://www.arduinolibraries.info/libraries/rt-clib // mode controll : 5 way switch // mode 1 : yyyy_mmdd_hhmmss // mode 2 : mmdd_hh_mmss // mode 3 : mmdd_ss_hhmm // rtc : DS3231, SDA1 = 2, SCL1= 3; #include <SPI.h> #include <TFT_eSPI.h> TFT_eSPI tft = TFT_eSPI(); #include <Wire.h> //#include "RTClib.h" //RTC_DS3231 rtc; #include "vfd_18x34.c" // font 18px34 #include "vfd_35x67.c" // font 35x67 #include "vfd_70x134.c" // font 70px134 #include "apple_35x41.c" // icon 35px41 uint32_t targetTime = 0; // for next 1 second timeout const uint8_t*n[] = { // vfd font 18x34 vfd_18x34_0,vfd_18x34_1,vfd_18x34_2,vfd_18x34_3,vfd_18x34_4, vfd_18x34_5,vfd_18x34_6,vfd_18x34_7,vfd_18x34_8,vfd_18x34_9 }; const uint8_t*m[] = { // vfd font 35x67 vfd_35x67_0,vfd_35x67_1,vfd_35x67_2,vfd_35x67_3,vfd_35x67_4, vfd_35x67_5,vfd_35x67_6,vfd_35x67_7,vfd_35x67_8,vfd_35x67_9, vfd_35x67_q,vfd_35x67_n }; const uint8_t*b[] = { // vfd font 70x134 vfd_70x134_0,vfd_70x134_1,vfd_70x134_2,vfd_70x134_3,vfd_70x134_4, vfd_70x134_5,vfd_70x134_6,vfd_70x134_7,vfd_70x134_8,vfd_70x134_9, vfd_70x134_q,vfd_70x134_n }; const char *monthName[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; uint16_t yy; uint8_t mn, dd, hh, mm, ss; uint8_t md = 2; // mode 1, 2, 3 void setup() { // Serial.begin(115200); WiFi.begin(ssid, password); while ( WiFi.status() != WL_CONNECTED ) { delay ( 500 ); Serial.print ( "." ); } timeClient.begin(); //--------------------- tft.init(); tft.setRotation(3); tft.fillScreen(TFT_BLACK); pinMode(WIO_5S_PRESS, INPUT_PULLUP); /**** Wire.begin(SDA1,SCL1); delay(10); rtc.begin(); rtc.adjust(DateTime(__DATE__, __TIME__)); // Set the PC time // esp_timer_init(); // wifi_setup(); rtc_setup(); // Read the value of RTC ****/ } void loop() { timeClient.update(); // if (targetTime < esp_timer_get_time()/1000 ){ // display current clock on serial port ConvertUnixTimeToLocalTime(timeClient.getEpochTime(), &year, &month, &day, &hour, &minu, &sec); Serial.printf("%4d/%02d/%02d(%s): %02d:%02d:%02d\r\n", year, month, day, weekday[timeClient.getDay()], hour, minu, sec); /**** DateTime now = rtc.now(); yy = now.year(); mn = now.month(); dd = now.day(); hh = now.hour(); mm = now.minute(); ss = now.second(); ****/ yy = year; mn = month; dd = day; hh = hour; mm = minu; ss = sec; if(digitalRead(WIO_5S_PRESS) == LOW){ // mode change if (md == 3){md = 1;tft.fillRect(1,1,317,236,TFT_BLACK);return;} if (md == 2){md = 3;tft.fillRect(1,1,317,236,TFT_BLACK);return;} if (md == 1){md = 2;tft.fillRect(1,1,317,236,TFT_BLACK);return;} } if ( md == 3 ){ hhmm();} // yyyy,mm,dd,ss,hh,mm if ( md == 2 ){ yyyy_mmdd_hhmmss();} // yyyy,mm,dd,hh,mm,ss if ( md == 1 ){ mmss();} // mm,ss // periodic_ntp(); delay(500); } /**** void rtc_setup(){ DateTime now = rtc.now(); // time geting from RTC if (now.year() == 2165){ // rtc check tft.setCursor(20,200);tft.setTextColor(TFT_RED); tft.print("RTC not installed");delay(2000); tft.fillRect(1, 1, 317, 236, TFT_BLACK); }else{ yy = now.year(); mn = now.month(); dd = now.day(); hh = now.hour(); mm = now.minute(); ss = now.second(); //Serial.printf("%d %d %d %d %d %d\n",yy,mn,dd,hh,mm,ss); tft.setCursor(20,200);tft.setTextColor(TFT_BLUE); tft.print("SET UP RTC");delay(2000); tft.fillRect(1, 1, 317, 236, TFT_BLACK); } } ****/ void yyyy_mmdd_hhmmss(){ int y1 = (yy / 1000) % 10; int y2 = (yy / 100) % 10; int y3 = (yy / 10) % 10; int y4 = yy % 10; int ma = (mn / 10) % 10; int mb = mn % 10; int d1 = (dd / 10) % 10; int d2 = dd % 10; int h1 = (hh / 10) % 10; int h2 = hh % 10; int m1 = (mm / 10) % 10; int m2 = mm % 10; int s1 = (ss / 10) % 10; int s2 = ss % 10; //int p0 = 8; int x0 = 40; int t0 = 22; // icon //tft.pushImage( p0 + 0*x0, t0, 35,41, (uint16_t *)apple_35x41); int p1 = 80; int px1 = 40; int py1 = 5; tft.pushImage( p1 + 0*px1, py1, 35,67, (uint16_t *)m[y1]); tft.pushImage( p1 + 1*px1, py1, 35,67, (uint16_t *)m[y2]); tft.pushImage( p1 + 2*px1, py1, 35,67, (uint16_t *)m[y3]); tft.pushImage( p1 + 3*px1, py1, 35,67, (uint16_t *)m[y4]); int p2 = 80; int px2 = 40; int py2 = 76; tft.pushImage( p2 + 0*px2, py2, 35,67, (uint16_t *)m[ma]); tft.pushImage( p2 + 1*px2, py2, 35,67, (uint16_t *)m[mb]); //tft.drawPixel(118,13, ORANGE); tft.drawPixel(119,23,ORANGE); tft.pushImage( p2 + 2*px2, py2, 35,67, (uint16_t *)m[d1]); tft.pushImage( p2 + 3*px2, py2, 35,67, (uint16_t *)m[d2]); int p3 = 2; int px3 = 40; int py3 = 150; tft.pushImage( p3 + 0*px3, py3, 35,67, (uint16_t *)m[h1]); tft.pushImage( p3 + 1*px3, py3, 35,67, (uint16_t *)m[h2]); tft.pushImage( p3 + 2*px3, py3, 35,67, (uint16_t *)m[10]); tft.pushImage( p3 + 3*px3, py3, 35,67, (uint16_t *)m[m1]); tft.pushImage( p3 + 4*px3, py3, 35,67, (uint16_t *)m[m2]); tft.pushImage( p3 + 5*px3, py3, 35,67, (uint16_t *)m[10]); tft.pushImage( p3 + 6*px3, py3, 35,67, (uint16_t *)m[s1]); tft.pushImage( p3 + 7*px3, py3, 35,67, (uint16_t *)m[s2]); if ( s1 == 0 && s2 == 0 ){ fade1();} } void mmss(){ int ma = (mn / 10) % 10; int mb = mn % 10; int d1 = (dd / 10) % 10; int d2 = dd % 10; int h1 = (hh / 10) % 10; int h2 = hh % 10; int m1 = (mm / 10) % 10; int m2 = mm % 10; int s1 = (ss / 10) % 10; int s2 = ss % 10; int p0 = 8; int x0 = 40; int t0 = 22; // icon tft.pushImage( p0 + 0*x0, t0, 35,41, (uint16_t *)apple_35x41); int p2 = 65; int px2 = 40; int py2 = 10; tft.pushImage( p2 + 0*px2, py2, 35,67, (uint16_t *)m[ma]); tft.pushImage( p2 + 1*px2, py2, 35,67, (uint16_t *)m[mb]); //tft.drawPixel(118,13, ORANGE); tft.drawPixel(119,23,ORANGE); tft.pushImage( p2 + 2*px2, py2, 35,67, (uint16_t *)m[d1]); tft.pushImage( p2 + 3*px2, py2, 35,67, (uint16_t *)m[d2]); int p3 = 240; int px3 = 40; int py3 = 10; tft.pushImage( p3 + 0*px3, py3, 35,67, (uint16_t *)m[h1]); tft.pushImage( p3 + 1*px3, py3, 35,67, (uint16_t *)m[h2]); int p4 = 2; int px4 = 80; int py4 = 100; tft.pushImage( p4 + 0*px4 , py4, 70,134, (uint16_t *)b[m1]); tft.pushImage( p4 + 1*px4 -4, py4, 70,134, (uint16_t *)b[m2]); //tft.drawPixel(155,150, ORANGE); tft.drawPixel(155,190,ORANGE); tft.fillCircle(156,151,3,TFT_ORANGE);tft.fillCircle(156,191,3,TFT_ORANGE); tft.fillCircle(156,151,1,TFT_YELLOW);tft.fillCircle(156,191,1,TFT_YELLOW); tft.pushImage( p4 + 2*px4 +4, py4, 70,134, (uint16_t *)b[s1]); tft.pushImage( p4 + 3*px4 , py4, 70,134, (uint16_t *)b[s2]); if ( m1 == 0 && m2 == 0 ){ fade2();} } void hhmm(){ int ma = (mn / 10) % 10; int mb = mn % 10; int d1 = (dd / 10) % 10; int d2 = dd % 10; int h1 = (hh / 10) % 10; int h2 = hh % 10; int m1 = (mm / 10) % 10; int m2 = mm % 10; int s1 = (ss / 10) % 10; int s2 = ss % 10; //int p0 = 8; int x0 = 40; int t0 = 22; // icon //tft.pushImage( p0 + 0*x0, t0, 35,41, (uint16_t *)apple_35x41); int p2 = 65; int px2 = 40; int py2 = 10; tft.pushImage( p2 + 0*px2, py2, 35,67, (uint16_t *)m[ma]); tft.pushImage( p2 + 1*px2, py2, 35,67, (uint16_t *)m[mb]); //tft.drawPixel(118,13, ORANGE); tft.drawPixel(119,23,ORANGE); tft.pushImage( p2 + 2*px2, py2, 35,67, (uint16_t *)m[d1]); tft.pushImage( p2 + 3*px2, py2, 35,67, (uint16_t *)m[d2]); int p3 = 240; int px3 = 40; int py3 = 10; tft.pushImage( p3 + 0*px3, py3, 35,67, (uint16_t *)m[s1]); tft.pushImage( p3 + 1*px3, py3, 35,67, (uint16_t *)m[s2]); int p4 = 2; int px4 = 80; int py4 = 100; tft.pushImage( p4 + 0*px4 , py4, 70,134, (uint16_t *)b[h1]); tft.pushImage( p4 + 1*px4 -4, py4, 70,134, (uint16_t *)b[h2]); //tft.drawPixel( 155,150, ORANGE); tft.drawPixel(155,190,ORANGE); tft.fillCircle(156,151,3,TFT_ORANGE);tft.fillCircle(156,191,3,TFT_ORANGE); tft.fillCircle(156,151,1,TFT_YELLOW);tft.fillCircle(156,191,1,TFT_YELLOW); tft.pushImage( p4 + 2*px4 +4, py4, 70,134, (uint16_t *)b[m1]); tft.pushImage( p4 + 3*px4 , py4, 70,134, (uint16_t *)b[m2]); if ( h1 == 0 && h2 == 0 ){ fade2();} } void fade1(){ int p3 = 2; int px3 = 40; int py3 = 150; for ( int i = 0; i < 2; i++ ){ tft.pushImage( p3 + 2*px3, py3, 35,67, (uint16_t *)m[11]); tft.pushImage( p3 + 5*px3, py3, 35,67, (uint16_t *)m[11]); delay(25); tft.pushImage( p3 + 2*px3, py3, 35,67, (uint16_t *)m[10]); tft.pushImage( p3 + 5*px3, py3, 35,67, (uint16_t *)m[10]); delay(25); } } void fade2(){ int p3 = 2; int px3 = 40; int py3 = 150; for ( int i = 0; i < 2; i++ ){ tft.fillCircle(156,151,3,TFT_BLACK);tft.fillCircle(156,191,3,TFT_BLACK); delay(25); tft.fillCircle(156,151,3,TFT_ORANGE);tft.fillCircle(156,191,3,TFT_ORANGE); delay(25); } }

以下の変更がWiFiファームウェア・アップグレードの対応にあたる:

//#include <AtWiFi.h> #include <rpcWiFi.h>

以下については、自分の環境に合わせて変更すること:

const char *ssid = "your_ssid"; const char *password = "your_passwd";

書き込み後に「picocom /dev/ttyACM0 -b115200」で通信ソフトを起動すると以下のような出力が表示される:

$ picocom /dev/ttyACM0 -b115200 Terminal ready 2020/08/01(Sat): 22:44:44 2020/08/01(Sat): 22:44:44 2020/08/01(Sat): 22:44:45 2020/08/01(Sat): 22:44:46 2020/08/01(Sat): 22:44:46 2020/08/01(Sat): 22:44:47 2020/08/01(Sat): 22:44:48 2020/08/01(Sat): 22:44:48 2020/08/01(Sat): 22:44:49 2020/08/01(Sat): 22:44:49 2020/08/01(Sat): 22:44:50 2020/08/01(Sat): 22:44:50 2020/08/01(Sat): 22:44:51 2020/08/01(Sat): 22:44:51 2020/08/01(Sat): 22:44:52 2020/08/01(Sat): 22:44:53 2020/08/01(Sat): 22:44:53 2020/08/01(Sat): 22:44:54

また、起動後、ニキシー管の時計が表示され、ボタンで表示画面を切り換えられる。

参考情報

Wio-Terminal/ESP8622/ESP32ボードを共通のスケッチで動かす(NTP-CLIENT編)

PlatformIO Core (CLI)

以上

続きを読む "nixieクロックにNTPクライアントの機能を追加する(V2)"

| | コメント (0)

より以前の記事一覧