NTP_PRO gửi vào
- 50008 lượt xem
Xin chào, bài đăng của mình sẽ liên quan đến 2 chủ để mà admin đã đề cập đến, đó là: xung PWM và giao tiếp Serial.
Nội dung
- Đọc dữ liệu nhập từ bàn phím.
- Kết hợp sử dụng PWM và giao tiếp Serial để điều khiển LED.
Phần cứng
- Arduino UNO.
- Breadboard + dây dẫn.
- 1 đèn LED (loại bất kì).
- 1 điện trở 220 ohm (từ 100ohm đến 2.7k ohm).
Lắp mạch
Lập trình
byte brightness = 0; //độ sáng- [0%->100%] const int LED = 11; // chân 11 hỗ trợ phát xung PWM void setup() { Serial.begin(9600); // mở cổng Serial ở baudrate 9600 } void loop() { Serial.println("enter brightness %"); //kiểm tra xem có dữ liệu được truyền qua cổng serial hay không while(Serial.available()==0) { // không làm gì cả } while(Serial.available()>0) { char ch = Serial.read(); // chỉ nhận giá trị từ '0' đến '9' if(ch >= '0' && ch <='9') { //chuyển từ ASCII sang số thập phân brightness = brightness*10 + ch - '0'; delay(5);//chờ tín hiệu tiếp theo được truyền qua cổng serial //KHÔNG THỂ THIẾU. Hãy thử bỏ dòng này bạn sẽ thấy điều khác biệt! } else { Serial.print(ch); Serial.println(":not valid"); brightness = 0; } } // chặn giá trị brightness trong khoảng [0,100] brightness = constrain(brightness,0,100); // in ra giá trị brightness Serial.print("brightness = "); Serial.println(brightness); // chuyển đổi từ giá trị brightness sang PWM byte value = map(brightness,0,100,0,255); // bật LED với giá trị xung PWM (duty cycle) nhận được analogWrite(LED,value); // reset biến brightness về giá trị 0 //để tiếp tục tính toán brightness = 0; }
Giải thích
- Khi giao tiếp qua Serial, ta có thể dùng Serial.print() và Serial.write() để gửi dữ liệu; dùng Serial.read() để đọc dữ liệu từ cổng Serial. Tuy nhiên, có 1 số điểm sau các bạn cần lưu ý:
+ Kí tự nhập từ bàn phím mang giá trị theo bảng mã ASCII. VD: 'A' = 65; '0' = 48',.....
+ Serial Monitor (bấm Ctrol + Shift + M để mở) yêu cầu dạng mã ASCII để hiển thị, và những gì bạn thấy trong cửa sổ Serial thực ra đã được dịch sang mã ASCII.
+ Serial.print() : ghi nội dung ra cổng Serial theo dạng mã ASCII mà con người có thể hiểu được. VD: Serial.print(48);==> "48"; Serial.print("ARDUINO");===> "ARDUINO"....
+ Serial.write(): ghi nội dung ra cổng Serial theo dạng byte. VD: Serial.write(48);===> '0' (vì số 48 sẽ được gửi trực tiếp qua cổng Serial, sau đó hệ thống sẽ dịch số 48 thành số '0' theo bảng mã ASCII).
+ Serial.read(): đọc dữ liệu từ cổng Serial, mỗi lần đọc 1 byte. Mỗi kí tự trên bàn phím sẽ ứng với 1 giá trị trong bảng mã ASCII (cũng là 1 byte). Nếu ta nhập số 12 từ keyboard thì cổng Serial sẽ nhận giá trị 49 (ASCII ) trước (ứng với số 1) rồi đến giá trị 50 (ứng với số 2), do đó, số 12 ta nhập trên bàn phím sẽ chuyển thành số 49 và số 50.
Để hiểu rõ hơn, các bạn đọc tại đây.
if(ch >= '0' && ch <='9') { //chuyển từ ASCII sang số thập phân brightness = brightness*10 + ch - '0'; delay(5);//chờ tín hiệu tiếp theo được truyền qua cổng serial //KHÔNG THỂ THIẾU }
==> brightness = brightness*10 + ch - '0'; dùng để chuyển mã ASCII từ bàn phím thành dạng số có thể tính toán.
Kết luận
Hy vọng bài viết sẽ giúp các bạn hiểu rõ hơn về giao tiếp giữa mạch Arduino và máy tính.
Do kiến thức giới hạn, nếu có sai sót nào trong bài viết, mong các bạn giúp mình sửa lỗi.