12/08/2018, 14:37

[Android Things] Phần 2: Tạo Project Android Things - Project điều khiển nháy của đèn led

Phần trước chúng ta đã tìm hiểu tổng quan về IoT và Android Things, cũng như cài đặt môi trường cho AT với bộ kit Raspberry Pi 3. Phần này chúng ta sẽ cùng nhau làm thử một ứng dụng điều khiển nháy của đèn led. Phần cứng. Chuẩn bị linh kiện. Bộ kit Raspberry 3 Board test mạch Dây nối ...

Phần trước chúng ta đã tìm hiểu tổng quan về IoT và Android Things, cũng như cài đặt môi trường cho AT với bộ kit Raspberry Pi 3. Phần này chúng ta sẽ cùng nhau làm thử một ứng dụng điều khiển nháy của đèn led.

Phần cứng.

Chuẩn bị linh kiện.

  1. Bộ kit Raspberry 3 alt
  2. Board test mạch alt
  3. Dây nối cái - cái, đực - đực
  • Dây cái - cái: alt
  • Dây đực - đực: alt
  1. Bóng đèn led: alt
  2. Điện trở: alt

Kết nối phần cứng các linh kiện

Chúng ta sẽ kết nối các linh kiện với nhau theo sơ đồ sau:

alt

Phần mềm:

Như Phần 1 chúng ta đã nói đến việc cài đặt OS Android Things cho bộ kit Raspberry Pi 3

Phần này chúng ta sẽ demo một ứng dụng tích hợp để điểu khiển nháy con đèn led.

I. Tạo một project mới. Để tạo một project android chúng ta làm theo hướng dẫn ở link sau: Click here

Điểm khác biệt giữa 1 Project android và 1 Project Android Things không có quá nhiều, chúng ta chỉ đặt một số các thay đổi và add thêm thư viện từ phía google cung cấp.

Cụ thể là chúng ta sẽ thêm thành phần sau vào file build.gradle để add thư viện được Google cung cấp:

dependencies {
    ...
    provided 'com.google.android.things:androidthings:0.1-devpreview'
}

Trong file manifest của project chúng ta sẽ khai báo thư viện được sử dụng:

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

Để ứng dụng của chúng ta có thể chạy trên nền thiết bị nhúng thì chúng ta cần khai báo trong file manifest tại phần dành cho activity chính của ứng dụng một số thuộc tính để khi khởi chạy ứng dụng trên thiết bị được thành công:

Các thuộc tính:

  • Action: ACTION_MAIN
  • Category: CATEGORY_DEFAULT
  • Category: IOT_LAUNCHER
<application
    android:label="@string/app_name">
    <uses-library android:name="com.google.android.things"/>
    <activity android:name=".HomeActivity">
        <!-- Launch activity as default from Android Studio -->
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>

        <!-- Launch activity automatically on boot -->
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.IOT_LAUNCHER"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
</application>

Như vậy chúng ta đã tạo xong một project mà có thể khởi chạy trên bộ phần cứng AT.

II. Phần code điều khiển led nháy.

a. Khởi tạo class BoardDefault.java: Mục đích của class này là trả về tín hiệu GPIO pin khi mà LED được kết nối. Việc này sẽ biểu hiện khi bạn kết nối 1 con đèn led vào board test và thấy sáng yếu. Ví dụ, ở trên bộ kit Raspberry Pi 3, pin "BCM6" kết nối với LED trên board test sẽ mở khi mà GPIO pin là High và tắt khi là Low.

Ví dụ về class BoardDefault.java:

package com.example.luuhtruc.raspberryappdemo;

import android.os.Build;

import com.google.android.things.pio.PeripheralManagerService;

import java.util.List;

/**
 * Created by luu.htruc on 1/11/17.
 */

public class BoardDefaults {
    private static final String DEVICE_EDISON_ARDUINO = "edison_arduino";
    private static final String DEVICE_EDISON = "edison";
    private static final String DEVICE_RPI3 = "rpi3";
    private static final String DEVICE_NXP =  "imx6ul";
    private static String sBoardVariant = "";

    private static String getBoardVariant () {
        if (!sBoardVariant.isEmpty()) {
            return sBoardVariant;
        }
    sBoardVariant = Build.DEVICE;
        if (sBoardVariant.equals(DEVICE_EDISON)) {
            PeripheralManagerService pioService = new PeripheralManagerService();
            List<String> gpioList = pioService.getGpioList();
            if (gpioList.size() != 0) {
                String pin = gpioList.get(0);
                if (pin.startsWith("IO")) {
                    sBoardVariant = DEVICE_EDISON_ARDUINO;
                }
            }
        }
        return sBoardVariant;
    }

    public static String getGPIOForLED() {
        switch (getBoardVariant()) {
            case DEVICE_EDISON_ARDUINO:
                return "IO13";
            case DEVICE_EDISON:
                return "GP45";
            case DEVICE_RPI3:
                return "BCM6";
            case DEVICE_NXP:
                return "GPIO4_IO20";
            default:
                throw new IllegalStateException("Unknown Build.DEVICE " + Build.DEVICE);
        }
    }
}

b. Tại class MainActivity.java

Tại hàm onCreate() chúng ta sử dụng PeripheralManagerService theo đoạn mẫu dưới đây:

PeripheralManagerService service = new PeripheralManagerService();
  try {
      String pinName = BoardDefaults.getGPIOForLED();
      mLedGpio = service.openGpio(pinName);
      mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
      Log.i(TAG, "onCreate: Start Blink Led GPIO Pin");

      mHandler.post(mBlinkRunnable);
  } catch (IOException e) {
      e.printStackTrace();
  }

Để led nháy theo 1 chu kỳ thời gian chúng ta dùng 1 hàm Runable để làm điều đó:

private Runnable mBlinkRunnable = new Runnable() {
        @Override
        public void run() {
            if (mLedGpio == null) return;
            try {
                mLedGpio.setValue(!mLedGpio.getValue());
                Log.d(TAG, "run: State set to " + mLedGpio.getValue());

                mHandler.postDelayed(mBlinkRunnable, INTERVAL_BETWEEN_BLINKS_MS);
            } catch (IOException e) {
                Log.e(TAG, "run: Error on PeripheralIO API", e);
            }
        }
    };

Trong đó thuộc tính INTERVAL_BETWEEN_BLINKS_MS sẽ quy định thời gian mỗi lần nháy của LED.

Tổng thể class MainActivity.java các bạn có thể tham khảo dưới đây

package com.example.luuhtruc.raspberryappdemo;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.google.android.things.pio.Gpio;
import com.google.android.things.pio.PeripheralManagerService;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private static final int INTERVAL_BETWEEN_BLINKS_MS = 1000;
    private static final String TAG = MainActivity.class.getSimpleName();

    private Handler mHandler = new Handler();
    private Gpio mLedGpio;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        PeripheralManagerService service = new PeripheralManagerService();
        try {
            String pinName = BoardDefaults.getGPIOForLED();
            mLedGpio = service.openGpio(pinName);
            mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
            Log.i(TAG, "onCreate: Start Blink Led GPIO Pin");

            mHandler.post(mBlinkRunnable);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // Remove pending blink Runnable from handler
        mHandler.removeCallbacks(mBlinkRunnable);
        // Close the Gpio pin
        Log.i(TAG, "onDestroy: Closed LED GPIO pin");
        try {
            mLedGpio.close();
        } catch (IOException e) {
            Log.e(TAG, "onDestroy: Error on PeripheralIO API ", e);
        } finally {
            mLedGpio = null;
        }
    }

    private Runnable mBlinkRunnable = new Runnable() {
        @Override
        public void run() {
            if (mLedGpio == null) return;
            try {
                mLedGpio.setValue(!mLedGpio.getValue());
                Log.d(TAG, "run: State set to " + mLedGpio.getValue());

                mHandler.postDelayed(mBlinkRunnable, INTERVAL_BETWEEN_BLINKS_MS);
            } catch (IOException e) {
                Log.e(TAG, "run: Error on PeripheralIO API", e);
            }
        }
    };
}

Sau khi đã hoàn thành, chúng ta hãy khởi động phần cứng là bộ kit Rapsberry Pi3 và bảng test mạch như hướng dẫn ở phần Chuẩn bị linh kiện. Và giờ chúng ta khởi chạy ứng dụng và quan sát chiếc đèn led của chúng ta hoạt động.

Chú ý: Khi code của chúng ta đã được nạp vào thiết bị mà cái đèn led nó vẫn trơ và không nháy, đừng quá lo lắng, bởi bạn có thể đã cắm nhầm cực các thiêt bị như trở, led hay thậm chí là chân GPIO, nếu bạn đã kiểm tra rất kỹ mà nó vẫn không hoạt động thì đừng ngại liên hệ với mình nhé.

Phần tiếp theo chúng ta sẽ tìm hiểu thêm về điều khiển servo và button.

Thank in advance for your reading.

0