Q.boardを使ったサンプルプログラムを幾つか用意したので、体験しながら利用方法を習得できます。

シリアルポートによる通信

まずはボードにプロクラムが書き込まれる事を確認する事から始めます。
以下の通りsketchを準備します。
STM_CODE;

void setup() {
}

void loop() {
  delay(1000);
  Serial.println("Hello world");
}

SerialはUSBの仮想シリアルポートを指します。多くのArduinoボードではFTDIチップがチップのUARTをUSB上の仮想シリアルポートとして取り扱ってくれますが、 Q.boardではメインMCU(STMと略します)が直接USBを取り扱っています。このため通常setup()内で行われるUARTのボーレートを設定するbegin()の構文は記載しても良いですが、特に記載する必要がありません。

  1. Arduino IDEのツールメニューで、ボードがKoozyt Dash (Native USB Port)となっていることを確認します。
  2. 同じくツールメニューでポートがQ.boardが使用するCOMポートと一致していることを確認します。
    tutorial_comport_01
  3. アップロードボタンを押し、プログラムが書き込まれるのを待ちます
  4. ツールメニューから、シリアルモニターを選択し、スケッチが動作していることを確認します。


はじめて書き込む時にWindowsを使用している場合、書き込みモードへ移行した時のドライバーが正しく設定されていない可能性があります。
書き込みに失敗した場合は(Windows 8の場合)WindowsキーとXキーを同時に押してデバイスマネージャーを表示し、警告アイコンがどこにも表示されていないことを確認します。もし表示されている場合は、インストール方法のページからブートローダの設定方法を確認します。その後、Q.boardの電源を一旦外して再度接続しなおしてから、Arduino環境から再度スケッチを書き込みします。

BLEからの通信

次にBLE側にプログラムを書き込んでみます。BLEは仮想シリアルポートに直接つながっていないので、BLE側から何かを出力したい場合は STM側がデータを中継する必要があります。それを実現するためのSTM側スケッチが以下になり、これをSTM側に書き込みます。
STM_CODE;

void setup() {
}

void loop() {
  if (SerialBLE.available()) {
     Serial.write(SerialBLE.read());
  }
}
そして、このスケッチをSTM側に書き込みます。
次に、以下のスケッチをBLE側へ書き込みます。スケッチを書き込み時に、ツールメニューでBLE側かSTM側どちらをターゲットにしているかによってKoozyt Dash, Koozyt Dash BLEのいずれかが正しく選択されている事をあらかじめ確認しておきます.
BLE_CODE;

void setup() {
}

void loop() {
  delay(1000);
  Serial.println("Hello world");
}
シリアルモニターを開いた時、定期的に文字列が表示されれば成功です。
STMとBLEは内部でUARTとSPIで接続されています。UARTはSTM側からみた場合 UART1 (Serial1) , SPI4 (SPI_4) が割り当てられていて、 BLE側は UART (Serial), SPI (SPI) が割り当てられています。 STM側とBLE側で、スケッチが起動する前に内部シリアルポートが正しく115200 bpsで通信できるようにあらかじめセットアップされているので、スケッチ内ですぐに使用することが可能です。
UARTで通信する場合、BLEのスケッチを更新する場合やその他にもこのUART通信が使用されるため、Arduinoスケッチからシリアルに転送するデータは内部でパケットプロトコル上のフォーマットに変換されて転送されますので、実際の通信速度は115200よりも遅くなります。
STM_BLE_comm_01


BLEビーコンの作成

次にBLE側に信号を発信させます。
BLE_CODE;
/* mbed Microcontroller Library
 * Copyright (c) 2006-2013 ARM Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
#include "BLE_API.h"

BLEDevice ble;

const static uint8_t beaconPayload[] = {
    0x4C, 0x00,                                             // Company identifier code (0x004C == Apple)
    0x02,                                                   // ID
    0x15,                                                   // length of the remaining payload
    0xE2, 0xC5, 0x6D, 0xB5, 0xDF, 0xFB, 0x48, 0xD2,         // location UUID
    0xB0, 0x60, 0xD0, 0xF5, 0xA7, 0x10, 0x96, 0xE0,
    0x00, 0x00,                                             // the major value to differentiate a location
    0x00, 0x00,                                             // the minor value to differentiate a location
    0xC8                                                    // 2's complement of the Tx power (-56dB)
};

void setup() 
{
    uint32_t err_code = 0;
    uint8_t val = 0;

    err_code = ble.init(); 
    
    ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
    ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, beaconPayload, sizeof(beaconPayload));
    ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
    ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */

    ble.startAdvertising();
}

void loop() 
{
    ble.waitForEvent();
}

このプログラムを書き込むと、Q.boardからビーコン信号が発信しているのを確認することができます。