LoginSignup
5
3

More than 5 years have passed since last update.

Sigfox Sens'it SDKで簡単IoT組み込み開発(2)

Last updated at Posted at 2018-02-02

はじめに、前の投稿を見て、Sens'it SDKのダウンロード、GNU Arm Embedded Toolchain (gcc-arm-none-eabi)dfu-utilのインストールをしておいてください。
ここ(2)からは、Sens'itを開発PCと接続し、Sens'itのUpgrade及びFirmwareの開発、書込み、動作確認方法を説明します。

Sens'it Upgrade

開発するファームウェアをSens'it上で動かすためには必ずUpgradeが必要です。これをせず、ファームウェアの書込みを行うと、Sens'itのメモリを壊してしまい、2度と元に戻らないみたいです。
大まかな流れは以下の通りです。
1. Sens'itとPCを付属のUSBケーブルで接続
2. Sens'itをブートローダーモードにする
3. PCのTerminalから"make upgrade"を叩く
上記2.3.についてですが、

Sens'itをブートローダーモードにする

Sens'itのボタン操作でブートローダーモードにしますが、ボタンは若干押しにくいので、ペンのようなものでやられることをお奨めします。
1. Sens'itの全面中央にあるボタンを4回連続で押します。
->Sesn'itのUSBコネクタ部分のLEDが白点滅します
2. すかさず、中央ボタンを長押しします。
->中央ボタンのところとUSBコネクタ部分のLEDが、準にゆっくり白点灯します。
成功したときは、下の写真のようになっているはずです。①→②の順に点灯します。
sens'it boot loader mode.JPG

PCのTerminalからmake upgrade

前の投稿のSens'it SDKダウンロードでダウンロードしたZIPファイルを解凍したディレクトリ(Makefileのあるところ)に移動し、Terminalで

> sudo make upgrade

コマンドを入力してください。
成功した場合は、LEDが緑点灯します。既にupgrade済みの場合は青点灯します。

C言語ソース編集

ここでようやく、ソースコードを編集し、独自のファームウェアを開発します。
まずは、Sens'it SDKのsrcフォルダにあるmain.cファイルを見てみます。

#include "sensit_api.h"
#include "click.h"
#include "battery.h"

int main()
{
    /* Start of variables declaration */

    u8 click;

    /* End of variables declaration */


    /* Start of initialization */

    /* Enable button */
    SENSIT_API_button_init(TRUE);

    /* Check the battery level at initialization */
    BATTERY_check(BATT_INIT_LEVEL);

    /* End of initialization */

    while (TRUE)
    {
        /* Start of application execution loop */

        if (WhoWakeMe == SRC_BUTTON)
        {
            /* The button was pressed, start count click */
            click = CLICK_count();
            if (click == 4)
            {
                /* Reset the device with a quadruple click */
                SENSIT_API_reset();
            }
        }


        /* Add your applicative code here */


        /* Put the device in deep sleep mode */
        SENSIT_API_sleep(MAX_SLEEP_DURATION);

        /* Check the battery level is not too low */
        BATTERY_check(BATT_LOW_LEVEL);

        /* End of application execution loop */
    }
}

初期化の後、whileループが回っている感じで、Arduinoでの開発イメージに近いですね。
ここで/*Add your application code here*/と書かれているところに自身のコードを埋め込んでいくことになりそうです。
ちなみに、SENSIT_API_sleep(MAX_SLEEP_DURATION);では、スリープ時間を指定せず、とにかく、ずーっと寝てろってことです。もし、定期的にセンサデータを取得し送信したければ、ここの引数に実際のスリープ時間(秒)を入れることになります。
あとは、if (WhoWakeMe == SRC_BUTTON)のところですが、ずーっと寝ているSens'itを起こしてあげるトリガを決めています。この場合はSRC_BUTTONなので、「ボタンが押されたら起きましょう」ということになります。その後、CLICK_count()でボタンが押された回数を取得して、「4回」なら、APIをリセットします。この4回というのが、先に書いたブートローダーモードのボタン4回押してねという話につながりそうです。
大体のテンプレートの意味が分かったところで、/*Add your application code here*/のところにカスタムコードを書いていきます。

温度・湿度・照度のデータを取得するプログラム

今回は、温度・湿度・照度のデータを取得し、Sigfoxネットワークに送信するプログラムを作ってみます。

Sigfoxデータ送信

Sigfoxの場合、最大12バイトのペイロードを送るというルールがあるので、それ以下のサイズの送信データ配列とセンサー情報を取得する関数、そして、Sigfox送信用の関数を使います。

        /* Add your applicative code here */
        u8 payload[10];
        u8 customer_response[8];
        get_temp_humid_light(payload);

        SENSIT_API_send_sfx_frame(SFX_RC3,RED,payload,10,customer_response,3,FALSE);

        /* Put the device in deep sleep mode */
        //SENSIT_API_sleep(MAX_SLEEP_DURATION);
        SENSIT_API_sleep(300);

ここで、SENSIT_API_send_sfx_frame()関数がデータ送信用のAPIです。日本では第1引数をSFX_RC3としておいてください。第2引数は送信時に点滅させるLEDの色、第3、第4引数に送信するデータ配列とその長さを指定。第5引数以降は、下り受信時の話なので、とりあえずは、上記のままで結構です。
その後、SENSIT_API_sleep(300)で、300秒間(5分間)寝てもらいます。つまり、5分後に戻ってきます。
Sens'it SDKのAPIドキュメントは、SDKダウンロード先のdoc\doxygen\index.htmlにありますので、見てみてください。

温度・湿度・照度取得

get_temp_humid_lightという関数を作ってみます。

void get_temp_humid_light(u8* payload)
{
    /* 温度センサーアクティブ */
    SENSIT_API_temp_sensor_mode_active();
    /* 照度センサーアクティブ */
    SENSIT_API_light_sensor_mode_active(LIGHT_SENSOR_SETTING_GAINx1);

    SENSIT_API_sleep(20);

    /* 温度・湿度取得 */
    s16 temp = 0;
    u16 humid = 0;
    SENSIT_API_temp_sensor_measure(&temp, &humid);

    union {
        float v;
        u8 c[4];
    } t;
    t.v = ((float)temp) / 8.0;

    union {
        u16 v;
        u8 c[2];
    } h;
    h.v = humid / 2;

    /* 照度取得 */
    u16 light_ch0 = 0;
    u16 light_ch1 = 0;  
    SENSIT_API_light_sensor_measure(&light_ch0, &light_ch1);

    union {
        u16 v;
        u8 c[2];
    } l0;
    l0.v = light_ch0;

    union {
        u16 v;
        u8 c[2];
    } l1;
    l1.v = light_ch1;

    payload[0] = t.c[0];
    payload[1] = t.c[1];
    payload[2] = t.c[2];
    payload[3] = t.c[3];
    payload[4] = h.c[0];
    payload[5] = h.c[1];
    payload[6] = l0.c[0];
    payload[7] = l0.c[1];
    payload[8] = l1.c[0];
    payload[9] = l1.c[1];

    /* 温度センサースリープ */
    SENSIT_API_temp_sensor_mode_sleep();

    /* 照度センサースリープ */
    SENSIT_API_light_sensor_mode_sleep();

    return;
}

(コードをわかりやすくするため、エラー時は、何もせずにFALSEを返しています。)
大まかな流れは、
1. 各センサーをアクティブにする
SENSIT_API_temp_sensor_mode_active:温湿度センサー
SENSIT_API_light_sensor_mode_active:照度センサーアクティブ
2. センサーデータ取得
SENSIT_API_temp_sensor_measure:温度・湿度
SENSIT_API_light_sensor_measure:照度
3. センサーをスリープにする
SENSIT_API_temp_sensor_mode_sleep:温湿度センサー
SENSIT_API_light_sensor_mode_sleep:照度センサー
あとは、ペイロード用のデータ配列に入れておきます。

これで、完成です。Sens'itに書き込んでみます。

コンパイル

その前に、コンパイルしないといけないので、必要に応じMakefileを編集し、makeコマンドを叩いておきます。

Sens'itへの書込み

書込みの際は、毎回、ブートローダーモードにしないといけません。
上にも書いていますが、念のため、もう一度書いておきます。
1. Sens'itの全面中央にあるボタンを4回連続で押します。
->Sesn'itのUSBコネクタ部分のLEDが白点滅します
2. すかさず、中央ボタンを長押しします。
->中央ボタンのところとUSBコネクタ部分のLEDが、準にゆっくり白点灯します。
あとは、

> sudo make prog

コマンドを叩けば、Sens'itにファームウェアが書き込まれます。

以上!
しばらくすると、LEDが赤色に点滅し、データが送信されていることが確認できます。

次回は、Sigfoxクラウドでデータが受信できたかを確認する方法を説明します。

>Sigfox Sens'it SDKで簡単IoT組み込み開発(3)

5
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3