Đỉnh NGUYỄN

life's a journey not a destination


Leave a comment

ZigBee – Thu thập dữ liệu từ các cảm biến và truyền về máy chủ thông qua web service – phần 4


1. Bước 7: Nạp chương trình vào Arduino Yún

1.1 Kết nối board mạch Arduino Yún với máy tính thông qua USB cable.

clip_image002

1.2 Viết chương trình

Mở Arduino IDE và viết chương trình:

#define DEBUG true // NOTE: the serial monitor must be opened if debug is true

#define DEBUG_LOG false

#include <SoftwareSerial.h>

#include <Bridge.h>

#include <HttpClient.h>

#include <FileIO.h>

#include <YunServer.h>

#include <YunClient.h>

const String WEB_SERVER_URL = “http://hss.f99.vn/api/&#8221;;

const char* LOG_DIRECTORY = “/www”; //”mnt/sd/arduino/www/Bridge”;

const char* LOG_FILE_NAME = “/www/log.txt”; //”mnt/sd/arduino/www/Bridge/log.txt”;

String AHWaddr;

bool contractIsActived = true;

char incomingByte = 0; // for incoming serial data

int ledPin = 13;

int rxPin = 11, txPin = 10;

SoftwareSerial mySerial(rxPin, txPin);

// Listen on default port 5555, the webserver on the Yun

// will forward there all the HTTP requests for us.

YunServer server;

void setup() {

// Initialize pins

pinMode(ledPin, OUTPUT);

pinMode(rxPin, INPUT);

pinMode(txPin, OUTPUT);

// Initialize Serial and SoftwareSerial

mySerial.begin(9600); // opens software serial port, sets data rate to 9600 bps

if (DEBUG) {

//this requires a serial cable between arduino and computer.

Serial.begin(4800);

delay(25);

// Wait until serial is opened. Blink fast while doing so

digitalWrite(ledPin, LOW);

while (!Serial) {

digitalWrite(ledPin, 1 – digitalRead(ledPin));

delay(25);

}

digitalWrite(ledPin, LOW);

}

// Initialize Bridge and FileSystem

Bridge.begin();

if (DEBUG_LOG) {

FileSystem.begin();

// Wait till the FileSystem-service is started

while (!FileSystem.exists(LOG_DIRECTORY))

delay(200);

}

// blink twice at startup

digitalWrite(ledPin, LOW);

digitalWrite(ledPin, HIGH); // first blink

delay(25);

digitalWrite(ledPin, LOW);

delay(100);

digitalWrite(ledPin, HIGH); // second blink

delay(25);

digitalWrite(ledPin, LOW);

// Listen for incoming connection only from localhost

// (no one from the external network could connect)

// server.listenOnLocalhost();

server.noListenOnLocalhost();

server.begin();

// Get Arduino hardware address (MAC)

AHWaddr = getHWaddr();

//writeToLogFile(“Arduino setup complete.”);

}

void loop() {

// Listen on default port 5555, the webserver on the Yun

// will forward there all the HTTP requests for us.

// Get clients coming from server

acceptRequest(server);

if (!contractIsActived) {

printDebug(“Contract is deactived. Please, contact your service provider!.”);

//if(mySerial.overflow())

// clear buffer

clearBuffer();

delay(25);

return;

}

/*incomingByte = ‘1’;

String result = getData(AHWaddr, String(“abcdefghijk”), String(incomingByte));

printDebug(result);

delay(500);*/

printDebug(“Available1: ” + String(mySerial.available()));

if (mySerial.available() > 0) {

while (mySerial.available() > 0 && mySerial.available() >= 9)

{

printDebug(“Available2: ” + String(mySerial.available()));

// read the incoming byte:

char buf[8];

int len = 8;

mySerial.readBytes(buf, len);

if (buf[0] == ‘4’) { // DEC: 4

// readStringUntil(‘\n’);

String sensorAddr = String(buf).substring(0, 8);

incomingByte = mySerial.read(); // sensor value

String sensorValue = String(incomingByte);

/*if(sensorAddr == “40ABB829”) {

incomingByte = mySerial.read(); // sensor value

sensorValue = sensorValue + String(incomingByte);

}*/

printDebug(“Received: HWaddr: 0013A200:” + sensorAddr + ” – Value: ” + sensorValue/* + ” – TimeStamp: ” + getTimeStamp()*/);

if (incomingByte != ‘0’) // value: 1 (DEC: 1, ASCII: 49)

{

//printDebug(“before send data”);

String result = putData(AHWaddr, sensorAddr, String(incomingByte));

printDebug(“Result: ” + result);

//printDebug(“end send data”);

// turn LED on

digitalWrite(ledPin, HIGH);

delay(25);

// turn LED off

digitalWrite(ledPin, LOW);

}

else

{

// turn LED off

digitalWrite(ledPin, LOW);

}

//printDebug(“before clear buffer”);

// clear buffer

clearBuffer();

//printDebug(“end clear buffer”);

}

}

Serial.flush();

}

delay(200);

}

/*——————————————————–

——– Bridge Library (for the Arduino Yun) ———-

——————————————————–*/

/*

Post data from Arduino to remote web server.

value: sensor value

http://arduino.cc/en/Tutorial/HttpClient

*/

void getData2(String AHWaddr, String SHWaddr, String value) {

// Initialize the client library

HttpClient client;

// Make a HTTP request:

//String url = String(“http://yun.f99.vn/api/yun/id=1?value=a&#8221;);

String url = String(WEB_SERVER_URL + String(“values?_ObjectMacAddress=”) + String(AHWaddr) + String(“&_MacAddress=”) + String(“0013A200:”) + String(SHWaddr) + String(“&_Signal=”) + String(value) + String(“&_Description=”) + String(“arduino%20yun%20test%20web%20service”));

//String url = “http://hss.f99.vn/api/values?_ObjectMacAddress=90:a2:da:fd:01:24&_MacAddress=5248656853564868&_Signal=49&_Description=arduino%20yun%20test%20web%20service&#8221;;

printDebug(“GET: ” + url);

//client.getAsynchronously(url);

client.get(url);

/*

int t = 1;

while(!client.ready() && t <= 40) {

delay(500);

t++;

}

if(t <= 40)

printDebug(” – [DONE]”, true);

else

printDebug(” – [TIME OUT]”, true);

*/

}

/*

Post data from Arduino to remote web server.

value: sensor value

http://arduino.cc/en/Tutorial/HttpClient

http://www.tutorialspoint.com/unix_commands/curl.htm

*/

String putData(String AHWaddr, String SHWaddr, String value) {

// Launch “curl http://domain.com&#8221; command

// curl is a command line utility that get the content of a url

Process p; // Create a process and call it “p”

p.begin(“curl”); // Process that launch the “cat” command

//p.addParameter(String(“–connect-timeout”/*seconds*/));

//p.addParameter(String(“10”));

//p.addParameter(String(“–max-time 10″/*seconds*/));

String url = String(WEB_SERVER_URL) + String(“values?_ObjectMacAddress=”) + String(AHWaddr) + String(“&_MacAddress=”) + String(“0013A200:”) + String(SHWaddr) + String(“&_Signal=”) + String(value) + String(“&_Description=”) + String(“arduino%20yun%20test%20web%20service”);

printDebug(“PUT: ” + url);

p.addParameter(url); // Add the cpuifo file path as parameter to cut

p.run(); // Run the process and wait for its termination

String result;

// Print command output on the Serial.

// A process output can be read with the stream methods

while (p.available() > 0) {

char c = p.read();

result += String(c);

}

return result;

}

/*

Post data from Arduino to remote web server.

value: sensor value

http://arduino.cc/en/Tutorial/HttpClient

*/

String postData(String AHWaddr, String SHWaddr, String value) {

// Launch “curl http://domain.com&#8221; command

// curl is a command line utility that get the content of a url

Process p; // Create a process and call it “p”

p.begin(“curl”); // Process that launch the “cat” command

String url = String(String(” –data-urlencode “” “) + String(“key1=value1”) + String(“&key2=value2″) + ” ” + WEB_SERVER_URL);

p.addParameter(url); // Add the cpuifo file path as parameter to cut

p.run(); // Run the process and wait for its termination

printDebug(“GET: ” + url);

String result;

// Print command output on the Serial.

// A process output can be read with the stream methods

while (p.available() > 0) {

char c = p.read();

result += String(c);

}

// Ensure the last bit of data is sent.

return result;

}

/*

Get Mac address

http://stackoverflow.com/questions/245916/best-way-to-extract-mac-address-from-ifconfig-output

ifconfig eth0 | grep -o -E ‘([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}’

*/

String getHWaddr() {

// Launch “cat /sys/class/net/eth1/address” command (shows Mac address info)

// cat is a command line utility that shows the content of a file

Process p; // Create a process and call it “p”

p.begin(“cat”); // Process that launch the “cat” command

p.addParameter(“/sys/class/net/eth1/address”); // Add the cpuifo file path as parameter to cut

p.run(); // Run the process and wait for its termination

String result;

// Print command output on the Serial.

// A process output can be read with the stream methods

while (p.available() > 0) {

char c = p.read();

result += String(c);

}

// Ensure the last bit of data is sent.

return result.substring(0, 17); // remove \n

}

/*

Get a string with the time stamp from linux via Bridge library.

Date format: MM/DD/YY HH:MM:SS

http://arduino.cc/en/Tutorial/TimeCheck

*/

String getTimeStamp() {

String result;

Process time;

// date is a command line utility to get the date and the time

// in different formats depending on the additional parameter

time.begin(“date”);

time.addParameter(“+%D %T”); // parameters: D for the complete date mm/dd/yy

// T for the time hh:mm:ss

time.run(); // run the command

// read the output of the command

while (time.available() > 0)

{

char c = time.read();

if (c != ‘\n’)

result += c;

}

return result;

}

/*

Write data into log file.

http://arduino.cc/en/Tutorial/YunDatalogger

*/

void writeToLogFile(String message) {

String dateTime = getTimeStamp();

File file = FileSystem.open(LOG_FILE_NAME, FILE_APPEND);

if (file)

{

file.println(dateTime + “: ” + message);

file.close();

}

}

/*

Clear all data in log file.

*/

void clearLogFile() {

FileSystem.remove(LOG_FILE_NAME);

}

/*——————————————————–

——————– WiFi Library ———————-

——————————————————–*/

// Not working (well well well)

String getXBeeAddr() {

// put the radio in command mode:

printDebug(“+++”);

String result;

// wait for the radio to respond with “OK\r”

char thisByte = 0;

while (Serial.available() > 0) {

thisByte = Serial.read();

result += String(thisByte);

}

return result;

}

/*——————————————————–

————- Bridge Library: Web Server —————

——————————————————–*/

/*

Use the Bridge library to access the digital and analog pins

on the board through REST calls. It demonstrates how

you can create your own API when using REST style

calls through the browser.

Possible commands created in this shetch:

* “/arduino/digital/13” -> digitalRead(13)

* “/arduino/digital/13/1” -> digitalWrite(13, HIGH)

* “/arduino/analog/2/123” -> analogWrite(2, 123)

* “/arduino/analog/2” -> analogRead(2)

* “/arduino/mode/13/input” -> pinMode(13, INPUT)

* “/arduino/mode/13/output” -> pinMode(13, OUTPUT)

* “/arduino/contract/status/1 -> active contact

This example code is part of the public domain

http://arduino.cc/en/Tutorial/Bridge

*/

void acceptRequest(YunServer server) {

// Get clients coming from server

YunClient client = server.accept();

// There is a new client?

if (client) {

// Process request

printDebug(“Ok ok”);

process(client);

// Close connection and free resources.

client.stop();

}

}

void process(YunClient client) {

// read the command

String command = client.readStringUntil(‘/’);

// is “digital” command?

if (command == “digital”) {

digitalCommand(client);

}

// is “analog” command?

if (command == “analog”) {

analogCommand(client);

}

// is “mode” command?

if (command == “mode”) {

modeCommand(client);

}

// is “contract” command?

if (command == “contract”) {

contractCommand(client);

}

}

void digitalCommand(YunClient client) {

int pin, value;

// Read pin number

pin = client.parseInt();

// If the next character is a ‘/’ it means we have an URL

// with a value like: “/digital/13/1”

if (client.read() == ‘/’) {

value = client.parseInt();

digitalWrite(pin, value);

}

else {

value = digitalRead(pin);

}

// Send feedback to client

client.print(F(“Pin D”));

client.print(pin);

client.print(F(” set to “));

client.println(value);

// Update datastore key with the current pin value

String key = “D”;

key += pin;

Bridge.put(key, String(value));

}

void analogCommand(YunClient client) {

int pin, value;

// Read pin number

pin = client.parseInt();

// If the next character is a ‘/’ it means we have an URL

// with a value like: “/analog/5/120”

if (client.read() == ‘/’) {

// Read value and execute command

value = client.parseInt();

analogWrite(pin, value);

// Send feedback to client

client.print(F(“Pin D”));

client.print(pin);

client.print(F(” set to analog “));

client.println(value);

// Update datastore key with the current pin value

String key = “D”;

key += pin;

Bridge.put(key, String(value));

}

else {

// Read analog pin

value = analogRead(pin);

// Send feedback to client

client.print(F(“Pin A”));

client.print(pin);

client.print(F(” reads analog “));

client.println(value);

// Update datastore key with the current pin value

String key = “A”;

key += pin;

Bridge.put(key, String(value));

}

}

void modeCommand(YunClient client) {

int pin;

// Read pin number

pin = client.parseInt();

// If the next character is not a ‘/’ we have a malformed URL

if (client.read() != ‘/’) {

client.println(F(“error”));

return;

}

String mode = client.readStringUntil(‘\r’);

if (mode == “input”) {

pinMode(pin, INPUT);

// Send feedback to client

client.print(F(“Pin D”));

client.print(pin);

client.print(F(” configured as INPUT!”));

return;

}

if (mode == “output”) {

pinMode(pin, OUTPUT);

// Send feedback to client

client.print(F(“Pin D”));

client.print(pin);

client.print(F(” configured as OUTPUT!”));

return;

}

client.print(F(“error: invalid mode “));

client.print(mode);

}

void contractCommand(YunClient client) {

String action;

int value;

// Read pin number

action = client.readStringUntil(‘s’);

// If the next character is a ‘/’ it means we have an URL

// with a value like: “/contract/status/1”

if (client.read() == 116/*’/’*/) {

value = client.parseInt();

contractIsActived = (value == 1) ? true : false;

}

else {

value = 0; // current status

}

// Send feedback to client

client.print(F(“Contract “));

client.print(action);

client.print(F(” set to “));

client.println(value);

}

/*——————————————————–

———————– Serial ————————-

——————————————————–*/

// Print debug information to serial and break line.

void printDebug(String s) {

if (DEBUG) {

Serial.println(s);

}

}

// Print debug info to serial with break line option

void printDebug(String s, bool breakLine) {

if (DEBUG) {

if (breakLine)

Serial.println(s);

else

Serial.print(s);

}

}

/*——————————————————–

——————– Cryptography ———————-

——————————————————–*/

void clearBuffer() {

// Serial.flush() has changed in Arduino 1.0. You can use the following instead: while(Serial.available()>0) Serial.read();

while (Serial.available() > 0)

Serial.read();

}

1.3 Nạp chương trình vào board mạch Arduino Yún

1. Chọn loại mạch là Arduino Yún.

clip_image003

2. Chọn cổng giao tiếp Serial tương ứng

clip_image004

3. Biên dịch mã nguồn

clip_image005

4. Nạp chương trình vào board mạch

clip_image006

Advertisements


Leave a comment

ZigBee – Thu thập dữ liệu từ các cảm biến và truyền về máy chủ thông qua web service – phần 3


1.1 Viết chương trình

Mở Arduino IDE, viết chương trình như sau:

const int ledPin = 13;

const int sensorPin = 4;

int incomingByte = 0; // for incoming serial data

void setup() {

// Initialize pins

pinMode(ledPin, OUTPUT);

pinMode(sensorPin, INPUT);

// Initialize Serial

Serial.begin(9600); // opens serial port, sets data rate to 9600 bps

// blink twice at startup

digitalWrite(ledPin, LOW);

delay(1000);

digitalWrite(ledPin, HIGH); // first blink

delay(50);

digitalWrite(ledPin, LOW);

delay(200);

digitalWrite(ledPin, HIGH); // second blink

delay(50);

digitalWrite(ledPin, LOW);

}

void loop() {

// send data from sender (router) to receiver (coordinator)

incomingByte = digitalRead(sensorPin);

Serial.write(“40ABB829”); // Hex: 5248656666565057

if (incomingByte == HIGH)

{

incomingByte = ‘1’;

Serial.write(incomingByte); // Arduino 1.0 compatibility

// turn LED on

digitalWrite(ledPin, HIGH);

//delay(2400);

// clear buffer

clearBuffer();

}

else

{

incomingByte = ‘0’;

//Serial.write(“40ABB829”); // Hex: 5248656666565057

Serial.write(incomingByte); // Arduino 1.0 compatibility

// turn LED off

digitalWrite(ledPin, LOW);

}

Serial.flush();

delay(800);

}

void clearBuffer() {

// Serial.flush() has changed in Arduino 1.0. You can use the following instead: while(Serial.available()>0) Serial.read();

while (Serial.available() > 0)

Serial.read();

}

1.2 Nạp chương trình vào board mạch Arduino Fio 1

1. Chọn loại mạch là Arduino Fio.

clip_image001

2. Chọn cổng giao tiếp Serial tương ứng

clip_image002

3. Biên dịch mã nguồn

clip_image003

4. Nhúng chương trình vào board mạch

clip_image004

2. Bước 4: Nạp chương trình vào Arduino Fio 2 (điều khiển Magnetic Sensor)

2.1 Kết nối board mạch Arduino Fio 2 với máy tính thông qua USB cable

Kết nối board mạch Arduino Fio với FTDI Basic breakout, sau đó kết nối FTDI Basic breakout với máy tính thông qua USB cable.

clip_image006

2.2 Viết chương trình

Mở Arduino IDE, viết chương trình như sau:

const int ledPin = 13;

const int sensorPin = 4;

int incomingByte = 0; // for incoming serial data

void setup() {

// Initialize pins

pinMode(ledPin, OUTPUT);

pinMode(sensorPin, INPUT);

// Initialize Serial

Serial.begin(9600); // opens serial port, sets data rate to 9600 bps

// blink twice at startup

digitalWrite(ledPin, LOW);

delay(1000);

digitalWrite(ledPin, HIGH); // first blink

delay(50);

digitalWrite(ledPin, LOW);

delay(200);

digitalWrite(ledPin, HIGH); // second blink

delay(50);

digitalWrite(ledPin, LOW);

}

void loop() {

// send data from sender (router) to receiver (coordinator)

incomingByte = digitalRead(sensorPin);

// door is opened

if (incomingByte == HIGH)

{

incomingByte = ‘1’;

Serial.write(“40AD580D”); // Hex: 5248656853564868

Serial.write(incomingByte); // Arduino 1.0 compatibility

// turn LED on

digitalWrite(ledPin, HIGH);

// clear buffer

clearBuffer();

}

else // door is closed

{

incomingByte = ‘0’;

// turn LED off

digitalWrite(ledPin, LOW);

}

delay(400);

}

void clearBuffer() {

// Serial.flush() has changed in Arduino 1.0. You can use the following instead: while(Serial.available()>0) Serial.read();

while (Serial.available() > 0)

Serial.read();

}

2.3 Nạp chương trình vào board mạch Arduino Fio 2

5. Chọn loại mạch là Arduino Fio.

clip_image001[1]

6. Chọn cổng giao tiếp Serial tương ứng

clip_image002[1]

7. Biên dịch mã nguồn

clip_image003[1]

8. Nhúng chương trình vào board mạch

clip_image004[1]

3. Bước 5: Kết nối Motion Sensor với board mạch Arduino Fio 1 và XBee 2

clip_image008

4. Bước 6: Kết nối Magnetic Sensor với board mạch Arduino Fio 2 và XBee 3

clip_image009


Leave a comment

ZigBee – Thu thập dữ liệu từ các cảm biến và truyền về máy chủ thông qua web service – phần 2


IV. Các bước thực hiện

1. Bước 1: Cấu hình thiết bị thu/phát (XBee) thứ 1 (coordinator)

1.1 Kết nối XBee với máy tính

Gắn bộ thu/phát sóng ZigBee vào XBee USB Adapter và kết nối với máy tính thông qua USB cable.

clip_image001

1.2 Cấu hình XBee dùng X-CTU

Mở X-CTU và thêm thiết bị (XBee) vào màn hình quản lý.

clip_image003

Thay đổi giá trị các tham số như sau:

ID – PAN ID: Gán PAN (Personal Area Network) ID cho mạng. Giá trị giống nhau cho tất cả các XBee trong mạng.

clip_image005

DL – Destination Address Low: Gán địa chỉ 32 / 64 bit ở mức thấp của bên nhận, giá trị 0x000000000000FFFF nghĩa là broadcast cho tất cả các thiết bị thuộc cùng ID – PAN ID.

clip_image007

BD – Baud Rate: tốc độ truyền dữ liệu. Giá trị giống nhau cho tất cả các XBee trong mạng.

clip_image009

Lưu cấu hình cho XBee với vai trò Zigbee Coordinator AT

clip_image011

2. Bước 2: Cấu hình thiết bị thu/phát (XBee) thứ 2 và 3 (router 1 và 2)

Tương tự như cấu hình cho XBee thứ 1 (coordinator), ta thay đổi giá trị các tham số sau:

ID – PAN ID: Gán PAN (Personal Area Network) ID cho mạng. Giá trị giống nhau cho tất cả các XBee trong mạng.

JV – Channel Verification: Nếu giá trị là Enabled[1] thì router sẽ xác định coordinator trong cùng mạng và tự động joined vào.

clip_image013

DL – Destination Address Low: Gán địa chỉ 32 / 64 bit ở mức thấp của bên nhận, 0x0000000000000000 là địa chỉ ở mức thấp của coordinator.

clip_image015

BD – Baud Rate: tốc độ truyền dữ liệu. Giá trị giống nhau cho tất cả các XBee trong mạng.

clip_image017

D3 AD3/DIO3 Configuration: Giá trị Digital Input [3].

IR IO Sampling Rate: 3E8

clip_image019

Lưu cấu hình cho XBee với vai trò ZigBee Router AT:

clip_image020

3. Bước 3: Nạp chương trình vào Arduino Fio 1 (điều khiển Motion Sensor)

3.1 Kết nối board mạch Arduino Fio 1 với máy tính thông qua USB cable

Kết nối board mạch Arduino Fio với FTDI Basic breakout, sau đó kết nối FTDI Basic breakout với máy tính thông qua USB cable.

clip_image022


Leave a comment

ZigBee – Thu thập dữ liệu từ các cảm biến và truyền về máy chủ thông qua web service – phần 1


I. Mô hình

Các thành phần

Mô hình ZigBee Wireless Mesh Network gồm 3 thành phần:

clip_image001

1. End Device

Hai end devices, mỗi end devices gồm 1 motion sensor (phát hiện chuyển động) hoặc 1 magnetic sensor (phát hiện đóng/mở cửa) được kết nối với board mạch Arduino Fio và bộ thu phát tín hiệu ZigBee.

2. Coordinator

Một coordinator, gồm 1 board mạch Arduino Yun được kết nối với Ethernet và bộ thu phát tín hiệu ZigBee.

clip_image003

Nguyên tắc hoạt động

A. Bên truyền tín hiệu (motion sensor)

1. Motion sensor có chức năng nhận diện chuyển động trong phạm vi 1100 và xa 7m. Giá trị dữ liệu là HIGH (có chuyển động) hoặc LOW (không có chuyển động).

2. Magnetic sensor có chức năng phát hiện đóng/mở cửa. Giá trị dữ liệu là LOW (cửa đang đóng) và HIGH (cửa mở).

3. Board mạch Arduino Fio đọc dữ liệu từ motion sensor và magnetic sensor thông qua cổng digital 4. Dữ liệu sẽ được gửi qua cổng Tx đến thiết bị thu phát sóng ZigBee và sóng sẽ được truyền đi đến các thiết bị khác.

B. Bên nhận tín hiệu (Arduino Yun)

4. Board mạch Arduino Yun sẽ đọc dữ liệu motion sensor và magnetic sensor từ bộ thu phát sóng ZigBee và thông qua cổng Rx.

5. Dữ liệu sau khi xử lý sẽ được gửi về web server thông qua web service để lưu xuống cơ sở dữ liệu.

II. Phần cứng

Chuẩn bị các thiết bị phần cứng sau:

Stt

Tên / mô tả thiết bị

Hình ảnh

Số lượng

Đơn giá (Chưa VAT, VND)

Thành tiền (chưa VAT, VND)

Ghi chú

1

Arduino Yún

clip_image005

1

1,800,000

1,800,000

Board mạch điều khiển tự động, nguồn mở

2

Micro USB Cable

clip_image007

2

70,000

140,000

Cáp cấp nguồn và nhúng chương trình vào các board mạch

3

XBee 2mW Wire Antenna – Series 2 (ZB)

clip_image009

3

700,000

2,100,000

Thiết bị thu phát sóng ZigBee

4

Dfrduino FIO (Arduino Compatible)

clip_image011

2

500,000

1,000,000

Thiết bị kết nối Xbee và sensor

5

Digital Infrared Motion Sensor (Cảm biến hồng ngoại)

clip_image013

1

170,000

170,000

Cảm biến hồng ngoại, phát hiện chuyển động

6

Digital Magnetic Sensor (Cảm biến từ tính)

clip_image015

1

80,000

80,000

Cảm biến từ tính, phát hiện đóng/mở cửa

7

FTDI Basic breakout

clip_image017

1

290,000

290,000

Dùng để lập trình DFRduino FIO

8

XBee USB Adapter V2

 

1

400,000

400,000

Dùng để cấu hình XBee thông qua cable và laptop

Tổng cộng (chưa VAT)

5,980,000

VAT (10%)

598,000

Tổng tiền

6,578,000

Lưu ý:

– Các thiết bị màu xanh dương chỉ được dùng trong lúc lập trình cho board mạch. Việc triển khai thực tế sẽ không bao gồm các thiết bị này.

– Bảng giá trên chưa bao gồm nguồn pin cấp riêng cho các cảm biến.

Như vậy, giá các thiết bị không bao gồm các thành phần sử dụng trong khi lập trình: 5,665,000 VNĐ (đã gồm VAT).

III. Phần mềm

Chuẩn bị các phần mềm sau:

1. X-CTU: dùng để cấu hình các tham số cho thiết bị XBee

Cài đặt X-CTU và các drivers cần thiết theo link sau:

http://www.digi.com/support/kbase/kbaseresultdetl?id=2125

2. Arduino IDE: dùng để lập trình Arduino Yun

Cài đặt Arduino IDE để lập trình Arduino Yun theo link sau:

http://arduino.cc/en/Main/Software#toc3


Leave a comment

Các board mạch dạng Open Source Hardware


A. Các giao thức điều khiển tự động hóa

1. X10 – UPB (Universal Powerline Bus)

clip_image002[6]

X10 là giao thức truyền thông có dây tốc độ cao, đã được ứng dụng từ những năm 70.

UPB là giao thức truyền thông qua đường dây điện, nhưng băng thông bị giới hạn và giao thức truyền dữ liệu có vấn đề với các nguồn đóng cắt hiện đại.

Ngoài ra, hệ thống luôn có rủi ro khi nhà hàng xóm sử dụng chung hệ thống phân phối điện, do tín hiệu điều khiển có thể truyền từ hệ thống này sang hệ thống kia gây các tác động không mong muốn.

2. Insteon

clip_image004[6]

Insteon là giao thức để thu hẹp khoản cách giữa các giao thức dựa vào dây và không dây, do đó, nó dùng cả hai. Nó tương thích với các thiết bị X10.

Z-Wave

clip_image005[6]

Z-Wave là giao thức không dây ra đời muộn nhưng đã phát triển nhanh chóng trong vài năm qua. Z-Wave có tổ chức ở Mỹ để quản lý các thiết bị do các nhà sản xuất khác nhau sao cho chúng tương thích với nhau.

Z-Wave dùng mạng gọi là “lưới mạng (mesh network)”, nghĩa là Z-Wave sẽ là cầu nối tín hiệu (vừa thu vừa phát) cho đến khi đạt đến đích dự định. Thiết bị Z-Wave dùng điện năng cực thấp, lý tưởng cho thiết bị dựa trên năng lượng pin.

ZigBee

clip_image007[6]

ZigBee là tiêu chuẩn truyền thông không dây 802 được xây dựng bởi IEEE. Giống như Z-Wave, nó tăng trưởng nhanh trong nhiều năm qua. Nó cũng dùng lưới mạng (mesh network) và tiêu thụ điện năng rất nhỏ.

Wi-Fi

clip_image009[6]

Wifi rất phổ biến, tuy nhiên có nhược điểm chính: các vấn đề can thiệp và băng thông. Các thiết bị kết nối Wifi sẽ cạnh tranh băng thông và làm chậm tín hiệu. Wifi cũng tiêu thụ rất nhiều năng lượng, không lý tưởng cho các thiết bị dùng pin.

BLE

clip_image011[6]

BLE là bluetooth năng lượng thấp, không phải giao thức chính, phạm vi phủ sóng hạn chế so với các giao thức khác.

Kết luận

Nên dùng giao thức Z-Wave hoặc ZigBee để giao tiếp giữa các thiết bị.

A. Các board mạch điều khiển tự động (có kết nối đi Internet)

1. Mạch Arduino Uno với Wifi/Ethernet shield

– Nhà sản xuất:Arduino.

– Website: http://www.arduino.cc/

– Giá bán: $29 (cho board mạch chính)

– Hệ điều hành: board mạch dạng micro controller với Firmware có thể lập trình.

– Ngôn ngữ lập trình: Wiring dựa trên C/C++.

clip_image012[6]

Mua Arduino ở Việt Nam

Arduino Uno R3 – 605,000 VNĐ

Arduino Ethernet Shield R3 – 935,000 VNĐ

XBee 2mW PCB Antenna – Series 2 (ZigBee Mesh) – 770,000 VNĐ

Tùy chọn

Arduino Wifi Shield – 2,200,000 VNĐ

2. Mạch Arduino Yun

– Giá bán: $74 (cho board mạch chính)

Bao gồm Arduino hỗ trợ Ethernet + Wifi.

clip_image013[6]

Mua Arduino Yun ở Việt Nam

Arduino Yun – 1,980,000 VNĐ

3. Mạch Spark Core

– Nhà sản xuất: Spark Devices (Italia).

– Website: https://www.spark.io/

– Giá bán: $39 (cho board mạch chính)

– Hệ điều hành: board mạch dạng micro controller với Firmware có thể lập trình.

– Ngôn ngữ lập trình: Ngôn ngữ lập trình của Spark Core dựa trên framework Wiring, chính vì vậy, việc lập trình cho Spark Core cũng tương tự như Arduino.

clip_image014[6]

Spark Core là một bo mạch rất nhỏ gọn được tích hợp vi điều khiển Cortex-M3 xung nhịp 72MHz, chip Wi-Fi Texas Instrument SimpleLink CC3000, RAM 20KB, bộ nhớ flash rời 2MB và tương thích với các dòng lệnh dùng cho bo mạch lập trình Arduino

Có thể kết hợp bo mạch này với các cảm biến để nhận biết chuyển động và truyền số liệu không dây tới máy tính, dùng chung với tấm pin mặt trời và camera để tạo nên một hệ thống giám sát không dây, hay tích hợp lên xe điều khiển đồ chơi.

Nền tảng đám mây Spark Cloud với một mạng lưới nhiều server sẽ cung cấp một bộ khung để các phần mềm viết cho Spark Core có thể chạy được và đảm bảo tính kết nối liên tục vào Internet.

Tóm tắt:: Arduino + Wi-Fi + ARM Cortex M3 + wireless programming + REST API = SPARK CORE.

Mua Spark Core ở Việt Nam

– Hiện chưa thấy chỗ nào bán

4. Mạch Raspberry Pi

– Nhà sản xuất: Raspberry Pi Foundation (Anh).

– Website: http://www.raspberrypi.org/

– Giá bán: $46 (cho board mạch chính Model B)

– Hệ điều hành: board mạch dạng mini computer với HĐH Linux có thể lập trình.

– Ngôn ngữ lập trình: C/C++, Java.

clip_image015[6]

Ứng dụng:

– Làm trung tâm giải trí đa phương tiên như smart internet TV.

– Kết hợp webcame làm hệ thống phát hiện chuyển động.

– Nhận diện khuôn mặt, điều khiển robot.

– Gửi nhận tin nhắn GMS với USB 3G.

– Điều khiển tắt / mở đèn.

Mua Raspberry Pi ở Việt Nam

Raspberry Pi Model B v2 – 995,000 VNĐ

Raspberry Pi Model B (UK) – 970,000 VNĐ

Kết luận

Nên dùng Arduino Yun


Leave a comment

Giới thiệu board mạch UDOO có thể chạy Android/Linux và tương thích với Arduino


Giới thiệu

Khởi đầu từ dự án “Android/Linux + Arduino embedded”, tìm kiếm nguồn tài trợ xây dựng board mạch mạnh hỗ trợ nhiều hệ điều hành. Dự án được tài trợ thành công trên Kickstarter.com vào giữa năm 2013. Công ty đứng đằng sau dự án UDOO là SECO USA Inc và Aidilab (http://www.aidilab.com/).

https://www.kickstarter.com/projects/udoo/udoo-android-linux-arduino-in-a-tiny-single-board

UDOO là 1 board mạch dạng máy tính nhỏ, có thể chạy Android hoặc Linux, tương thích với board mạch Arduino.

image

UDOO là board mạch phần cứng mở, chi phí thấp dựa trên kiến trúc vi xử lý ARM có thể Linux, Android.

UDOO có kích thước 4.33 inch x 3.35 inch (11 cm x 8.5 cm) và nguồn tiêu thụ năng lượng thấp.

image

The power of 4 Raspberry PI + Arduino DUE functionality = UDOO

Các tính năng

Hỗ trợ nhiều hệ điều hành

Board mạch này như một máy tính thu nhỏ, tương thích với Arduino và Android SDK.

UDOO hỗ trợ chạy các hành Android và Linux. Tại một thời điểm chạy được 1 hệ điều hành, có thể chuyển đổi giữa Android và Linux bằng cách thay thế Micro SD và khởi động lại hệ thống.

image

Hệ điều hành Linux

UDOO chạy như 1 máy tính độc lập dựa trên Linux Freescale i.MX 6 CPU và một phiên bản được tối ưu hóa của Linux Ubuntu cho kiến trúc ARM, được gọi là Linaro. Môi trường Linaro có đầy đủ mọi thứ cần để lập trình, ví dụ có thể dùng Arduino IDE để viết code và nhúng vào board mạch.

Hệ điều hành Android

Android 4.3 Jelly Bean chạy tốt trên UODD với đầy đủ tính năng của 1 thiết bị Android (các phiên bản tiếp theo của Android cũng sẽ được hỗ trợ).

Cảnh báo: UDOO I/O pins chỉ hỗ trợ 3.3V. Việc gắn các shield có điện thế cao hơn, như 5V, có thể làm hại đến board mạch. Chỉ dùng các shield tương thích (3.3V).

Vi xử lý mạnh dựa trên kiến trúc ARM

UDOO là 1 board mạch có vi xử lý mạnh dựa trên dual hoặc quard core ARM cortex-A9 CPU cho hiệu suất cao trên cả Android và Linux và 1 vi xử lý riêng cho GPIO.

image

Một số đặc điểm kỹ thuật chính:

·         Freescale i.MX 6 ARM Cortex-A9 CPU Dual/Quad core 1GHz

·         Integrated graphics, each processor provides 3 separated accelerators for 2D, OpenGL® ES2.0 3D and OpenVG

·         Atmel SAM3X8E ARM Cortex-M3 CPU (same as Arduino Due)

·         RAM DDR3 1GB

·         76 fully available GPIO

·         Arduino-compatible R3 1.0 pinout

·         HDMI and LVDS + Touch (I2C signals)

·         Ethernet RJ45 (10/100/1000 MBit)

·         WiFi Module

·         Mini USB and Mini USB OTG

·         USB type A (x2) and USB connector (requires a specific wire)

·         Analog Audio and Mic

·         SATA (Only Quad-Core version)

·         Camera connection

·         Micro SD (boot device)

·         Power Supply 12V and External Battery connector