Inhoudsopgave:

Kleur veranderend nachtlampje met behulp van Ardruino 101 - Ajarnpa
Kleur veranderend nachtlampje met behulp van Ardruino 101 - Ajarnpa

Video: Kleur veranderend nachtlampje met behulp van Ardruino 101 - Ajarnpa

Video: Kleur veranderend nachtlampje met behulp van Ardruino 101 - Ajarnpa
Video: Hoe de AC-lamp te bedienen met behulp van relais met NodeMCU D1 Mini via WiFi 2024, November
Anonim
Image
Image
Kleur veranderend nachtlampje met behulp van Ardruino 101
Kleur veranderend nachtlampje met behulp van Ardruino 101

In dit project ga je een nachtlamp maken met behulp van ardruino, Adafruit neo rgb Strips en een 3D-printer.

Merk op dat dit intructable puur voor mijn schoolproject is. De code voor dit project is gebaseerd op een ander project. Dat gezegd hebbende, ik ben geen expert als het gaat om Ardruino.

Stap 1: Vereisten

Vereisten
Vereisten
Vereisten
Vereisten
Vereisten
Vereisten

Voor dit project heb je de volgende hardware en tools nodig:

Hardware:

1 - Een ardruino101 (in de VS) of een Genuino101 (voor buiten de VS).

2 - NeoPixel rgb ledstrips van adafruit (5 volt).

3 - A ardruino usb-connector (type B naar A-connector).

4 - Een software van Ardruino, Ardruino IDE In deze tutorial gebruiken we versie 1.8.5. Vereisten voor de softwarebibliotheek zijn: 101, Adafruit NeoPixel en Madgwick.

5 -En een object om uw hardware te huisvesten. In dit geval zal ik een 3D-printer gebruiken. Het bestand voor deze 3D-print bevindt zich in de beschrijvingen genaamd "Lamp Head". Merk op dat dit bestandsformaat niet klaar is voor 3D-afdrukken. Afhankelijk van uw 3D-printers moet u vooraf eerst de daarvoor bestemde 3D-printsoftware op het 3D-object uitvoeren. Soms wordt de schaal van de 3D-print gereset. zorg er dus voor dat de diameter is ingesteld op 11 cm bij 11 cm.

6 - Basis soldeerset.

Stap 2: De hardware en software begrijpen

Ardruin/Genuino101

Even ter verduidelijking Ardruino101 en genuino101 zijn precies hetzelfde naast de namen. Beide hebben dezelfde specificaties en gebruiken dezelfde software.

Ardruino101 beschikt over de basisspecificaties zoals de ardruino UNO en meer. Het belangrijkste kenmerk van ardruino101 is de versnellingsmeter en gyroscoop die we in ons project zullen gebruiken. Ook dit type ardruino heeft zijn unieke codebibliotheek genaamd CurrieIMU (Internal Measurement Units) die is opgenomen in de bibliotheekextensie 101.

Dat gezegd hebbende, laten we het hebben over de software.

Software en bibliotheken

Ardruino IDE gebruikt python als de belangrijkste broncode. het is ook de belangrijkste code-platvorm waar de meeste ardruino draait. Er zijn tal van tutorials online over het gebruik van deze software, dus ik raad je aan deze eerst te onderzoeken als dit programma nieuw voor je is.

Dat gezegd hebbende, zijn de bibliotheken die we gebruiken de volgende:

Vanuit het Schets-menu, > Bibliotheek opnemen > Bibliotheken beheren… Typ in het tekstinvoervak:

- 101 Standaard wordt de ardruino 101 niet automatisch opgenomen in de ardruino IDE. We hebben deze bibliotheekextensie nodig om ons ardruino-type te coderen.

-Adafruit NeoPixel om onze Neo-pixelstrips te coderen.

-Madgwick Om de ruwe data uit te lezen en deze data naar raw, pitch en roll te berekenen.

Neo RGB-strips

Het type dat ik ga gebruiken is een 5 volt of 5v type. Met deze 5v heb ik geen uitgebreide stroombron nodig om mijn strips te bedienen. In plaats daarvan zal ik mijn ardruino gebruiken als stroombron om de strips te bedienen en te verlichten.

Hier zijn enkele tips die u moet weten voordat u aan de slag gaat met deze strips.

Allereerst heb je een Neodigital RGB ledstrip van adafruit nodig. Dit soort strips is aanstuurbaar met behulp van codes. Vervolgens moet je weten dat er een achterkant en een voorkant op deze strips zit. Deze voor- en achterkant is belangrijk voor het solderen. Zorg ervoor dat u de voorkant soldeert waar de pijltoets van de punt af wijst.

Hier is een handleiding voor het gebruik ervan.

Er zijn 3 soldeerpunten waar u rekening mee moet houden. Aardverbinding (GND), Spanningsverbinding (V) en Pinverbinding (DIN).

Stap 3: De componenten instellen

De componenten instellen
De componenten instellen
De componenten instellen
De componenten instellen
De componenten instellen
De componenten instellen

Eerst moet u het onderdeel 3d printen dat u kunt vinden in de vereisten. In dit geval zal ik PLA gebruiken. Zorg ervoor dat de diameter van het totale object 11 cm bij 11 cm is. Dit zal ervoor zorgen dat de ardruino en de strips in de shpero passen. Merk op dat elke 3D-printer verschillende software gebruikt om het afdrukproces te berekenen. Dat gezegd hebbende, kan het bestand dat u gebruikt anders worden geschaald, dus houd daar rekening mee.

Controleer vervolgens na de afdruk of de componenten kunnen sluiten. De 3D-prints vormen samen een bol. Ze moeten mooi passen. Als de component verloren gaat, plak dan wat tape aan de binnenkant zodat de dop gevuld is. En als het te dik is, gebruik dan schuurpapier.

Ten derde zijn de skematichs voor de ardruino en de strips vrij eenvoudig. Je gebruikt 3 draden om de strips op de ardruino aan te sluiten. Merk op dat de enige plaatsen die ik soldeer op de strips zijn. niet op de Ardruino zelf.

GND gaat naar GND

DIN gaat naar een pin (in ons geval pin6 op de ardruino)

5V gaat naar 5V

Zorg ervoor dat het aantal ledstrips dat u gebruikt maximaal 30 is. Als dat niet het geval is, zal het de code niet correct uitvoeren. U kunt eenvoudig alle niet-gebruikte stroken knippen die worden weergegeven met een schaarteken.

Vierde Alles moet mooi in de bol passen. Je zou willen dat ik een snijpunt heb gemaakt tussen 1 van de 3D-print om door te kijken en een plastic doorkijkje op de bovenkant te plaatsen.

Stap 4: Coderen

Dus nu zou je alle benodigde componenten in je bibliotheek moeten hebben.

Hier is de code die je nodig hebt om het project uit te voeren. Het resultaat zou eruit moeten zien als de videolink die ik op deze pagina stuur.

De bron van deze code is hier te vinden. Dit project omvat ook de nodige stappen om de code en het algaritme achter het gebruik beter te begrijpen.

#include #include #include #include

#define PIN 6 // 11 pixels NeoPixel Strip

#define PIN1 7 // 1 pixel NeoPixel Strip #define NUMPIXELS 30 // Aantal pixels #define SAMPLE_RATE 25 // Sampling rate voor accelerometer en gyroscoop

// Madgwick-configuratie

Madgwick-filter; niet-ondertekende lange microsPerReading, microsVorige; vlotter accelScale, gyroScale;

// NeoPixel-configuratie

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

// Kleurruimten

RGB-converter rgb-converter; dubbele h = 1; dubbele s = 1; dubbele v = 1; byte-rgb[3];

// Status bewegingslamp

// Staat 0 -> Selecteer tint - Pitch // Staat 1 -> Selecteer verzadiging - Roll // Staat 2 -> Selecteer waarde - Yaw // Staat 3 -> Fix kleur vluchtig int statusLamp = 0;

ongeldige setup() {

Serieel.begin(9600);

// start de IMU en filter

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

// Stel het bereik van de versnellingsmeter in op 2G

CurieIMU.setVersnellingsmeterBereik(2); // Stel het gyroscoopbereik in op 250 graden/seconde CurieIMU.setGyroRange (250);

CurieIMU.autoCalibrateAccelerometerOffset(X_AXIS, 0);

CurieIMU.autoCalibrate AccelerometerOffset (Y_AXIS, 0); CurieIMU.autoCalibrate AccelerometerOffset (Z_AXIS, 1); CurieIMU.autoCalibrateGyroOffset();

CurieIMU.attachInterrupt (gebeurtenisCallback);

CurieIMU.setDetectionThreshold(CURIE_IMU_TAP, 950); CurieIMU.interrupts(CURIE_IMU_TAP);

// initialiseer variabelen om updates te versnellen om de snelheid te corrigeren

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

// Init NeoPixel 11

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

// Init NeoPixel 1

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

// Toon status in px

setStatusPixel(statusLamp); }

lege lus() {

int aix, aiy, aiz; // versnellingsmeter int gix, giy, giz; vlotterbijl, ay, az; vlotter gx, gy, gz; drijven rollen, stampen, gieren; statische niet-ondertekende lange microsNow;

// controleer of het tijd is om gegevens te lezen en het filter bij te werken

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

// lees onbewerkte gegevens van CurieIMU

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

// converteer van onbewerkte gegevens naar zwaartekracht en graden/seconde eenheden

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

// update het filter, dat de oriëntatie berekent

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

// print de kop, pitch en roll

roll = filter.getRoll(); toonhoogte = filter.getPitch(); yaw = filter.getYaw();

// vorige keer verhogen, zodat we het juiste tempo aanhouden

microsVorige = microsVorige + microsPerReading;

// Alleen als Tint, Verzadiging of Waarde wordt gewijzigd

if (statusLamp select Hue if (pitch >= -90 && pitch <= 90 && statusLamp == 0) { // Transform angle pitch = pitch + 90; // Verkrijgt kleurcoördinaten van hoeken h = pitch / 180.0; }

// Hoekenbeperkingen

// alleen rollen -90º tot 90º = 180º // Status 1 -> selecteer Verzadiging if (roll >= -90 && roll <= 90 && statusLamp == 1) { // Transform angle roll = roll + 90; // Verkrijgt kleurcoördinaten van hoeken s = rol / 180,0; }

// Staat 2 -> selecteer Waarde

if (statusLamp == 2) { // yaw 0º tot 360º v = yaw / 360,0; }

// Converteren naar rgb

rgbConverter.hsvToRgb(h, s, v, rgb); /* Serial.print("Kleur: "); Seriële.print(h); Serieel.print(" - "); Serieafdruk(ken); Serieel.print(" - "); Serial.print(v); Serieel.println(" ");

Serial.print("Oriëntatie: ");

Serial.print(yaw); Serieel.print(" "); Serial.print (pitch); Serieel.print(" "); Serial.println(rol); */

// Verander de kleur van de pixels

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

// Toon status in px

setStatusPixel(statusLamp); } }

float convertRawAcceleration(int aRaw) {

// aangezien we 2G-bereik gebruiken // -2g-kaarten met een onbewerkte waarde van -32768 // +2g-kaarten met een onbewerkte waarde van 32767

zweven a = (aRaw * 2.0) / 32768.0;

retourneer een; }

float convertRawGyro(int gRaw) {

// aangezien we een bereik van 250 graden/seconden gebruiken // -250 kaarten tot een onbewerkte waarde van -32768 // +250 kaarten tot een onbewerkte waarde van 32767

zweven g = (gRaw * 250,0) / 32768.0;

retour g; }

statische ongeldige gebeurtenisCallback()

{ // Detecteer tik in alle assen if (CurieIMU.getInterruptStatus (CURIE_IMU_TAP)) { Serial.print ("Tik op gedetecteerde statusLamp: "); Serieel.println(statusLamp);

// Status wijzigen

statusLamp++;

// Init-status

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

void setStatusPixel(int statusPx)

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

}

}

Aanbevolen: