Jan

Jan

Mijn Arduino code werkt niet. Hoe komt dat nou?

Over mijPosted by Jan Fri, April 27, 2012 20:22:39
Arduino is een prachtig stukje speelgoed. Als je als noob met de Arduino begint zie je al snel heel wat mogelijkheden. En ja die zijn er echt wel. Maar als je dan begint met je eigen projectje te coderen/solderen; lukt het meestal niet zo goed. Hoe komt dat nou? Vraag je je dan af.

Ja hoe komt dat nou? (zucht de ervaren Arduinoer)smiley

Laat mij een poging doen om daar een zinnige uitleg over neer te pennen.

Wat de meeste noobs (en zelf heel wat ervaren Arduinoers) niet beseffen is hoe goed het Arduino team er in geslaagd is om iets dat heel moeilijk is, makkelijk te maken (of is het "laten blijken").

En daardoor komt het. smiley.........

Ja, echt waar.............smiley

......... Daar ben je niet veel mee, he?

Laten we eerst even duidelijk maken hoe moeilijk het wel niet is om te doen wat je met je Arduino wil doen, maar dan zonder Arduino.

1) Je neemt een PIC (Programmable Integrated Cirquit).
2) Je neemt een PIC programmer (hiermee programmeer je een PIC)
3) Neem een hoop elektronische componenten waaronder een 555 (zie andere post) een USB poort, een crystal, een voedings stabilisator.
4) Lees en begrijp van al die componenten de datasheets
5) Ontwikkel en print een PCB waar je al deze componenten kan op plaatsen en verbinden.
6) Schrijf een bootloader (of gebruik een bestaande voor je PIC).
7) Schrijf een hele hoop libraries.
8) En nu heb je iets wat op de Arduino lijkt.
9) Dus nu neem je de elektronische/mechanische/elektrische componenten die je nodig hebt voor je project.
10) Lees van al deze componenten de datasheets.
11) Maak een PCB die je kan verbinden met je eerste PCB
12) Schrijf code voor je project

En het werkt niet....... Hoe komt dat nou?

Ja hoe komt dat nou? (zucht de ervaren Arduinoer)smiley

Arduino heeft dit heel wat makkelijker gemaakt. Maar natuurlijk blijven er nog wat voorschriften over. Vergelijk het met je vriend(inne)tje smiley. Je ziet hem/haar graag, je kan er leuke dingen mee doen, maar sommige zaken moet je mee opletten. Zoals bijvoorbeeld andere vriend(inne)tjes smiley.

Laten we even een veel voorkomend probleem van noobs als voorbeeld geven.

De noob denkt “Ik neem een arduino, Ik sluit daar een motor/led/camera op aan en ook men PC. Dan kan ik commando’s naar men PC sturen en van men PC naar de motor/led/camera. En dan kan ik ..................”

En dan begint de noob code te schrijven voor de Arduino die commando’s als “Zet de flits aan” en “trek een foto” en “Draai de camera [XX] graden [horizontaal/verticaal]” moet ontvangen en die ............ niet werkt.

Hoe komt dat nou?

Ja zucht de ervaren Arduinoersmiley; dat komt omdat je code schrijft in C*. C is een taal die gemaakt is om nauw met processors te kunnen samenwerken. Processors werken goed met gehele getallen maar niet met strings. Je zegt dus niet tegen de processor “Zet de flits aan” maar digitalwrite(2,HIGH); En HIGH is eigenlijk 1.

Zo zou je “Draai de camera [XX] graden [horizontaal/vertikaal]” kunnen vertalen in

If (Horizontal)
{
digitalwrite(3;CurHorizontalValue+XX); //Zeg de servo op pin 3 die horizontaal beweegt dat hij XX moet draaien
}
Else
{
digitalwrite(4;CurVerticalValue+XX); //Zeg de servo op pin 4 die verticaal beweegt dat hij XX moet draaien
}

Maar hoe kom je nu van “Draai de camera 20 graden verticaal” naar

Horizontal = false;
XX = 20?

Dat kan je doen. Maar dat is niet zo makkelijk. Het is heel wat makkelijker als je het als volgt zegt:

H1
D20

H1 betekend dan horizontaal is true

D20 betekend dan : draai 20 graden.

Dit lukt zolang je voor elk commando 1 uniek character kan verzinnen.

Met deze methode kan je een spatie gebruiken om de commando’s te onderscheiden. En dan wordt “H0 D30 F1 P3” “30 graden verticaal draaien en 3 foto’s trekken met flits”

onderaan vind je de code

Veel plezier ermee

Jantje

Arduino programmeer je eigenlijk in Wiring. Maar in grote lijnen in dat C/C++. C en C++ zijn 2 talen die nauw verwant zijn. De meeste code die je de eerste weken zal schrijven zal in C zijn. Behalve als je String gebruikt.


/*
read command from Serial
Language: Wiring/Arduino

This program reads an ASCII character directly followed by a space from the serial port and converts it in a variable.

The circuit:
No circuit needed (only seria port communication

Created 27 April 2012
by Jan Baeyens

This example code is in the public domain.
*/

boolean Flash = false; //Do you want to use the flash when taking photo's
boolean Horizontal = true; //Do you want to turn Diagonal or Horizontal
int DegreesToTurn = 0; // How many degrees do you want to turn
int NmberOfPhotosToTake = 0; // How Many photo's do you want to take
char IncommingCharacters[10]; //This is a local buffer. You should not send messages with more than 9 characters
int ReceivedCharacters=-1; // Contains the number of characters in IncommingCharacters

void setup()
{
Serial.begin(115200);
}

void loop()
{
if (Serial.available() > 0) //Something arrived so do something
{
IncommingCharacters[++ReceivedCharacters] = Serial.read(); // get incoming byte:
// Serial.print("received ");
// Serial.println(IncommingCharacters[ReceivedCharacters]);
if ((IncommingCharacters[ReceivedCharacters] == ' ')
| (IncommingCharacters[ReceivedCharacters] == '\n')
| (IncommingCharacters[ReceivedCharacters] == '\r'))
{
// Serial.println("Command end\n");
if (ReceivedCharacters > 0)
{
switch (toUpperCase((IncommingCharacters[0]))) // IncommingCharacters[0] means the first received character.
{ //note that the characters after case need to be single quotes
case 'F': Flash= atoi( IncommingCharacters+1); break;// IncommingCharacters+1 means the string without the first character
case 'H': Horizontal= atoi( IncommingCharacters+1); break;
case 'D':DegreesToTurn= atoi( IncommingCharacters+1); break;
case 'P':NmberOfPhotosToTake= atoi( IncommingCharacters+1); break;
break;
default:
Serial.print("Non recognized character received: ");
Serial.println( IncommingCharacters);
Serial.print("Use F H D P followed by a value and space\n");
Serial.print("For instance H45\n\n");
break;
}
Serial.print("New Values");
Serial.print("\nFlash = ");
Serial.print(Flash);
Serial.print("\nHorizontal = ");
Serial.print(Horizontal);
Serial.print("\nDegreesToTurn = ");
Serial.print(DegreesToTurn);
Serial.print("\nNmberOfPhotosToTake = ");
Serial.println(NmberOfPhotosToTake);
}
ReceivedCharacters = -1; // reset the pointer
memset(IncommingCharacters,0,10); //reset the memory
}
}
}


Fill in only if you are not real





The following XHTML tags are allowed: <b>, <br/>, <em>, <i>, <strong>, <u>. CSS styles and Javascript are not permitted.
Posted by Jan Sun, April 29, 2012 13:32:38

En ...... het werkt niet/wel?
Als het niet werkt: Merk dan op dat de code zegt Serial.begin(115200);
Met andere woorden je serial monitor moet op baud rate 115200 staan of je ziet niks.smiley
Met vriendelijke groet
Jantje