Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino - Remote control (RF-TX)
#1
Brick 
Došao sam na ideju da izradim daljinsku kontrolu sa Arduinom i RF setom na 433MHz, ali kao i na svakom projektu problemi su prisutni...

Evo kod koji sam našao na netu i malo ga prepravio, ali to nisam dobro odradio pa imam problema sada.

Transmitter:
Code:
//transmitter
int inPin1 = 2;
int inPin2 = 3;
int inPin3 = 4;
int inPin4 = 5;

byte data;
boolean state;

void setup()
{

pinMode(inPin1,INPUT);
pinMode(inPin2,INPUT);
pinMode(inPin3,INPUT);
pinMode(inPin4,INPUT);
Serial.begin(9600);
data='0';
}

void loop()
{
while(1)
{
state=digitalRead(inPin1);
if(state==LOW)
data='A';
else
data='B';
Serial.write(data);

state=digitalRead(inPin2);
if(state==LOW)
data='C';
else
data='D';
Serial.write(data);

state=digitalRead(inPin3);
if(state==LOW)
data='E';
else
data='F';
Serial.write(data);

state=digitalRead(inPin4);
if(state==LOW)
data='G';
else
data='H';
Serial.write(data);
}

}

Receiver:
Code:
//receiver
byte incoming;

int ledPin1 = 8;
int ledPin2 = 6;
int ledPin3 = 4;
int ledPin4 = 2;

void setup()
{
Serial.begin(9600);
pinMode(ledPin1,OUTPUT);
pinMode(ledPin2,OUTPUT);
pinMode(ledPin3,OUTPUT);
pinMode(ledPin4,OUTPUT);
}

void loop()
{
while(1)
{
while(Serial.available())
{
incoming=Serial.read();
if(incoming=='B')
digitalWrite(ledPin1,HIGH);
else
digitalWrite(ledPin1,LOW);
}

while(Serial.available())
{
incoming=Serial.read();
if(incoming=='D')
digitalWrite(ledPin2,HIGH);
else
digitalWrite(ledPin2,LOW);
}

while(Serial.available())
{
incoming=Serial.read();
if(incoming=='F')
digitalWrite(ledPin3,HIGH);
else
digitalWrite(ledPin3,LOW);
}

while(Serial.available())
{
incoming=Serial.read();
if(incoming=='H')
digitalWrite(ledPin4,HIGH);
else
digitalWrite(ledPin4,LOW);
}
}
}

.
Problem je sledeći, kada transmitter šalje poruke u slovima kao što je u kodu, dok ispiše sve četiri komande receiver čita po redu komande i na izlazu ledice mi trepere kako ih on čita? Kako bi to mogao riješiti ali da kod opet u jednu ruku ostane jednostavan, bar za mene?
Ako sam promašio mjesto teme molio bih moderatore da oni premjeste na odgovarajuće mjesto.
Reply
#2
To sto si objasnio je ono kako je program napravljen da radi. Kako ti zes da ti radi?
Reply
#3
Samo da ledice ne trepću kada se čitaju komande u serial-u nego da normalno svijetle dok je taster aktivan ili više njih?
Reply
#4
Ne znam u kom jeziku je ovo pisano. Resenje ti je sledece. Treba da izbacis sve else-ove ovog tipa else
digitalWrite(ledPin4,LOW); i da ubacis jedan tajmer koji ako ne dobijes podatak od UART-a , onda pobrises sve LED-ove.
Reply
#5
Ako sam dobro razumio, kada prekidači nisu aktivni serial bi trebao biti čist i da ne šalje nikakve komande nego tek kada se aktivira neki od prekidača onda serial šalje komandu tj. da ne provjerava sve ledice konstantno?
Reply
#6
Upravo tako. Tebi LED blinka zato jer stalno imas provere. Kada prvi put posaljes 'A' npr. onda ce da ti se ukljuci prva led. Kada posaljes 'B', onda ce da ti se iskljuci prva LED (to je zbog onog else), a ukljucice ti se druga LED itd.
Reply
#7
Probao sam i bez else na transmitteru i samo sam dobio brže blinkanje kada je više ledica aktivno, jer ima manje komandi za čitanje, opet nije ni to rješenje?
Reply
#8
(09-11-2016, 05:43 PM)Makso Wrote: Probao sam i bez else na transmitteru i samo sam dobio brže blinkanje kada je više ledica aktivno, jer ima manje komandi za čitanje, opet nije ni to rješenje?

Makso,

bez else treba da bude na receiveru, a ne na transmiteru.
Reply
#9
Izvinjavam se, sada sam na receiveru obrisao else a na transmitteru ostavio else, i kad aktiviram par ledica rade sasvim normalno bez blinkanja ali imam neki novi problem, sada neće da se ugasi kada pritisnem taster ledica se pali momentalno ali se ne gasi nikako a nekad se ugasi nakon dužeg vremena?
Da nije problem u antenama jer sam zaletovao običan komad žice sa izolacijom od nekih 15-tak cm?
Reply
#10
Makso, prema postojecem softveru, LED bi trebale samo da se ukljuce, a nikada da se iskljuce. Probaj ovakav program na receiveru. Moras samo da definises globalnu promenljivu tipa unsigned long. Broj od 10000 sam lupio. Moras da odredis koja vrednost tebi odgovara da bi se LED iskljucile posle vremena koje ti odgovara.


Attached Files
.txt   Receiver.txt (Size: 549 bytes / Downloads: 5)
Reply
#11
Evo šta sam sada uradio:
Code:
void loop()
{
while(1)
{
while(Serial.available())
{
incoming=Serial.read();
if(incoming=='B')
digitalWrite(ledPin1,HIGH);
else
digitalWrite(ledPin1,LOW);

if(incoming=='D')
digitalWrite(ledPin2,HIGH);
else
digitalWrite(ledPin2,LOW);

if(incoming=='F')
digitalWrite(ledPin3,HIGH);
else
digitalWrite(ledPin3,LOW);

if(incoming=='H')
digitalWrite(ledPin4,HIGH);
else
digitalWrite(ledPin4,LOW);
}
}
}
.
Svako dolaznu komandu sam grupisao sve zajedno, i radi kako meni treba, sad moram testirati sa još komandi pa javljam rezultate, a probaću i ovaj prethodni kod što si napisao.
Reply
#12
(09-11-2016, 07:00 PM)Makso Wrote: Evo šta sam sada uradio:
Code:
void loop()
{
while(1)
{
while(Serial.available())
{
incoming=Serial.read();
if(incoming=='B')
digitalWrite(ledPin1,HIGH);
else
digitalWrite(ledPin1,LOW);

if(incoming=='D')
digitalWrite(ledPin2,HIGH);
else
digitalWrite(ledPin2,LOW);

if(incoming=='F')
digitalWrite(ledPin3,HIGH);
else
digitalWrite(ledPin3,LOW);

if(incoming=='H')
digitalWrite(ledPin4,HIGH);
else
digitalWrite(ledPin4,LOW);
}
}
}
.
Svako dolaznu komandu sam grupisao sve zajedno, i radi kako meni treba, sad moram testirati sa još komandi pa javljam rezultate, a probaću i ovaj prethodni kod što si napisao.

Ovaj program sto si napisao, nije dobar. Opet ce da ti se pale/gase. Probaj moj program. Tamo je mnogo elegantnije reseno. Mogu da ti objasnim tacno sta se desava u programu, ako treba.
Reply
#13
Još uvijek radi sasvim dobro i nema još nikakvih smetnji kada sve rade istovremeno bar se okom ne primjećuje da blinkaju.?
A probaću sad i tvoj program.
Ako ti nije problem objasni.? Smile

Izbacuje mi grešu za ovaj dio koda: { Brojac++;}
Reply
#14
Moras da definises promenljivu koja se zove brojac. Ako je to programski jezik C onda pre svih funkcija napisi:
unsigned long Brojac = 0;
Nisam ja tebe razumeo u startu. Ovako kako si napisao program radi na sledeci nacin:
Ako primis karakter 'B' onda palis LED1
Ako primis bilo koji drugi karakter, gasis LED1.

Ako tako treba da radi, onda je OK. Ne razumem te najbolje, kako zelis da ti radi program. Opisi malo.
Reply
#15
Evo da ti objasnim kako bi trebao da radi:

prekidač1 = led1
prekidač2 = led2
prekidač3 = led3
prekidač4 = led4

svaki prekidač kontroliše svoju ledicu, tj. kada je prekidač1 (ili neki drugi prekidač) aktivan on pali svoju ledicu a nijedna drgua ne zavisi od tog prekidača i dok je prekidač aktivan led radi i dok se prekidač pusti led se gasi, i tako da se više njih može upaliti istovremeno i kad se pusti neki prekidač on gasi samo svoju ledicu a ostali prekidači koji su i dalje aktivni te ledice koje su vezane sa njima nastavljaju sa radom. Možda sam zapetljao ali ako nije jasno probaću nekako još bliže da objasnim.
Reply
#16
Sada sam probao i tvoj program i kada stavim za brojač broj 100, onda radi kako meni treba a u praksi se isto ponaša kao i moj program. Mislim da mi je ovo sad veći napredak. Smile
Reply
#17
Makso, dobar je tvoj program. Ja sam tek sada video program za transmiter i vidim da on salje podatak i kada je prekidac aktivan i kada nije, tako da ce onda onaj else kod receivera da iskljuci led, jer ce da primi stanje od prekidaca. Evo izmene mog programa da bude napisan bas u skladu sa programom za transmiter.


Attached Files
.txt   Receiver.txt (Size: 584 bytes / Downloads: 7)
Reply
#18
Uglavnom sada su problemi riješeni, i na tome ti se puno puno zahvaljujem. Smile Da smo blizu pa da popijemo jednog Jelena... Big Grin Big Grin

Sad mi ostaje da testiram maksimalan domet, sada te opet pitam za mišljenje i savjet kako da napravim što kvalitetniju antenu?
Reply
#19
Rado bih popio par Jelena sada. Moracemo da organizujemo nesto. Najverovatnije na skupu u Kragujevcu.
Kazi mi samo koji RF modul koristis.
Reply
#20
Evo koji je RF modul.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)