Mục lục:

State Machine trên Arduino - Đèn giao thông cho người đi bộ: 6 bước (có Hình ảnh)
State Machine trên Arduino - Đèn giao thông cho người đi bộ: 6 bước (có Hình ảnh)

Video: State Machine trên Arduino - Đèn giao thông cho người đi bộ: 6 bước (có Hình ảnh)

Video: State Machine trên Arduino - Đèn giao thông cho người đi bộ: 6 bước (có Hình ảnh)
Video: Chapter 6 Finite State Machine 2024, Tháng mười một
Anonim
State Machine trên Arduino - Đèn giao thông cho người đi bộ
State Machine trên Arduino - Đèn giao thông cho người đi bộ

Xin chào! Tôi sẽ chỉ cho bạn cách lập trình đèn giao thông dành cho người đi bộ cho Arduino trong C ++ với một máy trạng thái hữu hạn bằng cách sử dụng Công cụ Statechart YAKINDU. Điều này sẽ chứng minh sức mạnh của máy trạng thái và có thể được sử dụng làm bản thiết kế cho các dự án tiếp theo.

Quân nhu

Bạn chỉ cần một Arduino, một số nút bấm, đèn LED, Jumper và điện trở.

Phần cứng

  • 2x nút bấm
  • 2x Đèn giao thông hoặc bạn có thể sử dụng đèn LED với điện trở 220 Ohm
  • 2x điện trở 10k Ohm
  • Breadboard
  • Jumper
  • Arduino Uno / Mega (hoặc bất kỳ loại nào khác, có ít nhất 8 GPIO)

Phần mềm

  • Công cụ Statechart YAKINDU
  • Eclipse C ++ IDE dành cho Arduino

Bước 1: Xác định cách thức hoạt động: Đèn giao thông cho người đi bộ

Đầu tiên, chúng ta cần xác định rõ đèn giao thông dành cho người đi bộ phải hoạt động như thế nào. Tôi đã cố gắng tóm tắt các điểm gạch đầu dòng:

  • Hai đèn giao thông được sử dụng - một đèn dành cho ô tô, đèn còn lại dành cho người đi bộ
  • Có thể bật đèn giao thông bằng cách sử dụng một nút
  • Người đi bộ có thể yêu cầu băng qua đường bằng cách nhấn nút
  • Đèn giao thông đã tắt được biểu thị bằng cách nhấp nháy cả hai đèn LED màu vàng
  • Sau khi bật, đèn giao thông chờ 10 giây ở chế độ an toàn
  • Sau chế độ an toàn, ô tô luôn có đèn xanh cho đến khi người đi bộ bắt đầu yêu cầu
  • Yêu cầu người đi bộ sang đường được biểu thị bằng đèn LED màu vàng bật tắt

Ngoài ra, có một số sự kiện thời gian tùy thuộc vào cách hoạt động của đèn giao thông.

Bước 2: Xây dựng mạch

Xây dựng mạch
Xây dựng mạch

Hãy bắt đầu thiết lập mạch. Trong ví dụ của tôi, như bạn có thể thấy trên hình ảnh xem trước, tôi đã sử dụng Arduino Mega 2560, nhưng mọi Arduino khác có ít nhất tám GPIO sẽ ổn. Ngoài ra, tôi đã mua một số đèn giao thông 5V tại Amazon. Chỉ cần tìm kiếm Traffic Light Arduino. Nếu không, bạn có thể chỉ cần sử dụng sáu đèn LED khác nhau. Hơn nữa, bạn cần hai nút nhấn và hai điện trở 10k Ohm.

Ba đèn LED bên trái được sử dụng cho giao thông ô tô và ba đèn LED bên phải cho người đi bộ, trong đó đèn màu vàng có thể cho biết yêu cầu.

Bước 3: Tạo Máy trạng thái

Tạo máy trạng thái
Tạo máy trạng thái

Vì vậy, như bạn có thể thấy, có hai trạng thái chính với các thành viên tổng hợp - trạng thái bật và trạng thái tắt. Bạn có thể chuyển đổi giữa cả hai trạng thái bằng cách sử dụng sự kiện Bật tắt, được kết nối với nút BẬT / TẮT. Ở trạng thái ban đầu, trạng thái tắt, cả hai đèn LED màu vàng bắt đầu nhấp nháy mỗi giây. Khi đèn giao thông đã được bật, nó sẽ bắt đầu ở vị trí An toàn nhất. Sau 10 giây, hành vi thông thường của đèn giao thông sẽ được xử lý. Đèn LED màu đỏ và vàng sẽ được bật ở trạng thái StreetPrepare và đèn giao thông chuyển sang màu xanh lục sau 2 giây nữa. Từ bây giờ, máy trạng thái đang chờ sự kiện walkRequest, được kết nối với nút thứ hai. Sau khi gửi sự kiện, yêu cầu sẽ được biểu thị bằng cách bật tắt đèn LED màu vàng mỗi giây ở trạng thái Đang chạy. 7 giây sau, đèn giao thông sẽ chuyển sang màu vàng trước rồi chuyển sang màu đỏ cho đến khi người đi bộ nhận được tín hiệu đi ở trạng thái dành cho Người đi bộ Xanh. Sau đó, PedestrianRed được kích hoạt và chu kỳ lặp lại. Việc này chỉ có thể bị gián đoạn bằng cách tắt đèn giao thông trở lại.

Bước 4: Chạy ví dụ

Bước 5: Tạo mã C ++

Mã C ++ được tạo là một trường hợp chuyển mạch cổ điển để xử lý logic của máy trạng thái. Đây chỉ là một đoạn mã về cách nó trông như thế nào:

void TrafficLightCtrl:: runCycle () {clearOutEvents (); for (stateConfVectorPosition = 0; stateConfVectorPosition <maxOrthogonalStates; stateConfVectorPosition ++) {switch (stateConfVector [stateConfVectorPosition]) {case main_region_on_r1_StreetGreen: {main_region_on_r1_StreetGreen (true); nghỉ; } case main_region_on_r1_PedWaiting_r1_waitOn: {main_region_on_r1_PedWaiting_r1_waitOn_react (true); nghỉ; } default: ngắt; } clearInEvents (); }

Bước 6: Lấy ví dụ

Toàn bộ ví dụ đã sẵn sàng để biên dịch và chạy. Nó đi kèm với Công cụ Statechart YAKINDU, miễn phí cho mục đích sử dụng phi thương mại. Sau khi tải xuống, bạn có thể nhập trực tiếp ví dụ vào công cụ:

Tệp -> Mới -> Ví dụ -> YAKINDU Statechart Examples -> Next -> Traffic Light (C ++) cho Arduino

> TẠI ĐÂY bạn có thể tải xuống YAKINDU Statechart Tools <<

Bạn có thể bắt đầu với bản dùng thử 30 ngày. Sau đó, bạn phải nhận được giấy phép, miễn phí cho mục đích sử dụng phi thương mại!

Đề xuất: