Mục lục:

Mũ LED lạ mắt: 5 bước (có hình ảnh)
Mũ LED lạ mắt: 5 bước (có hình ảnh)

Video: Mũ LED lạ mắt: 5 bước (có hình ảnh)

Video: Mũ LED lạ mắt: 5 bước (có hình ảnh)
Video: Xé toạc không gian bằng MẮT của bạn | khanhtrungsi 2024, Tháng mười một
Anonim
Image
Image
Mũ LED lạ mắt
Mũ LED lạ mắt

Tôi luôn muốn thực hiện một dự án Arduino, nhưng chưa bao giờ có bất kỳ ý tưởng tuyệt vời nào cho một dự án cho đến khi gia đình tôi được mời tham dự một bữa tiệc mũ lạ mắt. Với thời gian thực hiện hai tuần, tôi tò mò liệu tôi có thể lập kế hoạch và thực hiện một chiếc mũ hoạt hình LED nhạy cảm với chuyển động hay không. Hóa ra tôi có thể! Tôi có lẽ đã đi quá đà một chút, nhưng tổng chi phí dự án khoảng 80 đô la. Với thử nghiệm và một số mã hóa, bạn có thể làm điều đó với chi phí thấp hơn.

Mục tiêu với chiếc mũ như sau:

  1. Có một bộ đèn di chuyển từ chính giữa phía trước của mũ ra phía sau, mỗi bên một đèn
  2. Thay đổi tốc độ di chuyển của ánh sáng được quyết định bởi độ nghiêng của mũ từ trước ra sau
  3. Cho phép đèn đảo ngược khi dải mũ nghiêng xuống (tức là mô phỏng tác động của trọng lực lên đèn)
  4. Thay đổi màu sắc dựa trên độ nghiêng của mũ từ trái sang phải
  5. Cảm nhận những cú sốc và hiển thị một hiệu ứng đặc biệt
  6. Cảm nhận người đeo đang quay và hiển thị hiệu ứng đặc biệt
  7. Để nó hoàn toàn trong mũ

Bước 1: Các bộ phận cần thiết

Các bộ phận cần thiết
Các bộ phận cần thiết
Các bộ phận cần thiết
Các bộ phận cần thiết
Các bộ phận cần thiết
Các bộ phận cần thiết

Tôi đã sử dụng các thành phần chính sau (bao gồm các liên kết Amazon không liên kết):

  • Bộ vi điều khiển Teensy LC - Tôi đã chọn cái này thay vì Arduino thông thường do kích thước nhỏ và nó có kết nối đặc biệt để điều khiển đèn LED của tôi, cũng như hỗ trợ thư viện và cộng đồng mạnh mẽ.
  • Cảm biến vị trí dựa trên Bosch BNO055 - thực sự là một trong những tài liệu đầu tiên tôi tìm thấy. Có nhiều lựa chọn ít tốn kém hơn, tuy nhiên một khi bạn tìm ra Bosch, nó mang lại nhiều lợi ích cho bạn mà nếu không, bạn sẽ phải làm trong mã
  • Dải đèn LED định địa chỉ WS2812 - Tôi đã chọn chiều dài 1 mét với 144 đèn LED trên mét. Có mật độ đó giúp ánh sáng trông giống như đang chuyển động hơn là các phần tử riêng lẻ sáng lên theo trình tự.

Và các thành phần phụ sau:

  • Một chiếc mũ - bất kỳ chiếc mũ nào có băng đô sẽ làm được. Đây là một chiếc mũ 6 đô la từ một cửa hàng địa phương. Nếu nó có một đường nối ở phía sau, thì việc luồn dây qua sẽ dễ dàng hơn. Hãy chú ý xem băng mũ có được dán hay không vì điều đó cũng sẽ gây thêm một số khó khăn. Cái này được may dọc theo phần trên, nhưng phần dưới kéo lên dễ dàng.
  • Điện trở 4,7K ohm
  • Hộp đựng pin 3x AAA - sử dụng 3 pin AAA đầu ra điện áp chính xác trong phạm vi mà thiết bị điện tử muốn, giúp đơn giản hóa mọi thứ. AAA lắp vào mũ dễ dàng hơn AA và vẫn có thời gian chạy tuyệt vời.
  • Dây khổ nhỏ - Tôi đã sử dụng một số dây rắn mà tôi đã đặt xung quanh từ một dự án LED trước đó.
  • Hàn sắt và thuốc hàn
  • Một số vải thun phù hợp với màu bên trong của mũ và sợi chỉ

Được đề xuất, nhưng không bắt buộc:

  • Đầu nối nhanh cho dây pin
  • Dụng cụ Help Hands, những thứ này rất nhỏ và khó hàn

Bước 2: Sửa đổi mũ

Sửa đổi mũ
Sửa đổi mũ
Sửa đổi mũ
Sửa đổi mũ
Sửa đổi mũ
Sửa đổi mũ
Sửa đổi mũ
Sửa đổi mũ

Bạn sẽ cần một chỗ trên mũ để gắn các thiết bị điện tử và một chỗ cho pin. Vợ tôi làm việc với quần áo chuyên nghiệp, vì vậy tôi đã nhờ cô ấy tư vấn và giúp đỡ. Cuối cùng chúng tôi đã tạo ra hai túi bằng thun. Túi đầu tiên nhỏ hơn về phía trước được nhọn giống như chính chiếc mũ để khi các thiết bị điện tử được lắp đặt, cảm biến vị trí được giữ ở vị trí khá tốt, nhưng có thể dễ dàng tháo ra nếu cần thiết. Túi thứ hai ở phía sau để giữ viên pin ở đúng vị trí.

Các túi được gieo bằng chỉ phù hợp với màu của mũ, tất cả đều dài theo đường vương miện. Tùy thuộc vào kiểu dáng của mũ và vật liệu mà nó được làm bằng YMMV với kỹ thuật này.

Chúng tôi cũng phát hiện ra dải mũ tự nhét vào một bên và nó được may hoàn toàn vào mũ ở vị trí đó. Chúng tôi đã phải loại bỏ đường may ban đầu để chạy các đèn LED dưới dải. Trong quá trình chế tạo, nó được giữ cố định bằng các chốt, và sau đó được khâu bằng chỉ phù hợp khi hoàn thành.

Cuối cùng, chúng tôi mở đường may ở mặt sau của chiếc mũ để nó được che bởi dải băng. Chúng tôi nhét dây nịt đi kèm với đèn LED qua đường nối đó và lót đèn LED đầu tiên trong dải ở ngay trên đường nối. Sau đó, chúng tôi quấn các đèn LED xung quanh chiếc mũ và cắt dải xuống để đèn LED cuối cùng nằm ngay bên cạnh đèn đầu tiên. Dải đèn LED có thể được giữ cố định chỉ với dải mũ, tuy nhiên, tùy thuộc vào dải và chất liệu của bạn, bạn có thể cần cố định đèn LED bằng cách may hoặc dán.

Bước 3: Lên dây

Dây nó lên
Dây nó lên

Bo mạch Teensy và các đèn LED sẽ hoạt động với mọi nơi từ 3.3v đến 5v cho nguồn điện. Đây là lý do tại sao tôi chọn sử dụng 3 pin AAA, điện áp đầu ra 4,5v là tuyệt vời trong phạm vi đó và chúng có nhiều thời gian chạy theo cách tôi đã lập trình đèn LED hoạt động. Bạn sẽ có thể có được hơn 8 giờ thời gian chạy.

Đấu dây điện

Tôi nối dây dẫn dương và dẫn âm từ hộp pin và đèn LED với nhau, sau đó hàn vào Teensy ở những vị trí thích hợp. Cực dương từ pin cần được kết nối với chân trên cùng bên phải của Teensy trong sơ đồ (có nhãn Vin trên bảng) và cực âm có thể được nối với bất kỳ chân nào có nhãn GND. Thuận tiện là có một cái nằm ngay phía đối diện của bảng, hoặc ngay bên cạnh chốt Vin. Sơ đồ sơ đồ chân đầy đủ cho bảng có thể được tìm thấy ở cuối trang này. Và trong một số trường hợp, một bản sao giấy được bao gồm khi bạn đặt hàng bảng.

Nếu bạn đang lên kế hoạch chạy mã chỉ có một vài đèn LED được bật cùng một lúc, bạn có thể cấp nguồn cho các đèn LED từ chính Teensy, bằng cách sử dụng đầu ra 3.3v và GND, tuy nhiên, nếu bạn cố gắng sử dụng quá nhiều điện năng, bạn có thể làm hỏng bảng. Vì vậy, để có cho mình nhiều lựa chọn nhất, tốt nhất bạn nên đấu dây trực tiếp các đèn LED vào nguồn pin của mình.

Đấu dây đèn LED

Tôi đã chọn Teensy LC cho dự án này vì nó có một chân cắm giúp kết nối các đèn LED có địa chỉ dễ dàng hơn nhiều. Ở dưới cùng của bảng, ghim đứng thứ hai từ các gương bên trái Pin # 17, nhưng cũng có 3.3v trên đó. Điều này được gọi là pull-up và trên các bo mạch khác, bạn sẽ phải đấu dây vào một điện trở để cung cấp điện áp đó. Trong trường hợp của Teensy LC, bạn có thể chỉ cần đấu dây từ chân đó thẳng vào dây dữ liệu đèn LED của mình.

Đấu dây cảm biến vị trí

Một số bo mạch BNO055 có sẵn nghiêm ngặt hơn nhiều về điện áp và chỉ muốn 3.3v. Do đó, tôi đã nối dây Vin trên bảng BNO055 từ đầu ra 3.3v chuyên dụng trên Teensy, là chân thứ 3 ở bên phải. Sau đó, bạn có thể kết nối GND trên BNO055 với bất kỳ GND nào trên Teensy.

Cảm biến vị trí BNO055 sử dụng I2c để nói chuyện với Teensy. I2c yêu cầu pull-up, vì vậy tôi đã đấu dây hai điện trở 4,7K ohm từ đầu ra 3,3v trên Teensy đến chân 18 và 19. Sau đó tôi nối dây chân 19 vào chân SCL trên bảng BNO055 và 18 vào chân SDA.

Mẹo / thủ thuật đi dây

Để thực hiện dự án này, tôi đã sử dụng dây rắn thay vì mắc cạn. Một lợi thế của dây rắn là trong khi hàn với các bảng nguyên mẫu như thế này. Bạn có thể tước một số dây, uốn cong nó thành 90 độ và chèn nó qua đáy của một trong các thiết bị đầu cuối, sao cho đầu dây đã cắt dính lên trên bảng của bạn. Sau đó, bạn chỉ cần một lượng nhỏ thuốc hàn để giữ nó vào thiết bị đầu cuối và bạn có thể cắt bỏ phần thừa một cách dễ dàng.

Dây rắn có thể khó làm việc hơn vì có xu hướng muốn giữ nguyên như cách nó bị uốn cong. Tuy nhiên đối với dự án này đó là một lợi thế. Tôi cắt và định hình dây của mình theo cách sao cho hướng của cảm biến vị trí sẽ nhất quán khi tôi lắp và tháo thiết bị điện tử khỏi mũ để điều chỉnh và lập trình.

Bước 4: Lập trình

Bây giờ mọi thứ đã được lắp ráp, bạn sẽ cần một công cụ lập trình tương thích với Arduino. Tôi đã sử dụng Arduino IDE thực tế (hoạt động với Linux, Mac và PC). Bạn cũng sẽ cần phần mềm Teensyduino để giao tiếp với bảng Teensy. Dự án này sử dụng rất nhiều thư viện FastLED để lập trình màu sắc và vị trí của đèn LED.

Hiệu chỉnh

Điều đầu tiên bạn muốn làm là truy cập kho lưu trữ GitHub tuyệt vời của Kris Winer dành cho BNO055 và tải xuống bản phác thảo BNO_055_Nano_Basic_AHRS_t3.ino của anh ấy. Cài đặt mã đó với Serial Monitor đang chạy và nó sẽ cho bạn biết liệu bo mạch BNO055 có trực tuyến đúng cách hay không và vượt qua các bài kiểm tra tự của nó. Nó cũng sẽ hướng dẫn bạn cách hiệu chỉnh BNO055, điều này sẽ cung cấp cho bạn kết quả nhất quán hơn sau này.

Bắt đầu với bản phác thảo đèn LED lạ mắt

Mã cho chiếc mũ Fancy LED đặc biệt được đính kèm và cũng có trên kho lưu trữ GitHub của tôi. Tôi dự định thực hiện nhiều chỉnh sửa hơn đối với mã và chúng sẽ được đăng trên repo GitHub. Tệp ở đây phản ánh mã khi Bản hướng dẫn này được xuất bản. Sau khi tải xuống và mở bản phác thảo, có một số điều bạn sẽ cần thay đổi. Hầu hết các giá trị quan trọng cần thay đổi đều nằm ở đầu dưới dạng câu lệnh #define:

Dòng 24: #define NUM_LEDS 89 - thay đổi điều này thành số lượng đèn LED thực tế trên dải đèn LED của bạn

Dòng 28: #define SERIAL_DEBUG false - bạn có thể muốn biến điều này thành sự thật để có thể thấy kết quả đầu ra trên màn hình nối tiếp

Mã phát hiện vị trí

Phát hiện vị trí và hầu hết các điều chỉnh của bạn bắt đầu từ dòng 742 và trải qua 802. Chúng tôi nhận dữ liệu Pitch, Roll và Yaw từ cảm biến vị trí và sử dụng nó để đặt giá trị. Tùy thuộc vào cách gắn thiết bị điện tử của bạn, bạn có thể cần thay đổi những điều này. Nếu bạn gắn cảm biến vị trí với chip về phía trên cùng của mũ và mũi tên bên cạnh X được in trên bảng hướng về phía trước của mũ, bạn sẽ thấy như sau:

  • Pitch đang gật đầu của bạn
  • Roll là nghiêng đầu của bạn, ví dụ: chạm tai vào vai bạn
  • Yaw là hướng nào. bạn đang phải đối mặt (Bắc, Tây, v.v.).

Nếu bảng của bạn được gắn ở một hướng khác, bạn sẽ cần hoán đổi Pitch / Roll / Yaw để chúng hoạt động theo cách bạn muốn.

Để điều chỉnh cài đặt Cuộn, bạn có thể thay đổi các giá trị #define sau:

  • ROLLOFFSET: với chiếc mũ của bạn ổn định và chính giữa nhất có thể, nếu Roll không phải là 0, hãy thay đổi điều này bằng sự khác biệt. I E. nếu bạn nhìn thấy Roll ở -20 khi mũ của bạn được căn giữa, hãy đặt giá trị này là 20.
  • ROLLMAX: giá trị lớn nhất để sử dụng cho phép đo Cuộn. Dễ dàng tìm thấy nhất bằng cách đội mũ và di chuyển tai phải về phía vai phải. Bạn sẽ cần một cáp USB dài để thực hiện việc này trong khi sử dụng màn hình nối tiếp.
  • ROLLMIN: giá trị thấp nhất để sử dụng cho phép đo Cuộn, khi bạn nghiêng đầu sang trái

Tương tự, đối với Pitch:

  • MAXPITCH - giá trị lớn nhất khi bạn đang tra cứu
  • MINPITCH - giá trị nhỏ nhất khi bạn nhìn xuống
  • PITCHCENTER - giá trị cao độ khi bạn đang nhìn thẳng về phía trước

Nếu bạn đặt SERIALDEBUG thành true ở đầu tệp, bạn sẽ thấy các giá trị hiện tại cho đầu ra Roll / Pitch / Yaw cho màn hình nối tiếp để giúp tinh chỉnh các giá trị này.

Các thông số khác bạn có thể muốn thay đổi

  • MAX_LED_DELAY 35 - chậm nhất mà hạt LED có thể di chuyển. Tính bằng mili giây. Đó là độ trễ từ việc di chuyển từ đèn LED này sang đèn LED tiếp theo trong chuỗi.
  • MIN_LED_DELAY 10 - tốc độ nhanh chóng mà hạt LED có thể di chuyển. Như trên, nó được tính bằng mili giây.

Phần kết luận

Nếu bạn đã đi xa đến mức này, bạn sẽ có một chiếc mũ LED hoạt động đầy đủ và thú vị! Nếu bạn muốn làm nhiều việc hơn với nó, trang tiếp theo có một số thông tin nâng cao về cách thay đổi cài đặt và thực hiện những việc của riêng bạn. cũng như một số giải thích về những gì phần còn lại của mã của tôi đang làm.

Bước 5: Nâng cao và Tùy chọn: Bên trong Mã

Phát hiện va chạm & quay

Phát hiện va chạm / quay được thực hiện bằng cách sử dụng các chức năng cảm biến G cao của BNO055. Bạn có thể điều chỉnh độ nhạy của nó bằng các dòng sau trong initBNO055 ():

  • Dòng # 316: BNO055_ACC_HG_DURATION - sự kiện phải kéo dài bao lâu
  • Dòng # 317: BNO055_ACC_HG_THRESH - mức độ tác động cần thiết
  • Dòng # 319: BNO055_GYR_HR_Z_SET - ngưỡng tốc độ quay
  • Dòng # 320: BNO055_GYR_DUR_Z - vòng quay thậm chí phải kéo dài bao lâu

Cả hai giá trị đều là nhị phân 8 bit, hiện tác động được đặt thành B11000000, là 192 trên 255.

Khi phát hiện tác động hoặc quay, BNO055 đặt một giá trị mà mã sẽ tìm kiếm ngay ở đầu Vòng lặp:

// Phát hiện bất kỳ ngắt nào được kích hoạt, tức là do byte G cao intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); if (intStatus> 8) {Impact (); } else if (intStatus> 0) {spin (); }

Tìm dòng void tác động () ở trên trong mã để thay đổi hành vi khi tác động hoặc void spin () để thay đổi hành vi quay.

Người trợ giúp

Tôi đã tạo một hàm trợ giúp đơn giản (void setAllLeds ()) để nhanh chóng thiết lập tất cả các đèn LED thành một màu duy nhất. Một người sử dụng nó để tắt tất cả:

setAllLeds (CRGB:: Đen);

Hoặc bạn có thể chọn bất kỳ màu nào được thư viện FastLED nhận dạng:

setAllLeds (CRGB:: Red);

Ngoài ra còn có một chức năng fadeAllLeds () sẽ làm mờ tất cả các đèn LED đi 25%.

Lớp hạt

Để đơn giản hóa hệ thống dây điện, tôi muốn sử dụng một chuỗi đèn LED duy nhất, nhưng chúng hoạt động giống như nhiều chuỗi. Vì đây là lần thử đầu tiên của tôi, tôi muốn giữ nó đơn giản nhất có thể, vì vậy tôi coi một chuỗi là hai, với (các) đèn LED ở giữa sẽ có sự phân chia. Vì chúng ta có thể có một số chẵn hoặc một số lẻ, chúng ta cần tính đến điều đó. Tôi bắt đầu với một số biến toàn cục:

/ * * Biến và vùng chứa cho đèn LED * / LED CRGB [NUM_LEDS]; static unsigned int curLedDelay = MAX_LED_DELAY; static int centerLed = NUM_LEDS / 2; static int maxLedPos = NUM_LEDS / 2; static bool retailLeds = 0; hạt bool tĩnhDir = 1; static bool speedDir = 1; unsigned long dirCount; không dấu dài hueCount;

Và một số mã trong setup ():

if (NUM_LEDS% 2 == 1) {lẻLeds = 1; maxLedPos = NUM_LEDS / 2; } else {lẻLeds = 0; maxLedPos = NUM_LEDS / 2 - 1; }

Nếu chúng ta có số lẻ, chúng ta muốn sử dụng 1/2 điểm làm chính giữa, nếu không chúng ta muốn 1/2 điểm - 1. Điều này dễ dàng nhận thấy với 10 hoặc 11 đèn LED:

  • 11 đèn LED: 11/2 với số nguyên sẽ đánh giá đến 5 và máy tính đếm từ 0. Vì vậy, 0 - 4 là một nửa, 6 - 10 là nửa còn lại và 5 là giữa chúng. Chúng tôi coi số 5 trong trường hợp này như thể nó là một phần của cả hai, tức là nó là số 1 cho cả hai chuỗi đèn LED ảo
  • 10 đèn LED: 10/2 là 5. Nhưng vì máy tính đếm từ 0 nên chúng ta cần loại bỏ một đèn. Sau đó, chúng ta có 0 - 4 cho một nửa và 5 - 9 cho nửa kia. # 1 cho chuỗi ảo đầu tiên sẽ là 4 và # 1 cho chuỗi ảo thứ hai sẽ là # 5.

Sau đó, trong mã hạt của chúng tôi, chúng tôi phải thực hiện một số đếm từ vị trí tổng thể của chúng tôi đến các vị trí thực tế trên chuỗi LED:

if (lẻLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }

Mã cũng có các điều kiện mà hạt có thể thay đổi hướng, vì vậy chúng tôi cũng phải tính đến điều đó:

if (grainDir) {if ((currPos == NUM_LEDS / 2) && retailLeds) {currPos = 0; } else if ((currPos == NUM_LEDS / 2 - 1) && (! lẻLeds)) {currPos = 0; } else {currPos ++; }} else {if ((currPos == 0) && retailLeds) {currPos = centerLed; } else if ((currPos == 0) && (! retailLeds)) {currPos = centerLed - 1; } else {currPos--; }}

Vì vậy, chúng tôi sử dụng hướng dự định (grainDir), để tính toán đèn LED nào sẽ được chiếu sáng tiếp theo, nhưng chúng tôi cũng phải xem xét liệu chúng tôi đã đạt đến điểm cuối thực sự của chuỗi đèn LED hay điểm trung tâm của chúng tôi, cũng đóng vai trò là điểm kết thúc cho mỗi chuỗi ảo.

Khi chúng tôi đã tìm ra tất cả những điều đó, chúng tôi sẽ thắp sáng đèn tiếp theo nếu cần:

if (hạtDir) {if (lẻLeds) {Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else {Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }} else {if (lẻLeds) {Pos1 = centerLed - currPos; Pos2 = centerLed + currPos; } else {Pos1 = centerLed - currPos; Pos2 = (centerLed -1) + currPos; }} leds [Pos1] = CHSV (currHue, 255, 255); led [Pos2] = CHSV (currHue, 255, 255); FastLED.show ();}

Tại sao lại biến nó thành một lớp học? Vì nó là, điều này là khá đơn giản và không thực sự cần thiết trong một lớp học. Tuy nhiên, tôi có kế hoạch trong tương lai để cập nhật mã để cho phép nhiều hơn một hạt xuất hiện cùng một lúc và có một số hoạt động ngược lại trong khi những hạt khác thì tiếp tục. Tôi nghĩ rằng có một số khả năng thực sự tuyệt vời để phát hiện spin bằng cách sử dụng nhiều hạt.

Đề xuất: