Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

WioLTEのSDカードは使えるのか?(未解決)

More than 3 years have passed since last update.

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で読み込めません。なぜ?????

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away