Arduino - projekti, ideje, savjeti, problemi izdvojena tema

poruka: 1.365
|
čitano: 420.977
|
moderatori: DrNasty, pirat, XXX-Man, Lazarus Long, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
Ova tema je sadržajno povezana sa sljedećim temama: Uvod u elektrotehniku (istosmjerna struja)
13 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi
RikiTikiTavi kaže...

Pozdrav ekipa!

 

Već neko vrijeme razmišljam o izradi Arduino projekta, te sam nakon što sam se

konačno odvažio na to naletio na jedan problem.

 

Naime, ne znam odakle da kupim original Arduino Uno starter kit. Ne zelim

kupiti Croduino, a Ardunio Uno kit u Chipoteci je 40% skuplji nego original verzija

koju službena stranica ne isporučuje u Hrvatsku.

 

Konkretno pitanje bi glasilo odakle vi nabavljate vaše Arudino pločicice i ostale

komponente?

Na ebayu sam vidio mnogo jeftinijih Arduino setova(cca 30€), ima li tko kakvog

iskustva s istima? Jesu li skloni kvarenju, kakva im je kvaliteta općenito?

 

 

 

 

Kupuj dio po dio s eBaya, jeftinije ćeš proći.

15 godina
neaktivan
offline
Arduino - projekti, ideje, savjeti, problemi

Sa senzorima s ebaya/aliexpressa nisam jos imao problema, a arduino tu i tamo koji treba novi bootloader(1/10) tako da naruci 2-3 arduina(jeftini su) i po 1 senzor

 

A i neces morati cekati dugo kad prvi pusti magic smoke 

Inace jos mi nije ni 1 krepao, a da nije moja greska. (ovi stariji imaju vec i vise od 5 god)

 

Moj PC  
0 0 hvala 0
13 godina
odjavljen
offline
Arduino - projekti, ideje, savjeti, problemi

De mi recite šta je taj bootloader? Imam još 4% ROMa a falilo bi mi još koji kB više(znam da dva kB odlazi na bootloader).

Htio bi ga pregazit, al ne znam što će biti s Arduinom onda, kako će se palit i to? Dal će USB valjat itd...

I kako se to gaženjem bootloadera radi?

 

mbaksa 

 
0 0 hvala 0
16 godina
moderator
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Mislim da sam to već jednom negdje objašnjavao... Bootloader je programčić koji nakon uključenja mikrokontrolera čeka kratko vrijeme (ne znam koliko točno - možda nekoliko stotina milisekundi) na signal preko Seriala ili USB-a za programiranje mikrokontrolerskog čipa. Ako primi signal, onda kreće u proces reprogramiranja mikrokontrolerskog čipa. Ako ne primi signal, mikrokontroler dalje nastavlja izvođenje tvog programa.

 

[ BL ][ korisnički program ................................................ ]

 

Bootloader si možeš zamisliti nešto kao boot manager na PC-u s Windowsima. Nije baš isto, ali možda tako lakše shvatiš o čem se radi.

 

 

Bootloadera se možeš riješiti tako da mikrokontrolerski čip programiraš direktno, recimo preko SPI sabirnice pomoću Arduino as ISP metode. Kad tako reprogramiraš mikrokontrolerski čip, na njemu se nalazi samo tvoj program pa onda imaš ovaku situaciju:

 

[ korisnički program ................................................ ]

 

Naravno, ako se bootloadera riješiš, nema više programiranja preko USB-a/Seriala, nego i dalje moraš to raditi metodom Arduino as ISP. Naravno, tom metodom možeš ponovno staviti i Arduinov bootloader pa time vratiš stvar u prijašnje stanje.

 

 

Ako imaš premalo ROM-a (tj. EEPROM-a), imaš više opcija:

  • optimizacija programa (npr. iz koda kojeg više puta koristiš napraviti funkcije)
  • korištenje vanjskog EEPROM-a iz kojeg ćeš ručno učitavati podatke po potrebi (rtc ti ima 32 kB EEPROM-a u obliku čipa AT24C32)
  • korištenje drugog mikrokontrolera
13 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi
Imam DS3231 s EEPROMom, al kako bi to povezao? 🤔
13 godina
offline
Re: Arduino - projekti, ideje, savjeti, problemi
mbaksa kaže...

Ako imaš premalo ROM-a (tj. EEPROM-a), imaš više opcija:

  • optimizacija programa (npr. iz koda kojeg više puta koristiš napraviti funkcije)
  • korištenje vanjskog EEPROM-a iz kojeg ćeš ručno učitavati podatke po potrebi (rtc ti ima 32 kB EEPROM-a u obliku čipa AT24C32)
  • korištenje drugog mikrokontrolera

 

24C32 ima 4 kilobajta EEPROM-a, a ne 32

 

 

16 godina
moderator
offline
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...
Imam DS3231 s EEPROMom, al kako bi to povezao? 🤔

Već ti je povezano. To je I2C EEPROM. Ne znam doduše čemu služe 32K i SQW pinovi.

 

Jameson kaže...
mbaksa kaže...

 

  • korištenje vanjskog EEPROM-a iz kojeg ćeš ručno učitavati podatke po potrebi (rtc ti ima 32 kB EEPROM-a u obliku čipa AT24C32)

 

24C32 ima 4 kilobajta EEPROM-a, a ne 32

Istina, ima 32 kb (kilobita) EEPROMA, dakle 4 kilobajta. A eto... Onda je manje koristan nego što sam očekivao.

 

Ima doduše za kupiti i kapacitetnije EEPROM čipove...

13 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Zato sam i pitao jer i ja ne kužim čemu ta dva pina, al dobro :D

Nego, zar EEPROM nije za pohranivanje podataka(postavki nečega recimo) a ne za pohranivanje programa?

Imam još 1238 bajtova za iskoristiti, a trebao bi napraviti novi dizajn ekrana(nešto u smislu zadaš si kilometražu, i onda ti on računa koliko ti treba vremena do "destinacije" i koliko je vremena potrebno da stigneš do kraja.

 

16 godina
moderator
offline
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...

Nego, zar EEPROM nije za pohranivanje podataka(postavki nečega recimo) a ne za pohranivanje programa?

Nisam ni rekao da je za pohranjivanje programa. Program smanjuješ optimizacijom (petljama, funkcijama) te seljenjem podataka u EEPROM, koje potom iz EEPROM-a učitavaš po potrebi.

15 godina
neaktivan
offline
Arduino - projekti, ideje, savjeti, problemi

Da probas atmega 644?

Moj PC  
1 0 hvala 1
13 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi
CroNk3r kaže...

Da probas atmega 644?

 

Jel to meni ili?

15 godina
neaktivan
offline
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...
CroNk3r kaže...

Da probas atmega 644?

 

Jel to meni ili?

Da, jaci MCU koji je isto kompatibilan s arduino softwareom. Jedino sto neznam dal postoje vec gotove plocice s tim chipom.

Ako nista drugo naci arduino mega u kompaktnoj verziji.

16 godina
moderator
offline
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...
CroNk3r kaže...

Da probas atmega 644?

 

Jel to meni ili?

 

13 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi
CroNk3r kaže...
Dex.pwn kaže...
CroNk3r kaže...

Da probas atmega 644?

 

Jel to meni ili?

Da, jaci MCU koji je isto kompatibilan s arduino softwareom. Jedino sto neznam dal postoje vec gotove plocice s tim chipom.

Ako nista drugo naci arduino mega u kompaktnoj verziji.

 

Nema pločica koja ima taj MCU a da je veličine kao Nano.

Treba mi pločica takve veličine.

16 godina
moderator
offline
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...
Nema pločica koja ima taj MCU a da je veličine kao Nano.

Treba mi pločica takve veličine.

Uvijek si možeš jednostavno uzeti takav čip, upariti ga s oscilatorom i par kondenzatora i to je to. 

 

S tim da mi se nekako čini da je kompatibilnost tog čipa s Arduinom upitna, tj. morat ćeš se mučiti sa starim bibliotekama, možda i sa starim IDE-om. Gledano iz te perspektive, možda ti je onda bolje ići na ATmega2560. Ili dodatni jednostavno još jedan 328p ili 32u4, bila kao pločicu, bilo individualni čip, pa ih povezati serijskom vezom (da svaki od njih bude zaslužan za dio).

 

No, teško mi se oteti dojmu da je problem zapravo u neoptimiziranom kodu (ponavljanju dijelova koda, brojnim switchevima s istim ili sličnim kodom...) i da bi se problem mogao riješiti čisto programski, umjesto prelaska na jači hardver.

13 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Zašto tako misliš kad nisi ni vidio kod?

15 godina
neaktivan
offline
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...

Zašto tako misliš kad nisi ni vidio kod?

Jer je upoznat s tvojim navikama u kodiranju 

13 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi
CroNk3r kaže...
Dex.pwn kaže...

Zašto tako misliš kad nisi ni vidio kod?

Jer je upoznat s tvojim navikama u kodiranju 

 

_? Hhahahaa

Riješio sam se toga, napisao potpuno novi kod od nule, 2k linija.

Al mislim da je ekran taj(tj GFX od Adafruita) koji jede dosta.

16 godina
moderator
offline
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...
CroNk3r kaže...
Dex.pwn kaže...

Zašto tako misliš kad nisi ni vidio kod?

Jer je upoznat s tvojim navikama u kodiranju 

 

_? Hhahahaa

Riješio sam se toga, napisao potpuno novi kod od nule, 2k linija.

Puno je to linija za program tog kalibra. 

 

Dex.pwn kaže...
Al mislim da je ekran taj(tj GFX od Adafruita) koji jede dosta.

Uvijek možeš prijeći na u8g-kaksevećzove biblioteku.

13 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi
mbaksa kaže...
Dex.pwn kaže...
CroNk3r kaže...
Dex.pwn kaže...

Zašto tako misliš kad nisi ni vidio kod?

Jer je upoznat s tvojim navikama u kodiranju 

 

_? Hhahahaa

Riješio sam se toga, napisao potpuno novi kod od nule, 2k linija.

Puno je to linija za program tog kalibra. 

 

Dex.pwn kaže...
Al mislim da je ekran taj(tj GFX od Adafruita) koji jede dosta.

Uvijek možeš prijeći na u8g-kaksevećzove biblioteku.

 

 

Meh, šta sve ima od opcija.

I statistika za praćenje, i tahometar, i brzinomjer, i sat, datum, termometar(DS3231), ne može bit manje.

152 linije odlaze na makro definicije.

S tim da ja pišem kod u stilu

 

funkcija()

{

   // ...

}

 

a ne

 

funkcija () {

   // ...

}

 

ili još gore

 

funkcija() {

   // ... }

 

Također i odvajam "dijelove" koda s praznom linijom

Primjer -> https://pastebin.com/Thqqp6Rr

 

Tako da se nakupi linija, a ima i dosta komentara(zaboravljam brzo )

16 godina
moderator
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Kažeš:

 

  1.    screenCleanInfo();  

  2.    display.setCursor(SCR_INFO_X, SCR_INFO_Y);

  3.    display.setTextSize(SCR_INFO_SIZE);

  4.    display.print(F("AVG DIST"));

  5.    display.setCursor(SCR_INFO_X, SCR_INFO_Y2);

 

Pretpostavljam da imaš više screenova, ne? I da za svaki od njih pozivaš sve ove naredbe, samo što ispisuješ drugi tekst umjesto ovog AVG_DIST, zar ne?

13 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi
mbaksa kaže...

Kažeš:

 

  1.    screenCleanInfo();  

  2.    display.setCursor(SCR_INFO_X, SCR_INFO_Y);

  3.    display.setTextSize(SCR_INFO_SIZE);

  4.    display.print(F("AVG DIST"));

  5.    display.setCursor(SCR_INFO_X, SCR_INFO_Y2);

 

Pretpostavljam da imaš više screenova, ne? I da za svaki od njih pozivaš sve ove naredbe, samo što ispisuješ drugi tekst umjesto ovog AVG_DIST, zar ne?

 

Uvijek može bolje haha

Hvala

Znam da imaju neke sitnice koje se mogu manje napisat.

 

 

Da, imao si pravo.

S 96 na 90 posto ROMa.

Uradio sam tvoj prijedlog i još nešto što sam vidio(na istu foru, ispisivanje određenog broja nula ispred konačnog broja).

 

 

Sketch uses 29,482 bytes (96.0%) of program storage space. Maximum is 30,720 bytes.
Global variables use 1,564 bytes (76.4%) of dynamic memory, leaving 484 bytes for local variables. Maximum is 2,048 bytes.

 

Sketch uses 26,980 bytes (87.8%) of program storage space. Maximum is 30,720 bytes.
Global variables use 1,672 bytes (81.6%) of dynamic memory, leaving 376 bytes for local variables. Maximum is 2,048 bytes.

 

Doduše malo je RAM skočio. Ne može se s jednom guzicom na dvije stolice 

 

 

Poruka je uređivana zadnji put pet 3.11.2017 21:12 (Dex.pwn).
16 godina
moderator
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Vidiš da te poznajem bolje od tebe samoga (kaj se tiče programiranja)? 

 

To ti je ono kad čovjek zna nešto, pa se zanese i misli da zna bogznakaj, a zapravo misli da zna bogznakaj zato jer ne zna koliko toga još ne zna Moraš malo poraditi na slušanju i uvažavanju drugih. Već sam te više sam te puta upozovarao nek ne dvojiš o stvarima koje ti upućeniji govore - zato jer još uvijek nemaš dovoljno znanja za to.

 

Ali lijepo si napredovao. 

 

 

 

###

 

RAM je skočio jer se sad, pozivanjem funkcija, više toga stavlja na stog (stack) i hrpu (heap). I tu se stvari daju optimizirati, počevši od toga da svi int-ovi koji ne trebaju biti intovi budu byte ili char.

 

Poruka je uređivana zadnji put pet 3.11.2017 21:21 (mbaksa).
13 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Ccccc

Znao sam i sam da se taj program može bolje napisat.

Al iskreno nisam znao da će se toliko uštedit.

Nego imam problem, funkcija ispod služi za ispisivanje teksta(to je ono što si ti rekao da uradim).

Umjesto teksta dobijem neki znak čudan

 

void screenInfoSetup(const char text)
{
    display.setCursor(SCR_INFO_X, SCR_INFO_Y);
    display.setTextSize(SCR_INFO_SIZE);
    display.print(text);
    display.setCursor(SCR_INFO_X, SCR_INFO_Y2);
}

 

 

Pretpostavljam da moram u string prebacit.

Da, al onda ROM naraste na 93.5 posto.

Imadel koji bolji način?

Poruka je uređivana zadnji put pet 3.11.2017 21:21 (Dex.pwn).
16 godina
moderator
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Probaj s:

screenInfoSetup(char* text)

13 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi
mbaksa kaže...

 

 

RAM je skočio jer se sad, pozivanjem funkcija, više toga stavlja na stog (stack) i hrpu (heap). I tu se stvari daju optimizirati, počevši od toga da svi int-ovi koji ne trebaju biti intovi budu byte ili char.

 

 

To je već i urađeno.

Čak neke varijable koristim za više stvari.

Npr varijablu X(bubam ime) koristim za tick(millis) žmiganja žmigavca. Istu tu varijablu koristim u podešavanjima "sustava" kao stavku koja mi govori status neke opcije

Da, napravio sam i settings stranicu u kojoj imaju neke postavke da podesit.

13 godina
odjavljen
offline
Re: Arduino - projekti, ideje, savjeti, problemi
mbaksa kaže...

Probaj s:

screenInfoSetup(char* text)

 

 

Ne znam zašto, ali radi haha

16 godina
moderator
offline
Re: Arduino - projekti, ideje, savjeti, problemi
Dex.pwn kaže...
mbaksa kaže...

Probaj s:

screenInfoSetup(char* text)

Ne znam zašto, ali radi haha

Kad naučiš što su pokazivači i c-stringovi, znat ćeš zašto. 

 

 

Radi ako šalješ c-string (znači, niz znakova), ali ne radi ako koristiš F("neki string"). Ako tu misliš koristiti F("neki string") onda ćeš morati to riješiti na drugi način. Ak ćeš se ići zafrkavati s tim, prouči ovo.

13 godina
odjavljen
offline
Arduino - projekti, ideje, savjeti, problemi

Riješeno.

Poruka je uređivana zadnji put uto 12.1.2021 20:27 (Dex.pwn).
 
3 0 hvala 0
16 godina
moderator
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Lijepo.

 

Nekoliko stvari mi bode oči - ispred svakog screenInfoSetup imaš naredbu screenCleanInfo. A žalio si se na manjak prostora u EEPROM-u... Pa bi onda logično bilo da obrišeš sve te screenCleanInfo i ubaciš na početak screenInfoSetup.

 

Isto tako ove usporedbe s true i false, npr.:

if (brake == true)

 

To nema smisla, jer je to onda u osnovi dvostruka usporedba - jer prvo varijablu brake uspoređuješ s true, i onda još naredba if gleda je li rezultat te usporedbe true. Umjesto toga ide:

if (brake)

 

Ako je u pitanju negativno, onda ne ide:

if (targetScreen == false)

 

nego ide:

if (!targetScreen)

 

 

Od ovoga ne znam koliko bi bilo koristi, ali moglo bi biti. Znači imaš:

display.print(F("      "));

display.setCursor(SCR_INFO_X, SCR_INFO_Y2);

display.print(F("      "));

 

Tu već vidimo da dvaput koristiš istu naredbu s makrom F, što znači da si 12 bajtova EEPROM bezveze potrošio na ovu drugu naredbu (vjerojatno nešto manje, ali kad se svaki bajt računa...).

 

Taj display.print s hrpom razmaka (ili drugih znakova) si mogao ubaciti u posebnu funkciju, tipa:

void repeatSpaces(byte n) {
  for (byte i = 0; i < n; i++) display.print(' ');
}

 

I iskoristiti ne samo za ovo gore, nego i recimo za:

else display.print(F("  "));

 

Ako bi od toga bilo koristi.

 

Ili kad bi ti to trebalo i za neke druge znakove:

void repeatChar(char c, byte n) {
  for (byte i = 0; i < n; i++) display.print(c);
}

 

Tu funkciju si mogao iskoristiti i umjesto:

while (zeros != 0)
{
  display.print(F("0"));
  zeros--;
}

 

staviti:

repeatChar('0', zeros);

 

Pazi i na još jednu stvar u prethodnom kodu - korištenje makroa F za jedan jedini znak je kontraproduktivno. Također, time si onda metodu print filao c-stringom, a na jednim znakom.

 

Kad smo već kod vodećih nula - koliko vidim na ekranu, stavio si ih za brzinu te za prijeđeni put. Zašto? Time si samo smanjio čitljivost! Umjesto vodećih nula, ako želiš da ti te brojke budu poravnate zdesna, staviš "vodeće" razmake!

 

 

Funkcije screenTripA(), screenTripB() i screenTripC(), te screenTripA_Reset(), screenTripB_Reset() i screenTripC_Reset() su ti zaprepašćujuće! Jedina razlika između njih je druga varijabla za udaljenost i ispisano slovo koje označava je li A, B ili C! Žališ se da nemaš dosta EEPROM-a, kad ti velim da je uzrok najvjerojatnije upravo u ovome što si tu pokazao onda se pjeniš kak ja znam kakav si ti kod napisao, a vidi ga sad! Niš čudnoga da si na knap s EEPROM-om s tolko poduplanoga ili potruplanoga kôda! Slične optimizacije možeš napraviti u funkcijama tipa screenTopSpeed, screenAvgSpeed, screenMinSpeed - u svima sav isti kôd, osim teksta i varijable za ispis!

 

 

Ujedno, umjesto varijabli distance, distanceB i distanceC trebao si imati jedno polje distance[3] i onda kroz cijeli kod baratati s indeksom tog polja u ovisnosti o odabranom profilu.

 

 

To je ovak na prvu što sam uočio...  Znači, uz ne previše truda možeš si dosta optmizirati kôd - da ti zauzima manje EEPROM-a i da ti bude pregledniji i kraći. 

Ova tema je sadržajno povezana sa sljedećim temama: Uvod u elektrotehniku (istosmjerna struja)
Nova poruka
E-mail:
Lozinka:
 
vrh stranice