Đỉnh NGUYỄN

life's a journey not a destination


Leave a comment

Hello XBee – Chương trình chat đơn giản giữa 2 XBee ở chế độ AT (AT Mode)


Mô hình

clip_image002

XBee thứ 1 (bên trái) đóng vai trò coordinator, XBee thứ hai (bên phải) đóng vai trò router. Cả hai XBee kết nối với laptop thông qua serial cable và hoạt động ở chế độ AT mode.

Chúng ta sẽ dùng terminal của XBee đóng vai trò router sẽ gửi dữ liệu qua môi trường không dây đến XBee đóng vai trò coordinator.

Bước 1: Kết nối XBee thứ 1 với laptop

Dùng FTDI cable (USB to Serial) để kết nối XBee thứ 1 (coordinator) với laptop. Đầu serial của FTDI cable sẽ kết nối với XBee, đầu USB còn lại sẽ kết nối với cổng USB của laptop.

clip_image003

https://www.sparkfun.com/products/9718

clip_image005clip_image007clip_image009

Bước 2: Kết nối XBee thứ 2 với laptop

Làm tương tự cho XBee thứ hai (router). Hoặc có thể kết nối XBee thứ 2 với laptop dùng USB Mini-B cable (USB 2.0 type A to Mini-B 5-pin). Đầu Mini-B 5-pin sẽ kết nối với XBee thông qua thiết bị trung gian là breadboard và xxxxx, đầu còn lại là USB 2.0 type A sẽ kết nối với laptop.

clip_image011

https://www.sparkfun.com/products/11301

clip_image012clip_image013

https://www.sparkfun.com/products/12002

clip_image014 clip_image015

Bước 3: Cấu hình cho XBee thứ 2 (router)

Mở X-CTU và chọn XBee thứ 2 (USB Serial Port (COM11)).

clip_image016

Mở tab “Modem Configuration”. Click nút “Read” để đọc cấu hình firmware của XBee, sau đó click “Restore” để xóa tất cả cấu hình firmware.

Click nút “Read” để đọc lại cấu hình firmware sau khi restore.

Cấu hình XBee thứ 2 đóng vai trò router với các thông số như sau:

clip_image017

Click nút “Write” để ghi cấu hình firmware vào XBee.

Bước 4: Cấu hình cho XBee thứ 1 (coordinator)

Vẫn để X-CTU đã cấu hình cho XBee thứ 2, mở tiếp 1 X-CTU nữa và chọn USB Serial Port (COM12) để cấu hình cho XBee thứ 1.

clip_image018

Mở tab “Modem Configuration”. Click nút “Read” để đọc cấu hình firmware của XBee, sau đó click “Restore” để xóa tất cả cấu hình firmware.

Click nút “Read” để đọc lại cấu hình firmware sau khi restore.

Cấu hình XBee thứ 1 đóng vai trò coordinator với các thông số như sau:

clip_image019

Click nút “Write” để ghi cấu hình firmware vào XBee.

Bước 5: Bắt đầu chat

Mở tab Terminal của cả 2 X-CTU và nhập dòng chữ “hello world” trên X-CTU đóng vai trò router (XBee thứ 2).

clip_image021

Chúc thành công!


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


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


4 Comments

XBee #1 – Cấu hình XBee


Thiết bị

 

Hai con XBee S2

clip_image001

Mô hình mạng

 

clip_image002

Coordinator: bộ điều phối. Bắt buộc phải có ít nhất 1 coordinator trong mỗi mạng.

Router: bộ định tuyến. Có thể tồn tại nhiều routers, có thể chuyển tiếp tín hiệu (signals) đến từ các routers/EPs khác. Không bao giờ ngủ (sleep).

End Point: điểm kết thúc. Có thể tồn tại nhiều EP, không thể chuyển tiếp tín hiệu (signals). Có thể ngủ (sleep) để tiết kiệm năng lượng.

Hai chế độ tương tác với XBee:

– AT

– API

Cắm thiết bị

 

FTDI cable: 1 đầu là USB, đầu kia là serial 6 chân (pin).

clip_image003

Cách #1: Cắm XBee vào FTDI cable và cắm cổng USB của FTDI cable vào máy tính.

clip_image004

Cách #2: dùng FTDI breakout

Kết nối XBee với mini USB cable dùng FTDI Basic Breakout thông qua Breadboard.

clip_image005

Cách #3: dùng Arduino

Chẩn bị board Arduino, cắm reset như hình

clip_image006

Cắm XBee vào Breadboard.

clip_image007

Kết nối dây TX với TX (data in) pin và RX với RX (data out) pin giữa Arduino và Breadboard đã cắm XBee.

clip_image008

Cấp nguồn cho Arduino board.

clip_image009

clip_image010

Cuối cùng, cắm mini USB cable vào.

clip_image011

Tải về và cài đặt X-CTU

 

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

Chạy X-CTU,

clip_image012

Lưu ý giá trị Baud là: 9600.

Click nút “Test / Query” để kiểm tra trạng thái và Serial Number của thiết bị.

clip_image013

Chuyển qua tab “Modem Configuration” để cấu hình XBee. Click nút “Read” để đọc cấu hình XBee.

clip_image014

Cấu hình PAN ID (Person Area Network): 1221. Nếu giá trị là 0, XBee có thể join bất kỳ mạng nào.

clip_image015


Leave a comment

XBee #2 – Chương trình chat đơn giản giữa 2 XBee ở chế độ AT


Ví dụ 1: Chat giữa 2 XBee (router và coordinator)

Mô hình

clip_image002

XBee thứ 1 (bên trái) đóng vai trò coordinator, XBee thứ hai (bên phải) đóng vai trò router. Cả hai XBee kết nối với laptop thông qua serial cable và hoạt động ở chế độ AT mode.

Chúng ta sẽ dùng terminal của XBee đóng vai trò router sẽ gửi dữ liệu qua môi trường không dây đến XBee đóng vai trò coordinator.

Bước 1: Kết nối XBee thứ 1 với laptop

Dùng FTDI cable (USB to Serial) để kết nối XBee thứ 1 (coordinator) với laptop. Đầu serial của FTDI cable sẽ kết nối với XBee, đầu USB còn lại sẽ kết nối với cổng USB của laptop.

clip_image003

https://www.sparkfun.com/products/9718

clip_image005clip_image007clip_image009

Bước 2: Kết nối XBee thứ 2 với laptop

Làm tương tự cho XBee thứ hai (router). Hoặc có thể kết nối XBee thứ 2 với laptop dùng USB Mini-B cable (USB 2.0 type A to Mini-B 5-pin). Đầu Mini-B 5-pin sẽ kết nối với XBee thông qua thiết bị trung gian là breadboard và xxxxx, đầu còn lại là USB 2.0 type A sẽ kết nối với laptop.

clip_image011

https://www.sparkfun.com/products/11301

clip_image012clip_image013

https://www.sparkfun.com/products/12002

clip_image014 clip_image015

Bước 3: Cấu hình cho XBee thứ 2 (router)

Mở X-CTU và chọn XBee thứ 2 (USB Serial Port (COM11)).

clip_image016

Mở tab “Modem Configuration”. Click nút “Read” để đọc cấu hình firmware của XBee, sau đó click “Restore” để xóa tất cả cấu hình firmware.

Click nút “Read” để đọc lại cấu hình firmware sau khi restore.

Cấu hình XBee thứ 2 đóng vai trò router với các thông số như sau:

clip_image017

Click nút “Write” để ghi cấu hình firmware vào XBee.

Bước 4: Cấu hình cho XBee thứ 1 (coordinator)

Vẫn để X-CTU đã cấu hình cho XBee thứ 2, mở tiếp 1 X-CTU nữa và chọn USB Serial Port (COM12) để cấu hình cho XBee thứ 1.

clip_image018

Mở tab “Modem Configuration”. Click nút “Read” để đọc cấu hình firmware của XBee, sau đó click “Restore” để xóa tất cả cấu hình firmware.

Click nút “Read” để đọc lại cấu hình firmware sau khi restore.

Cấu hình XBee thứ 1 đóng vai trò coordinator với các thông số như sau:

clip_image019

Click nút “Write” để ghi cấu hình firmware vào XBee.

Bước 5: Bắt đầu chat

Mở tab Terminal của cả 2 X-CTU và nhập dòng chữ “hello world” trên X-CTU đóng vai trò router (XBee thứ 2).

clip_image021

Ví dụ 2: Chương trình chat giữa 2 XBee (cải tiến)

Mô hình

clip_image023

XBee thứ 1 (bên trái) đóng vai trò coordinator, XBee thứ hai (bên phải) đóng vai trò router. Cả hai XBee kết nối với Arduino boar thông qua pin TX, RX và hoạt động ở chế độ AT mode. Arduino board sẽ kết nối trực tiếp với laptop thông qua mini USB cable.

Chúng ta sẽ dùng terminal của XBee đóng vai trò router sẽ gửi dữ liệu qua môi trường không dây đến XBee đóng vai trò coordinator.

Bước 1: Kết nối XBee thứ 1 với Arduino và laptop

Kết nối XBee 1 với Arduino thông qua breadboard. RX với RX, TX với TX.

clip_image024

Cable đỏ và xanh dương là để cấp nguồn (xem bài 1).

clip_image025

Bước 2: Kết nối XBee thứ 2 với Arduino và laptop

clip_image026

Bước 3: Viết mã lập trình

Bên tay trái là router, bên tay phải là coordinator.

clip_image028

Bước 4: Upload chương trình và xem kết quả

Nhấn nút “Upload” để tải chương trình lên cả 2 XBee. Nhấn nút “Serial Monitor” ở góc trên bên phải để xem kết quả.

clip_image030

clip_image032


Leave a comment

Hướng dẫn về Arduino Yún


Arduino Yún là 1 board mạch không giống với các board mạch thuộc họ Arduino khác. Trong khi việc lập trình tương tự Arduino Leonardo và dùng cùng bộ xử lý, ATmega32U4, nó cũng có thêm 1 bộ xử lý, Atheros AR9331, chạy Linux là OpenWrt wireless stack. Lập trình 32U4 thông qua USB giống hệt với Arduino Leonardo. Một khi bạn đã cấu hình Yún kết nối với mạng WiFi, bạn có thể lập trình 32U4 thông qua WiFi.

image

https://www.sparkfun.com/products/12053

Để kết nối Arduino Yún vào máy tính, bạn cần 1 Micro-B USB cable. USB cable này cung cấp nguồn và dữ liệu cho board. Khi lập trình Yún, bạn phải chọn Arduino Yún từ Tools > Board trong Arduino IDE. Yún chỉ được hỗ trợ bởi Arduino IDE 1.5.4 trở lên.

image

https://www.sparkfun.com/products/11301

Sự khác biệt so với Arduino Leonardo

image

Ngoài con chip 32U4, Yún có thêm 1 vi xử lý, Atheros AR9331, chạy Linux cho hệ thống nhúng tên OpenWrt-Yun, dựa trên OpenWrt. Bao gồm 1 bản cài đặt đầu đủ Python 2.7. Yún có 1 số đặc tính vật lý và kết nối khác với Leonardo. Có 1 khe cắm SD trên board mạch, jack cắm Ethernet, và 1 kết nối USB-A Host. Không có kết nối nguồn trên Yún; nó được cấp nguồn thông qua kết nối micro-USB.

Board mạch dùng nguồn 5V. Nếu cấp nguồn cho Yún hơn 5V, có thể sẽ làm hỏng nó. Nếu không cấp nguồn cho Yún từ kết nối micro-USB, có thể dùng nguồn cho Vin và 5V pins trên board. Khuyến khích cấp nguồn cho Yún từ kết nối USB bất cứ khi nào có thể. Các kết nối SD, Ethernet và USB-A không kết nối vật lý với bộ xử lý 32U4, chúng được kết nối với AR9331.

Các chức năng 32U4 của Yún giống như Leonardo, ngoại trừ không thể dùng Serial1. Nó được dành riêng để giao tiếp với vi xử lý AR9331. Yún có WiFi module có sẵn trên board, cho phép nó kết nối với 1 wireless router, hoặc hoạt động như 1 access point. Các bộ xử lý 32U4, WiFi, và AR9331 tất cả đều có nút reset riêng.

image

Có 1 số đèn LEDs trạng thái trên Yún, thể hiện nguồn, kết nối WLAN, kết nối WAN và USB. Ngoài ra pin 13 được kết nối với 1 trong những đèn trạng thái.

image

OpenWrt – Yun

Yún chạy 1 bản phân phối Linux gọi là OpenWrt-Yun, dựa trên OpenWrt. Trong khi nó có thể cấu hình hệ thống từ dòng lệnh, có 1 trang web cho phép cấu hình nhiều tùy chọn khác nhau có sẵn. Giao diện (được gọi là LuCi) cho phép truy cập hầu hết mọi thiết lập bạn cần duy trì giao diện WiFi. Truy cập vào giao diện web được mô tả dưới đây.

Để cài đặt phần mềm thêm vào OpenWrt-Yun, dùng trình quản lý gói của Linux opkg. Thêm thông tin cách quản lý và 1 số lệnh cơ bản, xem trang Yún package manager. Khi giao tiếp với hệ thống OpenWrt-Yun, dùng dòng lệnh hoặc truy cập thông qua thư viện Bridge của Arduino, hoặc thông qua SSH. Nếu không quen với dòng lệnh, có thể đọc 1 số vấn đề cơ bản thường dùng trong lập trình.

Python

OpenWrt-Yun cài đặt sẵn Python 2.7, có thể viết các ứng dụng hoặc kịch bản. Tìm hiểu thêm về Python, xem trang Python 2.7 documentation. Nếu mới tiếp cận Python lần đầu, xem “Learn Python the Hard Way” sẽ gồm mọi thứ bạn cần biết để bắt đầu và chạy mã kịch bản của riêng mình.

External storage trên Yún

Bộ nhớ xây dựng sẵn trong Yún có 1 số giới hạn về ghi. Có thể dùng bộ nhớ ngoài như microSD card hoặc USB để lưu trữ dữ liệu, mã kịch bản, các trang web,… Để truy cập và lưu thông tin lên đĩa thông qua 32U4, cần có 1 thư mục tên arduino nằm ở gốc của đĩa.

Web services

OpenWrt-Yun dùng REST cho client và server. REST là viết tắt của “Representational State Transfer”. Nó là kiến trúc phần mềm để tương tác với nhiều phần khác nhau của phần cứng Arduino thông qua URL. Mặc định, truy cập REST API được bảo vệ bởi mật khẩu. Để thay đổi thiết lập này, vào bảng điều khiển Yún. Ở cuối trang, bạn sẽ thấy nút để thay đổi quyền truy cập.

image

Giới thiệu khái niệm REST, xem tại đây.

Có 2 REST end point được thừa nhận bởi Yún:

         /arduino

         /data

         /mailbox

Thư mục “/arduino” không có bất cứ điều gì được cấu hình trước. Bất cứ thứ gì được thêm vào URL sau khi end point sẽ được truyền từ web server đến sketch trên 32U4. Bạn có thể định nghĩa các API trong sketch. Xem ví dụ Bridge để xem cách truy cập vào các chân (pin) trên board.

/data” để truy cập các lưu trữ key/value nội bộ. Các giá trị có sẵn:

         /put/KEY/VALUE: lưu 1 giá trị bên trong vùng lưu trữ

         /get/KEY: lấy giá trị có khóa yêu cầu theo dạng JSON

         /get: lấy danh sách toàn bộ vùng lưu trữ theo dạng JSON

         /delete: xóa vùng lưu trữ nội bộ

mailbox” được dùng để thêm thông điệp vào 1 hàng đợi gọi là MailBox. Hàng đợi thông điệp được lưu bên trong hệ thống Linux và có thể được đọc bởi Arduino microcontroller. Lời gọi REST có sẵn:

         mailbox/message

Resetting the processors (AR9331, WiFi, và 32U4)

Để restart AR9331, reboot OpenWrt-Yun, nhấn “YÚN RST” reset button gần các chân đầu vào analog và các đèn LED trên board.

Để restart 32U4 và restart Arduino sketch đã được cài đặt hiện tại, nhấn nút kê bên cạnh cổng Ethernet 2 lần.

Nút reset cho WiFi nằm kế bên cổng USB-A, khi nhấn nút, đèn WLAN sẽ nhấp nháy.

Nếu bạn di chuyển sang 1 mạng khác và không thể truy cập không dây đến Yún thông qua giao diện web, bạn có thể reset cấu hình mạng của Yún bằng cách nhấn nút Wifi reset lâu hơn 5s nhưng ít hơn 30s, bộ xứ lý AR9331 sẽ khởi động lại (reboot). Cấu hình WiFi sẽ bị reset và Yún sẽ start mạng WiFi của nó Arduino Yún-XXXXXXXXXXXX. Bất kỳ các cấu hình/ thay đổi khác sẽ được giữ lại. Để reset bản phân phối OpenWrt-Yun về trạng thái ban đầu, nhấn nút WiFi reset ít nhất 30s. Board sẽ trở lại trạng thái ban đầu như thể đã được reflashed hoặc vừa lấy ra khỏi hộp. Điều này sẽ hủy bỏ tất cả các tập tin đã cài đặt và các cấu hình mạng.

Serial re-enumeration on reset

Từ khi Yún không có chịp chuyên dụng để xử lý giao tiếp nối tiếp (serial), nghĩa là các serial port là ảo – nó là thủ tục phần mềm, cả trên hệ điều hành và trên chính board mạch. Cũng như máy tính của bạn tạo ra 1 thể hiện của serial port driver khi bạn cắm bất kỳ Arduino, 32U4 tạo 1 thể hiện serial bất cứ khi nào nó chạy bootloader. Board là 1 thể hiện của trình điều khiển Connected Device Class (CDC) của USB.

Điều này có nghĩa rằng mỗi khi reset lại 32U4, kết nối USB serial sẽ bị phá vỡ và tái lập. Board sẽ biến mất khỏi danh sách serial port, và danh sách sẽ tái liệt kê. Bất kỳ chương trình nào mở kết nối serial đến Yún sẽ bị mất kết nối. Điều này trái ngược với Arduino Uno khi bạn có thể reset lại vi xử lý chính (ATmega328P) mà không đóng kết nối USB (được duy trì bởi vi xử lý phụ ATmega8U2 hoặc ATmega16U2). Sự khác biệt này có ý nghĩa khi cài đặt trình điều khiển, tải lên và giao tiếp.

Không được reset khi bạn mở serial port

Yún không restart sketch khi bạn mở 1 serial port trên máy tính. Nghĩa là bạn không nhìn thấy dữ liệu serial đã được gửi đến máy tính từ board, bao gồm, ví dụ, hầu hết dữ liệu được gửi trong setup(). Điều này cũng áp dụng cho Console, mô tả dưới đây.

Điều này nghĩa là nếu bạn đang dùng bất kỳ Serial hay Console print(), println() hoặc write() trong setup(), chúng sẽ không xuất hiện khi bạn mở giám sát serial hoặc kết nối Console. Để làm việc này, bạn có thể kiểm tra nếu port được mở như sau:

// stops the program until Serial Monitor is opened
  
while (!Serial) ;

hoặc

// stops the program until Console is opened
  
while (!Console) ;

Cài đặt trình điều khiển cho Yún

Windows

Với Windows, có trình cài đặt cho IDE và drivers.

Tải về Arduino IDE 1.5.4 hoặc mới hơn và double-click tập tin cài đặt.

image

Đồng ý license, click nút “I agree”.

image

Mặc định, tất cả các thành phần có sẵn được chọn. Chúng gồm IDE, drivers và shortcuts.

image

Chọn vị trí thư mục cài IDE

image

Quá trình cài đặt

image

Nếu chọn cài đặt driver, 1 hộp hoại sẽ xác nhận lựa chọn này

image

Khi cài đặt hoàn tất, nhấn nút close.

NB: Yún dùng dịch vụ Bonjour để tự động phát hiện 1 mạng không dây. Dịch vụ này mặc định chưa có trong Windows. Nếu chưa cài đặt Bonjour, có thể tải về từ đây. Ngoài ra, nên chắc rằng các chương trình anti-virus không chặn cổng giao tiếp 5353.

Cấu hình onboard WiFi

Yún có thể hoạt động như access point, nó cũng có thể kết nối với 1 mạng đã có. Hướng dẫn này chỉ bạn cách kết nối Yún vào 1 mạng không dây. Yún có thể kết nối với mạng không dây không được mã hóa, cũng như các mạng hỗ trợ mã hóa WEP, WPA, và WPA2.

Khi lần đầu bật nguồn cho Yún, nó tạo mạng WiFi tên ArduinoYun-XXXXXXXXXXXX. Kết nối máy tính của bạn với mạng này.

image

Một khi bạn nhận được 1 địa chỉ IP, mở trình duyệt web và nhập http://arduino.local hoặc 192.168.240.1 trong thanh địa chỉ. Sau vài phút, 1 trang web xuất hiện yêu cầu mật khẩu. Nhập “arduino” và nhấn nút Log In.

image

Bạn sẽ thấy 1 trang với 1 số thông tin chuẩn đoán các kết nối mạng hiện tại. Đầu tiên là giao diện WiFi của bạn, thứ hai đến kết nối Ethernet của bạn. Nhấn vào nút Configuration để tiến hành.

image

Trên trang mới, bạn sẽ cấu hình Yún, đặt 1 tên duy nhất và xác định những gì mạng muốn kết nối đến.

Tại trường Yún NAME, đặt 1 tên duy nhất cho Arduino. Bạn sẽ dùng để tham chiếu đến nó trong tương lai. Chọn 1 mật khẩu 8 ký tự cho Arduino của bạn. Nếu bỏ trống trường này, hệ thống giữ mật khẩu mặc định là arduino.

Nếu muốn, bạn thiết lập timezone và country. Khuyến khích thiết lập các tùy chọn này, nó giúp kết nối với mạng WiFi cục bộ.

Nhập tên mạng WiFi bạn muốn kết nối đến. Chọn loại bảo mật và nhập mật khẩu.

image

Khi nhấn nút Configure & Restart, Arduino sẽ tự reset và join vào 1 mạng chỉ định. Mạng Arduino sẽ shutdown sau vào phút.

image

Bây giờ bạn có thể join vào mạng đã gán cho Yún.

Lập trình 32U4 thông qua WiFi

Khi Yún cùng mạng với máy tính, bạn có thể kết nối không dây để lập trình nó. Sau khi cấu hình Yún, kết nối vào mạng mà bạn đã chỉ định trong thiết lập cấu hình. Mở Arduino IDE, vào Tools > Port, bạn sẽ thấy 1 mục liệt kê tên của Yún và địa chỉ IP của nó. Trong menu Board, chọn Arduino Yún.

Mở ví dụ Blink (File > Examples > 01Basics > Blink) và upload sketch vào board. Bạn sẽ được nhắc mật khẩu quản trị. Khi chương trình đã được uploaded, vi xử lý 32U4 sẽ khởi động lại. Bạn sẽ thấy đèn LED kết nối với chân (pin) 13 nhấp nháy.

Dùng onboard Ethernet

Khi kết nối Yún vào mạng có dây với cáp ethernet, nó sẽ cố gắng kết nối tự động với DHCP. Board sẽ hiển thị trên menu port giống như thông qua WiFi.

Nếu muốn kết nối trực tiếp Yún vào máy tính, hoặc cấu hình interface của máy tính để có địa chỉ IP tĩnh, hoặc hoạt động như 1 DHCP server.

NB: ethernet interface là eth1, không phải eth0.

Giao tiếp với OpenWrt-Yun thông qua Bridge

Thư viện Bridge cho phép giao tiếp giữa Arduino và OpenWrt-Yun. Có các lớp tiện ích khác nhau cho các loại giao tiếp khác nhau giữa 2, mô tả sau đây, và sâu hơn trên trang tham khảo thư viện Bridge.

image

WiFi và Ethernet interface, USB host và SD card tất cả được kết nối vào AR9331. Thư viện Bridge cho phép bạn làm việc với các thiết bị này, cũng như chạy các script và giao tiếp với web service.

Console

Console, dựa trên Bridge, cho phép gửi thông tin từ Yún đến 1 máy tính như đã làm với serial monitor, nhưng không dây. Nó tạo 1 kết nối bảo mật giữa Yún và máy tính thông qua SSH.

Load các thành phần sau vào Yún của bạn:

 

#include <Console.h>

const int ledPin = 13; // the pin that the LED is attached to
int incomingByte;      // a variable to read incoming serial data into

void setup() {
  
// initialize serial communication:
  Bridge.
begin();
  Console.
begin(); 

  while (!Console){
    ; 
// wait for Console port to connect.
  }
  Console.
println("You’re connected to the Console!!!!");
  
// initialize the LED pin as an output:
  
pinMode(ledPin, OUTPUT);
}

void loop() {
  
// see if there’s incoming serial data:
  
if (Console.available() > 0) {
    
// read the oldest byte in the serial buffer:
    incomingByte = Console.
read();
    
// if it’s a capital H (ASCII 72), turn on the LED:
    
if (incomingByte == ‘H’) {
      
digitalWrite(ledPin, HIGH);
    } 
    
// if it’s an L (ASCII 76) turn off the LED:
    
if (incomingByte == ‘L’) {
      
digitalWrite(ledPin, LOW);
    }
  }
  
delay(100);
}

 

 

Để thấy Console, chọn tên của Yún và IP address trong menu Port. Yún chỉ hiển thị trong menu Ports nếu máy tính trong cùng mạng LAN với Yún. Nếu board trong 1 mạng khác, bạn không nhìn thấy nó trong menu Ports. Mở Port Monitor. Bạn sẽ được nhắc mật khẩu của Yún. Bạn cũng có thể nhìn thấy Console bằng cách mở cửa sổ terminal và nhập:

ssh root@yourYunsName.local ‘telnet localhost 6571’

sau đó nhấn Enter.

NB: Nếu dùng Windows, phải cài terminal emulator. PuTTY là 1 sự lựa chọn, nhưng bạn sẽ nhập 2 lệnh trên riêng biệt.

Nhập ‘H’để bật đèn LED trên chân (pin) 13 và nhập ‘L’ để tắt.

Process

Lệnh Process cho phép chạy các tiến trình Linux trên OpenWrt-Yun thông qua Arduino. Trong ví dụ sau, OpenWrt-Yun sẽ kết nối đến 1 server với curl, và tải 1 số ASCII text. Nó in văn bản (text) trong kết nối serial.

 

#include <Process.h>

void setup() {
  
// Initialize Bridge
  Bridge.
begin();

  // Initialize Serial
  
Serial.begin(9600);

  // Wait until a Serial Monitor is connected.
  
while (!Serial);

  // run various example processes
  runCurl();
}

void loop() {
  
// Do nothing here.
}

void runCurl() {
  
// Launch "curl" command and get Arduino ascii art logo from the network
  
// curl is command line program for transferring data using different internet protocols
  Process p;        
// Create a process and call it "p"
  p.
begin("curl");  // Process that launch the "curl" command
  p.
addParameter("http://arduino.cc/asciilogo.txt&quot;); // Add the URL parameter to "curl"
  p.
run();      // Run the process and wait for its termination

  // Print arduino logo over the Serial
  
// A process output can be read with the stream methods
  
while (p.available()>0) {
    
char c = p.read();
    
Serial.print(c);
  }
  
// Ensure the last bit of data is sent.
  
Serial.flush();
}

 

 

Dùng Bridge để truyền thông tin giữa các processors

Bridge cho phép truyền thông tin giữa 2 processors dùng cặp key/value. Ví dụ cách dùng thư viện Bridge truy xuất các chân digital và analog trên board thông qua lời gọi REST. Minh họa cách tạo API của riêng bạn khi dùng lời gọi theo phong cách REST thông qua trình duyệt. Khi chạy ví dụ này, đảm bảo máy tính trong cùng mạng với Yún. Khi bạn lập trình trên board, bạn có thể request value trên 1 chân (pin), ghi value vào 1 chân (pin), và cấu hình 1 chân (pin) như input hoặc output.

Khi mật khẩu REST bị tắt, bạn có thể dùng trình duyệt với cấu trúc URL sau:

         http://myArduinoYun.local/arduino/digital/13 : calls digitalRead(13);

         http://myArduinoYun.local/arduino/digital/13/1 : calls digitalWrite(13,1);

         http://myArduinoYun.local/arduino/analog/9/123 : analogWrite(9,123);

         http://myArduinoYun.local/arduino/analog/2 : analogRead(2);

         http://myArduinoYun.local/arduino/mode/13/input : pinMode(13, INPUT);

         http://myArduinoYun.local/arduino/mode/13/output : pinMode(13, OUTPUT);

Bạn có thể dùng lệnh curl từ dòng lệnh thay vì trình duyệt.

Bạn cần include các thư viện Bridge, YunServer, và YunClient.

#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h>

Tạo 1 server cho phép Yún lắng nghe các kết nối từ client.

YunServer server;

Trong setup(), start giao tiếp serial cho mục đích debug, và bật đèn LED trên chân 13 trong khi Bridge bắt đầu. Bridge.begin() đang khóa, và cần 2s để hoàn thành. Một khi Bridge đã start up, tắt đèn LED.

void setup() {
  
Serial.begin(9600);
  
pinMode(13,OUTPUT);
  
digitalWrite(13, LOW);
  Bridge.
begin();
  
digitalWrite(13, HIGH);

Trong phần thứ 2 của setup(), nói với thể hiện của Yún server  lắng nghe các kết nối vào chỉ từ localhost. Các kết nối đến OpenWrt-Yun sẽ được truyền cho 32U4 processor để parsing và điều khiển các chân (pins).

Điều này xảy ra trên cổng 5555. Start server với server.begin().

server.listenOnLocalhost();
  server.
begin();
}

Trong loop(), bạn tạo 1 thể hiện của YunClient để quản lý các kết nối. Nếu client kết nối, xử lý các yêu cầu trong 1 hàm (mô tả dưới đây) và đóng kết nối khi hoàn thành.

Đặt 1 delay ở cuối hàm loop() có ích giúp giữ vi xử lý không ảnh hưởng quá nhiều đến công việc.

void loop() {
  YunClient client = server.
accept();

  if (client) {
    process(client);
    client.
stop();
  }

  delay(50); 
}

Tạo 1 hàm tên process chấp nhận YunClient làm đối số. Đọc lệnh bằng cách tạo 1 chuỗi để giữ thông tin vào. Parse lệnh REST theo chức năng của nó (digital, analog, …) và truyền thông tin vào hàm có tên phù hợp.

void process(YunClient client) {
  String command = client.
readStringUntil(‘/’);

  if (command == "digital") {
    digitalCommand(client);
  }
  
if (command == "analog") {
    analogCommand(client);
  }
  
if (command == "mode") {
    modeCommand(client);
  }
}

Tạo 1 hàm liên quan đến các lệnh digital. Chấp nhận client làm đối số. Tạo 1 số biến cục bộ để lưu giữ pin và value của lệnh.

void digitalCommand(YunClient client) {
  
int pin, value;

Parse request của client cho pin để làm việc dùng client.parseInt().

Nếu ký tự sau pin là 1 “/”, nghĩa là URL sẽ có giá trị là 1 hoặc 0 theo sau. Giá trị này sẽ gán 1 giá trị cho pin, bật nó thành HIGH hoặc LOW. Nếu không có dấu “/”, đọc giá trị từ pin chỉ định.

pin = client.parseInt();

  if (client.read() == ‘/’) {
    value = client.
parseInt();
    
digitalWrite(pin, value);
  } 
  
else {
    value = 
digitalRead(pin);
  }

In giá trị cho client và cập nhật datastore với giá trị pin hiện tại.

Bằng cách gói giá trị cho client trong hàm F(), bạn sẽ in dưới dạng bộ nhớ flash. Điều này giúp tiết kiệm không gian trong SRAM, nó hữu ích với chuỗi dài như URL.

Key sẽ là pin và type. Ví dụ D2 sẽ được lưu cho digital pin 2. Giá trị sẽ là bất cứ giá trị nào pin đang được gán, hoặc đã được đọc từ pin.

client.print(F("Pin D"));
  client.
print(pin);
  client.
print(F(" set to "));
  client.
println(value);

  String key = "D";
  key += pin;
  Bridge.
put(key, String(value));
}

Tạo 1 hàm xử lý các lời gọi analog theo cách tương tự, ngoại trừ thiết lập key là A thay vì D khi làm việc với các chân đầu vào analog.

void analogCommand(YunClient client) {
  
int pin, value;

  pin = client.parseInt();

  if (client.read() == ‘/’) {
    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);

    String key = "D";
    key += pin;
    Bridge.
put(key, String(value));
  }
  
else {
    value = 
analogRead(pin);

    client.print(F("Pin A"));
    client.
print(pin);
    client.
print(F(" reads analog "));
    client.
println(value);

    String key = "A";
    key += pin;
    Bridge.
put(key, String(value));
  }
}

Tạo nhiều hàm xử lý các thay đổi pin mode. Chấp nhận YunClient làm tham số, và tạo biến cục bộ lưu giữ pin number. Đọc giá trị pin giống như đã làm cho hàm digital và analog.

void modeCommand(YunClient client) {
  
int pin;
  pin = client.
parseInt();

Kiểm tra để đảm bảo URL hợp lệ.

if (client.read() != ‘/’) {
    client.
println(F("error"));
    
return;
  }

Nếu URL hợp lệ, lưu trữ URL dạng chuỗi. Nếu mode là input hoặc output, cấu hình pin và thông báo đến client. Nếu chuỗi không khớp với các giá trị, trả về lỗi.

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);
}

Có thể tìm hiểu chi tiết các ví dụ trên trang Bridge Example.

Kết nối đến internet services với Temboo

image

Yún có 1 số khả năng được xây dựng sẵn cho mạng, nhưng một số khía cạnh thú vị nhất là làm việc với các nền tảng trực tuyến khác. Arduino đã hợp tác với Temboo để tạo kết nối với các dịch vụ yêu thích của bạn dễ dàng. Temboo cho phép truy cập hơn 100 APIs từ 1 điểm liên hệ duy nhất cho phép bạn trộn và kết hợp dữ liệu từ nhiều nền tảng (ví dụ Twitter, Facebook, Foursquare, FedEx hoặc PayPal).

Có 1 số ví dụ trong File > Examples > Bridge > Temboo folder, đây là 1 nơi tuyệt vời để bắt đầu làm việc với Yún trong đám mây. Có thể tìm hiểu thêm sự tích hợp của Temboo và Arduino tại trang Temboo getting started.

Spacebrew

Spacebrew là “một thứ đơn giản nhất để kết nối những thứ tương tác với nhau”. Nó dựa trên mô hình client/server và dùng WebSockets để giao tiếp giữa 2 bên. Nó chạy 1 máy chủ web tùy chỉnh trên Yún trong Python và cho phép dễ dàng giao tiếp. Có 1 số ví dụ cho Spacebrew trên Yún bao gồm phần mềm. Tìm hiểu thêm về Yún, xem trang tài liệu của dự án.

Cài đặt phần mềm thêm trên Linux

Yún đi kèm với một số phần mềm cài đặt sẵn trên OpenWrt-Yun, gồm “curl” và “python”. Bạn có thể muốn cài đặt các phần mềm khác trên Yún. Trên các hệ thống Linux, phầm mềm bổ sung có thể được cài đặt bằng công cụ “package management system”. Thêm thông tin, xem hướng dẫn quản lý gói.

Bước tiếp theo

Bạn đã có kiến thức cơ bản, bây giờ bạn có thể tìm hiểu sâu hơn về thư viện Bridge và các ví dụ. Bạn cũng có thể kiểm tra trang phần cứng Yún để có thêm thông tin kỹ thuật.

(Theo http://Arduino.cc)