Sadržaj:
2025 Autor: John Day | [email protected]. Zadnja izmjena: 2025-01-13 06:57
U ovom projektu ćete raditi noćnu lampu koristeći ardruino, Adafruit neo rgb trake i 3D štampač.
Imajte na umu da je ovo uljez čisto za moj školski projekt. Kôd za ovaj projekat zasnovan je na drugom projektu. S tim da nisam stručnjak kada je Ardruino u pitanju.
Korak 1: Zahtjevi
Za ovaj projekt trebat će vam sljedeći hardver i alati
Hardver:
1 - Ardruino101 (u SAD -u) ili Genuino101 (za izvan SAD -a).
2 - NeoPixel rgb LED trake od adafruit -a (5 volti).
3 - USB konektor za ardruino (konektor tipa B do A).
4 - Softver iz Ardruina, Ardruino IDE U ovom vodiču ćemo koristiti verziju 1.8.5. Zahtjevi za biblioteku softvera su: 101, Adafruit NeoPixel i Madgwick.
5 -I objekt za smještaj vašeg hardvera. U ovom slučaju ću koristiti 3D štampač. Datoteka za ovaj 3D ispis nalazi se u opisima pod nazivom "Lamp Head". Imajte na umu da ovaj format datoteke nije spreman za 3D štampanje. U zavisnosti od vaših 3D štampača, prvo morate pokrenuti određeni softver za 3D štampanje na 3D objektu. Ponekad će se skala 3D ispisa poništiti. pa provjerite je li promjer postavljen na 11 cm na 11 cm.
6 - Osnovni komplet za lemljenje.
Korak 2: Razumijevanje hardvera i softvera
Ardruin/Genuino101
Samo da pojasnimo Ardruino101 i genuino101 su potpuno isti pored imena. Obje imaju iste specifikacije i koriste isti softver.
Ardruino101 posjeduje osnovne specifikacije poput ardruino UNO i više. Glavna karakteristika ardruino101 je akcelerometar i žiroskop koje ćemo koristiti u svom projektu. I ova vrsta ardruina ima svoju jedinstvenu biblioteku kodova pod nazivom CurrieIMU (Interne mjerne jedinice) koja je uključena u bibliotečko proširenje 101.
S tim u vezi, razgovarajmo o softveru.
Softver i biblioteke
Ardruino IDE koristi python kao glavni izvorni kod. to je ujedno i platforma glavnog koda na kojoj radi većina ardruina. Na internetu postoji mnogo uputstava o korištenju ovog softvera pa vam preporučujem da ih prvo istražite ako ste tek počeli koristiti ovaj program.
S tim u vezi, biblioteke koje koristimo su sljedeće:
Iz izbornika Sketch,> Include Library> Manage Libraries … U okvir za unos teksta upišite
- 101 Standardno, ardruino 101 nije automatski uključen u ardruino IDE. Ovo proširenje biblioteke nam je potrebno da bismo kodirali naš ardruino tip.
-Adafruit NeoPixel za kodiranje naših Neo piksela.
-Madgwick Da biste pročitali neobrađene podatke i izračunali te podatke u sirovo, pitch and roll.
Neo RGB trake
Tip koji ću koristiti je 5 -voltni ili 5 -voltni. S ovim 5V ne treba mi prošireni izvor napajanja za kontrolu mojih traka. Umjesto toga, ja ću koristiti svoj ardruino kao izvor napajanja za kontrolu i osvjetljavanje traka.
Evo nekoliko savjeta koje morate znati prije nego počnete s ovim trakama.
Prvo će vam trebati Neodigital RGB LED trake od adafruta. Ova vrsta traka se može upravljati pomoću kodova. Zatim morate znati da se na ovim trakama nalaze stražnja i prednja strana. Ova stražnja i prednja strana su važne za lemljenje. Pazite da lemite prednju stranu gdje je tipka sa strelicom okrenuta od vrha.
Evo vodiča kako ih koristiti.
Postoje tri točke lemljenja koje morate imati na umu Uzemljenje (GND), Napon (V) i Pin veza (DIN).
Korak 3: Postavljanje komponenti
Prvo ćete morati 3D ispisati komponentu koju možete pronaći u zahtjevima. U ovom slučaju ću koristiti PLA. Uvjerite se da je promjer općeg predmeta 11 cm x 11 cm. Ovo će osigurati da se ardruino i trake uklope u špeku. Imajte na umu da svaki 3D štampač koristi različite softvere za izračunavanje procesa štampanja. S obzirom na to, datoteka koju koristite može se različito skalirati, pa to imajte na umu.
Drugo nakon ispisa, provjerite da li se komponente mogu zatvoriti. 3D otisci zajedno čine sferu. Trebali bi se lepo uklopiti. Ako želite izgubiti komponentu, dodajte unutrašnju stranu trake tako da je kapa ispunjena. A ako je riječ o debelom, upotrijebite brusni papir.
Treće, skematići za ardruino i trake su prilično laki. Upotrijebit ćete 3 žice za spajanje traka na ardruino. Imajte na umu da jedino mesto na koje lemim je trake. ne na samom Ardruinu.
GND ide u GND
DIN ide na pin (u našem slučaju pin6 na ardruinu)
5V ide na 5V
Provjerite je li količina LED traka koju koristite ograničena na 30. I tada to neće uspjeti pravilno izvršiti kôd. Možete jednostavno izrezati sve nepotrebne trake prikazane znakom škara.
Četvrto sve bi se trebalo lijepo uklopiti u sferu. Možda bi vam se svidjelo da sam napravio presjek između 1 3D ispisa kako bih vidio korita i na vrh postavio plastično korito.
Korak 4: Kodiranje
Dakle, do sada biste trebali imati sve potrebne komponente u svojoj biblioteci.
Evo koda koji će vam trebati za pokretanje projekta. Rezultat bi trebao izgledati kao video veza koju šaljem na ovoj stranici.
Izvor ovog koda možete pronaći ovdje. Ovaj projekt također uključuje i manje važne korake radi boljeg razumijevanja koda i algarita iza upotrebe.
#include #include #include #include
#define PIN 6 // NeoPixel Strip od 11 piksela
#define PIN1 7 // NeoPixel Strip od 1 piksela #define NUMPIXELS 30 // Broj piksela #define SAMPLE_RATE 25 // Brzina uzorkovanja za akcelerometar i žiroskop
// Madgwick konfiguracija
Madgwick filter; nepotpisani dugi microsPerReading, microsPrevious; float accelScale, gyroScale;
// NeoPixel konfiguracija
Adafruit_NeoPixel pikseli = Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel pixelsStatus = Adafruit_NeoPixel (1, 7, NEO_GRB + NEO_KHZ800);
// Prostori boja
RGBConverter rgbConverter; dvostruko h = 1; dvostruki s = 1; dvostruki v = 1; bajt rgb [3];
// Status Motion Lamp
// Stanje 0 -> Odabir nijanse -Pitch // Stanje 1 -> Odabir zasićenja -Roll // Stanje 2 -> Odabir vrijednosti -Zakretanje // Stanje 3 -> Ispravljanje promjenjive boje int statusLamp = 0;
void setup () {
Serial.begin (9600);
// pokretanje IMU -a i filtriranje
CurieIMU.begin (); CurieIMU.setGyroRate (SAMPLE_RATE); CurieIMU.setAccelerometerRate (SAMPLE_RATE); filter.begin (SAMPLE_RATE);
// Podesite raspon akcelerometra na 2G
CurieIMU.setAccelerometerRange (2); // Podesite raspon žiroskopa na 250 stupnjeva/sekundu 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.prekida (CURIE_IMU_TAP);
// inicijalizirati varijable za usklađivanje ažuriranja radi ispravne stope
microsPerReading = 1000000 / SAMPLE_RATE; microsPrevious = micros ();
// Init NeoPixel 11
pixels.begin (); pixels.show ();
// Pokretanje NeoPixel 1
pixelsStatus.begin (); pixels.show ();
// Prikaži status u px
setStatusPixel (statusLamp); }
void loop () {{100} {101}
int aix, aiy, aiz; // akcelerometar int gix, giy, giz; plovak sjekira, ay, az; float gx, gy, gz; float roll, pitch, yaw; statički nepotpisani dugi microsNow;
// provjeravamo je li vrijeme za čitanje podataka i ažuriranje filtera
microsNow = micros (); if (microsNow - microsPrevious> = microsPerReading) {
// čita neobrađene podatke iz CurieIMU -a
CurieIMU.readMotionSensor (aix, aiy, aiz, gix, giy, giz);
// pretvaranje iz sirovih podataka u gravitaciju i stupnjeve/sekundu
ax = convertRawAcceleration (aix); ay = convertRawAcceleration (aiy); az = convertRawAcceleration (aiz); gx = convertRawGyro (gix); gy = convertRawGyro (giy); gz = convertRawGyro (giz);
// ažuriranje filtera koji izračunava orijentaciju
filter.updateIMU (gx, gy, gz, ax, ay, az);
// ispisuje naslov, korak po korak
roll = filter.getRoll (); pitch = filter.getPitch (); yaw = filter.getYaw ();
// povećavamo prethodni put, tako da držimo pravilan tempo
microsPrevious = microsPrevious + microsPerReading;
// Samo ako promijenite Hue, Saturation ili Value
if (statusLamp odaberite Hue ako (pitch> = -90 && pitch <= 90 && statusLamp == 0) {// Pretvorite pitch angle = pitch + 90; // Dobija kordinate boje iz uglova h = pitch / 180.0;}
// Ograničenja uglova
// samo kotrljajte -90º do 90º = 180º // Stanje 1 -> odaberite zasićenje ako (rola>> -90 && roll <= 90 && statusLamp == 1) {// Pretvorite kutni kotrljaj = roll + 90; // Dobija kordinate u boji iz kutova s = roll / 180.0; }
// Stanje 2 -> odaberite vrijednost
if (statusLamp == 2) {// skretanje 0º do 360º v = skretanje / 360,0; }
// Pretvori u rgb
rgbConverter.hsvToRgb (h, s, v, rgb); /* Serial.print ("Boja:"); Serial.print (h); Serial.print (" -"); Serial.print (s); Serial.print (" -"); Serial.print (v); Serial.println ("");
Serial.print ("Orijentacija:");
Serial.print (zakretanje); Serial.print (""); Serial.print (pitch); Serial.print (""); Serial.println (roll); */
// Promjena boje piksela
for (int px = 0; px <NUMPIXELS; px ++) {pixels.setPixelColor (px, pixels. Color (rgb [0], rgb [1], rgb [2])); pixels.show (); }}
// Prikaži status u px
setStatusPixel (statusLamp); }}
float convertRawAcceleration (int aRaw) {
// budući da koristimo 2G raspon // -2g karte do sirove vrijednosti -32768 // +2g karte do sirove vrijednosti 32767
float a = (aRaw * 2.0) / 32768.0;
return a; }
float convertRawGyro (int gRaw) {
// budući da koristimo raspon od 250 stupnjeva/sekundi // -250 karata do sirove vrijednosti -32768 // +250 karata do sirove vrijednosti od 32767
plovak g = (gRaw * 250.0) / 32768.0;
return g; }
static void eventCallback ()
{// Otkrivanje dodira na svim osama if (CurieIMU.getInterruptStatus (CURIE_IMU_TAP)) {Serial.print ("Dodirnite otkrivena statusna lampica:"); Serial.println (statusLamp);
// Promjena stanja
statusLamp ++;
// Init stanje
if (statusLamp> 3) {statusLamp = 0; }}}
void setStatusPixel (int statusPx)
{switch (statusPx) {case 0: pixelsStatus.setPixelColor (0, pixelsStatus. Color (150, 0, 0)); pixelsStatus.show (); break; slučaj 1: pixelsStatus.setPixelColor (0, pixelsStatus. Color (0, 150, 0)); pixelsStatus.show (); break; slučaj 2: pixelsStatus.setPixelColor (0, pixelsStatus. Color (0, 0, 150)); pixelsStatus.show (); break; slučaj 3: pixelsStatus.setPixelColor (0, pixelsStatus. Color (0, 0, 0)); pixelsStatus.show (); break;
}
}