วันพฤหัสบดีที่ 3 ธันวาคม พ.ศ. 2558

Internet of Thing (IoT)

 Internet of Things หรือ IoT

รูปจาก iot-analytics.com

              Internet of Things หรือ IoT คือ สภาพแวดล้อมอันประกอบด้วยสรรพสิ่งที่สามารถสื่อสารและเชื่อมต่อกันได้ผ่านโพรโทคอลการสื่อสารทั้งแบบใช้สายและไร้สาย โดยสรรพสิ่งต่างๆ มีวิธีการระบุตัวตนได้ รับรู้บริบทของสภาพแวดล้อมได้ และมีปฏิสัมพันธ์โต้ตอบและทำงานร่วมกันได้ ความสามารถในการสื่อสารของสรรพสิ่งนี้จะนำไปสู่นวัตกรรมและบริการใหม่อีกมากมาย ตัวอย่างเช่น เซ็นเซอร์ภายในบ้านตรวจจับการเคลื่อนไหวของผู้อยู่อาศัย และส่งสัญญาณไปสั่งเปิด/ปิดสวิตซ์ไฟตามห้องต่างๆ ที่มีคนหรือไม่มีคนอยู่ อุปกรณ์วัดสัญญาณชีพของผู้ป่วย/ผู้สูงอายุและส่งข้อมูลไปยังบุคลากรทางการแพทย์ หรือส่งข้อความเรียกหน่วยกู้ชีพหรือรถฉุกเฉิน เป็นต้น
              เทคโนโลยีที่ทำให้ IoT เกิดขึ้นได้จริงและสร้างผลกระทบในวงกว้างได้ แบ่งออกเป็นสามกลุ่มได้แก่ 1) เทคโนโลยีที่ช่วยให้สรรพสิ่งรับรู้ข้อมูลในบริบทที่เกี่ยวข้อง เช่น เซ็นเซอร์ 2) เทคโนโลยีที่ช่วยให้สรรพสิ่่งมีความสามารถในการสื่อสาร เช่น ระบบสมองกลฝังตัว รวมถึงการสื่อสารแบบไร้สายที่ใช้พลังงานต่ำ อาทิ Zigbee, 6LowPAN, Low-power Bluetooth และ 3) เทคโนโลยีที่ช่วยให้สรรพสิ่งประมวลผลข้อมูลในบริบทของตน เช่น เทคโนโลยีการประมวลผลแบบคลาวด์ และเทคโนโลยีการวิเคราะห์ข้อมูลขนาดใหญ่ หรือ Big Data Analytics ในที่นี้เราจะยกตัวอย่างในเรื่องของ smart home

Smart home

ไม่ค่อยน่าแปลกใจเท่าไหร่ที่ Smart Home จะถูกจัดอยู่ในอันดับหนึ่ง สำหรับเดือนที่สำรวจนั้นพบว่ามีผู้คนค้นหาบนกูเกิลด้วยคำว่า “Smart Home” มากกว่า 60,000 คนเลยทีเดียว โดยในฐานข้อมูลของ IoT Analytics มีบริษัทรวมถึง startup ต่างๆ อยู่มากถึง 256 บริษัทที่ทำเรื่อง Smart Home อยู่ในตอนนี้ และมีการเปิดให้ใช้งานแอพพลิเคชันทางด้าน IoT อยู่ในปัจจุบัน จำนวนเม็ดเงินที่มีการลงทุนไปใน Smart Home ของบริษัท Startup ในปัจจุบันมีนั้นเกิน 2.5 พันล้านเหรียญไปแล้ว นี่ยังไม่ได้นับรวมบริษัท startups ชื่อดังอย่างเช่น Nest หรือ AlertMe เข้าไป และก็ยังไม่ได้รวมบริษัทข้ามชาติดังๆ อย่างเช่น Philips, Haier หรือ Belkin เข้าไป

Smart home หรือบ้านอัจฉริยะ คือการใช้เทคโนโลยีมาควบคุมอุปกรณ์ต่างๆภายในบ้าน เพื่ออำนวยความสะดวกแก่ผู้อยู่อาศัย ,  มีระบบการจัดการพลังงาน ระบบรักษาความปลอดภัยอัตโนมัติทั้งภายในและรอบตัวบ้าน  ส่วนใหญ่จะควบคุมด้วยระบบคอมพิวเตอร์ โดยทั่วไปเรียกว่า home automation ซึ่งสามารถถูกจำแนกความสามารถและความซับซ้อนในการควบคุมออกเป็น
1.       ระบบควบคุมไฟฟ้าแสงสว่าง เช่น เปิด/ปิด หรือปรับระดับความสว่าง
2.       ระบบควบคุมอุปกรณ์ไฟฟ้าภายในบ้าน เช่น สั่งงานเครื่องปรับอากาศ หรือการเปิดปิดม่าน
3.       ระบบความบันเทิงภายในบ้าน เช่น สั่ง Internet radio ให้ทำงานในห้องที่ ผู้ใช้อยู่ และปิดเมื่อผู้ใช้ออกจากห้อง
4.       ระบบบริหารพลังงาน และพลังงานสำรอง เช่น การปิด/เปิด เครื่องใช้ไฟฟ้าต่างๆโดยขึ้นกับสิ่งแวดล้อม
5.       ระบบสื่อสาร เช่น รับ/ส่ง ข้อความหรือคำสั่งระหว่างผู้ใช้
6.       ระบบรักษาความปลอดภัย เช่น เชื่อมต่อระบบกันขโมย/กล้อง กับ บ.รักษาความปลอดภัย
ที่มา : 
-http://www.businessinsider.com/internet-of-everything-2015-bi-2014-12?op=1
-MarketsandMarkets, Internet of Things Market & Machine-To-Machine Communication Market – Advanced Technologies, Future Cities & Adoption Trends, Roadmaps & Worldwide Forecasts (2012 – 2017), September 2012.
-http://www.inofthings.com
-http://www.it24hrs.com/2012/smart-room-smart-room-automation/

วันอังคารที่ 15 กันยายน พ.ศ. 2558

DS18B20 (Temperature Sensor)

การวัดอุณหภูมิด้วยไอซี DS18B20 Digital Thermometer

      ไอซีวัดอุณหภูมิในตระกูล DS18xx มีอยู่หลายรุ่น เช่น DS1820DS18S20 และ DS18B20 
เป็นไอซีที่วัดอุณหภูมิและให้ค่าแบบดิจิทัล เชื่อมต่อในรูปแบบของบัสที่เรียกว่า 1-Wire 
ไอซีเหล่านี้มีความแตกต่างกันเล็กน้อย แต่ในบทความนี้จะกล่าวถึงเฉพาะ DS18B20
        ในปัจจุบัน มีไอซีสำหรับวัดอุณหภูมิให้เลือกใช้อยู่หลายแบบ แบ่งตามรูปแบบของเอาต์พุตได้          
เป็นสองประเภทคือ ไอซีที่ให้เอาต์พุตแบบแอนะล็อก และแบบดิจิทัล โดยทั่วไปไอซีแบบดิจิทัล       
จะมีวงจรประเภท ADC (Analog to Digital Converter) รวมอยู่ภายใน บางตระกูลหรือบางรุ่น         
สามารถโปรแกรมหรืออ่านค่ารีจิสเตอร์ภายในได้ เช่น เพื่อกำหนดค่าที่เกี่ยวข้องกับการทำงาน             
ของไอซี ในส่วนการเชื่อมต่อกับไมโครคอนโทรลเลอร์ มักจะเป็นการสื่อสารข้อมูลแบบ SPI หรือ I2C 
เพื่อประหยัดขา I/O ในการเชื่อมต่อ   
       บทความนี้กล่าวถึง การใช้งานไอซี DS18B20 Digital Thermometer ของบริษัท Maxim 
และเขียนโปรแกรมติดต่อสื่อสารด้วย Arduino จุดเด่นของไอซีในตระกูลนี้คือ การสื่อสารข้อมูลด้วย
สัญญาณเพียงเส้นเดียว นำอุปกรณ์หรือไอซีมาต่อกันหลายตัวเป็นบัส (Bus) ได้โดยใช้โปรโตคอลสื่อสาร
ที่เรียกว่า 1-Wire (OneWire)

ข้อมูลเชิงเทคนิคเกี่ยวกับไอซี DS18B20:

  • ใช้แรงดันไฟเลี้ยง Vdd (หรือ Vcc) ได้ในช่วง 3.0V ถึง 5.5V
  • มี 3 ขา (สำหรับตัวถัง TO-92) คือ Gnd (Pin 1), DQ (Pin 2), Vdd (Pin 3)
  • ใช้งานได้สองแบบ: normal mode (ใช้ทั้ง 3 ขา) และ parasite power mode                                        
        (ใช้เพียง 2 ขา คือ DQ  และ GND ในขณะที่ขา Vdd จะต่อกับขา Gnd)
  • สามารถนำไอซีมาพ่วงต่อกันในบัสเดียว (เส้นสัญญาณ DQ) ได้หลายอุปกรณ์
  • ในการใช้งาน จะต้องต่อ pull-up 4.7kΩ (หรือน้อยกว่าได้เล็กน้อย) ที่ขา DQ กับแรงดันไฟเลี้ยง
  • วัดอุณหภูมิได้ในช่วง -55 °C ถึง +125 °C
  • มีความแม่นยำ ±0.5 °C สำหรับอุณหภูมิในช่วง -10°C ถึง +85°C
  • มีความละเอียดของค่าที่อ่านได้ 12 บิต (Resolution)
  • ใช้เวลาในการแปลงข้อมูลสำหรับ ADC ไม่เกิน 750 msec (มิลลิวินาที) สำหรับข้อมูล 12 บิต
  • ไอซีแต่ละตัวมีหมายเลขเฉพาะตัว ขนาด 64 บิต (64-bit serial code)
  • สำหรับตระกูล DS18B20 มีค่าไบต์สำหรับ 8-bit family code ตรงกับ 28h (0x28) 
        เป็นไบต์แรกของหมายเลขอุปกรณ์
ภายในไอซี DS18B20 มีหน่วยความจำแบบ SRAM ขนาดความจุ 9 ไบต์ (Byte 0 ถึง Byte 9) 
และเรียกว่า Scratchpadส่วนหนึ่งของหน่วยความจำนี้ จะใช้สำหรับเก็บค่าอุณหภูมิ
ที่ได้จากการอ่านและแปลงเป็นข้อมูลดิจิทัลในแต่ละครั้ง (ใช้ 2 ไบต์ และเก็บไว้ใน Byte 0 
และ Byte 1) และยังมีการคำนวณค่า CRC (checksum) ขนาดหนึ่งไบต์ด้วย (เก็บไว้ใน Byte 8)
รูปแสดงขาและตัวถัง TO-92 ของไอซี DS18B20




รูปแสดงอุปกรณ์สำหรับวัดอุณหภูมิ DS18B20 ที่ใช้ในการทดลอง
(Waterproof / encapsulated DS18B20 temperature sensor)
3-Wire connector: Black=GND, Yellow=DQ, Red=Vdd

Arduino Sketch

ในการเขียนโปรแกรมสำหรับ Arduino เพื่อเชื่อมต่อกับไอซี DS18B20 สามารถใช้ไลบรารี่ "OneWire.h" ของ Arduino ซึ่งทำให้สะดวกในการเขียนโปรแกรม เช่น เพื่อการค้นหาหลายเลข (64-bit code) ของอุปกรณ์ที่ต่ออยู่กับบัส 1-Wire การสั่งให้ไอซีตามหมายเลขอุปกรณ์อ่านและแปลงค่าอุณหภูมิ จากนั้นเว้นระยะเวลาอย่างน้อย 750msec แล้วจึงอ่านค่าจากหน่วยความจำ Scratchpad ของไอซี
โค้ดตัวอย่างต่อไปนี้ ทำหน้าที่ค้นหาไอซี DS18B20 ที่ต่ออยู่กับบัส 1-Wire ซึ่งในตัวอย่างนี้ ได้ใช้อุปกรณ์ 2 ชุด   ขา DQ ของไอซีแต่ละตัว จะนำไปต่อกับขา D2 ของ Arduino และที่ขานี้จะต้องต่อ 4.7kΩ แบบ pull-up กับ +5V อยู่ด้วย   ข้อมูลที่ได้จากอุปกรณ์วัดอุณหภูมิทั้งสองชุด จะปรากฏเป็นข้อความที่ถูกส่งผ่านทาง Serial (Baudrate 115200)

Sourcecode: ds18b20_demo.ino

///////////////////////////////////////////////////////////////////////////////
// Author: RSP @ Embedded System Lab (ESL), KMUTNB, Thailand
// Date: 2014-May-12
// Board: Arduino with ATmega168/328P (5V/16MHz)
// Arduino IDE: version 1.0.5
// Description:
//   This Arduino Sketch shows how to read temperature values from
//   two DS18B20 digital thermometers connected to the same bus (1-wire).
///////////////////////////////////////////////////////////////////////////////

#include <OneWire.h> // Use the Arduino "OneWire" library.

#define DS18S20_ID   (0x10)   // The byte code for the DS18S20 device family.
#define DS18B20_ID   (0x28)   // The byte code for the DS18B20 device family.

#define DQ_PIN       (2)      // Use Arduino D2 pin for I/O (connected to the DQ pin).
OneWire ds( DQ_PIN );         // Create a OneWire object.

#define NUM_DEVICES  (2)      // Specify the number of DS18B20 devices to be used.
byte ds_addr[NUM_DEVICES][8]; // used to stored 8-byte device addresses (for two devices)
char sbuf[20];                // used for sprintf()

// 'buf' must be an array of at least 8 bytes. 
boolean ds_addr_search( byte *buf ) { // Perform a DS18xx device search 
  if ( ds.search(buf) == 1 ) { // ok
    if ( OneWire::crc8( buf, 7 ) == buf[7] ) { // check the CRC byte
       return true; // CRC is valid
    }
  } else {
    ds.reset_search();
  }
  return false;
}

void ds_devices_scan() { // Scan devices on the 1-Wire bus
  for ( uint8_t dev=0; dev < NUM_DEVICES; dev++ ) { 
    uint8_t *addr = ds_addr[dev];
    memset( addr, 0x00, 8 );   
    if ( ds_addr_search( addr ) ) {
      for (uint8_t i=0; i < 8; i++) {
        sprintf( sbuf+3*i, "%02X ", addr[i] );
      }
      Serial.print( "Address found: " );
      Serial.print( sbuf );
      sprintf( sbuf, "(Device %d)", dev ); 
      Serial.println( sbuf );
      if ( addr[0] == DS18B20_ID ) {
        Serial.println( "This device is DS18B20." );
      }
      else if ( addr[0] == DS18S20_ID ) {
        Serial.println( "This device is DS18S20." );
      }
      else {
        Serial.println( "Unrecognized device family!" );
      }
    }
  }
}

void setup(void) {
  Serial.begin(115200);
  ds_devices_scan();
}
 
boolean ds_read_temp( byte *addr, int16_t *temp ) {
  static byte data[9];
  ds.reset();
  ds.select( addr );
  ds.write( 0x44, 1 );  // initiates a temperature conversion, enable pull-up on the 1-Wire bus
  delay( 800 );         // wait for at least 750ms for 12-bit ADC conversion time
  ds.reset();
  ds.select( addr );  
  ds.write( 0xBE );     // read Scratchpad
  for ( byte i=0; i < 9; i++ ) { // read 9 bytes in total
    data[i] = ds.read();
  }
  if ( OneWire::crc8( data, 8) == data[8] ) { // CRC is ok.
    int16_t t = data[1];
    t = (t << 8) + data[0];
    *temp = (t*10)/16;  // for DS18B20, use 0.0625 = 1/16 deg per bit
    return true;
  }
  return false;
}

void loop(void) {
  static int16_t temp;
  for ( uint8_t dev=0; dev < NUM_DEVICES; dev++ ) {
    if ( ds_addr[dev][0] != DS18B20_ID ) continue;
    if ( ds_read_temp( ds_addr[dev], &temp ) ) {
      char pm = (temp < 0) ? '-' : '+'; 
      temp = abs(temp);
      sprintf( sbuf, "Device %d: %c%d.%d C", dev, pm, (temp/10), (temp%10) );
      Serial.println( sbuf );
    } else {
      Serial.println( "Read operation failed!" );
    }
  }
}
/////////////////////////////////////////////////////////////////////////////////



รูปแสดงการวางแผนต่อวงจรบนเบรดบอร์ดด้วย Fritzing
วงจรนี้ใช้ไอซี DS18B20 จำนวน 2 ตัว และตัวต้านทาน 4.7kΩ 1 ตัว
การต่อไอซีแบบ 3-wire (normal power mode)



รูปแสดงการวางแผนต่อวงจรบนเบรดบอร์ดด้วย Fritzing
การต่อไอซีแบบ 2-wire (parasite power mode)



รูปแสดงฮาร์ดแวร์และการต่อวงจรทดลอง



รูปแสดงตัวอย่างข้อความใน Serial Monitor ที่ได้จากการทำงานของ Arduino ตามโค้ดตัวอย่าง
เริ่มต้นแสดงอุณหภูมิที่วัดได้จากอุปกรณ์ 2 ชุด วางอยู่ในตำแหน่งเดียวกัน และได้อุณหภูมิที่เท่ากัน



รูปแสดงข้อความในการวัดค่าอุณหภูมิจากอุปกรณ์ 2 ชุด แต่วัดอุณหภูมิในที่แตกต่างกัน
Device 1 นำไปไว้ใกล้แหล่งความร้อน (ช่องระบายความร้อนของคอมพิวเตอร์ Notebook)
ในขณะที่ Device 0 ยังวัดอุณหภูมิที่จุดเดิม


ที่มา : http://cpre.kmutnb.ac.th/esl/learning/index.php?article=ds18b20-temperature-sensor

วันอังคารที่ 8 กันยายน พ.ศ. 2558

Arduino Uno vs Banana Pi

วันนี้เราจะมาเปรียบเทียบคุณสมบัติตัว Microcontroller ระหว่าง Banana Pi VS Arduino กัน

ก่อนอื่นเราต้องมาทำความรู้จักกับ Banana Pi กันก่อน 

Banana Pi คู่แข่ง Raspberry Pi จากปรเทศจีน

           Banana Pi เป็น Single Board Computer ที่สร้างมาจากประเทศจีน ซึ่งเป็นบอร์ดไมโครคอนโทรลเลอร์ที่สามารถติดตั้งระบบปฏิบัติการได้คล้ายกับบอร์ด Raspberry Pi แต่มีคุณสมบัติที่มากกว่าด้วยดังนี้ มี CPU Allwinner A20 ARM Coretex-A7 Dual-Core 1GHz ที่ทำงานได้เร็วกว่า พร้อม GPUMali400MP2 ที่มี 2 คอร์ และ RAM 1GB DDR3 รองรับ SD Card และ SATA Harddisk ต่อกับจอแสดงผลผ่าน HDMI TVOUT หรือ LVDS เสียงผ่าน HDMI หรือ 3.5mm Audio Jack จ่ายไฟผ่านพอร์ต USB micro B มีพอร์ต USB Host 2.0 และ micro USB OTG พอร์ต Gigabit Ethernet พอร์ต 26-pin Extensible, พอร์ต Camera รองรับ OS ทั้ง Linux หลากหลาย Distribution และ Android



Banana Pi Vs Raspberry Pi

        จุดที่ทำให้ Banana Pi เป็นคู่แข่งของ Raspberry Pi น่าจะเป็นตัวถังที่คล้ายกับ Raspberry Pi อย่างมาก ได้แก่ พอร์ต CSI เพื่อต่อกล้องถ่ายภาพภายนอก, DSI เพื่อต่อจอ LCD, พอร์ต RCA สำหรับต่อโทรทัศน์, และ GPIO รูปร่างเหมือนกันของ Raspberry Pi 

ระบบปฏิบัติการที่ใช้งานบน Banana Pi (OS):
Lubuntu (Light-weight Ubuntu),Raspbian (Raspberry Pi Debian Like),Android,Bananian (Banana Pi Debian Like),Berryboot,LeMedia,OpenSUSE,Fedora,Gentoo,Scratch,ArchLinux,OpenWRT,Open MediaVault
Specification:
SoC: Allwinner A20 (ARM Cortex-A7 Dual-Core, 1GHz, Mali400MP2 GPU)
System Memory: 1GB DDR3 SDRAM
Storage:
SD Card Slot
Extensible with SATA connection (2.5” SATA HDD with 5V)
Video output:
HDMI
Composite
Extensible with on-board LVDS connector
Audio I/O:Connectivity: Gigabit Ethernet
HDMI
On-Board Microphone Input
USB:
2 x USB 2.0 Ports
1 x OTG micro USB Port
1 x micro USB for Power Supply
Expansion:
Extensible 26-pin Headers
Camera Connector
Display Connector for LVDS and touch screen
Misc.Dimension: 92 x 60 mm
3 x On-Board Buttons (Power, Reset, Uboot Key)
IR Receiver
Weight: 48g
ภาพด้านหน้า

ภาพด้านหลัง 



Arduino คืออะไร
Arduino Uno

         Arduino อ่านว่า (อา-ดู-อิ-โน่ หรือ อาดุยโน่) เป็นบอร์ดไมโครคอนโทรเลอร์ตระกูล AVR ที่มีการพัฒนาแบบ Open Sourceคือมีการเปิดเผยข้อมูลทั้งด้าน Hardware และ Software ตัว บอร์ด Arduino ถูกออกแบบมาให้ใช้งานได้ง่าย จึงเหมาะสำหรับผู้เริ่มต้นศึกษา ทั้งนี้ยังสามารถดัดแปลง เพิ่มเติม พัฒนาต่อยอดทั้งตัวบอร์ดหรือโปรแกรมต่อได้อีกด้วย
         ความง่ายของบอร์ด Arduino ในการต่ออุปกรณ์เสริมต่างๆ คือผู้ใช้งานสามารถต่อวงจรอิเล็กทรอนิคส์จากภายนอกแล้วเชื่อมต่อเข้ามาที่ขา I/O ของบอร์ด หรือเพื่อความสะดวกสามารถเลือกต่อกับบอร์ดเสริม (Arduino Shieldประเภทต่างๆ เช่น Arduino XBee ShieldArduino Music ShieldArduino Relay ShieldArduino Wireless ShieldArduino GPRS Shield เป็นต้น มาเสียบกับบอร์ดบนบอร์ด Arduino แล้วเขียนโปรแกรมพัฒนาต่อได้เลย
เปรียบเทียบคุณสมบัติระหว่าง Banana Pi กับ Raspberry Pi และ Arduino 
Specification:
Banana Pi
Raspberry Pi
Arduino
Size
8.56cm×5.60cm
8.56cm×5.4cm
7.5cm×5.33cm
Processor
ARM Cortex-A7 Dual-Core
ARM11Series
ATMega 328
Clock Speed
1GHz
700MHZ
16 MHZ
RAM
1G DDR3
256MB
2KB
Flash
Up to 64GB on SD slot, up to 2T on 2.5 SATA disk
SD/MMC/SDIO
card slot
32 KB
Eeprom


1KB
Input Volvage
5V
5V
7-12V
Min Power
N/A
700mA(3.5W)
42mA(3W)
Digital GPIO
26
8
14
Analog Input
N/A
N/A
6 10-bit
PWM
1

6
TW/12C
1
1
2
SPI
1
1
1
UART
1
1
1
Dev IDE
Android,Firefox OS,Linux etc.
Debian GNU/Linux Fedora,Arch Linux
Arduino Tool
Ethernet
10/100/1000
10/100
N/A
USB Master
2 USB 2.0, 1 micro USB
2 USB 2.0
N/A
Video Out
CVBS and HDMI,RGB/LVDS
HDMI,Composite
N/A
Audio Output
3.5 mm jack
3.5 mm jack
N/A
หากผิดพลาดประการใดขออภัยมา ณ ที่นี้ด้วยนะคะ ขอบคุณค่
ที่มา : Banana Pi
        Arduino