Vi điều khiển - Câu hỏi cho người mới bắt đầu


7
  • Làm thế nào để bạn xác định có bao nhiêu cảm biến mà một vi điều khiển có thể sử dụng?
  • Tôi hiểu rằng bạn không thể sử dụng C # trực tiếp trên bất kỳ vi điều khiển nào nhưng bạn có thể sử dụng C # và giao tiếp qua USB và tìm kiếm một cổng cụ thể. Điều này có đúng không?

Trong trường hợp của tôi, tôi đã thu hẹp xuống còn ba vi điều khiển sau:

  • Arduino
  • Netdurino
  • AVR

Đây là những gì tôi đang cố gắng thực hiện như một dự án đầu tiên và tất nhiên, đây có thể không phải là một dự án dễ dàng.

Tôi muốn có thể treo một nhiệt kế và khi độ lấy + -3 của nhiệt độ cơ bản mở hoặc đóng cửa sổ chống đỡ. Ngoài ra, tôi muốn có thể lưu trữ thông tin nhiệt kế trong Cơ sở dữ liệu MySql.

Vì vậy, về cơ bản nếu nhiệt độ cơ bản là 80, khi nhiệt độ lớn hơn 83 tôi muốn mở cửa sổ. Và nếu nó 77 tôi muốn đóng cửa sổ.

Tôi không quan tâm đến cơ chế chính xác mở và đóng các cửa sổ, chỉ là làm thế nào để gửi tín hiệu để mở hoặc đóng nó.


Chỉ là một FYI, Arduino và Netdurino là các ban phát triển chứ không phải vi điều khiển. Arduino dựa trên AVR và Netduino dựa trên vi điều khiển
STM32F

@ChrisStratton Tôi nghi ngờ OP đang hỏi về việc kích hoạt một cửa sổ vật lý được mở bằng cách nào đó và đóng lại bằng cách di chuyển prop / bộ truyền động.
Anindo Ghosh

Kiểm tra bộ vi điều khiển này. Nó là không dây và có một cảm biến nhiệt độ đã được tích hợp sẵn có thể gửi không dây đến máy thu. Thậm chí tốt hơn, mã ví dụ bao gồm làm điều này cho bạn. ti.com/tool/ez430-rf2500
tương tự

Câu trả lời:


10

Thông tin vi điều khiển:

Trong khi Netduino sử dụng C #, hầu hết các bộ vi điều khiển khác được lập trình bằng C - đó là hai ngôn ngữ lập trình hoàn toàn khác nhau. Trên hết, Arduino sử dụng một phiên bản C ++, vẫn khác.

Vi điều khiển thường được lập trình bằng C hoặc lắp ráp (ASM). Nếu bạn là người mới, tôi muốn giới thiệu C. Arduino không phải là một vi điều khiển, nó là một bảng phát triển (thường) dựa trên một vi điều khiển AVR, mặc dù có các MCU khác đang được sử dụng. Các MCU trên bo mạch (bộ vi điều khiển) sẽ được cài đặt bộ tải khởi động. Đây là một phần đặc biệt của mã thay đổi cách MCU hoạt động. Trong trường hợp của Arduino, nó cho phép lập trình thông qua cổng nối tiếp trái ngược với các phương pháp lập trình tiêu chuẩn cũng như truy cập vào các chức năng thư viện đặc biệt. Ngoài ra, trên bo mạch sẽ (thường là) bộ chuyển đổi USB sang nối tiếp vì nhiều chip nhỏ hơn không có phần cứng USB bên trong, do đó, USB phải được chuyển đổi để giao tiếp thích hợp.

Câu hỏi 1:

Một MCU sẽ có một số chân I / O cụ thể. Đây là những chân có thể là đầu vào hoặc đầu ra. Bạn có thể kết nối trực tiếp nhiều cảm biến kỹ thuật số như có các chân I / O, nhưng cảm biến analog bị giới hạn số lượng chân ADC (bộ chuyển đổi tương tự sang số) có sẵn. Không phải tất cả các MCU đều có đơn vị ADC. Bạn cũng có thể kết nối nhiều, nhiều cảm biến khác bằng cách sử dụng các bộ mở rộng GPIO bên ngoài hoặc song song, các thanh ghi ra nối tiếp. Chúng có thể được điều khiển bằng cách sử dụng một vài chân MCU và có thể mở rộng đáng kể số lượng chân I / O có sẵn.

Câu hỏi 2:

Bạn sẽ viết một chương trình trên máy tính được cài đặt lên MCU. Nếu mã cho phép bạn có các giao tiếp bên ngoài (thông qua USB, nối tiếp, SPI, I2C, v.v.) thì bạn có thể giao tiếp với chip trong khi nó đang chạy. Nhưng khả năng đó phụ thuộc vào mã bạn viết. Ngôn ngữ nào bạn sử dụng để giao tiếp với MCU khá cởi mở với bất cứ điều gì bạn thích, vì giao tiếp thực sự đang được thực hiện bởi phần cứng chứ không phải ngôn ngữ lập trình. Có lẽ đó là những gì bạn muốn nói với "C #".

Dự án của bạn:

Trên thực tế, dự án của bạn không có vẻ phức tạp: đọc cảm biến nhiệt độ (nghe giống như analog) và điều khiển động cơ để mở / đóng cửa sổ dựa trên việc đọc cảm biến đó. Khi nào dừng động cơ có thể sẽ dựa trên một cảm biến khác được gắn vào cửa sổ. Điều này có thể được thực hiện với một MCU rất nhỏ với vài chân và không gian chương trình nhỏ (chẳng hạn như ATtiny24 hoặc ATtiny25). Nhưng tôi nghĩ rằng bạn sẽ gặp rất nhiều vấn đề nếu trước tiên bạn không làm việc với thứ gì đó nhỏ hơn một chút. "Thế giới xin chào" tiêu chuẩn của MCU là nháy đèn LED. Sau đó xây dựng trên đó bằng cách cố gắng kiểm soát tốc độ nhấp nháy bằng một nút, sau đó lái xe máy, v.v.

Ý kiến ​​cá nhân...

Tôi không, tôi cũng không muốn sử dụng Arduino. Tôi xây dựng tất cả các mạch của riêng mình, điển hình là với các MCU AVR, nhưng tôi hiểu lý do tại sao mọi người sử dụng chúng. Cá nhân, tôi nghĩ sẽ tốt hơn nhiều nếu học cách thiết kế mạch của riêng bạn và lập trình nó hơn là sao chép mã của người khác và ghép các thứ ngẫu nhiên lại với nhau - đó là điều tôi thấy hầu hết người dùng Arduino đang làm. Có rất nhiều hướng dẫn trực tuyến để bắt đầu với các bộ vi điều khiển không liên quan đến Arduino, đó là những gì tôi sẽ đề nghị bạn xem xét nếu bạn có bất kỳ kế hoạch thiết kế mạch điện nào trong tương lai. Nếu bạn không muốn học bất cứ điều gì, thì bằng mọi cách, hãy sao chép đi, nhưng được cảnh báo rằng thường có những cách đơn giản và hiệu quả hơn để làm những việc mà bạn sẽ không bao giờ hiểu nếu bạn không biết chuyện gì đang xảy ra.


Lưu trữ thông tin có thể phức tạp hơn một chút, nhưng không phải là không thể. Giao tiếp qua USB không dễ, nhưng có thể được thực hiện nếu bạn biết bạn đang làm gì. Thay vì cố gắng viết mã cho USB (nó rất phức tạp ...) Tôi sẽ đề nghị sử dụng chip chuyển đổi USB sang nối tiếp và thay vào đó giao tiếp qua nối tiếp. Nó là rất nhiều, đơn giản hơn nhiều để mã hóa và là phần cứng nội bộ tiêu chuẩn trên khá nhiều bộ vi điều khiển. Nhưng như tôi đã đề cập, một chip chuyển đổi USB xuất hiện trên nhiều bo mạch Arduino vì đó là cách chúng được lập trình.
Kurt E. Clothier

2
Điều này bắt đầu với một giả định sai lầm. Sự hiện diện của Netduino trong danh sách thiết bị là một tham chiếu cụ thể đến một vi điều khiển nhúng đang chạy mã C #.
Chris Stratton

Cuộc gọi tốt Tôi không quen với điều đó.
Kurt E. Clothier

1
-1 cho đá phiến arduino. Đối với những người quan tâm nhiều hơn đến phần mềm và loại công cụ "nhà sản xuất", như nghệ sĩ, v.v., không có gì sai khi không tìm hiểu tất cả những điều phức tạp của kiến ​​trúc MCU, mạch vật lý phức tạp, v.v ... Một số người có sở thích là phần mềm, một số phần cứng -, một số cả hai, một số chỉ muốn một cái gì đó hoạt động với nỗ lực / hiểu biết tối thiểu. Không có gì sai khi hack mã của ai đó để có được thứ gì đó hoạt động nhanh, ngay cả khi bạn không hiểu tất cả.
Brad

1
@Brad: Tôi chưa bao giờ nói có gì đó không ổn với nó. Tôi hiểu rằng một số người không quan tâm đến phần cứng và điều đó hoàn toàn tốt. Tôi chỉ đơn giản tuyên bố rằng nếu ai đó có bất kỳ quan tâm đến việc thiết kế mạch (PHẦN MỀM) trong tương lai, sẽ rất đáng để bắt đầu với chip trần thay vì bảng phát triển. Ngoài ra, "sự phức tạp của kiến ​​trúc MCU" không liên quan gì đến nó. Tôi không quan tâm những gì đang xảy ra trong silicon, nhưng trừ khi bạn nhìn vào bảng dữ liệu và tự tìm hiểu một chút, bạn sẽ không biết con chip có thể làm gì, chỉ những gì người khác đã làm với nó.
Kurt E. Clothier

4

Sự lựa chọn giữa các nền tảng

  • Arduino là một nền tảng nguồn mở được xây dựng (chủ yếu) xung quanh các chip AVR (ATmega), với một ngoại lệ: Arduino Do được xây dựng xung quanh như CPU ​​Cortex-M3. Nó được lập trình trong C, C ++.
  • Netduino là một nền tảng được xây dựng xung quanh chip Cortex-M3 và Cortex-M4. Nó được lập trình trong C #
  • AVR là một họ vi điều khiển của Atmel, được lập trình bằng C, C ++ hoặc hội. Các bộ vi xử lý là trung tâm của hầu hết (nhưng không hoàn toàn là tất cả) Arduinos.

Mà bạn chọn là một vấn đề của sở thích cá nhân. AVR là cấp độ thấp hơn Arduino, vì vậy nếu bạn chỉ mới bắt đầu, Arduino chắc chắn dễ dàng hơn để bắt đầu nhanh chóng. Netduino là có bạn thực sự muốn C #, tuy nhiên, Arduino được hỗ trợ tốt hơn Netduino.

Giao diện với cổng nối tiếp PC / USB

Về phía PC, bất kể bạn chọn gì, bạn sẽ có thể giao tiếp với Arduino / Netduino / chip AVR / mạch trần thông qua cổng nối tiếp / USB. Về phía PC, bạn có thể sử dụng bất kỳ ngôn ngữ lập trình nào bạn muốn miễn là nó cho phép bạn truy cập vào các cổng nối tiếp. Cách thức hoạt động này là Arduino / Netduino / AVR trần sẽ đọc / ghi từ cổng nối tiếp / USB và chương trình PC của bạn cũng vậy. Truyền thông nảy sinh.

Về mặt nhúng, hầu hết những điều bạn sẽ xem xét sẽ có USART, nghĩa là giao tiếp nối tiếp được đặt. Tuy nhiên, chip người đàn ông tinh khiết AVR không có một cổng USB, cho mỗi gia nhập out of the box: bạn sẽ phải xây dựng một sự hỗ trợ USB thông qua một mạch riêng biệt, mặc dù như Kurt E Clothier điểm ra một số chip AVR có built-in hỗ trợ USB . Một vài chip AVR không tích hợp USART, nhưng bạn không có khả năng chọn chúng.

Cảm biến nhiệt độ

Theo như cảm biến nhiệt độ, tất cả các nền tảng bạn đề xuất sẽ cung cấp cho bạn khả năng để làm điều đó. Đọc nhiệt độ có thể đơn giản như đọc ADC nếu bạn đang sử dụng LM34 hoặc cảm biến nhiệt độ LM35. Trên Arduino, điều này được thực hiện với một dòng: myReading = analogRead(pinNumber); Bạn sẽ phải chuyển đổi đọc nhiệt độ thành nhiệt độ thực tế, nhưng điều này không đặc biệt khó khăn.

Động cơ

Các động cơ phức tạp hơn một chút: đối với hầu hết (hầu hết tất cả) các động cơ, chip Arduino / Netduino / AVR của bạn sẽ không thể điều khiển động cơ trực tiếp. Bạn sẽ cần ít nhất một công tắc MOSFET / BJT (xem tại đây để biết thêm thông tin) và một diode snubber, hoặc, mạnh mẽ hơn là mạch điều khiển động cơ. Nền tảng Arduino có rất nhiều thiết bị ngoại vi (nói chung được gọi là khiên , mặc dù Olin thích thuật ngữ con gái ) bao gồm cả khiên động cơ. Nếu bạn đang sử dụng một động cơ công suất cao thì đây là cách để đi.


3
Giải thích hay, mặc dù tôi không đồng ý với suy nghĩ của bạn về Arduino chắc chắn sẽ dễ dàng hơn. Tôi tin chắc rằng việc dành thêm một chút thời gian để tìm hiểu những gì đang diễn ra sẽ giúp bạn rất nhiều trong tương lai. Sử dụng Arduino hạn chế nghiêm trọng các khả năng thiết kế. Nhưng một lần nữa, đó chỉ là ý kiến ​​của tôi - không có giá trị hơn của bạn. Một điều khác, có một số chip AVR đã được tích hợp trong USB, ví dụ: hackaday.com/2011/08/07/1-chip-usb-avr-development
Kurt E. Clothier

Tại sao có một analogRead nếu digitalRead thực hiện cùng một công việc?
jippie

@ KurtE.Clothier: Cảm ơn vì liên kết đó. Từ ngữ về việc bắt đầu bất công: bạn nghĩ gì?
angelatlarge

@jippie: Tất nhiên rồi, đúng rồi thưa ngài. Đó là một bộ não (giống như lỗi đánh máy, nhưng khi não bị trục trặc)
angelatlarge

Co vẻ tôt vơi tôi.
Kurt E. Clothier

2

Netduino chạy một phiên bản của thời gian chạy .NET được gọi là IIRC "micro runtime". Bạn viết mã bằng C # và nó được hiểu trên Netduino. Netduino vận chuyển các thư viện để truy cập các chức năng khác nhau của vi điều khiển và các thư viện đó được viết bằng C. Mã C # bạn viết sẽ rất chậm để thực thi, mặc dù mã thư viện rất nhanh. Tôi viết mã C # để kiếm sống, nhưng tôi không nghĩ netduino là một lựa chọn tuyệt vời cho vi điều khiển; nó khó sử dụng hơn arduino theo một số cách, có ít sự hỗ trợ hơn (mã ví dụ ít hơn, phần cứng ít tương thích hơn) và chi phí cao hơn. Tôi cũng không nghĩ C # là ngôn ngữ phù hợp cho các bộ điều khiển.

Tôi đã thực hiện các dự án với mã được viết tùy chỉnh cho các AVR và các dự án khác với Arduinos. Nếu bạn chỉ mới bắt đầu, arduino có vô số lợi thế, và nhược điểm duy nhất là chi phí cao hơn so với một AVR thô.

Tôi khuyên bạn nên xem một số giới thiệu cho AVR và cho arduino. Tôi nghĩ rằng nó sẽ cho bạn một ý tưởng tốt mà cái nào tốt hơn cho bạn.


1

Làm thế nào để bạn xác định có bao nhiêu cảm biến mà một vi điều khiển có thể sử dụng

Điều đó phụ thuộc vào mức độ sáng tạo của bạn và số lượng iopin bạn có sẵn và số lượng chân mà cảm biến yêu cầu. Nếu bạn có 4 cảm biến 3 chân, điều đó không nhất thiết có nghĩa là bạn cần 12 chân để điều khiển chúng, bạn có thể ghép chúng và sử dụng 5 chân và lưu 7 chân io. Vì vậy, tất cả thực sự phụ thuộc. Nhưng một cách để xem xét là, bạn có bao nhiêu chân io có sẵn và cảm biến của bạn cần bao nhiêu chân, điều đó sẽ cho bạn một giới hạn thấp về số lượng bạn có thể có. Sáng tạo, kinh nghiệm và hiểu biết về cách mọi thứ hoạt động, có thể làm tăng số lượng cảm biến.

Tôi hiểu là bạn không thể nhúng C # trực tiếp vào bất kỳ vi điều khiển nào nhưng bạn có thể sử dụng C # và giao tiếp qua USB và tìm kiếm một cổng cụ thể có đúng không?

Mặc dù tôi chưa làm được nhiều USB, nhưng tôi biết rằng nếu bạn đang làm USB từ đầu, điều đó sẽ liên quan đến việc viết trình điều khiển trên máy chủ của bạn. Cách phổ biến hơn là sử dụng IC đã xử lý tất cả giao thức USB và trình điều khiển và nó hoạt động như một cổng nối tiếp trên máy tính của bạn. Về cơ bản, bạn có một cầu nối nối tiếp USB có thể kết nối với một cổng nối tiếp trên vi điều khiển của bạn. Tôi tin rằng Arduino làm điều này. Không chắc chắn về Netduino. Vì vậy, có, bạn có thể sử dụng C # để giao tiếp qua USB QUA một cổng cụ thể (giả sử bạn đang thực hiện một cách dễ dàng và sử dụng cầu nối tiếp USB).

Những gì bạn đề xuất để làm là chắc chắn có thể. Bạn có thể viết một chương trình giao diện với cơ sở dữ liệu của bạn và có thể gửi và nhận dữ liệu nối tiếp đến vi điều khiển của bạn.


cảm ơn câu trả lời Tôi có thể thấy trên sparkfun họ có bộ điều khiển và nhiệt kế, nhưng loại động cơ nào hoạt động với một vi điều khiển?
dùng2278106

Bất kỳ động cơ thực sự. Mỗi động cơ phải được điều khiển, và tùy thuộc vào động cơ, có thể khác nhau giữa các kiểu máy, loại, v.v. Một khi bạn biết cách điều khiển động cơ, bạn sẽ phải tạo ra một mạch (chỉ một vi điều khiển là không đủ), giao diện vi điều khiển của bạn với động cơ.
efox29

2
@ user2278106 Động cơ yêu cầu dòng điện cao hơn so với một micro thông thường có thể cung cấp. Rất có thể bạn sẽ cần một trình điều khiển động cơ hoặc một số giải pháp tương tự (giả sử, cầu H). Lựa chọn động cơ được quyết định bởi các yêu cầu cơ học của hệ thống (cần bao nhiêu mô-men xoắn để mở / đóng cửa sổ và bạn muốn mở / đóng cửa nhanh như thế nào) và trình điều khiển được chọn / thiết kế khi động cơ được chọn
helloworld922

1

Để trả lời một điểm cụ thể, một vi điều khiển có thể có một cảm biến (số lượng rất cao) được gắn vào. Sử dụng các cảm biến bus, như i2c, spi, một dây, nối tiếp hoặc bất kỳ giao thức bus nào khác, sẽ cho phép bạn có nhiều x trên mỗi bus, trong đó x là giới hạn cho một bus cụ thể. Bạn sẽ phải tuân theo một số thông số kỹ thuật để nối dây cho xe buýt và với nhiều xe buýt giống nhau, có thể mở rộng hơn nữa.

Giới hạn thực sự là về tốc độ và tính thực tế. Tôi có thể có một ngàn cảm biến trên một arduino, nhưng tôi có thể cấp nguồn, đọc, xử lý và hiển thị thông tin đó trong một khoảng thời gian hợp lý không? Có thể, phụ thuộc vào mức độ bạn có thể viết mã hoặc mức độ tưởng tượng của bạn.

Ngay cả các cảm biến tương tự cũng có thể được thực hiện như thế này, sử dụng bộ ghép kênh hoặc ADC ics. Câu hỏi hay hơn không phải là "có bao nhiêu cảm biến mà vi điều khiển có thể sử dụng" mà là "tôi cần bao nhiêu cảm biến" và lấy nó từ đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.