User Tools

Site Tools


projektas_nr.13

Skirtumai

Čia matote skirtumus tarp pasirinktos versijos ir esamo dokumento.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
projektas_nr.13 [2015/10/25 18:03]
193.219.47.27
projektas_nr.13 [2016/01/03 13:20]
simonas
Linija 1: Linija 1:
 ====== Projektas Nr. 13. Daugiau šviesos diodų – Postūmio registras 74HC595 ====== ====== Projektas Nr. 13. Daugiau šviesos diodų – Postūmio registras 74HC595 ======
 +
 +**Ką darome?**
 +Laikas pradėti dirbti su lustais arba integriniais grandynais kaip juos yra įprasta vadinti. Lusto išorė gali būti labai apgaulinga. Pavyzdžiui,​ lustas, naudojamas „Arduino“ plokštėje (mikrokontroleryje) ir tas, kurį naudosime šioje grandinėje (poslinkio registre) atrodo labai panašiai, tačiau yra skirtingi. ATMega lusto, kuris yra ant „Arduino“ plokštės, kaina yra keli doleriai, o 74HC595 lusto – kelios dešimtys centų. Šis lustas labai geras pradedantiesiems ir kai jausitės patogiai dirbdami su juo ir jo duomenimis (prieinama internete http://​ardx.org/​74HC595 ), lustų pasaulis bus jūsų austrė. Poslinkio registras (taip pat vadinamas lygiagrečios serijos konverteriu),​ duos jums papildomus 8 išėjimus (LED ir panašių dirbinių kontroliavimui),​ naudojant tik tris „Arduino“ kištukus. Jie taip pat gali būti sujungti kartu, kad suteiktų jums beveik neribotą skaičių rezultatų naudojant tuos pačius keturis kaiščius. Kad būtų galima tuo naudotis jūs turite „sulaikrodininti duomenis ir tada juos užrakinti (užsklęsti). Norėdami tai padaryti, nustatykite duomenų kaištukus aukštai (high) arba žemai (low), siųskite duomenis į laikrodį, tada nustatykite duomenų kaištuką vėl ir siuntinėkite duomenis į laikrodį tol, kol būsite įregistravę 8bitus ​ duomenų. Tada siunčiate duomenis į sklendę ir 8bitai yra perkeliami į registrų perjungimo kaiščius. Skamba sudėtingai,​ bet yra labai paprasta kai jau suprantate. (Jei norite dar giliau pažvelgti į tai, kaip veikia registrų perjungimas apsilankykite:​ http://​ardx.org/​SHIF ).
 +
 +**Grandinės dalys:**
 +  *330 Ω Rezistorius (oranžinis-oranžinis-rudas) x8
 +  *Postūmio registras 74HC595 x1
 +  *Jungiamieji laidai x13
 +  *5mm raudoni/​geltoni šviesos diodai x8
 +
 +**Grandininė schema**
 +
 +{{::​arduwork2.jpg?​300|}}
 +
 +**Grandinės šablonas**
 +
 +{{::​arduwork3.jpg?​300|}}
 +
 +**Surinkta grandinė**
 +
 +{{::​arduwork4.jpg?​600|}}
 +
 +**Šaltiniai**
 +[[http://​ardx.org/​BBLS05|Plokštės maketas]]
 +[[http://​ardx.org/​VIDE05|Surinkimo video]]
 +
 +**Kodas** (Nukopijuokite kodą į IDE atvertą langą). Atsisiųskite kodą iš: ( http://​ardx.org/​CODE05 ) (nukopijuokite tekstą ir įklijuokite į tuščią „Arduino“ skečą)
 +
 +<​code>​
 +/*     ​-----------------------------------------------------
 + ​* ​    ​| ​ ArduinoExperimentationKitExampleCode ​            |
 + ​* ​    ​| ​ CIRC-05.: 8 MoreLEDs:​.(74HC595ShiftRegister) ​    |
 + ​* ​    ​-----------------------------------------------------
 + *
 + * Mes jau kontroliavome 8LED’us tačiau čia, tai padaroma šiek tiek
 + * kitaip. Vietoj to kad naudotume 8 kištukus naudosime tik 3
 + * ir papildomą lustą.
 + *
 + *
 + */
 +
 +
 +//​PinDefinitions
 +//​PinDefinitions
 +//​The74HC595 naudoja nuoseklųjį ryšį
 +//jungtis kuri turi 3 kištukus
 +intdata = 2;
 +intclock = 3;
 +intlatch = 4;
 +
 +//Naudojama pavienių LED'ų valdymui
 +intledState = 0;
 +constintON = HIGH;
 +constintOFF = LOW;
 +
 +
 +/*
 + * setup() - ši funkcija pradeda veikti iš karto, kai tik įjungiate savo „Arduino“ ​
 + * Nustatome savo 3 valdomus kaištukus į išeigos rėžimą
 + */
 +voidsetup()
 +{
 +  pinMode(data,​OUTPUT);​
 +  pinMode(clock,​OUTPUT);​
 +  pinMode(latch,​OUTPUT);​
 +}
 +
 +/*
 + * loop() - ši funkcija prasidės iš karto po nustatymų, o tada kartosis
 + * nustatome kuriuos LED'us įjungsime, ​ then call a routine which sends the states to the 74HC595
 + */
 +voidloop() ​           //​runoverandoveragain
 +{
 +  int delayTime = 100; //the number of milliseconds to delay between LED updates
 +   ​for(int i = 0; i < 256;i++) {
 +    updateLEDs(i);​
 +    delay(delayTime);​
 +   }
 +}
 +/*
 + * updateLEDs() - sends the LED states set in ledStates to the 74HC595
 + * sequence
 + */
 +void updateLEDs (int value {
 +  digitalWrite(latch,​LOW); ​   //Pulls the chips latch low 
 +  shiftOut(data,​clock,​MSBFIRST,​value); ​  //​Shifts out the 8 bits to the shift register
 +  digitalWrite(latch,​HIGH); ​ //Pulls the latch high displaying the data
 +}
 +
 +/*
 + * updateLEDsLong() - sends the LED states set in ledStates to the 74HC595
 + * sequence. Same as updateLEDs except the shifting out is done in software
 + * so you can see what is happening.
 +*/
 +void updateLEDsLong(intvalue) {
 +  digitalWrite(latch,​LOW); ​    //​Pulls the chips latch low
 +  for(int i = 0; i < 8;i++) {  //Will repeat 8 times(once for each bit)
 +  int bit = value & B10000000; //We usea "​bitmask"​ to select only the eighth
 +                               //bit in our number(the one we are addressing this time thro
 +                  //ugh
 +  value = value<<​1; ​           //we move our number upone bit value so next time bit 7 will
 +                  // be
 +                               //bit 8 and we will do our math on it
 +  if(bit==128) {digitalWrite(data,​HIGH);​ }     //if bit 8 is set then set our data pin high
 +  else{digitalWrite(data,​ LOW); }              //if bit 8 is unset then set the data pin low
 +  digitalWrite(clock,​HIGH); ​                   //then ext three lines pulse the clockpin
 +  delay(1);
 +  digitalWrite(clock,​LOW);​
 +  }
 +  digitalWrite(latch,​HIGH); ​  //​pulls the latch high shifting our data into being displayed
 +
 +
 +
 +//These are used in the bit wise math that we use to change individual LED's
 +//For more details http://​en.wikipedia.org/​wiki/​Bitwise_operation
 +int bits[] = {B00000001,​B00000010,​B00000100,​B00001000,​B00010000,​B00100000,​ B01000000,​B10000000};​
 +int masks[] = {B11111110,​B11111101,​B11111011,​B11110111,​B11101111,​B11011111,​B10111111,​B01111111};​
 +/*
 + * changeLED(intled,​intstate) - changesanindividualLED
 + * LEDsare 0 to 7 andstateiseither 0 - OFFor 1 - ON
 + */
 +void changeLED(intled,​intstate){
 +ledState = ledState & masks[led]; ​ //clears ledState of the bit we are addressing
 +if(state==ON){ledState = ledState | bits[led];​} ​ //if the bit is on we will add it to le
 +  //dState
 +  updateLEDs(ledState); ​           //send the new LEDstate to the shift register
 + }
 +</​code>​
 +
 +**Neveikia?​** (Trys dalykai bandymui)
 +  *Arduino galios šviesos diodas užgęsta:
 +Tai atsitiko mums kelis kartus, taip atsitinka kai lustas įdėtas ne ta puse. Jei pataisysite greitai niekas nesuges. ​
 +
 +  *Nevisai veikia?
 +Atsiprašau,​ kad skamba kaip sugedęs įrašas, bet problema turbūt yra kažkas paprasto, kaip supainioti laidai.
 +
 +   ​*Pyktis?​
 +Atsiųskite mums e-laišką, ši grandinė yra kartu ir paprasta ir sudėtinga tuo pačiu metu. Mes norime išgirsti apie jums kylančias problemas, kad galėtume jas aprašyti ateities leidiniuose. help@oomlout.com
 +
 +**Padaryti geriau:**
 +
 +  *Daroma sunkiuoju būdu:
 + ​„Arduino“ padaro kiek sudėtingus veiksmus labai paprastai, duomenų pakeitimas yra vienas iššių dalykų. Tačiau viena iš gerų „Arduino“ galimybių yra, kad galima padaryti dalykus lengvus ar sunkius tiek, kiek norite. Pabandome tokį pavyzdį. Savo kilpoje pakeiskite šią eilutę. <​code>​ updateLEDs(i) -> updateLEDsLong(i);​ </​code>​ Įkelkite programą ir pastebėsite,​ kad niekas nepasikeitėJei pažvelgsite į kodą, galesite pamatyti kaip mes komunikuojame su lusto kiekvienu bitu atskirai (daugiau detalių http://​ardx.org/​SPI ).
 +
 +  *Individualių LED’ų kontroliavimas:​
 +Laikas pradėti kontroliuoti LED'us panašiai kaip darėme CIRC02. Kadangi 8 LED'ai yra išsaugoti viename baite (8bitai) detalėms kaip tai veikia pabandykite ​ http://​ardx.org/​BINA. „Arduino“ yra labai geras manipuliuojant bitais ir yra visas rinkinys operatorių,​ kurie mums padeda. Detalės su bitais susijusiai matematikai (http://​ardx.org/​BITW).
 +
 +  *Mūsų įgyvendinimas.
 +Pakeiskite kilpos()kodą su:
 +<​code>​
 +int delayTime = 100; //the number of milliseconds to delay
 +                          //between LED updates
 +for(int i = 0; i < 8; i++){
 +  changeLED(i,​ON);​
 +  delay(delayTime);​
 +}
 +for(int i = 0; i < 8; i++){
 +  changeLED(i,​OFF);​
 +  delay(delayTime);​
 +}
 +</​code>​
 +
 +Ir įkėlus tai lemputės užsidegs viena po kitos ir užges taip pat. Patikrinkite kodą ir vikipediją,​ kad pamatytumėte kaip tai veikia arba parašykite mums e – laišką jei turite klausimų.
 +
 +**Daugiau animacijų:​**
 +Dabar darosi įdomiau. Jei pažvelgsite atgal į CIRC02 (8 LED Fun) kodą pamatysite, kad mes keičiame LED'us naudodami <​code>​ digitalWrite(led,​ state) </​code>​ tai tas pats formatas kaip rutina, kurią rašėme <​code>​ changeLED(led,​ state) </​code>​. Jūs galite naudoti animacijas, kurias parašėte CIRC02 nukopijuodami kodą į šį skečą pakeisdami visus <​code>​ digitalWrite()'​s į changeLED()'​s. </​code>​ Galinga? Labai (jūs taip pat turėsite pakeisti dar kelis kitus dalykus bet sekite sukauptomis klaidomis ir viskas išsispręs). ​
 +
  
 [[projektas_nr.14|Paskutinis projektas. Žaidžiame Simonas sako: TAIP]] [[projektas_nr.14|Paskutinis projektas. Žaidžiame Simonas sako: TAIP]]
  
 [[arduivadas_projektai|Atgal į projektus]] [[arduivadas_projektai|Atgal į projektus]]
projektas_nr.13.txt · Keista: 2016/01/03 13:20 vartotojo simonas