Mục lục:
2025 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2025-01-13 06:58
Trong dự án này, bạn sẽ làm một chiếc đèn ngủ bằng ardruino, Adafruit neo rgb Strips và một máy in 3D.
Lưu ý rằng intructable này hoàn toàn dành cho dự án trường học của tôi. Mã cho dự án này dựa trên một dự án khác. Với điều đó đã nói, tôi không phải là một chuyên gia khi nói đến Ardruino.
Bước 1: Yêu cầu
Đối với dự án này, bạn sẽ cần phần cứng và công cụ sau
Phần cứng:
1 - ardruino101 (ở Hoa Kỳ) hoặc Genuino101 (bên ngoài Hoa Kỳ).
2 - Dải đèn led NeoPixel rgb từ adafruit (5 volt).
3 - Một đầu nối usb ardruino (đầu nối loại B đến A).
4 - Một phần mềm từ Ardruino, Ardruino IDE Trong hướng dẫn này, chúng tôi sẽ sử dụng phiên bản 1.8.5. Yêu cầu thư viện phần mềm là: 101, Adafruit NeoPixel và Madgwick.
5 -Và một đối tượng để chứa phần cứng của bạn. Trong trường hợp này, tôi sẽ sử dụng máy in 3D. Tệp cho bản in 3D này nằm trong phần mô tả được gọi là "Đầu đèn". Lưu ý rằng định dạng tệp này chưa sẵn sàng để in 3D. Tùy thuộc vào máy in 3D của bạn, trước tiên bạn phải chạy phần mềm in 3d được chỉ định trên đối tượng 3D trước. Đôi khi tỷ lệ của bản in 3D sẽ được đặt lại. vì vậy hãy đảm bảo đường kính được đặt thành 11 cm x 11 cm.
6 - Bộ dụng cụ hàn cơ bản.
Bước 2: Tìm hiểu phần cứng và phần mềm
Ardruin / Genuino101
Chỉ cần làm rõ Ardruino101 và genuino101 hoàn toàn giống nhau bên cạnh tên. Cả hai đều có thông số kỹ thuật giống nhau và sử dụng cùng một phần mềm.
Ardruino101 sở hữu các thông số kỹ thuật cơ bản như ardruino UNO và hơn thế nữa. Tính năng chính của ardruino101 là gia tốc kế và con quay hồi chuyển mà chúng tôi sẽ sử dụng trong dự án của mình. Ngoài ra, loại ardruino này có thư viện mã duy nhất được gọi là CurrieIMU (Đơn vị đo lường nội bộ) được bao gồm trong phần mở rộng thư viện 101.
Với điều đó, chúng ta hãy nói về phần mềm.
Phần mềm và thư viện
Ardruino IDE sử dụng python làm mã nguồn chính của nó. nó cũng là bản mã chính nơi hầu hết ardruino chạy. Có rất nhiều hướng dẫn trực tuyến về cách sử dụng phần mềm này, vì vậy tôi khuyên bạn nên nghiên cứu những hướng dẫn đó trước nếu bạn chưa quen với chương trình này.
Như đã nói, các thư viện chúng tôi đang sử dụng như sau:
Từ menu Phác thảo,> Bao gồm Thư viện> Quản lý Thư viện… Trong hộp nhập văn bản, hãy nhập
- 101 Khi khởi động, ardruino 101 không được tự động đưa vào ardruino IDE. Chúng tôi cần phần mở rộng thư viện này để viết mã loại ardruino của chúng tôi.
-Adafruit NeoPixel để mã các dải pixel Neo của chúng tôi.
-Madgwick Để đọc dữ liệu thô và tính toán dữ liệu này thành thô, cao độ và cuộn.
Dải RGB -eo RGB
Loại tôi sẽ sử dụng là điện áp 5 hoặc loại 5v. Với 5v này, tôi không cần một nguồn điện mở rộng để điều khiển các dải của mình. Thay vào đó, tôi sẽ sử dụng ardruino của mình làm nguồn điện để điều khiển và thắp sáng các dải.
Dưới đây là một số mẹo bạn cần biết trước khi bắt đầu sử dụng dải này.
Đầu tiên, bạn cần một dải đèn LED Neodigital RGB từ quả adafruit. Loại dải này có thể kiểm soát được bằng cách sử dụng mã. Tiếp theo bạn cần biết là có một mặt sau và một mặt trước trên dải này. Mặt sau và mặt trước này rất quan trọng đối với quá trình hàn. Đảm bảo rằng bạn đã hàn mặt trước nơi phím mũi tên hướng ra khỏi đầu.
Đây là hướng dẫn về cách sử dụng chúng.
Có 3 điểm hàn bạn cần lưu ý Kết nối đất (GND), Kết nối điện áp (V) và Kết nối chân (DIN).
Bước 3: Thiết lập các thành phần
Đầu tiên, bạn cần in 3d thành phần mà bạn có thể tìm thấy trong các yêu cầu. Trong trường hợp này, tôi sẽ sử dụng PLA. Đảm bảo đường kính của vật thể là 11cm x 11cm. Wil này đảm bảo rằng ardruino và các dải sẽ phù hợp với shpere. Lưu ý rằng mỗi máy in 3D sử dụng phần mềm khác nhau để tính toán quá trình in của nó. Như đã nói, tệp bạn sử dụng có thể được chia tỷ lệ khác nhau, vì vậy hãy ghi nhớ điều đó.
Thứ hai sau khi in, hãy đảm bảo rằng các thành phần có thể đóng lại. Các bản in 3D cùng nhau tạo thành một hình cầu. Chúng phải vừa vặn. Nếu nắp đậy bị mất thì hãy dán một số băng dính vào mặt trong để nắp được lấp đầy. Và nếu nó là dày, hãy sử dụng giấy nhám.
Thứ ba, xiên cho ardruino và các dải khá dễ dàng. Bạn sẽ sử dụng 3 dây để kết nối các dải với ardruino. Lưu ý rằng những vị trí duy nhất tôi hàn là trên các dải. không phải trên chính Ardruino.
GND chuyển đến GND
DIN đi đến một Ghim (trong trường hợp của chúng tôi là pin6 trên ardruino)
5V chuyển sang 5V
Đảm bảo rằng số lượng dải đèn led bạn sử dụng là giới hạn ở mức 30. Sau đó, nó sẽ không thực thi đúng mã. Bạn có thể chỉ cần cắt bất kỳ dải nào chưa được cắt hiển thị với một dấu hiệu cắt kéo.
Evrything thứ tư phải vừa vặn trong hình cầu. Bạn có thể giống như tôi đã tạo một giao điểm giữa 1 trong các bản in 3d để nhìn thấy máng và đặt một miếng nhựa có rãnh nhìn thấy ở trên cùng.
Bước 4: Mã hóa
Vì vậy, bây giờ bạn sẽ có tất cả các thành phần cần thiết trong thư viện của mình.
Đây là mã bạn cần để chạy dự án. Kết quả sẽ giống như liên kết video tôi gửi trong trang này.
Nguồn của mã này có thể được tìm thấy ở đây. Dự án này cũng bao gồm các bước cần thiết để hiểu rõ hơn về mã và mật số đằng sau việc sử dụng.
#include #include #include #include
#define PIN 6 // 11 pixel NeoPixel Strip
#define PIN1 7 // 1 pixel NeoPixel Strip #define NUMPIXELS 30 // Numer of píxels #define SAMPLE_RATE 25 // Tốc độ lấy mẫu cho gia tốc kế và con quay hồi chuyển
// Cấu hình Madgwick
Bộ lọc Madgwick; dài không dấu microsPerReading, microsPrevious; float accelScale, gyroScale;
// Cấu hình NeoPixel
Adafruit_NeoPixel pixel = Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel pixelStatus = Adafruit_NeoPixel (1, 7, NEO_GRB + NEO_KHZ800);
// Không gian màu
RGBConverter rgbConverter; nhân đôi h = 1; đôi s = 1; gấp đôi v = 1; byte rgb [3];
// Đèn chuyển động trạng thái
// Trạng thái 0 -> Chọn Hue - Pitch // Trạng thái 1 -> Chọn Bão hòa - Cuộn // Trạng thái 2 -> Chọn Giá trị - Yaw // Trạng thái 3 -> Sửa lỗi biến màu int statusLamp = 0;
void setup () {
Serial.begin (9600);
// khởi động IMU và bộ lọc
CurieIMU.begin (); CurieIMU.setGyroRate (SAMPLE_RATE); CurieIMU.setAccelerometerRate (SAMPLE_RATE); filter.begin (SAMPLE_RATE);
// Đặt phạm vi gia tốc kế thành 2G
CurieIMU.setAccelerometerRange (2); // Đặt phạm vi con quay hồi chuyển thành 250 độ / giây CurieIMU.setGyroRange (250);
CurieIMU.autoCalibrateAccelerometerOffset (X_AXIS, 0);
CurieIMU.autoCalibrateAccelerometerOffset (Y_AXIS, 0); CurieIMU.autoCalibrateAccelerometerOffset (Z_AXIS, 1); CurieIMU.autoCalibrateGyroOffset ();
CurieIMU.attachInterrupt (eventCallback);
CurieIMU.setDetectionThreshold (CURIE_IMU_TAP, 950); CurieIMU.interrupts (CURIE_IMU_TAP);
// khởi tạo các biến để tăng tốc độ cập nhật nhằm điều chỉnh tốc độ
microsPerReading = 1000000 / SAMPLE_RATE; microsPrevious = micros ();
// Init NeoPixel 11
pixel.begin (); pixel.show ();
// Init NeoPixel 1
pixelStatus.begin (); pixel.show ();
// Hiển thị trạng thái bằng px
setStatusPixel (statusLamp); }
void loop () {
int aix, aiy, aiz; // gia tốc kế int gix, giy, giz; rìu phao, ay, az; float gx, gy, gz; cuộn phao, cao độ, yaw; static unsigned long microsNow;
// kiểm tra xem đã đến lúc đọc dữ liệu và cập nhật bộ lọc chưa
microsNow = micros (); if (microsNow - microsPrevious> = microsPerReading) {
// đọc dữ liệu thô từ CurieIMU
CurieIMU.readMotionSensor (aix, aiy, aiz, gix, giy, giz);
// chuyển đổi từ dữ liệu thô sang đơn vị trọng lực và độ / giây
ax = convertRawAcceleration (aix); ay = convertRawAcceleration (aiy); az = convertRawAcceleration (aiz); gx = convertRawGyro (gix); gy = convertRawGyro (giy); gz = convertRawGyro (giz);
// cập nhật bộ lọc, tính toán hướng
filter.updateIMU (gx, gy, gz, ax, ay, az);
// in tiêu đề, cao độ và cuộn
roll = filter.getRoll (); pitch = filter.getPitch (); yaw = filter.getYaw ();
// tăng thời gian trước, vì vậy chúng tôi giữ tốc độ phù hợp
microsPrevious = microsPrevious + microsPerReading;
// Chỉ khi thay đổi Hue, Saturation hoặc Value
if (statusLamp chọn Hue if (pitch> = -90 && pitch <= 90 && statusLamp == 0) {// Biến đổi angle pitch = pitch + 90; // Lấy dây màu từ các góc h = pitch / 180.0;}
// Hạn chế góc
// chỉ cuộn -90º thành 90º = 180º // Trạng thái 1 -> chọn Độ bão hòa if (cuộn> = -90 && cuộn <= 90 && statusLamp == 1) {// Biến đổi góc cuộn = roll + 90; // Lấy dây màu từ các góc s = roll / 180.0; }
// Trạng thái 2 -> chọn Giá trị
if (statusLamp == 2) {// yaw 0º đến 360º v = yaw / 360.0; }
// Chuyển đổi thành rgb
rgbConverter.hsvToRgb (h, s, v, rgb); / * Serial.print ("Màu:"); Serial.print (h); Serial.print ("-"); Serial.print (các); Serial.print ("-"); Serial.print (v); Serial.println ("");
Serial.print ("Hướng:");
Serial.print (yaw); Serial.print (""); Serial.print (cao độ); Serial.print (""); Serial.println (cuộn); * /
// Thay đổi màu của các pixel
for (int px = 0; px <NUMPIXELS; px ++) {pixel.setPixelColor (px, pixel. Color (rgb [0], rgb [1], rgb [2])); pixel.show (); }}
// Hiển thị trạng thái bằng px
setStatusPixel (statusLamp); }}
float convertRawAcceleration (int aRaw) {
// vì chúng ta đang sử dụng phạm vi 2G // -2g ánh xạ tới giá trị thô là -32768 // + 2g ánh xạ tới giá trị thô là 32767
float a = (aRaw * 2.0) / 32768.0;
trả lại a; }
float convertRawGyro (int gRaw) {
// vì chúng tôi đang sử dụng phạm vi 250 độ / giây // -250 ánh xạ tới giá trị thô là -32768 // +250 ánh xạ tới giá trị thô là 32767
float g = (gRaw * 250.0) / 32768.0;
trả lại g; }
static void eventCallback ()
{// Phát hiện chạm trong tất cả các trục if (CurieIMU.getInterruptStatus (CURIE_IMU_TAP)) {Serial.print ("Tap phát hiện statusLamp:"); Serial.println (statusLamp);
// Thay đổi trạng thái
statusLamp ++;
// Trạng thái Init
if (statusLamp> 3) {statusLamp = 0; }}}
void setStatusPixel (int statusPx)
{switch (statusPx) {case 0: pixelStatus.setPixelColor (0, pixelStatus. Color (150, 0, 0)); pixelStatus.show (); nghỉ; trường hợp 1: pixelStatus.setPixelColor (0, pixelStatus. Color (0, 150, 0)); pixelStatus.show (); nghỉ; trường hợp 2: pixelStatus.setPixelColor (0, pixelStatus. Color (0, 0, 150)); pixelStatus.show (); nghỉ; trường hợp 3: pixelStatus.setPixelColor (0, pixelStatus. Color (0, 0, 0)); pixelStatus.show (); nghỉ;
}
}