Hallo,
ich wollte Steuerungen entwickeln, die Sensordaten auswerten, mit Relais
und PWM ansteuern, evtl. noch eine Netzwerkanbindung bieten.
Erst wollte ich das mit dem ESP8266 bzw. ESP32 machen. Doch dann habe
ich gelesen, dass der ATmega dafür besser geeignet wäre – schon alleine
wg. dem Stromverbrauch.
Dann fand ich irgendwann heraus, dass der Arduino auf dem ATmegas
basiert.
So stellt sich mir die Frage: Was ist besser? ATmega direkt
programmieren, oder einen Arduino dafür nehmen. Von den I/Os wären beide
gleich geeignet.
Doch was sind die Vor- und Nachteile des ATmega oder Arduino?
Welchen sollte man nehmen für meinen oben genannten Zweck?
Programmieren würde ich gerne beide in C oder C++. Ich beherrsche beide
Programmiersprachen, bin Informatiker.
Zum ATmega habe ich folgendes rausgefunden:
* Benötigt einen Programmierer.
* Größere Auswahl an Chips als beim Arduino.
Die Eigenschaften des Arduino sind:
* Benötigt keinen Programmer.
* Vielzahl an Bibliotheken, z.B. für Ansteuerung von Displays
(vermutlich größere Auswahl an Bibliotheken, als für den ATmega).
Meine Fragen wären:
* Verbrauchen die ATmegas tendenziell weniger Strom als die Arduinos,
wenn der gleiche Chip zu Grunde liegt?
* Ist der Arduino langsamer als ein vergleichbarer ATmega?
Vermutlich gibt es da noch mehr Fragen, die ich stellen könnte, wenn ich
die entsprechende Erfahrung hätte.
Daher möchte ich Euch darum bitten, mir hier kurz zu schreiben, was in
dem Bezug wichtig wäre und worauf ich achten sollte. Ob ich den Arduino
oder den ATmega nehmen sollte. Was die Vor- und Nachteile sind.
Grüße
Artur
Kurz und knapp: den Prozessor direkt programmieren. Du lernst mehr und
hast mehr Kontrolle über Geschwindigkeit und erzeugst keinen Overhead.
Ausserdem - da du es richtig gelernt hast - kannst du auch schnell auf
einen anderen Controller umsteigen.
Arduino mag gut sein für Schüler, Hobbyisten die nicht tief einsteigen
wollen und Bastelprojekte.
Für alles andere macht man ein eigenes Board und programmiert den
Controller direkt. Tutorials gibt es im Netz zu Hauft.
Es gibt hier aber zwei Lager: Arduinoablehner und Befürworter.
Hardware: beim Arduino ist alles fertig auf einem Board. Das ist Vorteil
und Nachteil zugleich. Schnell erste Version, aber weiter braucht’s dann
zusätzliche Boards etc, mag ich persönlich nicht.
Software: viel Libraries und Online Ressourcen, sehr schnell was
zusammengefrickelt. Nachteil: zu gross, zu langsam, Bloatware,
intransparent, mag ich nicht so sehr.
Ich setze es immer nach Bedarf ein, mal ein schnelles Experiment Arduino
und Software, mal nur das Board und aber direkt programmiert, mal alles
selbst.
Prototyp in Arduino zum Proof of Concept und dann nochmal neu
stand-alone.
Artur K. schrieb:> Meine Fragen wären:>> * Verbrauchen die ATmegas tendenziell weniger Strom als die Arduinos,> wenn der gleiche Chip zu Grunde liegt?
Das hängt vom Board, also der Peripherie ab. Es gibt auch
Arduino-kompatible Boards/Klone die für Low Power designed sind.
Generell sind die meisten wohl nicht auf Low Power optimiert.
Aber wenn Du selbst eine Platine machst braucht die Peripherie auch
Strom. Nur wirst Du nur draufmachen was Du auch brauchst. Ein Arduino
hat oft einiges an „Komfort“ drauf, dass Du vielleicht nicht brauchst.
Und am Ende ist der Unterschied wahrscheinlich 20-40mA zwischen einem
für den Zweck entwickeltem Board und 30-60 für ein Arduino Board, je
nachdem was es für eines ist. Bei den meisten ist nicht so viel
unnötiges drauf.
>> * Ist der Arduino langsamer als ein vergleichbarer ATmega?
Der Prozessor nicht, wobei es davon anhängt welches Quartz auf dem Board
ist.
Aber die Software ist tendenziell langsamer, weil das Ecosystem Arduino
auf der Verfügbarkeit von vielen fertigen Libs basiert, die generell
eher universell = aufwändiger gemacht sind. Beispiel Ansteuerung von
Pins und PWM, da macht die Lib diverse Umschlüsselungen von Pinnummern
usw, das macht es mindestens intransparent, wenn nicht weniger
performant.
Muss nicht immer so sein, ist aber Prinzipbedingt sehr wahrscheinlich,
dass eine Lib langsamer ist als „direkt“.
Artur K. schrieb:> Doch was sind die Vor- und Nachteile des ATmega oder Arduino?
Was sind die Vor- und Nachteile des i5 oder des Thinkpads?
> Meine Fragen wären:>> * Verbrauchen die ATmegas tendenziell weniger Strom als die Arduinos,> wenn der gleiche Chip zu Grunde liegt?
Ja, wenn du nur den Chip mit den ganzen Arduino vergleichst. Nein, wenn
du die ganze Hardware, die auf dem Arduino schon drauf ist, mit
einbeziehst.
> * Ist der Arduino langsamer als ein vergleichbarer ATmega?
Von der Hardware her: Nein.
> Daher möchte ich Euch darum bitten, mir hier kurz zu schreiben, was in> dem Bezug wichtig wäre und worauf ich achten sollte. Ob ich den Arduino> oder den ATmega nehmen sollte. Was die Vor- und Nachteile sind.
Du solltest unterscheiden zwischen der Arduino-Hardware (ATMega plus
USB-Interface plus Spannungsregler plus Quarz und Kleinkram) und der
Arduino-Programmierumgebung. Du kannst sowohl die Arduino-Hardware ohne
die Arduino-Programmierumgebung programmieren (wie einen ganz normalen
ATMega) als auch mit der Arduino-Programmierumgebung erstellte Programme
auf einen nackten ATMega aufspielen.
Ich bin kein großer Freund der Arduino-Programmierumgebung - sie ist
IMHO (verglichen z.B. mit der avr-libc) relativ schlecht dokumentiert,
und wenn man nach etwas konkretem sucht, was in der Doku nicht enthalten
ist, findet man 1000 Blogs, die sowas ähnliches machen, aber die
konkrete Frage nicht beantworten. Das hat wohl damit zu tun, dass die
Umgebung sich an Anfänger richtet, die nicht mit bestimmten
Informationen "belästigt" werden sollen (z.B. welchen Datentyp eine
bestimmte Methode zurück gibt).
Was die Arduino-Hardware angeht: Wenn du (ziemlich genau) das brauchst,
was auf den Boards drauf ist, nimm sie. Wenn du eh Platinen machst, um
den Arduino um zusätzliche Hardware zu erweitern, aber dann nichts von
dem nutzt, was auf dem Arduino-Board mit drauf ist, dann kannst du auch
gleich einen "nackten" ATMega einlöten.
MfG, Arno
Arno schrieb:> Artur K. schrieb:> Ich bin kein großer Freund der Arduino-Programmierumgebung - sie ist> IMHO (verglichen z.B. mit der avr-libc) relativ schlecht dokumentiert,> und wenn man nach etwas konkretem sucht, was in der Doku nicht enthalten> ist, findet man 1000 Blogs, die sowas ähnliches machen, aber die> konkrete Frage nicht beantworten. Das hat wohl damit zu tun, dass die> Umgebung sich an Anfänger richtet, die nicht mit bestimmten> Informationen "belästigt" werden sollen (z.B. welchen Datentyp eine> bestimmte Methode zurück gibt).
Da muss ich ziemlich zustimmen. Mit der Arduino Software, den Libs und
Dokumentationen lernt man nicht ernsthaft programmieren.
Den Einstieg erleichtern sie aber schon.
Ich würde mich nach den ersten Experimenten dann mal um eine ernsthafte
IDE kümmern. (IDE = integrated development environment)
Von meiner Sicht aus ein paar Hinweise:
Für mich sind Pro-Minis die günstigste Bauform schlichthin. Wenn USB
notwendig ist, ist der NANO natürlich auch von Interesse.
Wenn Stromaufnahme ein Thema ist, löte ich beim Pro-Mini den
Spannungsregler ab und den Vorwiderstand zum Power LED. Zusammen mit
einen Optiboot Bootloader Ersatz für Watchdog Funktion verbraucht so
eine Platine im Schlafzustand unter 1uA.
Von den Arduino Libs verwende ich meist nur die EEPROM und UART
Funktion. Alles andere mache ich direkt in herkömmlicher Register
Konfigurierung Manier. Das ist ein guter Kompromiss weil diese Libraries
für mich ausreichend gut funktionieren.
So grottenschlecht ist das Arduino IDE auch wieder nicht. Wenn auch
nicht mit professionellen Features ausgestattet erfüllt es den ihm
zugestandenen Zweck durchaus.
Für meine Zwecke reicht das meist aus. Für total von Arduino unabhängige
Projekte nehme ich CodeVisionAVR der auch den Bootloader unterstützt.
Unabhängiger AVR-GCC ist natürlich auch kein Thema.
Die Pro-Mini Bords sind mir am liebsten weil sehr billig und immer auf
Vorat im "Zehner Pack" erstehe. Ich achte immer darauf nur eine gewisse
Version zu kaufen die noch einen TQFP uC hat und einen HC-49 Quarz
besitzt den man dann für Spezialzwecke leicht gegen andere Frequenzen
auswechseln kann und die A4-7 Pins immer an der selben Stelle liegen.
Die Resonatoren auf den anderen Bords läßt sich viel zu schwer
auswechseln. Auch hat man dann sehr viel mehr Auswahl in Qualität.
Abgesehen davon ist es angenehm wenn die Anschlüsse für A4,5,6,7 immer
an der gleichen Stelle liegen. Oft verwende ich diese Pro-Mini Bords als
Einsteckmodule in einer Hauptplatine und da ist es angenehm wenn die Pin
Zuordnungen konsistent sind.
Für Projekte mit SD Card und FAT32 nehme ich lieber eine Eigenbauplatine
mit dem ATMEGA1284P der dafür wegen der reicheren Ressourcen besser
geignet ist. Beim 328 verbraucht das FAT schon viel Platz.
Auch wäre der AT328PB eine viel bessere Lösung für viele Projekte weil
der 4 mehr Pins hat und ein zweites UART, I2C und SPI hat. Ich verstehe
wirklich nicht warum der 328PB und besser der ATMEGA1284P, immer noch
nicht der uC "of Choice" für die Arduino Platform geworden ist. Soviel
mehr kostet der 1284P auch nicht im Hobbybereich.
LCDs betreibe ich grundsätzlich nur über I2C um kostbaren IO zu sparen.
Auch verwende ich gerne IO-Expander um die Alternate Function Pins zu
reservieren.
Ein Nachteil der Normalen Pro-Minis ist, dass AVREF nicht gut zugänglich
ist, da ich manchmal lieber meine eigenen Spannungsreferenzen
anschliessen will.
Falls von Interesse: Ich habe mir übrigens meine eigenen Pro-Minis mit
dem 1284P und 328PB entwickelt mit 40 und 32 Pins. muß sie aber erst
machen lassen. Ich habe dann noch eine Huckepack Platine mir RTC, UPS
und uSD für Datenlogging Projekte entworfen. Für diese Familie von Bords
habe ich noch eine Universell Anschlussplatine entwickelt die alle
Pro-Mini, NANOS, und meine eigenen Versionen einstecken lassen. Drauf
ist noch ein 5V/3A Schaltregler für 10-32VDC Eingangsspannung, I2C Port,
ICSP Schnittstelle und Schraubanschlüsse für die IO Pins. Wenn alles in
Ordnung ist und Interesse da wäre, stelle ich die Design Files hier
herein sobald ich die Designs getestet habe. Auf dieser Hauptplatine
kann man auch direkt mit einem Programmiergerät den Bootloader oder
normal bequem Flashen.
Wenn wir schon bei konkreten Boards sind, ich nehme gerne die Pro Micro
Klone von Sparkfun oder anderen. Sehr günstig, sehr kompakt, nur das
nötigste drauf, per USB programmierbar (weil m32u4 Prozessor), aber auch
über die Pins direkt, mach ich mal so, mal so.
So klein, dass man ihn als Basis aufs Breadboard stecken kann und ein
Funkmodul daneben.
Siehe erstes Foto, Prototyp einer Funk-Heizungssteuerung. Aus Pro Micro,
Funkmodul auf Breadboard-Adapter und Opamp.
Am Pro Micro mein Programmieradapter, der ihn direkt programmiert, ohne
USB.
Hier war die Software auch mit den eigenen Libs in Eclipse gemacht, als
Vorbereitung der finalen Version.
Und ein Foto der dann später dafür erstellten Platine, die ist jetzt in
Einsatz.
Arduino scheint dann für mich einen unnötigen Zwischenschritt
darzustellen.
Besser gleich direkt die AVRs programmieren.
Warum ich auf Arduino kam, waren die verfügbaren Libs.
Ich möchte z.B. das TFT Display mit dem ILI9340C Controller ansteuern.
Libs finde ich nur für den Arduino.
Gibt es keine Libs, die den ILI9340C Controller ansteuern, die für die
Atmel AVRs entwickelt wurden? Das Diesplay wird über SPI mit dem
Mikrocontroller angebunden.
Arno schrieb:> Das hat wohl damit zu tun, dass die> Umgebung sich an Anfänger richtet, die nicht mit bestimmten> Informationen "belästigt" werden sollen
Ich kann nicht glauben, dass irgendjemand dich daran hindern würde, die
Doku zu verbessern. Und sehe auch keine unterschlagenen Rückgabetypen.
Arno schrieb:> sie ist> IMHO (verglichen z.B. mit der avr-libc) relativ schlecht dokumentiert,
Die avr-libc steht vollständig unter Arduino zur Verfügung.
Man kann sich auch durchaus darauf beschränken. Es besteht keinerlei
Notwendigkeit die Arduino "Features" zu nutzen.
Ansonsten gilt die C++ Sprachreferenz. Aktueller Stand C++11 (C++14
aktivierbar)
Und natürlich die Datenblätter der Komponenten.
Das sollte für den Anfang genug Lesestoff sein.
Die meisten Libs kommen von Fremdanbietern. Deren Qualität/Doku muss man
jeweils im konkreten Einzelfall betrachten. Das kann man nicht
verallgemeinern.
Artur K. schrieb:> Arduino scheint dann für mich einen unnötigen Zwischenschritt> darzustellen.
Oder, wie gesagt, als praktische Ergänzung.
> Besser gleich direkt die AVRs programmieren.>> Warum ich auf Arduino kam, waren die verfügbaren Libs.
Ja, kommt aber mit einem Preis. Viele Libs sind nicht so super.
Ist oft wie bei den Lösungen im Raspberry Pi Ökosystem ziemlicher
Frickelkram.
> Ich möchte z.B. das TFT Display mit dem ILI9340C Controller ansteuern.> Libs finde ich nur für den Arduino.>> Gibt es keine Libs, die den ILI9340C Controller ansteuern, die für die> Atmel AVRs entwickelt wurden? Das Diesplay wird über SPI mit dem> Mikrocontroller angebunden.
Man kann Arduino Libs auch auf neutral umbauen, wenn sie gut gemacht
sind.
Oder einfach als Doku für den eigenen Ansatz verwenden, wenn sie nicht
so gefallen.
Einen ISP Programmieradapter würde ich mir ohnehin zulegen, denn die
billigen Arduino Module aus China kommen manchmal ohne vorinstalliertem
Bootloader. Und dann brauchst du den ISP Programmieradapter.
Die kosten ja auch nicht viel. Ab 2 Euro ist man dabei, wenn es nicht
stört, dass sie nur für 5V geeignet sind. Manche haben einen Jumper zum
Umstellen auf 3V aber das betrifft nur die Versorgungsspannung, nicht
die Signale - ist insofern Quatsch. Vielleicht werden sie deswegen fast
verschenkt.
Stefan U. schrieb:> Einen ISP Programmieradapter würde ich mir ohnehin zulegen, denn die> billigen Arduino Module aus China kommen manchmal ohne vorinstalliertem> Bootloader. Und dann brauchst du den ISP Programmieradapter
Ein zweiter Grund ist den Bootloader gegen einen Optiboot BL
auszuwechseln damit der Watchdog mit dem BL wieder funktioniert. Die
Pro-Minis mit dem Original BL die ich immer bestelle hängen sich beim WD
Reset immer auf.
Conny G. (conny_g)
>Da muss ich ziemlich zustimmen. Mit der Arduino Software, den Libs und>Dokumentationen lernt man nicht ernsthaft programmieren.
Das sehe ich ein wenig anders: Man kann, wenn man's kann. Man kann
nicht, wenn man's nicht kann.
Ich habe schon für sehr viel Geld auf einem Arduino Software
geschrieben, es hängt immer vom Anwendungsfall ab.
Diese pauschale Aussgae "man kann damit nicht ernsthaft programmieren"
ist Käse und eher ein Ausdruck von Mittelmäßigkeit.
Und im Falle von Arthur würde ich sagen: spezifiziere mal Deine
Anforderungen an Speicherverbrauch und Geschwindigkeit genauer. Dann
kann man sehen, was der geeignete Weg ist.
Manfred schrieb:> Conny G. (conny_g)>>Da muss ich ziemlich zustimmen. Mit der Arduino Software, den Libs und>>Dokumentationen lernt man nicht ernsthaft programmieren.>> Das sehe ich ein wenig anders: Man kann, wenn man's kann. Man kann> nicht, wenn man's nicht kann.>> Ich habe schon für sehr viel Geld auf einem Arduino Software> geschrieben, es hängt immer vom Anwendungsfall ab.>> Diese pauschale Aussgae "man kann damit nicht ernsthaft programmieren"> ist Käse und eher ein Ausdruck von Mittelmäßigkeit.>> Und im Falle von Arthur würde ich sagen: spezifiziere mal Deine> Anforderungen an Speicherverbrauch und Geschwindigkeit genauer. Dann> kann man sehen, was der geeignete Weg ist.
Ich sagte, damit lernt man es nicht (gut). Wenn man es kann, bekommt man
mit dem Arduino auch gute Dinge hin.
Das ist wie die Diskussion PHP (oder auch JavaScript) sei pauschal
Schrott ggü Java, weil es keine konsistente stark typisierte etc
Programmiersprache sei.
Aber wenn ich guter Entwickler bin, kann ich mit PHP solide Dinge tun.
Wenn ich es aber nicht kann, lerne ich nicht notwendigerweise guten Stil
damit, weil es einiges nicht von Grund auf erzwingt.
Genauso ist es mit Arduino IDE und Libs auch.
Arduino F. schrieb:> Arno schrieb:>> Das hat wohl damit zu tun, dass die>> Umgebung sich an Anfänger richtet, die nicht mit bestimmten>> Informationen "belästigt" werden sollen>> Ich kann nicht glauben, dass irgendjemand dich daran hindern würde, die> Doku zu verbessern. Und sehe auch keine unterschlagenen Rückgabetypen.
Zum Beispiel hier:
https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/
Sind HIGH und LOW magische Bezeichnungen für true und false? Für 0 und
1? Für 17 und 4? Oder - das Beispiel weist den Rückgabewert einem
vermutlich 16bittigen Integer zu - für -32768 und 32767? Wenn ich den
Zustand eines Pins speichern will wie es z.B. PeDa in seinen
Entprell-Routinen macht, was brauche ich dann mindestens für einen
Datentyp?
Warum steht da nicht "bool digitalRead(uint8_t pinNumber)" oder
meinetwegen "pinValue digitalRead(pinDesignation pinNumber)" mit Links,
die zur Definition von pinValue und pinDesignation führen? Dann kann man
sich den größten Teil des Textes auf der Seite sparen.
Klar kann ich im Quelltext nachsehen, mir einen github-Account zulegen
und die Doku anpassen. Ich kann es aber auch lassen und die Zeit für
mein Projekt verwenden - oder damit, mich hier über Arduino zu ärgern ;)
und andere zu informieren, wo ich die Schwachstellen sehe.
> Arno schrieb:>> sie ist>> IMHO (verglichen z.B. mit der avr-libc) relativ schlecht dokumentiert,> Die avr-libc steht vollständig unter Arduino zur Verfügung.> Man kann sich auch durchaus darauf beschränken. Es besteht keinerlei> Notwendigkeit die Arduino "Features" zu nutzen.
Klar, dann kann ich aber auch die ganze Arduino-Umgebung weglassen.
MfG, Arno
> ich wollte Steuerungen entwickeln, die Sensordaten auswerten, mit Relais> und PWM ansteuern, evtl. noch eine Netzwerkanbindung bieten.
Wenn ich für die .. Netzwerkanbindung mit der seriellen Schnittstelle
auskomme so geht Arduino schon sehr gut. Sensordaten auswerten und
Relais ansteuern wird nicht sehr schnell notwendig sein (10 ms ???)
Arduino Vorteil -- man kommt schnell zu Ergebnissen. ... und der
Quellcode ist nahezu Prozessorunabhängig wenn man die Bibliotheken
verwendet.
Arno schrieb:> Sind HIGH und LOW magische Bezeichnungen für true und false? Für 0 und> 1? Für 17 und 4? Oder - das Beispiel weist den Rückgabewert einem> vermutlich 16bittigen Integer zu - für -32768 und 32767? Wenn ich den> Zustand eines Pins speichern will wie es z.B. PeDa in seinen> Entprell-Routinen macht, was brauche ich dann mindestens für einen> Datentyp?
Wie gesagt... Ändere es, wenn es dir nicht passt.
Und wie es geht, weißt du ja, wie ich sehe.
HIGH und LOW sind übrigens in der Referenz aufgeführt
https://www.arduino.cc/reference/en/
Genauer:
https://www.arduino.cc/reference/en/language/variables/constants/constants/
Dort ist das Verhalten beschrieben.
(aber soweit bist du beim lesen offensichtlich noch nicht gekommen)
Arno schrieb:> oder damit, mich hier über Arduino zu ärgern ;)
Wenn es dir Spaß macht....
Aber es darum anderen schlecht reden, naja.
--
Irgend wie seltsam, dass du dich so von HIGH und LOW so dermaßen
verwirren lässt....
Mein Tipp: Verwende bool als Datentype, wenn du Dinge verwendest die
sich wie Boolean verhalten sollen.