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

Arduino Pro Mini+BME280+Koshianの接続


Koshianにピンヘッダとジャンパーピンをハンダ付けして端子の引き出しができたので早速使ってみました。僕には難しいハンダ付けでしたが、何度かやっているうちに慣れるような気がします。

Arduino Pro MiniとKoshianをシリアル接続し、Arduino Pro MiniにI2C接続したBME280温湿度・気圧センサーの値を読み取って、Koshian経由でiOS上のアプリに表示するという簡単な操作です。この方法ですと、すでにArduinoで(あるいは他のマイコンで)作ったプロトタイプとBluetooth対応機器を接続したいといった場合に便利かもしれません。

I2C接続でセンサーを扱うことはKoshian単体でもやれますので、Arduinoを接続する必要がないような気もすると思いますが、扱うセンサーを増やした時にセンサー群とマイコンを一つのコンポーネントに見立てて、iOS側からは、単純にデータ要求とデータの受信だけでプログラミングするやり方も悪くないかなと思います。小さく組み込みたい時はKoshian単体でやる方が有利ですし、Koshianに載っているBroadcomのBluetoothチップに直接プログラムするのも良いかもしれません。Broadcom社の開発環境はアカウント登録をしないとダウンロードできず、Googleなどのフリーメールのアカウントではそのアカウント登録ができません。(Google Appsで自分のドメインで運用している場合もダメでしたのでは、僕はそのアカウント登録ができていません)

Arduino Pro Miniの10番ピンと11番ピンを使ってSoftwareSerial(10番ピンがRX、11番ピンがTX)でKoshianと通信します。

Arduino Pro MiniのA4をBME280のSDAに、A5をBME280のSCLに接続。どちらも10Kオームの抵抗でプルアップしています。

BME280のCSはVDDIOを接続。SA0はGNDに接続。GNDはGNDへ。

KoshianとBME280にはArduinoのVCCから電源を供給。

2016-04-19 13.23.50

Arduino側のスケッチ

#include "BME280.h"
#include <SoftwareSerial.h>
#define SW_SERIAL_RX 10 // Arduino Pro MiniのA4からBME280のSDAへ
#define SW_SERIAL_TX 11 // Arduino Pro MiniのA5からBME280のSCLへ
SoftwareSerial swSerial(SW_SERIAL_RX, SW_SERIAL_TX);
BME280 sensor;

void setup() {
    Serial.begin(9600);
    Serial.println("Hardware Serial initialized.");
    swSerial.begin(9600);
    Serial.println("Software Serial initialized.");
    if(!sensor.begin(
        BME280_ADDRESS,
        sensor.BME280_STANDBY_1000,
        sensor.BME280_FILTER_OFF,
        sensor.BME280_SPI3_DISABLE,
        sensor.BME280_TEMP_OVERSAMPLING_1,
        sensor.BME280_PRESS_OVERSAMPLING_1,
        sensor.BME280_MODE_NORMAL,
        sensor.BME280_HUMID_OVERSAMPLING_1)) {
        Serial.println("Unable to initialize BME280 sensor"); // デバッグ出力
        while(true);
    }
    Serial.println("BME280 initialized."); // デバッグ出力
}

// 文字列の後ろの空白を取り除く
void trimStr(char *str) {
    int i = 0;
    for(i = strlen(str) - 1; i >= 0; i--) {
        if(*(str + i) == ' ')
            *(str + i) = '\0';
    }
}

// BME280から温湿度・気圧データの読み取りとKoshianへのデータ送出
void doSensing() {
    char buff[20];
    char tmps[6], hums[4], prss[8];
    int i;
    sensor.read();
    dtostrf(sensor.data.temperature, -5, 1, tmps);
    dtostrf(sensor.data.humidity, -3, 0, hums);
    dtostrf(sensor.data.pressure, -7, 2, prss);
    trimStr(tmps);
    trimStr(hums);
    trimStr(prss);
    sprintf(buff, "%s,%s,%s!", tmps, hums, prss);
    swSerial.print(buff);
    swSerial.flush();
    Serial.print("Sensed "); Serial.println(buff); // デバッグ出力
}

// Koshianからコマンドを読み込み
bool readCommand(char *cmd) {
    String recvStr;
    if(swSerial.available()) {
        recvStr = swSerial.readStringUntil('\n');
        strcpy(cmd, recvStr.c_str());
        return true;
    }
    return false;
}

void loop() {
    char cmd[20];
    if(readCommand(cmd)) {
        Serial.print("Command received: "); Serial.println(cmd); // デバッグ出力
        doSensing();
    }
}

BME280用のライブラリはスイッチサイエンスさんのホームページからダウンロードしたものを、自分が見やすいように変更して使っています。機能的な変更はありません。

iOSアプリのViewControllerのソース

#import "ViewController.h"

#import "Konashi.h"

@interface ViewController ()

@property (nonatomic, strong) NSMutableString *_receiveBuffer;

- (void)connected;
- (void)disconnected;
- (void)receiveUartData:(NSData *)data;
- (void)gotResponse:(NSString *)response;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [[Konashi shared] setConnectedHandler:^{
        NSLog(@"CONNECTED");
        [self connected];
    }];

    [[Konashi shared] setDisconnectedHandler:^{
        NSLog(@"DISCONNECTED");
        [self disconnected];
    }];

    [[Konashi shared] setReadyHandler:^{
        NSLog(@"READY");

        [Konashi uartMode:KonashiUartModeEnable
            baudrate:KonashiUartBaudrateRate9K6];
    }];

    [[Konashi shared] setUartRxCompleteHandler:^(NSData *data) {
        [self receiveUartData:data];
    }];

}

#pragma mark - Target & Action
// UIButtonからのアクション
- (IBAction)readSensorData:(id)sender {
    if(!self._receiveBuffer) {
        self._receiveBuffer = [[NSMutableString alloc] init];
    } else {
        [self._receiveBuffer setString:@""];
    }
    [Konashi uartWriteString:@"read\n"];
}
// UIButtonからのアクション
- (IBAction)find:(id)sender {
    [Konashi find];
}

#pragma mark - Anonysmous methods

- (void)connected {
    self._peripheralView.text = [Konashi peripheralName]; // UILabel
    self._resultView.text = @""; // UILabel
    self._readButton.enabled = YES; // UIButton
}

- (void)disconnected {
    self._peripheralView.text = @""; // UILabel
    self._resultView.text = @"Not connected"; // UILabel
    self._readButton.enabled = NO; // UIButton
}
// 受信データの処理
- (void)receiveUartData:(NSData *)data {
    NSString *str = [[NSString alloc] initWithData:data
        encoding:NSASCIIStringEncoding];
    NSRange r = [str rangeOfString:@"!"];
    if(r.length != 1) {
        [self._receiveBuffer appendString:str];
    } else {
        [self._receiveBuffer appendString:[str substringToIndex:r.location]];
    }
    NSLog(@"%@", self._receiveBuffer);
    [self gotResponse:self._receiveBuffer];
}
// 受信データの表示
- (void)gotResponse:(NSString *)response {
    NSArray *values = [response componentsSeparatedByString:@","];
    if([values count] == 3) {
        NSString *result = [NSString stringWithFormat:@"Temp:%@, Humid:%@, Press:%@",
            [values objectAtIndex:0],
            [values objectAtIndex:1],
            [values objectAtIndex:2]];
       self._resultView.text = result;
    }
}

@end

プログラムを実行している様子。(なんか数値がおかしいような気がしますが)

今回はSoftware SerialでArduinoとKoshianが通信していますが、1秒を競うような計測ではないので、タイマーで計測した値をどこかに記憶しておいて、Hardware Serialの割り込みを使って記憶しておいた計測値を取り出してiOS側に送信するようなプログラムの方が良いかもしれません。

2016-04-19 20.43.21

Arduino IDEのシリアルモニターのデバッグ用出力。

bme280_sensing

iPhone 5SからiPhone 6Sに乗り換えたので普段は使わない5Sですが、こういうテストで写真を撮るときにあると便利です。

kazz12211 について

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

ディスカッション

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

評価

ブログ統計

  • 583,199 ヒット

カテゴリー

アーカイブ

カレンダー

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