Mục lục:

Arduino Tone Generator Không có Thư viện hoặc Chức năng Nối tiếp (Có ngắt): 10 bước
Arduino Tone Generator Không có Thư viện hoặc Chức năng Nối tiếp (Có ngắt): 10 bước

Video: Arduino Tone Generator Không có Thư viện hoặc Chức năng Nối tiếp (Có ngắt): 10 bước

Video: Arduino Tone Generator Không có Thư viện hoặc Chức năng Nối tiếp (Có ngắt): 10 bước
Video: How to use ESP32 WiFi and Bluetooth with Arduino IDE full details with examples and code 2024, Tháng mười một
Anonim
Arduino Tone Generator Không có Thư viện hoặc Chức năng Nối tiếp (Có ngắt)
Arduino Tone Generator Không có Thư viện hoặc Chức năng Nối tiếp (Có ngắt)

Đây không phải là thứ mà tôi thường đưa ra để hướng dẫn, tôi thích đồ kim loại của mình hơn, nhưng vì tôi là một sinh viên kỹ thuật điện và phải tham gia một lớp học về vi điều khiển (Thiết kế hệ thống nhúng), tôi nghĩ rằng tôi sẽ làm cho một trong những dự án của tôi. Khi tôi thực hiện dự án ban đầu và những người khác cho lớp này, tôi nhận thấy rằng có rất ít hoặc không có hướng dẫn nào không sử dụng các hàm thư viện arduino hoặc các hàm nối tiếp, đó là một lý do khác mà tôi nghĩ rằng đây sẽ là một tài liệu hướng dẫn tốt.

Mã này được thiết kế cho vi điều khiển Atmega 2560, vì vậy nếu bạn muốn triển khai nó trên một bo mạch khác, bạn sẽ cần thay đổi các đăng ký địa chỉ trong mã dựa trên hướng dẫn sử dụng bộ điều khiển của bạn. Ý tưởng cơ bản đằng sau mã là bất cứ khi nào bạn nhập một phím trên bàn phím vào màn hình nối tiếp, arduino mega sẽ xuất ra một tần số nhất định dựa trên phím bạn nhấn, với "q" đặt lại nó. Tôi đã làm cho nó "a" sẽ xuất ra A tần số phẳng và "A" sẽ xuất ra A tần số nhọn, "b" xuất ra B phẳng, "c" cho C phẳng, "C" cho C sắc nét, v.v. Mã đầy đủ được tải lên ở cuối, nhưng mỗi bước sẽ chia mã thành nhiều phần để dễ giải thích hơn.

Bước 1: Xác định địa chỉ đăng ký

Xác định địa chỉ đăng ký
Xác định địa chỉ đăng ký

Bước này rất dễ dàng, nếu bạn đang sử dụng atmega 2560, bạn chỉ cần sử dụng các địa chỉ tôi đã sử dụng, mặc dù nếu bạn sử dụng bảng có chip khác, bạn sẽ cần tìm địa chỉ cho từng thanh ghi này trên hướng dẫn sử dụng chip. Các định nghĩa ở trên cùng chỉ là các hằng số sẽ được sử dụng cho các hàm của chúng ta sau này. Chúng tôi chỉ định các địa chỉ là không dấu dễ bay hơi vì chúng tôi không muốn trình biên dịch gây rối với chúng.

Bước 2: Mảng và biến tổng thể

Mảng và biến tổng thể
Mảng và biến tổng thể
Mảng và biến tổng thể
Mảng và biến tổng thể
Mảng và biến tổng thể
Mảng và biến tổng thể

Ở đây chúng tôi muốn xác định mảng Tần số sẽ chứa tất cả các tần số mà mỗi khóa sẽ xuất ra. Các giá trị này được tính toán từ các tần số nốt nhạc thực tế và thành thật mà nói, tôi đã quên cách tôi lấy chúng, nhưng chúng là các giá trị phù hợp khi tôi kiểm tra chúng trên máy hiện sóng để đảm bảo. Chúng tôi cũng đang xác định mảng ghi chú chứa tất cả các phím để nhấn cho mỗi giai điệu, cũng như các biến chúng tôi cần cho các chức năng sau này của chúng tôi.

Bước 3: Hàm "serial.begin"

Các
Các

Chúng tôi sẽ gọi hàm tùy chỉnh của chúng tôi sao chép hàm "serial.begin" là U0init (). Nó lấy baudrate mong muốn làm đầu vào và khởi động cổng nối tiếp tại baudrate đó.

Bước 4: Chức năng "serial.available"

Các
Các

Chúng tôi sẽ gọi hàm bắt chước "serial.available" U0kbhit (). Nó không nhận đầu vào mà thay vào đó sẽ phát hiện xem có thay đổi nào được thực hiện trên bàn phím hay không bằng cách sử dụng bit trạng thái RDA và trả về true khi phát hiện thấy thay đổi.

Bước 5: Hàm "serial.read"

Các
Các

Chúng ta sẽ gọi hàm bắt chước hàm "serial.read" là U0getchar (), hàm này không cần nhập và xuất bất kỳ thay đổi nào được thực hiện trên bàn phím, được lưu trữ trong thanh ghi UDR0.

Bước 6: Hàm "serial.write"

Các
Các

Chúng tôi sẽ gọi hàm bắt chước "serial.write" U0putchar (), lấy dữ liệu từ thanh ghi UDR0 trong khi một thay đổi được phát hiện và lưu trữ, và xuất ra thay đổi đó trở lại màn hình nối tiếp.

Bước 7: Chức năng thiết lập

Chức năng thiết lập
Chức năng thiết lập

Đây là chức năng thiết lập cơ bản sẽ sử dụng bắt chước "serial.begin" của chúng tôi để khởi tạo cổng nối tiếp và sẽ khởi tạo cài đặt bit của chúng tôi cho các thanh ghi hẹn giờ và đặt PB6 để xuất âm của chúng tôi.

Bước 8: Chức năng Vòng lặp và ISR

Các chức năng vòng lặp và ISR
Các chức năng vòng lặp và ISR

Vòng lặp hoạt động như vậy: nếu một thay đổi được phát hiện bằng hàm "serial.available" của chúng tôi, hàm "serial.read" của chúng tôi sẽ lưu trữ thay đổi đó và hàm "serial.write" của chúng tôi sẽ đặt thay đổi đó vào màn hình nối tiếp. Miễn là một biến i nhỏ hơn kích thước của mảng tần số, nó sẽ đặt đầu ra là vị trí của i trong mảng đó, xuất ra tần số tại vị trí đó. ISR hoạt động như một thiết lập lại, trong đó nếu vị trí mảng tần số không bằng 0 (nói cách khác nếu "q" không được nhấn), nó sẽ xuất ra tần số, nhưng khi nhấn "q", nó sẽ được đặt lại. mã này sử dụng ngắt, nhưng nó có thể được thực hiện với ngắt bị vô hiệu hóa. Tôi sẽ đăng mã mà không bị gián đoạn nếu tôi nhận được bất kỳ yêu cầu nào cho nó, tôi chỉ nghĩ rằng phiên bản ngắt sẽ thú vị hơn.

Bước 9: Đấu dây

Đấu dây
Đấu dây

Việc đấu dây cho mã này cực kỳ dễ dàng, chỉ cần đặt một dây đầu ra từ PB6 đến một breadboard, kết nối bộ rung hoặc loa nối tiếp với đó và kết nối nó trở lại mặt đất. Lưu ý: nếu bạn sử dụng loa, hãy đặt một điện trở nhỏ vào trước loa. Nếu bạn chỉ muốn xem đầu ra nhưng không nghe thấy nó, chỉ cần kết nối PB6 với dây dẫn màu đỏ của máy hiện sóng và dây dẫn màu đen với đất.

Bước 10: Kết hợp tất cả lại với nhau

Tôi đã thêm mã đầy đủ vào bước này, vì tôi đã giải thích tất cả các phần của nó trong các bước trước. Nó chỉ cần một đầu vào bàn phím cho các tần số khác nhau và xuất tần số đó ra PB6. Hy vọng bạn thích đọc một cách khác để viết mã với IDE!

Ngoài ra, hãy bình chọn cho điều này trong cuộc thi Vi điều khiển: D

Đề xuất: