[Review] ลองเล่น Lambda Board Plus บอร์ด Arduino สัญญาติไทย เล่นใหญ่ ในราคาเล็กๆ

Sathittham (Phoo) Sangthong
SS Blog
Published in
7 min readMay 7, 2016
SS-LambdaPlus-fb-share

Lambda Board เปิดตัวไปเมื่องาน Arduino (Genuino) Day 2016 Bangkok แต่ยังไม่ได้มีโอกาสลองเล่นดู เมื่องาน StartUp Thailand 2016 ที่ผ่านมา ผมมีโอกาสได้บอร์ด Lambda Plus V.1.1 (ปรับปรุงจาก V.1.0 มาคือแก้ Foot print ที่ผิดเล็กน้อย และเพิ่ม Temperature& Humidity Sensor มาให้ด้วย) … ว่าแล้วก็ไปลองเล่นกันดูครับ

Lambda Board คืออะไร ?

บอร์ด Lambda เป็นบอร์ด Arduino Uno compatible ครับ ที่พัฒนาขึ้นมาโดยคนไทย คือ บริษัท GravitechThai ที่พัฒนาด้วยชิปใหม่ล่าสุดอย่าง Atmel ATmega328PB ทำให้มี Digital I/O, SPI, I2C และ UART เพิ่มขึ้นครับ แพ็คเก็จรุ่น Plus ทำเป็นกิมมิกดีครับ มาเป็นแบบตะกร้าไม้ไผ่สาน(บอกความเป็นไทยแลนด์ได้ดีครับ) ทีเด็ดคือมาพร้อมกับชุดเซ็นเซอร์แบบจัดเต็มด้วย (เฉพาะรุ่น Plus) ในราคาเบาๆครับ

  • เซ็นเซอร์อุณหภูมิและความชื้นสัมพัทธ์ (Temperature & Humidity) : HTS221 Datasheet
  • เซ็นเซอร์ IMU 9 DOF (3-axis Accelerometer, 3-axis Gyroscope, 3-axis Magnetometer) : LSM9DS1 Datasheet
  • เซ็นเซอร์ความดันบรรยากาศ (Barometer) : BMP280 Datasheet

บอร์ด Lambda แบ่งออกเป็น 3 รุ่น 3 ราคาครับ เลือกใช้ความความเหมาะสม โดยมีรายละเอียดดังนี้ครับ

  • Lambda Lite V.1.1
    รุ่นนี้ “เน้นเป็นบอร์ดไมโครคอนโทรลเลอร์ราคาประหยัด” ในราคาเพียง 295 บาท ก็สามารถได้บอร์ด Arduino ดีๆไปใช้งานแล้วครับ (บอร์ดไมโครคอนโทรลเลอร์เฉยๆเลยครับ ไม่มีแจ๊คไฟ DC, Regulate 5V/3.3V,และเซ็นเซอร์ทุกอันออกครับ) รายละเอียดตามชาร์ตด้านล่างครับ
  • Lambda Basic V.1.1
    รุ่นนี้น่าจะ “เป็นรุ่นปกติแบบบอร์ด Arduino ทั่วไป” ครับ มีภาคจ่ายไฟ DC และ Regulate 5V/3.3V แต่ยังไม่มีเซ็นเซอร์ต่างๆนะครับ ราคาก็แพงครับ 395 บาท
Basic-1-1
  • Lambda Plus V.1.1
    รุ่นนี้เป็น “ตัวท๊อป ทุกอย่างจัดใหญ่ จัดเต็ม” ครับ เซ็นเซอร์จัดเต็มทั้ง เซ็นเซอร์อุณหภูมิและความชื้นสัมพัทธ์ (Temperature & Humidity), เซ็นเซอร์ IMU (3-axis Accelerometer, 3-axis Gyroscope, 3-axis Magnetometer) และเซ็นเซอร์ความดันบรรยากาศ (Barometer) ทั้งหมดในราคาเพียง 799 บาท (ถือว่าราคาดีมากๆครับ ถ้าซื้อเซ็นเซอร์แยก ราคาก็น่าจะแพงว่านี้ละครับ)

คุณสมบัติเด่นๆในบอร์ด Lambda Plus V1.1

  1. MCU ATmega328PB
  2. เพิ่มขา PE0-PE1
  3. เพิ่มขา A6-A7
  4. FTDI : USB to Serial
  5. เซ็นเซอร์อุณหภูมิและความชื้นสัมพัทธ์ (Temperature & Humidity) : HTS221 Datasheet
  6. เซ็นเซอร์ IMU 9 DOF (3-axis Accelerometer, 3-axis Gyroscope, 3-axis Magnetometer) : LSM9DS1 Datasheet
  7. เซ็นเซอร์ความดันบรรยากาศ (Barometer) : BMP280 Datasheet

มาลองเล่นกันเลย

ย้ำอีกทีนะครับ ตัวที่เล่นอยู่นี้เป็นรุ่น Plus นะครับ….ผู้ขายบอกว่ารุ่น Lite กับ Basic ไม่ได้มาพร้อมแพ็คเก็จนี้นะครับ (ตามราคา 5555)

Step 1 : แกะกล่อง

แพ็คเก็จตะกร้าไม้ไผ่สานดูแบบ OTOP มากครับ
แพ็คเก็จตะกร้าไม้ไผ่สานดูแบบ OTOP มากครับ

แพ็คเก็จแบบนี้ผมนึงถึง OTOP เลยทีเดียว…ถือว่าสร้างจุดขายได้ดีครับ ขายต่างประเทศคงจะสะดุดตาชาวต่างชาติดีทีเดียว และปัญหาระดับชาติเมกเกอร์ที่ทุกคนถามคือ “แกะกล่อง เอาบอร์ดมาแล้ว เอาไปทำอะไรต่อดี”….ถ้าไม่ใช่เก็บสบู่ 5555

แกะออกมา มีซองกันไฟฟ้าสถิตอยู่ครับ
แกะออกมา มีซองกันไฟฟ้าสถิตอยู่ครับ

เปิดออกมามีซองกันไฟฟ้าสถิตอยู่ด้านในอีกชั้นนึงครับ OTOP แต่ปลอดภัยหายห่วงครับ

Lambda Plus V.1.1 ด้านหน้า
Lambda Plus V.1.1 ด้านหน้า

บอร์ดมาในรูปแบบของ Arduino มาตรฐานครับ น่าจะ Compatible ทุกอย่างทั้ง Shield และ Library บอร์ด Lambda จะใช้อุปกรณ์เป็นแบบ SMD ทั้งหมดครับ ทำให้อุปกรณ์อะไรก็ดูเล็กๆ ไปหมด และทำให้ด้านหลังเรียบเนียน (รูปถัดไป) และรุ่นนี้น่าจะสมบูรณ์ระดับหนึ่งแล้วครับ (ไม่มีแถมสายไฟมาให้เหมือนรุ่น V1.0 แล้วครับ)

Lambda Plus V.1.1 ด้านหลัง
Lambda Plus V.1.1 ด้านหลัง

ด้านหลังเรียบเนียบ ดูเป็นงานศิลป์ดีครับ สกรีนรูปโลโก้ช้าง 2 ตัว (น่าจะแม่ลูกกัน…ว่าแต่ จะรู้ไปทำไม!) ทำงวงเป็นโลโก้แลปด้า (แหม๊ ! มองตั้งนาน) และด้านบนน่าจะเป็นดอกกล้วยไม้ (ผมเดา…เห็นเค้าโปรโมทคู่กัน) ที่ขาดไม่ได้แน่นอนคือ “MADE IN THAILAND” และ “ภูมิใจไทยทำ” พร้อมรูปประเทศไทย แต่ที่สำคัญคือยังได้มาตรฐาน ROHS COMPLIANT นะครับ และ QC PASS สติ๊กเกอร์

Step 2 : ลงโปรแกรม

โปรแกรมในที่นี้เราจะใช้จากค่าย Arduino.cc ที่คนส่วนใหญ่นิยมใช้กันนะครับ ใครมีอยู่แล้วข้ามไป Step3 ได้เลยครับ (เพราะใช้ตัวเดิมได้เลย)

Step 3 : ลง Library

เนื่องจากบนบอร์ดมีเซ็นเซอร์มาให้เล่นเยอะ เราก็ไปเอา Library มาลงให้พร้อมเล่นกันครับ ดาวโหลด แตกไฟล์ ก๊อปไปไว้ที่ Arduino > libraries นะครับ….ดาวโหลดได้จากที่นี่เลยครับ

Step 4 : ไฟกระพริบเทพ

งานนี้พลาดไม่ได้ครับ Blink เทพ หรือไฟกระพริบเทพ

  • ไปที่ File > Example > 1.Basics > Blink
  • เสียบบอร์ดกับคอมพิวเตอร์
  • เลือกบอร์ดเป็น Arudino UNO และเลือก Port ครับ
เลือกบอร์ดเป็น Arduino Uno นะครับ
Blink เทพ

Step 5 : ทดสอบวัดอุณหภูมิ

  • Code ตัวอย่าง
// Distributed with a free-will license.
// Use it any way you want, profit or free, provided it fits in the licenses of its associated works.
// HTS221
// This code is designed to work with the HTS221_I2CS I2C Mini Module available from ControlEverything.com.
// https://www.controleverything.com/content/Humidity?sku=HTS221_I2CS#tabs-0-product_tabset-2
#include<Wire.h>// HTS221 I2C address is 0x5F
#define Addr 0x5F
void setup()
{
// Initialise I2C communication as MASTER
Wire.begin();
// Initialise serial communication, set baud rate = 9600
Serial.begin(9600);

// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select average configuration register
Wire.write(0x10);
// Temperature average samples = 256, Humidity average samples = 512
Wire.write(0x1B);
// Stop I2C Transmission
Wire.endTransmission();
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Select control register1
Wire.write(0x20);
// Power ON, Continuous update, Data output rate = 1 Hz
Wire.write(0x85);
// Stop I2C Transmission
Wire.endTransmission();
delay(300);
}
void loop()
{
unsigned int data[2];
unsigned int val[4];
unsigned int H0, H1, H2, H3, T0, T1, T2, T3, raw;
// Humidity calliberation values
for(int i = 0; i < 2; i++)
{
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Send data register
Wire.write((48 + i));
// Stop I2C Transmission
Wire.endTransmission();

// Request 1 byte of data
Wire.requestFrom(Addr, 1);

// Read 1 byte of data
if(Wire.available() == 1)
{
data[i] = Wire.read();
}
}

// Convert Humidity data
H0 = data[0] / 2;
H1 = data[1] / 2;

for(int i = 0; i < 2; i++)
{
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Send data register
Wire.write((54 + i));
// Stop I2C Transmission
Wire.endTransmission();

// Request 1 byte of data
Wire.requestFrom(Addr,1);

// Read 1 byte of data
if(Wire.available() == 1)
{
data[i] = Wire.read();
}
}
// Convert Humidity data
H2 = (data[1] * 256.0) + data[0];

for(int i = 0; i < 2; i++)
{
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Send data register
Wire.write((58 + i));
// Stop I2C Transmission
Wire.endTransmission();

// Request 1 byte of data
Wire.requestFrom(Addr,1);

// Read 1 byte of data
if(Wire.available() == 1)
{
data[i] = Wire.read();
}
}
// Convert Humidity data
H3 = (data[1] * 256.0) + data[0];
// Temperature calliberation values
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Send data register
Wire.write(0x32);
// Stop I2C Transmission
Wire.endTransmission();
// Request 1 byte of data
Wire.requestFrom(Addr,1);
// Read 1 byte of data
if(Wire.available() == 1)
{
T0 = Wire.read();
}
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Send data register
Wire.write(0x33);
// Stop I2C Transmission
Wire.endTransmission();
// Request 1 byte of data
Wire.requestFrom(Addr,1);
// Read 1 byte of data
if(Wire.available() == 1)
{
T1 = Wire.read();
}

// Start I2C Transmission
Wire.beginTransmission(Addr);
// Send data register
Wire.write(0x35);
// Stop I2C Transmission
Wire.endTransmission();

// Request 1 byte of data
Wire.requestFrom(Addr, 1);
// Read 1 byte of data
if(Wire.available() == 1)
{
raw = Wire.read();
}
raw = raw & 0x0F;

// Convert the temperature calliberation values to 10-bits
T0 = ((raw & 0x03) * 256) + T0;
T1 = ((raw & 0x0C) * 64) + T1;
for(int i = 0; i < 2; i++)
{
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Send data register
Wire.write((60 + i));
// Stop I2C Transmission
Wire.endTransmission();

// Request 1 byte of data
Wire.requestFrom(Addr,1);

// Read 1 byte of data
if(Wire.available() == 1)
{
data[i] = Wire.read();
}
}
// Convert the data
T2 = (data[1] * 256.0) + data[0];

for(int i = 0; i < 2; i++)
{
// Start I2C Transmission
Wire.beginTransmission(Addr);
// Send data register
Wire.write((62 + i));
// Stop I2C Transmission
Wire.endTransmission();

// Request 1 byte of data
Wire.requestFrom(Addr,1);

// Read 1 byte of data
if(Wire.available() == 1)
{
data[i] = Wire.read();
}
}
// Convert the data
T3 = (data[1] * 256.0) + data[0];

// Start I2C Transmission
Wire.beginTransmission(Addr);
// Send data register
Wire.write(0x28 | 0x80);
// Stop I2C Transmission
Wire.endTransmission();

// Request 4 bytes of data
Wire.requestFrom(Addr,4);

// Read 4 bytes of data
// humidity msb, humidity lsb, temp msb, temp lsb
if(Wire.available() == 4)
{
val[0] = Wire.read();
val[1] = Wire.read();
val[2] = Wire.read();
val[3] = Wire.read();
}

// Convert the data
float humidity = (val[1] * 256.0) + val[0];
humidity = ((1.0 * H1) - (1.0 * H0)) * (1.0 * humidity - 1.0 * H2) / (1.0 * H3 - 1.0 * H2) + (1.0 * H0);
int temp = (val[3] * 256) + val[2];
float cTemp = (((T1 - T0) / 8.0) * (temp - T2)) / (T3 - T2) + (T0 / 8.0);
float fTemp = (cTemp * 1.8 ) + 32;

// Output data to serial monitor
Serial.print("Relative humidity : ");
Serial.print(humidity);
Serial.println(" % RH");
Serial.print("Temperature in Celsius : ");
Serial.print(cTemp);
Serial.println(" C");
Serial.print("Temperature in Fahrenheit : ");
Serial.print(fTemp);
Serial.println(" F");
delay(500);
}

Step 6 : ทดสอบวัดความดันบรรยากาศ

  • ไปที่ File > Example > Adafruit BPM280 Library > bpm280test

Step 7 : ทดสอบ IMU

  • ไปที่ File > Example > Sparkfun LSM9DS1 IMU > LSM9DS1_Basic_I2C

สรุป

  • Hardware ถือว่างานดีมากครับ เนียน ดูดีครับ
  • แพ็คเก็จเป็นกิมมิกดี
  • ถือว่าเป็นบอร์ด Arduino UNO Complatible ที่คุ้มและดีครับ ทั้งในแง่ของราคาและคุณภาพ
  • มี 3 รุ่น Lite, Basic, Plus ให้เลือกตามคุณสมบัติและราคา ให้เลือกใช้ตามความเหมาะสมของงาน
  • ราคาถูกใจมากครับ (อย่างรุ่น Plus แค่ได้เซ็นเซอร์ก็คุ้มแล้วครับ)
  • ยังไม่มี Firmware รองรับการทำงานของชิป ATmega328PB ทำให้ใช้งานฟีเจอร์ใหม่ๆ ยังไม่ได้ครับ (คงต้องรอผู้พัฒนาสักพักครับ)

อ้างอิง

--

--

Sathittham (Phoo) Sangthong
SS Blog

Hi! It's me Phoo! I’m a Software Developer 👨‍💻 , a Startup Entrepreneur 📱 and a Runner 🏃 . Currently, I’m a Co-Founder and CTO of a Startup name “Urbanice”.