Posts: 1.157
Threads: 27
Joined: Oct 2014
Reputation:
313
(01-24-2018, 05:52 PM)Makso Wrote: Proradilo je.
Umjesto while(1) napišem while(flag1) i radi kako je napisano.
Ne treba while(1) za arduino sketch. To radi ono loop.
Makso, predlažem ti da odeš na sledeću stranicu i pogledaš kako se pozivaju arduino ugrađeni primeri. Ima ih dosta, data je šema povezivanja, izvorni kod i obješnjeno je šta koji primer radi:
https://www.arduino.cc/en/Tutorial/BuiltInExamples
Najbrže se uči iz primera prođi prvo to.
Serijsku komunikaciju uspostavi i probaj prvo između arduina i računara. Ima primera i za dvosmernu uart komunikaciju. Ima kasnije vremena za bežičnu komunikaciju jer ti je tu malo oteženo debagovanje.
Posts: 665
Threads: 40
Joined: Jul 2015
Reputation:
398
01-24-2018, 09:37 PM
(This post was last modified: 01-25-2018, 02:54 PM by me[R]a.)
Evo Makso probaj ovo :
Ovde mozes dodavati jos tastera samo u array byte taster[] dodas pin na koji je vezan taster i u array int command[numButtons] dodas komandu za taj pin i ne moras nista vise menjati u kodu.... Ovo ti je kod za transmit a na drugoj strani samo citaj komande i na osnovu njih izvrsavaj dalje radnje...
Code: int LED = 12;
byte taster[] = {8,9}; // ovde dodas pinove za druge tastere ako ti zatreba
#define numButtons sizeof(taster) //array size -> ovde definisemo koliko imas tastera
int command[numButtons] = {1111,2222}; // ovde unosis komande za tastere
boolean flag = false;
void setup() {
pinMode(LED, OUTPUT);
for(int i=0;i<numButtons;i++)
pinMode(taster[i], INPUT);
Serial.begin(9600);
}
void loop() {
flag=false;
for(int i=0; i<numButtons; i++){ // prolaz kroz buttone
int tasterTest = 0; // variable za debounce
digitalWrite(LED,LOW); // gasimo led kad taster nije pritisnut
while (digitalRead (taster[i]) == HIGH && flag==false){ // vrtimo petlju dok god je jedan od tastera pritisnut i dok nije podignut flag
tasterTest++;
if(tasterTest > 3){ // proveravamo debounce
Serial.println(command[i]); // saljemo komandu
digitalWrite(LED, HIGH); // palimo led da je taster pritisnut
flag=true; // podizemo flag da bi napustili for petlju da ne vrti sve mogucnosti nego da krene ponovo
delay(500); // ovaj delay trenutno nam "glumi" interapt znaci svaki cca pola sekunde idu komande zaredom ako
} // drzimo taster stalno pritisnut. Ovaj delay sam stavio samo zbog toga da damo dovoljno vremena wifi modulima da pravilno izkomuniciraju.
}
if(flag) break; // zapocinjemo for petlju ponovo
}
}
Ovo ti je bez interapta koji za ovakav jednostavan primer i nije potreban kad program naraste do granica potrebe za njim onda cemo ga i implemetirati...
Posts: 665
Threads: 40
Joined: Jul 2015
Reputation:
398
Posts: 1.517
Threads: 19
Joined: Apr 2013
Reputation:
211
@YuMERA
Probao sam, i to radi, samo ima problem jer ne mogu raditi dvije i više komandi istovremeno, o tome je već bilo govora ranije da mi treba 2-3 komande minimalno istovremeni, izgleda ću ipak morati ići na if...else petlje.?
Još jedna nedoumica, na koju sam potpuno zaboravio, da li mi je bolje da radim kombinaciju sa Arduino Nano + ekspander MCP23017 zbog proširenja pinova ili da idem na Arduino Mega (tu bih imao pinova na pretek, samo mi je teže napraviti pcb na koji će se postaviti Mega)?
Posts: 665
Threads: 40
Joined: Jul 2015
Reputation:
398
Ajd probat cemo drugu varijantu. Sto se tice PCB i Mege ne pravis pcb na koji ces ubosti Megu nego pravis pcb koji ces ubosti u Megu.
Posts: 665
Threads: 40
Joined: Jul 2015
Reputation:
398
01-26-2018, 12:34 PM
(This post was last modified: 01-26-2018, 12:39 PM by me[R]a.)
Evo primer sa mogucnoscu stiskanja vise tastera istovremeno:
Code: byte taster[] = {8,9}; // ovde dodas pinove za druge tastere ako ti zatreba
#define numButtons (sizeof(taster)) //array size -> ovde izracunavamo koliko imas tastera
int command=0;
int LED = 12;
volatile int comm = 0;
void setup() {
pinMode(LED, OUTPUT);
for(int i=0;i<numButtons;i++)
pinMode(taster[i], INPUT); // Proglasavamo Pinove ulaznim
Serial.begin(9600);
}
void loop() {
command = 0;
for(byte i = 0; i < numButtons; i++){
int tasterTest = 0; // variable za debounce
comm = 0;
digitalWrite(LED,LOW); // gasimo led kad taster nije pritisnut
while (digitalRead (taster[i]) == HIGH && comm==0){ //vrtimo petlju da budemo sigurni da je taster pritisnut
tasterTest++;
if(tasterTest > 3){ // proveravamo debounce
comm = 1; // bit 1 pritisnut taster (i)
digitalWrite(LED, HIGH); // palimo led da je taster pritisnut
}
}
command = command + (comm<<i) ; // kreiramo INT sa pomeranjem bitova u levo
}
Serial.println(command); // slanje komande
delay(100);
}
U ovom primeru mozes da dodajes tastere samo u array byte taster[] dodas pin na koji je vezan taster.
Komanda koja se salje je integer koji je kreiran od vrednost bitova(0 ili 1) u zavisnosti da li je taster pritisnut ili nije.
Posto ti u ovom primeru koristis samo dva tastera to znaci da ce se "komanda" kreirati od dva bita i njena max vrednost ce biti 3
primer:
Code: dva tastera :
Taster2 | Taster1 | Komanda
------------------------------
0 1 1
1 0 2
1 1 3
------------------------------
tri tastera :
Taster3 | Taster2 | Taster1 | Komanda
-------------------------------------
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
-------------------------------------
Na prijemnoj strani treba samo da od pristigle "komnde" ispitas njene bitove koji je stovan a koji nije i tako ces znati koji su tasteri pritisnuti.
Ako nije pritisnut ni jedan taster onda ovaj primer salje stalno "komandu" 0 ako hoces to da izbacis onda posaljes amo jednom 0 i cekas da se to stanje promenmi na taj nacin smanjujes opterecenost wifi modula sa komandom 0
Posts: 1.517
Threads: 19
Joined: Apr 2013
Reputation:
211
Probao sam i taj kod i on radi kako si opisao, samo čini mi se da će biti malo teže ispisati kombinacije komandi kad se tu doda 20-tak ulaznih tastera?
Da li bih trebao koristiti interrupt u kodu ili da ne koristim, mislim kolika je sigurnost od blokiranja MCU-a sem spoljašnjih smetnji, pretpostavljam da se malo poboljša rad sa interrupt-om, ili ipak griješim?
Dobro si pomenuo to kada nije aktivna ni jedna komanda da pošalje samo jednom "0", mislim da meni to ovde nije potrebno jer će se po završetku korištenja odmah gasiti daljinski.
Ja sam pokušavao ovako:
Code: int LED = 12;
int taster1 = 8;
int taster2 = 9;
unsigned char taster1test = 0;
unsigned char taster2test = 0;
boolean flag1 = false;
boolean flag2 = false;
void setup() {
pinMode(LED, OUTPUT);
pinMode(taster1, INPUT);
pinMode(taster2, INPUT);
Serial.begin(9600);
// initialize Timer1
noInterrupts(); // disable all interrupts
//cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 62535;//49536;//62437;//34286; // preload timer 65536-16MHz/256/2Hz
TCCR1B |= (0 << CS10 ) | (0 << CS11) | (1 << CS12); //256
TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
interrupts(); // enable all interrupts
//sei();
}
ISR(TIMER1_OVF_vect) // interrupt service routine that wraps a user defined function supplied by attachInterrupt
{
TCNT1 = 62535; // preload timer
if(digitalRead(8) == HIGH){
taster1test++;
if(taster1test > 3){
flag1 = true;
digitalWrite(LED, HIGH);
}
}
else{
taster1test = 0;
flag1 = false;
digitalWrite(LED, LOW);
}
if(digitalRead(9) == HIGH){
taster2test++;
if(taster2test > 3){
flag2 = true;
}
}
else{
taster2test = 0;
flag2 = false;
}
}
void loop() {
if(flag1){
digitalWrite(LED, HIGH);
Serial.println(1111);
}
else{
digitalWrite(LED, LOW);
Serial.println(0000);
}
if(flag2){
Serial.println(2222);
}
else{
Serial.println(3333);
}
delay(30);
}
samo sam morao flag = false prebaciti u ISR jer ako ostavim da se poništava u "if" petlji onda dobijem blinkanje, a i delay(30) da usporim malo zbog slanja komande i onda radi kako treba bez kašnjenja, e sad koliko je ovo pouzdano, da se ne bi desilo blokiranje MCU-a (zbog koda) i da se mora trčati do centralne jedinice da se ugasi?
Što se tiče PCB-a, znači da koristim Megu i da izbjegnem ekspandere.?
Posts: 665
Threads: 40
Joined: Jul 2015
Reputation:
398
01-26-2018, 04:05 PM
(This post was last modified: 01-26-2018, 04:21 PM by me[R]a.)
Ne znam sta da ti kazem... Moji pokusaji su kao jedan od mnogo nacina kako moze to da se napravi. E sad 20 tastera ne bi ni za ovaj moj kod bio problem jer sa jednim bajtom mozes da prenes informaciju od 8 tastera. znaci tebi treba 3 bajta za 20 (24) tastera. Sve sta bi morao da uradis je da neke deklaracije variabli iz int promenis u long
Mislim da ti trebas prvo da resis hardverski deo tvog sklopa pa onda da za njega pises softver a ne da pravis softver a da jos uvek ne znas kakav ce biti hardver...
To hardwerski najednostavnije je da uradis sa input shift register (npr. 74HC597) kojim trenutno ocitas sva stanja prekidaca i onda serijskim putem posaljes tu informaciju a na transmit strani stavis output shift register (npr. 74HC595) na koji prosledis primljenu informaciju a on aktivira releje ili vec sta mislis da palis i gasis.
Posts: 1.244
Threads: 10
Joined: Apr 2015
Reputation:
509
Makso,
a sta mislis o tome da se ti licno malo potrudis i uradis nesto sam na osnovu komentara i predloga clanova? Uopste nije u redu da ti clanovi citaju misli i pisu kod umesto tebe, a ti samo da kazes: “Radi mi to, ali bi mi trebalo jos ovo i ovo.”
Razmisli malo o tome. Ako zelis pomoc, kazi tacno i konkretno sta ti treba. Niko odavde nije Kraljica Kleopatra, pa da moze da cita rvoje misli. YuMera je izginuo dok ti nije napisao kod, a ti kazes radi, al bi mi trebalo jos to. Imaj respekta prema coveku i njegovom vremenu.
Mozda sam grub, ali poenta foruma nije resavanje problema u sitna crevca, niti citanje misli, vec stvar konsultacija i dogovora.
Jos jednom se izvinjavam ako sam grub, ali to je moje vidjenje stvari.
Pozdrav,
Vojin
Posts: 1.517
Threads: 19
Joined: Apr 2013
Reputation:
211
Drugari, ja se stvarno izvinjavam ako sam nekoga uvrijedio ili nešto slično tome, nije mi bila namjera...
U svakom slučaju, dosta ste mi stvari objasnili i nešto sam novo naučio, a tome se posebno radujem.
Bacam se na izradu PCBa-a i ostatka hardvera, pa ću se odlučiti da li ću ići na Megu ili Nano + ekspander/shift register, mada prije da ću se odlučiti na Nano + ekspander/shift register, biće mi jednostavniji PCB za ovu verziju...
Još jedno pitanje da li trebam na ulaze i izlaze iz ekspandera/shift registra raditi kao da su direktni pinovi na MCU-u, pull-up otpornik, redni otpornik za smetnje i optokapler?
Posts: 1.517
Threads: 19
Joined: Apr 2013
Reputation:
211
Ovako sam ja to zamislio.?
Posts: 1.244
Threads: 10
Joined: Apr 2015
Reputation:
509
Ne mogu obe I2C periferije da imaju istu slave addr.
Posts: 1.517
Threads: 19
Joined: Apr 2013
Reputation:
211
01-31-2018, 09:39 PM
(This post was last modified: 01-31-2018, 09:56 PM by Makso.)
To bi trebalo da se mijenja hardverski na A0, A1, A2 pinovima?
EDIT
Evo našao sam.
Posts: 1.244
Threads: 10
Joined: Apr 2015
Reputation:
509
Pa ti si postavio 000 na obe periferije. To ne moze.
Posts: 120
Threads: 4
Joined: Aug 2016
Reputation:
65
01-31-2018, 10:02 PM
(This post was last modified: 01-31-2018, 10:08 PM by veselinovic.)
Nisam siguran da dva I2C uredjaja na istoj magistrali mogu imati istu adresu,
a kod tebe je to slucaj. promijeni adresu jednog od dva MCP.
Dalje, ne bih nikad reset pin povezao direktno na 5V, nego bih stavio elektrolit cca 47uFna pin, a sa +5V neki otpornik cca 1k.
To ce sigurno resetovati kolo cak i pri sporom porastu ulaznog napona.
Trece, C1 bih premjestio iza diode D1, i tako ga pridruzio samo HC12.
Na svako kolo sto blize nozicama bih zakacio neki kondenzator.
Bogdan stavi SMD pa nareda neboder kondenzatora jedan iznad drugog.
Posts: 1.517
Threads: 19
Joined: Apr 2013
Reputation:
211
@veselinovic
Da li bi tu nešto uticalo na potrošnju, jer će sklop sa te šeme biti na baterijskom napajanju?
Posts: 1.244
Threads: 10
Joined: Apr 2015
Reputation:
509
Makso,
prvo namesti razlicite i2c adrese. Rst linije od expandera uvek vodi na mcu, tako da kada se mcu inicijalizuje, onda on podize periferije.
Ako ces baterijsko napajanje, onda moras da kazes kakvo baterijsko napajanje. Takodje int linije od expandera dovedi na mcu. One ti govore da li je nesto pritisnuto, a ne samo da vrtis i2c u krug. Na taj nacin se postize smanjena potrosnja. Mcu spava, a budi ga taster preko int linije.
Posts: 1.517
Threads: 19
Joined: Apr 2013
Reputation:
211
02-02-2018, 06:27 PM
(This post was last modified: 02-02-2018, 06:27 PM by Makso.)
Evo sa nekim ispravkama.
Da li reset može ovako da ostane na nekom pinu od MCU-a a ja u kod dodam da je taj pin HIGH čim se kod inicijalizuje?
Interrupt pinovi sa ekspandera, da li njih sve smijem sastaviti i spojiti na jedan pin MCU-a, čini mi se da u ds-u piše da su to samo izlazni pinovi?
Da li bi još nešto trebao dodati ili izmjeniti?
Za baterije sam mislio koristiti poznati model 18650 baterije 3.7V, povezati dvije u seriju da bih imao 7.4V i preko nekog kvalitetnijeg stabilizatora spustio na 5V, tako dodati nekoliko parova baterija, te su mi baterije lako dostupne a i dosta su rasprostranjene.?
Posts: 1.157
Threads: 27
Joined: Oct 2014
Reputation:
313
02-02-2018, 09:35 PM
(This post was last modified: 02-02-2018, 09:37 PM by gorankg.)
Reset može ovako. Ako su inicijalno INT pinovi konfigurisani kao open-drain (proveri ovo u datasheet-u) onda možeš da ih vezuješ zajedno na jedan pin MCU. Naravno, treba da imaš i jedan pull-up otpornik. Opet nisi ispravio adrese.
Posts: 1.517
Threads: 19
Joined: Apr 2013
Reputation:
211
Kad sam objavio post onda sam se sjetio za adrese, ostaviću na pcb nekakve jumpere za int pinove da mogu razdvojeno povezati na svaki zasebni pin MCU-a ili sve zajedno, ako budem i imao potrebe za tim, jer daljinski neće raditi dugo ako se ne koriste komande.
Počeću polako pcb da crtam...
|