DIY Electronic projects

Full Version: Arduino - Remote control (RF-TX)
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9
Makso,

ne znam odakle ti kasnjenje od jedne sekunde. To ne bi smelo da se desava ni kada koristis softverski uart. Da li si ti siguran da ti je MCU radi na 16MHz? Da li su ti osiguraci podeseni tako da ti MCU radi sa esternim kristalom? Prvo bi to trbali da definisemo. Takodje, iz koda izbaci sve komande koje su ti neki Delay.
Evo kako se radi sa hardverskim uart-om.
Pre svega ovoga treba podesiti pinove RX i TX
UCSR0A = 0b01000010;
UCSR0B = 0b00011000;
UCSR0C = 0b00000110;
UBRR0H = 0;
UBRR0L = 207; // 9600bps pri 16MHz

// Funkcija za slanje jednog bajta preko UART-a
void SendByte(unsigned char DataForSend)
{
UDR0 = DataForSend;
while(!(UCSR0A & 0x40));
UCSR0A |= 0x40;
}

// Funcija za prijem jednog bajta
unsigned char ByteReceive(void)
{
while(!(UCSR0A & 0x80));
return UDR0;
}

Ove dve funkcije zakucavaju procesor u while petlji, tj. koriste tzv. poolig metodu. Da ne bi stalno cekao u petlji da li je nesto stiglo ili ne, moze da napravis i sledecu funkciju:

unsigned char IsBytesAvialable()
{
if(UCSR0A & 0x80)
{return 0xFF; // Bajt je stigao
}
else
{
return 0x00; // Bajt nije stigao
}
}


Ovako mozes da koristi slanje.

SendByte('*');

Ovako mozes da radis prijem:

if(IsBytesAvialable)
{ ReceivedData = ByteReceive();
}

Ovo bi se sve koristilo u main-u. Ako ti treba bas nesto ozbiljo, onda se koristi prekidi (interapti) i brze od toga ne moze. Ostaje da se napravi parser poruka itd.
Stvari stoje ovako, vratim oba Arduina na softverski UART i izbacim interrupt sa Arduina koji šalje komande i sve radi savršeno bez kašnjenja, vratim oba Arduina na hardverski UART (onaj obični bez ovih dodataka što ste mi predložili) isto bez interrupta, pojavi se kašnjenje, ostavim jedan Arduino na hardverskom UART-u a drugi na softverski UART i kašnjenje se smanjuje za 50%.
Koji arduino koristis? Moram da pogledam semu. Napisi i na koje pinove kacis softverski, a na koje hardverksi uart.
Arduino Nano (jača verzija sa ATmega328P MCU-om), hardverski uart je na RX (PD0) i TX (PD1), softverski na RX (PD2) i TX (PD3).
[Image: NanoPinOut.png?ssl=1]
Jel napajnje za Arduino koristis externo ili ih napajs preko USB-a i na PC?
Preko USB-a koristim kao i uvijek, nisam imao sličnih problema, probaću i preko eksternog...
Makso,

problem moze da bude kada spajas dva arudina preko hardverskog uart-a, a napajas ga preko USB-a. I inace moze da bude problem. Ove plocice nisu predvidjene da koriste hardverske uart-e za komunikaciju sa nekim drugim uredjajima. Razlog je sledeci. Tvoj RX pin je ulazni pin u MCU na koji je povezan TX pin od USB kontrolera. Ako je uredjaj napojen preko USB-a, onda se u neaktivnom stanju na izlazu iz USB kontrolera nalazi logicka 1. Ako jos povezes i drugi uredjaj (TX pin drugog uredjaja) na ovaj RX pin, onda moze da dodje do pregorevanja, jer si kratkospojio dva izlaza (TX izlaz iz USB kontrolera i TX izlaz od drugog uredjaja). Ako jedan od ova dva uredjaja krene da salje podatke, prvo ide start bit koji je definisan logickom nulom, pitanje je sta ce stvarno biti na toj liniji, posto jedan pin drzi logicku 1, a drugi logicku 0. To je kratak spoj od VCC ka GND i pitanje je sta se tu stvarno desava.
UART se koristi samo za vezu izmedju dva uredjaja, tj. TX pin jednog ide na RX pin drugog i obrnuto. Kada bi postojalo stanje visoke impedanse na USB kontroleru, stvar bi bila drugacija i moglo bi da se radi normalno. Projektanti arduina ocigledno nisu razmisljali kako treba. Trebali su da stave tri-state bafere na UART linijama i da omoguce da MCU kontrolise te drajvere, tj. da iskljucuje drajvere ka USB-u ako se koristi uart za vezu sa drugim uredjajima i obrnuto.
Zbog toga nemas nikakvo kasnjenje kada radis sa softverskim uarto-om, posto su ta dva pina koja koristis slobodna.
Eto Vojin ti objasni sve a ja sam te tri puta pitao za to napajanje. Mozes da ih napajas sa USB-a i da mozda kroz Serial terminal kontrolises sta se desava ali onda prema wifi modulima moras da prisupas preko softverskog uarta preko pinova koje sam izaberes .
Zato su se nekad javljali problemi pri uploadu koda... Izgleda da su oba preživjela.
Sada su oba preko eksternog napajanja, i to razdvojena, svaki ima svoj adapter.
I situacija je ovakva, kašnjenje se prilično smanjilo, vratim oba na hardverski UART bez interrupta, kašnjenje je oko 0.20-0.30s koliko sam uspjeo izmjeriti štopericom, to mi je već puno bolje, ubacim interrapt u kod i kašnjenje se malo poveća (možda na oko 0.50s), smanjim onaj broj sa 3 na 1 u onom debauncu što smo pravili "tastertest > 3" na "tastertest > 1" i kašnjenje se vrati na onih oko 0.20s.
Koji interapt? Nisi mi odgovorio kako znas na kojoj ucestanosti radi mcu? Ko je podesio fuses?
Izbaci te HC module i povezi sa istim kodom ta dva arduina sa hardverskim uartom RX1->TX2 , TX1->RX2 pa onda probaj to "kasnjenje" na taj nacin ces znati jel greska u kodu ili je do sporosti wifi modula...
(01-22-2018, 03:19 PM)YuMERA Wrote: [ -> ]Izbaci te HC module i povezi sa istim kodom ta dva arduina sa hardverskim uartom RX1->TX2 , TX1->RX2 pa onda probaj to "kasnjenje" na taj nacin ces znati jel greska u kodu ili je do sporosti wifi modula...

Nisam pricao direktno. Nesto mora i projektant da uradi sam.
@YuMERA to silo. Lepo si sve rekao. Svaka cast.
Tvoj interapt :
Code:
ISR(TIMER1_OVF_vect) // interrupt service routine that wraps a user defined function supplied by attachInterrupt
  {
     TCNT1 = 62437; // preload timer
     if(digitalRead(8) == HIGH){
      //digitalWrite(LED, HIGH);
      taster1test++;
      if(taster1test > 3){
       mySerial.println(1111); //poruka koja se šalje kao komanda
      }
     }
     else{
      taster1test = 0;
      mySerial.println(0000);
     }

     if(digitalRead(9) == HIGH){
      //digitalWrite(LED, HIGH);
      taster2test++;
      if(taster2test > 3){
       mySerial.println(2222); //poruka koja se šalje kao komanda
      }
     }
     else{
      taster2test = 0;
      mySerial.println(3333);
     }

  }

void loop() {

}
A taj interapt koji si dao u nekim od gornjih postova je dobro setovan ali koliko vidim onako na brzaka nisi ga dobro ispostovao jer ti ne zaustavljas interapte dok se ne izvrsi postojeci koji se vec desio. Sto znaci dok tvoj kod ispita tastere i pocme da salje komandu desi se novi interapt i onda Jovo nanovo. A koliko vidim ti u u toj ISR rutini radis proveru da li je taster pritisnut i onda radis debounce  (proveravas da li je digitalRead == HIGH i to tri puta zaredom) i jos saljes podatke serijskom komunikacijom.

U toj ISR trebo bi samo da ispitas dali je neki od tastera pritisnut i po meni onda ti mozda i ne treba debounce jel ako je ISR rutina "uhvatila" da je negde na digitalRead HIGH onda ne moram da proveravam da li je to "cvrsto" HIGH (debounce) jednostavno neko je "pipnuo" taster i ide komanda...

Jedino ako imas "drzanje" tastera radi continuiteta slanja komandi onda mora debounce...

Evo za ovaj tvoj interupt uradi ovako :
Code:
ISR(TIMER1_OVF_vect) // interrupt service routine that wraps a user defined function supplied by attachInterrupt
   {
    
noInterrupts(); // disable all interrupts

      TCNT1 = 62437; // preload timer
      if(digitalRead(8) == HIGH){
       //digitalWrite(LED, HIGH);
       taster1test++;
       if(taster1test > 3){
        mySerial.println(1111); //poruka koja se šalje kao komanda
       }
      }
      else{
       taster1test = 0;
       mySerial.println(0000);
      }

      if(digitalRead(9) == HIGH){
       //digitalWrite(LED, HIGH);
       taster2test++;
       if(taster2test > 3){
        mySerial.println(2222); //poruka koja se šalje kao komanda
       }
      }
      else{
       taster2test = 0;
       mySerial.println(3333);
      }

interrupts(); // enable all interrupts

   }

void loop() {

}
Slanje podataka mora van prekidne rutine. U toj rutini se samo ispituje stanje tastera u tačno određenim vremenskim intervalima. Sve ostalo mora napolje.
(01-22-2018, 04:00 PM)gorankg Wrote: [ -> ]Slanje podataka mora van prekidne rutine. U toj rutini se samo ispituje stanje tastera u tačno određenim vremenskim intervalima. Sve ostalo mora napolje.

To sto kazes je tacno. Maksa ima problem da mu na prijemnoj strani dolazi do kasnjenja prijema podatka. Nema veze sa interaptom.
Tek treba da mu objasnim optimizaciju pisanja koda i uvodjenje flagova.
Da se i ja javim, nisam htjeo ništa odgovarati dok nisam sve varijacije isprobao.
Povežem onako kako je @YuMERA objasnio, izbacim HC module i preko hardverskog UART-a i neće nikako, softverski UART hoće ali i on je nešto počeo kasniti i divljati, pobrka poruke, izgleda da sam ih opalio po ušima preko USB-a.
Uzmem druga dva Arduina koja nisam tu koristio i povežem preko hardverskog UART-a i neće opet dok nisam povezao GND napajanja zajedno i onda radi, imam neko neznatno kašnjenje.
Samo se sada pojavio neki čudan problem, HC moduli neće da rade preko hardverskog UART-a, dovoljno je da na jednom bude hardverski a na drugom softverski i onda radi bez kašnjenja. Sada mi više ništa nije jasno...
Makso, ja ne znam sta ti nije jasno, osim da ti opet kazem. Ta igracka nije namenjena za to sto hoces. U posto broj 107, sam ti detaljno objasnio kako sve to radi. Ako ti i to nije jasno, onda kupi knjigu iz digitalne i impulsne elektronike i listaj i upijaj. Trece nema.
Uporno ignorises sve savete i silujes tu plocicu da proradi. Elektronika je egzaktna nauka i nema kod nje onako. Mozda hoce, mozda nece. Sve je povezano i opisano.
HC-12.pdf

Evo Makso da bi koristio takav uredjaj (ja moram priznati da taj HC12 nisam do sad koristio) moras procitati i upoznati se sa pratecom tehnickom dokumentacijom.
Brzim pregledom ugledao sam nekoliko stvari koje mogu da ti prave problem.

- pise da napajanje mora da bude min 200mA sto znaci zaboravi napajanje sa arduina i da to napajanje ima u seriju jednu diodu 1N4007 sa kojom bi mu Vcc sveo na cca 4.5V koje mu navodno najbolje odgovara.
- uz napajanje tereba staviti jedan elektrolit od 22uF do 1000uF kao
- da na Input data i Out data stavis jeda otpor od 1K. O tom otporu je vise puta pisano da valja da se stavi na digitalne ulazno izlazne pinove kako bi "peglao" signal od raznorazni smetnji...
- taj HC-12 Modul ima i SET pin koji odredjuje command mode i tu mu se moze setovati razni modovi izmedju ostalog i zbog ustede struje a na konto toga slanje jednog bajta moze da traje i do 500mS (neki FU3 mode) ali tada navodno ima potrosnju od 80uA.

Procitao sam na brzinu sve to tako da mozda neke stvari i nisu bas pravilno shvacene sa moje strane.


evo slika povezivanja

[Image: Hughes_HC12_diagram1.jpg]

a evo i ovaj link gde je sve lepo objasnjeno a imas i  jednostavnih primera pa prvo probaj sa njima a onda ako radi modifikuj i experimentisi sa tvojim potrebama...
LINK
Nije mi jasno zato što je prije to sve radilo, ali nema veze.
Probaću srediti prvo kod pa to sve testirati preko softverskog UART-a, a primjetio sam da me i kod dosta zeza.
Hvala na savjetima.

EDIT
@YuMERA
Za SET znam, jer sam ja prethodno podesio oba modula na druga podešavanja jer sam ih testirao napolju zbog dometa i tako samo ostavio, nisam ih vratio na default, jer mi je tada bilo sve zadovoljavajuće i brzina i domet. Mogu provjeriti na kojim je podešavanjima.
Dodaću sutra diodu, kondenzator i otpore pa da vidim šta će se desiti, ali prvo moram kod srediti.
Pogledao sam kako sam podesio modul, evo podešavanja:
1. Baud 9600
2. Communication channel 050
3. Transmitting power +11dBm
4. Transparent transmission FU3 (16mA potrošnja, slanje jednog bajta 4-80mS)
ostala podešavanja su po default-u.

A ova je verzija modula kod mene: [attachment=25722].
Pages: 1 2 3 4 5 6 7 8 9