Uitleg van de programmeertaal gezocht / Arduino ballen machine

Dag beste forumleden, onlangs ben ik dan toch begonnen met Arduino en wat jammer dat ik dat niet eerder heb gedaan!

Aangezien ik altijd al gek ben geweest van ballen machines (ballen fabrieken, knikkerbanen, hoe je het ook wilt noemen) heb ik jaren geleden al het plan opgevat om er eentje te maken die door een computer bestuurt zou kunnen worden. Na eerst met Boebot te zijn begonnen ben ik nu (gelukkig) terechtgekomen bij Arduino, maar ik ben een echte beginner.
Ik heb ondertussen de sparkfun starterskit gekocht en het boek 'elektronica voor Dummies' gelezen, dit gaf een hoop inzicht. Ik worstel alleen nog met de programmeertaal. Is er iemand die hier een Nederlandstalige handleiding van heeft?
Als ik de code zie, dan begrijp ik wel ongeveer wat er bedoeld wordt, maar ik snap niet waarom sommige zaken staan zoals ze staan (tussen haakjes bijvoorbeeld). Ik wil het zo graag begrijpen en ik kom er nog niet echt uit. De vraag is dus eigenlijk: hoe werkt de structuur van de taal (bij ons begin je met een hoofdletter en eindig je met een punt). Waarom staat er bijvoorbeeld 'Void' bij 'setup' en waarom wordt dat gevolgd door '()'. Waarom staan er hoofdletters midden in woorden of eigenlijk waarom? En zo kan ik nog wel even doorgaan.

Je ziet, genoeg vragen maar nog geen antwoorden. Wie kan mij helpen aan het liefst een Nederlandstalige (of anders Engelse) uitleg van de programmeertaal?

Voor degene die mijn project willen volgen arduino-ballenmachine.blogspot.com is de link naar mijn blog.

Hallo
Er wordt veel onwaarheden verkondigt rond de Arduino programmeer taal. Maar eigenlijk is het heel simpel.
Je programeert de arduino in C++.
Omdat C++ een extensie is van C kan je de Arduino ook in C compileren (maar het gaat toch door een C++ compiler).
Omdat C++ geen specifieke hardware functies heeft zoals zet poort 3 hoog heeft het Arduino team de wiring framework in C++ gecodeerd. Dit is de Arduino library.
Behalve de vele extra functies die je kan vinden op http://arduino.cc/en/Reference/HomePage of bij wiring zelf op Extended Framework (API) \ Wiring is het grootste verschil dat je in C++ altijd een functie hebt die "int main()" noemt. Bij Wiring heb je er 2 "void setup()" en "void loop()".

Technisch heeft het Arduino team dit als volgt opgelost

int main(int argc, char *argv[])
{
    arduino_init();
    setup();
    while(1)
    {
        loop();
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}

merk op dat de laatste 2 lijnen nooit kunnen aangeroepen worden en dus overbodig zijn.

    system("PAUSE");
    return EXIT_SUCCESS;
}

Daarnaast heeft het Arduino team ook nog een paar vervelende C/C++ taken van je overgenomen die het leven echt wel makkelijker maken.
Zo werkt dit stukje code in Arduino

void setup()
{
doeIets();
}
 void doeIets()
{
}

Maar zal dit niet werken in mij Eclipse plugin of in gelijk welke C/C++ omgeving. Daar moet het zijn zoals hieronder:

void doeIets();
void setup()
{
doeIets();
}
 void doeIets()
{
}

Met andere woorden een object moet gedeclareerd zijn voor je het kan gebruiken. De Arduino IDE maakt die declaraties voor jou met soms onaangename gevolgen maar voor de gemiddelde gebruiker veel handiger.

Dus om de Arduino tool te leren kan je best een C++ cursus erbij nemen. Bijvoorbeeld Programmeren in C++/Basis - Wikibooks of een echt boek.
Zo een boek beantwoord al je vragen behalve :

Waarom staan er hoofdletters midden in woorden

Er zijn 4 grote strekkingen in "naming convention". "Naming convention" is de afspraak hoe je variabelen methodes en andere zaken neerschrijft in een programmeer taal.
Hungarian notatie is een in onbruik geraakt sinds de object georiënteerd talen zijn verschenen. Als je een variabele van het type geheel getal (int in C C++) die je Aantal zou noemen Zou je die in hungarian schrijven als iAantal. Dus met andere woorden eerst het type gevolgd door de naam.
Camal casing wordt nog heel vaak gebruikt voor klasses (bijoorbeeld de standaard bij java voor klassen). Bij camel casing schrijf je elke eerste letter van een woord als een hoofdletter. Vb AantalLeerlingen
Pascal casing komt van de programmeer taal Pascal en is hetzelfde als Camel casing met dit verschil dat het eerste woord een kleine letter is. Pascal casing wordt heel veel gebruikt. Bij in Java is het de standaard voor variabelen en methodes. V aantalLeerlingen
Underscore (ik ken de naam niet) wordt ook vaak gebruikt zeker als namen allemaal in hoofdletters staan. VB AANTAL_LEERLINGEN

Veel plezier ermee.
Met vriendelijke groet.
Jantje

Dank jantje, dit helpt mij al weer wat verder. Verder is het leren door doen denk ik. En ook de 'reference' is een goede.
Ook heb ik op het Nederlandse forum (valk na het plaatsen van deze post) een beknopte Nederlandstalige beginnershandleiding gevonden. Ik kan elke beginner die aanraden!

Laat ik verder hier ook de vraag stellen die ik daar al stelde: weet iemand voor mijn project een goede Color-sensor waarmee ik mijn knikkers op kleur kan herkennen? Ik houd mij aanbevolen.

Blacktree
Ik ben blij te zien dat je weer wat verder bent.
Als je iets aanraad is het altijd handig om een directe link te zetten. 8)
Ik vermoed dat dit het document is http://lemio.nl/files/arduino_cursus.pdf
Met vriendelijke groet
Jantje

Jantje, het was niet dat document, hoewel ook deze zeer welkom is.
Ik had deze gevonden: http://www.kompanje.nl/arduino/Arduino%20manual%201_0%20NL.pdf

Das inderdaad een goed document.
Jantje

Beste mensen, de eerste stap op weg naar een combinatie van een Arduino met een ballenbaan is gezet. En ook al is het een test, ik ben zeer tevreden over het resultaat. Hier kan alles lezen/zien/volgen: http://arduino-ballenmachine.blogspot.com.

Fijn project.

Als je gewoon ballen wil tellen ongeacht de kleur, moet je eens kijken hoe het scrollwieltje van een muis werkt. Je kan zelfs een oude muis uitelkaar halen en de onderdelen gebruiken. Het komt neer op het uitzenden van een IR signaal en dit signaal te ontvangen. Elke keer als het onderbroken wordt, kan je tellen.

Veel plezier.

Ja, en nu moet ik dus gaan tellen. De setup van de ballenbaan is in orde, de vraag is, welke code heb ik nodig. Kan iemand we in de goede richting 'duwen'? Ik begrijp hoe ik de sensor (photoresistor) kan gebruiken. Hoe ik dat via serial kan weergeven, maar hoe laat je de 'sketch' dan tellen? Ooit wel eens iets over gezien of gelezen, ik weet het iig niet. Wie kan mij helpen?

Zo iets als

int aantalBallen;
int AlleBallen;

void setup()
{
aantalBallen=0; //Er is nog geen 1 bal gepasseert
AlleBallen=10;  //er moeten 10 ballen passeren
}
void loop()
{

if (bal_passeert) aantalBallen++; //tel de bal als de bal passeert
if (aantalBallen==AlleBallen) //Als alle ballen zijn gepasseert
{
Serial.print("AlleBallen zijn gepasseert");
}

Met vriendelijke groet
Jantje

Jantje, je bent geweldig. Op deze manier leer ik een hoop van de taal. Ik bedoel met tellen alleen iets anders: telkens als een knikker de phitoresistor passeert wil ik dat deze geteld wordt en dat het totaal aantal getelde knikkers wordt weergegeven, liefst als 1 (nieuw) getal. Dus als er 24 knikkers gepasseerd zijn staat er '24'. En als de 25ste knikker passeert gaat de 24 weg en komt er 25 te staan. Ik begrijp dat je dan een variable in moet stellen waarbij er steeds eentje wordt opgeteld, maar ik weet niet orecies hoe dit in code te vatten. Tevens vraag ik me af hoe je de analoge waarde van de photoresistor omzet in 'ja' (de knikker is gepasseerd) of 'nee' (er is nog geen knikker gepasseerd). Bij 'geen knikker' is de analoge waarden ongeveer 650 en als een knikker passeert is dit ongeveer 670. Ik neem aan dat je dit dan moet converteren naar 'ja' en 'nee'?

Wat je vraagt ligt heel dicht bij de code hoor. Behalve het zien van de bal dan.

int aantalBallen;
int AlleBallen;

void setup()
{
aantalBallen=0; //Er is nog geen 1 bal gepasseert
AlleBallen=10;  //er moeten 10 ballen passeren
}
void loop()
{

if (bal_passeert) 
{ 
aantalBallen++; //tel de bal als de bal passeert
Serial.print("Er zijn nu ");
Serial.print(aantalBallen );
Serial.println(" gepasseert");
}
if (aantalBallen==AlleBallen) //Als alle ballen zijn gepasseert
{
Serial.println("AlleBallen zijn gepasseert");
}

Jantje, dank, het werkt! Ik zal de code hier later posten, voor de liefhebbers.
Toch nog ene vraag: je krijgt nu in Serial Monitor een hele lijst met 'Er zijn er nu X gepasseerd'. Is er ook code om de vorige lijn steeds weg te halen als de nieuwe lijn wordt 'geprint'? Zodat het een soort teller lijkt ipv een lijst met opsomming? Alvast dank!

Blacktree

Blacktree:
Toch nog ene vraag: je krijgt nu in Serial Monitor een hele lijst met 'Er zijn er nu X gepasseerd'. Is er ook code om de vorige lijn steeds weg te halen als de nieuwe lijn wordt 'geprint'?

Niet met de serial monitor van Arduino.
Er zijn al discussies hierover geweest. Ik snap het nut niet want als het mooi moet zijn ga je toch geen serial monitor tonen?
Och ja Ik zal wel oud zijn 8)
Met Belgische frieten
Jan

Oke Jantje, ik snap het. Toch bedankt!

De volgende stap is dus het gebruik van een LCD scherm om al je gegevens in de toekomst op weer te geven.