ArduinoクローンのCH340G搭載シリアルには気をつける

毎回トラップに引っかかってしまうのでメモ。
IoT作成で安いからと、UNOクローンの廉価版を買ってしまうことがあるが、その中でも、どうしてもうまくいかないものが、CH340Gというシリアル通信(USBケーブルさしてデータ書き込みとかする)するためのアダプタが載った基盤。いろんな人の手順書を見ると、中国のメーカーサイトでCH340Gドライバーをダウンロードして終わり、というような形で書いてあるものの、やはり認識しない。MacOS SierraとHigh Sierraで試した。前に試した時はUSB接続するとクラッシュする現象が起きて、恐くてもう触ってない。

結論

廉価のCH340Gが載ったものは買わないことに決めた。
一方で、サインスマートの基盤は安いわりにちゃんと動くし、しっかりしてる。CH340G使ってないし。
サインスマート UNO R3 ATmega328P

CH340Gが載った基盤例(おすすめできないもの)

CH340Gのドライバー

だいたい、以下の2つが書かれている。どちらをインストールしても認識しなかった。

Written with StackEdit.

Arduino 関数定義が動かない時のエラーメモ

Arduinoで関数を定義する場合は、以下のようにsetupとloop以外のところで定義する。

———————————
void setup() {
  // 処理書く
}

void loop() {
  // 処理書く
}

[戻り値の型] 関数名() {
  // 処理書く
}
———————————

「error: return-statement with a value, in function returning ‘void’ [-fpermissive]」というエラーは、戻り値の指定がおかしい場合などに出力される。
自作関数はvoidか型を「戻り値の型」に定義する。

1.void 関数名() ← voidは戻り値を必要としない場合。

(例)

  void loop() {
     display();
  }

  void display() {
     int r = r + 10;
     Serial.printf(r);
  }

2.[戻り値の型] 関数名() ← 戻り値を必要する場合。

(例)

  void loop() {
     String txt = display();
     Serial.print(txt);
  }

  String display() {
     String r = “abc”;
     return r; // 戻り値が必要な場合は定義する。returnがないと値が戻ってこない。
  }

■参考サイト
Arduinoチュートリアル 基礎編

ESPr Developer(WROOM02)で書き込みできない現象

■現象
 Arduino IDEで書き込みすると以下のようなエラーが出る。
————————————————————————————————————————
Arduino: 1.6.12 (Mac OS X), Board: “Generic ESP8266 Module, 160 MHz, 80MHz, DIO, 115200, 4M (3M SPIFFS), nodemcu, Serial, All”

Sketch uses 227,745 bytes (21%) of program storage space. Maximum is 1,044,464 bytes.
Global variables use 33,120 bytes (40%) of dynamic memory, leaving 48,800 bytes for local variables. Maximum is 81,920 bytes.
warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
error: espcomm_upload_mem failed

This report would have more information with
“Show verbose output during compilation”
option enabled in File -> Preferences.
————————————————————————————————————————

■原因
自分の場合は以下の2パターンありました。
パターン1: TX, RXのピンに繋いだまま書き込み。リセットしてからピンを接続せずに書き込みしたらOKだった。
パターン2: 手動リセットの設定をしていた。リセットの儀式をしたうえで、Arduino IDE -> Tools -> Reset Method: CK になっていたのをnodemcuにしたら書き込めた。

■参考になるブログ
ESPr Developer(ESP-WROOM-02開発ボード)で “warning: espcomm_sync failed” と表示される場合の対処 
Arduinoで書き込みできなくなった原因をメモ

BLE Nano -> Arduino連携時のデータ送信

シリアル経由のデータやり取りは、1文字ずつしか送れないため、シリアルモニターにも1文字ずつしか出力できない。そのため、終端文字を一緒に送って、「ここから、ここまでのデータを送るよ」と伝える必要がある。

(例)1111.111 ← 「1111.111」を送りたい。データの切れ目として「」(NULL終端文字)も一緒に送り、ここがデータの最後であることを伝える

■接続イメージ
BLE Nano(TX) -> (11番PIN)Arduino UNO

■送信データ(BLE Nano -> Arduino UNO)
1111.111

■そのまま出力した場合
シリアルモニターには以下のように1文字ずつ出力されてしまう
—————————————————————–
1
1
1
1
.
1
1
1

—————————————————————–

■データをためて一気に出力する場合のソース例(Arduino UNO側のソース)
#include

#define BLUETOOTH_TX 11
#define BLUETOOTH_RX 10

SoftwareSerial bluetooth(BLUETOOTH_TX,BLUETOOTH_RX);

char buffer; // BLUETOOTH_RXで受信する文字(1文字)
String value; // BLUETOOTH_RXで受信した文字をためる
char term_char = ‘’; // 受信終了を判断する終端文字

void setup() {
  Serial.begin(9600);
  bluetooth.begin(9600);
}

void loop() {
  if(bluetooth.available()) {
    // 以下のソースだと1文字ずつシリアルに出力されてしまう
    //char value = (char)bluetooth.read();
    //Serial.println(value);

    // 受信した文字列(1文字ずつ)を変数にためてから一気に出力させる
    buffer = bluetooth.read();
    value = value + buffer;

    // 終端文字を受け取ったら出力して初期化
    if(buffer == term_char) {
      Serial.print(value);
      value = “”; // 初期化
    }
  }
}

■(オマケ)BLE Nano側のソース
#include “mbed.h”

Serial pc(USBTX, USBRX);

int main() {
    int counter = 1;

    while(1) {
        pc.printf(“counter=%d ”, counter);
        counter++;

        if(counter > 50)
            counter = 1;

        wait(1.0);
    }
}

MacでBLE Nanoをシリアルモニターに出力するにはArduino IDEが便利

Mac OSはTeraTermみたいなのはないので、BLE Nanoをmbedで開発したプログラムをシリアルモニターに出力する場合は、ターミナルでコマンドを打ち込んで出力するか、Macの有料アプリを利用する必要がある。ターミナルを使ってもよいが、コマンド打ったりしないといけないので少し面倒。
Arduino IDEのシリアルモニターでも出力できるので、もしArduinoも開発している人だった場合は、これを使うとよい。ただし、Arduino IDEのBoard Managerで、あらかじめBLE Nanoを利用できるようにしておく必要がある。

■Arduino IDEでBLE Nanoライブラリーを追加する
以下の「Using Arduino」を参考にして追加する。
http://redbearlab.com/getting-started-nrf51822

■シリアルモニターの利用イメージ
BLE NanoのBoardを選択してシリアルモニター画面を表示させれば、mbedで開発したものを出力することができる。

RedBearLab BLE NanoをiBeacon化

RedBearLab BLE NanoキットでiBeacon化する方法を紹介します。


■開発環境
【(iBeacon化)IoTデバイス】
・RedBearLab BLE Nanoキット(nRF51822) 技適ありで自由に開発できるモジュールは(おそらく)最安なので、これをiBeacon化します。
https://www.switch-science.com/catalog/2401/
・開発環境 – mbed

【PC】
・MacBookAir OS X EI Capitan Version 10.11.6
・Xcode Version 7.3.1

【モバイル】
・iPhone6 iOS 9.3


■iBeacon化までの全体像と手順
ファームウェア更新する → mbedでiBeaconサンプルファイル作る → BLE Nano接続してMBEDドライブにポイする → iPhoneにiBeaconアプリ入れる → BLE Nanoを発見する

以下、手順になります。

1.ファームウェアを更新する
BLE Nanoのリセットボタンを押しながら、PCのUSBポートに接続する。すると「BOOTLOADER」ドライブがマウントされる。
以下URLから「Firmware」ー「blenano_mk20dx_interface_20140912.bin」っぽい名前のファイルをDLしてから、ターミナルで
「dd if=DLしたファームウェアのパスとファイル名 of=/Volumes/BOOTLOADER/firmware.bin conv=notrunc」
(例) dd if=/Users/256hax/Downloads/blenano_mk20dx_interface_20140912.bin of=/Volumes/BOOTLOADER/firmware.bin conv=notrunc
と入力する。
https://developer.mbed.org/platforms/RedBearLab-BLE-Nano/
するとBLE Nanoが自動的に ファームウェアを更新 → ドライブをアンマウント → ドライブをマウント してくれる。

【RedBearLab BLE Nano – mbed(上記URL)で掲載されている手順】

Interface Firmware

To upgrade the interface firmware (inside the MK20 chip):

1. Press and hold the reset button on the MK20 USB board

2. Connect it to an USB port of your PC

3. “BOOTLOADER” drive will be shown

4. Release the button and the LED will keep flashing (slowly)

5.1 For Windows, just drag the new firmware to the MSD drive

5.2 For Linux or Mac OSX, use the follow command from the Terminal:

Quote:

dd if=src_firmware.bin of=/Volumes/BOOTLOADER/dst_firmware.bin conv=notrunc

6. The LED should keep flashing (very fast this time)

7. Remove the board from the USB port

8. Reconnect it to the USB port
Firmware:

※正常に書き込まれると自動的にマウント解除+再接続してMBEDドライブが表示される。
※ファームウェアのファイルをBOOTLOADERドライブにドラッグ&ドロップする、というコメントをブログで見かけたが、自分の場合はそれだとダメだった。
※何か間違えて書き込んでしまってBLE Nanoが動かなくなってしまった場合でも、上記の方法で元に戻すことができる。例えば、BLE NanoをUSBポートに差し込んでも認識されなくなった・・・みたいな状況になった場合は上記を試すと直ることがある。

2.mbedでiBeaconサンプルファイル作る
【mbedの利用方法は以下を参照】
http://redbearlab.com/getting-started-nrf51822

上記の知識がある前提で以下を実行する。

Importボタンを押して「ibeacon」で検索し、Team Bluetooth Low EnergyがAuthorになっている「BLE_iBeacon」をインポートする。
※よく「Libraries」のタブ開いて検索しちゃうことがあるため、「Programs」タブを開いているか確認しておくこと

次に、インポートしたプログラムのmain.cppを開いて、初期値になっているUUIDをコメントアウントしてユニークなUUIDを記述する。以下のUUIDは一例です。
————————————————————————————————————–
     /* Comment out – Default UUID
    const uint8_t uuid[] = {0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4,
                            0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61};
    */
    /* Add – RedBearLab UUID */
    const uint8_t uuid[] = {0xE2, 0xC5, 0x6D, 0xB5, 0xDF, 0xFB, 0x48, 0xD2, 0xB0, 0x60, 0xD0, 0xF5, 0xA7, 0x10, 0x96, 0xE0};
    uint16_t majorNumber = 1122;
    uint16_t minorNumber = 3344;
————————————————————————————————————–

コンパイルしてhexファイルをDLする。

3.BLE Nano接続してMBEDドライブにポイする
BLE NanoをPCのUSBポートに接続して、上記でDLしたhexファイルをマウントされた「MBED」ドライブにドラッグ&ドロップする。
※この時にhexファイルがMBEDドライブに書き込まれるのは見えないが、 アンマウント → マウント が自動的に実施されれば正常に書き込みが出来ている。

4.iPhoneにiBeaconアプリ入れる
Radius NetworsのLocate BeaconをiPhoneにインストールする。
https://itunes.apple.com/jp/app/locate-beacon/id738709014?mt=8

もしXcodeでiBeaconのiOS向けサンプルプログラムをいじりたい場合は、以下のIoT Design Shopの「Download the
BeaconDemo Project Here.」をDLしてから、UUIDをBLE Nanoの値に書き換えればOK。
http://developer.iotdesignshop.com/tutorials/integrating-ibeacon-with-your-apps-the-beacondemo-project/

【BLE NanoのUUID】
以下パターン1か2のどちらかを状況に合わせて記述する。※以下は例なのでUUIDはご自信が生成されたユニークなUUIDを使ってください。
パターン1:E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
パターン2:0xE2, 0xC5, 0x6D, 0xB5, 0xDF, 0xFB, 0x48, 0xD2, 0xB0, 0x60, 0xD0, 0xF5, 0xA7, 0x10, 0x96, 0xE0

(BLE NanoのGetting StartedにもUUIDは載っています)
http://redbearlab.com/getting-started-nrf51822

5.BLE Nanoを発見する
iPhoneからLocate Beaconアプリを立ち上げて、右下のレーダーマークになっているメニューをタップして、「To configure other UUIDs, click the “Gear” icon above.」をタップして以下を設定する。
——————————————————————–
Beacon Name:BLE Nano
UUID: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
Major:1122
Minor:3344
Power:デフォルト(-59)
——————————————————————–

次に、前の画面に戻って左下の レーダーマークのメニューを再度タップして、登録したBLE Nanoデバイスが表示されれば成功。表示されているデバイスをタップすると、DistanceとかCalibrateが実行できる。

■備考
・開発方法は、mbed, Nordiac, Arduinoの3種類あるが、開発はmbedがおすすめ。Nordiacは環境整えるが難しすぎる。Arduinoはまだ一般提供レベルではないっぽい。

・MacのOSが古いとBLE Nanoを差してもMBEDがマウントされないことがあるらしい。もし最新なのにマウントされない場合は、ファームウェアの更新をしてみてください。

・ iBeacon化のサンプルが少なく、この記事で紹介したものぐらいしか、2016年8月現在では、ちゃんとしたものが発見できなかった(おそらく時間が経ってソースやらデバイスやらが追いついていないっぽい)。

・Xcodeで開発する場合は、Apple公式の「AirLocate」が定番になっているようですが、iOS7以降にソースが対応しておらず(ユーザー許可関連)、
iPhoneで発見できなかった。なにやら、Blutoothを利用する時にユーザー許可が必要うんぬんとかで、ソースを修正しないと動かないようです
(修正してみたがうまく動かせず)。
https://developer.apple.com/library/ios/samplecode/AirLocate/Introduction/Intro.html

・Xcode開発時に、アプリをシミュレータで動かして動作確認すると思いますが、Bluetoothは動かせないとのことで、XcodeからiPhone実機にアプリをインストールして動作確認する必要があります。

・UUIDは全世界でユニークでることが国際規格で決まっているので、重複がおきないように気をつけてください。
アプリックスさんのサイトにわかりやすい説明が載っています → http://www.aplix.co.jp/beacon/refinfo/refinfo0105.html

・UUID生成サイト → https://www.uuidgenerator.net/