Problemen zelfbalancerende robot met Arduino

Hallo

Eerste keer op de forum dus mijn excuses als het te veel of te weinig informatie bevat.
Voor mijn eindproject op school heb ik gekozen om een zelfbalancerende robot te maken. Dit is een tweewielige robot die vanzelf recht blijft staan. Het herstelt bovendien ook zijn evenwicht als er tegen geduwd wordt. De meeste projecten op school zijn CNC,PLC enzovoort gerelateerd. Ik wou eens iets anders proberen en ik kwam met een Arduino Uno project uit. Hoewel ik geen kennis heb over de programmeertaal, wou ik de uitdaging toch aangaan. Op Instructables.com heb ik een post gevonden waarbij dit project gemaakt wordt. De software voor de robot kon ik erbij downloaden. Toen ik de software gekopieerd en geplakt had in de IDE van Arduino kreeg ik de volgende foutmelding:

exit status 1
a function-definition is not allowed here before '{' token

Ik heb geen flauw idee wat dit kan betekenen. Research op het web hielp ook niet echt omdat ik weinig kennis heb over de Arduino software. De oplossing zelf was dus ook moeilijk te begrijpen.
Kan iemand mij eventueel helpen?
Wat uitleg over hoe deze fout is kunnen ontstaan zou ik erg fijn vinden.
Voor meer informatie over mijn project kan altijd Instructables bezocht worden. Zie link hieronder. (in stap 5 is de download link te vinden)

http://www.instructables.com/id/Another-Easier-Inverted-Pend.../?ALLSTEPS

Ik gebruik een Arduino Uno in combinatie met een L298N motor Driver en de L3GD20 gyroscoop in mijn robot. Misschien kan de fout ook liggen dat de gyroscoop verkeerd of niet is afgesteld (aangezien dit ervoor zorgt dat de robot in evenwicht blijft). Ook dat zou ik niet weten hoe ik dat zou kunnen nakijken. De download moet bovendien geopend worden met een PDF-reader, anders klopt er niets meer aan de software door een of andere manier.

De software in stap 5 op de instructables pagina zorgt er alleen maar voor dat de robot recht kan staan met hulp van mijn vinger die de robot lichtjes vasthoudt. Als dit zou werken moeten er een paar regels aangepast worden waardoor de robot wel zelfstandig recht kan staan (stap 7 tot stap 11). De wielen van de robot draaien wel maar niet in de zin dat ze ervoor zorgen dat de robot in evenwicht blijft. Ze doen eerder waar ze zin in hebben. De Arduino sketch is hieronder te vinden.

Tips zijn altijd welkom
Alvast bedankt!

// "Another easier inverted pendulum balancing robot" // You need only half a day to make it, if you have some Materials. // (This sketch is ver.2.0.d for a digital output gyroscope.) // No timer library is used in this version. // But stability of robot is more improved than earlier version. // Copyright (C) 2014 ArduinoDeXXX All Rights Reserved.
//#include <MsTimer2.h> //01 (This line is omitted in ver.2.0 and the later.) //int i = 0; //02 (This line is omitted in this version.) byte countS = 0; //03 //long zeroOmegaI = 0; //04 (This line is omitted in this version.) int recOmegaI[10]; //05 int omegaI = 0; //06 long thetaI = 0; //07 long sumPower = 0; //08 long sumSumP = 0; //09 const int kAngle = 50; //10 const int kOmega = 500; //11 const long kSpeed = 60; //12 const long kDistance = 20; //13 long powerScale; //14 int power; //15 long vE5 = 0; //16 long xE5 = 0; //17
#include <SPI.h> //DL1 (These 17 lines, DL1-DL17, are added in this version.) int ry; //DL2 long R; //DL3 void L3GD20_write(byte reg, byte val) { //DL4 digitalWrite(10, LOW); //DL5 SPI.transfer(reg); //DL6 SPI.transfer(val); //DL7 digitalWrite(10, HIGH); //DL8 } //DL9 byte L3GD20_read(byte reg) { //DL10 byte ret = 0; //DL11 digitalWrite(10, LOW); //DL12 SPI.transfer(reg | 0x80); //DL13 ret = SPI.transfer(0); //DL14 digitalWrite(10, HIGH); //DL15 return ret; //DL16 } //DL17
void setup () { //18 Serial .begin(115200); //19 pinMode(4, OUTPUT); //20 pinMode(5, OUTPUT); //20-a pinMode(6, OUTPUT); //21 pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); for ( int i = 0 ; i < 10 ; i++ ) { recOmegaI = 0; } //25 ("int" is added instead of line 2 omitted.)
pinMode(10, OUTPUT); //DL18 (These 8 lines, DL18-DL25, are added in this version.) digitalWrite(10, HIGH); //DL19 SPI.begin(); //DL20 SPI.setBitOrder(MSBFIRST); //DL21 SPI.setDataMode(SPI_MODE3); //DL22 SPI.setClockDivider(SPI_CLOCK_DIV2); //DL23 L3GD20_write(0x20, B11001111); //DL24 L3GD20_write(0x23, B00000000); //DL25
delay(300); //26 // training(); // (This line is omitted in this version.)
// MsTimer2::set(5, chkAndCtl); // (This line is omitted in ver.2.0 and the later.) // MsTimer2::start(); // (This line is omitted in ver.2.0 and the later.) } //30
void loop () { //31 chkAndCtl(); // NL1 (This line is added in ver.2.0 and the later.) if ( power > 0 ) { //32 analogWrite( 6, power ); digitalWrite( 4, HIGH ); digitalWrite( 5, LOW ); //35 analogWrite( 9, power ); digitalWrite( 7, HIGH ); digitalWrite( 8, LOW ); } else { analogWrite( 6, - power ); //40 digitalWrite( 4, LOW ); digitalWrite( 5, HIGH ); analogWrite( 9, - power ); digitalWrite( 7, LOW ); digitalWrite( 8, HIGH ); //45 } // delayMicroseconds(3600); // NL2 (This is omitted in this version.) }
//void training(){ //48 (These 7 lines, 48-54, are omitted in this version.) // delay (1000); // for ( i = 0 ; i < 500 ; i++ ){ //50 // zeroOmegaI = zeroOmegaI + analogRead(A5); // } // zeroOmegaI = zeroOmegaI / i; //} //54
void chkAndCtl() { //55 // omegaI = 0; // NL3 (These 6 lines, NL3-NL8, are omitted in this version.) // for ( i = 0 ; i < 10 ; i++ ) { //NL4 // omegaI = omegaI + analogRead(A5) - zeroOmegaI; //NL5 // delayMicroseconds(10); //NL6 // } //NL7 // omegaI = omegaI / 10; //NL8
R = 0; //DL26 (These 7 lines, DL26-DL32, are added in this version.) for ( int i = 0 ; i < 45 ; i++ ) { //DL27 ("int" is added instead of line 2 omitted.) ry = ( (L3GD20_read(0x2B) << 8) | L3GD20_read(0x2A) ); //DL28 R = R + ry; //DL29 delayMicroseconds(90); //DL30 } //DL31 omegaI = R * 0.00875 / 45; //DL32
// omegaI = analogRead(A5) - zeroOmegaI; //56 (This line is omitted in ver.2.0 and the later.) if ( abs( omegaI ) < 2 ) { omegaI = 0; } //57 (The lower bound is less than 2 in this version.) recOmegaI[0] = omegaI; thetaI = thetaI + omegaI; countS = 0; //60 for ( int i = 0 ; i < 10 ; i++ ) { // ("int" is added instead of line 2 omitted.) if ( abs( recOmegaI ) < 4 ) { countS++; } //62 (The lower bound is less than 4 in this version.) } if ( countS > 9 ) { thetaI = 0; //65 vE5 = 0; xE5 = 0; sumPower = 0; sumSumP = 0; } //70 for ( int i = 9 ; i > 0 ; i-- ) { recOmegaI[ i ] = recOmegaI[ i-1 ]; } // ("int" is added instead of line 2 omitted.)
powerScale = ( kAngle * thetaI / 100 ) + ( kOmega * omegaI / 100 ) + ( kSpeed * vE5 / 1000 ) + ( kDistance * xE5 / 1000 ); // power = max ( min ( 95 * powerScale / 100 , 255 ) , -255 ); sumPower = sumPower + power; sumSumP = sumSumP + sumPower; //75 // vE5 = ??? //76 // xE5 = ??? //77 } //78 // Copyright (C) 2014 ArduinoDeXXX All Rights Reserved. //79

In het artikel staan instructies voor het kopiëren van de code. Opslaan als pdf, openen in een texteditor, corrigeren van foutjes.

Heb je dit wel uitgevoerd? Het artikel waarschuwt voor een corrupt project als je de pdf in de browser opent.

Formatteren van de code zou wel helpen; zo is het zinloos/onleesbaar...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Voor mijn eindproject op school

Zul je je dus in de Arduino moeten verdiepen en leren programmeren.

Op Instructables.com heb ik een post gevonden waarbij dit project gemaakt wordt.

Wees maar blij dat ik je mentor niet ben, daar zou ik nooit mee akkoord gaan.
In mijn tijd had je geen internet en zou je in dit geval iedere regel code zelf moeten schrijven en kunnen uitleggen.

Bij mij compileerd "invertedRobot_v20d_noTimer.pdf" wel, je hebt dus iets fout gedaan.

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Om te beginnen is dit een schoolvraag, en die hoort dus in het schoolvragen topic. Er gelden ook speciale regels voor die sectie, met name dat je moet laten zien wat je zelf al gedaan en bedacht hebt.

Tot dusver heb je blijkbaar bedacht dat je een project compleet kan kopiëren zonder iets te snappen van hoe het werkt, en zelfs dat kopiëren is blijkbaar al moeilijk.

Als je niet begrijpt hoe het zou moeten werken, kun je het ook nooit zelf debuggen of iets aanpassen. Misschien zou je je daar eerst even in moeten verdiepen.

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

Alvast bedankt aan iedereen.
ik ga mijn best doen om te kijken hoe Arduino werkt.
Vervolgens zullen mijn (eventuele) vragen ook bij schoolvragen staan.

Met vriendelijke groet