Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino - tutorijali, pitanja, primjeri i projekti
Mislim da si dao malo vise podataka o hardveru mozda shema ili nesto da ti konkretno pomognemo. Jer ta 0 (nula) ne zaustavlja niz ili bili sta to je jednostavno, u tvom slucaju, Pin0 na kojem ti palis led diodu ili gasis sa HIGH/LOW e sad ako koristis arduino uno, a verujem i drugi moduli, Pin0 i Pin1 se koristi za Rx i Tx za komunikaciju preko USB porta pa mozda ti onda dodje do neke kolizije ako je arduino spojen preko USB kabla na PC radi napajanja.
To mozes da proveris tako sto ces ostaviti int pinCount = sizeof(ledPins)/sizeof(int) bez ono -1, a umesto 0 u nizu stavi npr. 4 i probaj da li ce se program ponovo "zaglupiti"
Reply
Sema je od pina preko otpornika na masu. Koristim arduino uno ali nisam nista vezao na pin 0 i 1
Moze i bez - 1 kad se izbaci nula. Vezivo sam diode od 5-12.pin.Probacu i to da u nizu stavim 4 cim se vratim sposla.
Reply
Probao sam da uradim nesto sa tajmer1 registrom za spoljni takt,na pr ovde bi,bar tako mislim trebalo kad pritisnem taster sedmi put da upali led i na sedmi put da ugasi ali led se pali nekontrolisano,nekad na prvi nekad treci put...kad kako.Uredu je da zbog odskakanja tastera nemoze precizno ali stavim vrednost 65500 i upali se na pr posle treceg pritiska tastera.Gde sad gresim? Mislim da bi moralo ovako da radi:

int timer1_counter;
void setup()
{
pinMode(13, OUTPUT);


noInterrupts();
TCCR1A = 0;
TCCR1B = 0;


timer1_counter = 65530;
TCNT1 = timer1_counter;
TCCR1B |= (1 << CS12)+(1 << CS11)+(1 << CS10); //ulaz na 5.pin
TIMSK1 |= (1 << TOIE1);
interrupts();
}

ISR(TIMER1_OVF_vect)
{
TCNT1 = timer1_counter;
digitalWrite(13, digitalRead(13) ^ 1);
}
void loop() {

}
Reply
Dovrsavam projekt UV Timer v1.0 sa 7 segmentnim displayem i imam pitanje:

Kako da spojim dvije vrijednosti iz arraya u jednu? Array je byte definicije.

Npr imam:

byte digitEDIT[4];

digitEDIT[0]=0;
digitEDIT[1]=1;
digitEDIT[2]=5;
digitEDIT[3]=9;

sada u programu trebam da "spojim" zajedno prva dva digita i druga dva digita kako bih mogao izracunati zajedno sekunde...dakle ovako:

                        0                        1        * 60  +         5                    9
seconds = ((digitEDIT[0] + digitEDIT[1]) * 60) + (digitEDIT[2] + digitEDIT[3]);

Dakle izracun bi bio: 01*60 + 59 = 119

Ako zna ko drugaciji a laksi ili kraci kod moze slobodno da napise.
Treba mi ovaj kod da kada editiram znamenko po znamenku na 7 segmentnom displayu da se pretvore u sekunde sve 4 znamenke koje su odabrane kod EDIT moda vremena i onda dalje glavni program te sekunde pretvara u mmConfuseds format.
Reply
Seconds = 60 * (10 * digitEDIT[0] + digitEDIT[1]) + (10 * digitEDIT[2] + digitEDIT[3]);
Reply
Video 
(02-20-2022, 02:04 PM)vojinilic Wrote: Seconds = 60 * (10 * digitEDIT[0] + digitEDIT[1]) + (10 * digitEDIT[2] + digitEDIT[3]);

 Kod radi perfektno.

 Imam cudan problem oko ":", naime da bih je upalio trebam da upalim 2 display i DP pin na HIGH. Ako upalim 1 ili 3 ili 4 display ":" nema. Pa mi nije jasno zasto je to tako...

DS je ovaj: LD5643AR pdf, LD5643AR Description, LD5643AR Datasheet, LD5643AR view ::: ALLDATASHEET :::

[Image: attachment.php?aid=37153]

Ispitivao sam svaki pin po ovom DS i sve je to tocno za taj model koji imam, samo DP mi nije jasno zasto nemoze samo da se stavi pin 3 HIGH i npr DIG1 da bi ":" se upalio.

Ovo mi treba kada sam u EDIT digit modu da mi blinka svaka znamenka a ":" zelim da svjetli stalno bez zmiganja. A meni se dogodi da mi svijetli ":" stalno kako treba kad sam na DIG1, DIG3 ili DIG4, ali kad sam na DIG2 onda mi i ":" blinka zajedno sa DIG2, a treba da DIG2 samo blinka a ":" da svijetli.

Ima ko ideju kako rjesiti ovo?

Evo i video da se vidi problem:

https://drive.google.com/file/d/1FGwoqEe...sp=sharing

Te kako se zove ona maska koja se stavlja na 7 segmentni display da se fino vide displeyi, moze i ebay link...bilo je u temi FG ali nemogu naci link...


Attached Files Thumbnail(s)

Reply
D5 i D6 koji čine ":" su na drugom displeju. Pogledaj šemu koju si dao. Ona plastika se zove "Plastic Front Bezel For 7 Segment LED Display".
Da ":" stalno svetle moraš dovesti high na DP kada ti je red da osvežiš displej broj 2. Ako tada cifra ne treba da svetli onda ugasi segmente a,b,c ....
Ili daj kod pa da pogledamo ukoliko ti ovo nije dovoljno dobro objašnjenje.
Reply
Rjesio sam problem ":" tako sto sam ugasio sve segmente osim ":" kad sam na EDIT digit 2. Radim preko pali/gasi segmenta ne displeya i to mi radi savrseno.

Ovo je ta nova tehnoloska ideja:

https://github.com/gbhug5a/7-Segment-Dis...by-Segment

Dosao je red na active buzzer koji sam spoji preko 470R otpornika na pin 6 arduina, i VCC, GND na arduino PCB i to radi sa ovim kodom:


Code:
void setup() {
//We don't need anything here
}

void loop() {
    tone(6, 900, 500);
    delay(500);
    noTone(6); //stop music on pin 8
    delay(500);
}

Ali zvuci kao da je djecja igracka za male bebe, a ne ozbiljna sprava koja upravlja UV osvjetljenjem u odredjenom vremenu.

Dali ima ko kod pa da stavi u temi, kada je timer gotov sa odbrojavanjem napise mi se poruka "donE" i onda treba da svakih par sekundi BUZZER daje signal da je gotovo osvjetljavanje, i tako dugo BUZZER svakih par sekundi beepa dok se ne pritisne tipka START/STOP. Sa tipkama je sve gotovo i to mi radi kako treba, sada trazim BUZZER frekvenciju i trajanje koje bi bilo zgodno da se stavi, pa ako ko ima kod ili primjer sa neta, youtube snimke da postavi u temi da i to dodam.

Ja sam mislio nesto ovakvo ali pogodit frekvenciju je tesko, pa ako moze kod da se napise koje frekvencije i koji je duration.

Bosch logixx washing machine: how to change beeper and signal settings - YouTube

Poslusati prvih 3 sekunde je taj zvuk koji pokusavam reproducirati.

Dakle plan je:

kada je timer istekao ispise se "donE" i ide taj zvuk sa video gore (prvih tri sekunde poslusati zvuk), onda ide delay tisine od npr. 3sec....pa se opet taj zvuk ponovi....delay tisine 3sec pa se zvuk ponovi i tako u loop dok se ne pritisne tipka START/STOP.

Moze za primjer sa delay i tone() i notone(), a ja cu onda preraditi kod za TIMER0 COMPA interrupt, posto nekoristim ni millls() ni delay() ni slicno nego HW Timere u AVR i zaposleni su svi timeri u ATmega32u4 a to su 0, 1, 3 i 4 tako da kada se vec kupuje arduino sa tim AVR da se iskoristi HW kompletno a ne da stoji polu iskoristen SW.
Reply
Imam ovaj kineski modul na kojem je buzzer i oznaka je 2305PX i sa stranice: BUZZER dobijam podatke o buzzeru. Na pcb se nalazi BJT i smd otpornik. Kada dodam sa pina 6 Arduino Leonardo 470R otpornik i onda na ulaz tog buzzer modula koristim sljedeci kod:

Code:
const byte BUZZERpin = 6;


void setup() {
  //We don't need anything here
  pinMode(6, OUTPUT);

  cli();

  // initialize TIMER0 for a 244uS interrupt BUZZER
  TCCR0A = (1 << WGM01);                  // turn on CTC mode
  TCCR0B = (1 << CS00)|(1 << CS02);       // start TIMER0 and set prescaler to 1024
  OCR0A  = 3812;                          // set compare match register to desired timer count 244uS
  TIMSK0 = (1 << OCIE0A);                 // enable timer0 output compare match A interrupt

  sei();
}

void loop() {

}

volatile byte i = 0;
// timer0 overflow interrupt for BUZZER
ISR(TIMER0_COMPA_vect) {
  if (i<14) {
    digitalWrite(BUZZERpin, !digitalRead(BUZZERpin));
    i++;
  } else {
    digitalWrite(BUZZERpin, HIGH);    // turn BUZZER OFF
  }
}

Dobijam vrlo kratki trrrrr sa buzzera i dalje tisina. Dakle cilj mi je dobiti u 1 sekundi tri iste frekvencije zvuka (a frekvencija treba da bude 2637Hz) i da svaki od ta tri zvuka traju 333ms u 1sec.

Dakle ovako uzorak je 1sekunda:

1st BUZZ 2637Hz
Quiet 333ms
2st BUZZ 2637Hz
Quite 333ms
3st BUZZ 2637Hz
Quite 333ms

i tako u loop, a kasnije na pritisak tipke timera START/STOP samo disable TIMER0 Compare A Interrupt i to bude to.

Citam na netu i nije mi jasno kako se odredjuje frekvencija na buzzeru, jer ja trebam frekvenciju od 2637Hz da generiram na BUZZER (da se dobije visoki zvuk note E7).

Timer0 se pokrece u gornjem primjeru svakih cca 244uS i na izlaz daje kvadratni signal.
Reply
Citam na google da Active Buzzer ima fixnu frekvenciju i da se nemoze mjenjati frekvencija zvuka koju daje 2.5kHz po DS, pa zato se vrtim u krug i dobijam samo visok ton od 2.5kHz..kad mu stavim nizu frekvenciju zvuk krci i pun je smetnji.

Koliko vidim treba mi pasivni buzzer sa dvije zice koje se spajaju na AVR pinove i koristit tone i noTone naredbu ili Timer toggle da se dobi kvadratni signal 50posto duty cycle.

Jeli ko imao iskustva sa Active i Passive Buzzerom?

Da znam koji da kupim...
Reply
>> Ja sam mislio nesto ovakvo ali pogodit frekvenciju je tesko, pa ako moze kod da se napise koje frekvencije i koji je duration.

B7, G7, D8 : )

Ti-lu-liii Smile
Reply
(02-25-2022, 09:44 AM)mikikg Wrote: >> Ja sam mislio nesto ovakvo ali pogodit frekvenciju je tesko, pa ako moze kod da se napise koje frekvencije i koji je duration.

B7, G7, D8 : )

Ti-lu-liii Smile

 Hehe, lako je to tako kad budem imao pasivni buzzer, evo ima vec dva dana da "cupam" kosu zasto neradi, kad ono nakon proucavanja active buzzer ima u sebi driver koji daje fixnu frekvenciju i dovedes mu DC napon i on zujiii na 2300Hz, i nemoze nikako drugacije.

 Pasivni buzzer treba da kupim u ducanu elektronickom opremom jer nemam ni jedan doma, a on radi preko PWM modulacije sa pina. Eto to je to ako bude koga zanimalo a da nezna razliku izmedju aktivnog i pasivnog buzzera.

Aktivni - DC napon (fixna frekvencija)
Pasivni - AC napon (mjenjanje frekvencije)

U ATmega32u4 sam fino zaposlio sva 4 timera i to radi za sada savrseno, sada moram jos dodati "safety switch" i onda vidjet sto jos trebam.

Za radoznale:

TIMER0 - koristi arduino sustav za millis(), delay() i za serijsku komunikaciju koja se koristi kod debugging varijabli pa se nesmije dirati inace poremeti sistemsko vrijeme millis()
TIMER1 - koristi INPUT CAPTURE INTERRUPT za LEFT/RIGHT rotary encodera i COMPARE A OUTPUT INTERRUPT za delay od 333ms za BUZZER BEEP (za sada active buzzer 2,3kHz beep)
TIMER3 - 7 segment multiplexing segment by segment svake 3ms, COMPARE B OUTPUT INTERRUPT
TIMER4 - broji koliko puta je pritisnut SW button rotary encodera u zadanom vremenu OVERFLOW INTERRUPT, i broji duljinu LONG CLICK pomocu TIMER1 INPUT CAPTURE INTERRUPT

Ovi timeri su savrseni, sva 4 iskoristena i to tako brzo radi da sam iznenadjen za 8 bitni MCU sa 16MHz kristal taktom, jedina mana je da Arduino zauzima 27% flash memorije (drugi compileri bi zauzeli manje).

Zanima me sada kad budem zavrsio projekt sa Softwerske strane, dali da se crta PCB za te arduino module (arduino pro mini, rotary encoder PCB, passive buzzer PCB, RGB LED module PCB) i da se ti moduli stave na tu nacrtanu PCB ili crtat PCB da se lemi svaka komponenta posebno na taj PCB. Jedini problem ce biti ATmega32u4 koji je u QFP-44 package ali imam lemilicu na vruci zrak pa bude lakse.
Reply
BTW: Kada bi nekom muzičaru rekao nešto tipa, "Daj mi ton 2637Hz", prvo što bi odgovorio bi verovatno bilo "Molim???" jer uglvnom imaju po default ugradjenu atenuaciju (od kafana i koncerata) od cca -10 -15dB pa malo slabije čuju, "Šta si rekao?" ... : ) ... "Čoveče daj mi B, B7!" ... "Aaa, što ne kažeš tako, evo ti, Tiiiiii".
Reply
Aktivni buzzeri tako rade, to je nekad bilo popularno jer se na taj način rasterećuje MCU ili neka pasivna logika, manje-više je to prevazidjeno kada se ima MCU.

Pasivni buzzer je isto što i zvučnik kakav poznajemo u Audio svetu samo sa vrlo lošim karakteristikama ali je generalno zvučnik i tako se ponaša.
Upotreba PWM modula je malo trik-fora, mora da se razdvoje funkcionalnosti koje se tiču promene DUTY odnosa i promena FREQ.

DUTY odnos će uticati na jačinu/intenzitet generisanog tona, radiće u opsegu 0-50%, na 0 nema tona, na 50% je najjači. Kada se predje 50% DUTY onda se invertuje logika i kako se ide kao 100% tako se jačina tona ponovo smanjuje.

Frekvencija PWM-a je manje više jasna, ona odreduje visinu tona.

U tvom primeru sa snimka, treći ton D8 je izazov napraviti jer je neophodno da ga rasčlaniš na sitnije delove logike, imaš fiksnu frekvenciju koja traje cca 300ms sa fiksnom jačinom i onda deo gde se linearno jačina spušta ka nuli u nekom periodu reda 300-400ms da bi to na na kjaju zvučalo "LIIIiiii..." (ton sa kratkim fade-out)
Reply
(02-25-2022, 10:53 AM)ronovar Wrote: Ovi timeri su savrseni, sva 4 iskoristena i to tako brzo radi da sam iznenadjen za 8 bitni MCU sa 16MHz kristal taktom, jedina mana je da Arduino zauzima 27% flash memorije (drugi compileri bi zauzeli manje).

Verujem ako bi se malo potrudio i presao na asembler da bi mogao jos bolje da optimizujes kod koji verujem da ne bi bio ni 50% od trenutnog.
Linux is like a wigwam NO Windows NO Gates and an Apache inside
Reply
(02-25-2022, 12:19 PM)ddanijel Wrote:
(02-25-2022, 10:53 AM)ronovar Wrote: Ovi timeri su savrseni, sva 4 iskoristena i to tako brzo radi da sam iznenadjen za 8 bitni MCU sa 16MHz kristal taktom, jedina mana je da Arduino zauzima 27% flash memorije (drugi compileri bi zauzeli manje).

Verujem ako bi se malo potrudio i presao na asembler da bi mogao jos bolje da optimizujes kod koji verujem da ne bi bio ni 50% od trenutnog.

 U pravu si asm je najblizi MCU i to bi bilo savrseno, no prije sam ucio nesto asm i odlican mi je ali sam zastao kod pop push mnemonika koji mi nisu bili jasni a radi se o globalnim varijablama koje se stavljaju u ram prije nego se pozove funkcija druga koja koristi npr isti R16 registar pa se iz izlaza te funkcije ponovo vrati izvorna vrijednost R16 preko pop mnemonika. Tu sam na kraju odustao jer onda nisam znao kako pravilno koristiti te dva mnemonika, ostalo je vise manje strukturno slicno arduino programu sto se tice direktno postavljanje bitova timera u registrima timera.

Asm sam izostavio zato kada kasnije ako budem radio sto sa OLED i grafickim funkcijama potrebno ogromno znanje da se napise u asm kod, pa zato ostajem na Arduino. Mozda Atmel Studio C compiler budem koristio jednog dana da dobijem slobodan TIMER0 koji sada Arduino koristi za sebe.

Ovaj UV Exposure Unit Timer je jednostavan i sluzi da u posedenom vremenskom roku upali i ugasi UV LED array i da na kraju isteklog vremena ide beep beep i to je to. Tako da mislim da kompliciram u asm nema potrebe. Kada arduino bude zauzeo sav flash u ATmega32u4 onda prelazim na ATmega2560 ili jos veci sa vecom memorijom ili mu dodat vanjsku memoriju u obliku cipa....ali za to treba bas biti ogroman projekt. STM32 mi nisu za sada zanimljivi jer mi 8 bitni AVR ispunjavaju trenutne zahtjeve i rade brzo....a i nekako sam naviako na AVR registr pa mi je to bolje lezi.

Za buzzer cu kupiti ovaj:

Elektronika i elektrika : Piezo bez oscilatora 12x12mm 75dB 3V 4kHz (ad-electronic.hr)

imaju ga u ducanu pa cu sa njime da radim, posto je duplo skuplji od kineza,a neda mi se cekati mjesec dana da dodje iz kine.
Reply
Prikljuci preko kondenzatora od recimo 1uF + redno otpornika od 220Ohm na nožicu od kontrolera bilo šta što imaš u kući što proizvodi zvuk : ) ... Piezzo pločice iz rashodovanih "mini-linija", "zvučnik od tranzistora", "zvučnik/driver od rashodovanih slušalica" ili Full-range HiFi kutiju ako te interesuje kompletan zvučni spektar ... siguran sam da ne moraš da čekaš kineze da bi to probao Wink

A može i direkt u BatoMM, samo smanji malo Volume pre probe Smile
Reply
Evo ovako zvuci Aktivni buzzer preko timer delay 333ms i high/low na pinovima.

https://vimeo.com/681851542

Dali je zgodno dodati i beep na button press start i button press stop?

Ili da samo bude 3x beep na isteku vremena timera?
Reply
To su finese sa kojima možeš da se poigraš kasnije, zatrebaće ti možda neke druge funkcije koje su posledično povezane, zatreba na primer "Settings" ili "Save" da na primer zapamti programirano vreme i posle nestanka struje da ne programiraš stalno. Ako rešiš lepo tu logiku (ima pisanja po internom EEProm) onda možeš i "Settings" neki da napraviš i programiraš te tonove visine/dužine i da to zapamti isto u interni EEProm pa neka podešava kako ko voli.
Reply
SAVE programirano vrijeme imam rjeseno vec prije par dana a radi se na ovakav nacin:
- podesi se zeljeno vrijeme (LEFT/RIGHT rotary encoder) onda se drzi LONG CLICK na rotary encoderu i pojavi se na displeyu "P-01" tu onda sa LEFT/RIGHT biramo preset broj od 01 do 09 i opet LONG PRESS prikazuje na displeyu "donE" sto znaci da je uspjesno upisalo u EEPROM na taj preset broj zeljeno vrijeme, i nakon nestanka struje i ponovnog paljenja citamo zeljeno vrijeme sa LONG PRESS pojavi se "P-01" odaberemo sa LEFT/RIGHT zeljeni preset i samo jednom pritisnemo SW button na rotary encoderu i ucita se spremljeno vrijeme na displeyu sa odabranog preseta (P na displeyu oznacava PRESET). I onda kada je vrijeme ocitano sa EEPROMa klikom na SW button krece START za countdown mode, pritiskom opet na SW button radimo PAUSE i brojac se zaustavi (dvotocke ne blinkaju samo sve znamenke svijetle).

Ako zelimo sa displeya koji pokazuje vrijeme npr. 00:11 postaviti na npr: 12:34 onda samo napravimo DOUBLE CLICK na SW button rotary encodera i pocinje blinkati sec1 znamenka, sa LEFT/RIGHT mjenjamo od 0-9, dalji pritisak na SW blinka sec10 znamenka i sa LEFT/RIGHT biramo od 0-5, dalji pritisak na SW blinka min1 biramo sa LEFT/RIGHT 0-9, dalji pritisak na SW blinka min10 LEFT/RIGHT biramo 0-9, dalji pritisak SW rotary encodera sve znamenke svijetle i timer pokrecemo sa SW rotary encoder pritiskom i timer pocinje odbrojavati.

Eto, time sam rotary encoder savrseno zamjenio umjesto 3 ili 4 buttona i sve se radi kao kod iPHONE smartphone sa jednim rotary encoderom Smile
Sada gledam "safety switch" i koliko vidim imam primjer sa reed switch i magnetom, tu mi je plan kad budem crtao kuciste da kada se ladica otvori a timer radi i UV LED svijetle, da automatski zaustavi timer (sve digit i dvotocka zmigaju i tako daju do znanja korisniku da je FORSIRANA PAUSA), i kad se zatvori ladica timer normalno odbrojava i UV LED se upale normalno.

Kod svakog prvog paljenja timera u struju iscitava se automatski P-01 memorirano vrijeme.

Da bi to mogao da postignem, unutar kucista cu postaviti reed stakleni switch i na policu koja se otvara ide magnet, tako je reed switch otvoreni kada je ladica otvorena, a kada se ladica zatvori magnet na ladici magnetizira reed switch unutat staklenog kucista i daje arduino signal da je ladica zatvorena i da moze da se pokrene timer i upale UV LED.

Evo ovaj primjer gledam, ima i modul sa komparatorom i reed switchem, pa pitanje koji da odaberem...navodno reed modul ima komparator i daje cisti kvadratni signal, pa neznam dali to sto je bolje ili ne za ovo sto mi treba.

https://create.arduino.cc/projecthub/muc...ino-81f6d2

I da napomenem da u kodu nema ni jednog delay ni millis i loop() petlja je prazna...a najduzi interrupt za multiplexiranje traje 3ms...to ne utjece na rad timera i savrseno je tocan, mada u zadnjoj fazi kad dodjem do nje cu jos tu malo kod skratiti i time skratiti i naravno digitalWrite overwrite funkcije posto ona dosta u pozadini provjerava pinove registre itd...pa da se i to ubrza...
Reply


Forum Jump:


Users browsing this thread: 9 Guest(s)