Cuprins:
2025 Autor: John Day | [email protected]. Modificat ultima dată: 2025-01-13 06:58
În acest proiect veți realiza o lampă de noapte folosind ardruino, Adafruit neo rgb Strips și o imprimantă 3D.
Rețineți că acest instrument este pur și simplu pentru proiectul meu școlar. Codul pentru acest proiect se bazează pe un alt proiect. Acestea fiind spuse, nu sunt expert când vine vorba de Ardruino.
Pasul 1: Cerințe
Pentru acest proiect, veți avea nevoie de următoarele componente hardware și instrumente
Hardware:
1 - Un ardruino101 (în SUA) sau un Genuino101 (în afara SUA).
2 - Benzi de LED-uri NeoPixel rgb de la adafruit (5 volți).
3 - Un conector USB ardruino (tip B la conector A).
4 - Un software de la Ardruino, Ardruino IDE În acest tutorial vom folosi versiunea 1.8.5. Cerințele bibliotecii software sunt: 101, Adafruit NeoPixel și Madgwick.
5-Și un obiect care să-ți adăpostească hardware-ul. În acest caz, voi folosi o imprimantă 3D. Fișierul pentru această imprimare 3D se află în descrierile denumite „Lamp Head”. Rețineți că acest format de fișier nu este pregătit pentru imprimare 3D. În funcție de imprimantele 3D, trebuie mai întâi să rulați software-ul de imprimare 3D desemnat pe obiectul 3D. Uneori, scala imprimării 3D se va reseta. deci asigurați-vă că diametrul este setat la 11 cm pe 11 cm.
6 - Set de lipit de bază.
Pasul 2: Înțelegerea hardware-ului și software-ului
Ardruin / Genuino101
Doar pentru a clarifica Ardruino101 și genuino101 sunt exact aceleași pe lângă nume. Ambele au aceleași specificații și utilizează același software.
Ardruino101 posedă specificațiile de bază, cum ar fi ardruino UNO și multe altele. Principala caracteristică a ardruino101 este accelerometrul și giroscopul pe care le vom folosi în proiectul nostru. De asemenea, acest tip de ardruino are biblioteca de coduri unică numită CurrieIMU (Internal Measurement Units), care este inclusă în extensia de bibliotecă 101.
Cu aceasta a spus să vorbim despre software.
Software și biblioteci
Ardruino IDE folosește python ca principal cod sursă. este, de asemenea, principalul cod platvorm pe care rulează cel mai mult ardruino. Există o mulțime de tutoriale online despre cum să utilizați acest software, așa că vă recomand să le cercetați mai întâi dacă sunteți nou în acest program.
Acestea fiind spuse, bibliotecile pe care le folosim sunt următoarele:
Din meniul Schiță,> Includeți biblioteca> Gestionați bibliotecile … În caseta de introducere a textului introduceți
- 101 La standart, ardruino 101 nu este inclus automat în IDE-ul ardruino. Avem nevoie de această extensie de bibliotecă pentru a ne codifica tipul de ardruino.
-Adafruit NeoPixel pentru a ne codifica benzile Neo pixel.
-Madgwick Pentru a citi datele brute și pentru a calcula aceste date la brut, pitch and roll.
Bande Neo RGB
Tipul pe care îl voi folosi este de 5 tensiuni sau 5V. Cu acest 5v nu am nevoie de o sursă de energie extinsă pentru a-mi controla benzile. În schimb, îmi voi folosi ardruino-ul ca sursă de energie pentru a controla și lumina benzile.
Iată câteva sfaturi pe care trebuie să le cunoașteți înainte de a începe aceste benzi.
Mai întâi veți avea nevoie de benzi cu LED RGB Neodigital de la adafruit. Acest tip de benzi este cotrolabil folosind coduri. În continuare, trebuie să știți că există o spate și o față pe aceste benzi. Această parte din spate și din față este importantă pentru lipire. Asigurați-vă că ați lipit partea din față, unde tasta săgeată este îndreptată departe de vârf.
Iată un ghid despre cum să le utilizați.
Există 3 puncte de lipit pe care trebuie să le aveți în vedere Conexiunea la pământ (GND), conexiunea de tensiune (V) și conexiunea Pin (DIN).
Pasul 3: Configurarea componentelor
Mai întâi va trebui să imprimați 3D componenta pe care o puteți găsi în cerințe. În acest caz, voi folosi PLA. Asigurați-vă că diametrul obiectului general este de 11cm pe 11cm. Acest lucru va asigura că ardruino și benzile se vor încadra în shpere. Rețineți că fiecare imprimantă 3D folosește diferite software-uri pentru a calcula procesul de imprimare. Acestea fiind spuse, fișierul pe care îl utilizați ar putea fi scalat în mod diferit, deci țineți cont de asta.
În al doilea rând după imprimare, asigurați-vă că componentele se pot închide. Imprimările 3D formează împreună o sferă. Ar trebui să se potrivească frumos. Dacă compoziția va pierde, adăugați o bandă pe partea interioară, astfel încât capacul să fie umplut. Și dacă este gros, folosiți șmirghel.
În al treilea rând, schematichs pentru ardruino și benzi sunt este destul de ușor. Veți folosi 3 fire pentru a conecta benzile la ardruino. Rețineți că singurele locuri pe care le lipesc sunt pe benzi. nu pe Ardruino în sine.
GND merge la GND
DIN merge la un Pin (în cazul nostru pin6 pe ardruino)
5V merge la 5V
Asigurați-vă că cantitatea de benzi cu LED-uri pe care le utilizați este limitată la 30. Mai mult decât atât și nu va reuși să execute corect codul. Puteți pur și simplu să tăiați orice benzi neuniforme afișate cu un semn de foarfecă.
Al patrulea Evrything ar trebui să se potrivească frumos în sferă. Ați putea dori să fac o intersecție între 1 din imprimarea 3D pentru a vedea jgheabul și a așeza un plastic de jgheab în partea de sus.
Pasul 4: Codificare
Deci, acum ar trebui să aveți toate componentele necesare în biblioteca dvs.
Iată codul de care veți avea nevoie pentru a rula proiectul. Rezultatul ar trebui să arate ca linkul video pe care îl trimit în această pagină.
Sursa acestui cod poate fi găsită aici. Acest proiect include, de asemenea, pașii necesari pentru a înțelege mai bine codul și algaritmul din spatele utilizărilor.
#include #include #include #include
#define PIN 6 // 11 pixeli NeoPixel Strip
#define PIN1 7 // 1 pixel NeoPixel Strip #define NUMPIXELS 30 // Număr de pixeli #define SAMPLE_RATE 25 // Rata de eșantionare pentru accelerometru și giroscop
// configurație Madgwick
Filtru Madgwick; nesemnat microsPerReading lung, microsPrevious; float accelScale, gyroScale;
// configurație NeoPixel
Adafruit_NeoPixel pixels = Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel pixelsStatus = Adafruit_NeoPixel (1, 7, NEO_GRB + NEO_KHZ800);
// Spații de culoare
RGBConverter rgbConverter; h dublu = 1; dublu s = 1; dublu v = 1; octet rgb [3];
// Lampă de mișcare de stare
// State 0 -> Select Hue - Pitch // State 1 -> Select Saturation - Roll // State 2 -> Select Value - Yaw // State 3 -> Fix color volatile int statusLamp = 0;
configurare nulă () {
Serial.begin (9600);
// porniți IMU și filtrați
CurieIMU.begin (); CurieIMU.setGyroRate (SAMPLE_RATE); CurieIMU.setAccelerometerRate (SAMPLE_RATE); filter.begin (SAMPLE_RATE);
// Setați intervalul accelerometrului la 2G
CurieIMU.setAccelerometerRange (2); // Setați domeniul giroscopului la 250 de grade / secundă 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);
// inițializează variabile pentru a actualiza ritmul pentru a corecta rata
microsPerReading = 1000000 / SAMPLE_RATE; microsPrevious = micros ();
// Init NeoPixel 11
pixeli.begin (); pixels.show ();
// Init NeoPixel 1
pixelsStatus.begin (); pixels.show ();
// Afișează starea în px
setStatusPixel (statusLamp); }
bucla nulă () {
int aix, aiy, aiz; // accelerometru int gix, giy, giz; topor plutitor, ay, az; float gx, gy, gz; rulou plutitor, pitch, yaw; static nesemnat micros lung Acum;
// verificați dacă este timpul să citiți date și să actualizați filtrul
microsNow = micros (); if (microsNow - microsPrevious> = microsPerReading) {
// citiți date brute de la CurieIMU
CurieIMU.readMotionSensor (aix, aiy, aiz, gix, giy, giz);
// convertiți din date brute în unități de gravitate și grade / secunde
ax = convertRawAcceleration (aix); ay = convertRawAcceleration (aiy); az = convertRawAcceleration (aiz); gx = convertRawGyro (gix); gy = convertRawGyro (giy); gz = convertRawGyro (giz);
// actualizați filtrul, care calculează orientarea
filter.updateIMU (gx, gy, gz, ax, ay, az);
// tipăriți titlul, pitch and roll
roll = filter.getRoll (); pitch = filter.getPitch (); yaw = filter.getYaw ();
// creșteți timpul anterior, astfel încât să păstrăm ritmul corespunzător
microsPrevious = microsPrevious + microsPerReading;
// Numai dacă modificați Hue, Saturation sau Value
if (statusLamp selectează Hue if (pitch> = -90 && pitch <= 90 && statusLamp == 0) {// Transform angle pitch = pitch + 90; // Obține coordonate de culoare din unghiuri h = pitch / 180.0;}
// Restricții de unghiuri
// rolați numai -90º la 90º = 180º // Starea 1 -> selectați Saturație dacă (rolați = = -90 && rulați <= 90 && statusLamp == 1) {// Rolați unghiul de transformare = rolați + 90; // Obține coordonate de culoare din unghiuri s = roll / 180.0; }
// Stat 2 -> selectați Valoare
if (statusLamp == 2) {// yaw 0º to 360º v = yaw / 360.0; }
// Convertiți în rgb
rgbConverter.hsvToRgb (h, s, v, rgb); / * Serial.print ("Culoare:"); Serial.print (h); Serial.print ("-"); Serial.print (s); Serial.print ("-"); Serial.print (v); Serial.println ("");
Serial.print ("Orientare:");
Serial.print (yaw); Serial.print (""); Serial.print (pitch); Serial.print (""); Serial.println (roll); * /
// Schimbați culoarea pixelilor
for (int px = 0; px <NUMPIXELS; px ++) {pixels.setPixelColor (px, pixels. Color (rgb [0], rgb [1], rgb [2])); pixels.show (); }}
// Afișează starea în px
setStatusPixel (statusLamp); }}
float convertRawAcceleration (int aRaw) {
// deoarece folosim intervalul 2G // -2g hărți la o valoare brută de -32768 // + hărți 2g la o valoare brută de 32767
float a = (aRaw * 2.0) / 32768.0;
retur a; }
float convertRawGyro (int gRaw) {
// deoarece folosim intervalul de 250 de grade / secunde // -250 hărți la o valoare brută de -32768 // +250 hărți la o valoare brută de 32767
float g = (gRaw * 250.0) / 32768.0;
retur g; }
static nul eventCallback ()
{// Detectați atingerea în toate axele dacă (CurieIMU.getInterruptStatus (CURIE_IMU_TAP)) {Serial.print ("Atingeți detectat statusLamp:"); Serial.println (statusLamp);
// Schimbați starea
statusLamp ++;
// Starea inițială
if (statusLamp> 3) {statusLamp = 0; }}}
void setStatusPixel (int statusPx)
{switch (statusPx) {case 0: pixelsStatus.setPixelColor (0, pixelsStatus. Color (150, 0, 0)); pixelsStatus.show (); pauză; cazul 1: pixelsStatus.setPixelColor (0, pixelsStatus. Color (0, 150, 0)); pixelsStatus.show (); pauză; cazul 2: pixelsStatus.setPixelColor (0, pixelsStatus. Color (0, 0, 150)); pixelsStatus.show (); pauză; caz 3: pixelsStatus.setPixelColor (0, pixelsStatus. Color (0, 0, 0)); pixelsStatus.show (); pauză;
}
}