BLEシリアル通信をWioTerminalとスマホで!

本記事は、WioTerminalとAndroidスマートフォンの間でデータのやり取りをする方法を紹介します。

ネットで検索したときに少しはPlatformIO + Seeedのライブラリ + WioTermianal で無線通信をしている記事がありましたが、
数が少なく心配だったので、成功例を増やして、あとから来る方に安心してトライしてもらう意味で本記事を執筆しました。

用意するもの

手順

  1. WioTerminalの中の無線通信用CPU (RTL8720DN)のファームウェアを、ATSAMD51から更新します
    • ambd_flash_tool (https://github.com/Seeed-Studio/ambd_flash_tool)
    • git cloneするか、圧縮ファイルをダウンロード、解凍します
    • WioTerminal の電源ボタンを二度押し下げ、ファームウェアを書き換えられる状態にします
    • Windowsの場合は、Power Shell を開きambd_flash_toolの中の実行ファイル ambd_flash_tool.exeや ambd_flash_tool.py がある階層へ移動します
    • 次のコマンドで、データをクリアします
ambd_flash_tool.exe erase
    • 次のコマンドで、データを書き込みます
      • はじめに、WioTerminal_USB2Serial_Burn8720.ino.binがATSAMD51用のプログラムとして書き込まれます
      • 次に、firmware配下にある km0_boot_all.bin、km0_km4_image2.bin、 km4_boot_all.bin という名前のファイルを書き込むようになっているようです
ambd_flash_tool.exe flash
      • 実行の様子は、本記事末尾に貼ってあります
  1. VSCodeを起動し、新しいプロジェクトを作成
    • プロジェクト名例 : WioTerminalBLESerial
    • platform : Arduino
  1. platformio.iniを開き、ライブラリを追加します
    • ※ Seeed Arduino rpcBLEは、platform IOのライブラリ検索でヒットしたので、platform IOのライブラリ管理からプロジェクトに追加しました
    • rpcUnifiedとFreeRTOSは、ライブラリ検索でヒットしなかったため、gitリポジトリを指定しています
    • 変に混在させず、すべてgitリポジトリを指定すれば良いと思います
; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:seeed_wio_terminal]
platform = atmelsam
board = seeed_wio_terminal
framework = arduino
lib_deps = seeed-studio/Seeed Arduino rpcBLE@^1.0.0
           https://github.com/Seeed-Studio/Seeed_Arduino_rpcUnified.git
           https://github.com/Seeed-Studio/Seeed_Arduino_FreeRTOS.git
  1. src/main.cppを開き、サンプルコードを貼り付けます
  1. コンパイルが成功することを確認します
  1. WioTerminalに書き込みます
  1. Androidスマートフォンに、SerialBluetoothTerminalをインストールします
  2. SerialBluetoothTerminalを起動します
    • 左上のハンバーガーメニューを押します
    • Devicesを選択します
  3. WioTerminalと接続します
    • 画面上部のタブから、「Bluetooth LE」を選択します
    • 画面上部の「SCAN」をクリックします
    • リストに「UART Service」が表示されます
    • UART Serviceをクリックします
  4. 文字をAndroidスマートフォンからWioTerminalに送ります
    • スマホ画面下部のテキストボックスに文字を入力します
    • テキストボックス右の 送信ボタンを押します
      • hello という文字を送ると、PlatforomIO シリアルモニタに出力された
      • WioTermialからは0x0~0x255のバイナリを送るため、一部文字化けしたデータがAndroidの画面に表示されます
Waiting a client connection to notify...
MyServerCallbacks onConnect 
*********
Received Value: hello

*********
start advertising
続きを読む

オカムラの中古オフィスチェアを購入

中古でオカムラSylphy(シルフィ)を購入しました。

購入のポイント

  • 中古でお安く
  • 前傾をとれるような椅子が良い
  • 細身に合う椅子
  • ランバーサポートが欲しい
  • ひじ掛けは不要

妥協

  • 椅子の台座の色

購入店舗

  • オフィスバスター(ウェブ)

届いた

f:id:prescott0216:20210921204457j:plain:w250

状態

  • 背もたれ等は目立った解れ等なし
    • ウェブ上のAランク表示を信じ購入。不満無し
  • 脚の部分に目立つ傷あり
    • 特に気にしないのでok
  • シリンダ部分に汚れがたまっていた
    • 一度ふき取り、シリコンスプレーで油分再塗布

f:id:prescott0216:20210921205338j:plain:w250

M5StickC plusでBlynkを使ったパワーLEDの制御

本記事は、AndroidスマホからBLE(Bluetooth Low Energy)によってM5StickC Plusに信号を送り、パワーLEDの光り方を制御する方法についてまとめます。


準備するハードウェア

ソフトウェア

手順

  1. パワーLEDを光らせる回路を組みます

f:id:prescott0216:20210904013736p:plain:w250
LEDドライバ(PWM調光)の回路図

  1. M5StickCの信号線をLEDドライバと接続します
f:id:prescott0216:20210904015243p:plain:w400
M5Stick PWM信号出力
  1. Blynkのsampleコードをもとに、コーディングします

基本的には、loop関数内でBlynk.run()を実行するだけで良いです。
ただ、一度スマートフォン側でBLEを切断したのち、再接続しようとしても接続できませんでした。
そこで、ライブラリを修正しました。
具体的には、スマホが接続されたらBLEのアドバタイジングを止める、スマホが切断されたらBLEのアドバタイジングを開始できるようにしてみました。
今回、M5StickCに対して同時に何台も接続する必要がないので、とにかく再接続ができれば良しとしました。

メインプログラム

#include "M5StickCPlus.h"
#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>

#define AUTHTOKEN "01234abcdef7890ghijklmn"
void setup()
{
  M5.begin();
  pinMode(GPIO_NUM_26, OUTPUT);
  Serial.begin(9600);

  Blynk.setDeviceName("KawasakiPannir");
  Blynk.begin(AUTHTOKEN);

  ledcSetup(LED_CH0, 12000, 8);
  ledcAttachPin(GPIO_NUM_26, LED_CH0);

   ledcWrite(LED_CH0, 0);    // LED OFF
}

BLYNK_WRITE(V0)            // Slider 0 to 255, PIN V0
{
  uint32_t value = param.asInt();
  Serial.println(value);
  ledcWrite(LED_CH0, value);
}

void loop()
{
  static bool myblestat = false;
  int ret;

  if(myblestat == false && Blynk.connected() == true)
  {
    Serial.println(" > Status Changed ! [ Connected ]");
    Blynk.endScan();
    myblestat = true;
  }
  ret = Blynk.run();
  if(ret < 0)
  {
    if(myblestat == true)
    {
      myblestat = false;
      resetLed0();
      Serial.println("Please wait...");
      delay(1000);
      Blynk.startScan();
      Serial.println("New Device Waiting...");
    }
    delay(500);
  }

}

BlynkSimpleEsp32_BLE.h

 (省略)
class BlynkTransportEsp32_BLE :
    public BLEServerCallbacks,
    public BLECharacteristicCallbacks
{
(省略)
public: 
    void stopAdvertising()
    {
        pServer->getAdvertising()->stop();
    }

    void startAdvertising()
    {
        pServer->getAdvertising()->start();
    }

(省略)
};

(省略)

class BlynkEsp32_BLE
    : public BlynkProtocol<BlynkTransportEsp32_BLE>
{
    typedef BlynkProtocol<BlynkTransportEsp32_BLE> Base;
public:
    BlynkEsp32_BLE(BlynkTransportEsp32_BLE& transp)
        : Base(transp)

 (省略)
    void startScan()
    {
        conn.startAdvertising();
    }

    void endScan()
    {
        conn.stopAdvertising();
    }

};

まとめ

スマートフォンとM5StickC PlusをBLEで接続し、 パワーLEDの調光ができました。

The following post may lead us to the solution of the BLE reconnection trouble that is included in the ESP32 library.

WioTerminalでCAN通信~ライブラリ実装編~

本記事は、WioTerminal(ATSAMD51)でこれまでに試してきたWioTerminalとMCP2515のSPI通信について、ライブラリを作成して使いやすくする過程を示します。
なお、ライブラリをC++でコーディングしていますが、C++コーディング手法については手本にはなりません。ご了承ください。

開発中のGitリポジトリはこちらです。
github.com


これまでにMCP2515を試した記録記事は次の2本です。
embaud-ot.hateblo.jp

embaud-ot.hateblo.jp

ステップ1 : MCP2515のアドレス定義

まずは、ヘッダファイルにMCP2515の固定値を定義します。
プリプロセッサのDefine命令によって、コーディング用の固定値として登録し、コーディングをスムーズに間違いなく行えるようにします。
今回定義したのは、大まかに次の3つの値です。

それぞれの定義名の規則は次のようにしました。

  • 「MCP2515_REG_」をレジスタ名の定義
  • 「MCP2515_MD_ 」を動作モード
  • 「MCP2515_CMD_」を短縮命令

MCP2515の定義を追加したコミット

ステップ2 : SPI通信で命令を発行する関数の実装

命令のみの発行、命令発行+データの送信、命令発行+データ送信+データ受信 というパターンがあるので、それぞれを行う関数を定義しました。

  • orderInst
  • orderSend
  • orderRecv

MCP2515のSPIインターフェースを実装したコミット

ステップ3 : MCP2515の構成設定を実装

CAN通信設定として、CNF1, CNF2, CNF3を設定することで、CAN通信速度を定義します。
setConfig関数を、3つの設定パターンで実装しました。

  • セグメント長を手動入力で指定するタイプ
  • CNF1, CNF2, CNF3に値を設定するタイプ
  • 所望のCANボーレートと、MCP2515への供給クロックを指定することでセグメント長を自動計算するタイプ

MCP2515のConfigurationレジスタ設定を実装したコミット

この時点で、CANCTRLレジスタをオペレーションモードをNormalや、ListenOnlyモード、LoopBackモードに設定することでCAN通信をテストすることができます。

ステップ4 データ受信構造を実装

CANデータを受信するメソッドを実装しました。
READ RX STATUS 命令を用いて、受信データの有無、何番のバッファにデータが入っているかをはじめに調べます。
次に、READ RX BUFFER 命令で IDとデータ長を取得、最後に受信したデータ長分のデータを取り出します。
candata_stという構造体を作成し、そこにパケット情報を詰め込みました。

  • recv
    • 受信バッファ内のデータ取り出し
  • getRxStat
    • 受信バッファ内のデータ有無確認

MCP2515のデータ受信を実装したコミット

ステップ5 バッファ状態出力ピン設定を実装

CANデータがバッファに入ったことを、毎度SPI通信でレジスタを確認するのも良いですが、頻繁に確認するようだと、オーバヘッドが大きくなります。
MCP2515には、受信バッファのデータ有無をデジタル信号出力する機能があるため、マイコンに信号線をつなげることで信号状態High/Lowによってデータの有無を確認することができます。

  • pinMode

MCP2515のDigital Outputピンの設定を実装したコミット

単にデジタルアウトプットピンとしても使用できるため、マイコン入門用にMCP2515のLチカも実装してみました。
MCP2515のLチカ (blink LED)サンプルスケッチ

ステップ6 データ送信構造を実装

データ受信で使用したcandata_st構造体を使用し、そこに格納されたデータを送信する構造を作りました。
送信データの格納は、TXバッファへのロード命令を使用しました。

  • setTxData
    • バッファへ格納
  • send
    1. バッファへの格納と送信リクエストを同時に発行する
    2. 送信リクエストを発行(setTxDataと併用)

データ送信を実装したコミット

まとめ

WioTerminalとMCP2515とのSPI通信、SPI通信で命令を発行してレジスタ読み書きをすることで、初期設定、データ受信、データ送信、基本的な操作をするためのライブラリができました。

WioTerminalでCAN通信~通信設定編~

本記事は、WioTerminal(ATSAMD51)でCAN通信をするために、MCP2515に送るSPIコマンドについて記します。

前回の記事で、WioTerminalとCANコントローラ"MCP2515"を接続する回路について記しました。

embaud-ot.hateblo.jp

準備

実験に必要な機材、ソフトウェアを示します。

準備

実験に必要な機材、ソフトウェアを示します。

Hardware

Software

Library

  • 学習のために自作したため、無し

References

shop.cqpub.co.jp

  • CAN通信の仕組み、MPU2515のレジスタ操作について解説されています。
続きを読む

WioTerminalでCAN通信~回路組み立て編~

Microchip ATSAMD51P19を搭載したプロトタイプボード「WioTerminal」でCAN通信を試してみました。

はじめに、ATSAMD51にはCANコントロール機能がありません。
以前、M5StickC Plus(ESP32PICO)でCAN通信の実装を行いました。
ESP32にはTWAIコントローラ(=CAN)が内蔵されており、レジスタ操作によってCAN信号の読み書きが可能です。
従って、CAN H, CAN Lの差動信号に変換する「CANトランシーバ」を用意することで、CAN通信ができます。

embaud-ot.hateblo.jp

WioTerminalには、CANプロトコルを生成するCANコントロール機能さえもないため、別途CANコントローラを用意する必要があります。
今回は、CANコントローラとして「MPU2515」を購入し、以前使用した CANトランシーバ「CANBusUnit For M5Stack」を活かしたCAN通信の実装を示します。

準備

実験に必要な機材、ソフトウェアを示します。

Hardware

Software

Library

  • 学習のために自作したため、無し

References

shop.cqpub.co.jp

  • CAN通信の仕組み、MPU2515のレジスタ操作について解説されています。
続きを読む

WSL2とVSCodeを使ってC/C++ビルド環境を整える

Windows10で、VSCodeを使ったC言語の開発環境を作りました。
MinGWを使わず、WSL2のubuntu内にあるコンパイラを使う環境を今回作りました。

Goal

Hardware

Windows PC

Software

  • OS : Windows 10 build ver.2004
  • Editor : VSCode
  • Virtual platform : WSL2
  • Virtual OS : Ubuntu 20.04 LTD

References

docs.microsoft.com
qiita.com
qiita.com
ntk-ta01.hatenablog.com


上記の参考サイトを見ても、環境構築、Cソースのビルド動作を確認できない場合は、続きを参考にしてください。

続きを読む