WSL2

2021年3月27日 (土)

WSL2でRustを動かす

2021/3/27

WSL2 Rust Install

WSL2 Rust Install

概要

WSL2でRustを動かす。
WSL2のUbuntu20.04をホストにする前提で
PicoボードをターゲットとしてRustをインストールからビルド書き込みまで説明している。

Rustのインストール

Ubuntu20.04/WSL2で以下を実行する:

# 必要なディレクトリを用意する mkdir ~/rust_ws mkdir /mnt/c/temp # Rustをインストールする curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 入力を促されるので「1」を入力する source $HOME/.cargo/env # 関連ツールのインストール rustup target add thumbv6m-none-eabi rustup component add llvm-tools-preview cargo install uf2conv cargo-binutils

書き込みスクリプト

WSL2はUSBストレージをサポートしていないので、PowerShell.exe経由で、書き込むスクリプトを用意する。
pico_UF2.sh

#!/bin/bash uf2conv firmware.bin --base 0x10000000 --family 0xe48bff56 --output firmware.uf2 rm /mnt/c/temp/* cp firmware.uf2 /mnt/c/temp/ PowerShell.exe copy c:/temp/*.uf2 e: exit 0

・実行属性を与えること。
・「e:」は環境依存なので、自分の環境で、uf2ファイルを書き込むドライブ・レターを設定すること。

Pico用環境をダウンロードする

cd ~/rust_ws git clone https://github.com/jannic/rp-microcontroller-rs.git

ビルド

cd rp-microcontroller-rs/boards/rp-pico # binまでビルドする cargo build --target thumbv6m-none-eabi --example=blink --release cargo objcopy --example blink --release -- -O binary firmware.bin

書き込み

# BOOTSELボタンを押しながら、PCのUSBコネクタに接続し # 接続後、BOOTSELボタンを離す。 # RPI-RP2のディレクトリが出現する。 # このタイミングで以下を実行する。 ./pico_UF2.sh

書き込みが完了するとLEDが点滅する。

参考情報

Rust関連:
Rustをインストール
`llvm-tools`, a new rustup component for binary inspection (objdump, nm, size) and profiling (profdata)
Rust support for RP2040 microcontrollers

WSL2関連:
WSL2でRDPサーバーを動かす
WSL2でSSHサーバーを動かす
WSL2でのplatformioやPico-SDKの利用方法

以上

続きを読む "WSL2でRustを動かす"

| | コメント (0)

2021年3月25日 (木)

WSL2でTinyGOを動かす

2021/3/25

WSL2 TinyGO Install

WSL2 TinyGO Install

概要

WSL2でTinyGOを動かす。
WSL2のUbuntu20.04をホストにする前提で
XIAOボードを中心としてインストールからビルド書き込みまで説明している。
target名を変更することで他のボードのビルドなども行うことができる。

Go/TinyGoのインストール

Ubuntu20.04/WSL2で以下を実行する:

mkdir ~/tigo_ws cd ~/Downloads # goのインストール wget https://golang.org/dl/go1.16.2.linux-amd64.tar.gz sudo rm -rf /usr/local/go sudo tar -C /usr/local -xzf go1.16.2.linux-amd64.tar.gz export PATH=$PATH:/usr/local/go/bin # tinygoのインストール wget https://github.com/tinygo-org/tinygo/releases/download/v0.17.0/tinygo_0.17.0_amd64.deb sudo dpkg -i tinygo_0.17.0_amd64.deb export PATH=$PATH:/usr/local/tinygo/bin # その他のexport export GOPATH=$HOME/tigo_ws export TIGOLIBS=$GOPATH/pkg/mod/tinygo.org/x/drivers@v0.15.1 # 書き込み用のディレクトリを作る mkdir /mnt/c/temp

以下を.bashrcに追加する:

# tinygo/go export PATH=$PATH:/usr/local/go/bin export PATH=$PATH:/usr/local/tinygo/bin export GOPATH=$HOME/tigo_ws export TIGOLIBS=$GOPATH/pkg/mod/tinygo.org/x/drivers@v0.15.1

書き込みスクリプト

WSL2はUSBデバイス(USBストレージも含む)をサポートしていないので、
WSL2でhexまたはuf2のファイルまで作成した後、
PowerShell.exe経由で USBストレージに書き込むことで、ボード書き込みを行う。

このスクリプトは、「~/tigo_ws」に置いて、実際のプロジェクト・ディレクトリにコピーして使用することとする。
以下、対応ボードごとのbashスクリプトになる。

fUF2.sh

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

・実行属性を与えること。
・「e:」は環境依存なので、自分の環境で、uf2ファイルを書き込むドライブ・レターを設定すること。

fHEX.sh

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

・実行属性を与えること。
・「e:」は環境依存なので、自分の環境で、uf2ファイルを書き込むドライブ・レターを設定すること。

インストール時付属サンプルのビルド例

cd ~/tigo_ws # microbit系 tinygo build -size full -o=mb.hex -target=microbit examples/microbit-blink tinygo build -size full -o=mb2.hex -target=microbit-v2 examples/microbit-blink # SAMD系 tinygo build -size full -o=cpx.uf2 -target=circuitplay-express examples/blinky1 tinygo build -size full -o=fm4.uf2 -target=feather-m4 examples/blinky1 tinygo build -size full -o=xiao.uf2 -target=xiao examples/blinky1 tinygo build -size full -o=wiot.uf2 -target=wioterminal examples/blinky1 # mbed系 tinygo build -size full -o f103.hex -target nucleo-f103rb examples/blinky1

独自プロジェクト(blinky)の作成

独自プロジェクト(blinky)を作成するには
ディレクトリblinkyを作成して、

(1)その中に以下のファイルを作成する:
blinky.go

package main // This is the most minimal blinky example and should run almost everywhere. import ( "machine" "time" ) func main() { led := machine.LED led.Configure(machine.PinConfig{Mode: machine.PinOutput}) for { led.Low() time.Sleep(time.Millisecond * 1000) led.High() time.Sleep(time.Millisecond * 1000) } }

(2)go.modの作成
以下を実行してgo.modを作成する:

go mod init blinky

「blinky」は任意のようだが プロジェクト名(ディレクトリ名)に合わせる。

(3)ビルド
以下を実行してビルドする:

tinygo build -size full -o=xiao.uf2 -target=xiao .

これで、xiao.uf2が作成される。

出力例:

$ tinygo build -size full -o=xiao.uf2 -target=xiao . code rodata data bss | flash ram | package 2574 13 0 130 | 2587 130 | (bootstrap) 0 36 0 0 | 36 0 | handleHardFault$string 164 24 4 4 | 192 8 | internal/task 2844 18 13 2054 | 2875 2067 | machine 0 16 0 0 | 16 0 | machine$alloc 40 0 0 0 | 40 0 | main 2352 79 0 48 | 2431 48 | runtime 28 0 0 0 | 28 0 | runtime/volatile 92 0 0 0 | 92 0 | time 8094 186 17 2236 | 8297 2253 | (sum) 8508 - 20 4312 | 8528 4332 | (all) $ ls -l *.uf2 -rw-r--r-- 1 xxxx xxxx 17408 3月 25 08:10 xiao.uf2

(4)書き込み
以下を実行して書き込む:

# 書き込みスクリプトをカレント・ディレクトリにコピーする cp ~/tigo_ws/fUF2.sh . # ボードとホストPCをUSBで接続する。 # RSTパッドを2度GNDショートして、bootloader-modeに入る。 # Arduinoのディレクトリが現れる。 #書き込み ./fUF2.sh

ボードの赤いLED(D13)が1秒周期で点滅すれば動作としてはOKとなる。

serialを動かす

(1)以下のようにプロジェクト用ディレクトリを作成する:

cd tigo_ws mkdir serial cd serial

(2)プロジェクト(serial)ディレクトリに
以下のファイルを作成する:
serial.go

package main import "time" func main() { for { println("hello world!") time.Sleep(time.Second) } }

(3)go.modの作成
以下を実行してgo.modを作成する:

go mod init serial

「serial」は任意のようだが プロジェクト名(ディレクトリ名)に合わせる。

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

# ビルド tinygo build -size full -o=xiao.uf2 -target=xiao . # 書き込みスクリプトをカレント・ディレクトリにコピーする cp ~/tigo_ws/fUF2.sh . # ボードとホストPCをUSBで接続する。 # RSTパッドを2度GNDショートして、bootloader-modeに入る。 # Arduinoのディレクトリが現れる。 #書き込み ./fUF2.sh

以上で、プログラムが起動する。

(4)シリアル通信の起動
windows側の通信ソフト(teratermなど)でシリアル接続すると
以下のような出力が得られる。(通信速度:115200 bps)

hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! ...

TinyGOのモジュールを利用する

実行例: # 以下で、モジュールをインストールする go get tinygo.org/x/drivers # インストールしたモジュールのパスを設定する #(この場合は設定済みなので特にやることはない) # インポートしたいモジュールを確認する ls $TIGOLIBS #出力 CHANGELOG.md bmp280 hcsr04 microbitmatrix st7789 CONTRIBUTING.md bmp388 hd44780 microphone tester LICENSE buzzer hd44780i2c mma8653 thermistor Makefile dht hub75 mpu6050 tmp102 README.md displayer.go i2c.go net touch adt7410 drivers.go ili9341 pcd8544 veml6070 adxl345 ds1307 l293x semihosting version.go amg88xx ds3231 l9110x shifter vl53l1x apa102 easystepper lis2mdl shiftregister waveshare-epd at24cx espat lis3dh sht3x wifinina bh1750 examples lsm303agr spi.go ws2812 blinkm flash lsm6ds3 ssd1306 bme280 go.mod mag3110 ssd1331 bmi160 go.sum mcp23017 ssd1351 bmp180 gps mcp3008 st7735 # ここでは例として「ws2812」を使用してみる mkdir ws2812 cd ws2812 # exampleのmain.goをコピーする cp $TIGOLIBS/examples/ws2812/main.go . chmod +rw main.go # main.goを編集する nano main.go # 以下のように修正する:
// Connects to an WS2812 RGB LED strip with 10 LEDS. // // See either the others.go or digispark.go files in this directory // for the neopixels pin assignments. package main import ( "image/color" "machine" "time" "tinygo.org/x/drivers/ws2812" ) // 以下は接続するneopixelの数に合わせる var leds [64]color.RGBA //var leds [10]color.RGBA func main() { led := machine.LED led.Configure(machine.PinConfig{Mode: machine.PinOutput}) neo := machine.D4 // for Feater-M4/XIAO // neo := machine.NEOPIXELS neo.Configure(machine.PinConfig{Mode: machine.PinOutput}) ws := ws2812.New(neo) rg := false for { rg = !rg for i := range leds { rg = !rg if rg { // Alpha channel is not supported by WS2812 so we leave it out //leds[i] = color.RGBA{R: 0xff, G: 0x00, B: 0x00} leds[i] = color.RGBA{R: 0x0f, G: 0x00, B: 0x00} } else { //leds[i] = color.RGBA{R: 0x00, G: 0xff, B: 0x00} leds[i] = color.RGBA{R: 0x00, G: 0x0f, B: 0x00} } } ws.WriteColors(leds[:]) led.Set(rg) time.Sleep(100 * time.Millisecond) } }

続き:

# go.modを初期化する go mod init ws2812 # 以下のコマンドで必要なモジュールを自動設定する go mod tidy # ビルド tinygo build -size full -o=xiao.uf2 -target=xiao . # 書き込みスクリプトをカレント・ディレクトリにコピーする cp ~/tigo_ws/fUF2.sh . # ボードとホストPCをUSBで接続する。 # RSTパッドを2度GNDショートして、bootloader-modeに入る。 # Arduinoのディレクトリが現れる。 #書き込み ./fUF2.sh

D4をneopixelsのDIN,3V3をVCC,GNDをGNDに接続する。
書き込んで実行すると、接続したneopixelsが色を変えて光る。

tmp102(i2c)を動かす

mkdir tmp102 cd tmp102 cp $TIGOLIBS/examples/tmp102/main.go . chmod a+rw main.go nano main.go # 以下の内容にする: (修正点は無いはずだが以下の内容であることを確認する)
package main import ( "fmt" "machine" "time" "tinygo.org/x/drivers/tmp102" ) func main() { machine.I2C0.Configure(machine.I2CConfig{ Frequency: machine.TWI_FREQ_400KHZ, }) thermo := tmp102.New(machine.I2C0) thermo.Configure(tmp102.Config{}) for { temp, _ := thermo.ReadTemperature() print(fmt.Sprintf("%.2f°C\r\n", float32(temp)/1000.0)) time.Sleep(time.Millisecond * 1000) } }

続き:

# go.modを設定する go mod init tmp102 go mod tidy # 以下、ビルド&書き込み tinygo build -size full -o=xiao.uf2 -target=xiao . # 書き込みスクリプトをカレント・ディレクトリにコピーする cp ~/tigo_ws/fUF2.sh . # ボードとホストPCをUSBで接続する。 # RSTパッドを2度GNDショートして、bootloader-modeに入る。 # Arduinoのディレクトリが現れる。 #書き込み ./fUF2.sh

XIAOのピン定義

port pin
PA02 A0/D0
PA04 A1/D1
PA10 A2/D2
PA11 A3/D3
PA08 A4/D4
PA09 A5/D5
PB08 A6/D6
PB09 A7/D7
PA07 A8/D8
PA05 A9/D9
PA06 A10/D10

ボードのターゲット名

「-target=nxiao」を以下にあるターゲット名に変更すると
他のボード用にビルドできる。

主なもの(ビルド時にhexまたはuf2を生成するもの)

(1)Adafruit Circuit Playground Bluefruit circuitplay-bluefruit (2)Adafruit Circuit Playground Express circuitplay-express (3)Adafruit Feather M0 feather-m0 (4)Adafruit Feather M4 feather-m4 (5)Adafruit ItsyBitsy M0 itsybitsy-m0 (6)Adafruit ItsyBitsy M4 itsybitsy-m4 (7)BBC micro:bit microbit (8)BBC micro:bit v2 microbit-v2 (9)seeed XIAO xiao (10)seeed wio-terminal wioterminal (11)ST Micro "Nucleo F103RB" nucleo-f103rb

・mbed系(nucleo,microbitなど)のボードは、hexファイルで書き込むので、
書き込みの際は、fHEX.shを使用すること。
・上で上げているadafruitならびにseeedのボードは、uf2ファイルで書き込むので、
書き込みの際は、fUF2.shを使用すること。

参考情報

(古い情報も含まれているので注意のこと)

https://github.com/tinygo-org/tinygo
https://tinygo.org/
https://tinygo.org/getting-started/linux/

コンピュータボードでTinyGOを動かす
docker/TinyGO Helper Script
TinyGOでLightSensorを動かす

TinyGoで始める組み込みプログラミング
TinyGo on Arduino Uno: An Introduction

Circuit Playground Express
Adafruit Circuit Playground Express - Overview
Infrared Receive and Transmit with Circuit Playground Express

Adafruit Circuit Playground Express - PINOUT
Adafruit Circuit Playground Express Pin Assign

NUCLEO-F103RB mbed pinout
NUCLEO-F103RB Pin Assign
STM32F4DISCO Pin Assign
MICROBIT Pin Assign
ARDUINO-NANO Pin Assign
ARDUINO Pin Assign

TinyGo Drivers

USB Flashing Format (UF2)

XIAO Schematic(zip)
How to use Seeeduino XIAO to log in to your Raspberry PI

WSL2関連:
WSL2でRDPサーバーを動かす
WSL2でSSHサーバーを動かす
WSL2でのplatformioやPico-SDKの利用方法

以上

続きを読む "WSL2でTinyGOを動かす"

| | コメント (0)

2021年3月17日 (水)

WSL2でRDPサーバーを動かす

2021/3/22
・日本語変換のインストール方法について追加した。

2021/3/21+
・「「localhost:3390」で接続する際、接続できないことがある。」問題があり、
それは、localhostの実IPへの変換が安定していないせいだったが、
.wslconfig設定を追加することで修正した。

2021/3/18++
・SSH環境を修正したので、RDPログイン環境下でも、PowerShell.exeが動作するようになった。
参照:WSL2でSSHサーバーを動かす
 
2021/3/17
初版

WSL2 RDP server

WSL2 RDP server

概要

WSL2でRDPサーバーを動かす。
以下での環境整備が完了している前提でのRDPサーバーのインストール方法について述べる。
WSL2でSSHサーバーを動かす

.wslconfig設定(2021/3/21追加)

localhostの実IPへの変換を正常にさせるために以下を設定する。

windows側のc:\Users\<ユーザ名>\.wslconfigを作成して
以下の内容を設定する:

.wslconfig

localhostForwarding=True

以上を設定した後、以下を実行する:

PowerShell

wsl --shutdown

以上の実行でwslをシャットダウン(その後自動で起動される)。
これは、windows10のPCを起動するたびに実行する必要があるので
SSHサーバーで自動実行のbatに登録すると便利になる。

setup-ubuntu-ssh.bat

wsl --shutdown for /F %%i in ('wsl -d Ubuntu-20.04 exec hostname -I') do set ip=%%i netsh interface portproxy delete v4tov4 listenport=22 netsh interface portproxy add v4tov4 listenport=22 connectaddress=%ip% wsl -d Ubuntu-20.04 -u root bash /opt/service_start.sh

RDPサーバーのインストール

以下の手順でインストールする:
ubuntu20.04/WSL2

sudo apt update && sudo apt -y upgrade sudo apt -y install xfce4 sudo apt install xfce4 xfce4-goodies sudo apt install xrdp sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini sudo sed -i 's/max_bpp=32/#max_bpp=32\nmax_bpp=128/g' /etc/xrdp/xrdp.ini sudo sed -i 's/xserverbpp=24/#xserverbpp=24\nxserverbpp=128/g' /etc/xrdp/xrdp.ini echo xfce4-session > ~/.xsession #startwm.shを編集する sudo nano /etc/xrdp/startwm.sh #最後の2行をコメントアウトする。 #そして、末尾に #startxfce4 #を追加する。

編集後のstartwm.sh

/etc/xrdp/startwm.sh
(修正部分のみ)

<省略> ##test -x /etc/X11/Xsession && exec /etc/X11/Xsession ##exec /bin/sh /etc/X11/Xsession # xfce startxfce4

RDPサーバーの起動

sshでWSL2-ubuntuにログインして 以下を実行する:

sudo service xrdp start #出力 * Starting Remote Desktop Protocol server

RDPサーバーの起動状況を確認したい場合、
以下のコマンドを実行する:

service xrdp status #出力 * xrdp-sesman is running * xrdp is running

ある程度、自動的にxrdpサーバーを起動する場合は
以下を~/.profileの末尾に追加する:
.profile

<省略> # xrdp retval=$(service xrdp status >/dev/null 2>&1; echo $?) if [ ! $retval == "0" ]; then echo xrdp server start... sudo service xrdp start fi # dbus retval=$(service dbus status >/dev/null 2>&1; echo $?) if [ ! $retval == "0" ]; then echo dbug start... sudo service dbus start fi

このスクリプトでログイン時に
serviceの状態をチェックしているので、
xrdp serverが停止している場合、
「xrdp server start...」が表示されるので、
パスワードを入力する。

RDPで接続する

windows10の「リモートデスクトップ接続」で
localhost:3390 に接続する。
この後、プロンプトが表示されるので、
セッションをxorgのままにして、
WSL2のユーザー名とパスワードを入力する。
ここで、xfce4のディスクトップ画面が表示される。

現在、以下のような制限があるようだ:
(1)PATHが変更になっているのか、PowerShell.exeが動かない。
2021/3/18: SSH環境の改善で動作するようになった。
参照:WSL2でSSHサーバーを動かす
(2)コマンドラインからGUIアプリを起動した場合は、(Xserverが起動している場合)Xserverによる表示になる。
以下の場合はRDPによる表示になる:
・ファイラーでファイルを指定してアプリを選択してクリックするとGUIアプリを起動する。また、アプリ・アイコンをクリックしての起動やアプリケーション・メニューからの起動などができる。
(3)外部からのアクセスでもRDP接続できるようだが、画面が黒いままで使用不可である。
  
/********** 以下の解決済み(2021/3/21) **********
トラブルシュート:
「localhost:3390」で接続する際、接続できないことがある。
原因不明だが、windows10のPCのIPアドレスがDHCPで払い出されて、
実質的にIPアドレスが変わったときに接続できない状況になっている印象がある。
確定的な解決方法は今のところないが、何度も再起動からトライしていると接続できるようだ。
************************************************/

日本語変換のインストール(2021/3/22)

RDPディスクトップのターミナルで以下を実行する:

# 日本語化 sudo apt -y install language-pack-ja sudo update-locale LANG=ja_JP.UTF8 # fcitx-mozc(日本語入力)のインストール sudo apt install -y fcitx-mozc dbus-x11 sudo sh -c "dbus-uuidgen > /var/lib/dbus/machine-id" # fcitx設定 # profileの編集 sudo nano /etc/profile #以下を末尾に追加する: #fcitx export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx export DefaultIMModule=fcitx fcitx-autostart > /dev/null 2>&1 xset -r 49 > /dev/null 2>&1 ##

以上のインストールが終了したら、WSL2を再起動する。 再度、RDPログインすれば、日本語変換が使用可能になる。

おまけ(chromeのインストール)

以下の手順でchromeをインストールできる:

sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - sudo apt update sudo apt install google-chrome-stable

デスクトップのプリケーション・メニューから起動できる。

参考情報

localhost関連:
WSL2の2つの設定ファイル「.wslconfig」と「wsl.conf」
「WSL 2」最大の課題であった“localhost”問題が解決 ~「Windows 10」Build 18945 すべてのWSLディストロに共通のグローバル設定、カスタムLinuxカーネルの利用にも対応
WSL2: UbuntuでLocalhostを表示させる方法

RDP関連:
Linux on Windows: WSL with Desktop Environment via RDP
WSL2+ubuntu20.04: GUI化して使う方法

SSH関連:
WSL2のUbuntuにsshできるようにする
Windows10で特定のポートを開放する
WSL2 に外部からアクセスする
MobaXterm - Enhanced terminal for Windows with X11 server, tabbed SSH client, network tools and much more

日本語変換関連:
WSL2+Ubuntu 20.04LTSでデスクトップ(xfce4)を表示する。
Windows10 の WSL(Windows Subsystem for Linux) の Ubuntu18.04 で日本語入力する設定

その他:(未確認)
WSL2+Ubuntu 20.04環境から音声を出力する

以上

続きを読む "WSL2でRDPサーバーを動かす"

| | コメント (0)

2021年3月14日 (日)

WSL2でSSHサーバーを動かす

2021/3/20
・Documents/setup-ubuntu-ssh.batの自動起動方法を
PowerShellの自動起動スクリプトから
タスクスケジュールによる起動に変更した。
なので、windows10のPCを起動すると
自動的にsetup-ubuntu-ssh.batが起動する。

2021/3/18
・SSHログイン環境下でも、PowerShell.exeが動作するようにした。

2021/3/15
・SSHで外部からアクセスした際のDISPLAY変数の設定値を追加した。
・GUIアプリ起動時に出ているエラーの解消方法について追加した。

2021/3/13+
初版

WSL2 SSH server

WSL2 SSH server

概要

WSL2でSSHサーバーを動かす。
WSL2ならびにbuntu20.04のインストールが終了している前提で SSHサーバーを動かす方法について述べる。

SSHサーバーのインストール

以下の手順でインストールする:
ubuntu20.04/WSL2

sudo apt update sudo apt install openssh-server

WSL2の起動用スクリプト

WSL2は起動時にデーモンが動いていないので
以下のサービス起動用のスクリプトを作成する:
/opt/service_start.sh

#!/bin/bash service ssh start service dbus start service avahi-daemon start service cron start

以下のコマンドで実行権限を与える:

sudo chmod a+x /opt/service_start.sh

windows10側(PowerShell側)のスクリプト

以下のWSL2側の設定を行うbatを作成する:

Documents/setup-ubuntu-ssh.bat

wsl -d Ubuntu-20.04 -u root bash /opt/service_start.sh for /F %%i in ('wsl -d Ubuntu-20.04 exec hostname -I') do set ip=%%i netsh interface portproxy delete v4tov4 listenport=22 netsh interface portproxy add v4tov4 listenport=22 connectaddress=%ip%

/********* 以下、起動方法の変更により廃止 *********

該当のbatを自動実行させるために、
自動実行されるPowerShellのスクリプト(Microsoft.PowerShell_profile.ps1)の
末尾に以下を追加する:
Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
(存在しない場合、新規に作成する)

Documents/setup-ubuntu-ssh.bat

これで、PowerShellを管理者権限で立ち上げると
該当のbatが実行されて WSL2でSSHサーバーが起動することになる。

*********************************************************/

タスク・スケジューラによる自動起動の設定

タスク・スケジューラで以下のように設定する:

全般: ユーザーがログオンしているのみ実行する:on 最上位の特権で実行する: on 構成:[windows10] (重要:これを設定しないと動作しないようだ) トリガー: タスクの開始: ログオン時 遅延時間を指定する: 30秒間 操作」 操作:[プログラムの開始] プログラム/スクリプト: Documents/setup-ubuntu-ssh.batを置いたフル・パス 条件: タスクを実行するためにスリープを解除する:on それ以外、off

参照:Windows10 - 管理者権限が必要なアプリを自動起動(スタートアップ)

この設定で、windows10のPCを再起動すると自動的に
setup-ubuntu-ssh.batが実行される。

これで、<WSL2のユーザー名>@<windowsの外部から見えるIP>で SSHログインできる。

なお、<windowsの外部から見えるIP>は、 PowerShellで以下を実行した出力から分かる:
PowerShell

ipconfig # 出力 Windows IP 構成 <省略> Wireless LAN adapter Wi-Fi: 接続固有の DNS サフィックス . . . . .: リンクローカル IPv6 アドレス. . . . .: xxxxxxxxxxxxxxx IPv4 アドレス . . . . . . . . . . . .: 192.168.0.13 サブネット マスク . . . . . . . . . .: 255.255.255.0 デフォルト ゲートウェイ . . . . . . .: 192.168.0.1 イーサネット アダプター vEthernet (Default Switch): <省略> イーサネット アダプター vEthernet (WSL): <省略>

WiFiで接続している場合、「Wireless LAN adapter Wi-Fi:」のIPアドレスが 該当のIPになるので、ここでは「192.168.0.13」となる。

SSHポートを開放する

外部のPCからWSL2のSSHサーバーにアクセスする場合、windows10のSSHポートを開放する必要がある。色々な解説が、ネット上、見つかるが、代表的なものとして以下を挙げる:
Windows10で特定のポートを開放する
または、管理者権限でPowerShellで以下を実行する:
PowerShell

New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 22 -Action Allow -Protocol TCP

GUIアプリ

XフォーワードでGUIアプリを動かすときに必要となるDISPLAY変数は以下を設定する。

export DISPLAY=<windowsの外部から見えるIP>:0.0 #上の例では以下のようになる: export DISPLAY=192.168.0.13:0.0

この設定をWSL2の~/.profileと~/.bashrcの末尾に登録すると
自動化できる。
なお、
~/.profileは、ログイン・シェル用の起動スクリプト、
~/.bashrcは、インタラクティブ・シェル用のスクリプトになる。

Xサーバーを内蔵している以下のMobaXtermを使用すれば特別にXサーバーを用意しなくてもWSL2のGUIアプリが使用できる。

SSHで外部からアクセスする場合、
「ssh -Y user@hostname.local」などで起動すれば、
GUIアプリも動作するが、DISPLAY変数を以下に設定する必要がある:

export DISPLAY=localhost:10.0

なお、内部のWSL2のログインでも上の設定でGUIアプリが動くようだが 遅いようなので、内部の使用では、もとの設定のほうが良いようだ。

MobaXterm - Enhanced terminal for Windows with X11 server, tabbed SSH client, network tools and much more
設定は、SSHはデフォルトで、
WSL2ログインの場合は「Run method: Native connector」に
する必要がある。

VScode in WSL2

WSL2にVScodeをインストールして実行すると以下のようなメッセージが出る:

To use Visual Studio Code with the Windows Subsystem for Linux, please install Visual Studio Code in Windows and uninstall the Linux version in WSL. You can then use the `code` command in a WSL terminal just as you would in a normal command prompt. Do you want to continue anyway? [y/N] y To no longer see this prompt, start Visual Studio Code with the environment variable DONT_PROMPT_WSL_INSTALL defined.

ようするに、WSL2ではlinux版ではなくてwindows版を使えと言ってくる。 たぶん以下のような機能があるのでwindows版で十分ということらしい。

VSCodeでWSL2のLinux上のファイルをリモート操作する

とは言え、普通の使い方がしたい場合、linux版のほうが良いと感じると思うので そのまま、このメッセージを無視しても構わない。このメッセージが頻繁にでて鬱陶しいので以下を実行すると出なくなる:

export DONT_PROMPT_WSL_INSTALL=1

永続的に有効にする場合は、~/.profile,~/.bashrcに登録する必要がある。

参考:VScodeのインストール方法

wget http://deb.rug.nl/ppa/mirror/packages.microsoft.com/repos/vscode/pool/main/c/code/code_1.54.2-1615424848_amd64.deb sudo dpkg -i code_1.54.2-1615424848_amd64.deb

エラー解消

GUIアプリを起動する際、動作に実害はないが、エラーメッセージが出ているので、その解消方法について述べる:

(1)「G_IS_DBUS_CONNECTION」

GLib-GIO-CRITICAL **: 21:22:13.063: g_dbus_proxy_new: assertion 'G_IS_DBUS_CONNECTION (connection)' failed

上のようなエラーが出ている場合、以下を実行すると解消する:

sudo apt purge fcitx-module-dbus

参考:Lubuntu - G_Is_Dbus_Connection

(2)「icon text-x-generic」

Could not load theme icon text-x-generic: ...

上のようなエラーが出ている場合、以下を実行すると解消する:

sudo apt install gnome-icon-theme

PowerShell.exeを動作させる(2021/3/18)

SSHログイン環境ではPATHの問題か「PowerShell.exe」が動作しない。 そこで以下のようにシンボリック・リンクを張り、SSHログイン環境下でも 「PowerShell.exe」が動作するようにする。

bash

sudo ln -s /mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0//PowerShell.exe /usr/bin/PowerShell.exe #確認 which PowerShell.exe #出力 /usr/bin/PowerShell.exe #シンボリック・リンクの確認 ls -l /usr/bin/PowerShell.exe lrwxrwxrwx 1 root root 62 3月 18 18:02 /usr/bin/PowerShell.exe -> /mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0//PowerShell.exe

参考情報

WSL2のUbuntuにsshできるようにする
Windows10で特定のポートを開放する
WSL2 に外部からアクセスする
MobaXterm - Enhanced terminal for Windows with X11 server, tabbed SSH client, network tools and much more

以上

続きを読む "WSL2でSSHサーバーを動かす"

| | コメント (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)