1. Trang chủ
  2. » Luận Văn - Báo Cáo

Hướng dẫn lập trình PIC với arduino

136 163 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 136
Dung lượng 5,31 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • Hour 5. Học kiến thức cơ bản về C (7)
  • Hour 6. Các lệnh có cấu trúc (19)
  • Hour 7. Vòng lặp lập trình (29)
    • 2. Giới thiệu (41)
      • 2.1 Phương pháp phát triển phần mềm (41)
      • 2.2 Phần cứng được hỗ trợ (42)
    • 3. Cài đặt phần mềm (44)
      • 3.1 Cài đặt lần đầu (45)
      • 3.2 Cập nhật lên phiên bản mới (46)
    • 5. Bắt đầu với Logic bậc thang (48)
      • 5.1 Đầu vào và đầu ra bit đơn (49)
      • 5.2 Thực hiện các phép toán Boolean (51)
    • 6. Đầu ra chốt (56)
      • 6.1 Chốt với các thành phần rời rạc (56)
      • 6.2 Sử dụng lệnh Latch (58)
    • 7. Xung kích hoạt cạnh (61)
      • 7.1 Tạo một bảng tin được kích hoạt cạnh (63)
    • 8. Nhập từ bàn phím (64)
      • 8.1 Kết nối phần cứng (65)
      • 8.2 Phần mềm (67)
    • 9. Thời gian trễ sử dụng (69)
      • 9.1 Tạo ra độ trễ khi bật (69)
      • 9.2 Chuyển đổi Debouncing (71)
      • 9.3 Tạo độ trễ khi tắt máy (72)
      • 9.4 Tạo xung thời lượng cố định (73)
    • 10. Tạo ra các dạng sóng lặp lại (75)
      • 10.1 Tạo xung thủ công (75)
      • 10.2 Sử dụng lệnh timerCycle() (76)
      • 11.1. Bộ đếm lên (78)
      • 11.3 Bộ đếm lên / xuống (80)
      • 11.4 Gỡ lỗi ứng dụng dựa trên bộ đếm (81)
      • 12.1 Tạo và sử dụng sổ đăng ký Shift (83)
      • 12.2 Rotaing Data (86)
      • 13.1 Kiểm soát độ sáng của đèn LED bằng PWM (90)
      • 13.2 Kiểm soát tốc độ và hướng của động cơ (90)
      • 15.1 So sánh các giá trị tương tự dựa trên phần mềm (94)
      • 15.2 Một ứng dụng so sánh đơn giản (95)
      • 17.2 Xây dựng hệ thống làm việc (98)
      • 17.2 Ứng dụng 1: Một báo động đơn giản (99)
      • 17.3 Ứng dụng 2: Báo động bằng nhấp nháy “ Armed “ LED (100)
      • 18.1 Tạo chuỗi (104)
      • 18.2 Phân nhánh và hội tụ (107)
      • 19.1 Chuyển đổi cơ sở thời gian (110)
      • 19.2. Ứng dụng 1: Điều khiển đèn giao thông (112)
      • 19.3. Ứng dụng 2: Màn hình ánh sáng chạy (114)
    • 20. Văn bản có cấu trúc (118)
      • 20.1 Sử dụng cấu trúc chương trình (119)
    • 21. Các khái niệm nâng cao (120)
      • 21.1. Cách phần mềm hoạt động (120)
      • 21.2 Sử dụng biến trong chương trình (121)
      • 21.3. Làm việc với các biến tùy chỉnh (123)
      • 21.4. Sử dụng các biến với mạch logic phức tạp (123)
    • 22. Lưu trữ và Logic dựa trên ngăn xếp (124)
      • 22.1 Hoạt động lôgic khối (126)
    • 23. Xác định Phân bổ IO Tùy chỉnh (128)
      • 23.1 Phân bổ I / O được cấu hình sẵn (128)
      • 23.2 Nghiên cứu điển hình: Tạo Phân bổ IO Tùy chỉnh (128)
    • 24. Điểm mạnh và Hạn chế của Phần mềm (131)
    • 25. Tham chiếu lệnh (132)
      • 25.1 Cấu hình chung (132)
      • 25.2 Đầu vào / đầu ra kỹ thuật số một bit (132)
      • 25.3 Logic kết hợp (132)
      • 25.4 Đầu vào / đầu ra tín hiệu tương tự (132)
      • 25.5 So sánh các tín hiệu tương tự (133)
      • 25.6 Chốt (133)
      • 25.7 Bộ hẹn giờ (133)
      • 25.8 Xung kích hoạt cạnh (134)
      • 25.9 Bộ đếm (134)
      • 25.10 Dịch chuyển vị trí thanh ghi (135)
      • 25.11 Logic ngăn xếp và khối (135)
  • Kết Luận (136)

Nội dung

Hướng dẫn lập trình PIC với Arduino Giảng viên: Triệu Việt Linh Hà Nội, năm 2021 Mục lục LỜI NÓI ĐẦU 7 Hour 5. Học kiến thức cơ bản về C 8 Làm việc với biến 8 Khai báo biến 8 Xác định giá trị cho biến 9 Hiểu các kiểu dữ liệu 10 Định tính biến 11 Phạm vi của biến 12 Sử dụng toán tử 12 Các toán tử toán học chuẩn 13 Sử dụng toán tử phức hợp 14 Thứ tự thực hiện các phép toán 14 Khám phá các hàm của Arduino 15 Sử dụng đầu ra nối tiếp 15 Làm việc với thời gian 17 Thực hiện các phép toán nâng cao 17 Tạo số ngẫu nhiên 18 Sử dụng thao tác với bit 19 Tổng kết 19 Hour 6. Các lệnh có cấu trúc 20 Làm việc với Câu lệnh if 20 Nhóm nhiều câu lệnh 21 Sử dụng các câu lệnh khác 23 Sử dụng câu lệnh else if 24 Hiểu các điều kiện so sánh 25 So sánh số 25 So sánh Boolean 26 Tạo điều kiện kép 27 Yêu cầu kiểm tra tình trạng 27 3 Tóm lược 29 Hour 7. Vòng lặp lập trình 30 Hiểu các vòng lặp 30 Sử dụng vòng lặp while 31 Sử dụng vòng lặp do-while 32 Sử dụng cho các vòng lặp 34 Sử dụng mảng trong vòng lặp của bạn 35 Tạo Mảng 35 Sử dụng vòng lặp với mảng 36 Xác định kích thước của một mảng 37 Sử dụng nhiều biến 38 Vòng lặp làm tổ 38 Tóm lược 41 2. Giới thiệu 42 2.1 Phương pháp phát triển phần mềm 42 2.2 Phần cứng được hỗ trợ 43 3. Cài đặt phần mềm 45 3.1 Cài đặt lần đầu 46 3.2 Cập nhật lên phiên bản mới 47 5. Bắt đầu với Logic bậc thang 49 5.1 Đầu vào và đầu ra bit đơn 50 5.2 Thực hiện các phép toán Boolean 52 6. Đầu ra chốt 57 6.1 Chốt với các thành phần rời rạc 57 6.2 Sử dụng lệnh Latch 59 7. Xung kích hoạt cạnh 62 7.1 Tạo một bảng tin được kích hoạt cạnh 64 8. Nhập từ bàn phím 65 8.1 Kết nối phần cứng 66 8.2 Phần mềm 68 4 9. Thời gian trễ sử dụng 70 9.1 Tạo ra độ trễ khi bật 70 9.2 Chuyển đổi Debouncing 72 9.3 Tạo độ trễ khi tắt máy 73 Hình 28. Độ trễ tắt làm cho đầu ra vẫn hoạt động trong một khoảng thời gian cố định sau khi đầu vào bị loại bỏ. 73 9.4 Tạo xung thời lượng cố định 74 10. Tạo ra các dạng sóng lặp lại 76 10.1 Tạo xung thủ công 76 10.2 Sử dụng lệnh timerCycle() 77 11.1. Bộ đếm lên 79 11.3 Bộ đếm lên / xuống 81 11.4 Gỡ lỗi ứng dụng dựa trên bộ đếm 82 12 Dịch chuyển và xoay dữ liệu nhị phân 84 12.1 Tạo và sử dụng sổ đăng ký Shift 84 12.2 Rotaing Data 87 13 Làm việc với Analogue Signals 91 13.1 Kiểm soát độ sáng của đèn LED bằng PWM 91 13.2 Kiểm soát tốc độ và hướng của động cơ 91 14 Kiểm soát vị trí bằng Servos 94 15 So sánh các giá trị tương tự 95 15.1 So sánh các giá trị tương tự dựa trên phần mềm 95 15.2 Một ứng dụng so sánh đơn giản 96 16 Lập trình danh sách lệnh 98 17 Sơ đồ khối chức năng 99 17.2 Xây dựng hệ thống làm việc 99 17.2 Ứng dụng 1: Một báo động đơn giản 100 17.3 Ứng dụng 2: Báo động bằng nhấp nháy “ Armed “ LED 101 18 Biểu đồ hàm tuần tự 105 18.1 Tạo chuỗi 105 18.2 Phân nhánh và hội tụ 108 5 19 Phát triển các ứng dụng dựa trên SFC định thời 110 19.1 Chuyển đổi cơ sở thời gian 110 19.2. Ứng dụng 1: Điều khiển đèn giao thông 112 19.3. Ứng dụng 2: Màn hình ánh sáng chạy 114 20. Văn bản có cấu trúc 118 20.1 Sử dụng cấu trúc chương trình 119 21. Các khái niệm nâng cao 120 21.1. Cách phần mềm hoạt động 120 21.2 Sử dụng biến trong chương trình 121 21.3. Làm việc với các biến tùy chỉnh 123 21.4. Sử dụng các biến với mạch logic phức tạp 123 22. Lưu trữ và Logic dựa trên ngăn xếp 124 22.1 Hoạt động lôgic khối 126 23. Xác định Phân bổ IO Tùy chỉnh 128 23.1 Phân bổ I / O được cấu hình sẵn 128 23.2 Nghiên cứu điển hình: Tạo Phân bổ IO Tùy chỉnh 128 24. Điểm mạnh và Hạn chế của Phần mềm 131 25. Tham chiếu lệnh 132 25.1 Cấu hình chung 132 25.2 Đầu vào / đầu ra kỹ thuật số một bit 132 25.3 Logic kết hợp 132 25.4 Đầu vào / đầu ra tín hiệu tương tự 132 25.5 So sánh các tín hiệu tương tự 133 25.6 Chốt 133 25.7 Bộ hẹn giờ 133 25.8 Xung kích hoạt cạnh 134 25.9 Bộ đếm 134 25.10 Dịch chuyển vị trí thanh ghi 135 25.11 Logic ngăn xếp và khối 135 Kết Luận 136 6 LỜI NÓI ĐẦU Tự động hóa, robot hóa là xu hướng của nhân loại ngày nay. Từ ngàn xưa, con người luôn ước ao có những cỗ máy để làm việc thay thế mình. Trong thời đại hiện nay, với sự phát triển mạnh mẽ của khoa học kỹ thuật, con người đã dần tạo ra những máy móc thông minh, giúp mình từ các công việc thường ngày đến những công việc khó khăn nguy hiểm. Các máy tự động, các robot thông minh, tự hành do con người tạo nên không chỉ tồn tại ở trái đất mà còn có mặt tại mặt trăng, sao hỏa, trong không gian. Đi cùng với nhịp điệu phát triển của khoa học kỹ thuật trên thế giới, người Việt Nam cũng đang rất nỗ lực trong nghiên cứu khoa học kỹ thuật, đặc biệt là trong lĩnh vực tự động hóa, robot hóa, phục vụ cho đời sống hàng ngày, cho công cuộc xây dựng và bảo vệ đất nước Việt Nam thân yêu. Sự nỗ lực đó đã giúp cho người Việt dần nắm bắt, làm chủ các công nghệ tiến tiến trên thế giới, từ xây cầu dây văng đến làm hầm Sài Gòn và hiện nay là thực hiện công trình tàu điện ngầm tại Việt Nam. Người Việt với sự cần cù sáng tạo và tình yêu quê hương đất nước mạnh mẽ, cùng vị trí địa lý chiến lược của quốc gia nhất định sẽ thực hiện thành công sự nghiệp công nghiệp hóa, hiện đại hóa của mình và nhất định trong tương lai gần sẽ bắt kịp các nước phát triển trong khu vực về khoa học và kỹ thuật. Sự ra đời của mạch Arduino thúc đẩy sự yêu thích, tìm tòi nghiên cứu, ứng dụng tự động hóa , robot hóa vào đời sống và công nghiệp. Với những ưu điểm riêng của mình, Arduino đã nhanh chóng nổi tiếng toàn thế giới và được giới học sinh, sinh viên, giới nghiên cứu, những người yêu thích kỹ thuật, những người thích làm đồ tự chế sử dụng rộng rãi. Tại Việt Nam, số lượng người sử dụng mạch Arduino ngày càng tăng. Để đáp ứng nhu cầu tìm hiểu Arduino, tài liệu này đã được biên soạn. Tài liệu gồm có 6 phần, chủ yếu đáp ứng nhu cầu tự học của các bạn mới bắt đầu tìm hiểu về Arduino. Tài liệu được viết một cách ngắn gọn, dễ hiểu, đi vào những vấn đề cốt lõi trong việc sử dụng Arduino cho cuộc sống. 7 Hour 5. Học kiến thức cơ bản về C Những gì bạn sẽ học trong chương này : • Cách lưu trữ dữ liệu phác thảo của bạn trong các biến • Cách sử dụng biến trong các phép toán • Cách xuất giá trị biến vào cổng nối tiếp Arduino • Cách sử dụng một số hàm Arduino C tích hợp sẵn Chương này trước tiên sẽ đi sâu vào kiến thức cơ bản về ngôn ngữ lập trình C, nền tảng của ngôn ngữ lập trình Arduino. Đầu tiên ta khám phá cách lưu trữ dữ liệu trong bản nháp của bạn bằng cách sử dụng các biến. Sau đó, ta thảo luận về cách thực hiện các phép toán số học đơn giản trong các bản nháp của bạn. Kết thúc chương bằng cách xem qua một số hàm phổ biến trong thư viện Arduino tiêu chuẩn mà bạn có thể sử dụng. Làm việc với biến Trong giờ thứ 2, “Khởi tạo môi trường lập trình Arduino,” ngôn ngữ lập trình Arduino cung cấp giao diện thann thiện với người sử dụng để viết chương trình cho cho vi điều khiển ATmega cơ bản trên Arduino. Một trong số những giao diện đó là cách dữ liệu được lưu trong bộ nhớ. Thay vì phải tham chiếu các vị trí bộ nhớ cụ thể để lưu trữ dữ liệu chương trình của bạn ( như bạn làm ở ngôn ngữ lập trình bậc thấp), ngôn ngữ lập trình Arduino sử dụng các biến đơn giản để đại diện cho các vị trí bộ nhớ để lưu trữ dữ liệu. Phần này thảo luận cách sử dụng các biến đó trong bản nháp Arduino để lưu trữ và khôi phục dữ liệu của bạn . Khai báo biến Vì ngôn ngữ lập trình Arduino được xây dựng trên ngôn ngữ lập trình C , nó sử dụng định dạng chuẩn của ngôn ngữ C để tạo và sử dụng các biến. Trong ngôn ngữ C, tạo biến gồm 2 bước: 1. Khai báo biến để sử dụng trong bản nháp. 2. Gán giá trị dữ liệu cho biến. Khi khai báo biến, trình biên dịch ngôn ngữ C lưu trữ tên biến, cùng với một số thông tin khác, trong một bảng nội. Bảng này cho phép trình biên dịch biết chương trình dùng biến nào và sử dụng bao niêu bộ nhớ khi bạn chạy chương trình. Tuy nhiên, khi bạn khai báo một biến, trình biên dịch vẫn chưa thực sự gán biến đó vào một vị trí cụ thể trong bộ nhớ hệ thống; phần đó sẽ đến sau. Để khai báo một biến, bạn chỉ cần xác định kiểu dữ liệu mà biến đó sẽ lưu trữ và tên biến trong một câu lệnh, như sau 8 datatype variablename; Phần datatype xác định loại dữ liệu mà biến sẽ lưu trữ. Ngôn ngữ lập trình C sử dụng cái được gọi là nhập nghiêm ngặt (strict typing) bắt buộc bạn phải khai báo loại dữ liệu mà mỗi biến sẽ chứa. Một khi bạn đã khai báo kiểu dữ liệu cho một biến, bạn chỉ có thể lưu trữ loại dữ liệu đó trong biến (tìm hiểu thêm ở phần “Hiểu các loại dữ liệu” phía sau). Phần variablename xác định nhãn mà bạn sẽ sử dụng để tham chiếu vị trí đó trong bộ nhớ từ bên trong bản nháp của bạn. Ví dụ, để khai báo một biến dữ liệu số nguyên, bạn sử dụng như sau: int pin; Bạn phải tuân theo một số quy tắc khi khai báo tên biến trong C: • Tên biến chỉ được chứa các chữ cái, số, dấu gạch dưới hoặc ký hiệu đô la. • Tên biến phải bắt đầu bằng một chữ cái. • Tên biến có phân biệt chữ hoa chữ thường. • Không có giới hạn cho độ dài tên biến. Vì không có giới hạn về độ dài của tên biến, bạn nên sử dụng các tên biến có ý nghĩa cho dữ liệu trong bản phác thảo của mình. Ví dụ, bạn sử dụng các tên biến như pin, blinkrate, speed sẽ tốt hơn là tên chung chung như A, B, C. Việc đó sẽ giúp việc kiểm tra lỗi dễ dàng hơn và nó giúp bạn nhớ những gì mỗi biến thực hiện nếu bạn phải quay lại bản nháp của mình vài tháng sau. Một phương pháp phổ biến khác cũng được các nhà phát triển Arduino sử dụng là một phương pháp được gọi là camelCase. CamelCase kết hợp hai hoặc nhiều từ trong một tên biến, viết hoa chữ cái đầu tiên của mỗi từ, ngoại trừ từ đầu tiên, như sau: int blinkRateSetting; Điều đó làm cho việc đọc và nhận ra tên biến gồm nhiều từ dễ dàng hơn một chút. Như bạn có thể mong đợi, mỗi tên biến mà bạn khai báo trong bản nháp của mình phải là duy nhất. Bạn không thể khai báo hai biến có cùng tên; nếu không, bạn sẽ nhận được thông báo lỗi trong cửa sổ bảng điều khiển IDE khi bạn cố gắng biên dịch bản nháp của mình. Xác định giá trị cho biến Phần thứ hai của quá trình là gán giá trị cho biến đã khai báo. Để gán giá trị cho một biến, bạn sử dụng toán tử gán, trong ngôn ngữ C là một dấu bằng: blinkRateSetting = 10;

Học kiến thức cơ bản về C

Những gì bạn sẽ học trong chương này :

• Cách lưu trữ dữ liệu phác thảo của bạn trong các biến

• Cách sử dụng biến trong các phép toán

• Cách xuất giá trị biến vào cổng nối tiếp Arduino

• Cách sử dụng một số hàm Arduino C tích hợp sẵn

Chương này sẽ khám phá kiến thức cơ bản về ngôn ngữ lập trình C, nền tảng cho Arduino Đầu tiên, chúng ta sẽ tìm hiểu cách lưu trữ dữ liệu bằng biến trong bản nháp Tiếp theo, chương sẽ hướng dẫn thực hiện các phép toán số học đơn giản Cuối cùng, chúng ta sẽ xem xét một số hàm phổ biến trong thư viện Arduino tiêu chuẩn mà bạn có thể áp dụng.

Trong giờ thứ 2 của khóa học "Khởi tạo môi trường lập trình Arduino," ngôn ngữ lập trình Arduino mang đến một giao diện thân thiện cho người dùng, giúp viết chương trình cho vi điều khiển ATmega cơ bản Một trong những điểm quan trọng của giao diện này là cách dữ liệu được lưu trữ trong bộ nhớ.

Ngôn ngữ lập trình Arduino cho phép bạn sử dụng các biến đơn giản thay vì tham chiếu trực tiếp đến các vị trí bộ nhớ cụ thể để lưu trữ dữ liệu chương trình Bài viết này sẽ hướng dẫn bạn cách sử dụng các biến trong bản nháp Arduino để lưu trữ và khôi phục dữ liệu một cách hiệu quả.

Ngôn ngữ lập trình Arduino được phát triển dựa trên ngôn ngữ C, vì vậy nó áp dụng định dạng chuẩn của C để tạo và sử dụng biến Quá trình tạo biến trong ngôn ngữ C bao gồm hai bước cơ bản.

1 Khai báo biến để sử dụng trong bản nháp.

2 Gán giá trị dữ liệu cho biến.

Khi khai báo biến trong ngôn ngữ C, trình biên dịch sẽ lưu trữ tên biến và thông tin liên quan trong một bảng nội, giúp xác định biến nào được sử dụng và lượng bộ nhớ cần thiết cho chương trình Tuy nhiên, việc gán biến vào một vị trí cụ thể trong bộ nhớ hệ thống sẽ diễn ra sau khi khai báo Để khai báo biến, bạn cần chỉ định kiểu dữ liệu và tên biến trong câu lệnh theo cú pháp: datatype variablename.

Trong ngôn ngữ lập trình C, phần datatype xác định loại dữ liệu mà biến sẽ lưu trữ, yêu cầu người dùng khai báo loại dữ liệu một cách nghiêm ngặt (strict typing) Khi một kiểu dữ liệu đã được khai báo cho biến, chỉ có thể lưu trữ loại dữ liệu tương ứng trong biến đó Để tìm hiểu thêm, hãy tham khảo phần “Hiểu các loại dữ liệu” ở phía sau.

Phần variablename được sử dụng để xác định nhãn cho việc tham chiếu đến vị trí trong bộ nhớ từ bản nháp của bạn Ví dụ, để khai báo một biến dữ liệu kiểu số nguyên, bạn có thể sử dụng cú pháp sau: int pin;

Bạn phải tuân theo một số quy tắc khi khai báo tên biến trong C:

• Tên biến chỉ được chứa các chữ cái, số, dấu gạch dưới hoặc ký hiệu đô la.

• Tên biến phải bắt đầu bằng một chữ cái.

• Tên biến có phân biệt chữ hoa chữ thường.

• Không có giới hạn cho độ dài tên biến.

Khi đặt tên biến trong bản phác thảo của bạn, hãy chọn những tên có ý nghĩa để dễ dàng quản lý và kiểm tra lỗi, thay vì sử dụng các tên chung chung như A, B, C Ví dụ, các tên như pin, blinkRate, speed sẽ giúp bạn nhớ chức năng của mỗi biến khi quay lại bản nháp sau vài tháng Một phương pháp phổ biến mà các nhà phát triển Arduino thường sử dụng là camelCase, trong đó kết hợp nhiều từ với chữ cái đầu tiên của mỗi từ được viết hoa, ngoại trừ từ đầu tiên, như trong ví dụ: int blinkRateSetting Phương pháp này giúp việc đọc và nhận diện tên biến trở nên dễ dàng hơn.

Mỗi tên biến trong bản nháp của bạn phải là duy nhất, vì việc khai báo hai biến với cùng một tên sẽ dẫn đến thông báo lỗi khi biên dịch trong IDE.

Xác định giá trị cho biến

Trong quá trình lập trình, bước thứ hai là gán giá trị cho biến đã được khai báo Để thực hiện việc này, bạn sử dụng toán tử gán, trong ngôn ngữ C, được biểu thị bằng dấu "=" Ví dụ: blinkRateSetting = 10;

Mẹo: Kết thúc một câu lệnh

Trong ngôn ngữ lập trình C, hầu hết các câu lệnh đều phải kết thúc bằng dấu chấm phẩy để trình biên dịch xác định ranh giới giữa các câu lệnh Bài viết này sẽ xem xét các trường hợp đặc biệt mà không cần sử dụng dấu chấm phẩy ở cuối câu lệnh.

Quá trình gán biến vào bộ nhớ bắt đầu khi trình biên dịch xác định một vị trí đủ lớn để lưu trữ kiểu dữ liệu và giá trị được gán.

Bạn có thể sử thực hiện tắt bằng cách khai báo biến và gán giá trị cho nó trong một câu lệnh: int blinkRateSetting = 10;

Với phương pháp này, trình biên dịch chỉ định vị trí bộ nhớ cho biến và lưu trữ giá trị dữ liệu trong một bước.

Hiểu các kiểu dữ liệu

Kiểu dữ liệu khai báo cho biến quyết định kích thước bộ nhớ cần thiết để lưu trữ dữ liệu trong ngôn ngữ lập trình Arduino Có nhiều kiểu dữ liệu khác nhau mà Arduino hỗ trợ, như được liệt kê trong bảng 5.1, cho thấy dung lượng bộ nhớ yêu cầu và giá trị tối đa mà mỗi kiểu dữ liệu có thể lưu giữ.

Kiểu dữ liệu int và long chỉ chứa giá trị số nguyên Kiểu float và double có thể lưu trữ giá trị số thập phân như 10.5 hoặc –1430.443456.

Kiểu dữ liệu Kích thước (Bytes) Khoảng giá trị boolean 1 Logic đúng hoặc sai char 1 -128 đến +127 byte 1 0 đến 255 int 2 -32,768 đến 32,767 word 2 0 đến 65,535 long 4 -2,147,483,648 đến 2,147,483,647 float 4 -3.4028235E+38 đến +3.4028235E+38 double 4 -3.4028235E+38 đến +3.4028235E+38

Bảng 5.1: Các kiểu dữ liệu ARDUINO

Chú ý: Giá trị Số nguyên ( int ) và Dấu phẩy động ( long )

Khi làm việc với các con số trong bản phác thảo Arduino, hãy chú ý rằng phép toán với số nguyên sẽ luôn cho kết quả là số nguyên Ví dụ, khi chia 5 cho 3, kết quả sẽ là 1 Để đảm bảo kết quả chính xác, bạn cần sử dụng các giá trị dấu phẩy động.

Khi xác định kiểu dữ liệu cho một biến trong Arduino, biến đó chỉ lưu trữ giá trị theo kiểu đã khai báo Ví dụ, nếu bạn khai báo kiểu dữ liệu là float với biến percent, Arduino sẽ sử dụng định dạng dấu phẩy động để lưu trữ, và bạn không thể thay đổi kiểu này Ngay cả khi bạn lưu trữ giá trị nguyên 1 trong biến percent, nó vẫn sẽ được lưu trữ dưới dạng 1,0.

Các lệnh có cấu trúc

Bạn sẽ học được gì trong giờ này:

Sử dụng câu lệnh if-then

Chuỗi các câu lệnh if-else với nhau Điều kiện thử nghiệm

Sử dụng câu lệnh switch

Trong các bản phác thảo Arduino, Arduino xử lý từng câu lệnh theo thứ tự xuất hiện, điều này phù hợp cho các hoạt động tuần tự Tuy nhiên, không phải tất cả các bản phác thảo đều hoạt động theo cách này.

Nhiều bản phác thảo yêu cầu điều khiển luồng logic giữa các câu lệnh, cho phép Arduino thực thi các câu lệnh khác nhau tùy thuộc vào từng tình huống Điều này bao gồm các lệnh cho phép Arduino bỏ qua hoặc lặp lại các câu lệnh dựa trên điều kiện của biến hoặc giá trị, thường được gọi là lệnh có cấu trúc.

Ngôn ngữ lập trình Arduino cung cấp nhiều lệnh có cấu trúc sẵn có, và trong chương này, chúng ta sẽ khám phá hai lệnh quan trọng là if và switch.

Làm việc với Câu lệnh if

Loại lệnh có cấu trúc cơ bản nhất là câu lệnh if Câu lệnh if trong C có như sau định dạng cơ bản: nếu (điều kiện) tuyên bố

Câu lệnh if-then là một khái niệm phổ biến trong lập trình, tuy nhiên, trong ngôn ngữ C, từ khóa "then" không xuất hiện.

C sử dụng hướng dòng để hoạt động như từ khóa "then" trong lập trình Arduino sẽ kiểm tra điều kiện trong dấu ngoặc đơn và thực hiện câu lệnh tiếp theo nếu điều kiện đúng, hoặc bỏ qua nếu điều kiện sai Ví dụ, với đoạn mã int x = 50; if (x == 50), Arduino sẽ thực hiện câu lệnh tiếp theo khi x bằng 50.

Serial.println("The value is 50"); if (x < 100)

Serial.println("The value is less than 100"); if (x > 100)

Serial.println("The value is more than 100");

Trong ví dụ đầu tiên, điều kiện kiểm tra xem biến x có bằng 50 hay không, sử dụng dấu bằng kép mà chúng ta sẽ tìm hiểu trong phần "Tìm hiểu các điều kiện so sánh" Sau đó, trình biên dịch thực thi câu lệnh Serial.println() trên dòng tiếp theo để in ra chuỗi kết quả.

Tương tự như vậy, ví dụ thứ hai kiểm tra xem giá trị được lưu trữ trong biến x có nhỏ hơn

100 hay không là, và do đó trình biên dịch thực thi câu lệnh Serial.println () thứ hai để hiển thị chuỗi.

Trong ví dụ thứ ba, giá trị của biến x không vượt quá 100, dẫn đến việc điều kiện trả về giá trị logic sai Kết quả là, câu lệnh Serial.println() cuối cùng sẽ bị trình biên dịch bỏ qua.

Câu lệnh if cơ bản cho phép xử lý các lệnh dựa trên điều kiện, nhưng thường bạn cần nhóm nhiều câu lệnh lại với nhau Để thực hiện điều này, bạn cần sử dụng dấu ngoặc nhọn mở và đóng để bao quanh các câu lệnh, ví dụ: int x = 50; if (x == 50) { }.

Serial.println("The x variable has been set");

Serial.println("and the value is 50");

Trong ví dụ này, đầu ra từ cả hai dòng in sẽ hiển thị trên màn hình nối tiếp Tất cả các tuyên bố nằm trong dấu ngoặc nhọn được xem là một phần của phần “thì” trong câu lệnh và bị điều khiển bởi trạng thái.

Câu lệnh if có thể gây khó khăn khi xác định mã nằm trong dấu ngoặc nhọn được điều kiện if kiểm soát Để dễ dàng hơn, bạn có thể thụt lề mã bên trong dấu ngoặc nhọn, như trong ví dụ dưới đây.

Bạn có thể định dạng thủ công bản phác thảo của mình hoặc để Arduino IDE hỗ trợ Để làm điều này, hãy căn trái tất cả mã trong bản phác thảo, sau đó chọn Công cụ > Định dạng tự động từ thanh menu Arduino IDE sẽ tự động xác định mã cần thụt vào.

Làm việc thử với Câu lệnh " if " Để thử nghiệm các câu lệnh if trong bản phác thảo Arduino của bạn, hãy làm theo các bước sau:

1 Mở Arduino IDE, sau đó nhập mã này vào cửa sổ trình chỉnh sửa: void setup() { int x = 50;

Serial.print("The value if x is:");

Serial.println("This value is greater than 25");

Serial.println("This statement executes no matter what the value is");

2 Chọn Công cụ > Định dạng Tự động từ thanh menu Điều này sẽ định dạng mã để thụt lề các câu lệnh bên trong khối mã if.

3 Lưu bản phác thảo dưới dạng sketch0601.

Để xác minh, biên dịch và tải bản phác thảo lên Arduino, bạn cần nhấp vào biểu tượng tải lên trên thanh công cụ hoặc chọn Tệp > Tải lên từ thanh menu.

Để mở màn hình nối tiếp, bạn hãy nhấp vào biểu tượng màn hình nối tiếp trên thanh công cụ hoặc chọn Tools > Serial Monitor từ thanh menu Thao tác này sẽ khởi động lại Arduino và mở ứng dụng màn hình nối tiếp, cho phép bạn xem kết quả.

The x variable has been set

And the value is not 50

6 Thay đổi mã để đặt giá trị của x thành 25 trong câu lệnh gán, sau đó biên dịch lại và tải bản phác thảo lên Arduino.

7 Mở màn hình nối tiếp Bây giờ bạn sẽ chỉ thấy kết quả sau:

This statement executes no matter what the value is

Sử dụng các câu lệnh khác

Trong câu lệnh if, bạn chỉ có một tùy chọn để chạy (hoặc không) câu lệnh.

Khi điều kiện trả về giá trị sai, trình biên dịch sẽ chỉ chuyển sang câu lệnh tiếp theo trong bản phác thảo Tuy nhiên, sẽ thật tuyệt nếu có thể thực hiện một tập hợp các câu lệnh thay thế khi điều kiện không đúng Câu lệnh khác chính là giải pháp cho vấn đề này, cho phép chúng ta thực hiện các hành động thay thế khi điều kiện không được thỏa mãn.

Câu lệnh else cung cấp một nhóm lệnh khác trong câu lệnh if: int x = 25; if (x == 50)

Serial.println("The value is 50"); else

Serial.println("The value is not 50");

Câu lệnh sau từ khóa else chỉ xử lý khi điều kiện if là sai.

Cũng giống như với khối mã lệnh if, bạn có thể sử dụng dấu ngoặc nhọn để kết hợp nhiều câu lệnh trong khối mã eles : void setup() { int x = 25;

Serial.println("The x variable has been set"); Serial.println("and the value is 50");

Serial.println("The x variable has been set"); Serial.println("and the value is not 50");

Serial.println("This ends the test");

Bạn có thể điều chỉnh giá trị của biến x để kiểm soát đầu ra Khi chạy bản phác thảo, bạn sẽ nhận được kết quả tương ứng.

The x variable has been set

And the value is not 50

Nếu bạn thay đổi giá trị của x thành 50, bạn sẽ nhận được kết quả sau:

The x variable has been set

Sử dụng câu lệnh else if

Vòng lặp lập trình

Giới thiệu

Các plcLib thư viện cho phép bạn phát triển các ứng dụng phần mềm điều khiển định hướng 'PLC-style' cho Arduino và khả năng tương thích.

Hình 1 Chuyển đổi một mạch điện đơn giản thành một sơ đồ bậc thang và sau đó thành một chương trình đơn giản.

Sau khi cài đặt thư viện, bạn sẽ có sẵn một loạt các bản phác thảo ví dụ Chương trình đơn giản nhất có thể thực hiện các chức năng hữu ích sẽ được tìm thấy trong trình đơn kéo xuống của Arduino IDE bằng cách chọn Tệp > Ví dụ > plcLib > InputOutput > BareMinimum.

2.1 Phương pháp phát triển phần mềm

Trong phương pháp thiết kế mạch điện phổ biến, các phần tử như công tắc và đèn được biểu diễn bằng đồ họa dưới dạng biểu đồ bậc thang, sau đó chuyển đổi thành văn bản dựa trên chương trình Arduino trước khi biên dịch và tải xuống Hệ thống cũng có thể được mô tả qua sơ đồ khối hoặc sơ đồ chức năng tuần tự, cho phép kết hợp với mã C/C++ gốc, mang lại sự linh hoạt trong việc lựa chọn phương pháp thiết kế phù hợp với từng vấn đề cụ thể.

Phần mềm được cung cấp dưới dạng thư viện Arduino có thể dễ dàng cài đặt và được bao gồm trong phần đầu của chương trình Sau đó, bạn sẽ có một loạt các lệnh kiểu PLC dựa trên văn bản để sử dụng trong các ứng dụng của mình.

Lưu ý rằng phần mềm hiện tại không hỗ trợ chương trình đồ họa nhập liệu, mô phỏng hoặc giám sát thời gian thực như một PLC thương mại hiện đại Tất cả các chương trình cần được nhập thông qua Arduino IDE tiêu chuẩn Hướng dẫn sử dụng cung cấp các sơ đồ minh họa quá trình thiết kế và liên kết với bản phác thảo ví dụ trong thư viện.

Các tính năng phần mềm được hỗ trợ bởi phiên bản plcLib hiện tại bao gồm đầu vào (kỹ thuật số / tương tự), đầu ra

Trong bài viết này, chúng ta sẽ khám phá các khái niệm quan trọng như kỹ thuật số, PWM, servo, toán tử logic Boolean, chốt, bộ định thời và dạng sóng lặp lại Thông tin chi tiết sẽ được cung cấp trong các phần tiếp theo của Hướng dẫn Sử Dụng, bao gồm cả hướng dẫn tải xuống và cài đặt.

2.2 Phần cứng được hỗ trợ

Thư viện plcLib hỗ trợ nhiều loại phần cứng khác nhau, bao gồm bảng nguyên mẫu, lá chắn I/O và các PLC tương thích với Arduino.

Hình 2 Sử dụng bảng nguyên mẫu để kết nối bộ thu điều khiển từ xa với Arduino Uno.

Các lá chắn Arduino ô tô được hỗ trợ như là tiêu chuẩn, cho phép tốc độ và hướng kiểm soát lên đến hai DC động cơ.

Hình 3 Điều khiển tối đa hai động cơ bằng Lá chắn động cơ Arduino.

Hệ thống mô-đun như Grove cho phép kết nối nhiều loại đầu vào và thiết bị đầu ra mà không cần phải nối dây hay hàn bảng nguyên mẫu, giúp đơn giản hóa quá trình xây dựng và thử nghiệm.

Hình 4 Một tấm chắn cơ sở Grove và mô-đun Bluetooth nối tiếp được kết nối với Arduino Uno.

Phiên bản 1.2 của phần mềm cung cấp nhiều cấu hình mẫu phần cứng, bao gồm các điều khiển và khiên công nghiệp PLC tương thích với Arduino Thông tin chi tiết về phần cứng được hỗ trợ có thể tìm thấy trong phần Xác định Phân bổ IO Tùy chỉnh.

Hình 5 Bộ điều khiển logic lập trình điển hình (PLC).

Các cấu hình I/O tùy chỉnh có thể được phát triển cho phần cứng không được hỗ trợ theo tiêu chuẩn Quy trình này được minh họa qua việc sử dụng lá chắn I/O Velleman cho Arduino làm nghiên cứu điển hình.

Hình 6 Tấm chắn Đầu vào / Đầu ra Velleman cung cấp một loạt các đầu vào và đầu ra được định cấu hình trước.

Cài đặt phần mềm

Vui lòng làm theo hướng dẫn dưới đây, tùy thuộc vào việc bạn cài đặt phần mềm lần đầu hay nâng cấp phiên bản hiện có.

Phần mềm plcLib có sẵn dưới dạng tệp ZIP để tải xuống và thêm vào Arduino IDE của bạn Sau khi cài đặt, bạn có thể duyệt qua các ví dụ và tạo bản phác thảo PLC riêng Phiên bản 1.2 của plcLib được phát hành vào ngày 21 tháng 12 năm 2015 Quy trình cài đặt phụ thuộc vào phiên bản Arduino IDE bạn đang sử dụng Đối với Arduino 1.6.4 trở lên, hãy chọn Phác thảo > Bao gồm Thư viện > Thêm Thư viện Zip và tìm tệp ZIP đã tải xuống Nếu bạn sử dụng phiên bản 1.0.5, hãy chọn Phác thảo > Nhập Thư viện > Thêm Thư viện từ menu.

Zip đã tải xuống trước đó Quá trình cài đặt được giải thích đầy đủ trong hướng dẫn

3.1.1 Tải và chạy ứng dụng đầu tiên của bạn

Với phần mềm được cài đặt, duyệt đến phần ví dụ và tải bản phác thảo Bare Minimum

/* Programmable Logic Controller Library for the Arduino and Compatibles

Bare Minimum - Single bit digital input and output

Input - switch connected to input X0 (Arduino pin A0)

Output - LED connected to output Y0 (Arduino pin 3)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

*/ void setup() { setupPLC(); // Setup inputs and outputs

} void loop() { in(X0); // Read Input 0 out(Y0); // Send to Output

Liệt kê 1 Bare Minimum (Nguồn: File> Examples> plcLib>

Lưu ý: Tất cả các ví dụ được hiển thị đều có sẵn từ phần Tệp> Ví dụ của Arduino IDE.

Bản phác thảo này mô tả cách kết nối một công tắc với đầu vào X0 (chân A0 trên Arduino) và gửi trạng thái đầu ra Y0 (chân 3 trên Arduino) Để kiểm tra hoạt động, bạn có thể kết nối với bảng nguyên mẫu hoặc sử dụng bất kỳ phần cứng nào được hỗ trợ, như đã nêu trong phần Định cấu hình Phần cứng.

Hình 7 Thử nghiệm chương trình Bare Minimum bằng cách sử dụng hệ thống thử nghiệm mô-đun.

3.2 Cập nhật lên phiên bản mới

Các phiên bản mới của phần mềm plcLib được phát hành định kỳ Để nâng cấp, trước tiên bạn cần xóa phiên bản hiện tại của thư viện, sau đó tiến hành cài đặt phiên bản mới theo hướng dẫn dưới đây.

1 Xác định vị trí của tệp thư viện trên máy tính của bạn, tệp này sẽ nằm trong thư mục thư viện bên dưới các Arduino Sketchbook địa điểm Chi tiết chính xác có thể khác nhau nhưng nó thường sẽ là một cái gì đó như [Tài liệu của tôi] / Arduino / thư viện , với một thư mục plcLib tồn tại bên dưới thư mục này nếu phần mềm có đã được cài đặt trước đó Bạn có thể kiểm tra đường dẫn đến thư mục Sketchbook bằng cách chọn

Tệp>Các tùy chọn từ

2 Đóng Arduino IDE, rồi xóa thư mục plcLib đã xác định ở trên (Đó là một ý tưởng hay để thực hiện một sao lưu bản sao của bất kỳ tệp hiện có nào trước khi xóa chúng - đề phòng trường hợp bạn mắc lỗi.)

3 Cài đặt lại thư viện như đã giải thích trước đó.

Phần tiếp theo giới thiệu cách sắp xếp phần cứng được sử dụng bởi phần mềm.

4 Định cấu hình phần cứng

Bộ đầu vào và đầu ra cơ bản được bật theo mặc định Cấu hình mặc định này được chọn trước tiên

Để bắt đầu, bạn cần bao gồm tệp thư viện PLC bằng cách sử dụng câu lệnh #include và gọi hàm setupPLC() trong phần setup() của bản phác thảo, như minh họa trong ví dụ của Liệt kê 1 Phần mềm này tối thiểu xác định bốn đầu vào: X0, X1, X2 và X3.

(đầu vào tương tự A0 - A3 ) và bốn đầu vào đầu ra Y0 , Y1 , Y2 và Y3 (chân 3, 5, 6 và 9).

Hình 8 Phân bổ đầu vào / đầu ra mặc định cho các bo mạch Arduino thông thường

Các chân bổ sung được phân bổ cho các bảng Arduino lớn hơn

Bảng mạch Mega, Mega2560 hoặc Due cung cấp tổng cộng 8 đầu vào và 8 đầu ra, với các tính năng chính của bố cục phần cứng được giải thích chi tiết dưới đây.

• Đầu vào có khả năng đọc các giá trị kỹ thuật số hoặc tương tự.

• Đầu ra có thể tạo ra các giá trị kỹ thuật số, PWM hoặc servo.

• Các chân Arduino có chức năng trùng lặp đã được tránh ở bất cứ nơi nào có thể, để giảm thiểu phần cứng xung đột.

Đầu vào và đầu ra được cấu hình tự động, với đầu ra ban đầu ở trạng thái tắt, dựa trên giả định rằng 0 biểu thị 'tắt' và 1 biểu thị 'bật'.

Lưu ý: Hầu hết các tệp ví dụ được cung cấp đều sử dụng cấu hình I / O tiêu chuẩn.

Nếu bạn không hài lòng với sự sắp xếp mặc định, có nhiều tùy chọn phần cứng tùy chỉnh có sẵn, hoặc bạn cũng có thể tạo ra sự sắp xếp của riêng mình.

Trong phần tiếp theo, chúng tôi sẽ trình bày cách sử dụng sơ đồ bậc thang để mô tả cấu trúc và hoạt động của một hệ thống đơn giản, đồng thời chuyển đổi nó thành chương trình logic bậc thang Các khái niệm về logic bậc thang sẽ được phát triển sâu hơn trong các phần tiếp theo của Hướng dẫn sử dụng plcLib.

Bắt đầu với Logic bậc thang

Phương pháp thiết kế PLC bắt đầu bằng việc tạo ra một mạch điện hoặc sơ đồ khối, sau đó chuyển đổi thành sơ đồ bậc thang Tiếp theo, sơ đồ này được chuyển thành bản phác thảo Arduino trước khi biên soạn và tải về theo cách thông thường Hình ảnh dưới đây minh họa rõ ràng quá trình này.

Hình 9 Chuyển đổi mạch điện thành sơ đồ bậc thang và sau đó thành chương trình logic bậc thang.

Biểu đồ bậc thang, được đặt tên theo hình dạng giống như một cái thang, bao gồm hai ray điện dọc và các bậc nối ngang giữa chúng Mỗi bậc thang trong sơ đồ này đại diện cho một mạch riêng biệt, tạo nên một cấu trúc phức tạp với nhiều bậc thang khác nhau.

Sơ đồ bậc thang là sự phát triển của công nghệ logic rơle, trong đó sử dụng các công tắc và rơle để điều khiển mạch công nghiệp Dưới đây là một ví dụ về mạch logic rơle đơn giản.

Hình 10 Một mạch Logic Relay đơn giản.

Lưu ý rằng đường ray điện dương nằm bên trái và tiêu cực bên phải Các công tắc SW1 và SW2 được thiết kế để ngắt mạch, với đèn liên quan sáng khi nhấn hoặc thả công tắc Công tắc SW3 kết nối với cuộn dây rơle RL1, điều khiển các tiếp điểm rơle để chỉ một đèn BL3 hoặc BL4 sáng tại một thời điểm.

Tất cả các chương trình sử dụng thư viện phần mềm plcLib cần được nhập dưới dạng văn bản Arduino chuẩn, mà các lập trình viên PLC thường gọi là lập trình danh sách lệnh Qua thực hành, việc chuyển đổi sơ đồ bậc thang thành bản phác thảo Arduino trở nên đơn giản hơn Có nhiều lựa chọn thay thế cho phương pháp thiết kế logic bậc thang, bao gồm khối chức năng lập trình, biểu đồ chức năng tuần tự và văn bản có cấu trúc, mỗi phương pháp sẽ được thảo luận riêng.

Năm phương pháp lập trình được xác định theo Phần 3 của tiêu chuẩn IEC 61131 (còn được biết đến tại Vương quốc Anh là BS EN 61131-3) bao gồm sơ đồ bậc thang, danh sách lệnh, khối chức năng, tuần tự biểu đồ chức năng và văn bản có cấu trúc Những phương pháp này chủ yếu được sử dụng để lập trình bộ điều khiển.

5.1 Đầu vào và đầu ra bit đơn tắt hoặc bình thường trên các biểu mẫu Một đầu vào bình thường tương đương với một công tắc nhấn để thực hiện và được biểu diễn bởi một cặp đường thẳng đứng trong sơ đồ bậc thang Một công tắc nhấn để ngắt cung cấp một công tắc thường đóng kết nối và điều này được hiển thị bằng cách thêm một đường chéo giữa các tiếp điểm dọc Một tương tự sự sắp xếp được sử dụng cho các đầu ra được hiển thị dưới dạng một cặp đường cong (hoặc thậm chí là một hình tròn), với một đường chéo được thêm vào để có đầu ra đảo ngược Sơ đồ bậc thang dưới đây cho thấy đầu vào và đầu ra của các giá trị ở dạng bình thường và dạng đảo ngược.

Hình 11 Sơ đồ bậc thang thể hiện các phương pháp đọc đầu vào và điều khiển đầu ra

Sơ đồ bậc thang có thể dễ dàng chuyển đổi thành bản phác thảo dựa trên văn bản, như được hiển thị bên dưới.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Digital Input / Output - Single bit I/O in normal and inverted forms

Input - switch connected to input X0 (Arduino pin A0)

Input - switch connected to input X1 (Arduino pin A1)

Input - switch connected to input X2 (Arduino pin A2)

Input - switch connected to input X3 (Arduino pin A3)

Output - LED connected to output Y0 (Arduino pin 3)

Output - LED connected to output Y1 (Arduino pin 5)

Output - LED connected to output Y2 (Arduino pin 6)

Output - LED connected to output Y3 (Arduino pin 9)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

*/ void setup() { setupPLC(); // Setup inputs and outputs

In the loop function, Input 0 is read and sent to Output 0, while Input 1 is read in an inverted state and transmitted to Output 1 Input 2 is processed normally and sent to Output 2 in an inverted form, while Input 3 is also read in an inverted manner and sent to Output 3, resulting in an inverted output due to the double negation.

Liệt kê 2 Đầu vào / đầu ra kỹ thuật số (Nguồn: Tệp> Ví dụ> plcLib> inputOutput> DigitalInputOutput)

Phần mềm PLC thực hiện tính toán theo từng bậc của sơ đồ bậc thang theo trình tự từ trái sang phải và từ trên xuống dưới thông qua quá trình 'quét' các đầu vào, thực hiện tính toán và xuất kết quả, được gọi là chu kỳ quét Mỗi bậc trong sơ đồ bậc thang là một nhiệm vụ riêng biệt, và máy tính phân chia sức mạnh xử lý giữa các tác vụ này theo một trình tự lặp lại Nhờ vào khả năng xử lý cao, PLC có thể tạo ra cảm giác như đang thực hiện nhiều hoạt động đồng thời.

Các đầu vào có thể được kết nối theo cách chuỗi hoặc song song để hình thành Logic Boolean đơn giản, hay còn gọi là logic tổ hợp, như sẽ được trình bày trong phần tiếp theo.

5.2 Thực hiện các phép toán Boolean

Các hàm logic Boolean như AND và OR có thể được thực hiện thông qua cách sắp xếp chuỗi hoặc song song của các công tắc Cụ thể, hai công tắc nối tiếp tạo ra chức năng AND, yêu cầu cả hai công tắc phải đóng để hoàn thành mạch Ngược lại, chức năng OR được thực hiện bằng cách kết nối hai công tắc song song, cho phép dòng điện đi qua khi ít nhất một trong các công tắc được đóng.

Hình 12 Các bộ chuyển mạch nối tiếp và song song thực hiện các chức năng logic AND và OR.

Các hàm logic Boolean cơ bản như AND, OR, XOR và NOT có thể được biểu diễn qua biểu đồ bậc thang bằng cách sử dụng sự kết hợp nối tiếp và song song của các công tắc đầu vào cùng với các tiếp điểm đầu ra.

Hình 13 Các hàm logic bậc thang logic Boolean và các hàm logic tương đương của chúng.

Sự sắp xếp sơ đồ bậc thang này có thể được mã hóa dễ dàng, như thể hiện trong bản phác thảo sau.

/* Programmable Logic Controller Library for the Arduino and Compatibles

AND, OR, XOR and Not - Basic Boolean Logic Functions

Input - switch connected to input X0 (Arduino pin A0)

Input - switch connected to input X1 (Arduino pin A1)

Output - ANDed Output - LED connected to output Y0 (Arduino pin 3)

Output - ORed Output - LED connected to output Y1 (Arduino pin 5)

Output - XORed Output - LED connected to output Y2 (Arduino pin 6)

Output - Inverted Output - LED connected to output Y3 (Arduino pin 9)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

The provided code initializes a PLC setup and continuously processes inputs and outputs in a loop It reads Input 0 (X0) and performs bitwise operations with Input 1 (X1), including AND, OR, and XOR, sending the results to Outputs 0 (Y0), 1 (Y1), and 2 (Y2) respectively Additionally, it sends the inverted result of Input 0 to Output 3 (Y3).

Liệt kê 3 Các hàm AND, OR, XOR và Not (Nguồn: Tệp> Ví dụ> plcLib> Logic>

AndOrXorNot Nếu yêu cầu đầu ra hoạt động ở mức thấp thì các hàm tương đương NAND, NOR và XNOR có thể được tạo trong logic bậc thang.

Hình 14 Các mạch logic bậc thang NAND, NOR và XNOR và các chức năng logic tương đương của chúng.

Việc mã hóa các hàm này được thực hiện bằng cách thay thế các lệnh out() trong ví dụ trước bằng lệnh logic âm outNot(), như minh họa dưới đây.

/* Programmable Logic Controller Library for the Arduino and Compatibles

NAND, NOR, and XNOR - Boolean Logic functions with inverted outputs

Input - switch connected to input X0 (Arduino pin A0)

Input - switch connected to input X1 (Arduino pin A1)

Output - NAND Output - LED connected to output Y0 (Arduino pin 3) Output - NOR Output - LED connected to output Y1

Output - XNOR Output - LED connected to output Y2 (Arduino pin 6)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/ */ void setup() { setupPLC(); // Setup inputs and outputs

// NAND in(X0); // Read Input 0 andBit(X1); // AND with Input 1 outNot(Y0); // Send result to Output 0 (inverted)

// NOR in(X0); // Read Input 0 orBit(X1); // OR with Input 1 outNot(Y1); // Send result to Output 1 (inverted)

// XNOR in(X0); // Read Input 0 xorBit(X1); // XOR with Input 1 outNot(Y2); // Send result to Output 2 (inverted)

Liệt kê 4 Các hàm NAND, NOR và XNOR (Nguồn: Tệp> Ví dụ> plcLib> Logic>

Các phép toán logic cũng có thể được thực hiện với một hoặc nhiều đầu vào được đảo ngược, như được thấy ở đây.

Hình 15 Thực hiện các phép toán Boolean liên quan đến các tín hiệu đầu vào đảo ngược.

Dưới đây là một bản phác thảo tương đương.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Inverted Input Logic - Boolean logic operations using inverted inputs

(equivalent to normally closed input switches)

Input - switch connected to input X0 (Arduino pin A0)

Input - switch connected to input X1 (Arduino pin A1)

Output - ANDed output - LED connected to output Y0 (Arduino pin 3) Output - ORed output - LED connected to output Y1 (Arduino pin 5) http://www.electronics-micros.com/software-hardware/plclib-arduino/

*/ void setup() { setupPLC(); // Setup inputs and outputs

} void loop() { in(X0); // Read Input 0 andNotBit(X1); // AND with Input 1 (inverted) out(Y0); // Send result to

Output 0 in(X0); // Read Input 0 orNotBit(X1); // OR with Input 1 (inverted) out(Y1); // Send result to

Liệt kê 5 Logic đầu vào đảo ngược (Nguồn: Tệp> Ví dụ> plcLib> Logic>

Có thể thực hiện các phép toán logic liên quan đến trạng thái của các tiếp điểm đầu ra, cho phép áp dụng phản hồi từ đầu ra đến đầu vào Điều này tạo thành cơ sở của logic tuần tự, với chốt Cài đặt-Đặt lại là ví dụ đơn giản nhất sẽ được xem xét tiếp theo.

Đầu ra chốt

Bạn có thể thiết lập một đầu vào tạm thời và giữ cho nó hoạt động cho đến khi cần hủy hoặc đặt lại Dưới đây là ba phương pháp khác nhau để thực hiện điều này.

6.1 Chốt với các thành phần rời rạc

Chốt Set-Reset là một thành phần quan trọng trong thiết bị điện tử, đại diện cho một trong những mạch logic tuần tự đơn giản nhất, thường được cấu tạo từ cặp cổng NAND hoặc NOR kết nối chéo Việc chế tạo một bản chốt mạch có thể thực hiện dễ dàng chỉ với một rơ le và một số linh kiện khác, như minh họa trong mạch logic rơle.

Hình 16 Các thành phần rời rạc đã được sử dụng ở đây để tạo ra một mạch tự chốt.

Kiểm tra mạch điện bên trái, hai công tắc được nối song song, tạo thành một hệ thống hợp lý Hiện tại, dòng điện không chạy qua bất kỳ nhánh nào do nhánh phía trên bị tắt và nhánh dưới cũng bị chặn bởi các tiếp điểm rơ le ở vị trí tắt Khi nhấn công tắc đầu vào Đặt, nguồn điện sẽ đến cuộn dây rơ le, kích hoạt nó và di chuyển các tiếp điểm chuyển tiếp đến vị trí Bật Dòng điện sẽ chạy qua nhánh dưới, giữ cho rơ le hoạt động ngay cả khi đầu vào Đặt được giải phóng Rơ le sẽ chỉ ngừng hoạt động khi công tắc Đặt lại được nhấn, ngắt kết nối cuộn dây và đưa các tiếp điểm về trạng thái Tắt.

Lưu ý rằng các chốt Reset thường có cả đầu ra bình thường và đầu ra ngược Nếu cần thiết, chức năng này có thể được bổ sung dễ dàng bằng cách kết nối một đèn thứ hai thông qua bộ tiếp điểm của công tắc không sử dụng, với cực tính ngược lại so với đầu ra chính.

Một bản phác thảo Arduino tương đương được hiển thị bên dưới.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Latch using Discrete Components - Self latching circuit with Q and Not Q outputs

Input - Set - switch connected to input X0 (Arduino pin A0)

Input - Reset - switch connected to input X1 (Arduino pin A1)

Output - NotQ - LED connected to output Y1 (Arduino pin 5)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

*/ void setup() { setupPLC(); // Setup inputs and outputs

} void loop() { in(X0); // Read switch connected to Input 0 (Set) orBit(Y0); // Self latch using Output 0

(Q) andNotBit(X1); // Reset latch using Input 1 (Reset) out(Y0); // Output to Output 0 (Q) in(Y0); // Read Q output outNot(Y1); // Produce inverted output on Output 1 (Not Q) }

Liệt kê 6 Latch bằng cách sử dụng các thành phần rời rạc (Nguồn: Tệp> Ví dụ> plcLib> Latch>LatchDiscreteComponents)

Mạch tự chốt ở trên hoạt động tốt, nhưng khá dài dòng Một phiên bản đơn giản hóa được hiển thị trong phần tiếp theo.

Lệnh latch() hoạt động tương tự như cách sắp xếp tự chốt, nhưng cần tối thiểu hai dòng mã Sơ đồ khối chức năng cho thấy hai biến thể: biến thể đầu tiên cung cấp cả đầu ra bình thường và đảo ngược, trong khi biến thể thứ hai chỉ có một đầu ra bình thường duy nhất.

Hình 17 Đặt các ký hiệu chốt thiết lập lại, được hiển thị cả khi có và không có đầu ra đảo ngược.

Bản phác thảo dưới đây minh họa một chốt với cả đầu ra bình thường và đầu ra đảo ngược, trong đó hai dòng được sử dụng để tạo ra đầu ra đảo ngược là tùy chọn.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Latch Command - Set Reset latch with Q and NotQ outputs, based on the 'latch' command

Input - Set - switch connected to input X0 (Arduino pin A0)

Input - Reset - switch connected to input X1 (Arduino pin A1)

Output - Q - LED connected to output Y0 (Arduino pin 3)

Output - NotQ - LED connected to output Y1 (Arduino pin 5)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

*/ void setup() { setupPLC(); // Setup inputs and outputs

} void loop() { in(X0); // Read switch connected to Input 0 (Set input) latch(Y0, X1); // Latch, Q = Output 0, Reset =

Input 1 in(Y0); // Read Q output and generate NotQ on Output 1 outNot(Y1); // (These two lines are optional)

Liệt kê 7 Lệnh Latch (Nguồn: File> Examples> plcLib> Latch>

Đầu vào Đặt thành chốt được lấy từ giá trị trước đó của cùng một 'nấc' trong sơ đồ bậc thang, cụ thể là đầu vào X0 Lệnh này nhận hai đối số, bao gồm các Q đầu ra và đầu vào đặt lại tương ứng.

6.3 Sử dụng các lệnh Set và Reset

Một phương pháp thay thế để tạo đầu ra được chốt là sử dụng các lệnh set() và reset() riêng biệt , như thể hiện trong bản phác thảo sau.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Using Set and Reset commands to create a Set-Reset Latch

Input - Set - switch connected to input X0 (Arduino pin A0)

Input - Reset - switch connected to input X1 (Arduino pin A1)

Output - Q - LED connected to output Y0 (Arduino pin 3)

Output - NotQ - LED connected to output Y1 (Arduino pin 5)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

*/ void setup() { setupPLC(); // Setup inputs and outputs

} void loop() { in(X0); // Read switch connected to Input 0 (Set input) set(Y0); // Set Y0 to 1 if X0 = 1, leave Y0 unaltered otherwise in(X1); // Read switch connected to X1 reset(Y0); // Clear Y0 to 0 if X1 = 1, leave Y0 unaltered otherwise

Liệt kê 8 Các lệnh Đặt và Đặt lại (Nguồn: Tệp> Ví dụ> plcLib> Latch SetResetCommands )

Các lệnh set () và reset () có sẵn trong Phiên bản 0.7 trở lên của thư viện plcLib.

Một chữ cái bổ sung trong biểu tượng đầu ra tiêu chuẩn chỉ rõ đầu ra thuộc loại 'đặt' hoặc 'đặt lại', điều này được minh họa rõ ràng trong sơ đồ bậc thang tương đương.

Hình 18 Một chốt được thực hiện bằng cách sử dụng đầu ra Set và Reset.

Phương pháp này cung cấp khả năng kiểm soát độc lập việc bật và tắt đầu ra, mang lại sự tiện lợi Biểu đồ chức năng tuần tự là một ví dụ tiêu biểu, cho phép sử dụng các lệnh để quản lý quá trình chuyển đổi giữa các bước trong một trình tự.

Xung kích hoạt cạnh

Phiên bản 1.1 của phần mềm plcLib đã bổ sung khả năng tạo ra các xung kích hoạt cạnh, cho phép đầu ra chỉ hoạt động trong một chu kỳ quét Tính năng này rất hữu ích trong nhiều tình huống, như kích hoạt đầu ra một lần duy nhất, đảm bảo đầu ra kéo dài trong thời gian ngắn hơn đầu vào, hoặc ngăn chặn hệ thống bị khóa do lỗi công tắc bên ngoài Một hệ thống kích hoạt cạnh đơn giản được minh họa dưới đây.

Các xung đầu ra ngắn gọn có thể được tạo ra từ các cạnh tăng hoặc giảm của dạng sóng đầu vào Điều này được thể hiện qua sơ đồ bậc thang, trong đó các cạnh tăng hoặc giảm của đầu vào X0 được sử dụng để thiết lập đầu ra Y0 và Y1 trong một khoảng thời gian ngắn, tương ứng.

Hình 20 Các xung đầu ra trên Y0 và Y1 được tạo ra bởi các cạnh tăng hoặc giảm của dạng sóng đầu vào X0.

Dưới đây là một bản phác thảo tương đương.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Generate rising-edge and falling-edge pulses using a digital input

Clock input - switch connected to input X0 (Arduino pin A0)

Rising-edge output - LED connected to output Y0 (Arduino pin 3)

Falling-edge output - LED connected to output Y1 (Arduino pin 5)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

Pulse pulse1; // Create a pulse object called 'pulse1' void setup() { setupPLC(); // Setup inputs and outputs

In the loop function, the program reads the state of a switch connected to Input 0 and processes clock inputs using pulse1.inClock() It detects the rising edge with pulse1.rising() and outputs this signal for one scan cycle via out(Y0) Similarly, it captures the falling edge using pulse1.falling() and outputs it through out(Y1) for another scan cycle To allow for better visualization of the pulses, a delay of 50 milliseconds is introduced to slow down the scan cycle.

// (remove this delay in the final code) }

Liệt kê 9 Tạo xung cạnh lên và xung xuống (Nguồn: Tệp> Ví dụ> plcLib> Xung>

Quá trình bắt đầu bằng việc tạo ra một đối tượng xung được gọi là 'xung1' từ danh sách trên Tiếp theo, đầu vào bên ngoài X0 được kết nối với đầu vào xung clock của xung đã tạo trước đó Cuối cùng, các tín hiệu cạnh tăng và giảm được sử dụng để điều khiển đầu ra Y0 và Y1 tương ứng, cho phép thực hiện các hoạt động điều khiển phức tạp.

Các xung đầu ra chỉ tồn tại trong một chu kỳ quét duy nhất, do đó, độ trễ 50 mili giây đã được thêm vào để kéo dài các xung này đủ lâu cho việc quan sát khi kết nối với đèn LED Tuy nhiên, độ trễ này cần được loại bỏ sau khi kiểm tra để không làm chậm chu kỳ quét.

7.1 Tạo một bảng tin được kích hoạt cạnh

Một chốt đặt lại đơn giản có thể được tạo ra bằng nhiều phương pháp khác nhau Trong bối cảnh có khả năng xảy ra lỗi ở các công tắc đầu vào, việc xem xét tác động đến mạch chốt khi cả hai đầu vào Set và Reset được kích hoạt đồng thời là rất quan trọng Ngoài ra, cần lưu ý trường hợp một trong các công tắc đầu vào bên ngoài bị kẹt ở vị trí 'Bật'.

Các vấn đề tiềm ẩn có thể được giải quyết hiệu quả bằng cách sử dụng các tín hiệu kích hoạt cạnh để tăng cường đầu vào chốt, như minh họa trong sơ đồ bậc thang dưới đây.

Hình 21 Sử dụng các đầu vào được kích hoạt cạnh để đặt hoặc đặt lại một đầu ra.

Dưới đây là một bản phác thảo tương đương.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Set or reset an output using edge-triggered inputs

Set input - switch connected to input X0 (Arduino pin A0) Reset input - switch connected to input X1 (Arduino pin A1)

Latched output - LED connected to output Y0 (Arduino pin 3)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

Pulse setPulse; // Create a pulse object to set the latch

Pulse resetPulse; // Create a pulse object to reset the latch void setup() { setupPLC(); // Setup inputs and outputs

In the loop function, the program reads the state of a switch connected to Input 0 and connects it to the set pulse clock input It also reads the state of a switch connected to Input 1, linking it to the reset pulse clock input When a rising edge is detected on Input 0, the program sets Y0 to 1, and when a rising edge is detected on Input 1, it resets Y0 to 0.

Liệt kê 10 Đặt hoặc đặt lại đầu ra bằng đầu vào được kích hoạt cạnh (Nguồn: Tệp>

Ví dụ> plcLib>Pulse> SetResetEdge)

Nhập từ bàn phím

Bàn phím ma trận là thiết bị đầu vào hữu ích, cho phép người dùng điều khiển đầu ra PLC bằng cách nhấn các phím cụ thể Bài viết sẽ sử dụng bàn phím màng tiêu chuẩn và thư viện bàn phím miễn phí để minh họa cách kích hoạt nhiều đầu ra LED khác nhau.

Hình 22 Mạch thử nghiệm và bản phác thảo, với đầu vào bàn phím và đầu ra LED được chốt.

Lưu ý: Trước khi thử các ví dụ, bạn cần tải xuống và cài đặt thư viện Bàn phím

Arduino Các các tệp ví dụ về bàn phím có sẵn với Phiên bản 0.6 trở lên của phần mềm plcLib

Chúng tôi sẽ sử dụng bảng mạch chính Arduino Uno cho các ví dụ, với phần mềm plcLib định nghĩa bốn đầu vào (X0 – X3) và bốn đầu ra (Y0 – Y3) Bàn phím Adafruit 12 phím, sắp xếp theo dạng ma trận bốn hàng và ba cột, yêu cầu thêm bảy chân IO Hình ảnh dưới đây minh họa phân bổ đầu vào và đầu ra đã chọn.

Hình 23 Cấp phát IO cho Arduino Uno và bàn phím màng.

Một cách sắp xếp hệ thống dây bảng nguyên mẫu có thể được hiển thị bên dưới (được vẽ bằng cách sử dụng Fritzing )

Hình 25 Các kết nối bàn phím và đèn LED (bên trái), chi tiết hệ thống dây dẫn của bảng nguyên mẫu (bên phải).

Danh sách dưới đây áp dụng chương trình nhập bàn phím tiêu chuẩn, sử dụng chức năng latchKey() để bật hoặc tắt một bit đầu ra Chức năng này dựa trên các lần nhấn tạm thời của các phím Đặt và Đặt lại được phân bổ.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Matrix Keypad with On/Off Control of Latched LED Outputs

Output - LED connected to output Y0 (Arduino pin 3)

Output - LED connected to output Y1 (Arduino pin 5)

Output - LED connected to output Y2 (Arduino pin 6)

Output - LED connected to output Y3 (Arduino pin 9)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

#include // Include the Keypad library

#include // Include the plcLib library char keyPress = 0; // Holds the currently pressed key value (if any) const byte ROWS = 4; // Keypad has four rows const byte COLS = 3; //

/ Define the Keymap char keys[ROWS][COLS] =

/ Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins. byte rowPins[ROWS] = { 8, 7, 4, 2 };

/ Connect keypad COL0, COL1 and COL2 to these Arduino pins byte colPins[COLS] = { 12, 11, 10 };

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); void setup() { setupPLC(); // Define input / output pins

{ keyPress = kpd.getKey(); // Read key pressed (if any) latchKey('1', '2', Y0); // Keyboard latch, Set = '1', Reset = '2',

// output = Y0 (pin 3) latchKey('3', '4', Y1); // Keyboard latch, Set = '3', Reset = '4', // output = Y1 (pin 5) latchKey('5', '6', Y2); // Keyboard latch, Set = '5', Reset = '6',

// output = Y2 (pin 6) latchKey('7', '8', Y3); // Keyboard latch, Set = '7', Reset = '8',

// Keypad-based Set-Reset latch, outputting to a pin unsigned int latchKey(char en, char dis, int outPin) { if(keyPress) { if (keyPress == en) { digitalWrite(outPin, HIGH);

} if (keyPress == dis) { digitalWrite(outPin, LOW);

Liệt kê 11 Bàn phím ma trận với Điều khiển Bật / Tắt các đầu ra LED được chốt (Nguồn:

Tệp> Ví dụ> plcLib> Bàn phím> LedOnOff)

Bốn lệnh latchKey () trong bản phác thảo kích hoạt các đèn LED kết nối với đầu ra Y0, Y1, Y2 hoặc Y3 khi nhấn các phím '1', '3', '5' hoặc '7', trong khi các phím '2', '4', '6' và '8' sẽ tắt đầu ra tương ứng.

Một thay đổi nhỏ trong cách phân bổ công tắc cho phép một phím đầu vào duy nhất hoạt động như một nút thiết lập lại chính, như được thể hiện trong đoạn mã sau: void loop().

{ keyPress = kpd.getKey(); // Read key pressed (if any) latchKey('1', '*', Y0); // Keyboard latch, Set = '1', Reset = '*',

// output = Y0 (pin 3) latchKey('2', '*', Y1); // Keyboard latch, Set = '2', Reset = '*',

// output = Y1 (pin 5) latchKey('3', '*', Y2); // Keyboard latch, Set = '3', Reset = '*',

// output = Y2 (pin 6) latchKey('4', '*', Y3); // Keyboard latch, Set = '4', Reset = '*',

Liệt kê 12 Sửa đổi khóa đặt lại chính (Nguồn: Tệp> Ví dụ> plcLib> Bàn phím> LedStop)

Người dùng có thể lưu trữ bit đầu ra chốt trong một biến do mình xác định, thay vì gửi trực tiếp đến chân đầu ra Ví dụ về cách tiếp cận này được trình bày trong bản phác thảo LedVariable, trong khi phương pháp cơ bản được thảo luận trong phần Sử dụng biến trong chương trình.

Thời gian trễ sử dụng

Phần mềm plcLib cung cấp các lệnh để tạo độ trễ thời gian thông qua việc kích hoạt hoặc hủy kích hoạt tín hiệu đầu vào, bao gồm lệnh timerOn() và timerOff() Ngoài ra, phần mềm còn cho phép tạo ra xung đầu ra với thời gian cố định bằng lệnh timerPulse() Tất cả các lệnh này đều yêu cầu hai tham số: tên của biến bộ hẹn giờ và thời gian trễ tính bằng mili giây.

Tránh sử dụng lệnh delay() trong Arduino nếu có thể, vì nó sẽ tạm dừng chu kỳ quét PLC trong suốt thời gian trì hoãn và chỉ cho phép một khoảng thời gian trễ duy nhất hoạt động tại bất kỳ thời điểm nào Để biết thêm chi tiết, hãy tham khảo phần Nâng cao trong khái niệm.

9.1 Tạo ra độ trễ khi bật

Lệnh timerOn () trì hoãn việc kích hoạt đầu ra cho đến khi đầu vào liên tục hoạt động cho khoảng thời gian được chỉ định tính bằng mili giây.

Hình 26 Một bộ định thời trễ cung cấp việc kích hoạt một đầu ra bị trì hoãn

Hệ thống dựa trên bộ đếm thời gian có thể được thể hiện dễ dàng thông qua sơ đồ khối hoặc khối chức năng biểu đồ, như minh họa trong ví dụ dưới đây.

Hình 27 Một cặp bộ định thời gian trễ tạo ra các độ trễ riêng biệt, được điều khiển bởi hai đầu vào khác nhau.

Hai bộ hẹn giờ trễ cung cấp độ trễ kích hoạt độc lập là 2 giây cho Đầu ra 0 và 4 giây cho Đầu ra 1 Đầu ra 0 sẽ hoạt động sau khi Đầu vào 0 được kích hoạt trong 2 giây, trong khi Đầu ra 1 yêu cầu Đầu vào 1 hoạt động trong 4 giây Các bản phác thảo tương đương được hiển thị bên dưới.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Turn-on Delay - Delays turning an output on after an input is applied

Input - switch connected to input X0 (Arduino pin A0)

Input - switch connected to input X1 (Arduino pin A1)

Output with 2 s delay - LED connected to output Y0 (Arduino pin 3)

Output with 4 s delay - LED connected to output Y1 (Arduino pin 5)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib- arduino/

*/ unsigned long TIMER0 = 0; // Variable to hold elapsed time for Timer 0 unsigned long TIMER1 = 0; //

Variable to hold elapsed time for Timer 1 void setup() { setupPLC(); // Setup inputs and outputs

} void loop() { in(X0); // Read Input 0 timerOn(TIMER0, 2000); // 2 second delay out(Y0); // Output to Output 0 in(X1); // Read Input 1 timerOn(TIMER1, 4000); // 4 second delay out(Y1); // Output to Output 1

Liệt kê 13 Độ trễ khi bật (Nguồn: File> Examples> plcLib> TimeDelays> DelayOn)

Mỗi bộ hẹn giờ sử dụng nội bộ cần khai báo biến bộ hẹn giờ đã trôi qua thuộc loại 'unsigned long' khi bắt đầu chương trình.

Một vấn đề thường gặp ở các hệ thống sử dụng công tắc hoặc bàn phím là hiện tượng số liên lạc bị trả lại, trong đó một lần nhấn phím có thể khiến các địa chỉ liên lạc bị trả lại nhiều lần trong khoảng thời gian vài mili giây trước khi được xử lý Để khắc phục hiệu ứng cơ học này, có thể sử dụng bộ đếm thời gian trễ với thời gian trễ phù hợp.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Switch Debounce - Delays a switch input by 10 ms to remove contact bounce

Input - switch connected to input X0 (Arduino pin A0) Output - debounced output - LED connected to output Y0 (Arduino pin 3)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

*/ unsigned long TIMER0 = 0; // Define variable used to hold timer 0 elapsed time void setup() { setupPLC(); // Setup inputs and outputs

} void loop() { in(X0); // Read Input 0 timerOn(TIMER0, 10); // 10 ms delay out(Y0); // Output to

Liệt kê 14 Switch Debounce (Nguồn: File> Examples> plcLib> TimeDelays>

9.3 Tạo độ trễ khi tắt máy

Bộ hẹn giờ trễ tắt bật sẽ ngay lập tức hoạt động và sau đó trì hoãn việc tắt trong một khoảng thời gian nhất định khi đầu vào kiểm soát bị loại bỏ.

Hình 28 Độ trễ tắt làm cho đầu ra vẫn hoạt động trong một khoảng thời gian cố định sau khi đầu vào bị loại bỏ.

Một ứng dụng của độ trễ khi tắt máy là 'giãn xung', trong đó tín hiệu đầu vào ngắn gọn được mở rộng để đạt được độ rộng xung tối thiểu Sơ đồ khối chức năng minh họa bộ hẹn giờ tắt trễ với thời gian trễ 2 giây.

Hình 29 Một bộ hẹn giờ tắt có độ trễ 2 giây.

Bản phác thảo tương đương được đưa ra dưới đây.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Turn-off Delay - Delays turning an output off after an input is removed

Input - switch connected to input X0 (Arduino pin A0) Output - LED connected to output

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

*/ unsigned long TIMER0 = 0; // Variable to hold elapsed time for Timer 0 void setup() { setupPLC(); // Setup inputs and outputs

} void loop() { in(X0); // Read Input 0 timerOff(TIMER0, 2000); // 2 second turn-off delay out(Y0); // Output to Output 0 }

Liệt kê 15 Độ trễ tắt (Nguồn: File> Examples> plcLib> TimeDelays> DelayOff)

9.4 Tạo xung thời lượng cố định

Lệnh timerPulse() (có sẵn từ Phiên bản 1.0 trở lên) cho phép tạo ra xung đầu ra với độ rộng cố định khi nhận được xung đầu vào ngắn, tương tự như chức năng của một mạch ổn định điện tử.

Hình 30 Một xung có độ rộng cố định được tạo bởi lệnh timerPulse()

Một bản phác thảo ví dụ được hiển thị bên dưới.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Fixed Pulse - Activates an output for a fixed period after a momentary input is applie d

Input - switch connected to input X0 (Arduino pin A0)

Output with 2 s pulse - LED connected to output Y0 (Arduino pin 3)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

*/ unsigned long TIMER0 = 0; // Variable to hold elapsed time for Timer 0 void setup() { setupPLC(); void loop()

Liệt kê 16 Xung độ rộng cố định (Vị trí nguồn: File> Examples> plcLib>

Trong phiên bản 1.1 trở lên, lệnh timerPulse được điều chỉnh để kích hoạt tại cạnh thay vì mức, nghĩa là bộ hẹn giờ sẽ được kích hoạt lại khi có sự chuyển đổi từ thấp sang cao đầu tiên của đầu vào kích hoạt sau khi xung trước đó kết thúc Thay đổi này đồng nhất với hành vi tiêu chuẩn theo IEC 61131-3 Bài viết tiếp theo sẽ mở rộng các khái niệm về thời gian trễ nhằm tạo ra dạng sóng lặp lại liên tục.

// Read Input 0 timerPulse(TIMER0, 2000); // 2 second pulse //

Tạo ra các dạng sóng lặp lại

Một xung lặp lại có thể được xác định bằng cách sử dụng khoảng thời gian của các thành phần thấp và cao của dạng sóng

Hình 31 Một xung lặp lại có thể được xác định theo thời lượng của phần thấp và phần cao.

Thời gian thực hiện cho một chu kỳ hoàn chỉnh, hay còn gọi là thời gian theo chu kỳ, được xác định bằng cách cộng thời gian của các thành phần thấp và cao, thường là khoảng 1 giây Xung lặp lại có thể được tạo ra một cách thủ công từ các thành phần đơn giản hơn hoặc thông qua việc sử dụng lệnh chuyên dụng.

Một cặp bộ định thời gian trễ được kết nối chéo có thể được sử dụng để tạo xung lặp lại, như thể hiện trong ví dụ sau.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Repeating pulse using a pair of linked on-delay timers

Input - switch connected to input X0 (Arduino pin A0)

Output - LED connected to output Y0 (Arduino pin 3)

The provided code initializes a PLC setup by configuring inputs and outputs in the setup function Within the loop function, it reads Input 0 to enable the process and performs a logical AND operation with the inverted output A timer is set for a 900 ms delay, after which Output 0 is activated This process highlights the integration of software and hardware for efficient PLC control using Arduino.

Listing 17 Xung lặp lại bằng cách sử dụng một cặp bộ định thời gian trễ được liên kết (Source: File > Examples > plcLib> Waveforms > PulsedOutputManual)

Khi chương trình hoạt động, việc nhấn liên tục vào nút kích hoạt đầu vào (X0) sẽ khiến đầu ra (Y0) bật trong 0,1 giây và sau đó tắt trong 0,9 giây, tạo thành một chu trình lặp lại.

Chương trình sử dụng một cặp bộ định thời gian trễ và một chốt cài đặt lại dựa trên đầu ra Y0 Khi bắt đầu, bộ hẹn giờ đầu tiên được kích hoạt với đầu ra Y0 bằng 0 và đầu vào cho phép cũng được bật Sau 900 ms, đầu ra của bộ hẹn giờ đầu tiên sẽ tăng lên, điều này sẽ lần lượt đặt đầu ra.

Tại thời điểm Y0 thành 1, bộ định thời trễ thứ hai bắt đầu đếm Sau 100 ms, đầu ra của bộ định thời này được kích hoạt, dẫn đến việc xóa đầu ra Y0 và khởi động lại toàn bộ chu kỳ Đây là một ví dụ đơn giản về Máy trạng thái hữu hạn (FSM), đóng vai trò cơ bản trong biểu đồ chức năng tuần tự Đừng lo lắng nếu ví dụ có vẻ phức tạp, vì chức năng tương tự được thực hiện qua lệnh timerCycle (), sẽ được thảo luận trong phần tiếp theo.

Lệnh timerCycle() cho phép tạo ra dạng sóng xung lặp, ví dụ, có thể sử dụng để nhấp nháy đèn LED liên tục Như tên gọi của lệnh, nó thường được biết đến như một bộ đếm thời gian chu kỳ.

Biểu tượng sơ đồ khối chức năng tương đương được hiển thị bên dưới.

Hình 32 Bộ định thời chu kỳ tạo ra dạng sóng xung lặp lại khi được kích hoạt

Lệnh yêu cầu bốn tham số cho mỗi dạng sóng, trong đó tham số 1 và 3 cần được chỉ định dưới dạng biến unsigned long Các tham số này được phần mềm plcLib sử dụng để đo thời gian cho các phần thấp và cao của dạng sóng Tham số thứ 2 và thứ 4 xác định liên kết thấp và cao của độ rộng xung tương ứng.

4 Ví dụ sau minh họa quá trình này.

/* Programmable Logic Controller Library for the Arduino and Compatibles

Pulsed Output - Creating a repeating pulse using the timerCycle command

Input - Enable input connected to input X0 (Arduino pin A0)

Output - Pulse Waveform on LED connected to output Y0 (Arduino pin 3)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

In this code snippet, two unsigned long variables, AUX0 and AUX1, are initialized to track pulse timing The setup function configures the PLC by defining the necessary inputs and outputs Within the loop, the code reads the Enable input from X0, which indicates whether the system is active A timerCycle function is then called to create a repeating pulse pattern, where the low pulse lasts for 0.9 seconds and the high pulse for 0.1 seconds.

// (hence period = 1 second) out(Y0); // Send pulse waveform to Output 0 }

Listing 18 Đầu ra xung - Tạo xung lặp lại bằng lệnh timerCycle

(Source: File > Examples > plcLib > Waveforms > PulsedOutput)

Một ứng dụng điển hình là việc tạo ra một xung nhấp nháy 'vũ trang báo động' lặp lại, được minh họa trong bản phác thảo ví dụ tại File > Examples > plcLib > Applications.

Phiên bản 0.8 của phần mềm mới giới thiệu các bộ đếm, cho phép kích hoạt đầu ra khi đạt đến số sự kiện đã định Người dùng có thể cấu hình 'đối tượng' bộ đếm để thực hiện chức năng đếm lên, đếm xuống hoặc kết hợp cả hai.

Hình 33 Một đối tượng bộ đếm có thể được cấu hình để đếm lên, đếm xuống hoặc cả hai.

Mỗi bộ đếm bao gồm bốn đầu vào và bốn đầu ra, được thể hiện ở hai bên của sơ đồ Tuy nhiên, trong thực tế, chỉ một số đầu vào và đầu ra nhất định sẽ được sử dụng, tùy thuộc vào loại bộ đếm cụ thể cần thiết.

11.1 Bộ đếm lên Đơn giản nhất, một bộ đếm lên đếm các xung nhận được trên đầu vào countUp của nó, kích hoạt finished ' hoặc đầu ra upperQ khi số lượng xung đầu vào yêu cầu đã được phát hiện Để minh họa quy trình, ví dụ sau tạo một bộ đếm tăng đếm từ 0 đến

10, được điều khiển bởi công tắc áp dụng cho đầu vào X0.

/* Programmable Logic Controller Library for the Arduino and Compatibles Up

Counter - Counts 10 pulses on Input 0 with switch debounce

Count input - switch connected to input X0 (Arduino pin A0)

Clear input - switch connected to input X1 (Arduino pin A1)

Preset input - switch connected to input X2 (Arduino pin A2)

Lower Q output - LED connected to output Y0 (Arduino pin 3)

Upper Q output - LED connected to output Y1 (Arduino pin 5)

Software and Documentation: http://www.electronics-micros.com/software-hardware/plclib-arduino/

In the setup function, the PLC inputs and outputs are initialized, while the loop function continuously reads input states from X0, X1, and X2 A timer with a 10 ms debounce delay is activated to ensure accurate counting The counter increments with each valid input, and is cleared when necessary to maintain accurate limits The counter's preset function sets it to an upper limit, and the results are displayed on outputs Y0 and Y1, indicating the count down and count up status respectively.

Listing 19 Bộ đếm lên (Source: File > Examples > plcLib > Counters > CountUp)

Để kiểm tra danh sách, trước tiên, sử dụng lệnh Counter để tạo đối tượng ctr và đặt giá trị cuối cùng thành 10, tương ứng với thuộc tính presetValue của quầy tính tiền Bộ đếm mặc định là bộ đếm tăng, với giá trị đếm ban đầu bằng 0, dẫn đến việc kích hoạt đầu ra Q thấp hơn Các xung được áp dụng cho đầu vào X0 liên kết với đầu vào countUp, làm tăng giá trị đếm bên trong mỗi lần chuyển đổi từ 0 đến 1 Sau 10 xung, số đếm đạt giá trị giới hạn trên hoặc giá trị đặt trước, khiến đầu ra Q được bật.

Một vấn đề phổ biến với mạch bộ đếm là hiện tượng switch bounce, khi công tắc tiếp xúc "bounce" nhiều lần trong vài mili giây trước khi ổn định Hiện tượng này có thể dẫn đến việc nhấn một công tắc làm cập nhật bộ đếm nhiều lần liên tiếp Để khắc phục tình trạng này, cần lưu ý rằng bộ hẹn giờ trễ 10 mili giây đã được kết nối nối tiếp với công tắc X0, được kết nối với đầu vào countUp.

Văn bản có cấu trúc

Phần mềm được thiết kế để tích hợp thư viện PLC, cho phép kết hợp nhiều lệnh chương trình tiêu chuẩn như gán biến, tính toán và các chức năng tùy chỉnh Ngoài ra, nó còn hỗ trợ các cấu trúc chương trình đa dạng, bao gồm quyết định và vòng lặp, mang lại sự linh hoạt cho quá trình lập trình.

Khả năng viết mã phụ thuộc vào trí tưởng tượng và kiến thức lập trình C/C++ Trước khi phát triển chương trình văn bản có cấu trúc, bạn cần hiểu rõ cách hoạt động của phần mềm plcLib và cách sử dụng các biến của nó.

Lưu ý: Rất nhiều thông tin liên quan đến lập trình Arduino có sẵn trực tuyến, bao gồm các trang Tham khảo và Ví dụ về Arduino.

20.1 Sử dụng cấu trúc chương trình

Trong bản phác thảo của bạn, có thể áp dụng nhiều cấu trúc chương trình khác nhau, nhưng cần lưu ý không làm gián đoạn chu kỳ quét PLC, vì điều này sẽ ảnh hưởng đến việc xử lý các tác vụ khác.

Cấu trúc chương trình có sẵn bao gồm: -

• if – thực thi có điều kiện

• if else – thực hiện có điều kiện của một phần chính hoặc một phần thay thế, dựa trên một điều kiện logic đã được kiểm tra

Câu lệnh "do while" cho phép lặp lại một đoạn mã khi một điều kiện nhất định vẫn đúng Điều đặc biệt của vòng lặp này là nó sẽ luôn thực hiện ít nhất một lần, vì điều kiện được kiểm tra ở cuối, ngay cả khi điều kiện ban đầu không đúng.

Trong lập trình, câu lệnh "while" được sử dụng để lặp lại một phần mã khi một điều kiện nhất định vẫn đúng Điều này có nghĩa là nếu điều kiện ban đầu không đúng, vòng lặp có thể không được thực thi.

• for – lặp lại một phần một số lần cố định, với biến vòng lặp tiến trình thông qua một chuỗi giá trị được xác định trước.

• Switch case – thực hiện một phần duy nhất, được chọn từ một loạt các tùy chọn

Bản phác thảo dưới đây đọc tín hiệu từ đầu vào kỹ thuật số X0 và sử dụng câu lệnh if để kiểm tra trạng thái của tín hiệu đó Dựa vào kết quả kiểm tra, nó sẽ điều khiển độ sáng của đèn LED thông qua việc đọc có điều kiện từ các đầu vào tương tự.

Danh sách 40 Sử dụng lệnh IF để điều khiển có điều kiện đầu ra PWM (Source: File >

Bản phác thảo cho phép điều chỉnh độ sáng của đèn LED thông qua việc nhấn công tắc Trong những thời điểm khác, giá trị PWM đã được thiết lập trước đó sẽ được sử dụng, hoạt động như một bộ điều chỉnh độ sáng 'có thể lập trình'.

Có nhiều ví dụ khác từ cùng một thư mục, mỗi ví dụ thể hiện một cấu trúc điều khiển riêng biệt.

Các khái niệm nâng cao

Phần này mô tả cách thức hoạt động của phần mềm plcLib Mặc dù việc hiểu những khái niệm này không phải là điều cần thiết cho lập trình cơ bản, nhưng nó có thể rất hữu ích trong việc phát triển các ứng dụng nâng cao hơn hoặc để giải thích lý do vì sao mọi thứ không hoạt động như mong đợi.

21.1 Cách phần mềm hoạt động

PLC hoạt động bằng cách liên tục đọc các đầu vào, thực hiện phép tính và gửi kết quả đến các đầu ra thông qua chu kỳ quét Trong một ứng dụng dựa trên sơ đồ bậc thang, quá trình quét diễn ra từ trái sang phải, bắt đầu từ bậc trên cùng và dần dần di chuyển xuống dưới Chu kỳ này được lặp lại liên tục để đảm bảo hoạt động ổn định của hệ thống.

Hình 54 Mỗi hàng được quét trong một quá trình lặp lại như một phần của chu kỳ quét.

Mỗi bậc của bậc thang trong PLC được coi là một quá trình song song, nhận phần thời gian riêng trong chu kỳ quét lặp lại Điều này cho phép các ứng dụng dựa trên PLC thực hiện xử lý song song một cách đơn giản mà không cần kỹ thuật lập trình phức tạp Phần mềm PLC sử dụng một biến duy nhất, gọi là scanValue, để lưu giữ kết quả tính toán khi mỗi nhánh được xử lý Hãy xem đoạn mã dưới đây để hiểu rõ hơn về cách hoạt động của nó với các giá trị bit đơn.

Lệnh đầu vào bit đơn in(X0) đọc giá trị từ chân đầu vào kỹ thuật số X0 và lưu trữ kết quả trong biến scanValue, có giá trị là 1 hoặc 0 Sau đó, lệnh xuất bit out(Y0) sử dụng biến scanValue để gửi giá trị đến chân đầu ra kỹ thuật số Y0 Quá trình này lặp lại cho mỗi bậc của sơ đồ bậc thang, với scanValue được khởi tạo, cập nhật liên tục và bị loại bỏ khi chương trình logic bậc thang được thực thi.

Quy trình xử lý tín hiệu tương tự tương tự như đầu vào tương tự, được chuyển đổi sang dạng kỹ thuật số 10 bit trong khoảng 0-1023 thông qua lệnh inAnalog() Mã nguồn minh họa cho quá trình này được trình bày dưới đây.

Biến scanValue được sử dụng để lưu trữ giá trị tương tự và không gặp vấn đề gì vì nó là kiểu biến số nguyên không dấu Phần mềm plcLib tự động xử lý tỷ lệ của các đầu ra 'tương tự', do đó lệnh outPWM() được chia theo phạm vi từ 0 đến 255.

(nhị phân 8 bit), trong khi lệnh outServo () sẽ sử dụng giá trị trong phạm vi 0-179 (đại diện cho góc quay 180 °).

Phần này sẽ hướng dẫn cách sử dụng biến scanValue đã đề cập trước đó và khám phá các ứng dụng tiềm năng của biến do người dùng tạo trong bản phác thảo.

21.2 Sử dụng biến trong chương trình

Phần này khám phá các ứng dụng của các biến trong bản phác thảo của người dùng, bắt đầu với biến scanValue, theo dõi kết quả tính toán trong quá trình quét Chúng tôi sẽ thảo luận về cách tạo ra các biến do người dùng định nghĩa và cuối cùng áp dụng chúng để giải quyết các mạch logic phức tạp với nhiều nhánh.

Trước đây, scanValue được sử dụng nội bộ bởi phần mềm plcLib trong chu trình quét PLC lặp lại, nhưng biến này không có sẵn trong các chương trình người dùng do nó chỉ được xác định trong tệp tiêu đề plcLib Tuy nhiên, bạn có thể tùy chọn cung cấp scanValue bằng cách định nghĩa nó là một biến bên ngoài, như trong ví dụ dưới đây.

Listing 41 Làm cho biến scanValue có sẵn cho nhiều thư viện (Source: File > Examples

Hướng dẫn plcLib cho phép trả lại giá trị scanValue hiện tại cho một biến người dùng đã xác định, chỉ tại một điểm cụ thể trong chu kỳ quét Biến do người dùng xác định có thể được sử dụng làm 'đầu vào' cho lệnh plcLib, thay thế cho đầu vào hoặc đầu ra từ một chân được đặt tên Ví dụ dưới đây sẽ minh họa một số khả năng của tính năng này.

Listing 42 Trả lại scanValue cho một biến do người dùng xác định (Source: File >

Khi lưu trữ giá trị scanValue, cần chú ý lưu vào một biến do người dùng xác định (ví dụ: AUX1 = in (X1)) Ngoài ra, nên sử dụng tên biến thay vì tên pin trong các lệnh khác của plcLib để đảm bảo tính chính xác và hiệu quả trong quá trình lập trình.

21.3 Làm việc với các biến tùy chỉnh

Khi nhắc đến các tên như X0, X1, Y0, AUX0, AUX1, phần mềm plcLib phân biệt giữa tên ghim và biến do người dùng xác định Các tên pin X0, X1 và Y0 được xác định là các biến số nguyên có dấu, trong khi AUX0 và AUX1 là biến không dấu plcLib có ít nhất hai phiên bản cho mỗi lệnh, và trình biên dịch sẽ chọn phiên bản phù hợp dựa trên kiểu biến, một quá trình được gọi là quá tải hàm.

Hãy chắc chắn chỉ định các biến kiểu số nguyên mà người dùng xác định là số nguyên không dấu (16-bit) hoặc dài không dấu (32-bit) để tránh nhầm lẫn giữa biến người dùng và tên pin.

21.4 Sử dụng các biến với mạch logic phức tạp

Listing 43 Giải quyết logic phức tạp với các biến người dùng (Source: File > Examples

Ví dụ trên giải quyết nhánh trên của mạch logic và lưu trữ kết quả tạm thời cho biến do người dùng xác định là out (AUX0) Dòng này có thể được đơn giản hóa bằng cách viết lại thành AUX0 = andNotBit.

(X1) ;.) Sau đó, nhánh thứ hai được giải quyết và kết quả từ nhánh đầu tiên HOẶC với kết quả tạm thời trước đó - orBit(AUX0) ;.

Một phương pháp thay thế cho việc 'biến người dùng' đã đề cập là sử dụng các lệnh logic khối, sẽ được trình bày chi tiết trong phần tiếp theo.

Lưu trữ và Logic dựa trên ngăn xếp

Phiên bản 1.0 của phần mềm plcLib giới thiệu tính năng tạo và sử dụng ngăn xếp phần mềm để lưu trữ tạm thời và truy xuất các giá trị bit đơn Tính năng này có thể kết hợp với các lệnh logic khối, giúp đơn giản hóa giải pháp cho các mạng phức tạp dựa trên đại số Boolean mà không cần tạo biến người dùng riêng lẻ để lưu trữ tạm thời.

Ngăn xếp là một vùng bộ nhớ đặc biệt dùng để lưu trữ và truy xuất dữ liệu tạm thời Dữ liệu được thêm vào ngăn xếp thông qua thao tác đẩy và được truy xuất bằng cách bật ra Nguyên tắc hoạt động của ngăn xếp là thông tin được lưu trữ gần đây nhất sẽ được xóa trước, vì vậy ngăn xếp hoạt động theo cơ chế LIFO (Last In, First Out).

Hình 55 Sử dụng ngăn xếp làm nơi lưu trữ dữ liệu cuối cùng vào trước xuất trước.

Một phép tương tự hữu ích cho việc lưu trữ và truy xuất dữ liệu dựa trên ngăn xếp là hình ảnh một chồng các tấm, với mỗi tấm đại diện cho một phần thông tin Khi lưu trữ dữ liệu, một tấm mới được thêm vào đầu chồng, làm cho chồng tăng cao hơn Ngược lại, để truy xuất thông tin, một tấm sẽ được loại bỏ Tấm được thêm gần đây nhất luôn nằm ở trên cùng, trong khi tấm cũ nhất nằm ở dưới cùng.

Bước đầu tiên trong việc viết phác thảo với ngăn xếp là sử dụng lệnh Stack để tạo đối tượng ngăn xếp, ví dụ: lệnh Stack stack1; sẽ tạo ra một ngăn xếp có tên stack1, có khả năng chứa tối đa 32 số bit đơn Các giá trị có thể được thêm vào hoặc xóa khỏi ngăn xếp thông qua phương thức push() và pop() của đối tượng ngăn xếp đã tạo Bản phác thảo dưới đây minh họa cách sử dụng ngăn xếp để lưu trữ và truy xuất một loạt các giá trị bit đơn.

Listing 44 Đẩy và bật các giá trị từ một ngăn xếp phần mềm một bit (Source: File >

Khả năng lưu trữ kết quả tạm thời trên ngăn xếp giúp đơn giản hóa giải pháp cho các mạng logic phức tạp Người dùng có thể kết hợp các nhánh song song hoặc chuỗi thông qua các phép toán logic AND và OR, như sẽ được trình bày trong phần tiếp theo.

Một mạng logic có hai nhánh song song có thể được xử lý bằng cách giải quyết nhánh đầu tiên và lưu trữ kết quả trung gian vào ngăn xếp Sau đó, nhánh thứ hai được giải quyết và kết hợp với kết quả trước đó thông qua phương thức orBlock() của đối tượng ngăn xếp, đồng thời loại bỏ kết quả trước đó khỏi ngăn xếp.

Phép toán Block-OR cho phép kết hợp một nhánh song song với kết quả tính toán đã lưu trữ trên ngăn xếp, như được minh họa trong bản phác thảo dưới đây.

Listing 45 Performing a logical OR of two parallel switch branches using Block OR instruction (Source: File > Examples > plcLib > Stack > OrBlock)

Một kỹ thuật tương tự có thể được áp dụng cho các kết nối nối tiếp giữa các nhóm chuyển mạch, cho phép kết hợp chúng thông qua việc sử dụng Khối AND.

Hình 57 Một khối AND có thể được sử dụng để giải quyết một mạng phức tạp bao gồm các phần tử nối tiếp.

Ví dụ dưới đây tính toán kết quả của nhóm chuyển đổi bên trái, lưu trữ dưới dạng kết quả trung gian trên ngăn xếp Sau đó, khối bên phải được giải quyết và kết hợp với kết quả trước đó thông qua phương thức andBlock() của đối tượng ngăn xếp.

Danh sách 46 Logic AND của hai nhóm chuyển đổi chuỗi sử dụng lệnh Block AND

(Nguồn: File> Examples> plcLib> Stack> AndBlock)

Phần tiếp theo thảo luận về các phương pháp tạo phân bổ đầu vào / đầu ra tùy chỉnh, nếu cấu hình tiêu chuẩn không phù hợp.

Xác định Phân bổ IO Tùy chỉnh

Trong một số tình huống, cấu hình đầu ra và đầu vào mặc định có thể không đáp ứng yêu cầu Việc phân bổ I/O tùy chỉnh trở nên cần thiết khi cần thêm đầu vào hoặc đầu ra, khi sử dụng phần cứng tùy chỉnh, hoặc khi có quy ước đặt tên pin khác được ưu tiên.

23.1 Phân bổ I / O được cấu hình sẵn

Phiên bản 1.2 của thư viện PLC giới thiệu nhiều tệp I/O tùy chỉnh, tương thích với đa dạng phần cứng Người dùng có thể truy cập các tệp cấu hình này thông qua menu Tệp > Ví dụ > Tùy chỉnh.

• Arduino Uno và Mega với cấu hình pin mặc định (Uno, Mega)

• Điều khiển PLCs (ControllinoMaxiPLC, ControllinoMegaPLC,

• Tấm chắn công nghiệp Ardbox PLCs (ArdboxAnalogPLC, ArdboxPNPPLC, ArdboxRelayPLC, ArdboxTCHPLC)

• Tấm chắn công nghiệp M-Duino PLCs (MDuino19RelayPLC, MDuino21PLC, MDuino38RelayPLC, MDuino42PLC, MDuino57RelayPLC, MDuino58PLC)

• Seedstudio Grove shields for Uno and Mega (GroveUno, GroveMega)

• TinkerKit shields for Uno and Mega (TinkerkitUno, TinkerkitMega)

• Use of custom pin names and user defined variable names (CustomIO)

Nếu cấu hình được cung cấp không phù hợp, thì bạn có thể cần phải tạo cấu hình của riêng mình từ đầu, như được thảo luận tiếp theo.

23.2 Nghiên cứu điển hình: Tạo Phân bổ IO Tùy chỉnh

Phần này trình bày việc tạo ánh xạ IO tùy chỉnh cho Tấm chắn đầu vào / đầu ra Velleman cho Arduino.

Hình 58 Tấm chắn Đầu vào / Đầu ra Velleman cho Arduino cung cấp một loạt các đầu vào và đầu ra hữu ích.

Mô-đun này có mười tám kết nối IO, bao gồm sáu đầu vào tương tự, sáu đầu vào kỹ thuật số và sáu đầu ra kỹ thuật số dựa trên rơle Thông tin chi tiết về kết nối và cách đi dây có thể được tìm thấy trong sách hướng dẫn và biểu dữ liệu.

Nhiệm vụ đầu tiên là lựa chọn một quy ước đặt tên thích hợp cho các đầu vào và đầu ra, đồng thời xác định các kết nối chân liên quan.

• Đầu vào tương tự có thể tiếp tục sử dụng các tên hiện có A0 – A5.

• Đầu vào kỹ thuật số sẽ được cấp phát tên D0 – D5, được liên kết với các chân Arduino 2, 3, 4, 5, 6 và 7.

• Đầu ra rơ le sẽ được gọi là R0 – R5, sử dụng các chân 8, 9, 10, 11, 12 và 13.

Hình 59 Ánh xạ IO cho lá chắn IO Velleman Arduino.

Bản phác thảo này bắt đầu bằng cách vô hiệu hóa các định nghĩa của tên pin mặc định (X0, X1, , Y0, Y1, ) thông qua lệnh #define noPinDefs, sau đó chỉ định các tên pin cần thiết dưới dạng chuỗi các hằng số nguyên.

Liệt kê 47 Tạo ánh xạ đầu vào / đầu ra của Velleman IO Shield (Nguồn: File>

Hàm customIO() thay thế hàm setupPLC() tiêu chuẩn để xác định hướng dữ liệu cho tất cả các đầu vào và đầu ra, như thể hiện trong phần trích xuất chương trình có thể truy cập qua tab IO của bản phác thảo.

Các điểm sau đây cần được lưu ý từ ví dụ trên.

Tên cho đầu vào kỹ thuật số và đầu ra chuyển tiếp cần được xác định toàn cầu, bằng cách khai báo chúng bên ngoài các hàm setup() và loop() Điều này giúp các tên này có thể được sử dụng ở bất kỳ đâu trong sketch.

• Tên ghim và phân bổ sẽ không thay đổi vì vậy được định nghĩa là hằng số hơn là biến.

Phần mềm plcLib yêu cầu tên pin được xác định theo kiểu số nguyên có dấu ('int') thay vì kiểu không dấu ('unsigned int') để đảm bảo tính tương thích và hiệu quả trong quá trình sử dụng biến trong chương trình.

Điểm mạnh và Hạn chế của Phần mềm

Phần mềm plcLib miễn phí cho phép phát triển các chương trình PLC đơn giản trên phần cứng tương thích với Arduino giá rẻ, tạo cơ hội cho những ai muốn phát triển ứng dụng phần mềm điều khiển hoặc sử dụng Arduino cho mục đích giáo dục.

Các lệnh trong Arduino được viết dưới dạng phần mở rộng cho ngôn ngữ lập trình C/C++, sử dụng cú pháp tương thích Người dùng có thể thiết kế chương trình thông qua sơ đồ bậc thang, sơ đồ khối chức năng, biểu đồ chức năng tuần tự hoặc văn bản có cấu trúc Tuy nhiên, các chương trình này cần được nhập vào Arduino IDE dưới định dạng văn bản, thường được gọi là danh sách hướng dẫn Quá trình lập trình trở nên dễ dàng hơn nhờ vào việc thực hành và sự hỗ trợ từ các ví dụ có sẵn.

Mặc dù cú pháp lệnh không tương thích với bất kỳ nhà sản xuất nào, nhưng việc chuyển giao kiến thức giữa các hệ thống vẫn cần được thực hiện dễ dàng Điều này giúp so sánh hoạt động của các tính năng cụ thể với tiêu chuẩn IEC 61131 một cách hiệu quả.

Các điểm sau đây có thể hữu ích khi quyết định có sử dụng giải pháp dựa trên plcLib trong một tình huống cụ thể hay không.

Cách tiếp cận logic bậc thang rất hiệu quả cho việc triển khai các hệ thống có thể biểu diễn bằng sơ đồ bậc thang hoặc sơ đồ khối Các hệ thống này thường thực hiện song song nhiều tác vụ, đây là điểm mạnh của phương pháp này Đối với những hệ thống dễ biểu diễn bằng lưu đồ, phương pháp lập trình truyền thống có thể mang lại hiệu quả cao hơn Trong một số trường hợp, kết hợp các cách tiếp cận này với văn bản có cấu trúc cũng là một lựa chọn khả thi.

Khi nhiều tác vụ song song được thêm vào, chu kỳ quét sẽ chậm lại Do đó, cần chú ý để đảm bảo thời gian đáp ứng của hệ thống luôn đủ cho việc kiểm soát hiệu quả.

Trong một số trường hợp, hệ thống có thể cần nhiều lần quét để hoàn thành các phép tính phức tạp, và có thể xuất hiện các kết quả trung gian hoặc 'trục trặc' trong quá trình này Kết quả đầu ra được cập nhật ở mỗi bước trong chu kỳ quét, không chỉ ở cuối Do đó, bạn nên kiểm tra kỹ các chương trình để đảm bảo rằng các kết quả trung gian không ảnh hưởng đến hoạt động chính xác của hệ thống.

Bạn nên tránh sử dụng lệnh delay() trong các chương trình logic bậc thang, vì nó sẽ làm tạm dừng chu kỳ quét trong thời gian trễ Tuy nhiên, trong trường hợp gỡ lỗi phần mềm, việc làm chậm chu kỳ quét có thể là cần thiết Nếu cần thực hiện các hoạt động dựa trên thời gian, hãy sử dụng các lệnh hẹn giờ như timerOn(), timerOff(), timerPulse() hoặc timerCycle(), vì chúng điều khiển ngắt mà không ảnh hưởng đến chu kỳ quét.

Tham chiếu lệnh

Trang này liệt kê tất cả các lệnh được hỗ trợ bởi phần mềm plcLib.

Lệnh Mô tả Ví dụ Phần setupPLC(); Định cấu hình cài đặt PLC cơ bản setupPLC(); Định cấu hình phần cứng

25.2 Đầu vào / đầu ra kỹ thuật số một bit

Lệnh mô tả các chức năng đầu vào và đầu ra trong lập trình kỹ thuật số Cụ thể, lệnh in(input) dùng để đọc đầu vào kỹ thuật số, ví dụ như in(X0) cho phép xử lý bit đầu vào Lệnh out(output) được sử dụng để trả về kết quả đầu ra kỹ thuật số, như out(Y0) Đối với lệnh inNot(input), nó đọc đầu vào và đảo ngược bit, ví dụ inNot(X0) Cuối cùng, lệnh outNot(output) cho phép xuất tín hiệu đầu ra ngược, chẳng hạn như outNot(Y0).

The article discusses various Boolean operations implemented through digital input techniques The `andBit(input)` function performs a logical AND operation with inputs `X0` and `X1`, producing an output `Y0` Similarly, the `orBit(input)` function executes a logical OR operation with the same inputs, while `xorBit(input)` carries out a logical XOR operation The `andNotBit(input)` function combines a logical AND with a negated input, and `orNotBit(input)` performs a logical OR with a negated input as well Each function is designed to manage digital inputs effectively, yielding specific Boolean results.

25.4 Đầu vào / đầu ra tín hiệu tương tự

Lệnh inAnalog(input) được sử dụng để đọc tín hiệu đầu vào tương tự, ví dụ: inAnalog(X0) Trong khi đó, lệnh outPWM(output) cho phép xuất ra dạng sóng PWM, như trong trường hợp: outPWM(Y0) Các lệnh này giúp làm việc hiệu quả với tín hiệu tương tự và PWM.

PWM hiệu tương tự outServo(output); Xuất ra servo outServo(Y0); Làm việc với tín hiệu tương tự

25.5 So sánh các tín hiệu tương tự

Lệnh compareGT(input) so sánh giá trị đầu vào inAnalog(X0) với compareGT(X1) và trả về out(Y0) là 1 nếu giá trị đầu vào lớn hơn Tương tự, lệnh compareLT(input) so sánh inAnalog(X0) với compareLT(X1) và trả về out(Y0) là 1 nếu giá trị đầu vào nhỏ hơn.

Lệnh mô tả các chức năng của latch trong hệ thống kỹ thuật số Ví dụ, lệnh latch_output chốt giá trị đầu vào in(X0) và kết quả đầu ra là Y0 khi có tín hiệu reset_input Lệnh latchKey cho phép chốt đầu ra dựa trên mục nhập từ bàn phím, ví dụ latchKey('1', '2', Y0) cho kết quả đầu ra reset_key Lệnh set sẽ chốt đầu ra in(X0) và cho kết quả Y0 nếu giá trị trước đó là true, trong khi lệnh reset sẽ xóa đầu ra in(X0) và reset Y0 nếu giá trị trước đó cũng là true.

The timerOn(timer_variable) function generates an output after a specified delay in milliseconds, activating the output repeatedly based on the input wave Conversely, the timerOff(timer_variable) function introduces a delay before turning off the output, which occurs after the timer signal is cleared The timerPulse(timer_variable) function creates a fixed-width pulse output, triggered by a brief input Lastly, the timerCycle(low_variable, high_variable) function produces a repeating waveform with defined low and high durations, activating only when enabled.

Lệnh Mô tả Ví dụ Phần

To create a Pulse object named pulse1, initiate the pulse by activating its inClock signal with the input signal in(X0) Monitor the rising edge of pulse1 using pulse_name.rising() to read the output waveform signal out(Y0) Additionally, observe the falling edge with pulse_name.falling() to capture the output waveform signal out(Y1).

The command "counter_name(preset _value [, direction])" is used to create and configure a counter object For instance, "Counter ctr1(5);" initializes a counter, while "Counter ctr2(10,1);" sets another with specific parameters The function "counter_name.count" increments the count, and "in(X0);" allows for counting and returning results.

Up(); hơn giá trị đặt trước ctr1.countUp(); Bộ đếm counter_name.count Đếm ngược, nếu số đếm lớn in(X0); Đếm và

Down(); hơn 0 ctr1.countDown(); Bộ đếm counter_name.preset( Đặt số lượng nội bộ thành giá in(X1); Đếm và

); trị đặt trước, kích hoạt ctr1.preset(); Bộ đếm đầu ra Q trên counter_name.clear() Đặt số lượng nội bộ thành 0, in(X2); ctr1.clear(); Đếm và

; kích hoạt đầu ra Q thấp hơn Bộ đếm counter_name.upper Bằng 1 nếu số lượng bên ctr1.upperQ(); Đếm và

Q(); trong bằng giá trị đặt trước, out(Y0); Bộ đếm bằng 0 nếu không counter_name.lower Bằng 1 nếu số đếm bên trong ctr1.lowerQ(); Đếm và

Q(); bằng 0, ngược lại bằng 0 out(Y0); Bộ đếm counter_name.count( Trả về giá trị đếm bên trong Serial.println(ctr1.c Đếm và

); ount()); Bộ đếm counter_name.preset Trả về giá trị đặt trước Serial.println(ctr1.p Đếm và

25.10 Dịch chuyển vị trí thanh ghi

Lệnh Mô tả Ví dụ Phần

Để tạo và cấu hình đối tượng Shift, sử dụng lệnh shift1(); và dịch chuyển register_name([start_value]); Để xoay dữ liệu thanh ghi, áp dụng shift2(0x8888); và lấy giá trị nhị phân từ register_name.inputBit() Đặt bit đầu vào với in(X0); và thực hiện dịch chuyển nối tiếp dựa trên shift1.inputBit(); cùng với việc xoay dữ đầu vào trước đó Sử dụng register_name.shiftLeft(); để di chuyển dữ liệu in(X0); và dịch chuyển sang trái một chỗ, kết hợp với shift1.inputBit(); và xoay dữ liệu trên cạnh lên của nhị phân đầu vào trước đó Để dịch chuyển sang phải, sử dụng register_name.shiftRight(); với dữ liệu in(X2); thực hiện dịch chuyển sang phải một shift1.shiftRight() và xoay dữ liệu nơi, trên cạnh lên Cuối cùng, để đặt lại giá trị, sử dụng register_name.reset(); để dịch chuyển thanh ghi shift1.reset(); và xoay dữ chuyển nội bộ về nhị phân.

Để lấy giá trị của thanh ghi dịch, sử dụng câu lệnh `register_name.bitValue(bit_posi)`, trả về giá trị nhị phân tại vị trí đã chỉ định Để in giá trị của thanh ghi dưới dạng số nguyên không dấu, sử dụng `register_name.value();` kết hợp với `Serial.println()` và thêm độ trễ với `delay(200);`.

25.11 Logic ngăn xếp và khối

Lệnh Mô tả Ví dụ Phần

Stack stack_name; Tạo một ngăn xếp Stack stack1; Logic ngăn xếp

Logic ngăn xếp được thể hiện qua các thao tác như stack_name.push() để đẩy scanValue vào ngăn xếp và stack_name.pop() để cập nhật giá trị khi lấy ra từ ngăn xếp Các thao tác này sử dụng một bit và khối giá trị bit đơn, cho phép quản lý dữ liệu hiệu quả trong ngăn xếp.

Ngày đăng: 19/10/2021, 21:44

HÌNH ẢNH LIÊN QUAN

Bảng 5.1: Các kiểu dữ liệu ARDUINO - Hướng dẫn lập trình PIC với arduino
Bảng 5.1 Các kiểu dữ liệu ARDUINO (Trang 9)
Bảng 5.3 liệt kê các toán tử toán học khác nhau có sẵn trong thư viện Arduino. - Hướng dẫn lập trình PIC với arduino
Bảng 5.3 liệt kê các toán tử toán học khác nhau có sẵn trong thư viện Arduino (Trang 12)
4. Mở màn hình nối tiếp để xem đầu ra của bản phác thảo của bạn. Kết quả hiển thị trong hình sau : - Hướng dẫn lập trình PIC với arduino
4. Mở màn hình nối tiếp để xem đầu ra của bản phác thảo của bạn. Kết quả hiển thị trong hình sau : (Trang 32)
Kết quả như hình sau - Hướng dẫn lập trình PIC với arduino
t quả như hình sau (Trang 34)
HÌNH 7.5 Đầu ra từ việc chạy bản phác thảo sketch0705. Câu lệnh continue khiến Arduino ngừng xử lý mã bên trong vòng lặp nếu - Hướng dẫn lập trình PIC với arduino
HÌNH 7.5 Đầu ra từ việc chạy bản phác thảo sketch0705. Câu lệnh continue khiến Arduino ngừng xử lý mã bên trong vòng lặp nếu (Trang 40)
Hình 1. Chuyển đổi một mạch điện đơn giản thành một sơ đồ bậc thang và sau đó thành một chương trình đơn giản. - Hướng dẫn lập trình PIC với arduino
Hình 1. Chuyển đổi một mạch điện đơn giản thành một sơ đồ bậc thang và sau đó thành một chương trình đơn giản (Trang 41)
bảng nguyên mẫ u, lá chắn I/O và thậm chí là các PLC tương thích với Arduino. - Hướng dẫn lập trình PIC với arduino
bảng nguy ên mẫ u, lá chắn I/O và thậm chí là các PLC tương thích với Arduino (Trang 42)
Hình 3. Điều khiển tối đa hai động cơ bằng Lá chắn động cơ Arduino. - Hướng dẫn lập trình PIC với arduino
Hình 3. Điều khiển tối đa hai động cơ bằng Lá chắn động cơ Arduino (Trang 43)
Hình 5. Bộ điều khiển logic lập trình điển hình (PLC). - Hướng dẫn lập trình PIC với arduino
Hình 5. Bộ điều khiển logic lập trình điển hình (PLC) (Trang 44)
Hình 8. Phân bổ đầu và o/ đầu ra mặc định cho các bo mạch Arduino thông thường Các chân bổ sung được phân bổ cho các bảng Arduino lớn hơn - Hướng dẫn lập trình PIC với arduino
Hình 8. Phân bổ đầu và o/ đầu ra mặc định cho các bo mạch Arduino thông thường Các chân bổ sung được phân bổ cho các bảng Arduino lớn hơn (Trang 47)
Hình 9. Chuyển đổi mạch điện thành sơ đồ bậc thang và sau đó thành chương trình logic bậc thang. - Hướng dẫn lập trình PIC với arduino
Hình 9. Chuyển đổi mạch điện thành sơ đồ bậc thang và sau đó thành chương trình logic bậc thang (Trang 48)
Hình 10. Một mạch Logic Relay đơn giản. - Hướng dẫn lập trình PIC với arduino
Hình 10. Một mạch Logic Relay đơn giản (Trang 49)
Hình 11. Sơ đồ bậc thang thể hiện các phương pháp đọc đầu vào và điều khiển đầu ra. - Hướng dẫn lập trình PIC với arduino
Hình 11. Sơ đồ bậc thang thể hiện các phương pháp đọc đầu vào và điều khiển đầu ra (Trang 50)
Hình 14. Các mạch logic bậc thang NAND, NOR và XNOR và các chức năng logic tương đương của chúng. - Hướng dẫn lập trình PIC với arduino
Hình 14. Các mạch logic bậc thang NAND, NOR và XNOR và các chức năng logic tương đương của chúng (Trang 54)
Hình 15. Thực hiện các phép toán Boolean liên quan đến các tín hiệu đầu vào đảo ngược. - Hướng dẫn lập trình PIC với arduino
Hình 15. Thực hiện các phép toán Boolean liên quan đến các tín hiệu đầu vào đảo ngược (Trang 55)
Hình 17. Đặt các ký hiệu chốt thiết lập lại, được hiển thị cả khi có và không có đầu ra đảo ngược. - Hướng dẫn lập trình PIC với arduino
Hình 17. Đặt các ký hiệu chốt thiết lập lại, được hiển thị cả khi có và không có đầu ra đảo ngược (Trang 59)
Hình 19. Các xung đầu ra ngắn gọn có thể được tạo ra từ các cạnh tăng hoặc giảm của dạng sóng đầu vào. - Hướng dẫn lập trình PIC với arduino
Hình 19. Các xung đầu ra ngắn gọn có thể được tạo ra từ các cạnh tăng hoặc giảm của dạng sóng đầu vào (Trang 61)
Một cách sắp xếp hệ thống dây bảng nguyên mẫu có thể được hiển thị bên dưới (được vẽ bằng cách sử dụng Fritzing ). - Hướng dẫn lập trình PIC với arduino
t cách sắp xếp hệ thống dây bảng nguyên mẫu có thể được hiển thị bên dưới (được vẽ bằng cách sử dụng Fritzing ) (Trang 66)
Hình 23. Cấp phát IO cho Arduino Uno và bàn phím màng. - Hướng dẫn lập trình PIC với arduino
Hình 23. Cấp phát IO cho Arduino Uno và bàn phím màng (Trang 66)
Hình 28. Độ trễ tắt làm cho đầu ra vẫn hoạt động trong một khoảng thời gian cố định sau - Hướng dẫn lập trình PIC với arduino
Hình 28. Độ trễ tắt làm cho đầu ra vẫn hoạt động trong một khoảng thời gian cố định sau (Trang 72)
Hình 30. Một xung có độ rộng cố định được tạo bởi lệnh timerPulse( ). Một bản phác thảo ví dụ được hiển thị bên dưới. - Hướng dẫn lập trình PIC với arduino
Hình 30. Một xung có độ rộng cố định được tạo bởi lệnh timerPulse( ). Một bản phác thảo ví dụ được hiển thị bên dưới (Trang 73)
19.2. Ứng dụng 1: Điều khiển đèn giao thông - Hướng dẫn lập trình PIC với arduino
19.2. Ứng dụng 1: Điều khiển đèn giao thông (Trang 112)
Hình 53. Trình tự cho một bộ đèn giao thông (UK). - Hướng dẫn lập trình PIC với arduino
Hình 53. Trình tự cho một bộ đèn giao thông (UK) (Trang 112)
19.3. Ứng dụng 2: Màn hình ánh sáng chạy - Hướng dẫn lập trình PIC với arduino
19.3. Ứng dụng 2: Màn hình ánh sáng chạy (Trang 114)
20. Văn bản có cấu trúc - Hướng dẫn lập trình PIC với arduino
20. Văn bản có cấu trúc (Trang 118)
22.1 Hoạt động lôgic khối - Hướng dẫn lập trình PIC với arduino
22.1 Hoạt động lôgic khối (Trang 126)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w