Sisukord:

Puidust LED -kell - analoogne stiil: 11 sammu (piltidega)
Puidust LED -kell - analoogne stiil: 11 sammu (piltidega)

Video: Puidust LED -kell - analoogne stiil: 11 sammu (piltidega)

Video: Puidust LED -kell - analoogne stiil: 11 sammu (piltidega)
Video: Отчет по месторождению - 3 года БКК | WPC терраса бассейна на склоне - Заключение 2024, November
Anonim
Puidust LED -kell - analoogstiilis
Puidust LED -kell - analoogstiilis

See on analoogstiilis puidust LED -kell. Ma ei tea, miks ma pole ühtegi neist varem näinud … kuigi digitaalsed tüübid on väga levinud. Anyhoo, siit me läheme!

Samm 1:

Pilt
Pilt
Pilt
Pilt

Vineerkella projekt sai alguse lihtsa stardiprojektina CNC ruuteri jaoks. Vaatasin veebis lihtsaid projekte ja leidsin selle lambi (pilt ülal). Olin näinud ka digitaalseid kellasid, mis paistavad läbi puitvineeri (pilt ülal). Niisiis, kahe projekti ühendamine oli ilmselge idee. Otsides endale väljakutset, otsustasin selle projekti jaoks mitte kasutada spooni, vaid ainult puutükki.

2. samm: disain

Disain
Disain
Disain
Disain

Kujundasin kella Inkscape'is (pilt ülal). Disain on valikul väga lihtne. Otsustasin juhtmete juhtimisjälgede vastu mitte, sest sel hetkel ei olnud ma kindel, kas tahan radiaal- või perimeetrijuhtmetega. (Otsustasin lõpuks minna ümbermõõduliste juhtmetega.) Üks väike neopiksel läheb igasse väikestesse ümmargustesse aukudesse minuti ja tunni kuvamiseks viie minuti täpsusega. Keskel olev ring suunatakse elektroonika jaoks välja.

3. samm: CNCing

CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing
CNCing

Kujundasin tööriistateed MasterCAM -is ja kasutasin 3/4 tolli vineerist kella freesimiseks tehnoRouterit. Ma kasutan selleks 15 "x15" tükki, minimaalse raiskamisega. Nipp on võimalikult suur osa puidust välja suunata ilma puitu läbi murdmata. 0,05 "-0,1" jätmine on hea valik heleda puidu jaoks. Kui te pole kindel, on parem jätta rohkem puitu, sest teise näo saate alati lihvida. Lõpuks eemaldasin mõnest osast natuke liiga palju puitu, kuid õnneks ei kannata tulemused seetõttu liiga palju.

Märkus kasutajatele, kellel puudub juurdepääs CNC -le:

Seda projekti saab hõlpsasti teha puuripressiga. Peate lihtsalt seadma peatuse kohas, kus jätate alusele alles umbes 0,1 tolli puitu. Peate olema täpne, kuid mitte liiga täpne. Lõppude lõpuks ei näe keegi ideaalis, et kõik LED -id põlevad kell samal ajal, nii et pääsete väikese lohakusega.

4. samm: elektroonika

Elektroonika
Elektroonika
Elektroonika
Elektroonika
Elektroonika
Elektroonika

Elektroonika on üsna lihtne. Neopiksleid on 24, tundide kuvamiseks kaksteist ja minutite kuvamiseks kaksteist viieminutilise täpsusega. Arduino pro mini juhib neopiksleid ja see saab täpse aja DS3231 reaalajas kella (RTC) mooduli kaudu. RTC moodulil on varukoopiana mündirakk, seega ei kaota see aega ka siis, kui toide on välja lülitatud.

Materjal:

Arduino pro mini (või mis tahes muu Arduino)

DS3231 purunemisplaat

Neopikslid üksikutel purunemisplaatidel

Samm: elektroonika kokkupanek

Elektroonika kokkupanek
Elektroonika kokkupanek
Elektroonika kokkupanek
Elektroonika kokkupanek
Elektroonika kokkupanek
Elektroonika kokkupanek
Elektroonika kokkupanek
Elektroonika kokkupanek

Ma ühendasin neopikslid nööriga, kasutades kaheteistkümne esimese LED-i jaoks 2,5 juhtmeid ja kaheteistkümne kaheteistkümne juhtme jaoks. Oleksin võinud kasutada veidi väiksemaid juhtmete pikkusi. Pärast nööri tegemist katsetasin seda, veendudes, et jootmine liigesed olid head. Lisasin hetke lüliti kõigi LED -ide sisselülitamiseks, lihtsalt näitamiseks.

6. samm: kuivkäivitus

Kuivjooks
Kuivjooks
Kuivjooks
Kuivjooks
Kuivjooks
Kuivjooks
Kuivjooks
Kuivjooks

Pärast katsetamist, LED -ide aukudesse panemist ja nende kõigi sisselülitamist jäin tulemustega rahule. Niisiis lihvisin esipinda natuke ja kandsin peale PU -katte. Lõppesin hiljem mantli maha lihvimisega, kuid see on hea mõte jätta selga, kui see ei tundu esteetiliselt ebameeldiv.

Samm: epoksü

Epoksiid
Epoksiid
Epoksiid
Epoksiid

Pärast mõningast katsetamist juhtpositsiooniga aukudes leidsin, et parim arutelu saavutatakse siis, kui valgusdioodid on augu otsast umbes 0,2 tolli kaugusel. Kui proovite seda ise, on valgusdioodide heledus väga erinev iga auk. Ärge muretsege selle pärast; me parandame selle koodiga. See on minu kasutatava puuritüübi tõttu. Kui ma peaksin seda uuesti tegema, kasutaksin aukude jaoks kuuliga otsikut. Kuid igal juhul segasin vahemaa saamiseks epoksiidi ja panin igasse auku natuke.

8. samm: pange see kõik kokku

Kõike kokku panema
Kõike kokku panema
Kõike kokku panema
Kõike kokku panema
Kõike kokku panema
Kõike kokku panema
Kõike kokku panema
Kõike kokku panema

Valgusdioodid asetatakse alates kella 12-tunnise käe asendist, liikudes vastupäeva kõikides tundide osade asendites ja seejärel minutinäidiku suunas, liikudes uuesti vastupäeva liikuvast 60-minutilisest märgist. Seda nii, et eestpoolt vaadates ilmub LED -muster päripäeva.

Pärast seda, kui epoksiid oli tund aega tahenenud, panin veel mõne epoksüvaigu. Seekord paigutasin valgusdioodid aukudesse, kaetades kindlasti juhtmed ja jootekohad epoksüüdiga. See tagab hea valguse hajumise ja kindlustab juhtmed.

9. samm: kood

Kood
Kood

Kood on GitHubis, muutke seda oma huvides. Kui lülitate kõik LED -id samale tasemele, on läbi paistva valguse heledus igas augus väga erinev. Selle põhjuseks on aukude puidu erinev paksus ja puidu varju erinevus, nagu näete, varieerub puitvärv minu tükis üsna palju. Selle heleduse erinevuse parandamiseks tegin led -heledustasemete maatriksi. Ja vähendas heledamate valgusdioodide heledust. See on katse -eksituse protsess ja võib kesta mitu minutit, kuid tulemused on seda väärt.

vineerikell.ino

// Vineerikell
// Autor: tinkrmind
// Attribution 4.0 International (CC BY 4.0). Võite vabalt:
// Jaga - kopeerige ja levitage materjali mis tahes kandjal või vormingus
// Kohandamine - remiksige, muutke ja tuginege materjalile mis tahes eesmärgil, isegi kaubanduslikult.
// Hurraa!
#kaasake
#include "RTClib.h"
RTC_DS3231 rtc;
#include "Adafruit_NeoPixel.h"
#ifdef _AVR_
#kaasake
#endif
#definePIN6
Adafruit_NeoPixel riba = Adafruit_NeoPixel (60, PIN, NEO_GRB + NEO_KHZ800);
int tundPiksel = 0;
int minutePixel = 0;
unsignedlong lastRtcCheck;
String inputString = ""; // string sissetulevate andmete hoidmiseks
loogiline stringComplete = false; // kas string on täielik
int tase [24] = {31, 51, 37, 64, 50, 224, 64, 102, 95, 255, 49, 44, 65, 230, 80, 77, 102, 87, 149, 192, 67, 109, 68, 77};
voidsetup () {
#ifndef ESP8266
while (! Seeria); // Leonardo/Micro/Zero jaoks
#endif
// See on Trinket 5V 16MHz jaoks, saate need kolm rida eemaldada, kui te Trinketit ei kasuta
#if defineeritud (_AVR_ATtiny85_)
if (F_CPU == 16000000) clock_prescale_set (clock_div_1);
#endif
// nipsasja erikoodi lõpp
Seriaalne algus (9600);
riba.algus ();
strip.show (); // Initsialiseeri kõik pikslid olekusse „väljas”
kui (! rtc.begin ()) {
Serial.println ("RTC -d ei leitud");
samas (1);
}
pinMode (2, INPUT_PULLUP);
// rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
if (rtc.lostPower ()) {
Serial.println ("RTC kaotas voolu, määrab aja!");
// järgmine rida määrab RTC -le selle visandi koostamise kuupäeva ja kellaaja
rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));
// See rida määrab RTC -le selgesõnalise kuupäeva ja kellaaja, näiteks seadistamiseks
// 21. jaanuar 2014 kell 3:00 helistate:
// rtc.adjust (DateTime (2017, 11, 06, 2, 49, 0));
}
// rtc.adjust (DateTime (2017, 11, 06, 2, 49, 0));
// lightUpEven ();
// while (1);
lastRtcCheck = 0;
}
voidloop () {
if (millis () - lastRtcCheck> 2000) {
DateTime now = rtc.now ();
Serial.print (now.hour (), DEC);
Serial.print (':');
Serial.print (now.minute (), DEC);
Serial.print (':');
Serial.print (nüüd.second (), DEC);
Serial.println ();
showTime ();
lastRtcCheck = millis ();
}
if (! digitalRead (2)) {
lightUpEven ();
}
if (stringComplete) {
Serial.println (inputString);
if (inputString [0] == 'l') {
Serial.println ("Tase");
lightUpEven ();
}
if (inputString [0] == 'c') {
Serial.println ("Näitab aega");
showTime ();
strip.show ();
}
if (inputString [0] == '1') {
Serial.println ("Kõigi LEDide sisselülitamine");
lightUp (riba. Värv (255, 255, 255));
strip.show ();
}
if (inputString [0] == '0') {
Serial.println ("Puhastusriba");
selge ();
strip.show ();
}
// #3, 255 seaks led -numbri 3 tasemele 255, 255, 255
if (inputString [0] == '#') {
Stringi temp;
temp = inputString.substring (1);
int pixNum = temp.toInt ();
temp = inputString.substring (inputString.indexOf (',') + 1);
int intensiivsus = temp.toInt ();
Serial.print ("Seadistus");
Serial.print (pixNum);
Serial.print ("tasemele");
Serial.println (intensiivsus);
strip.setPixelColor (pixNum, strip. Color (intensiivsus, intensiivsus, intensiivsus));
strip.show ();
}
// #3, 255, 0, 125 seaks led -numbri 3 tasemele 255, 0, 125
if (inputString [0] == '$') {
Stringi temp;
temp = inputString.substring (1);
int pixNum = temp.toInt ();
int rIndex = inputString.indexOf (',') + 1;
temp = inputString.substring (rIndex);
int rIntensity = temp.toInt ();
intgIndex = inputString.indexOf (',', rIndex + 1) + 1;
temp = inputString.substring (gIndex);
intgIntensity = temp.toInt ();
int bIndex = inputString.indexOf (',', gIndex + 1) + 1;
temp = inputString.substring (bIndex);
int bIntensity = temp.toInt ();
Serial.print ("Seadistus");
Serial.print (pixNum);
Serial.print ("R kuni");
Serial.print (rIntensity);
Serial.print ("G kuni");
Serial.print (gIntensity);
Serial.print ("B kuni");
Serial.println (bIntensity);
strip.setPixelColor (pixNum, strip. Color (rIntensity, gIntensity, bIntensity));
strip.show ();
}
if (inputString [0] == 's') {
Stringi temp;
int tund, minut;
temp = inputString.substring (1);
tund = temp.toInt ();
int rIndex = inputString.indexOf (',') + 1;
temp = inputString.substring (rIndex);
minut = temp.toInt ();
Serial.print ("Näitab aega:");
Serial.print (tund);
Serial.print (":");
Serial.print (minut);
showTime (tund, minut);
viivitus (1000);
}
inputString = "";
stringComplete = vale;
}
// viivitus (1000);
}
voidserialEvent () {
while (Serial.available ()) {
char inChar = (char) Serial.read ();
inputString += inChar;
kui (inChar == '\ n') {
stringComplete = true;
}
viivitus (1);
}
}
voidclear () {
for (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, riba. Värv (0, 0, 0));
}
}
voidshowTime () {
DateTime now = rtc.now ();
hourPixel = now.hour () % 12;
minutPiksel = (praegu.minut () / 5) % 12 + 12;
selge ();
// strip.setPixelColor (tundPiksel, riba. Värv (40 + 40 * tase [tunnipiksel], 30 + 30 * tase [tunnipiksel], 20 + 20 * tase [tunnipiksel]));
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * tase [minutePixel], 30 + 30 * level [minutePixel], 20 + 20 * level [minutePixel]));
strip.setPixelColor (tundPiksel, riba. Värv (tase [tundPiksel], tase [tunnipiksel], tase [tunnipiksel]));
strip.setPixelColor (minutipiksel, riba.värv (tase [minutipiksel], tase [minutipiksel], tase [minutipiksel]));
// lightUp (riba. Värv (255, 255, 255));
strip.show ();
}
voidshowTime (int tund, int minut) {
hourPixel = tund % 12;
minutePixel = (minut / 5) % 12 + 12;
selge ();
// strip.setPixelColor (tundPiksel, riba. Värv (40 + 40 * tase [tunnipiksel], 30 + 30 * tase [tunnipiksel], 20 + 20 * tase [tunnipiksel]));
// strip.setPixelColor (minutePixel, strip. Color (40 + 40 * tase [minutePixel], 30 + 30 * level [minutePixel], 20 + 20 * level [minutePixel]));
strip.setPixelColor (tundPiksel, riba. Värv (tase [tundPiksel], tase [tunnipiksel], tase [tunnipiksel]));
strip.setPixelColor (minutipiksel, riba.värv (tase [minutipiksel], tase [minutipiksel], tase [minutipiksel]));
// lightUp (riba. Värv (255, 255, 255));
strip.show ();
}
voidlightUp (uint32_t värv) {
for (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, värv);
}
strip.show ();
}
voidlightUpEven () {
for (uint16_t i = 0; i <strip.numPixels (); i ++) {
strip.setPixelColor (i, riba. Värv (tase , tase , tase ));
}
strip.show ();
}

vaata rawplywoodClock.ino, mille hostiks on GitHub ❤

10. samm: arvuti nägemine - kalibreerimine

Arvuti nägemine - kalibreerimine
Arvuti nägemine - kalibreerimine
Arvuti nägemine - kalibreerimine
Arvuti nägemine - kalibreerimine

Tegin teadliku valiku, et selles projektis spooni ei kasutata. Kui oleksin, oleks puidu paksus kõigi LED -ide ees olnud sama. Kuid kuna mul on iga LED -i ees erineva paksusega puit ja kuna ka puidu värv varieerub palju, on LED -i heledus iga LED -i puhul erinev. Et kõik LED -id tunduksid ühesuguse heledusega, mõtlesin välja vahva triki.

Kirjutasin töötlemiskoodi (GitHubis), mis teeb kellast foto ja analüüsib iga LED -i heledust. Seejärel varieerub iga LED -i võimsus, et saavutada nende kõigi heledus sama hämara LED -iga. Nüüd ma tean, et see on liialdus, kuid pilditöötlus on väga lõbus! Ja ma loodan kalibreerimiskoodi raamatukoguna välja töötada.

Ülaltoodud fotodel näete LED -i heledust enne ja pärast kalibreerimist.

calibrateDispllay.pde

importprocessing.video.*;
importprocessing.serial.*;
Seeria myPort;
Jäädvustage video;
lõplik numberLed = 24;
int ledNum = 0;
// PxPGetPixelDark () kasutamiseks peavad teil olema need üldised varablid
int rDark, gDark, bDark, aDark;
int rLed, gLed, bLed, aLed;
int rOrg, gOrg, bOrg, aOrg;
int rTemp, gTemp, bTemp, aTemp;
PImage ourImage;
int runNumber = 0;
int aktsepteeritavViga = 3;
int tehtud;
int numPixelsInLed;
pikk ledIntensity;
int ledPower;
long targetIntensity = 99999999;
voidsetup () {
tehtud = newint [numLed];
numPixelsInLed = newint [numLed];
ledIntensity = uus [numLed];
ledPower = newint [numLed];
jaoks (int i = 0; i <numLed; i ++) {
ledPower = 255;
}
printArray (Serial.list ());
String portName = Serial.list () [31];
myPort = newSerial (see, pordiNimi, 9600);
suurus (640, 480);
video = newCapture (see, laius, kõrgus);
video.start ();
noStroke ();
sile ();
viivitus (1000); // Oodake, kuni jadaport avaneb
}
voiddraw () {
kui (video.available ()) {
kui (tehtud [ledNum] == 0) {
clearDisplay ();
viivitus (1000);
video.read ();
pilt (video, 0, 0, laius, kõrgus); // Joonista veebikaamera video ekraanile
saveFrame ("data/no_leds.jpg");
if (runNumber! = 0) {
if ((ledIntensity [ledNum] - targetIntensity)*100/targetIntensity> aktsepteeritavViga) {
ledPower [ledNum] -= pow (0,75, runNumber)*100+1;
}
if ((targetIntensity - ledIntensity [ledNum])*100/targetIntensity> aktsepteeritavViga) {
ledPower [ledNum] += pow (0,75, runNumber)*100 +1;
}
if (abs (targetIntensity - ledIntensity [ledNum])*100/targetIntensity <= aktsepteeritav viga) {
tehtud [ledNum] = 1;
print ("Led");
print (ledNum);
print ("tehtud");
}
kui (ledPower [ledNum]> 255) {
ledPower [ledNum] = 255;
}
kui (ledPower [ledNum] <0) {
ledPower [ledNum] = 0;
}
}
setLedPower (ledNum, ledPower [ledNum]);
viivitus (1000);
video.read ();
pilt (video, 0, 0, laius, kõrgus); // Joonista veebikaamera video ekraanile
viivitus (10);
samas (myPort.available ()> 0) {
int inByte = myPort.read ();
// print (char (inByte));
}
String imageName = "andmed/";
pildiNimi+= str (ledNum);
imageName += "_ led.jpg";
saveFrame (pildiNimi);
String originalImageName = "andmed/organisatsioon";
originalImageName+= str (ledNum);
originalImageName += ". jpg";
if (runNumber == 0) {
saveFrame (originalImageName);
}
PImage noLedImg = loadImage ("data/no_leds.jpg");
PImage ledImg = loadImage (pildiNimi);
PImage originalImg = loadImage (originalImageName);
noLedImg.loadPixels ();
ledImg.loadPixels ();
originalImg.loadPixels ();
taust (0);
loadPixels ();
ledIntensity [ledNum] = 0;
numPixelsInLed [ledNum] = 0;
jaoks (int x = 0; x <laius; x ++) {
jaoks (int y = 0; y <kõrgus; y ++) {
PxPGetPixelDark (x, y, noLedImg.pixels, width);
PxPGetPixelLed (x, y, ledImg.pixels, width);
PxPGetPixelOrg (x, y, originaalImg.pikslit, laius);
kui ((rOrg+gOrg/2+bOrg/3)-(rDark+gTumm/2+bTume/3)> 75) {
ledIntensity [ledNum] = ledIntensity [ledNum]+(rLed+gLed/2+bLed/3) -(rDark+gDark/2+bDark/3);
rTemp = 255;
gTemp = 255;
bTemp = 255;
numPixelsInLed [ledNum] ++;
} muud {
rTemp = 0;
gTemp = 0;
bTemp = 0;
}
PxPSetPixel (x, y, rTemp, gTemp, bTemp, 255, pikslit, laius);
}
}
ledIntensity [ledNum] /= numPixelsInLed [ledNum];
if (targetIntensity> ledIntensity [ledNum] && runNumber == 0) {
targetIntensity = ledIntensity [ledNum];
}
updatePixels ();
}
print (ledNum);
print (',');
print (ledPower [ledNum]);
print (',');
println (ledIntensity [ledNum]);
ledNum ++;
if (ledNum == numLed) {
int donezo = 0;
jaoks (int i = 0; i <numLed; i ++) {
donezo += valmis ;
}
if (donezo == numLed) {
println ("VALMIS");
jaoks (int i = 0; i <numLed; i ++) {
trükk (i);
print ("\ t");
println (ledPower );
}
print ("int level [");
print (ledNum);
print ("] = {");
jaoks (int i = 0; i <numLed-1; i ++) {
print (ledPower );
print (',');
}
print (ledPower [numLed -1]);
println ("};");
lightUpEven ();
samas (tõsi);
}
print ("Sihtintensiivsus:");
if (runNumber == 0) {
targetIntensity -= 1;
}
println (targetIntensity);
ledNum = 0;
runNumber ++;
}
}
}
voidPxPGetPixelOrg (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // värvide hankimine pikslitest int
aOrg = (seePiksel >> 24) & 0xFF; // peame iga komponendi eraldi saamiseks nihutama ja maskeerima
rOrg = (seePiksel >> 16) & 0xFF; // see on kiirem kui punaseks (), roheliseks (), siniseks () helistamine
gOrg = (seePiksel >> 8) & 0xFF;
bOrg = seePiksel & 0xFF;
}
voidPxPGetPixelDark (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // värvide hankimine pikslitest int
aTume = (seePiksel >> 24) & 0xFF; // peame iga komponendi eraldi saamiseks nihutama ja maskeerima
rDark = (seePiksel >> 16) & 0xFF; // see on kiirem kui punaseks (), roheliseks (), siniseks () helistamine
gDark = (seePiksel >> 8) & 0xFF;
bTume = seePiksel & 0xFF;
}
voidPxPGetPixelLed (intx, inty, int pixelArray, intpixelsWidth) {
int thisPixel = pixelArray [x+y*pixelsWidth]; // värvide hankimine pikslitest int
aLed = (seePiksel >> 24) & 0xFF; // peame iga komponendi eraldi saamiseks nihutama ja maskeerima
rLed = (seePiksel >> 16) & 0xFF; // see on kiirem kui punaseks (), roheliseks (), siniseks () helistamine
gLed = (seePiksel >> 8) & 0xFF;
bLed = seePiksel & 0xFF;
}
voidPxPSetPixel (intx, inty, int, intg, intb, inta, int pixelArray, intpixelsWidth) {
a = (a << 24);
r = r << 16; // Pakime kõik 4 komponenti ühte int
g = g << 8; // seega peame need oma kohtadesse nihutama
värv argb = a | r | g | b; // binaarne "või" operatsioon lisab need kõik ühte int
pixelArray [x+y*pixelsWidth] = argb; // Lõpuks seadsime int koos te värvidega pikslitesse
}

vaata rawcalibrateDispllay.pde, mille hostiks on GitHub ❤

11. samm: märkused lahkuminekuks

Lõkse, mida vältida:

* Puiduga saate selle, mille eest maksate. Niisiis, hankige kvaliteetne puit. Kasevineer on hea valik; iga hele täispuit sobib hästi. Ostsin puidu välja ja kahetsen oma otsust.

* Parem on puurida vähem kui rohkem. Paar auku läks minu tüki jaoks liiga sügavale. Ja epoksiid paistab esiküljelt läbi. See on väga märgatav, kui seda märkate.

* Kasutage sirge otsa asemel kuulotsaga puurit. Ma ei ole palli otsikuga natuke katsetanud, kuid olen üsna kindel, et tulemused on palju paremad.

Ma flirdin mõttega müüa neid Etsy või tindie kaudu. Oleksin väga tänulik, kui kommenteeriksite allpool, kui arvate, et see on mõttekas:)

Soovitan: