Arduino vraagjes/praatjes

rob007

Yarr, Matey!

Hallo allemaal,

allereest als er strakjes iemand roept wat is nu je vraag???
of waar gaat dit over? bedenk je dan och ik sla dit onderwerp over!
als het ook mag van de forum leiding natuurlijk?
.
kreeg vandaag weer een Arduino binnen.(zo goedkoop ik kon het niet laten)
dus ik kontroleer hem even met blink,
en toen bedacht ik, ik neem aan dat je het zal moeten kunnen berekenen maar mijn vraag is de volgende:
kun je de blink gelijk laten lopen met de minuten van de klok?
neem aan van wel en dat het ook te maken heeft met de klok van de chip en het kristal?
(ik weet het niet precies ik geef mijn toetsenboord maar een slinger)
Ik kom aan de 50000 Delay en de blink 100
.
Los van dit vraagje wil ik ook nog meer gaan rommelen met Arduino en CW -
ik was daar al wel mee aan het rommelen maar wie weet hebben jullie leuke linkjes om te bekijken of Y.T. filmpjes altijd, en simpel? ja graag!
Ook bij CW heb je wat zo ver ik begrijp een soort van standaard (ik heb het eerder al eens gevraagd geloof ik)
In Arduino cijfers de lengte van punt pauze en streep maar sterker nog er zijn dacht ik al Arduino programatjes voor.
Als er linkjes zijn? Ja graag?
.
ik zij hier boven: zo goedkoop..... hier een linkje:
https://www.ebay.nl/itm/3D-Printer-Board-Kit-For-Arduino-CNC-Shield-V3…
en ja er zitten stepstickjes en CNC bordje bij,
en CNC daar ben ik ook mee bezig geweest in kombinatie met GBRL.
het software gedeelte is voor mij altijd het moeilijkst ( MAAR vind het zo leuk allemaal!!!)
een CNC wil ik in de toekomst ook maken maar heb jammer genoeg niet veel ruimte,
net zoals tijd (hobby’s te veel en …..te....!)
.
tot zo ver eventjes, ik hoop dat het niet te verwarrend is allemaal? ;-)
iedereen alvast een gezellige Sinterklaas toegewenst -
en de groetjes uit omgeving Rotterdam allemaal!
Rob.

Als ik je erger, lees en schrijf hier dan niet?

Standaard licht de led 1 sec (1000ms) op, en is hij 1 sec uit.

c code:


void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
}

Als je hem elke minuut 1 seconde wilt laten branden wordt het dus dit:

c code:


void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(59000);             // wait for 59 seconds  <---- 59000ms
}

Kan wel, maar is niet erg nauwkeurig. En zeker als je nog andere dingen gaat doen. Want die kosten ook tijd.

Kan je dus beter zo doen, dan heb je geen last van de looptijden van de andere funkties :

code:



void loop()
{
   static unsigned long Time = millis(); 
   if( (millis() - Time) > 60000)
   {  Time += 60000;
      
      Blink();
   }

   ... Andere funkties
}

Maar dan nog ben je afhankelijk van de nauwkeurigheid van het kristal.

Shiptronic

Overleden

Dat kan heel nauwkeurig, voor waarde is wel dat de USB kabel aan de PC moet blijven en daar te tijd weghalen.
Of je hangt er een RTC aan die kosten ook niet op de sites waar jij je spullen weg haalt ;)

Wie de vraag stelt, zal met het antwoord moeten leren leven.

Op 2 december 2017 20:53:16 schreef Shiptronic:
Of je hangt er een RTC aan die kosten ook niet op de sites waar jij je spullen weg haalt ;)

Die RTC's van 1 a 2 euro wijken 9 van de 10 keer nog meer af dan de AVR zelf. :D

Dat is goed mogelijk, de xtallen zullen ongeveer dezelfde kwaliteit zijn. Doel van een RTC is dan ook in de eerste plaats door te lopen als de CPU stil staat.
Als het 32768 Hz kristal van de rtc afwijkt, maar wel stabiel is kun je (in ieder geval bij de mcp7940, maar vast ook bij anderen) een register vullen dat de afwijking compenseerd. Dit gaat dan in xtal tikken per minuut er bij of er af, dus 0,5 ppm, 16s / jr.

Overigens vind ik al die RTC's een beetje ouderwets, doe mij gewoon een grote teller en desnoods wat sram, de rest kan handiger in de cpu. In moderne Uc's zit ook wel een rtc ingebouwd, maar dan kost het weer twee pinnen en battery backup kan in dat geval niet-triviaal zijn.

RTC met DCF77 kosten ook weinig meer, als je daar elke minuut een interrupt uit kunt krijgen ben je (bijna) geen software meer nodig.

Daar heb ik laatst naar gezocht (DCF77), maar er is weinig te vinden, de paar modules die ik vond waren 15 euro of meer, en mijn enige ervaring is een wekker met DCF ontvanger waarbij het bijna onmogelijk was om een fatsoenlijk signaal te krijgen binnenshuis.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Als het dan toch low-cost, maar toch nauwkeurig moet:

Netfrequentie tellen en de gaten bij netuitval opvullen met de RTC.

High met Henk

Special Member

Ik heb hetzelfde probleem met rtc voor mijn dashboard.

Probleem is dat ik geen internet in mijn auto heb/wil en geen 50 hz.

Ik dacht aan gps..

E = MC^2, dus de magnetische compatibiliteit doet kwadratisch mee???
big_fat_mama

Zie Paulinha_B

Met gps en een raspberry is dat op 1-2-3 gepiept, ntp configgen in de Raspbian en kees komt klaar.

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord

GPS was ook precies mijn idee, al heb ik goede ervaringen met de RTCs van Dalles, zoals die grote blokken die vroeger op 386/486 mainboards zaten. 3 minuten afwijking na 5 jaar onder in een doos gelegen te hebben vind ik acceptabel!

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

@high met henk

Misschien kan je het display/rds van de radio tappen? Rds heeft ook de tijd.

Op 2 december 2017 20:47:12 schreef deKees:
Kan wel, maar is niet erg nauwkeurig. En zeker als je nog andere dingen gaat doen. Want die kosten ook tijd.

Kan je dus beter zo doen, dan heb je geen last van de looptijden van de andere funkties :

Alternatief:

code:



/*
  alternative blink program
  Gerard Wassink
  GNUPL applies
*/

int RED = 4;                            // Use pin 4
int RED_stat = 0;                       // Initial status

unsigned long now = millis();           // Keep track
unsigned long prv = millis();           //   of time

// Runs once at reset or power on
void setup() {
  pinMode(RED, OUTPUT);                 // Set pin for output
}

// Loops forever
void loop() {
  now = millis();                       // Determine time (milli's since Arduino start)
  if ((now - prv) >= 1000) {            // if a second passed
    RED_stat = not(RED_stat);           // flip the status
    digitalWrite(RED, RED_stat);        // Set high or low
    prv = now;                          // Save the time
  }
}

Ain't no place like 127.0.0.1
High met Henk

Special Member

@k7js: mijn "radio" is een 19" doos achterin met 2*18" monitoren en voorin 1*7". Draait linux en zal vast wel een rtc hebben, maar die interfacen is tikje lastig.....
Bovendien wil ik die zo min mogelijk met mijn dash laten doen....

[Bericht gewijzigd door High met Henk op zondag 3 december 2017 11:10:16 (17%)

E = MC^2, dus de magnetische compatibiliteit doet kwadratisch mee???

@GerardWassink: Leuk, maar al snel incorrect, als de code binnen die if-statement mogelijk langer dan een milliseconde zou duren. Zodra iemand daar iets van seriële communicatie gaat doen, of een servo aansturen of zo, krijg je een cumulatieve fout.

Zoals het er nu staat klopt het wel, aangezien het onmogelijk is dat je ooit een milliseconde mist, mits er natuurlijk geen interrupts gebruikt worden die lang kunnen duren.

Gemakkelijk op te lossen als je "prv = now" vervangt door "prv += 1000". Dit bewijst maar weer dat het niet triviaal is om zo'n triviaal stukje code foutloos te schrijven; goed kans dat ik nu ook iets subtiels over het hoofd zie.

Dan nog ben je natuurlijk afhankelijk van de nauwkeurigheid van het kristal, de correctheid van de implementatie van millis() (geen afrondingsfout in de timer instelling, bijvoorbeeld).

Die teller valt om na ~48 dagen, maar als het goed is zou dat een afwijking van maximaal 1 sec. moeten geven, dus dat lijkt me verwaarloosbaar.

Maar een GPL clausule voor zo'n stukje triviale code? Echt?

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
blackdog

Golden Member

Hi Heren,

Even wat corrigeren :-)

De hardware printjes voor de Arduino/Raspberry die met de DS3232 werken, zijn zeer goed!
Daar kan geen Arduino en andere processor xtal tegen op.

Er is voor de DS3232/Arduino en klein stukje software beschikbaar zodat je met een goede frequentie counter de 32KHZ zeer precies kan trimmen voor nog kleinere jaarlijkse afwijkingen.
Dit resulteerd dan in een zeer nauwkeurige klok, ook bij temperatuur afwijkingen,
de processor in het de chip controleert regelmatig de temperatuur en corrigeert de klok dan voor deze afwijkingen.

Is GPS, DCF, NTP nauwkeuriger als goed geconfigureerd, jazeker! maar ook duurder en meer materiaal nodig.

Oja, let op het IC, dus geen DS1307, deze wel DS3231, DS3232M kan, maar de DS3232 is het best.

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Als je met een goed kristal begint, is temperatuurcompensatie natuurlijk de grootste bron van afwijkingen, dus als je die goed kunt compenseren, zit je voor de meeste toepassingen ruimschoots goed genoeg.

Ik kan niet direct een board vinden op Aliexpress of eBay, maar Futurlec heeft wel iets: http://www.futurlec.com/Mini_DS3232.shtml

Echt goedkoop is het echter niet; voor $12.90 (plus verzendkosten en zo) heb je ook gemakkelijk een GPS ontvanger. Er staan zelfs GPS ontvangers van 3.50 op Aliexpress, al heb ik voor die prijs een beetje mijn twijfels bij de kwaliteit. Voor NTP heb je een netwerkverbinding nodig, die je met een Raspberry wellicht wel hebt, maar met een andere microcontroller wellicht niet, zeker niet "in het veld". DCF klinkt leuk, maar ook daar is weinig voor te koop, aangezien het alleen in Europa bestaat (voor zover ik weet).

De lange termijn nauwkeurigheid van GPS kun je natuurlijk onmogelijk overtreffen, maar er zijn natuurlijk ook toepassingen waarbij je niet kunt rekenen op GPS ontvangst.

[Bericht gewijzigd door SparkyGSX op zondag 3 december 2017 11:47:03 (16%)

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Op 3 december 2017 11:31:11 schreef SparkyGSX:
@GerardWassink: ...

Maar een GPL clausule voor zo'n stukje triviale code? Echt?

Standaard in mijn header... ;-)

Gerard
.

Ain't no place like 127.0.0.1

Ah, vandaar, ik vond het al vreemd, zeker aangezien je nou niet bepaald een beginner bent!

Een aantal AVRs (waaronder de Atmega328) heeft een interne temperatuursensor; het lijkt me een redelijke aanname dat het kristal en de controller vrijwel dezelfde temperatuur hebben (zeker als je iets hebt dat op een batterij werkt en zeer weinig verbruikt), dus je zou de compensatie ook in software kunnen doen. Een snelle Google zoektocht geeft meerdere resultaten; wellicht zit daar iets bruikbaars tussen. Dat zou wel een bijzonder minimalistische en goedkope oplossing zijn!

Waarschijnlijk niet zo nauwkeurig als zo'n DS3232, maar helemaal zonder extra hardware.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Op 3 december 2017 12:03:22 schreef SparkyGSX:
... zeker aangezien je nou niet bepaald een beginner bent!

Zenk Joe... ;-)

Ain't no place like 127.0.0.1
blackdog

Golden Member

Hi,

DCF, GPS dan zit je met de antenne, kan dit op de gebruikte locatie?
Netwerk zit niet op een standaard Arduino.

Dit kan weer wel met de een aantal Arduino klonen die b.v. een klok in zich hebben.

Dat een xtal en de chip een zelfde temeratuur hebben, garandeerd in het geheel niet dat het nauwkeurig is en blijft.
Ook wordt het vrij lasting code te schrijven voor de zeg 16MHZ xtal de condensatoren die gebruikt worden en de temp sensor die aan een van de analoge ingangen van de ATmega328 hangt.
Hoe ga je dit kalibreren?

Kan je nog meter de goedkoopste i2c printje kopen :-)

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

code:


   static unsigned long Time = millis(); 
   if( (millis() - Time) > 60000)
   {  Time += 60000;

Het leuke van deze methode is dat het ook goed blijft gaan wanneer Time na 49 dagen een overflow geeft. millis() geeft dan bijvoorbeeld 1200, terwijl Time bijv op 4294966295 staat. (millis() - Time) geeft dan ook tgv een overflow de juiste waarde (2200 in dit geval).

big_fat_mama

Zie Paulinha_B

Voor NTP heb je een netwerkverbinding nodig

Niet waar. Mijn RaspBian synct zijn NTP uit de GPS-ontvanger.

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord

Op 3 december 2017 12:23:56 schreef big_fat_mama:
[...]

Niet waar. Mijn RaspBian synct zijn NTP uit de GPS-ontvanger.

En wat heeft die GPS ontvanger? Juist, een GPS-netwerk-verbinding... ;-)

Ain't no place like 127.0.0.1