User Tools

Site Tools


projektas_nr.13

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

Grandinės šablonas

Surinkta grandinė

Šaltiniai Plokštės maketas Surinkimo video

Kodas (Nukopijuokite kodą į IDE atvertą langą). Atsisiųskite kodą iš: ( http://ardx.org/CODE05 ) (nukopijuokite tekstą ir įklijuokite į tuščią „Arduino“ skečą)

/*     -----------------------------------------------------
 *     |  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
 }

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ę.

 updateLEDs(i) -> updateLEDsLong(i); 

Į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:

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);
}

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

 digitalWrite(led, state) 

tai tas pats formatas kaip rutina, kurią rašėme

 changeLED(led, state) 

. Jūs galite naudoti animacijas, kurias parašėte CIRC02 nukopijuodami kodą į šį skečą pakeisdami visus

 digitalWrite()'s į changeLED()'s. 

Galinga? Labai (jūs taip pat turėsite pakeisti dar kelis kitus dalykus bet sekite sukauptomis klaidomis ir viskas išsispręs).

Paskutinis projektas. Žaidžiame Simonas sako: TAIP

Atgal į projektus

projektas_nr.13.txt · Keista: 2016/01/03 11:20 vartotojo simonas