Arduino -ketju (kysymykset/keskustelu)

ChatCPT: vertaile IR, RF, 433 mhz, LoRa, Wifi ja mitä niitä nyt on. Hinta, käyttö, virrankulutus, kantama, kaista jne.

Tässä on vertailu eri langattomien teknologioiden, kuten IR, RF, 433 MHz, LoRa ja WiFi, keskeisistä ominaisuuksista:

1.

  • Käyttö: Lyhyen matkan tiedonsiirto (esim. kaukosäätimet)
  • Kantama: Tyypillisesti alle 10 metriä
  • Virrankulutus: Matala, mutta riippuu sovelluksesta
  • Kaista: Ei erityistä kaistaa, toimii tietyllä aallonpituudella
  • Hinta: Halpa, komponentit ovat edullisia

2.

  • Käyttö: Yleisluonteinen langaton viestintä
  • Kantama: Voi vaihdella satoja metrejä useisiin kilometreihin
  • Virrankulutus: Voi olla matala tai korkea, riippuen käytetystä protokollasta
  • Kaista: Voi käyttää eri taajuuksia (esim. 433 MHz, 868 MHz)
  • Hinta: Edullinen, riippuu laitteista ja moduuleista

3.

  • Käyttö: Yleisesti käytetty IoT-sovelluksissa (esim. sääasemissa, etäohjauksissa)
  • Kantama: 100-500 metriä avoimessa tilassa
  • Virrankulutus: Matala, erityisesti tietyissä protokollissa
  • Kaista: Käyttää 433 MHz taajuutta
  • Hinta: Edullinen, laajat valikoimat saatavilla

4.

  • Käyttö: IoT-sovellukset, joissa tarvitaan pitkän kantaman ja matalan virrankulutuksen yhdistelmää
  • Kantama: Useita kilometrejä (korkealla), jopa 15 km
  • Virrankulutus: Erittäin matala
  • Kaista: Käyttää sub-GHz taajuuksia (esim. 868 MHz, 915 MHz)
  • Hinta: Kohtuullinen, mutta verkko-infrastruktuuri voi lisätä kustannuksia

5.

  • Käyttö: Nopea tiedonsiirto langattomissa verkoissa (esim. internet-yhteydet)
  • Kantama: 30-100 metriä riippuen ympäristöstä
  • Virrankulutus: Suurempi verrattuna muihin vaihtoehtoihin
  • Kaista: Useita kaistoja (2.4 GHz, 5 GHz)
  • Hinta: Kohtuullinen, mutta laitteet voivat olla kalliita

Yhteenveto

  • IR: Hyvä lyhyille etäisyyksille, alhainen hinta ja virrankulutus.
  • RF: Monipuolinen, käytännöllinen vaihtoehto vaihteleviin sovelluksiin.
  • 433 MHz: Hyvä vaihtoehto IoT-sovelluksille, alhainen virrankulutus.
  • LoRa: Paras valinta pitkille etäisyyksille ja matalalle virrankulutukselle.
  • WiFi: Nopea ja tehokas, mutta kuluttaa enemmän virtaa.
Valinta riippuu siis käyttötarkoituksesta, tarvittavasta kantamasta ja virrankulutuksesta.
 
Nyt loppui omat ideat...

Tarkoitus on mitata 2 jännitettä (= 2 12V akustoa), näyttää arvot ruudulla ja lähettää palvelimelle tietyin väliajoin.
Ensimmäinen versio on tehty esp32-s2 mutta siellä missä se on wifi- yhteys modeemiin (joku huawei) katkeaa aina välillä eikä sen palautukseen ole löytynyt oikein järkevää mallia. Yksi versio koodista käynnistää esp:n uudelleen jos yhteyttä verkkoon ei saada tietyn ajan/yritysmäärän sisällä. Ei auttanut, aina välillä jää vaan verkkovirhe tilaan.
Kotona kaikki toimii tietysti mutta virallisessa asennuspaikassa (ei valtakunnan sähköverkkoa, ei lämmitetty tila) tuo päätyy aina välillä tilaan jossa mittaukset ei lähde ulos ja sitten pitää ajaa paikan päälle.
Saattaa olla että liittyy modeemin säänkestoonkin. Kaapelilla yhdistetty sääasema ei pätki mutta tuo mittari ja esp32-cam pätkivät välillä. Välillä on mennyt muutama kuukausi ongelmitta, välillä niitä tulee päivittäin.

Laatikossa on jo kauan pyörinyt pari enc28j60 eth- korttia, sellaistahan voisi käyttää tuossa mainiosti ja vaihtaa esp -> avr koska koodi mahtuu hyvin. kamera sitten erikseen mietintään jos mittarin saisi ensin toimimaan.
Ensimmäinen testiversio uno- kortilla koska se oli lähin ;)
Toimii kuten pitääkin.
Koska uno on kaamean kokoinen ja muutenkin hankalan mallinen niin viralliseksi versioksi olisi laatikossa a-star 328pb micro.
Mutta sama kytkentä jossa korvataan uno tuolla toisella ei toimikaan, muuten kyllä mutta verkko ei toimi, ihan kuin noissa olisi erilainen spi tai jotain.
Molemmat versiot testattu tasan samalla kytkennällä virransyötön ja johtojenkin osalta, unon kanssa vaan ylimääräiset piikkiriman pätkät koska erilaiset liittimet.

Piti taas käyttää laatikosta löytyneitä osia mutta eipä sitten onnistunutkaan.
Ja uno ei taida edes mahtua jo valmiina olevaan koteloon, ainakaan näytön alle kuten nuo pienemmät.
 
1734704584857.png

Yritän tehdä siniaaltoa mahdollisimman alkeellisesti käyttäen ainoastaan komentoja analogwrite ja delay.
Näyttää hidastettuna silmämääräisesti toimivan, mutta en saanut yleismittarilla taajuutta varmistettua, kun näyttää PWM-signaalin taajuutta kiloherzeinä. Tämän takia lisäsin ohjelmaan nastan 13 komennolla digitalWrite, jonka ajetaan päälle ohjelman alussa, ja puolessa välissä ohjelmaa pois.

Miksi tuo digitalWrite ei kuitenkaan toimi? Nastan 13 led välkkyy kiloherzeillä yhtenään ja jos aktivoin alla olevan 1000ms delayn, ledi palaa silti jatkuvasti, mutta siniaallon kiertoon tulee tuo 1000ms viive..
 
1734704584857.png

Yritän tehdä siniaaltoa mahdollisimman alkeellisesti käyttäen ainoastaan komentoja analogwrite ja delay.
Näyttää hidastettuna silmämääräisesti toimivan, mutta en saanut yleismittarilla taajuutta varmistettua, kun näyttää PWM-signaalin taajuutta kiloherzeinä. Tämän takia lisäsin ohjelmaan nastan 13 komennolla digitalWrite, jonka ajetaan päälle ohjelman alussa, ja puolessa välissä ohjelmaa pois.

Miksi tuo digitalWrite ei kuitenkaan toimi? Nastan 13 led välkkyy kiloherzeillä yhtenään ja jos aktivoin alla olevan 1000ms delayn, ledi palaa silti jatkuvasti, mutta siniaallon kiertoon tulee tuo 1000ms viive..
Ledi näyttää palavan jatkuvasti. Tuolla koodilla vedät sen ledin päälle ennen delaytä. Eli se ledi odottaa päällä ollen 1000ms. Ja siten sammuu kun koodissasi pääset siihen kohtaan, mutta tämä on niin nopea, ettei silmällä sitä näe, ja sitten ohjelma pyörähtää jo ympäri ja ledi on taas päällä. Jolloin vaikuttaa olevan jatkuvasti päällä.

En tiedä mitä haluat tuolla ledillä saavuttaa, mutta jos käännät tuon toiminnan ympäri, eli ohjelman alussa sammutetaan ja keskellä koodia laitetaan päälle, niin silloin led on tuon 1000ms ajan pois päältä, jos viive otetaan käyttöön.
 
Ledi näyttää palavan jatkuvasti. Tuolla koodilla vedät sen ledin päälle ennen delaytä. Eli se ledi odottaa päällä ollen 1000ms. Ja siten sammuu kun koodissasi pääset siihen kohtaan, mutta tämä on niin nopea, ettei silmällä sitä näe, ja sitten ohjelma pyörähtää jo ympäri ja ledi on taas päällä. Jolloin vaikuttaa olevan jatkuvasti päällä.

En tiedä mitä haluat tuolla ledillä saavuttaa, mutta jos käännät tuon toiminnan ympäri, eli ohjelman alussa sammutetaan ja keskellä koodia laitetaan päälle, niin silloin led on tuon 1000ms ajan pois päältä, jos viive otetaan käyttöön.
Kitti! Laiton toisen 1000 ms delayn ohjelmaan ja sain nastan 13 vilkkumaan. Mutta kun otan molemmat 1000ms delayt pois käytöstä, saan 1290Hz ohjelmakierroksi.

Ohjelmassani on 72 kertaa delay(0.2778); Kuvittelisin ohjelmakierron olevan silloin 20ms, eli 50Hz, mutta yleismittari näyttää 1290Hz
 
Viimeksi muokattu:
Kitti! Laiton toisen 1000 ms delayn ohjelmaan ja sain nastan 13 vilkkumaan. Mutta kun otan molemmat 1000ms delayt pois käytöstä, saan 1290Hz ohjelmakierroksi.

Ohjelmassani on 72 kertaa delay(0.2778); Kuvittelisin ohjelmakierron olevan silloin 20ms, eli 50Hz, mutta yleismittari näyttää 1290Hz

delay (kuten ei analogWrite) ei tajua mitään muuta kuin kokonaislukuja, kääntäjä puolestasi pyöristää nuo nollaksi ja delay toiminto sitten tekee mitä tekee. Ja pitää ottaa huomioon että analogWrite:n kutsuminen myös kestää jonkun aikaa, joka täytyy kompensoida delayssa.

Jos tuolla tekniikalla haluaa tehdä, niin delayn sijaan voisi käyttää ihan for loopissa kutsua __asm__("nop"); ja sitten hienosäätää loopin pituus tuottamaan haluttu tulos. (nop - no operation, mutta tuhlaa silti ainakin yhden kellojakson).

Parasta tietysti olisi virittää keskeytysrutiini halutulla taajuudella ja siellä vaan muuttaa ulostuloa taulukon mukaisesti. Samalla voi vielä hienosäätää PWM perustaajuuden normaalia kireämmäksi.
 
delay (kuten ei analogWrite) ei tajua mitään muuta kuin kokonaislukuja, kääntäjä puolestasi pyöristää nuo nollaksi ja delay toiminto sitten tekee mitä tekee. Ja pitää ottaa huomioon että analogWrite:n kutsuminen myös kestää jonkun aikaa, joka täytyy kompensoida delayssa.

Jos tuolla tekniikalla haluaa tehdä, niin delayn sijaan voisi käyttää ihan for loopissa kutsua __asm__("nop"); ja sitten hienosäätää loopin pituus tuottamaan haluttu tulos. (nop - no operation, mutta tuhlaa silti ainakin yhden kellojakson).

Parasta tietysti olisi virittää keskeytysrutiini halutulla taajuudella ja siellä vaan muuttaa ulostuloa taulukon mukaisesti. Samalla voi vielä hienosäätää PWM perustaajuuden normaalia kireämmäksi.

Tuo selittää. Oikeastaan ei ole mitään tiettyä tekniikkaa miten pitäisi rakentaa, vaan harjoitella ohjelmoinnin perusteita. Jos olisin saanut tuon toimimaan, niin olisin kysellyt, millä komennolla korvata delayt niin, että potikasta jännitejakoa ohjaamalla muuttuu taajuus.

Jos tuohon on ehdottaa jotain koodinpätkää, mistä täys aloittelija voi yrittää jotain jalostaa, niin otan vastaan. Muuten palaan Googlen mailmaan etsimään uutta tekniikkaa.
 
Tuo selittää. Oikeastaan ei ole mitään tiettyä tekniikkaa miten pitäisi rakentaa, vaan harjoitella ohjelmoinnin perusteita. Jos olisin saanut tuon toimimaan, niin olisin kysellyt, millä komennolla korvata delayt niin, että potikasta jännitejakoa ohjaamalla muuttuu taajuus.

Jos tuohon on ehdottaa jotain koodinpätkää, mistä täys aloittelija voi yrittää jotain jalostaa, niin otan vastaan. Muuten palaan Googlen mailmaan etsimään uutta tekniikkaa.

Koodi:
void nopDelay() {
  unsigned int potVal = analogRead(A1);  // palauttaa 0..1023 potikan arvon perusteella
  const unsigned int factor = 64;

  for (unsigned int i = 0; i < factor*potVal; i++)
    __asm__("nop");
}

ja koodista korvaat delay-kutsut vaan nopDelay() kutsuilla.

Tässä pitää muistaa että unsigned int on arduinossa 16bit, eli maksimi arvo on 65535. Jos haluaa hidastaa tästä niin sitten manuaalisesti noppeja lisää loopin sisään.
 

Statistiikka

Viestiketjuista
262 191
Viestejä
4 547 525
Jäsenet
74 943
Uusin jäsen
jesse86

Hinta.fi

Back
Ylös Bottom