お気に入りアイテムSeeeduinoXIAO
CPU: 256KB Flashと2KB SRAMを搭載したARM® Cortex®-M0+ 32bit 48MHz マイクロコントローラー(SAMD21G18)
2023.04.22追記します。<br />RasberryPi OS(Debian Bullseye)で書き込み時の問題は発生しなくなりました。<br />時々「エラー 操作がキャンセルされました」出ますが以前のような困った状態には陥りません。<br />2021.12.13追記しておきます。
しばらくぶりにRasPiでXIAOを書いてみると、少し状況が変わっていました。
RasberryPi OS(Debian Buster-based version)で書き込み時の問題発生が軽減されているようです。
シリアルモニタを閉じてもスケッチは消えませんでした。
書き込み失敗、ポートの消失、USB抜き挿し要は変わらず
因みにBullseyeではどのスケッチもコンパイルエラーでした。
問題発生は我が家の環境だけかも知れませんので…
Windows10 PCでは何も問題なく使えます。
Raspberry Pi OSや、Raspberry Pi Desktop(intelCPU PC)で
書き込み中エラーや、シリアルポートが認識されなくなる。
シリアルモニタを閉じると書き込んだスケッチが消える?
困っています。
結論
WindowsPCを使う
継続調査の情報です。
Raspberry Pi OSでのスケッチ消失は、
ポート/dev/ttyACMx Seeeduino XIAOをシリアルモニタで
使わなければ大丈夫のようです。
シリアルモニタをみたいときは
①Serial1を使う(SerialUSBをSerial1に書き換える)
②USB-SERIAL変換をつなぐ
6pin(TX)→RXD 7pin(RX)→TXD GND→GND
③別のシリアルターミナルを使う
(GtkTermというのがあったので使いました。)
Raspberry Pi Desktop(intelCPU PC)では
USBケーブルの抜き挿しで回復できました。?
たまたまかも知れません。
RaspbrryPiでの不思議な現象
シリアルポートが認識されなくなった時
media/PiにArduinoという空フォルダがでていて解除できない。
SeeeduinoXIAOのUSBを抜いてもそのまま残る。
回復できた方法
①もう一度書き込んでみる。
②USBケーブルを抜き挿ししてみる。
③USBポートを変えてみる。
④SeeeduinoXIAOのリセットしてみる
(リセットパッドを2回ショート)
⑤RaspberryPiを再起動する。
再起動で一旦書き込めるようになるが、次の書き込みで
また発生することがあるので作業性悪い。
環境
Raspberry 4B 4GB Raspberry OS
NEC PCVJ27 OS:Raspberry Pi Desktop
Arduino IDE 1.8.15(1.8.13でも発生)
ボードマネージャ1.8.1
(1.7.9等他のバージョンでも発生していたようだ。)
スクリーンショット
「書き込み中にエラーが発生しました」
「マイコンボードへ書き込んでいます」で
ArduinoIDEがしばらくフリーズし回復後
XIAOのシリアルポートが認識されなくなる。
オレンジLED速い点滅 リセットしても変わらない
RaspbrryPi再起動したらオレンジLEDゆっくり点滅へ変わった。
ArduinoIDEを起動してシリアルポート確認すると、
XIAOのシリアルポートが認識されている。
書き込みができた。
正常に書き込めた時のスクリーンショット
ストローク間を移動する時間をシリアルモニタへ表示する
スケッチを考えてみました。
マイコン:ESP-WROOM-02
デジタルIO:MCP23S08(8Bit I/Oエクスパンダ)
(E-温度品(動作電圧4.5〜5.5V)を3.3V動作させてます。)
・4Bitを入力、残り4Bitを出力に設定(必須はI/O0,1入力)
・入力は抵抗でプルダウン、スイッチ押すとHIGH
・デジタルI/Oポート全体(レジスタ)を読んで、
使用するI/O以外の変化に影響されない。
・micros()のオーバーフローは考慮しない。
・センサはアクチェータの両ストローク端で検出時ON
IO0 アクチェータの押し(push)側端
IO1 アクチェータの戻り(pull)側端
・Time表示数値の単位は ミリ秒(mS)

動作の説明
IO0に接続したスイッチを押して離し、IO1のスイッチを
押したとき表示される値が戻り時間(pull Time)
IO1に接続したスイッチを押して離し、IO0のスイッチを
押したとき表示される値が押し時間(push Time)
スケッチ例 StateChangDetectionをベースにしました。
コピペ後修正必要です。(修正不要な書き方わからんです)
<を半角に修正する。&amp;を半角&に修正する。
#include <MCP23S08.h>//<を半角に直す
#define CS_PIN 16 //MCP23S08のCS PIN
MCP23S08 expander(CS_PIN, 0x20);//アドレスA0,A1 PIN-GND接続
uint8_t buttonState; //現在の入力状態
uint8_t lastButtonState = 0; //以前の入力状態
unsigned long pushStartTime;
unsigned long pullStartTime;
void setup() {
Serial.begin(115200);
//ESP本体pinModeはSPI.beginの前に置く
SPI.begin();
expander.begin();// I/O expander MCP23S08
for (uint8_t pin = 0; pin
シリアルモニタの表示

右スイッチがIO0、左スイッチがIO1

ESP-WROOM-02で16-BitI/O ExpanderのMCP23S08を動かす
ことが出来ましたので紹介します。
SPIインターフェースでマイコンと接続して8本のデジタルI/O
を増やすことのできるデバイスです。
データシートによると
ハードウェアアドレスピン(A0,A1)を切換えて、最大4デバ
イスを使用可能と書かれています。
つまり4(デバイス)x8(I/O)=32(I/O)です。
パッケージサイズは300mil 18pin DIPを入手しました。
(SOP,SSOPパッケージもラインナップされている。)
まずてはじめにArduino IDEの準備から
ライブラリマネージャでは対応ライブラリが見つからないの
で、「github mcp23s08」でネット検索して見つけます。
(比較的上位の方に出てくると思います。)
githubページを開いて、緑色の「Code」次に
「Download ZIP」をクリックしてダウンロードします。
「対応ライブラリが見つからない」について
検索で出てくるのはMCP23008用と思います。残念!!表示
された説明中にはMCP23008/MCP23S08とありますが、スケ
ッチを見た限りではSPIが出てこないので、使えないと思
います。
ZIP形式ライブラリのインストール手順
スケッチ→ライブラリをインクルード→ZIP形式の・・・インストール
ダンロードしたファイルを選んで[OK]
ライブラリが追加されました。…表示されて完了
結線、デバイスアドレス
ESPr-Oneを使ってブレッドボードに結線しました。
スケッチ編集書き込み
スケッチのCSピンとデバイスアドレスを編集して書き込み
スケッチを書き込めばLEDが順番に点滅を繰返します。
スペースの都合でGP0〜3にはLEDつないでいませんが、
つなげば点滅します。
WiFi、ネットワーク設定を書いたsetup.txtというファイルを
置いて、起動時に読み込んで接続することができました。
webブラウザでSD内ファイルがすべて見えてしまう問題が
ありましたが、特定のファイルだけ見えないようにすることが
出来ました。
特定ファイルを開かせない・・・を見て下さい。
追記 2020/07/26

ip address,gateway,sabnet,dnsは固定できるように
しました。必要なければスケッチのIPAdress行と
WiFi.config行の頭に//をつけてコメント行にしてください。
投稿当初
ボードマネージャバージョンの違いでWiFi接続に失敗する
現象を確認しましたが、現在は発生しません。参考に
ボードマネージャバージョン2.5.2では発生なし。
ボードマネージャバージョン2.6.2は調査中
ボードマネージャバージョン2.7.2で書き込み後最初の
動作でかなりの確率で接続失敗しました。
その後RESETすると接続できました。
作例をWeb公開している方々に感謝します。
setup.txt例とスケッチを紹介します。
SDメモリカードにsetupというフォルダを作り、下記内容を
setup.txtというファイルを作って保存します。
setup.txt例
##以降はコメントとして扱われます。
#SSのあとにSSID、paのあとにpasswordを入力してください
#SS your-SSID #SSID
#pa your-password #password
#
SS ********** #SSID
pa ********** #password
#
#gw 192,168, 1, 1 #gateway
#sn 255,255,255, 0 #subnet
#dn 192,168, 1, 1 #dnS1
#ip 192,168, 1, 10 #ip address
#
gw 192,168, 1, 1 #gateway
sn 255,255,255, 0 #subnet
dn 192,168, 1, 1 #dnS1
ip 192,168, 1, 10 #ip address
スケッチ
スケッチ例DumpFileを改変したものです。
#include行のライブラリ名を<>で囲んで下さい。
#include SPI.h
#include SD.h
#include ESP8266WiFi.h
const int chipSelect = 15;
String ssid;
String password;
int gw[4], sn[4], dn[4], ip[4];
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
//while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
//}
Serial.print("Initializing SD card...");
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("setup/setup.txt",FILE_READ);//setupフォルダ内setup.txtをopen
// if the file is available, write to it:
if (dataFile) {
while (dataFile.available()) {//dataFileを1行づつ評価していく
String line = dataFile.readStringUntil('\n');//終端文字'\n'が検出されるまで読んで文字列全体をlineへ入れる
line = line.substring(0, line.indexOf('#'));//インデックス0(行頭)から(#までのインデックス数)の文字列取得
if (line.substring(0, 2) == "SS") {
ssid = line.substring(line.indexOf(' '));//スペースから行末まで
ssid.trim();//スペース等を除去
} else if (line.substring(0, 2) == "pa") {
password = line.substring(line.indexOf(' '));//スペースから行末まで
password.trim();//スペース等を除去
} else if (line.substring(0, 2) == "gw") {
String gw0 = line.substring(3, 6);
String gw1 = line.substring(7, 10);
String gw2 = line.substring(11, 14);
String gw3 = line.substring(15, 18);
gw[0] = gw0.toInt(); gw[1] = gw1.toInt(); gw[2] = gw2.toInt(); gw[3] = gw3.toInt();
} else if (line.substring(0, 2) == "sn") {
String sn0 = line.substring(3, 6);
String sn1 = line.substring(7, 10);
String sn2 = line.substring(11, 14);
String sn3 = line.substring(15, 18);
sn[0] = sn0.toInt(); sn[1] = sn1.toInt(); sn[2] = sn2.toInt(); sn[3] = sn3.toInt();
} else if (line.substring(0, 2) == "dn") {
String dn0 = line.substring(3, 6);
String dn1 = line.substring(7, 10);
String dn2 = line.substring(11, 14);
String dn3 = line.substring(15, 18);
dn[0] = dn0.toInt(); dn[1] = dn1.toInt(); dn[2] = dn2.toInt(); dn[3] = dn3.toInt();
} else if (line.substring(0, 2) == "ip") {
String ip0 = line.substring(3, 6);
String ip1 = line.substring(7, 10);
String ip2 = line.substring(11, 14);
String ip3 = line.substring(15, 18);
ip[0] = ip0.toInt(); ip[1] = ip1.toInt(); ip[2] = ip2.toInt(); ip[3] = ip3.toInt();
}
}
dataFile.close();
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening setup.txt");
}
Serial.println(), Serial.println();
Serial.print("Connecting to "), Serial.println(ssid);
IPAddress local_IP(ip[0], ip[1], ip[2], ip[3]);
IPAddress gateway(gw[0], gw[1], gw[2], gw[3]); // NTPサーバ名アクセス時必要
IPAddress subnet(sn[0], sn[1], sn[2], sn[3]);
IPAddress dns1(dn[0], dn[1], dn[2], dn[3]); // NTPサーバ名アクセス時必要
WiFi.mode(WIFI_STA);//WiFi子機モード
WiFi.config(local_IP, gateway, subnet, dns1);//ESP引数順序変更不可 NTPサーバ名アクセス時dns1要
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(""); Serial.println("WiFi connected!");
Serial.print("IP address: "); Serial.println(WiFi.localIP());
Serial.print("ESP Mac Address: "); Serial.println(WiFi.macAddress());
Serial.print("Subnet Mask: "); Serial.println(WiFi.subnetMask());
Serial.print("Gateway IP: "); Serial.println(WiFi.gatewayIP());
Serial.print("DNS: "); Serial.println(WiFi.dnsIP());
}
void loop() {
}
ArduinoIDEにコピペしたらメニューの「ツール」「自動整形」
で見やすくなります。
#includeのライブラリ名を忘れずに<>で囲って下さい。
無保証自己責任でよろしくお願いします。