スポンサーリンク

この記事の開発環境

  • Android Things:1.02
  • Android Studio:3.1.3
  • Kotlin:1.2.41
  • buildToolsVersion:27.0.3
  • compileSdkVersion:27
  • minSdkVersionが:26
  • targetSdkVersion:27

概要

UARTとBLE(Bluetooth)をそれぞれ使用して外部の機器を制御させたかったのですが、UART0とBLEを普通に起動してもUART/BLEどちらも上手く動きません。

LogでBluetoothAdapter.isEnableの状態をデバッグコンソールに吐き出した所falseになっており、BLEが起動できていませんでした。

BluetoothAdapter.enable()を実行しても状態はfalseのままです。

Stack Overflowなどで色々調査したところ、Android Things公式のRaspberry Pi3機能マトリクスのページにたどり着きました。

Raspberry Pi3にAndroid Thingsを搭載した場合、周辺機能の有効/無効により他の機能の使用に影響する場合があるようです。

Raspberry Pi3 機能マトリクス - Android Things 公式サイト -

UART0/Bluetooth同時使用時の障害

UART0、BLEを同時に使おうとした場合、それぞれに以下のような障害が発生します。

  • UARTの出力が460800bps(波形の1bitあたりの時間から推測)に強制変更される
  • BLEが無効(enableを実行しても無効のまま)

なお、1bitの時間を測定した波形は以下です。

 

Raspberri Pi3はのUART機能は内部的にUART0とMINIUARTの2つのUARTを持っており(ピンは同じBCM14/BCM15)、BLEと併用する場合はUART0でなくMINIUARTを使用する必要があります。

UART0とMINIUARTでは性能が異なるそうですが、115200bpsで特に問題無く通信できました。

波形を測定した所わずかにクロック精度が異なるようですが、許容範囲内です。

 

UART設定の注意点

一般的にRaspberry Pi3でUARTを使う場合には注意事項があります。

電圧は3.3V

Raspberry Pi3のUARTは電圧が3.3Vです。

5V系のデバイスと通信を行う場合は電圧変換を行いましょう。

デバッグコンソール設定の削除

デフォルトではUART0がデバッグコンソール用に割り当てられています。

外部機器との通信用にUARTを使用する場合はSDカードに書き込まれたOS上のCMDLINE.TXTのコードを変更する必要があります。

PCにSDカードを挿してCMDLINE.TXTをテキストエディタで開き、console=serial0,115200の部分を削除します。

dwc_otg.lpm_enable=0 console = serial0,115200 ro rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait earlyprintk init=/init androidboot.hardware=rpi3 androidboot.selinux=permissive loglevel=3

 

dwc_otg.lpm_enable=0 ro rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait earlyprintk init=/init androidboot.hardware=rpi3 androidboot.selinux=permissive loglevel=3

UART0とMINIUARTの出力波形

オシロスコープで測定しました。

通信速度[bps]115200
データサイズ[bit]8
パリティなし
ストップビット数1

UART0のTxD波形

9バイト送信時、約972us。

1bitの時間。通信速度の誤差は測定誤差でしょう。

約8.68us/bit。(115207.37bps/bit)

MINIUARTのTxD波形

約983us。

UART0より約11us長くなっていますが、通信には影響ないレベルの誤差です。

ちなみに、1bit時間を測定しましたが、2us/divのレンジではUART0と変わらなかった為画像は省略します。

 

ソースコード

UARTとBLE共存時の動作を確認したソースコードを貼ります。

ロジックの言語はKotlinです。

AndroidManifest.xml

UARTを使用する為にcom.google.android.things.permission.USE_PERIPHERAL_IO、Bluetoothを使用する為にandroid.permission.BLUETOOTH、android.permission.BLUETOOTH_ADMIN、android.permission.ACCESS_FINE_LOCATIONのパーミッションが必要です。

<?xml version="1.0" encoding="utf-8"?>https://gourmet-technology-crypto.jp/wp-admin/post.php?post=369&action=edit#
<manifest package="jp.cryptocat.shareuartandble"
          xmlns:android="http://schemas.android.com/apk/res/android">

	<uses-permission android:name="com.google.android.things.permission.USE_PERIPHERAL_IO" />
	<uses-permission android:name="android.permission.BLUETOOTH"/>
	<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

	<application>
		<uses-library android:name="com.google.android.things"/>

		<activity android:name=".MainActivity">
			<intent-filter>
				<action android:name="android.intent.action.MAIN"/>

				<category android:name="android.intent.category.LAUNCHER"/>
			</intent-filter>
			<intent-filter>
				<action android:name="android.intent.action.MAIN"/>

				<category android:name="android.intent.category.DEFAULT"/>
			</intent-filter>
		</activity>
	</application>

</manifest>

MainActivity.kt

UARTとBLEをMainActivityにまとめて書いています。

 

 

 

 

スポンサーリンク

Twitterでフォローしよう

おすすめの記事