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で開発したものを出力することができる。