AVR-OSCILLOSCOPE - Tự làm Máy hiện sóng điện tử trên nền ARDUINO với giá chưa đến 300 nghìn

Mô tả dự án: 

Ở phiên bản này, máy hiện sóng AVR-OSCILLOSCOPE của mình có thể được hiển thị lên 2 lcd thông dụng là NOKIA5110 hoặc lcd ST7565 Homephone .

Đây là thiết bị hiện sóng đa năng, mạnh mẽ và vô cùng gọn nhẹ. Các bạn hoàn toàn tự làm nó ngay lại công xưởng chế tạo tại nhà của mình với giá thành cực rẻ (chưa đến 300k - tính luôn Arduino Uno). 

Chuẩn bị

Ráp mạch

Còn đây là module của mình. heart

Sơ đồ nối với lcd.

Giới thiệu firmware

Sau khi nối mạch và nạp code arduino thành công. Xin chúc mừng, bạn đã trong tay một máy đo OSILLO thực sự.

Chú ý: Ở lần cài đặt đầu tiên, chương trình hỏi “ Continue with old data ?” –Bạn có muốn dùng các đặt cũ không.  Chọn “No". Rồi nhấn “OK” ( Vì chúng ta chưa có dữ liệu nào trên bộ nhớ EEPROM).

 Ở các lần tiếp theo, bạn có thể chọn “Yes "hoặc " No" để tiếp tục với các cài đặt ưa thích của mình.

Tính năng Frequency

  • Chương trình đo tần số của xung đặt lên chân port PD5  (pin 5).
  • Điện áp đặt max (Max vol) : 0v -> 5v.
  • Tần số đo (Frequency): 0hz -> 20mhz. (còn tùy vào tốc độ chuyển mạch của ngắt, có thể lên đến 40mhz).
  • Công tắc (Switch): ở chế độ thường bên Phải (Normal – to the Right).

Test:

Code test phát xung tần số ra các pin (~3,~5,~6,~9,~11). Trên arduino promini.

void setup()
{
    TCCR1A = 0;
    TCCR1B = 0;
    // RESET lại 2 thanh ghi
    DDRB |= (1 << PB1);
    // Đầu ra PB1 là OUTPUT ( pin 9)
    TCCR1A |= (1 << WGM11);
    TCCR1B |= (1 << WGM12) | (1 << WGM13);
    // chọn Fast PWM, chế độ chọn TOP_value tự do  ICR1
    TCCR1A |= (1 << COM1A1);
    // So sánh thường( none-inverting)
    ICR1 = 1;
    // xung răng cưa tràn sau 1 P_clock
    OCR1A = 0;
    // xuất mọi lúc
    TCCR1B |= (1 << CS10);
    // F_clock=16mhz, P_clock=16/1=16mhz.
    //F_pwm=16mhz/(ICR1+1)=8mhz
    pinMode(3, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(11, OUTPUT);
    analogWrite(3, 25); // 25/256=10%
    analogWrite(5, 128); //128/256=50%
    analogWrite(6, 64); // 64/256=25%
    analogWrite(11, 192); // 192/256=75%
}
void loop()
{
}

Đo mô phỏng trên PROTEUS

Hãy tham khảo bài viết này để tạo xung theo sở thích nhé:

http://arduino.vn/tutorial/1416-avr-xuat-xung-voi-tan-so-va-do-rong-theo-y-muon

Tính năng DIGITAL CAPTRUE (CAPTURE AND RECORD)

Sử dụng chức năng digitalRead để đọc liên tục giá trị của xung vào (HIGH/LOW).  Chương trình sẽ đợi (Watting..) cho đến khi có tín hiệu xung cao thì mới bắt đầu lấy mẫu.

Mỗi lần lấy mẫu cách nhau một khoảng thời gian DELAY (Có giá trị trong khoảng 0us - > 10000000 us  (0us -> 10s)). Dữ liệu lấy mẫu gọi là Samples, bạn có thể tăng giá trị của Samples để lấy được nhiều mẫu hơn (Samples max = 1000, tương đương 1000 bytes RAM !).

  • Điện áp đặt max (Max vol) : 0v -> 5v.
  • Tần số đo (Frequency): 0hz -> 20khz.
  • Công tắc (Switch): ): ở chế độ thường bên Phải (Normal – to the Right).

Tính năng PULSE WIDTH

Tìm độ rộng của xung.

  •  Điện áp đặt max (INPUT Max vol) : 0v -> 5v.
  • Tần số đo (Frequency): 0hz -> 1mhz.
  • Công tắc (Switch): ): ở chế độ thường bên Phải (Normal – to the Right).

Tính năng Oscilloscope

Máy đo tín hiệu dạng bất kì.

Mỗi lần lấy mẫu cách nhau một khoảng thời gian DELAY (Có giá trị trong khoảng 0us - > 10000000 us  (0us -> 10s)).

Nếu không biết tần số của dao động là bao nhiêu, bạn có thể chọn AUTO DELAY, chương trình này sẽ giúp bạn tìm DELAY tự động.

Gạt công tắc (switch): ): ở chế độ OSCILLOSCOPE bên TRÁI (to the LEFT).

Điện áp đặt max (INPUT Max vol) : 0v => 5v.

Sử dụng biến trở để đặt giá trị điện áp so sánh với giá trị đầu vào.

  • Nếu Urv < Input : Xung ra OA = 1.  Arduino bắt đầu lấy mẫu analog.
  • Nếu Urv >= input : Xung ra OA= 0. Arduino không lấy mẫu.

Do đó:  Input min < Urv  < Input max. 

Trong video mình nói nhầm, sửa đúng phải là : độ cao hiển thị từ trục hoành đến trên cùng của màn hình tương ứng với mức điện áp từ 0v ->5v

Tính năng Realtime analog

Vẽ đồ thị theo thời gian thực (each 1 second).

  • Điện áp đặt max (INPUT Max vol) : 0v -> 5v.
  • Công tắc (Switch): ): ở chế độ thường bên Phải (Normal – to the Right).

Tính năng Setting

Save data Lưu TẤT CẢ các cài đặt vào thẻ nhớ EEPROM trên arduino.
Contrast Cài đặt độ tương phản của màn hình.
Negative HIển thị âm bản.
Tone Bật tắt loa.
Reset Đặt lại tất cả các cài đặt về trạng thái mặc định. (Không bao gồm dữ liệu đã lưu trên EEPROM).

Về tác giả

Thông tin về phiên bản, ngày hoàn thành, tác giả….

Tải về, cài đặt và chạy thử

Bạn hãy cài đủ 3 thư viện sau

Kiểm tra đủ 3 thư viện nhé

Đối với các bạn mới làm quen với 2 thư viện dành cho LCD trên, mình khuyên bạn nên NỐI DÂY và test hiển thị một vài ví dụ trong mục Examples có sẵn trong thư viện. Hãy biết cách làm cho nó hiển thị trước khi đọc tiếp. (Cách này sẽ giúp bạn thành công đến 99% trong các phần còn lại). Nếu chưa hiển thị thành công thì hãy tìm đến bài viết của lcd đó, mình sẽ cố gắng trả lời ở đó.

Nạp code

Tải file: https://drive.google.com/file/d/0BzMEcyRK_uUFTkU0cGRXYi1IUUE/view?usp=sharing

Toàn bộ file HEX botloader cho 3 loại arduino NANO - UNO - PRO MINI (mỗi loại đều có Code dành 2 lcd ST7565 và NOKIA5110), cộng thêm phần mềm nạp chuyên dụng đều có trong file zip, bạn hãy xem lại video nếu quên cách nạp nhé.

(Nhớ chọn cổng COM (cổng USB) thích hợp nhé)'

(cập nhật 13/10/2017) FIX lỗi "The code execution cannot proceed because libusb0.dll was not found" do thiếu file libsub.dll. : Đối với những bạn tải lần trước thì sẽ gặp lỗi này khi upload file hex, mình đã thêm file libsub.dll vào file tải xuống, hãy tải lại file zip nhé, mọi thứ sẽ hoạt động. 

Tạm kết

Về độ chính xác: độ chính xác của phép đo tần số ở điều kiện mô phỏng (chương trình mô phỏng proteus) là 99.9% với tần số thạch anh 16.000.000 hz. Trên thực tế thạch anh trên arduino có tần số 16.000.xxx.hz , do đó kết quả thu được ( từ 10khz trở lên) là tương đối .

1. Về mạch đệm

Mạch OA1 để lặp tín hiệu, tăng trở kháng vào.

Mạch OA2 so sánh giá trị điện áp trên biến trở và tín hiệu vào. Khi Urv < input, cấp một xung đến arduino để bắt đầu đo. Chú ý nguồn cấp cho OA cần ổn định trong khoảng 9v => 12v,dòng chỉ cần 10mA là đủ (PIN 9V là lựa chọn hợp lý, bạn có thể sài vài tháng).

Cả 2 mạch còn có tác dụng bảo vệ Arduino trong trường hợp điện áp ngõ vào tăng đột ngột, thậm chí nếu điện áp tăng quá cao, ic sẽ cháy mà vẫn đảm bảo an toàn cho Arduino giống với hiệu ứng "cầu chì".

Điện trở R2 có 2 chức năng: Giảm cường độ dòng điện từ ngõ ra của OA2, kết hợp với điện trở R1 phân áp xuống khoảng 0=>7v. Điện trở R1 còn có chức năng của điện trở kéo âm, giúp tín hiệu ổn định ở chế độ chờ.

Do tần số làm việc của ic lm358 chỉ dưới 1mhz nên sẽ không thích hợp để đo tần số yêu cầu độ chính xác cao, do đó ta sẽ chuyển mạch trực tiếp ra 2 đầu đo bằng 1 công tắc. Khi đó điện áp đặt phải từ 0v -> 5v để đảm bảo an toàn cho Arduino

Nguồn cấp cho lcd là 3,5 v (Nhiều bạn đặt luôn là 5v thế là nó bị nhòe mà không để ý ).

2. Quá trình thiết kế

Mất nhiều sức… nhưng thành quả thu được cũng giúp mình có tinh thần hơn, đặc biệt là nghĩ đến việc sẽ chia sẻ thành quả với cộng đồng cũng là một động lực lớn giúp mình sớm hoàn thiện sản phẩm.

Đây sẽ là một trong số đồ án tốt nghiệp của mình, nên mình chưa thể public mã nguồn  được.

Đừng lo, mình sẽ gửi bạn những học liệu mà mình đã tham khảo trên INTERNET trong quá trình làm dự án này.

Đầu tiên phải kể đến phương pháp pháp đo tần số bằng 2 timer quen thuộc.

Yeah, hi vọng món "đồ chơi " này sẽ giúp ích cho bạn. laughwinkenlightenedheartyes

Tác giả:  Thái Sơn

 

lên
29 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Bộ điều khiển PID - ứng dụng phần 2 - xe dò line dùng thuật toán PID

Tiép nối bài viết về xe dò line cảm ơn Đỗ Hữu Toàn đã viết hộ mình phần 4. hôm nay mình sẽ làm cho chiếc xe dò line đi mượt và có hồn hơn 

lên
34 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

Làm robot tự học lệnh đơn giản.

Robot arm, robot nhện, robot múa.. hay các robot mini có sử dụng động cơ servo đều là những sản phẩm gây ấn tượng với những chuyển động đẹp mắt. Đúng như tiêu chí của ARDUINO, mình sẽ làm một dự án ROBOT tự học lệnh cực kì COOL.  

lên
25 thành viên đã đánh giá bài viết này hữu ích.

GAME-ST7565 - Làm game đua xe RACING CAR 3D với arduino

OK,  hôm nay mình sẽ giới thiệu Game “3D Racing Car” – Đua xe 3D. Một trong những Game khá phức tạp mà mình từng viết trên Arduino với lcd ST7565.

lên
11 thành viên đã đánh giá bài viết này hữu ích.