Chủ Nhật, 9 tháng 7, 2017

Giới thiệu module thu phát RF CC2530 tầm xa (plus CC2591) của Zigbee.





Mô tả dự án: 
Mình mới đặt hàng được module RF này, đây là module truyền sóng 2.4 GHZ, khoảng cách rất xa, sử dụng giao tiếp Serial (TX-RX) rất thông dụng, cắm vào là chạy….Rất phù hợp với các dự án robot thám hiểm, thăm dò, tình báo,…..



1

Sức mạnh

  • Hãng sản xuất danh tiếng Zigbee
  • Tên phiên bản: Zigbee UART CC2530 +PA V2.
  • IC chính: Zigbee CC2530 từ TI, phiên bản nâng cấp có thêm ic Khuếch đại PA CC2591. (Mình đang viết về loại nâng cấp này)
  • Hoạt động ở cả 2 chế độ phát và thu.
  • Tốc độ truyền tối đa: 3300bps
  • Độ nhạy truyền: 20dbm
  • Khoảng cách  truyền xa không dưới 1500m (không vật cản), độ cao truyền sóng không dưới 3.5 km. (không vật cản)
  • Điện áp : 2.8v => 3.5v
  • Dòng tiêu thụ: <30mA.
  • Bộ nhớ flash 256kb
  •  
  • Tần số sóng mang 2.4GHZ, khả năng bức xạ và xuyên thấu vật cản rất cao.
  • Giao thức Serial (UART) TTL 3.3V, tốc độ giao thức (baudrate) tùy chỉnh từ 2440 tối đa 115200.
  • Kích thước 1.6 cm x 3.4cm
Trên thị trường rất có nhiều biến thể của module này, chúng đều có lõi là IC CC2530 nhập khẩu chính hãng của Zigbee. Bài viết này giới thiệu loại có thêm ic Khuếch đại PA CC2591 (phần cứng như ảnh dưới).
Đi kèm với nó là một Anten có độ nhạy thu cao.
Không chỉ truyền dẫn đơn thuần, nó còn rất thông minh nữa.

Với các thông số như trên nó xứng đáng là một lựa chọn không thể bỏ qua cho các dự án sử dụng truyền dẫn sóng.yesheart
2

Cài Firmware cho module.

Rất tiếc đây là module được nhà sản xuất nạp sẵn firmware nên bạn không cần làm gì cả, cắm vào là chạy luôn  laughheartwink
3

Cách cấu hình

Nó có quá nhiều ưu điểm, nên nhà sản xuất cho ta lựa chọn theo sở thích bằng cách tự cài với nút ấn có sẵn trên module (chỉ có 1 nút thôi mà ^^).

Gồm 4 bước chính

  • Bước 1: Chọn baudrate giao tiếp bằng với baudrate đã khai báo trong code arduino.
  • Bước 2: Chọn kênh (tránh nhầm lẫn với đứa hàng xóm cũng chơi module này).
  • Bước 3: Chọn chế độ truyền dẫn Point to point hay Broadcast ?
  • Bước 4: Xác nhận lưu và hoàn tất.
Sau khi cài đặt thành công mọi dữ liệu sẽ được lưu lại mãi mãi kể cả khi mất điện.
Điều đó có nghĩa là bạn chỉ cần làm điều 1 lần duy nhất.

Hướng dẫn chi tiết

Bước 1

Không cấp nguồn, nhấn giữ nút key, sau đó cấp nguồn.
(4 led trên module sẽ nhấp nháy báo hiệu truy cập chế độ set cấu hình).
Thả nút nhấn ra, rồi lại nhấn nút tuần tự để chọn mức boudrate phù hợp theo bảng dưới.

Bước 2

Sau khi chọn Baudrate xong, nhấn tì (nhấn giữ) nút ấn để sang bước 2.
(4 led trên module sẽ nhấp nháy báo hiệu truy cập bước 2).
Thả nút nhấn ra, rồi lại nhấn nút tuần tự để chọn kênh (Chanel), lưu ý để 2 module truyền được cho nhau thì ở bước này bạn cần cài đặt chọn kênh giống nhau.

Bước 3

Sau khi chọn Chanel xong, nhấn tì nút ấn để sang bước 3.
(4 led trên module sẽ nhấp nháy báo hiệu truy cập bước 3).
Thả nút nhấn ra, rồi lại nhấn nút tuần tự để chọn chế độ truyền dẫn.
Nó có 2 chế độ truyền dẫn:
  • Point to Point: Dùng để truyền nhận giữa 2 moudle cho nhau. (Ta có thể lựa chọn địa chỉ (tránh trùng với module của người khác) ở 16 địa chỉ khác nhau.)
  • Broadcast: Người dùng có thể tạo ra một mạng lưới truyền dẫn giữa các Node để tạo ra một nhà mạng cho riêng mình, đúng chất IoT chưa bạn laugh. (cái này bạn nên tìm hiểu thêm)
Nếu bạn chọn Point to Point
  • ở module thứ nhất bạn chọn Cấu hình Point to Point A.
  • Cũng ở bước này, ở module thứ 2 chọn cấu hình Poin to Point B.
Nếu bạn chọn Broadcast
  • Thì chọn trường hợp còn lại như hình giống nhau ở tất cả các module.
(Lưu ý tất cả các module cần được cấu hình Chanel và Broadcast giống nhau, khi 1 module truyền, tất cả các module còn lại sẽ nhận, chức năng của các module là tương đương.

Bước 4

Sau khi chọn kiểu truyền nhận xong, nhấn tì nút ấn để sang bước 4.
4 led trên module sẽ nhấp nháy báo hiệu cài đặt thành công và được lưu mãi mãi.
Lưu ý thiết đặt chỉ được lưu và có hiệu lực khi bạn đến được bước 4.
Để thiết đặt lại hãy rút nguồn và quay về bước 1.
4

Cách dùng rất đơn giản

Gỉa sử chúng ta đang giao tiếp truyền thống bằng 2 dây TX-RX giữa 2 arduino như thế này.
Bạn chú ý quy tắc nối TX của thiết bị A phải nối với RX của thiết bị B nhé. 

Giờ muốn lên đời RF thì ta cũng làm tương tự.

5

Thư viện hỗ trợ

Thực ra bạn không cần thư viện thư viện gì cho 2 module RF kia đâu. 
Tuy nhiên như trong 1 dự án trạm khí tượng, bạn sẽ lên kế hoạch sử dụng 2 board arduino (1 board chính – 1 board phụ). Board chính đặt ở phòng để giám sát và điều khiển, board phụ đặt trên tròi kí tượng đọc các trị cảm biến rồi gửi về qua Serial. Hoặc pro hơn là các dự án về robot thám hiểm.
Một vấn đề mà bạn vấp phải là bạn chỉ biết chỉ biết truyền một số có giá trị trong khoảng từ 0 => 255 angry, trong khi thực tế thì ta luôn cần nhiều hơn vậy.devil
Đó có thể là giá trị của biến (nhiệt , độ ẩm=90%,áp suất=2000atm, tốc độ=4500 rpm, ..v.v ) một kiểu intlongunsigned long  hay kiểu kiểu số thực như floatdouble (ví dụ thường thấy ở các module GPS trả về như kinh độ 50.45656 độ, vĩ độ 102.55433).
Hãy đọc bài viết này tải về thư viện hỗ trợ trong giao tiếp UART.
6

Test khoảng cách thực

Khoảng cách truyền nhận là tiêu chí được chú ý nhiều nhât.

Code test

Chú ý: Code test sử dụng thư viện tại đây
  1. #include "UART_ARDUINO.h"
  2. UART vietnam;
  3. void setup()
  4. {
  5. vietnam.begin(9600); // baud: 200 -> 250,000.
  6. pinMode(13, 1); //led
  7. pinMode(5, INPUT_PULLUP); // nut button
  8. }
  9. void nhap_nhay()
  10. {
  11. for (byte i = 0; i < 3; i++) {
  12. digitalWrite(13, 1);
  13. delay(200);
  14. digitalWrite(13, 0);
  15. delay(200);
  16. }
  17. }
  18. char t = 'A'; // truyền 1 kí tự trong bảng ASCII
  19. void loop()
  20. {
  21. if (digitalRead(5) == 0) {
  22. nhap_nhay();
  23. vietnam.write_char(t);
  24. }
  25.  
  26. if (Serial.available() >= 1) {
  27. if (vietnam.read_char() == 'A') {
  28.  
  29. nhap_nhay();
  30. vietnam.write_char(t);
  31. }
  32. }
  33. }

Mạch điện

Cách test

Nạp cùng 1 code bên trên cho cả 2 arduino.
Hai moulde Rf ở chế độ Point to Point, kênh tùy bạn, baudrate với arduino là 9600.
Nối mạch như trên. Nhấn nút để bắt đầu truyền dẫn, quá trình truyền dẫn sẽ diễn ra liên tục cho đến khi 1 trong 2 không bắt được tín hiệu của nhau do khoảng cách quá xa.

Tiêu chí đánh giá

Bạn hãy nhìn code sẽ thấy, ta sẽ đánh giá chất lượng ở cả 2 chế độ Tầm phủ sóng (khi phát) và độ nhạy thu (khi thu).
Đoạn code trên được mô tả: "Nếu một module bắt được tín hiệu của module còn lại thì hãy gửi lại tín hiệu cho module đó"
(Đấy cũng là lí do ta cần nhấn “mồi” cho 1 module ).
Điều đó có ý nghĩa: 2 module có tác dụng trong mọi điều kiện khoảng cách, độ cao.

Kết quả test của cá nhân mình

Khoảng cách truyền nhận là 2km  smiley (mặc dù mục tiêu đề ra là 3kmdevil).
(Như đã nói dòng CC2530 có nhiều loại ,chú ý là module mình dùng trong video là CC2530 có thêm CC2591 mới cho kết quả tốt như vậy).
Bạn cũng có thể bắt gặp lại module này trong dự án UAV của mình, ở đó chúng ta sẽ có cơ hội test độ cao. Càng lên cao tầm phủ sóng sàng xa, hi vọng là nó phủ 4km là ngon. cheeky
Khoảng cách thu nhận giảm xuống chủ yếu do hấp thụ (mưa, mật độ phân tử khí (nhiệt độ và độ cao ,càng lên cao không khí càng loãng nên ít bị hấp thụ), sương mù, bão tuyết, địa hình rừng núi…) hoặc do phản xạ (sóng có thể bị phản xạ (tùy từng bước sóng) bởi các tòa nhà, dãy núi, tầng điện ly…. Các trường hợp giao thoa và tán xạ cũng vậy.
Bạn có thể gõ “Ảnh hưởng của khí quyển đến truyền dẫn vô tuyến” trên google nếu muốn tìm hiểu thêm.
7

Kết

Khi mua module thì chúng ta buộc phải mua ít nhất 2 module .
Bạn có thể chưa bao giờ hoặc đã từng sử dụng các module RF cự li ngắn hẳn cũng đồng ý với mình đây là module RF đáng để đầu tư nhất phải không .heart
Tất nhiên một tutorial về tăng khoảng cách thu phát bằng đủ chiêu trò sẽ được viết trong thời gian tới.^^
Hi vọng bài viết có ích cho bạn trong tương lai, nhấn like ủng hộ mình và các thành viên để chúng mình có động lực viết bài nhé.   cheekylaughheartyes

Servo Motor Control with an Arduino

Servo Motor Control with an Arduino

n this project we will make Servo Motor Control with an Arduino. I will use arduino uno in the circuit design program. I use usually arduino mega 2560.  You can use the other arduino cards. Good Luck.servos 

Schema:


 servoschema

Materials:


Arduino UNO / Other Arduino Cards        x 1
Servo Motor                              x 5
Jumper Cable

 

Program:

// letsarduino.com
// [Project 9] - Servo Motor Control with an Arduino

#include<Servo.h> 
Servo myservo; 
int pos = 0; // starting position of servo

void setup() 
{ 
myservo.attach(8); // Servo signal pin
} 

void loop() 
{
 for(pos = 0; pos < 180; pos += 1) // from 0 to 1 position turn 180 degree
 { 
 myservo.write(pos); 
 delay(10); 
 } 
 for(pos = 180; pos>=1; pos-=1) // from 1 to 0 position turn 180 degree
 { 
 myservo.write(pos); 
 delay(10); 
 } 
}

Servo Motor Pins:


servo

Project Related Images:


 servooo


2 Servos Using a Joystick (thumbstick) + Arduino

2 Servos Using a Joystick (thumbstick) + Arduino

In this project we will control 2 Servos Using a Joystick (thumbstick) with an Arduino. I use usually arduino mega 2560.  You can use the other arduino cards. Good Luck.

[Project 11] - 2 Servos Using a Joystick (thumbstick) + Arduino 2

Schema:


[Project 11] - 2 Servos Using a Joystick (thumbstick) + Arduino 1

Materials:


Arduino UNO / Other Arduino Cards  x 1
Breadboard   x 1
Servo Motor   x 2
Joystick   x 1
Jumper Cable

Program:

// letsarduino.com
// [Project 11] - 2 Servos Using a Joystick 
//  (thumbstick) + Arduino

#include <Servo.h>  

int ServoHorizontalPin = 3;   
int ServoVerticalPin =  4;   
int HorizontalPotPin = A0;  
int VerticalPotPin = A1;  
int ServoH_Min = 0;  
int ServoH_Max = 180; 
int ServoV_Min = 0; 
int ServoV_Max = 180; 

Servo HorizontalServo;  
Servo VerticalServo;    

int HorizontalPotValue;         
int HorizontalServoPosition;    
int VerticalPotValue;         
int VerticalServoPosition;    

void setup()   
{
  HorizontalServo.attach(ServoHorizontalPin);   
  VerticalServo.attach(ServoVerticalPin);         
}

void loop()  
{
  HorizontalPotValue  = analogRead(HorizontalPotPin); 
  VerticalPotValue  = analogRead(VerticalPotPin);  
  HorizontalServoPosition  = map(HorizontalPotValue, 0, 1023, ServoH_Min , ServoH_Max); 
  VerticalServoPosition  = map(VerticalPotValue, 0, 1023, ServoH_Min , ServoH_Max);   
  HorizontalServo.write(HorizontalServoPosition);       
  VerticalServo.write(VerticalServoPosition);       
  delay(20);    
}

Servo Motor Pins:


servo

Project Related Images:


 

[Project 11] - 2 Servos Using a Joystick (thumbstick) + Arduino 6[Project 11] - 2 Servos Using a Joystick (thumbstick) + Arduino 4