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.
 
Moi, pitäsi saada kaksi Arduinoa rupattelemaan SPI-väylän kautta. Välimatka n. 8 metriä.
Perusjutut Arduinolla kyllä onnistuu kuin myös esimerkkidemojen yhteys Arduinojen välillä toimii, siinä ei mitään.

Luen Master Arduinolla digital- ja analog sisääntuloja, yhteensä ehkä n.20kpl.
Masterissa signaalien hienosäätö ja konvertointi muuttujiksi.
Masterista muuttujat pitäsi sitten siirtää reaaliajassa Slavelle, joka hoitasi arvojen mukaan pwm-,servo-, tms outputit esim. feteille.
Mutta kuinka teen helposti SPI-siirron Arduinojen välillä??
 
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 @dmn esittämä delay() korvaaja on ihan ok. Jos nopeus on tarkkaa ja tarvitsee vain yhden analogitulon niin analogread tilalla kannattaa käyttää itse tehtyä lukua jolloin analogread "turhat" tekemiset jää pois joka käyttökerralla (esim pinnin asetus tuloksi, ehkä adc asetukset, tulon vaihto jne jotka voi tehdä vain kerran alustuksessa).

Tuossa loop-delay mallissa ainoa ongelma on että ei oikeastaan voi tehdä mitään muuta rikkomatta koko ajastusta.

Toinen malli ajastimella vaatii 2 ajastimen käytön, toinen on se joka tuottaa pwm- signaalin ulos (eli analogwrite) ja toisella korvataan delay.
Delay- korvaajalla määrätään taajuus jolla arvoja vaihdetaan ja ajastimelle tehdään keskeytysfunktio (joka siis suoritetaan aina kun ajastimen laskuri menee ympäri). Funktiossa voi ottaa seuraavan asetusarvon vaikka taulukosta ja asettaa sen lähtöön analogwrite avulla. Tässäkin lähdön asetus suoraan ilman analogwrite on nopeampi koska iso osa analogwrite suorituksesta riittää tehdä vain kerran.
loop()- funktioon voi jättää analogread ja sen arvon mukaan delay- korvaaja-laskurin taajuuden määritys ja mahdolliset muut jutut mitä ehkä voisi tehdä (vaikka näyttää asetusarvo näytöllä tms).

Yleensä teen tällaiset ilman kirjastoja mutta se ei välttämättä sovellu aloitteluun.
Ainakin timerone niminen kirjasto on olemassa ja siihen löytyy esimerkkejä.
Aloita vaikka tekemällä ensin timer interrupt jossa vuorotellen laitetaan jokin lähtö ylös/alas, tällä saa kästevästi ulos tietyn taajuuden.
Seuraava askel on lisätä loop:iin analogread + ajastimen ajan asetus jolloin taajuutta voi säätää potikalla.
Esimerkiksi täältä löytyy interrupt- esimerkki ledin vilkutuksella: Arduino TimerOne Library Code Examples [Tutorial] kohdasta "Arduino TimerOne Timer Interrupt Example".

Ja ajastinten kanssa pitää yleensä lukea myös vähän datalehteä koska tietyt pinnit on sidottu tiettyihin toimintoihin. Et kertonut mikä kortti on kyseessä mutta esimerkiksi ne joissa on atmega328P (esim uno) timer0 on pinneissä 5 ja 6. Samassa timerissa on myös millis() toiminnallisuus eli timer0 ei voikaan käyttää kätevästi muuhun.
Kirjasto timerone käyttää nimensä mukaisesti timer1 jonka lähdöt on pinneissä 9 ja 10. Jos timer1 käytetään delay- korvaajana niin noita pinnejä ei voi käyttää analogwrite kanssa (digitalwrite on silti ok). Analogwritelle jää jäljelle timer2 jonka lähdöt ovat 3 ja 11.


Ja kyllä, ajastinten käyttö ei ehkä ole ihan perusteita vaan vaatii jo hieman enemmän.

Ja jos käyttää analogwrite() jännitteen tuottamiseen pitää muistaa että se on oikeasti pwm- lähtö joka vaatii myös hieman ulkoista kytkentää jotta lähtö näyttää jännitteeltä eikä pwm- signaalilta.
Jos käytössä on pelkkä arduinokortti jossa ei ole sisäänrakennettua dac:ia niin ei sen lähdön pitäisikään näyttää siniltä vaan vaihtuvalta pwm- signaalilta.
 
Tuo @dmn esittämä delay() korvaaja on ihan ok. Jos nopeus on tarkkaa ja tarvitsee vain yhden analogitulon niin analogread tilalla kannattaa käyttää itse tehtyä lukua jolloin analogread "turhat" tekemiset jää pois joka käyttökerralla (esim pinnin asetus tuloksi, ehkä adc asetukset, tulon vaihto jne jotka voi tehdä vain kerran alustuksessa).

Tuossa loop-delay mallissa ainoa ongelma on että ei oikeastaan voi tehdä mitään muuta rikkomatta koko ajastusta.

Toinen malli ajastimella vaatii 2 ajastimen käytön, toinen on se joka tuottaa pwm- signaalin ulos (eli analogwrite) ja toisella korvataan delay.
Delay- korvaajalla määrätään taajuus jolla arvoja vaihdetaan ja ajastimelle tehdään keskeytysfunktio (joka siis suoritetaan aina kun ajastimen laskuri menee ympäri). Funktiossa voi ottaa seuraavan asetusarvon vaikka taulukosta ja asettaa sen lähtöön analogwrite avulla. Tässäkin lähdön asetus suoraan ilman analogwrite on nopeampi koska iso osa analogwrite suorituksesta riittää tehdä vain kerran.
loop()- funktioon voi jättää analogread ja sen arvon mukaan delay- korvaaja-laskurin taajuuden määritys ja mahdolliset muut jutut mitä ehkä voisi tehdä (vaikka näyttää asetusarvo näytöllä tms).

Yleensä teen tällaiset ilman kirjastoja mutta se ei välttämättä sovellu aloitteluun.
Ainakin timerone niminen kirjasto on olemassa ja siihen löytyy esimerkkejä.
Aloita vaikka tekemällä ensin timer interrupt jossa vuorotellen laitetaan jokin lähtö ylös/alas, tällä saa kästevästi ulos tietyn taajuuden.
Seuraava askel on lisätä loop:iin analogread + ajastimen ajan asetus jolloin taajuutta voi säätää potikalla.
Esimerkiksi täältä löytyy interrupt- esimerkki ledin vilkutuksella: Arduino TimerOne Library Code Examples [Tutorial] kohdasta "Arduino TimerOne Timer Interrupt Example".

Ja ajastinten kanssa pitää yleensä lukea myös vähän datalehteä koska tietyt pinnit on sidottu tiettyihin toimintoihin. Et kertonut mikä kortti on kyseessä mutta esimerkiksi ne joissa on atmega328P (esim uno) timer0 on pinneissä 5 ja 6. Samassa timerissa on myös millis() toiminnallisuus eli timer0 ei voikaan käyttää kätevästi muuhun.
Kirjasto timerone käyttää nimensä mukaisesti timer1 jonka lähdöt on pinneissä 9 ja 10. Jos timer1 käytetään delay- korvaajana niin noita pinnejä ei voi käyttää analogwrite kanssa (digitalwrite on silti ok). Analogwritelle jää jäljelle timer2 jonka lähdöt ovat 3 ja 11.


Ja kyllä, ajastinten käyttö ei ehkä ole ihan perusteita vaan vaatii jo hieman enemmän.

Ja jos käyttää analogwrite() jännitteen tuottamiseen pitää muistaa että se on oikeasti pwm- lähtö joka vaatii myös hieman ulkoista kytkentää jotta lähtö näyttää jännitteeltä eikä pwm- signaalilta.
Jos käytössä on pelkkä arduinokortti jossa ei ole sisäänrakennettua dac:ia niin ei sen lähdön pitäisikään näyttää siniltä vaan vaihtuvalta pwm- signaalilta.
Kiitos kaikille ohjeista. Yritän välipäivinä perehtyä näihin teidän ohjeisiin ajatuksella toivon saavani jokin luonnoksen aikaan, jonka kanssa voi esittää jatkokysymyksiä...

Alustana on Uno ja tapoihini kuuluu lopuksi siirtää ohjelmoitu prossu täplälevylle. Jos ohjelman tekeminen nyt onnistuu, niin tarkoitus on ajaa PWM H-sillalla pakkamuuntajan läpi ja katsoa sitten mitä aalto näyttää, jos ei suodata tarpeeksi, sitten kokeilemaan konkkia ja ferriittirenkaita, joiden mitoituksesta ei ole mitään tietoa.
 
Tuo @dmn esittämä delay() korvaaja on ihan ok. Jos nopeus on tarkkaa ja tarvitsee vain yhden analogitulon niin analogread tilalla kannattaa käyttää itse tehtyä lukua jolloin analogread "turhat" tekemiset jää pois joka käyttökerralla (esim pinnin asetus tuloksi, ehkä adc asetukset, tulon vaihto jne jotka voi tehdä vain kerran alustuksessa).

Tuossa loop-delay mallissa ainoa ongelma on että ei oikeastaan voi tehdä mitään muuta rikkomatta koko ajastusta.

Toinen malli ajastimella vaatii 2 ajastimen käytön, toinen on se joka tuottaa pwm- signaalin ulos (eli analogwrite) ja toisella korvataan delay.
Delay- korvaajalla määrätään taajuus jolla arvoja vaihdetaan ja ajastimelle tehdään keskeytysfunktio (joka siis suoritetaan aina kun ajastimen laskuri menee ympäri). Funktiossa voi ottaa seuraavan asetusarvon vaikka taulukosta ja asettaa sen lähtöön analogwrite avulla. Tässäkin lähdön asetus suoraan ilman analogwrite on nopeampi koska iso osa analogwrite suorituksesta riittää tehdä vain kerran.
loop()- funktioon voi jättää analogread ja sen arvon mukaan delay- korvaaja-laskurin taajuuden määritys ja mahdolliset muut jutut mitä ehkä voisi tehdä (vaikka näyttää asetusarvo näytöllä tms).

Yleensä teen tällaiset ilman kirjastoja mutta se ei välttämättä sovellu aloitteluun.
Ainakin timerone niminen kirjasto on olemassa ja siihen löytyy esimerkkejä.
Aloita vaikka tekemällä ensin timer interrupt jossa vuorotellen laitetaan jokin lähtö ylös/alas, tällä saa kästevästi ulos tietyn taajuuden.
Seuraava askel on lisätä loop:iin analogread + ajastimen ajan asetus jolloin taajuutta voi säätää potikalla.
Esimerkiksi täältä löytyy interrupt- esimerkki ledin vilkutuksella: Arduino TimerOne Library Code Examples [Tutorial] kohdasta "Arduino TimerOne Timer Interrupt Example".

Ja ajastinten kanssa pitää yleensä lukea myös vähän datalehteä koska tietyt pinnit on sidottu tiettyihin toimintoihin. Et kertonut mikä kortti on kyseessä mutta esimerkiksi ne joissa on atmega328P (esim uno) timer0 on pinneissä 5 ja 6. Samassa timerissa on myös millis() toiminnallisuus eli timer0 ei voikaan käyttää kätevästi muuhun.
Kirjasto timerone käyttää nimensä mukaisesti timer1 jonka lähdöt on pinneissä 9 ja 10. Jos timer1 käytetään delay- korvaajana niin noita pinnejä ei voi käyttää analogwrite kanssa (digitalwrite on silti ok). Analogwritelle jää jäljelle timer2 jonka lähdöt ovat 3 ja 11.


Ja kyllä, ajastinten käyttö ei ehkä ole ihan perusteita vaan vaatii jo hieman enemmän.

Ja jos käyttää analogwrite() jännitteen tuottamiseen pitää muistaa että se on oikeasti pwm- lähtö joka vaatii myös hieman ulkoista kytkentää jotta lähtö näyttää jännitteeltä eikä pwm- signaalilta.
Jos käytössä on pelkkä arduinokortti jossa ei ole sisäänrakennettua dac:ia niin ei sen lähdön pitäisikään näyttää siniltä vaan vaihtuvalta pwm- signaalilta.
Sain tämän ohjelman toimimaan @dmn antamalla koodilla. Suurimmat kiitokset!

Laitoin 0- 3,3V jännitejakoon 10k trimmerin. Taajuuden saa 115Hz asti. Ongelma oli aluksi siinä, että taajuusalue oli todella iso, niin hidas, ettei yleismittari edes pystynyt lukemaan sitä. Loppua kohden taajuus karkasi kerralla 115Hz.

Loputa 10k trimmerin jalassa oli 600k etuvastus, jolloin ymmärsin kokeilla ohjelmasta parametrejä. Muutin: const unsigned int factor = 8; jolloin sain alueeksi 5 - 115Hz

Alue on riittävän hyvä, mitä nyt suurinta nopeutta saisi ehkä olla 200Hz asti, (jos se edes on mahdollista). Trimmeri kuitenkin muuttaa alkupään arvoja hitaasti ja lopussa hipaisukin on liikaa. Onko helppoa korjausta, vai laittaako ennemmin vain kaksi potikkaa sarjaan?
 
Sain tämän ohjelman toimimaan @dmn antamalla koodilla. Suurimmat kiitokset!

Laitoin 0- 3,3V jännitejakoon 10k trimmerin. Taajuuden saa 115Hz asti. Ongelma oli aluksi siinä, että taajuusalue oli todella iso, niin hidas, ettei yleismittari edes pystynyt lukemaan sitä. Loppua kohden taajuus karkasi kerralla 115Hz.

Loputa 10k trimmerin jalassa oli 600k etuvastus, jolloin ymmärsin kokeilla ohjelmasta parametrejä. Muutin: const unsigned int factor = 8; jolloin sain alueeksi 5 - 115Hz

Alue on riittävän hyvä, mitä nyt suurinta nopeutta saisi ehkä olla 200Hz asti, (jos se edes on mahdollista). Trimmeri kuitenkin muuttaa alkupään arvoja hitaasti ja lopussa hipaisukin on liikaa. Onko helppoa korjausta, vai laittaako ennemmin vain kaksi potikkaa sarjaan?
Kuulostaa logaritmiselta potikalta.
Jos sama alussa hitaasti ja lopussa paljon näkyy myös yleismittarilla niin sitten potikka vaihtoon.
Jos käytät avrää 5 voltilla niin mittaa myös sitä eli adc vref=5V ja potikka 5V eikä 3.3 niin saat paremmin adc alueen käyttöön.
 
Kuulostaa logaritmiselta potikalta.
Jos sama alussa hitaasti ja lopussa paljon näkyy myös yleismittarilla niin sitten potikka vaihtoon.
Jos käytät avrää 5 voltilla niin mittaa myös sitä eli adc vref=5V ja potikka 5V eikä 3.3 niin saat paremmin adc alueen käyttöön.
1734969067569.png

Softa näyttää nyt tuolta. Loput on vain tuota samaa kahdelle PWM-outputille vuorotellen.

Tuo trimmi on tullut jonkun Startter kitin mukana. Tein sille vastustestin ja ajoin yleismittariin 0-5V jännitettä. Näytti molemmissa toimivan lineaarisesti.

Tuon 3,3V jännitteen otin 5V sijasta käyttöön, kun taajus ryntäili aina maximiin. Huomasin, että saavutan saman 115Hz myös 3,3V jännitteellä (?)

Kun kuitenkin juotan prossun reikälevylle, tuli mieleen, että siihen voisi laittaa 20Mhz kellon. Silloin suurin taajuus olisi noin 144Hz
 
1734969067569.png

Softa näyttää nyt tuolta. Loput on vain tuota samaa kahdelle PWM-outputille vuorotellen.

Tuo trimmi on tullut jonkun Startter kitin mukana. Tein sille vastustestin ja ajoin yleismittariin 0-5V jännitettä. Näytti molemmissa toimivan lineaarisesti.

Tuon 3,3V jännitteen otin 5V sijasta käyttöön, kun taajus ryntäili aina maximiin. Huomasin, että saavutan saman 115Hz myös 3,3V jännitteellä (?)

Kun kuitenkin juotan prossun reikälevylle, tuli mieleen, että siihen voisi laittaa 20Mhz kellon. Silloin suurin taajuus olisi noin 144Hz

Ei taajuutta kannata muuttaa avr kellolla vaan odotuksen pituudella (tai ajastimella).

Olethan testannut että odotusviive (siis factor*potVal) pysyy oikeissa rajoissa, esim tulostamalla se sarajporttiin. Joo, rikkoo ajastuksen mutta sillä voi varmistaa että viiveiden määrä on oikein. Tuo että ryntää lineaaripotikalla kuulostaa melkein siltä että joku viive muuttuu liian pieneksi tai laskurin raja-arvo menee ympäri.

Nop() tilalla (= 1/16M sekunnin viive) voi käyttää myös _delay_us() joka odottaa mikrosekunnin, ei tarvitse ihan niin isoja looppilukumääriä. Luulen että resoluutio riittää silti (= 18us pykälät jos viive kasvaa aina 1us ja niitä on 18 kpl).

Pikagooglen mukaan analogwrite() suoritus kestää 70-80us pinnistä riippuen eli se pitäisi varmaan ottaa huomioon kun laskee tarvittavia odotuksia halutun taajuuden mukaan.

Kannattaa tarkastuslaskea paljonko odotuksen pitää olla halutulla taajuudella ja valita odotustapa sen mukaan (nop suurille taajuuksille ja _delay_us() tai _delay_ms() pienille). Myös säädön tarkkuus pitää ottaa huomioon (nop: 1/16M, 1us tai 1ms välein).
 
Ei taajuutta kannata muuttaa avr kellolla vaan odotuksen pituudella (tai ajastimella).

Olethan testannut että odotusviive (siis factor*potVal) pysyy oikeissa rajoissa, esim tulostamalla se sarajporttiin. Joo, rikkoo ajastuksen mutta sillä voi varmistaa että viiveiden määrä on oikein. Tuo että ryntää lineaaripotikalla kuulostaa melkein siltä että joku viive muuttuu liian pieneksi tai laskurin raja-arvo menee ympäri.

Nop() tilalla (= 1/16M sekunnin viive) voi käyttää myös _delay_us() joka odottaa mikrosekunnin, ei tarvitse ihan niin isoja looppilukumääriä. Luulen että resoluutio riittää silti (= 18us pykälät jos viive kasvaa aina 1us ja niitä on 18 kpl).

Pikagooglen mukaan analogwrite() suoritus kestää 70-80us pinnistä riippuen eli se pitäisi varmaan ottaa huomioon kun laskee tarvittavia odotuksia halutun taajuuden mukaan.

Kannattaa tarkastuslaskea paljonko odotuksen pitää olla halutulla taajuudella ja valita odotustapa sen mukaan (nop suurille taajuuksille ja _delay_us() tai _delay_ms() pienille). Myös säädön tarkkuus pitää ottaa huomioon (nop: 1/16M, 1us tai 1ms välein).
Nyt sain tuon sarjaportin tulostamaan läppärin näytölle tällä ohjeella:
Tosin printtaan ainoastaan ensimmäisen "Serial.println(analogValue); " ja delay lopusta pois.

Potikka nollassa yleismittari näyttää 2,6Hz ja silloin Serial.print näyttää: 1023.

Tajuutta on helppo nostaa 25Hz asti, jolloin Serial.Print näyttää 100. Tämä on potikasta noin 8/10 osaa.

Kun Serial.printin arvo menee kaksi numeroiseksi, säätäminen on jo hyvin vaikeaa, saati lopussa, kun serial-print on alle kymmenen.

Suurin taajuus tippui 115Hz --> 112Hz, kun looppiin lisättiin Serial.print. Jos käytän 3,3V jännitejakoa, se kaventaa aluetta potikan hitaasta päästä.
 
Viimeksi muokattu:

Uusimmat viestit

Statistiikka

Viestiketjuista
262 761
Viestejä
4 556 729
Jäsenet
75 052
Uusin jäsen
akaboele

Hinta.fi

Back
Ylös Bottom