//
表示中
モノづくり, Computer - コンピューター, Electronics - 電子工作

Bluetooth LEモジュール搭載Arduino 〜 Adafruit Bluefruit LE Micro


Arduino Pro Mini (8Mhz/3.3V)とKonashi(またはKoshian)を使って、あるいはKonashiだけで作りたいものがあって、いろいろと実験をしていたんですが、Bluetoothモジュールに求めている機能がそんなに多くないことと、APIの好みが合わないことから、ちょっと行き詰ったような気分になっていましたが、ちょうどいいのがありました。これなら1つで欲しい機能が手に入ります。

Adafruit社のBluefruit LE MicroというArduino互換ボード。新製品なんでしょうか。以前、Bluetooth LEモジュールを探している時には見つかりませんでした。

さすがにArduino Pro Miniほど小さくありませんが、プロトタイプを作る程度なら組み込みできる小ささだと思います。

作りたいと思うものは、Wi-FiやBluetoothの通信ができて、iOSやAndroidなどと接続しやすくて、低消費電力で小型なものを使う場合が多くて、この製品やKonashi、Arduino Pro Mini、Edisonなどが使いやすいと思います。ウェアラブルデバイスの機能要件とほぼ同じになるでしょうか。電子回路を作る専門の方であれば小さな基板を設計してチップを載せて組み込みデバイスを作るのでしょうが、僕のように電子回路は素人のプログラマーにとってはこんな製品の存在はありがたいです。

2016-04-06 16.02.03

早速ピンヘッダを半田付けして動作を確認しました。

Arduino IDEからスケッチをロードする場合は、Adafruit社のボードをArduino IDEにインストールする必要があります。(説明のページは上記製品リンクから辿れます)

CoreBluetoothフレームワークを使ってBluetoothモジュールに接続してモジュールが提供するサービスの一覧を表示するiOSアプリを作って動作を確認。

2016-04-06 16.02.11

 

まだ簡単なものですがCoreBluetoothを使ってBluetoothデバイスを探す・接続する・サービス(のUUID)の一覧を取得するクラスを作りました。KonashiのiOS SDKはCoreBluetoothのラッパーのような構成のフレームワークですが、直接CoreBluetoothを使った方がBluetoothへの理解が深まると思いますので、今後はなるべく自力でBluetoothを利用するフレームワークを作っていこうと思います。まだ再利用できるレベルのものではないのでgithubに載せずにキモの部分のソースを載せておきます。似たようなことをやろうとしている方にとって「何もないよりマシ」という程度の参考にはなるかもしません。

BLManager.h

#ifndef BLManager_h
#define BLManager_h
@import CoreBluetooth;
@protocol BLManagerDelegate;

@interface BLManager : NSObject <CBCentralManagerDelegate, CBPeripheralDelegate>

@property (nonatomic, strong) CBCentralManager *_centralManager;
@property (nonatomic, strong) NSMutableArray *_peripherals;
@property (nonatomic, strong) NSString *_peripheralName;
@property (nonatomic, strong) id<BLManagerDelegate> _delegate;

- (id)initWithDelegate:(id)delegate;
- (void)scanPeripherals;
- (BOOL)isReady;
- (BOOL)isScanningPeripherals;
- (void)stopScanning;
- (void)connectPeripheral:(CBPeripheral *)peripheral;
- (void)disconnectPeripheral:(CBPeripheral *)peripheral;
- (NSArray *)peripherals;
@end

@protocol BLManagerDelegate
- (void)managerDidDiscoverPeripheral:(CBPeripheral *)peripheral;
- (void)managerDidConnectPeripheral:(CBPeripheral *)peripheral;
- (void)managerDidDiscoverServices:(NSArray *)services 
    forPeripheral:(CBPeripheral *)peripheral;
- (void)managerDidDiscoverCharacteristics:(NSArray *)characteristics 
    forService:(CBService *)service;
@end

#endif /* BLManager_h */

BLManager.m

#import "BLManager.h"

@implementation BLManager

- (id)initWithDelegate:(id)delegate {
    self = [super init];
    CBCentralManager *mgr = [[CBCentralManager alloc] initWithDelegate:self
        queue:dispatch_get_main_queue()];
    self._centralManager = mgr;
    self._peripherals = [[NSMutableArray alloc] init];
    self._delegate = delegate;
    return self;
}

- (void)scanPeripherals
{
    self._peripheralName = nil;
    [self._centralManager scanForPeripheralsWithServices:nil 
        options:{CBCentralManagerScanOptionAllowDuplicatesKey:(NO)}];
}

- (void)scanPeripheralWithName:(NSString *)peripheralName {
    self._peripheralName = peripheralName;
    [self._centralManager scanForPeripheralsWithServices:nil 
        options:{CBCentralManagerScanOptionAllowDuplicatesKey:(NO)}];
}

- (BOOL)isReady
{
    return ([self._centralManager state] == CBCentralManagerStatePoweredOn);
}

- (BOOL)isScanningPeripherals {
    return [self._centralManager isScanning];
}

- (void)stopScanning {
    [self._centralManager stopScan];
}

- (void)connectPeripheral:(CBPeripheral *)peripheral {
    [self._centralManager connectPeripheral:peripheral 
        options:nil];
}

- (void)disconnectPeripheral:(CBPeripheral *)peripheral {
    [self._centralManager cancelPeripheralConnection:peripheral];
}

- (NSArray *)peripherals {
    return self._peripherals;
}

#pragma mark - CBCentralManagerDelegate methods

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    if([self isReady]) {
        [self scanPeripherals];
    }
}

- (void)centralManager:(CBCentralManager *)central 
    didDiscoverPeripheral:(CBPeripheral *)peripheral 
    advertisementData:(NSDictionary<NSString *,id> *)advertisementData 
    RSSI:(NSNumber *)RSSI
{
    NSString *localName = 
        [advertisementData objectForKey:CBAdvertisementDataLocalNameKey];
    if([localName length] > 0) {
        [self._peripherals addObject:peripheral];
        if([localName isEqualToString:self._peripheralName]) {
            [self stopScanning];
        }
        if(self._delegate) {
            [self._delegate managerDidDiscoverPeripheral:peripheral];
        }
    }
}

- (void)centralManager:(CBCentralManager *)central 
    didConnectPeripheral:(CBPeripheral *)peripheral
{
    if(self._delegate) {
        [self._delegate managerDidConnectPeripheral:peripheral];
    }
    peripheral.delegate = self;
    [peripheral discoverServices:nil];
}

#pragma mark - CBPeripheralDelegate methods
- (void)peripheral:(CBPeripheral *)peripheral 
    didDiscoverServices:(NSError *)error
{
    if(self._delegate) {
        [self._delegate 
            managerDidDiscoverServices:peripheral.services 
            forPeripheral:peripheral];
    }
    for (CBService *service in peripheral.services) {
        [peripheral discoverCharacteristics:nil 
            forService:service];
    }
}
- (void)peripheral:(CBPeripheral *)peripheral 
    didDiscoverCharacteristicsForService:(CBService *)service 
    error:(NSError *)error
{
    if(self._delegate) {
        [self._delegate 
            managerDidDiscoverCharacteristics:service.characteristics 
            forService:service];
    }
    for(CBCharacteristic *aChar in service.characteristics) {
        //NSLog(@"Characteristic: %@", aChar);
    }
}

@end

kazz12211 について

Working as a OO programmer and enjoying music, bicycle and photography.

ディスカッション

コメントはまだありません。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

手仕事日記

評価

ブログ統計

  • 515,370 ヒット

カテゴリー

アーカイブ

カレンダー

2016年4月
« 3月   5月 »
 12
3456789
10111213141516
17181920212223
24252627282930
%d人のブロガーが「いいね」をつけました。