Rainbow HAT
AndroidThingsのサンプルアプリでも使われている、Rainbow HATが届いたので、動作チェックも兼ねてプログラムを書いてみた。
#環境
Android Studio 2.3.3
Raspberry Pi 3 (image androidthings_rpi3_devpreview_1.zip)
Rainbow HAT
#プロジェクトの作成
こちらに関しては、以前投稿したAndroid Things 用の空のプロジェクトの作り方を参照のこと
#ライブラリーの追加
build.grade(app)に追記下記を追記します。
compile 'com.google.android.things.contrib:driver-rainbowhat:0.1'
import文を追加する
import com.google.android.things.contrib.driver.rainbowhat.RainbowHat;
#搭載されてい赤、緑、青の単色LEDをコントロールする例
import文を追加する
import com.google.android.things.pio.Gpio;
import java.io.IOException;
グローバル変数の定義
private Gpio led1 = null;
private Gpio led2 = null;
private Gpio led3 = null;
@Override
protected void onResume() {
Log.d(TAG,"onResume()");
super.onResume();
try {
led1 = RainbowHat.openLed(RainbowHat.LED_RED);
led1.setValue(true);
led2 = RainbowHat.openLed(RainbowHat.LED_GREEN);
led2.setValue(true);
led3 = RainbowHat.openLed(RainbowHat.LED_BLUE);
led3.setValue(true);
} catch (IOException e) {
Log.d(TAG,e.toString());
}
}
@Override
protected void onPause() {
Log.d(TAG,"onPause()");
super.onPause();
try {
if(led1 != null) {
led1.setValue(false);
led1.close();
}
if(led2 != null) {
led2.setValue(false);
led2.close();
}
if(led3 != null) {
led3.setValue(false);
led3.close();
}
} catch (IOException e) {
Log.d(TAG,e.toString());
}
}
#ブザーをコントールする例
import文を追加する
import com.google.android.things.contrib.driver.pwmspeaker.Speaker;
import java.io.IOException;
グローバル変数の定義
private Speaker buzzer = null;
@Override
protected void onResume() {
Log.d(TAG,"onResume()");
super.onResume();
try {
buzzer = RainbowHat.openPiezo();
buzzer.play(261);
} catch (IOException e) {
Log.d(TAG,e.toString());
} } catch (IOException e) {
Log.d(TAG,e.toString());
}
}
@Override
protected void onPause() {
Log.d(TAG,"onPause()");
super.onPause();
try {
if(buzzer != null) {
buzzer.stop();
buzzer.close();
}
} catch (IOException e) {
Log.d(TAG,e.toString());
}
}
#4桁のディスプレイをコントロールする例
import文を追加する
import com.google.android.things.contrib.driver.ht16k33.AlphanumericDisplay;
import com.google.android.things.contrib.driver.ht16k33.Ht16k33;
import java.io.IOException;
グローバル変数の定義
private AlphanumericDisplay segment = null;
@Override
protected void onResume() {
Log.d(TAG,"onResume()");
super.onResume();
try {
segment = RainbowHat.openDisplay();
segment.setBrightness(Ht16k33.HT16K33_BRIGHTNESS_MAX);
segment.setEnabled(true);
segment.display("1234");
} catch (IOException e) {
Log.d(TAG,e.toString());
}
}
@Override
protected void onPause() {
Log.d(TAG,"onPause()");
super.onPause();
try {
if(segment != null)
{
segment.close();
}
} catch (IOException e) {
Log.d(TAG,e.toString());
}
}
#7つのフルカラーLEDをコントロールする例
import文を追加する
import android.graphics.Color;
import com.google.android.things.contrib.driver.apa102.Apa102;
import java.io.IOException;
グローバル変数の定義
private Apa102 ledstrip = null;
@Override
protected void onResume() {
Log.d(TAG,"onResume()");
super.onResume();
try {
int[] rainbow = new int[7];
ledstrip = RainbowHat.openLedStrip();
ledstrip.setBrightness(1);
for (int i = 0; i < rainbow.length; i++) {
rainbow[i] = Color.HSVToColor(255, new float[]{i * 360.f / rainbow.length, 1.0f, 1.0f});
}
ledstrip.write(rainbow);
} catch (IOException e) {
Log.d(TAG,e.toString());
}
}
@Override
protected void onPause() {
Log.d(TAG,"onPause()");
super.onPause();
try {
if(ledstrip != null)
{
ledstrip.close();
}
} catch (IOException e) {
Log.d(TAG,e.toString());
}
}
#タッチボタンのイベントを拾う
import文を追加する
import com.google.android.things.contrib.driver.button.Button;
import java.io.IOException;
グローバル変数の定義
private Button buttonA = null;
private Button buttonB = null;
private Button buttonC = null;
@Override
protected void onResume() {
Log.d(TAG,"onResume()");
super.onResume();
try {
buttonA = RainbowHat.openButton(RainbowHat.BUTTON_A);
buttonA.setOnButtonEventListener(onEvent);
buttonB = RainbowHat.openButton(RainbowHat.BUTTON_B);
buttonB.setOnButtonEventListener(onEvent);
buttonC = RainbowHat.openButton(RainbowHat.BUTTON_C);
buttonC.setOnButtonEventListener(onEvent);
} catch (IOException e) {
Log.d(TAG,e.toString());
}
}
@Override
protected void onPause() {
Log.d(TAG,"onPause()");
super.onPause();
try {
if(buttonA != null) {
buttonA.close();
}
if(buttonB != null) {
buttonB.close();
}
if(buttonC != null) {
buttonC.close();
}
} catch (IOException e) {
Log.d(TAG,e.toString());
}
}
Button.OnButtonEventListener onEvent = new Button.OnButtonEventListener() {
@Override
public void onButtonEvent(Button button, boolean pressed) {
if(button == buttonA)
{
Log.d(TAG,"Button A");
}
if(button == buttonB)
{
Log.d(TAG,"Button B");
}
if(button == buttonC)
{
Log.d(TAG,"Button C");
}
}
};
#温度、気圧の値をイベントで取得する
import文を追加する
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import com.google.android.things.contrib.driver.bmx280.Bmx280SensorDriver;
import java.io.IOException;
グローバル変数の定義
private Bmx280SensorDriver mSensorDriver = null;
private SensorManager sensorManager = null;
@Override protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG,"onCreate()");
super.onCreate(savedInstanceState);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
try {
mSensorDriver = new Bmx280SensorDriver(RainbowHat.BUS_SENSOR);
mSensorDriver.registerTemperatureSensor();
mSensorDriver.registerPressureSensor();
} catch (IOException e) {
Log.d(TAG,e.toString());
}
}
@Override
protected void onResume() {
Log.d(TAG,"onResume()");
super.onResume();
List<Sensor> lists = sensorManager.getDynamicSensorList(Sensor.TYPE_ALL);
for(int i = 0 ; i< lists.size() ; i++)
{
Log.d(TAG,"" + lists.get(i).toString());
sensorManager.registerListener(onEvent2, lists.get(i), SensorManager.SENSOR_DELAY_NORMAL);
}
}
@Override
protected void onPause() {
Log.d(TAG,"onPause()");
super.onPause();
try {
if(mSensorDriver != null) {
mSensorDriver.unregisterTemperatureSensor();
mSensorDriver.unregisterPressureSensor();
mSensorDriver.close();
}
sensorManager.unregisterListener(onEvent2);
} catch (IOException e) {
Log.d(TAG,e.toString());
}
}
SensorEventListener onEvent2 = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if(sensorEvent.sensor.getType() == Sensor.TYPE_AMBIENT_TEMPERATURE) {
Log.d(TAG, "TEMPERATURE=" + sensorEvent.values[0]);
}
else if(sensorEvent.sensor.getType() == Sensor.TYPE_PRESSURE)
{
Log.d(TAG,"PRESSURE="+ sensorEvent.values[0]);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
};
#動かしてみて
温度を取得してみるとわかるのですが、室温となんか違うなあと思うと思います。
Rainbow HATのBMP280が設置されている場所をみると、Raspberry Pi3のCPUの上にあることがわかりますってことは・・・
温度はご参考までにって感じです。
搭載されているセンサーはBMP280なので、本来は、湿度も取れますが、ライブラリに実装されていないようです。
以上、ご参考までに