MOSFETとマイコン (4)  DCモータを動かす その2

Bluetoothの通信もできる

 前回、Micro:bitでDCモータを制御できました。このモータを離れたところからコントロールします。

 Micro:bitにはBluetoothが搭載されています。逆ですね、BluetoothのコントローラにCortex-M0が使われているので、Arduinoとして利用しているのが本当の姿です。コントロールには、スマホを利用します。

Bluetoothのライブラリをインストール

 BluetoothのライブラリをMicro:bitにインストールします。arduino-BLEPeripheralのGitHubに行って、zipファイルをダウンロードします。

 Micro:bitのArduino IDEで、ダウンロードしたライブラリを組み込みます。

 メニューのスケッチ->ライブラリをインクルード-> .ZIP形式のライブラリをインクルード

 開いたエクスプローラで、ダウンロード・フォルダにある「arduino-BLEPeripheral-master.zip」を選択すると、ライブラリやサンプルが組み込まれます。通常のライブラリであれば、これで使えるようになるのですが、Bluetoothを使うには、もう一つ作業をします。

 上記のGitHubのページの中ごろに、arduino-nRF5x core usersという見出しがあります。その見出しの次にSoftDeviceを組み込むようにと説明があります。

  The arduino-nRF5x core REQUIRES a SoftDevice in order to successfully use this library. Please see Flashing a SoftDevice.

 上記の文章にある「Flashing a SoftDevice」のリンクをクリックします。arduino-nRF5のGitHubのページの途中にある「Flashing a SoftDevice」見出しに飛びます。ここに書かれているうち、項目2番目から実行します。

② \ドキュメント\Arduinoの下に、tools\nRF5FlashSoftDevice\tool\をつくる。

③ \ドキュメント\Arduino\tools\nRF5FlashSoftDevice\tool\のなかに、nRF5FlashSoftDevice.jar をダウンロードして保存する。

④ Arduino IDEをいったん終了し、再度起動する。

  メニューのツールから、

⑤ ボードがBBC micro:bitになっていることを確認する。

⑥ SoftDevice:がS110になっていることを確認する。

⑦ 書き込み装置をCMSIS-DAPにする。

⑧ ツールからnRF5 Flash SoftDeviceを選ぶ。Acceptをクリックする。

 スケッチ例のBLEPeripheral->LEDを選び、Micro:bitに書き込みます。

 たとえば、BluetoothをサポートするWindows PCの「設定」->「デバイス」 ->「Bluetoothとその他のデバイス」->「Bluetoothとその他のデバイスを追加する」->「Bluetooth」からLEDを見つけてきます。LEDが見つかると、ライブラリのインストールが正しく行えていることが確認できます。

動作確認

 動作確認は、iOSもしくはAndroidのアプリnRF Connect を使います(二つは少しメニューなどが異なる)。その前に、サンプル・スケッチのLEDに2行追加します。

// set LED pin to output mode
pinMode(LED_PIN, OUTPUT);
pinMode(26, OUTPUT); // add
digitalWrite(26, HIGH); // add

 マイコンへスケッチを書き込むと、5×5マトリクスの左上のLEDが点灯します。左上のアドレスは、ROW=3、COL=26です。26番をHIGHにし、3番をLOWにするとLEDが点灯します。デフォルトがLOWなので、点灯しています。

 SCANNER をタップして開始し、LEDが検知されたら、[CONNECT] ボタンをタップします。

 Unkown Serviceをタップします。

 画面右にある上向きの矢印をタップします。検出エリアが狭いのか、何度も押さないと入力パネルが出ません。

 単位をUINT 8に変更した後、Write valueに'1'を入力し、SENDで送信します。iPadでは単位は出てきません。

 1を送ると左上のLEDは消灯し、0を送ると左上のLEDは点灯します。これで、Bluetoothの通信ができました。スマホがセントラル(マスタ、サーバ)で、Micro:bitがペリフェラル(スレーブ、クライアント)です。Bluetoothではセントラルとペリフェラルはどちらでもなりえますが、ここで用いたarduino-BLEPeripheralライブラリは、ペリフェラル用です。

モータをコントロール

 Micro:bitのLEDをリモートからON/OFFできたので、モータを動かすようにスケッチを修正します。

 下記のスケッチを書き込んでからnRF Connectを起動すると、LEDではなくMotorが見つかります。入力数値は1がCW、2がCCW、1もしくは2を入れて回転している状態で、3が高速回転、4が低速回転です。それ以外の数値を入れるとストップします。

#include <SPI.h>
#include <BLEPeripheral.h>
// LED pin
#define LED_PIN 3
// Motor pin
#define IN1 7
#define IN2 6
#define PWM 5
//custom boards may override default pin definitions with BLEPeripheral(PIN_REQ, PIN_RDY, PIN_RST)
BLEPeripheral blePeripheral = BLEPeripheral();
// create service
BLEService ledService = BLEService("19b10000e8f2537e4f6cd104768a1214");
// create switch characteristic
BLECharCharacteristic switchCharacteristic = BLECharCharacteristic("19b10001e8f2537e4f6cd104768a1214", BLERead | BLEWrite);

void setup() {
Serial.begin(9600);
// set LED pin to output mode
pinMode(LED_PIN, OUTPUT);
pinMode(26, OUTPUT);
digitalWrite(26, HIGH);

pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(PWM,OUTPUT);

digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
digitalWrite(PWM,HIGH);//Stop Mode
// ---GATT start
// set advertised local name and service UUID
blePeripheral.setLocalName("Motor");
blePeripheral.setAdvertisedServiceUuid(ledService.uuid());
// add service and characteristic
blePeripheral.addAttribute(ledService);
blePeripheral.addAttribute(switchCharacteristic); // GATT end
// begin initialization
blePeripheral.begin();
Serial.println(F("BLE Motor Peripheral"));
}

void loop() {
BLECentral central = blePeripheral.central();
if (central) {
// central connected to peripheral
Serial.print(F("Connected to central: "));
Serial.println(central.address());
analogWrite(PWM, 100);

while (central.connected()) {
switch (switchCharacteristic.value()) {
case 1:
Serial.println(F("Motor CCW"));
digitalWrite(LED_PIN, HIGH);
digitalWrite(IN1,LOW);digitalWrite(IN2,HIGH);
break;
case 2:
Serial.println(F("Motor CW"));
digitalWrite(LED_PIN, LOW);
digitalWrite(IN1,HIGH);digitalWrite(IN2,LOW);
break;
case 3:
analogWrite(PWM, 150);
Serial.println(F("Motor fast"));
break;
case 4:
analogWrite(PWM, 50);
Serial.println(F("Motor slow"));
break;
default:
Serial.println(F("Motor STOP"));
digitalWrite(LED_PIN, LOW);
digitalWrite(IN1,LOW);digitalWrite(IN2,LOW);digitalWrite(PWM,HIGH);
}
}
 
// central disconnected
Serial.print(F("Disconnected from central: "));
Serial.println(central.address());
}
}
// Copyright (c) 2016 Intel Corporation. All rights reserved.
// Copyright (c) Sandeep Mistry. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

次のステップ 保留

 スマホから、Bluetoothを使ってMicro:bitにつないだDCモータをコントロールできました。使い勝手がよくないので、専用のプログラムを作ると便利です。

  • スマホで専用のプログラムを作る
  • もう1台Micro:bitを用意し、DCモータ側をセントラル、操作側をペリフェラルにしてコントロールする

 Arduino IDEでは、どちらもプログラミングできません。Micro:bitのGUIによるプログラミングでは可能と思われます。Arduino IDE用BLEセントラルのライブラリが利用できるようになったら、続きをしたいと思います。

※参考URL https://www.arduino.cc/en/Guide/Arduino101

https://developer.apple.com/jp/documentation/CoreBluetoothPG.pdf

MOS FETとマイコン

(1) 複数のLEDを点灯

(2) LEDの輝度を変化

(3) DCモータを動かす その1

(4) DCモータを動かす その2