PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rechnen mit dem Arduino



Unregistriert
25.02.2016, 21:09
Hallo,

ich bin sehr neu in dieser Thematik und möchte gerne wissen, ob man mit der Programmiersprache für den Arduino auch rechnen kann; wie z.b. quadrieren, Wurzel ziehen, sin, cos? Ziel: ich möchte aus der Info von Winkeln und Längen eines Armes mit 3 Gelenken eine Position ausrechnen!!

Wenn ja, wo kann ich dazu eine Anleitung finden?

mfG und Dank

Thie
26.02.2016, 06:23
Servus,
von Hause aus kann das 'C' nicht, aber 'C' ist mächtig genug um solche Berechnungen zu implementieren.
Doch das muss man nach über 40 Jahre nicht mehr selber machen, sondern benützt die Standard Bibliothek <math.h>.
Arduino nimmt dir auch das noch ab und du kannst die mathematischen und trigonometrischen Funktion einfach verwenden.

In der Arduino Referenz solltest du alles finden: https://www.arduino.cc/en/Reference/HomePage
pow(), sqrt(), sin(), cos()....

Unregistriert
26.02.2016, 06:56
Prima, Herzlichen Dank!

vG

oberallgeier
26.02.2016, 08:49
.. möchte gerne wissen, ob man mit der Programmiersprache für den Arduino auch rechnen kann; wie z.b. quadrieren, Wurzel ziehen, sin, cos? ..Können ist die eine Seite, Laufzeit die andere.

Algebraische Funktionen (z.B. Wurzel) und besondes transzendente Funktionen (Beispiel trigonometrische und Arcusfunktionen) sind sehr rechenzeitintensiv. Ich hatte mich (zusammen mit einem Kollegen) mal bei der Arcusberechnung auf Mikrocontrollern mit diesem Gebiet auseinandergesetzt und einige Beispiele durchgerechnet. Dabei fanden wir, dass Näherungsfunktionen - !!KEINE Tabellen!! - bis zu fünfzig Prozent der Zeit einsparen können - und einiges an Länge des zugehörigen Maschinencodes. Beispiel siehe hier (klick). (http://forum.diegeodaeten.de/index.php?mode=thread&id=2946#p2983)

Fazit: Wenns zeitlich keinerlei Rolle spielt (das gilt m.E. keinesfalls bei Roboterarmen - wo noch dazu meherere Gelenke mit entsprechend aufwendigen Rechnungen behandelt werden müssen) dann macht das alles kein Problem. Andernfalls KÖNNTEN vorberechnete Tabellen eine Behelfslösung sein. In prähistorischen Zeiten der Mikrorechner (z.B. Z80 mit 2 .. 4 MHz) hatte ich diese Rechnungen in einen Rechenknecht (sprich externer Arithmetikprozessor) ausgelagert, aber das ist eine ganz andere Baustelle.

HaWe
26.02.2016, 10:21
Arduinos sind nicht nur AVRs, Arduinos sind auch ARMs, und die haben alle Geschwindigkeit der Welt für sowas.
ich habe aber auch mit meinen ganzen AVRs (Nanos, Megas) noch nie Rechenzeit-Probleme gehabt.
Hier ist ein speed Test u.a. auch für Int und Float Arithmetik auf allen möglichen Plattformen, u.a. auch Arduino megas und Dues:

http://www.mindstormsforum.de/viewtopic.php?p=64772#p64772



HaWe brickbench © test (time: ms) Arduino Arduino Arduino PJRC Teensy Raspberry Pi
Typ, OS, FW, PL, API Mega2560 Due Zero 3.1 B+(2B)/Raspbian
MCU, cpu-Takt AVR/16MHz ARM M3/84Mhz ARM M0/48MHz ARM M4/72MHz 800-1000MHz
Firmware/vers.,Pr.Lang. IDE 1.6x C++ IDE 1.6x C++ IDE 1.6x C++ IDE 1.6x C++ gnu C++, Geany
LCD / TFT (true color) ILI9225 UTFT ILI9341_due (Adafr.ILI9340) ILI9327 NC HDMI,full-HD
screen size tested 240*176 320*240 320*240 320*240 1080*620
================================================== ================================================== ==========
0 100000 integer add/subtr 129 8 15 5 1
1 52000 integer multiply/division 1219 7 102 5 3
2 5000 float operations 326 107 397 92 (2)-13
3 Mersenne Tw. PRNG (&,^,>>,<<) 313 7 36 4 2
--------------------------------------------------------------------------------------------------------------
4 matrix algebra (prod/determ.) 244 23 92 19 1
5 int array sort [500] 1366 171 379 110 (46)-88


float test_float_math() {
float s = PI;
int y;

for (y = 0; y < 1000; ++y) {
s *= sqrt(s);
s = sin(s);
s = exp(s);
s *= s;
}
return s;
}

5x float-ops in dieser loop, die dann 1000x,
also 5000 float operations
in 326 ms auf dem Mega,
und 107 ms auf dem Due...: na und ?

in oberallgeiers prähistorischer Zeit war das vlt mal anders... :-/

Peter(TOO)
27.02.2016, 17:57
Hallo HaWe.

5x float-ops in dieser loop, die dann 1000x,
also 5000 float operations
in 326 ms auf dem Mega,
und 107 ms auf dem Due...: na und ?

in oberallgeiers prähistorischer Zeit war das vlt mal anders... :-/

Was sich nicht geändert hat ist, dass ein FPU etwa 100x schneller ist als eine Emulation.

MfG Peter(TOO)

HaWe
27.02.2016, 21:01
aja, aber was soll das?
hast du nen Arduino mit FPU ?
nein.
Und wenn ich mit komplexen Zahlen rechnen oder Matrizen-Inverse oder FFTs rechnen muss, geh ich halt auf nen Teensy oder nen Raspi oder nen BBB!
Bevor ich anfange, für Sinus, Cosinus, atan2 und e^x mit look-up Tabellen zu arbeiten - nee danke.

Aber auch ohne FPU sind sie schnell genug, zumindest für Ottonormalverbraucher (siehe Benchmarks) -
und natürlich ganz besonders dann, wenn sich ein Anfänger überlegt, ob man "überhaupt" damit "rechnen" könne... ;)
Und nochwas:
WENN Arduinos durch irgendwas ausgebremst werden, dann nur dadurch, dass sie besch****n lahme Displays haben (wie mit UTFT libs) und wenn sie kein Multitasking haben, um die langsamen Sachen nebenher zu erledigen, damit die schnellen in ihren eigenen Tasks ungebremst sind.

AVRs aber halte ich sowieso für Schnee von gestern.
max. 8kB RAM, lachhaft, und dann noch die veralteten 5V-Signal-Level, die alle neuen Geräte kaputt machen ohne Levelshifter... was ein Umstand!

Arduino-DUE-Klone (M3) gibts schon für 13 EUR, und nen Original (!!) Arduino-Zero M0 habe ich mir gerade für 20 EUR bestellt.
Das ist eher der neue Standard.

Die Raspi quadcores sind dann eher für anspruchsvolle Dinge, samt FPU.