本文書内の実測値等はあくまで参考値となりますので予めご了承ください。
GitHubのリポジトリをZIPファイルとしてダウンロードする手順は以下の通りです。
- ダウンロードしたいリポジトリのページに移動する。
- 画面の右側の緑色の「Code」を選択する。
- 「Code」を選択したら「Download ZIP」を選択する。
「Download ZIP」を選択したら、ZIPファイルがダウンロードされます。
GitHubのリポジトリをコマンドラインでダウンロードする手順は以下の通りです。
- ダウンロードしたいリポジトリのページに移動する。
- 画面の右側の緑色の「Code」を選択する。
- 「Code」を選択したら「HTTPS」か「SSH」か「GitHub CLI」のいずれかを選択する。通常は「HTTPS」を選択すると良い。
- 「HTTPS」を選択したら、
git clone https://github.com/{ユーザ名}/{リポジトリ名}.git
が表示されるのでコピーします(urlの右側のアイコンをクリックするとリンク全てをコピーできます)。 - ターミナルよりコピーしたコマンドを実行すると、コマンドを実行したディレクトリにリポジトリがダウンロードされます。
$ git clone git clone https://github.com/{ユーザ名}/{リポジトリ名}.git
Arduinoライブラリのインストール方法は、こちらをご覧ください。なお、各センサーやアドオンボードなどのArduinoライブラリは、主にGitHubにて提供されています。Library Specificationのlayout of folders and filesに準拠したライブラリは、Importing a ZIP libraryまたはManual Installationでインストール出来ます。なお、ArduinoライブラリはGitHubで提供されていることが多いです。ダウンロード方法ついてはこちらを参考にしてください。
「.ZIP形式のライブラリをインストールする」を選択する | フォルダもしくはZIPファイルの場所を選択する |
---|---|
スケッチディレクトリは、新しく作成したスケッチのデフォルトの保存先になっています。また、スケッチディレクトリ内のlibrariesディレクトリには新しく追加したライブラリが保存されます。なお、保存先は、Arduino IDEの設定で変更することが出来ます。
OS | スケッチディレクトリ | ライブラリディレクトリ |
---|---|---|
Windows | C:\Users\{ユーザー名}\Documents\Arduino |
C:\Users\{ユーザー名}\Documents\Arduino\libraries |
Mac OS | /Users/{ユーザー名}/Documents/Arduino |
/Users/{ユーザー名}/Documents/Arduino/libraries |
Linux | /home/{ユーザー名}/Arduino |
/home/{ユーザー名}/Arduino/libraries |
git archiveコマンドを使用することでリポジトリ内のサブディレクトリをZIP圧縮することが出来ます。
$ git clone https://github.com/SonySemiconductorSolutions/ssup-spresense
$ cd ssup-spresense
$ git archive HEAD:Arduino/MM-S50MV -o MM-S50MV.zip
SDカードがうまく動作ときは下記の可能性があります。
- メインボードと拡張ボードのコネクタが半差しになってうまく接続されていない
- SDカードが認識できないフォーマットでフォーマットされている。
(1) については、一度、メインボードを上から押しこんでみてください。表面上はうまく接続 されているように見えますが、接続がうまくいっていなことがあります。
(2) については、SDカードがFAT32でフォーマットされているかご確認ください。
他の要因の可能性もありますが、まずは、上記2点についてご確認をお願いいたします。
フレームレートは取得する画像のサイズやフォーマットによって変わってきます。例えば、こちらは、5秒間分のQVGA(320x240)の120fpsのストリームをJPEGでSDカードに書き込むプログラムになります。このプログラムhfr_jpg.inoの画像サイズやフレームレート等については、setup()内部のtheCamera.begin()の引数を変更してください。また、保存時間については、#define FRAMES_NUM を変更してください。なお、SDカードのメーカーや使用状況によっては1フレーム内にSDカードへの書き込み処理が終わらず、想定しているフレームレートが出ない可能性もあります。予めご了承ください。
また、hfr_jpg.inoは、QVGAの画像サイズですが、例えばQUAD-VGA(1280x960)などに画像サイズの場合は、下記のように変更すると30fpsくらいのフレームレートで画像を取得することが出来ます。
theCamera.begin(2,
CAM_VIDEO_FPS_30,
CAM_IMGSIZE_QUADVGA_H,
CAM_IMGSIZE_QUADVGA_V,
CAM_IMAGE_PIX_FMT_JPG,
14
);
その他、画像サイズや画像フォーマットを変更した際のフレームレートについては、パラメータを変更して試してみてください。
SDカード上の同一ディレクトリの画像ファイル数が増えてくるとフレームレートの低下が発生し30fpsでは保存できなくなります。これを回避するために、以下の2つの方法を試してみたところ、試した範囲ではほぼ30fpsのフレームレートで保存することが出来ましたのでご紹介しておきます。
1つのフォルダに200枚毎の画像を保存する。
現在は、仮に200枚としていますが、
- 1つのフォルダに200枚の画像を保存する。
- 200枚になったら新しいフォルダに200枚保存する。
といった方法で1つのフォルダに保存する枚数を抑えて記録するとフレームレートがほぼ30fpsで保存することが出来るようです。
Motion JPEG (AVI)フォーマットで画像を保存する。
下記のライブラリを使用して、10分間程度AVIフォーマットで保存したところファイルサイズ約130MBでほぼ30fpsの動画を保存することが出来るようです。
もし、必要であれば、ffmpeg等を用いて後からPC上で一枚毎JPEGファイルに切り出すのは可能かと思います。
Spresense本体に通信のAddonボードを接続した際、データ通信で使用しているSPIの最大レートが13Mbpsとなります。このため、SPIの最大レートに近いスピードが出せる有線LANを使用してもHD画像を30fpsの送信することは出来ません。
HDRカメラボードはオンチップの複数フレームデジタル重畳技術によってHDRイメージセンシング(120dB)に対応します。カメラボードでは対応が難しかった暗所や逆光などの明暗差の大きい環境でもクリアな映像が得られます。
再生するために用意した音声ファイル情報が記載されたplaylistファイル TRACK_DB.csv にチャンネル情報の記入が必要です。詳細についてはaudio_playerサンプルのReadMeファイルを参考してください。
オーディオの使用についてはいくつか注意事項があります。下記についてご確認ください。
-
ビット長を24ビットに設定した場合、ハイレゾモードに設定しなければなりません。ハイレゾモードに設定していない場合には、0x16エラーが発生します。
-
バッファオーバーフローエラーが発生する場合は、ソースコードのSTDIO_BUFFER_SIZEを再設定する必要があります。
送受信が上手くいかなかったり、途中で通信が切れてしまうなどが発生する際には、電波状況だけではなくSpresense SDKの不具合の可能性もあります。LTE拡張ボードを利用する際には、不具合の改善がされていることがあるのでリリースノートをご確認の上なるべく最新版に近いSDKをご利用ください。
THOUSANDIY-005で使用しているESP-WROOM-02はESP8266EXを搭載を搭載していますが、Spresense SDKは現在ESP8266に対応していないためSpresense SDKでの使用はできません。 Arduinoから使用した場合のみ使用可能となります。
無線LANのアクセスポイントとの接続が出来ず、Association Failsなどのエラーが発生するケースとしてはいくつかが考えられます。
- Spresenseとアドオン基板の接触が良くない。このときは、Spresenseとアドオンボードを強めに押さえて接続できないか試してみてください。
- AP_SSIDの値が使用したい無線LANのアクセスポイントと異なっている。このときは、無線LANのアクセスポイントのSSIDと異なっていないか確かめてみてください。
- PASSPHRASEの値が使用したい無線LANのアクセスポイントと異なっている。このときは、無線LANのアクセスポイントのPASSPHRASEと異なっていないか確かめてみてください。
- まれにボードを挿しこんだ時の接触が悪い時があるようです。手で押さえていると動作するか確かめてみてください。
ELTRESの電波到達距離が100km以上になる際の条件は、
- 送信点が地上または海面等から十分に高い
- 受信点が標高1000m以上と十分に高い
のように、地球の曲率を考慮して送信点から受信点が見通しになっていること、および、
- 電波が伝搬する際のフレネルゾーンに地面・海面が掛からない
となります。この条件に合わない場合は到達距離は短くなると思ってください。また、ELTRESを雨や海水の水滴がかかるような環境で使用する際には電波が散乱・吸収されるため通信に影響が出ます。
ELTRESはGNSSを受信開始してから受信局との間で同期できる時刻精度になったら通信します。GNSSの受信ができない環境では通信できません。なお、GNSS受信してから時刻同期までは40秒ほど必要になります。
SPRESENSE-WISUN-EVK-701のみでネットワークを構築することが可能です。 参考資料としてSPRESENSE-WISUN-EVK-701で1対1のネットワークを構築し、データ送受信を行うサンプルプログラムはこちらになります。
サンプルプログラムの動作説明書はこちら、 サンプルプログラムはこちらになります。
Spresenseは低電流のため通常のスマートフォン用モバイルバッテリを使用すると数秒で電力供給が切れてしまうことがあります。もし、すぐに電力供給が切れてしまうようでしたらIoT対応や低電流モード等をサポートしたモバイルバッテリを試してみてください。
Flashメモリへのデータ書き込み中に瞬断(電源OFFやリセット)が入ると、データが中途半端に書かれ、ファイル管理領域との整合性が取れない状態になります。そして、次の起動時にfile system check処理が走り、この中途半端な異常ファイルを検知すると、そのファイルを削除しにいく処理が走ります。これはファイルシステムの整合性を保つために必要な処理になります。Flashメモリへのデータの書き込みが不安定なのは、一連のオペレーションの中でデータをファイルに書き込んでいる途中で意図せずリセットが入ってしまっているのではないかと予想します。
例えば、常時、”data.txt”にデータを書き込んでいる場合、タイミング悪く、USBを抜き差ししたり、リセットボタンを押したり、シリアルモニタを開いたりすると、この瞬断が発生して次の起動でファイルが消去されます。
対策としては、以下の方法が考えられます。
dataFileへの書き込みを細切れにせずにできるだけ一度に書き込むようにします。
変更前
dataFile.print(sframe);
dataFile.print(",");
dataFile.print("X");
dataFile.print(",");
dataFile.print("Y");
dataFile.print(",");
dataFile.println("Z");
変更後
len = sprintf(buf, "%ld,X,Y,Z\n", sframe);
dataFile.write(buf, len);
また、サンプルごとにFlashに書きこむのではなく、複数サンプルのデータをバッファに溜めておいてから、まとめて一度に書き込む方が効率が良くなります。
常に"data.txt"に追加書き込みをするのではなく、ある程度書き込んだら書き込むファイル名を変更します。
起動した直後にファイルを書き込むのは止めて、ある程度の時間を置いてからファイル書き込み処理を行うようにWaitを入れます。
その他、Flashメモリへの書き込み中にリセットが入らないような仕組みを検討してみてください。
現状、ソフトウエアの制約によりオーディオのハードウエアの制御はメインコアからしか出来ず、音出力の処理はメインコアで行う必要があります。対応にはソフトウエアのベースのところからの修正が必要とのことで、今のところソフトウエアの修正の予定はありません。
送信バッファおよび受信バッファは、内部でそれぞれ8つ分のバッファを持っており、Recv()が呼ばれずに受信バッファがいっぱいの状態になると、システムは異常状態と判断してプログラムはassertします。このassertが発生した場合には、受信側のコアが正しく動作していない、または、負荷が高すぎるなどの可能性が考えれます。
コア間通信のアドレスとしてローカル変数を使用すると、関数を抜けた際にメモリが解放されるため上手く値を渡せません。例えば、
void func()
{
double a = 2.0;
MP.Send(0, &a);
}
のようにローカル変数を指定すると、func()を抜けた後、ローカル変数aが使用しているメモリは解放されてしまうため、MP.Recv()で受信したアドレスは既に解放されていることが多いです。アドレス渡しで使用する変数には、グローバル変数やヒープなどのメモリを使用してください。
MP通信は8段の受信バッファを持っていますが、Arduinoが提供しているAPIで受信バッファの段数を変更できません。
APP GPIOは最大6本まで使用できますが、SDカードの抜き差し検出用に1本使用するため、拡張ボードを使用する際には5本しか使用できません。
Arduinoでは、Software Serial Libraryが提供されています。Software Serialが使用できないか検討してみてください。
I/O | 最大通信速度 |
---|---|
SPI5(メインボード) | 13Mbps(Tx & Rx mode) |
SPI4(拡張ボード) | 39Mbps(Tx mode), 9.750Mbps(Tx & Rx mode) |
SPI(LTE拡張ボード) | 6.5Mbps |
SDIO | 21MB/s |
UART | 1.8432Mbps |
I2C | 400kbps |
SPIについては、メインボードおよび拡張ボードのどちらもTx & Rx modeではデータレートがおよそ10Mbps前後となっており、通信チップの性能に関わらず、10Mbps辺りが通信速度の上限となりますのでご注意ください。
いろいろな方法がありますが、Google Admin Toolboxが提供しているサービスを使用するとWebブラウザからOS非依存で調べることができます。
Arduino向けにEigenArudinoというmatrix/vectorライブラリがあります。
以下をダウンロードしてArduino IDEでインストールして試してみてください。
SpresenseのデジタルI/O(D00~D15)ですが電圧は5Vになりますが、電流が6mA程度となり、DCモータを直接接続して回すには電流が足りません。
モータドライバを使用して動作させている例がありますので、こちらをご参考にして頂ければと思います。