SDカードスロットがありますね
Wio LTEのSDカードスロットは3G/LTE通信用のSIMカードスロットと共通、というか2階建てになっているので、SIMを挿そうとして困った方もいらっしゃるかもしれません。
Espruino公式のWioLTEページには、「Using SD Card」という項目があります。読むと(拙訳)
- SDカードはEspruino標準のファイルI/Oで取り扱い可能
- ただし電源ONから4秒以上待たないと初期化が終わらないので使えない
という注意書きと共にサンプルコードが提示されていました。
var fs = require('fs');
// Init SDCard
WioLTE.init;
var test = function() {
// List files
console.log('List files on root path:\r\n', fs.readdirSync());
// Write file
fs.writeFileSync("hello.txt", "Hello World");
// read file
console.log(fs.readFileSync("hello.txt"));
// append file
fs.appendFileSync("hello.txt", "!!!");
// read again
console.log(fs.readFileSync("hello.txt"));
};
setTimeout(test, 4000);
WioLTE.init(?)
ここで妙なことに気がつきました。WioLTE.init;
という行がありますが、ハードウェアリファレンスマニュアルのWioLTEの項目には「定義済み」項目として
- WioLTE.A4
- WioLTE.A6
- WioLTE.D20
- WioLTE.D38
- WioLTE.I2C
- WioLTE.LED(red, green, blue)
- WioLTE.setGrovePower(onoff)
- WioLTE.setLEDPower(onoff)
- WioLTE.UART
が挙げられており、WioLTE.init
という項目はありません。実際、Web IDE上で
>WioLTE. <-ここでTABキーを押してコード補完する
A4 A6
D20 D38
I2C LED
UART setGrovePower
setLEDPower apply
bind call
replaceWith clone
emit hasOwnProperty
length on
removeAllListeners removeListener
toString valueOf
としてコード補完を試みてもinitは出てきません。
困った時のソースコード
そもそも、WioLTE向けの定義はどこに書かれているのでしょうか? それを探すと解決の糸口が見つかるかもしれません。GitHubにはEspruinoのリポジトリがあり、ここを探せば見つかる可能性が高そうです。
どのファイルが使われているかはMakefileに書かれている可能性があります。WioLTEに関する記述を探すとこんなものが見つかりました。
ifdef USE_WIO_LTE
INCLUDE += -I$(ROOT)/libs/wio_lte
WRAPPERSOURCES += libs/wio_lte/jswrap_wio_lte.c
SOURCES += targets/stm32/stm32_ws2812b_driver.c
endif
どうやらlibs/wio_lte/jswrap_wio_lte.c
に何か書かれていそうですね。このファイルを探ってみると
/*JSON{
"type" : "init",
"generate" : "jswrap_wio_lte_init"
}*/
void jswrap_wio_lte_init() {
// initialise the SD card
jsvUnLock(jspEvaluate("(function(){digitalWrite(A15,1);var spi=new SPI();spi.setup({mosi:D2,miso:C8,sck:C12});E.connectSDCard(spi,C11);})();",true));
}
という記述がありました。どうやらWioLTE.initはちゃんと定義されているようですね。ここで"type": "init"
と指定されていますが、これはscript/common.py
に説明があり、
# // init = function to run on initialisation
ということでボードの初期化時に実行されるコードのようです。要するに、Espruino公式のWioLTEページに書かれている説明は誤り(あるいは古い)記述であり、WioLTE.init;
は初期化時に実行済みであることが推定されます。
アクセスしてみよう
という訳で先に進みます。
>var fs=require("fs");
=function () { [native code] }
>fs.readdirSync()
Uncaught Error: Unable to mount media : NOT_READY
at line 1 col 16
fs.readdirSync()
^
>
あれ?? メディアがNOT_READY
ということでアクセスが蹴られてしまいました。まだ何か間違いがあるのでしょうか??
もしやWioLTE.initに相当するコードが初期化時に実行されていない? という可能性も考え、こんなコードを動かしてみました。単に上記の初期化コードを書き直し、それからSDカードへのアクセスを試みたものです。
digitalWrite(A15,1);
var spi=new SPI();
spi.setup({mosi:D2,miso:C8,sck:C12});
E.connectSDCard(spi,C11);
var fs=require("fs");
var test = function() {
var result = fs.readdirSync();
console.log("dir\r\n", result);
};
setTimeout(test, 4000);
すると
>
>
_____ _
| __|___ ___ ___ _ _|_|___ ___
| __|_ -| . | _| | | | | . |
|_____|___| _|_| |___|_|_|_|___|
|_| http://espruino.com
1v95 Copyright 2017 G.Williams
Espruino is Open Source. Our work is supported
only by sales of official boards and donations:
http://espruino.com/Donate
>
=undefined
Uncaught Error: Unable to mount media : NOT_READY
at line 9 col 29
var result = fs.readdirSync();
^
in function called from system
>
やはりNOT_READYで読み込めません。なぜ?????