Spalvą keičianti naktinė šviesa naudojant „Ardruino“101: 4 žingsniai (su nuotraukomis)
Spalvą keičianti naktinė šviesa naudojant „Ardruino“101: 4 žingsniai (su nuotraukomis)
Anonim
Image
Image
Spalvą keičianti naktinė šviesa naudojant „Ardruino 101“
Spalvą keičianti naktinė šviesa naudojant „Ardruino 101“

Šiame projekte jūs gaminsite naktinę lempą naudodami ardruino, „Adafruit neo rgb Strips“ir 3D spausdintuvą.

Atkreipkite dėmesį, kad šis neįmanomas dalykas yra skirtas tik mano mokyklos projektui. Šio projekto kodas pagrįstas kitu projektu. Turiu omenyje, kad nesu ekspertas, kalbant apie Ardruino.

1 žingsnis: Reikalavimai

Reikalavimai
Reikalavimai
Reikalavimai
Reikalavimai
Reikalavimai
Reikalavimai

Šiam projektui jums reikės šios įrangos ir įrankių

Techninė įranga:

1 - „Arduino101“(JAV) arba „Genuino101“(už JAV ribų).

2 - NeoPixel rgb LED juostelės iš adafruit (5 voltai).

3 - „Ardruino“USB jungtis (nuo B iki A tipo jungtis).

4 - „Ardruino“programinė įranga, „Ardruino IDE“Šiame vadove mes naudosime 1.8.5 versiją. Programinės įrangos bibliotekos reikalavimai yra šie: 101, „Adafruit NeoPixel“ir „Madgwick“.

5 -Ir objektas, skirtas jūsų techninei įrangai laikyti. Šiuo atveju naudosiu 3D spausdintuvą. Šio 3D spausdinimo failas yra aprašymuose, pavadintuose „Lempos galvutė“. Atminkite, kad šis failo formatas nėra paruoštas 3D spausdinimui. Priklausomai nuo jūsų 3D spausdintuvų, prieš tai 3D objekte turite paleisti nurodytą 3D spausdinimo programinę įrangą. Kartais 3D spausdinimo mastelis atstatomas. todėl įsitikinkite, kad skersmuo yra nustatytas 11 cm x 11 cm.

6 - Pagrindinis litavimo rinkinys.

2 žingsnis: Aparatūros ir programinės įrangos supratimas

Ardruinas/Genuino101

Norėdami patikslinti, „Ardruino101“ir „genuino101“yra labai tas pats šalia pavadinimų. Abu turi tas pačias specifikacijas ir naudoja tą pačią programinę įrangą.

„Ardruino101“turi tokias pagrindines specifikacijas kaip „ardruino UNO“ir dar daugiau. Pagrindinis „ardruino101“bruožas yra akselerometras ir giroskopas, kuriuos mes naudosime savo projekte. Taip pat šio tipo ardruino turi unikalią kodų biblioteką, pavadintą „CurrieIMU“(vidiniai matavimo vienetai), kuri yra įtraukta į bibliotekos plėtinį 101.

Tai pasakius, pakalbėkime apie programinę įrangą.

Programinė įranga ir bibliotekos

„Ardruino IDE“naudoja „python“kaip pagrindinį šaltinio kodą. tai taip pat pagrindinis platvorm kodas, kuriame veikia dauguma ardruino. Internete yra daug pamokų, kaip naudoti šią programinę įrangą, todėl rekomenduoju pirmiausia išstudijuoti jas, jei esate naujokas šioje programoje.

Atsižvelgiant į tai, mūsų naudojamos bibliotekos yra šios:

Meniu Eskizas> Įtraukti biblioteką> Tvarkyti bibliotekas … Teksto įvesties lauke įveskite

- 101 Standartiškai ardruino 101 nėra automatiškai įtraukiamas į ardruino IDE. Mums reikia šio bibliotekos plėtinio, kad galėtume koduoti mūsų ardruino tipą.

-Adafruit NeoPixel, kad galėtume koduoti mūsų Neo pikselių juosteles.

-Madgwick Norėdami perskaityti neapdorotus duomenis ir apskaičiuoti šiuos duomenis į neapdorotus, pikio ir ritininius.

Ne RGB juostelės

Aš naudosiu 5 tipo arba 5 voltų tipą. Naudojant šį 5v, man nereikia išplėstinio maitinimo šaltinio, kad galėčiau valdyti savo juosteles. Vietoj to aš naudosiu savo ardruino kaip energijos šaltinį, kad galėčiau valdyti ir apšviesti juosteles.

Štai keletas patarimų, kuriuos turite žinoti prieš pradėdami naudoti šias juosteles.

Pirmiausia jums reikės „Neodigital RGB“juostelių iš adafruit. Tokios juostelės yra kodoluojamos naudojant kodus. Kitas dalykas, kurį reikia žinoti, yra tai, kad ant šių juostų yra užpakalis ir priekis. Ši nugara ir priekis yra svarbūs litavimui. Būtinai lituokite priekinę pusę, kur rodyklės klavišas nukreiptas nuo galo.

Čia yra vadovas, kaip juos naudoti.

Turite nepamiršti 3 litavimo taškų Įžeminimo jungtis (GND), įtampos jungtis (V) ir kaiščio jungtis (DIN).

3 žingsnis: sudedamųjų dalių nustatymas

Komponentų nustatymas
Komponentų nustatymas
Komponentų nustatymas
Komponentų nustatymas
Komponentų nustatymas
Komponentų nustatymas

Pirmiausia turėsite 3D spausdinti komponentą, kurį rasite reikalavimuose. Šiuo atveju aš naudosiu PLA. Įsitikinkite, kad viso objekto skersmuo yra 11 cm x 11 cm. Tai užtikrins, kad ardruino ir juostelės tilptų į šepetėlį. Atminkite, kad kiekvienas 3D spausdintuvas naudoja skirtingas programas, kad apskaičiuotų savo spausdinimo procesą. Tai pasakius, jūsų naudojamas failas gali būti keičiamas skirtingai, todėl turėkite tai omenyje.

Antrą kartą po spausdinimo įsitikinkite, kad komponentai gali užsidaryti. 3D atspaudai kartu sudaro sferą. Jie turėtų gražiai tilpti. Jei kompozicija prarandama, priklijuokite juostą prie vidinės pusės, kad dangtelis būtų užpildytas. Ir jei jis yra storas, naudokite švitrinį popierių.

Trečia, ardruino ir juostelių skematicai yra gana paprasti. Norėdami prijungti juosteles prie ardruino, naudosite 3 laidus. Atkreipkite dėmesį, kad lituoti galima tik ant juostelių. ne pačiame Ardruino.

GND eina į GND

DIN eina į kaištį (mūsų atveju pin6 ant ardruino)

5V pereina prie 5V

Įsitikinkite, kad naudojamų šviesos diodų juostelių kiekis yra neviršija 30. Jei taip, tada ir nepavyks tinkamai įvykdyti kodo. Galite tiesiog nupjauti bet kokias nenupjautas juostas, nupjautas žirkliniu ženklu.

Ketvirta viskas turėtų gerai tilpti į sferą. Jums gali patikti, kad padariau sankryžą tarp 1 iš 3 spaudinių, kad galėčiau pamatyti lovelį ir ant viršaus uždėti plastikinį matymą.

4 žingsnis: kodavimas

Taigi iki šiol savo bibliotekoje turėtumėte turėti visus reikalingus komponentus.

Čia yra kodas, kurio jums reikės projektui vykdyti. Rezultatas turėtų atrodyti kaip vaizdo įrašo nuoroda, kurią siunčiu šiame puslapyje.

Šio kodo šaltinį rasite čia. Į šį projektą taip pat įeina būtini žingsniai, siekiant geriau suprasti naudojimo būdą ir kodą.

#įtraukimas #įtraukimas #įtraukimas #įtraukimas

#define PIN 6 // 11 pikselių „NeoPixel Strip“

#define PIN1 7 // 1 pikselių NeoPixel Strip #define NUMPIXELS 30 // Pikselių skaičius #define SAMPLE_RATE 25 // Akselerometro ir giroskopo mėginių ėmimo dažnis

// Madgwick konfigūracija

„Madgwick“filtras; unsigned long microsPerReading, microsPrevious; float accelScale, gyroScale;

// „NeoPixel“konfigūracija

Adafruit_NeoPixel pikseliai = Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel pixelsStatus = Adafruit_NeoPixel (1, 7, NEO_GRB + NEO_KHZ800);

// Spalvų erdvės

RGBConverter rgbConverter; dvigubas h = 1; dvigubas s = 1; dvigubas v = 1; baitų rgb [3];

// Būsenos judesio lempa

// 0 būsena -> Pasirinkite atspalvį -Pitch // būsena 1 -> Pasirinkite sodrumą -ritinys // 2 būsena -> Pasirinkite reikšmę -pasukimas // 3 būsena -> Nustatykite spalvotą nepastovų int statusLamp = 0;

void setup () {

Serial.begin (9600);

// paleiskite IMU ir filtruokite

CurieIMU.begin (); CurieIMU.setGyroRate (SAMPLE_RATE); CurieIMU.setAccelerometerRate (SAMPLE_RATE); filter.begin (SAMPLE_RATE);

// Nustatykite akselerometro diapazoną į 2G

CurieIMU.setAccelerometerRange (2); // Nustatykite giroskopo diapazoną iki 250 laipsnių per sekundę 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);

// inicijuoti kintamuosius, kad būtų atnaujintas tinkamas greitis

microsPerReading = 1000000 / SAMPLE_RATE; microsPrevious = micros ();

// „Init NeoPixel 11“

pixels.begin (); pixels.show ();

// „Init NeoPixel 1“

pixelsStatus.begin (); pixels.show ();

// Rodyti būseną taškais

setStatusPixel (statusLamp); }

void loop () {

int aix, aiy, aiz; // akselerometras int gix, giy, giz; plūdinis kirvis, ay, az; plūdė gx, gy, gz; plūdės ritinys, žingsnis, posūkis; statinis nepasirašytas ilgas „microsNow“;

// patikrinkite, ar laikas skaityti duomenis ir atnaujinti filtrą

microsNow = micros (); if (microsNow - microsPrevious> = microsPerReading) {

// skaityti neapdorotus duomenis iš „CurieIMU“

CurieIMU.readMotionSensor (aix, aiy, aiz, gix, giy, giz);

// konvertuoti iš neapdorotų duomenų į gravitaciją ir laipsnius/sekundės vienetus

ax = convertRawAcceleration (aix); ay = convertRawAcceleration (aiy); az = convertRawAcceleration (aiz); gx = convertRawGyro (gix); gy = konvertuotiRawGyro (giy); gz = convertRawGyro (giz);

// atnaujinkite filtrą, kuris apskaičiuoja orientaciją

filter.updateIMU (gx, gy, gz, ax, ay, az);

// spausdinti antraštę, žingsnį ir ritinį

ritinys = filtras.getRoll (); pikis = filtras.getPitch (); pasukimas = filtras.getYaw ();

// padidėjimas ankstesnį kartą, todėl išlaikome tinkamą tempą

microsPrevious = microsPrevious + microsPerReading;

// Tik jei pakeisite atspalvį, sodrumą ar vertę

if (statusLamp pasirinkite Hue if (pitch> = -90 && pitch <= 90 && statusLamp == 0) {// transformuoti kampo žingsnį = žingsnį + 90; // gauna spalvų koordinates iš kampų h = žingsnis / 180,0;}

// Kampų apribojimai

// ritinys tik nuo -90º iki 90º = 180º // 1 būsena -> pasirinkite Saturation if (roll> = -90 && roll <= 90 && statusLamp == 1) {// Transform kampas Roll = roll + 90; // Gauna spalvų koordinates iš kampų s = roll / 180.0; }

// 2 būsena -> pasirinkite Vertė

if (statusLamp == 2) {// pasisukimas nuo 0º iki 360º v = pasisukimas / 360,0; }

// Konvertuoti į rgb

rgbConverter.hsvToRgb (h, s, v, rgb); /* Serial.print ("Spalva:"); Serijinis atspaudas (h); Serial.print (" -"); Serijinis.spaudas (-ai); Serial.print (" -"); Serial.print (v); Serial.println ("");

Serial.print ("Orientation:");

Serial.print (posūkis); Serial.print (""); Serijinis atspaudas (žingsnis); Serial.print (""); Serial.println (ritinys); */

// Keisti pikselių spalvą

for (int px = 0; px <NUMPIXELS; px ++) {pixels.setPixelColor (px, pixels. Color (rgb [0], rgb [1], rgb [2]))); pixels.show (); }}

// Rodyti būseną taškais

setStatusPixel (statusLamp); }}

float convertRawAcceleration (int aRaw) {

// kadangi mes naudojame 2G diapazoną // -2g žemėlapius iki neapdorotos vertės -32768 // +2g žemėlapius iki neapdorotos 32767 vertės

plūdė a = (aRaw * 2.0) / 32768.0;

grąžinti a; }

float convertRawGyro (int gRaw) {

// kadangi mes naudojame 250 laipsnių/sekundžių diapazoną // -250 žemėlapių iki neapdorotos vertės -32768 // +250 žemėlapių iki neapdorotos 32767 vertės

plūdė g = (gRaw * 250.0) / 32768.0;

grąža g; }

static void eventCallback ()

{// Aptikti bakstelėjimą visose ašyse, jei (CurieIMU.getInterruptStatus (CURIE_IMU_TAP)) {Serial.print ("Bakstelėjimas aptikta statusLamp:"); Serial.println (statusLamp);

// Pakeisti būseną

statusLamp ++;

// Pradinė būsena

if (statusLamp> 3) {statusLamp = 0; }}}

void setStatusPixel (int statusPx)

{switch (statusPx) {case 0: pixelsStatus.setPixelColor (0, pixelsStatus. Color (150, 0, 0)); pixelsStatus.show (); pertrauka; 1 atvejis: pixelsStatus.setPixelColor (0, pixelsStatus. Color (0, 150, 0)); pixelsStatus.show (); pertrauka; 2 atvejis: pixelsStatus.setPixelColor (0, pixelsStatus. Color (0, 0, 150)); pixelsStatus.show (); pertrauka; 3 atvejis: pixelsStatus.setPixelColor (0, pixelsStatus. Color (0, 0, 0)); pixelsStatus.show (); pertrauka;

}

}