PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger verzweifelt an der Arduino Software | atan



Sim0n
28.02.2012, 20:29
Hey,

ich verzweifel gerade an der Arduino Software.

Nachdem ich devc++ heruntergeladen habe, davon die libary math.h in die Arduino Software eingefügt und die Arduino Software gestartet habe, war es möglich die ARCTAN Funktion einzubinden.
Dennoch bin ich C++ Anfänger und habe ich in diesem Code folgendes Problem:

#include <math.h>

int y;

void setup() {
{



y = atan(10);

}
}

Ich wollte also einfach nur arctan von 10 ausrechnen und y den Wert annehmen lassen.
Beim Complilieren gabs aber die Fehlermeldung:

core.a(main.cpp.o): In function `main':
(...)\arduino-1.0\hardware\arduino\cores\arduino/main.cpp:14: undefined reference to `loop'

Was lief da falsch?

Ich bin in diesem Gebiet noch gar nicht vertraut und nach Stundenlanger Internetrecherche bin ich auch nicht schlauer geworden :confused:

Ich hoffe ihr könnt mir helfen.

Bytemuncher
28.02.2012, 20:36
Jeder Sketch in Arduino braucht neben der setup() auch eine loop() Funktion - siehe Fehlermeldung.
loop() ist eine Endlosschleife, in der i.d.R die Programmlogik untergebracht ist.

void setup(){
}

void loop(){
}

Sim0n
28.02.2012, 20:41
Wie dumm von mir...

Durch das Verschieben der geschweiften Klammern und das einfügen der void loop Funktion funktionierte es danach...


Ist es eigentlich möglich, dass die Software mir den Wert von y ausgibt?
Wie bei Javascript durch document.write ...

Bytemuncher
28.02.2012, 20:51
Ist es eigentlich möglich, dass die Software mir den Wert von y ausgibt?

Über den USB Port deines Boards, wird dir eine serielle Schnittstelle zur Verfügung gestellt.
Du musst dann eine Baudrate im Programm definieren, dein Programm auf das Board hoch laden und über einen Serial Monitor , bspw. den von Arduino: Tools -> Serial Monitor, eine Verbindung aufnehmen.

Hier im Beispiel ist die Baudrate 9600. Serial steht für die serielle Schnittstelle, println (= printline) gibt einen Wert, in dem Fall y aus. Das ganze läuft durch loop() in einer Endlosschleife.


int y = 20;

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

void loop(){
Serial.println(y);
}

Sim0n
28.02.2012, 20:57
Meinst Du damit ein Eingang der ANALOG IN Ports?

Ich meinte eigentlich nur eine virtuelle Durchführung der Berechnung und das ich danach einfach den Wert von y auslesen kann...
wie ist es denn nach dem anschließen von Arduino und PC möglich?

Bytemuncher
28.02.2012, 21:08
Meinst Du damit ein Eingang der ANALOG IN Ports?


Nein ich meine damit den Anschluss mit dem du ein Arduino Board mit dem PC verbinden kannst.
Die Arduino Boards haben einen USB Anschluss (Typ B).

http://s1.directupload.net/images/120228/n4tlua5v.jpg (http://www.directupload.net)



Ich meinte eigentlich nur eine virtuelle Durchführung der Berechnung und das ich danach einfach den Wert von y auslesen kann...

Ich weiß nicht ob es Emulatoren dafür gibt, i.d.R musst du dein Programm auf das Board hochladen um es auszuführen.



wie ist es denn nach dem anschließen von Arduino und PC möglich?

Du lädst das Programm per 'upload' auf dein Board hoch und schaust dir dann die Ausgabe, per USB Verbindung, über den Serial Monitor (siehe oben) an.

Sim0n
28.02.2012, 21:19
Hey,

ok verstehe.

Doch wenn ich nun den Code hier uploade:

#include <math.h>
int y,x;
int sensorbreite = 14.9;
int brennweite = 70;
int a = sensorbreite/2/brennweite;

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

void loop(){
y = atan(a);
x = 2*y*45/atan(1);
Serial.println(x);
}

Dann den Serialmonitor anschaue... werden, im Gegensatz zum Beispiel (20), nur Nullen ausgegeben...

was habe ich da falsch gemacht?

Bytemuncher
28.02.2012, 21:34
Du versuchst Kommazahlen in einem int-Datentyp zu speichern. Da int nur ganze Zahlen aufnehmen kann, wird alles hinterm Komma abgeschnitten. Du kannst float als Datentyp benutzen. So sollte es gehen:


#include <math.h>
float y,x;
float sensorbreite = 14.9;
int brennweite = 70;
float a = sensorbreite/2/brennweite;

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

void loop(){
y = atan(a);
x = 2*y*45/atan(1);
Serial.println(x);
}

Sim0n
28.02.2012, 21:40
0 kommt immer noch raus..

Aber eigentlich sollten nicht 0,106 herauskommen, sondern 12,5

Meine Grundformel war (2*ARCTAN(14,9/2/70))*45/ARCTAN(1)
Die Formel habe ich ja einfach in die Arduino Software übertragen....

Wie kann das denn kommen, dass da so eine Differenz entsteht?

Bytemuncher
28.02.2012, 21:43
0 kommt immer noch raus..

Aber eigentlich sollten nicht 0,106 herauskommen, sondern 12,5

Entschuldige, ich hatte nicht die gesamte Formel betrachtet sonder nur "sensorbreite/2/brennweite".
Das immer noch 0 raus kommt lag daran, dass ich übersehen habe das in x und y auch Kommazahlen gespeichert werden. Ist jetzt editiert, probier es noch mal.

Sim0n
28.02.2012, 21:49
Wundervoll, jetzt funktionierts perfekt.

Vielen Dank für Deine Mühe :)

Ich werde mich melden, falls ich wieder Hilfe zu dem Projekt benötige!

oberallgeier
28.02.2012, 22:30
... eigentlich sollten ... 12,5 ...
Wundervoll, jetzt funktionierts perfekt ...Wundert mich eigentlich, dass es (perfekt) funktioniert. Denn meine Controller rechnen unter C den atan zum Argument radiant aus. Das gäbe dann bei Deinem Beispiel mit dem Taschenrechner 12,15. Wenn ich Dein Beispiel
>> Grundformel war (2*ARCTAN(14,9/2/70))*45/ARCTAN(1)
mit dem atan-Argument als Grad (90-Grad-Basis) rechne, dann bekomme ich allerdings ebenfalls 12,15. Ist das nun ein seltsamer Zufall? Denn beispielsweise ist mit
radiant: 45/ARCTAN(1) = 57,296
dagegen mit
Grad: 45/ARCTAN(1) gleich 1

Sim0n
29.02.2012, 15:46
Wundert mich eigentlich, dass es (perfekt) funktioniert. Denn meine Controller rechnen unter C den atan zum Argument radiant aus. Das gäbe dann bei Deinem Beispiel mit dem Taschenrechner 12,15. Wenn ich Dein Beispiel
>> Grundformel war (2*ARCTAN(14,9/2/70))*45/ARCTAN(1)
mit dem atan-Argument als Grad (90-Grad-Basis) rechne, dann bekomme ich allerdings ebenfalls 12,15. Ist das nun ein seltsamer Zufall? Denn beispielsweise ist mit
radiant: 45/ARCTAN(1) = 57,296
dagegen mit
Grad: 45/ARCTAN(1) gleich 1

Huhu,

eben habe ich nochmal genau das gleiche Programm von gestern auf den Arduino geuploaded...und was passierte? - Fehler, die Bibliothek konnte nicht richtig gelesen werden und atan wurde nicht deklariert O______o
Habe dann einfach mal #include math.h rausgenommen...dann gings - komisch :D

Zu Dir Oberallgeier, doch es wird alles in jeder Form so ausgerechnet, wie es sein sollte - Gegengetestet mit einem, für diese Funktion, funktionierendem Programm.

Bis jetzt läuft also alles wieder glatt!