ก๊อบเค้ามา developer.android.com/things

Android Things 101 (Raspberry Pi 3 — macOS)

ก็ กำลังจะลองเล่นสาย Hardware เป็นครั้งแรก นับตั้งแต่ช่วงเรียนที่เล่นพวก FGPA และ Arduino ไปนิดหน่อย แต่ก็เป็นแค่ในห้องเรียนอะนะ สักพักก็มีกระแส IoT โผล่มา ก็อยากเล่นอยู่พักหนึ่ง แต่ก็ดูเหมือนว่ายังไม่มี platform ที่มั่นคงพอจะเรียนรู้ได้ ประกอบกับถ้าลงไปเล่น Hardware แบบ low-level มากๆ อย่าง Arduino มันก็อาจจะเจอปัญหาจุกจิก

พอ Google ประกาศเปิดตัว Android Things ขึ้นมันก็ถือว่าเป็นฤกษ์งามยามดีที่จะสั่ง Board มาเล่น จริงๆ ก็มีให้เลือกได้หลายประเภท ทั้ง Intel® Edison, Intel® Joule™, NXP Pico หรือ NXP Argon แต่ที่เลือก Raspberry Pi 3 เพราะว่า Community ที่ใหญ่ มีปัญหาจะได้ช่วยกันแก้ได้ แล้วก็ยังเอาไปเล่นอย่างอื่นนอกจาก Android Things ได้อีกเยอะแยะ

ป.ล. blog นี้เป็นการเขียนสด ทำไปเขียนไป ดังนั้นอาจจะไม่เป๊ะทุก step อาจจะลืมๆ หรือข้ามๆ ไปบ้าง

สิ่งที่ต้องเตรียม

  • Raspberry Pi 3 — ต่อไปนี้จะเรียกย่อว่า RPi3
Raspberry Pi 3 + case
  • microSD card — ใครสั่ง RPi3 แบบเปล่าๆ มา อย่าลืมเตรียม MicroSD card ไว้ด้วย
  • Adapter จ่าไฟให้ RPi3 — ที่ชาร์จ micro USB ธรรมดาที่แหละ แต่เขาแนะนำให้ใช้อันที่จ่ายไฟได้ 2A ขึ้นไป (เผื่อเสียบ USB เยอะๆ ไรงี้ ใช้งานทั่วไปไม่น่ามีปัญหา)
  • Breadboards + LED — อันนี้ optional เผื่ออยากเอาไว้ลองของ
Breadboards + LED
  • สาย Ethernet (สาย LAN) — เอาไว้ดู log

มาเริ่มกันเลย~

สิ่งที่เราจะทำคร่าวๆ เลยก็คือ

  1. โหลด Android Things Developer Preview มา
  2. flash microSD card ด้วย Android Things
  3. remote เข้าไปควบคุม RPi3 ผ่าน network
  4. ลอง clone sample project ของ Google มาแก้เล่นๆ

แค่นี้เอง พอเห็นภาพแล้ว ลุยกันเลย

1) โหลด Android Things Developer Preview มา

เข้าไปโหลดตาม Link นี้เลย เลือกโหลดของ Raspberry Pi นะ

พอโหลด เสร็จแล้ว แตกไฟล์ออกมาจะได้ไฟล์ชื่อ iot_rpi3.img

2) flash microSD card ด้วย Android Things

อย่างที่เขียนต้องแต่ชื่อบทความ อันนี้เราจะใช้ macOS ในการทำเนอะ ใครใช้ Windows หรือ Linux คงต้องลองดูตาม link แทน

สำหรับ macOS เราก็แค่

  • unmount microSD card (ไม่ใช่ eject นะ) ใน Disk Utility
  • ไปที่ terminal แล้วก็ navigate ไปที่ที่โหลด img ไว้ (cd ls ไปตามยถากรรม 555)
  • พิมพ์ command ตามนี้
sudo dd bs=1m if=iot_rpi3.img of=/dev/rdisk2

โดยที่เปลี่ยนเลข 2 ในrdisk2 เป็นเลขของ microSD card ซึ่งดูได้จาก about this mac > system report > Card Reader หรือ Storage แล้วลองหา MicroSD card ที่กำลังจะ flash

เช่น ในรูปนี้ก็จะเป็น disk1 ก็ใส่ไปว่า sudo dd bs=1m if=iot_rpi3.img of=/dev/rdisk1

เมื่อกด flash แล้วก็จะเห็นอะไรหน้าตาประมาณนี้ มันอาจจะ flash นานหน่อยนะ เกือบ 10 นาที แหน่ะ

จากนั้นก็

  • เอา microSD card เสียบเข้า RPi3
  • เสียบสาย HDMI
  • เสียบสาย micro USB จ่ายไฟให้ RPi3

แล้วจะเห็นหน้าจอแบบนี้ เป็นอันเสร็จ

ตื่นเต้นๆ
มาแล้ววววววววว

3) remote เข้าไปควบคุม RPi3 ผ่าน network

ปกติเวลาเราเขียน app Android เวลาเราจะดู log อะไร เราก็แค่เอามือถือเสียบกับคอม แล้วก็กด Run ใช่ไหม แต่ว่า RPi3 มันมันเอามาเสียบคอมไม่ได้น่ะสิ … เราก็เลย ต้องคุยกับ RPi3 ผ่าน Network นั้นเอง

ถึงจุดนี้ก็ได้เวลาเอาสาย LAN เสียบ RPi3

เมื่อเจ้า RPi3 boot Android Things เสร็จเรียบร้อย เราก็จะเจอจอหน้าตาแบบนี้

สังเกตได้ว่า ด้านล่างจะมีเลข IP address อยู่ (ถ้าใครยังไม่เห็น IP ลองเช็คสาย LAN ที่เสียบกับ RPi3)

ป.ล. RPi3 มี WiFi ในรูปข้างบนนี้ใช้ WiFi อยู่ อาจจะไม่ตรงกับที่เห็นครั้งแรกนัก แต่ครั้งแรกยังไงก็ต้องใช้สาย LAN

กลับมาเปิด terminal ใน mac แล้วพิมพ์ command ตามนี้

adb connect 192.168.1.28

โดยที่เปลี่ยน 192.168.1.28 ให้เป็น IP Address ที่โชว์อยู่บนจอ

แล้วใน terminal เราก็จะขึ้นอะไรประมาณนี้

ก็เป็นอันเสร็จสิ้น ตอนนี้เราก็เชื่อมต่อกับเจ้า RPi3 เรียบร้อย เหมือนตอนที่เราเสียบสาย micro USB เข้ามือถือนั้นแหละ

4) สร้าง Project เล่นๆ ทดสอบกันหน่อย

ความเทพของ Android Things ก็คือ มันเขียนเหมือน app Android แทบจะเป๊ะเลย! ใครเขียน Android เป็น เขียน Android Things เป็นแน่นอน

ว่าแล้วก็มาลองของกันหน่อย สิ่งที่เราจะทำก็ คือ คือ คือ … ไฟกระพริบ … เย้ basic สุดๆ

เริ่มด้วยการ clone project นี้ของ Google ลงมาเป็น template

https://github.com/androidthings/new-project-template.git

สิ่งที่เราจะทำก็คือ

  • get ตัวแปรที่ใช้อ้างถึง pin ที่ต้องการบน board ที่จะไปเสียบกับ LED
  • สร้าง function ที่ไป toggle ให้ LED เปิด-ปิด
  • สร้าง Timer ที่คอยเรียก function toggle LED ตามเวลา

ง่ายๆ เอง มาเริ่มกันเลย

เราก็จะเจอ Activity เปล่า ไม่มีอะไร มีแค่ onCreate กับ onDestroy ที่ Override มาให้ มาประกาศตัวแปรกันก่อน

private static final String TAG = "Things";
private static final int ONE_SECOND = 1000;

private Gpio led;
private boolean isLedOn = false;
private int round = 0;

ใน onCreate เราก็จะทำสองอย่างคือ initLed() และ setTimer()

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
initLed();
setTimer();
}

ซึ่งใน initLed() ก็ไม่มีอะไร แค่ไปเอาตัวแปร pin มาเก็บไว้ ให้เราสั่งเปิด-ปิดมันได้ ในที่นี้เราจะใช้ pin BCM6 (BCM6 คืออะไร เดี๋ยวบอกอีกที)

private void initLed() {
try {
PeripheralManagerService service =
new PeripheralManagerService();
led = service.openGpio("BCM6");
} catch (IOException e) {
e.printStackTrace();
}
}

ใน setTimer() ก็สร้าง TimerTask ที่จะถูกเรียกทุกๆ ONE_SECOND หรือก็คือ 1000 millisec

ใน TimerTask ก็แค่นับ round เพิ่มขึ้น แล้วก็เรียก function toggleLed()

private void setTimer() {
(new Timer()).schedule(new TimerTask() {
@Override
public void run() {
round++;
toggleLed();
}
}, ONE_SECOND, ONE_SECOND);
}

toggleLed() ก็ตามชื่อเรียก LED เปิดอยู่ก็ปิด LED ปิดอยู่ก็เปิด

private void toggleLed() {
try {
led.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
if (isLedOn) {
led.setValue(false);
isLedOn = false;
Log.d(TAG, round + " toggleLed: OFF");
} else {
led.setValue(true);
isLedOn = true;
Log.d(TAG, round + " toggleLed: ON");
}
} catch (IOException e) {
e.printStackTrace();
}
}

ใครงงๆ ก็ clone project ลงมาดู ตามนี้

https://github.com/Xenocide93/android-things-blinking-led.git

พอกด Run ปุ๊บ ก็จะเห็นอะไรประมาณนี้

จริงๆ แล้ว ที่ Android Things มันดูเหมือน Android ธรรมดาไปซะทุกอย่างเลย ก็เพราะว่า … มันคือ Android 7.0 ยังไงล่ะ!

ใน logcat ก็จะเป็นแบบนี้

แล้วไหนละ LED ที่จะเอามากระพริบ ?

ใจร่มๆ ใกล้ละ อีกนิด เราต้องมาเสียบวงจรแผงวงจรกันนิดหน่อย ก่อนอื่น ตั้ง RPi3 ตามแนวนี้ HDMI อยู่ทางซ้าย

แล้ว pin ที่เห็นทางขวาจะ map เข้ากับรูปนี้พอดี

ดูที่ มุมล่างซ้าย จะเห็น pin 39 ที่เขียนว่า Ground แล้วไล่ขึ้นไปอีกนิดจะเจอ pin 31 ที่ชื่อ … BCM6 … ชื่อคุ้นๆ ไหม? ถ้าไม่คุ้น กลับไปดู code

เราจะเสียบสายเส้นหนึ่งไปที่ Ground pin 39 (แต่จริงๆ Ground ไหนก็ได้แหละ) ตามรูปคือเส้นสีดำ และอีกเส้นที่ BCM6 pin 31 ในรูปคือเส้นสีขาว

แล้วก็ ตอนนี้จะเอานิ้วหนีบสายไฟให้ติดกับขาของ LED ก็ได้นะ กด Run ปุ๊บ มันก็จะกระพริบตามที่เรา code ไว้แล้ว

แต่ถ้าใครมี breadboard อยากจะทำให้มันดูดีมีชาติตระกูลขึ้นมาอีกนิดก็เสียบๆ ตามนี้

เสร็จเรียบร้อย รุ่นใหญ่ไฟกระพริบ หวังว่า blog นี้จะช่วยเชิญชวนให้คนหลงมาเล่น Android Things กันเยอะขึ้น trend Internet of Things กำลังมาแรง เดี๋ยวคงมีอะไรมาเล่นอีกเยอะแยะ ซื้อ module นู้นนี้นั้นมาเสียบ สั่งผ่านมือถือ trigger ผ่าน Google Assistant หรือ IFTTT ยิ่งคิดยิ่งอยากเล่นอีก

ไว้พบกันโอกาสหน้า … ถ้ามีเวลาและตัณหามากพอ