Steuerung des Arduino via Excel (VBA) möglich?

Also Firmata scheidet schonmal aus - da habe ich ja nur die Möglichkeit den Port auszuwählen und Low oder High vorzugeben (oder hab ich das falsch verstanden)?

Mir geht es hier jetzt auch nicht darum von euch die ganzen möglichen Programmiersprachen aufgelistet zu bekommen.

Ich möchte mir schnell und einfach eine Oberfläche zur Eingabe/Änderung der Parameter erstellen.

Einfach und schnell ist definitiv Processing. Bei allen anderen ist die Lernkurve und der Aufwand deutlich höher.

markbee:
Einfach und schnell ist definitiv Processing.

Und damit kann ich mir eine "Eingabeoberfläche" basteln? Also mit der Software die ich mir bei arduino.cc runergeladen habe kann ich ja die "Sketche" schreiben, die ich dann auf das Board lade um etwas auszuführen. Und mit dieser Software kann ich mir auch eingene Eingabeoberflächen gestalten? Wie? Habe dazu noch nichts im www gefunden. Da ist immer die Rede von ... GUI also "Ein Grafisches User Interface" was z.B. mit MS VB 2010 "geschrieben" ist. Genau so etwas möchte ich.

obiwan:
Also Firmata scheidet schonmal aus - da habe ich ja nur die Möglichkeit den Port auszuwählen und Low oder High vorzugeben (oder hab ich das falsch verstanden)?

Mir geht es hier jetzt auch nicht darum von euch die ganzen möglichen Programmiersprachen aufgelistet zu bekommen.

Ich möchte mir schnell und einfach eine Oberfläche zur Eingabe/Änderung der Parameter erstellen.

Ich glaube hier gibt es noch ein Verständnisproblem.
Eigentlich brauchst Du 2 Programme.

Ein Programm auf dem PC, mit Eingabefeldern für die Steuerzeiten Deiner Ventile und einem großen roten "START" Button.

Ein weiteres Programm brauchst Du auf dem Arduino, das die vom PC-Programm gelieferten Befehle umsetzt. (z.B. Firmata).

Die Frage dabei ist, in welchem Programm die Steuerlogik steckt. Steckt die Logik im PC-Programm, dann kannst Du Firmata verwenden, denn das Timing wann welches Pin geschaltet werden soll, macht dann das PC-Programm. Vorteil ist, das Du auf dem Arduino auf eine fertige Lösung setzen kannst. Nachteilig könnte sein ein exaktes Timing zu erreichen, da die Befehle seriell übermittelt werden, was Zeit kostet und hier ggf. schon Unterschiede im ms Bereich möglich wären.

Zweite Möglichkeit ist, das die Logik im Arduino-Programm steckt. Dann musst Du das vermutlich auch selbst schreiben. Du brauchst dann ein sinnvolles Protokoll, mit dem Du Steuerdaten übermittelst: z.b. als String "V1,30,35:V2,40,45:V3,50,55,K1:60" "Vx" ist jeweils das Ventil Nummer x mit den beiden Steuerzeiten in ms. "Kx" ist dann die entsprechende Kamera. Den Steuerstring musst Du dann auf dem Arduino in die entsprechende Werte zerlegen.
Vorteil dieser Lösung ist, das Du vom PC-Programm unabhängig bist. Denn wer am Ende den Steuerstring über die serielle Schnittstelle schickt ist egal (im einfachsten Fall kommen die Daten über den seriellen Monitor der IDE). Ein weiterer Vorteil ist, das Dein Timing exakter ist, weil es nicht von irgendeiner Kommunikation abhängt. Nachteil ist die größere Komplexität des Arduinoprogramms.

Mario.

obiwan:
Und mit dieser Software kann ich mir auch eingene Eingabeoberflächen gestalten? Wie? Habe dazu noch nichts im www gefunden. Da ist immer die Rede von ... GUI also "Ein Grafisches User Interface" was z.B. mit MS VB 2010 "geschrieben" ist. Genau so etwas möchte ich.

http://playground.arduino.cc/interfacing/processing
Hier wird die Integration von Arduino und Processing beschrieben.
und hier: http://raumfuehler.andreasmuxel.com/index.php/arduino-und-processing/kommunikation-arduino-board-zu-processing/
oder hier: Ältere c't-Projekte | c't Magazin

Also vom Ablauf her habe ich mir das so vorgestellt:

  1. Eingabe der entsprechenden Parameter (ms wann welches Ventil öffnet/schließt und die Kamera auslöst) über die "GUI"
  2. "Start"-Knopf drücken
  3. Datenübertragung an das Board
  4. x ms warten (damit das Programm vollständig auf dem Board geladen wurde)
  5. Ventil 1 öffnet für y ms
  6. Ventil 2 öffnet für y ms
    ...
  7. Kamea löst aus (blitz wird über die Kamera gesteuert weshalb ich diese nicht über das Board steuere)
  8. Programmende (der Arduino mach nix mehr und warte bis das nächste mal der "Start"-Knopf gedrückt wird)

Natürlich kann ich das ganze auch über die Arduino-Software steuern und jedesmal den "Sketch" anpassen und dann übertragen.
Aber mit einer Eingabeoberfläche währe das ganze viel "schöner". Nur möchte ich dafür nicht extra ein EDV-Studium absolvieren müssen :blush:

obiwan:
Also vom Ablauf her habe ich mir das so vorgestellt:
...
3. Datenübertragung an das Board
4. x ms warten (damit das Programm vollständig auf dem Board geladen wurde)
...

Natürlich kann ich das ganze auch über die Arduino-Software steuern und jedesmal den "Sketch" anpassen und dann übertragen.
Aber mit einer Eingabeoberfläche währe das ganze viel "schöner". Nur möchte ich dafür nicht extra ein EDV-Studium absolvieren müssen :blush:

Genau darum geht es. Du sollst ja nicht jedesmal den Sketch anpassen und damit jedesmal ein angepasstes Programm auf den Arduino laden, sondern an ein auf dem Arduino laufendes Programm nur die Daten übergeben.

Das kann im einfachsten Fall sogar der serielle Monitor der IDE sein. Dort kannst Du ja einen String an den Arduino über die serielle Schnittstelle schicken.

mkl0815:
... sondern an ein auf dem Arduino laufendes Programm nur die Daten übergeben.

Nein ich glaube wir reden aneinander vorbei...

Mal "ganz einfach" erläutert:

Ich schreibe einen "Sketch" bei dem folgendes passieren soll (mit einfachsten Zeit-Beispielen):

Nachdem ich einen "Auslöser" (nich am PC, nicht an der Kamera sondern z.B. an Pin 13 angeschlossen) drücke

öffnet nach 3 sec Ventil 1 für 1 sec
öffnet nach 4 sec Ventil 2 für 1 sec
öffnet nach 5 sec Ventil 3 für 1 sec
löst die Kamera nach 6 sec aus

Nachdem der Sketch geschrieben ist lade ich ihn auf das Board und wenn ich jetzt den "Auslöser" drücke
passiert das oben angegebene.
Wenn ich den "Auslöser" erneut drücke passiert das ganze noch einmal von vorne.
Das ganze passiert jedesmal wenn ich den "Auslöser" drücke.

Wenn ich jetzt die Parameter änder möchte, damit die Kamera nicht nach 6 sondern erst nach 7 sec
auslöst, muss ich den "Sketch" anpassen, ihn neu auf das Board laden und wenn ich dann den
"Auslöser" drücke löst die Kamera nach 6 sec aus (die Ventile öffnen wie gehabt).

Was ich nun möchte ist, dass ich nicht im "Sketch" den Wert von 6 auf 7 für die Kameraauslösung
anpasse, sondern ich möchte eine "Eingabeoberfläche" mit einem "Feld" für den "Wert" der Kamera
haben den ich anpasse und wenn ich dann auf der "Eingabeoberfläche" den "Start-Knopf" drücke
passiert nix anderes als wenn ich den "Sketch" auf das Board übertrage.

Also die "Oberfläche" soll mir lediglich die Veränderung der "Variablen Werte" erleichtern.

Um das ganze Geraffel um Kommunikationsprotokolle und die Programmierung auf zwei Systemen (Windows und Arduino) zu umgehen habe ich ja (vielleicht in weiser Voraussicht ;)) bereits diesen Vorschlag gemacht:

sth77:
Extra einen PC hinzustellen finde ich etwas übertrieben. Das Ganze lässt sich doch wunderbar mit einem 4zeiligen LCD und ein paar Tastern erledigen, einschl. Speicherung der Parameter im Eeprom usw..

Wird nach meinem Dafürhalten etwas einfacher.

Ich glaube da fehlen noch einige Kenntnisse. Du versuchst Probleme zu umgehen, die prinzipiell keine sind. Wenn du deine Zeiten als Variablen definierst, sind sie auch frei wählbar - vom reinen Hochladen in den Arduino werden sie nicht zu Konstanten. Du kannst die Variablen mit einem bestimmten Wert initialisieren, der kann sich aber zur Laufzeit ohne Weiteres ändern, per Knopfdruck oder durch andere Einflüsse. Eine permanente Neuprogrammierung ist gar nicht nötig.

Nein, wir reden nicht aneinader vorbei.

Natürlich ist auf dem Arduino ein Sketch, der die Ventile und die Kamera bedient. Was Du willst, ist aber, das die Parameter für die Steuerung (wann welches Ventil und wann welche Kamera auslöst) anpassen, und zwar OHNE das Du den kompletten Sketch neu hochladen musst.
Genau davon rede ich ja die ganze Zeit.

Im Prinzip macht Dein Sketch auf dem Arduino 2 Dinge.

1.) Er wartet darauf, das der "Auslöser" an Pin 13 gedrückt wird, dann spult er sein Steuerprogramm ab (Ventile, Kamera ...). Danach wartet er wieder auf den Auslöser.
2.) Zusätzlich zum Warten auf den Auslöser, prüft der Sketch regelmäßig die serielle Schnittstelle, ob da Daten übertragen wurden. Wenn ja, nimmt er die Daten an und ersetzt damit die bisherigen Stuerdaten.

Das ist der Teil auf dem Arudino.

Dein PC-Programm macht dann nix anderes als über ein Formular (egal in welcher Sprache) die Daten eingeben zu lassen und beim Drücken auf den "Start"-Knopf die Daten seriell an den Arduino zu schicken.

Ich glaube mit einem "kleinen" Display wird das nicht zu realisieren sein.

Ich möchte z.B. nicht immer das Ventil 1, Ventil 2 und Ventil 3 öffnen.

Ich möcht auch, dass z.B. "nur" Ventil 1 angesteuert wird und z.B. nach 3 sec. für 1 sec. öffnet und dann nach 4 sec. für 2 sec. öffnet.

Also alle Parameter sollen änderbar sein - auch die Anzahl und ansteuerung der Ventile.

Ich möchte z.B. auch zwei Kamras anschließen können. Mal will ich das beide Kameras angeschlossen sind und auch beide auslösen,
mal soll nur eine auslösen, mal ist nur eine angeschlossen, ...

Das geht wohl kaum über ein kleines Display mit 4 Zeilen und 4 Einstellknöpkes.

Anbei mal eine Grafik eines "fertigen" Programmes das so aussieht wie ich mir das vorstelle

mkl0815:
Dein PC-Programm macht dann nix anderes als über ein Formular (egal in welcher Sprache) die Daten eingeben zu lassen und beim Drücken auf den "Start"-Knopf die Daten seriell an den Arduino zu schicken.

Ja genau!

Und wenn das egal ist, mit welcher "Sprache" dieses "Formular" geschrieben wurde, dann müsste das doch auch mit Excel-VBA gehen (um auf die eingangs gestellte Frage zurückzukommen)? Und wie kann ich das ganze nun realisieren, dass das "Formular" mit dem Board "kommuniziert"?

Diese Darstellung war aber nicht Teil der ursprünglichen Fragestellung. :smiley: Wie soll man als Leser des Threads bzw. auch Helfer darauf kommen?
Ich denke, du verrennst dich da schon etwas, das wird fürs erste Projekt zu viel, was dann wiederum in Frust endet und in der Regel mit der Aufgabe des Projektes. Wäre schade drum.

sth77:
Diese Darstellung war aber nicht Teil der ursprünglichen Fragestellung.

Ich dachte das Bild in #4 währe eindeutig gewesen?

Natürlich kommt erstmal Schritt 1 = Hardware
Dann Schritt 2 = Software = Sketch schreiben auf das Board laden
Und zum Abschluss käm dann noch die GUI zur Steuerung der Parameter.

Nur wenn Schritt 2 und 3 z.B. nur durch ein "komplettes" C Programm zu realisieren währen, oder schon bei Schritt 2 der Schritt 3 mit berücksichtig werden muss,
währe es doppelte arbeit die Schritte 2 und 3 nacheinander zu lösen.

obiwan:
Ich dachte das Bild in #4 währe eindeutig gewesen?

Die neue Darstellung ist aber ungleich komplexer, und nicht mehr so leicht auf einem zeichenbasierten LCD umsetzbar wie ich das im Vorfeld dachte. Schwamm drüber, wenn es von Anfang an so kompliziert werden soll, musst du dir ein Protokoll überlegen, welches wirklich jede Einstellmöglichkeit abdeckt. Dieser Steuerungssatz wird dann über die serielle Schnittstelle übertragen, muss exakt empfangen, interpretiert und richtig ausgegeben werden. Hinweise zu dieser Herangehensweise hat mkl0815 ja bereis gegeben.

hi,

zum verständnis für obiwan. könnte schnell mal jemand die zehn zeilen für den arduino schreiben, damit man dann in den serial monitor
5
enter
800
enter
eingibt, und dann die led13 5mal für 800ms aufblinkt? ich sitz in der firma und hab' keinen arduino hier.
es ist glaube ich noch ein großes verständnisproblem. und damit wäre dann einiges klarer. eine gui statt des serial monitors ist dann der zweite schritt. die kann er sich in vba schreiben.

gruß stefan

sth77:
Hinweise zu dieser Herangehensweise hat mkl0815 ja bereis gegeben.

Ja aber wie geht's nun weiter? Geht das mit Excel oder brauche ich ein anderes Programm um so ein "Formular" zur Übertragung der Daten vorzunehmen?

Ach ja, die komplexe Darstellung vier Beiträge zuvor sollte nur darstellen wie ich mir das vorstelle. So komplex brauche ich das nicht. Mir geht es nur um die Auswahlmöglichkeit der Ventile und die Zeitangaben.

Hier mal ein kleiner Beispielcode zur Verdeutlichung:

int led1 = 12;
int led2 = 13;
int pin    = 7;
int value = 0;

void setup()
{                
   pinMode(led1, OUTPUT);     
   pinMode(led2, OUTPUT);     
   pinMode(pin, INPUT);
}

void loop()
{
   vaule = digitalRead(pin);
   digitalWrite(led1, value);
   delay(1000);
   digitalWrite(led2, value);
}

Wenn ich den Taster an Pin 7 gedrückt halte leuchte die LED an Pin 12 auf,
dann kommt eine Sekunde Pause und dann leuchtet die LED an Pin 13 auf.

Ich möchte nun die Pausenzeit über ein "Formular" ans Board schicken können.

Schau dir doch mal das Beispiel ReadASCIIString an.

Da passiert genau das.

du gibt auf dem PC einen Wert ein, und der Arduino ändert daraufhin seine Werte.

Du kannst das auch mit nur einer LED machen, am allereinfachsten mit der LED an Pin 13, die schon auf dem Board ist, dafür mußt den Sketch anpassen.

der Zweite Schritt ist dann erst, auf dem PC eine grafische Benutzeroberfläche zu programmieren, die die entsprechenden Daten sendet.

Auf die Gefahr hin, mich zu wiederholen:
Fang klein an.
Kleine Codestückchen, mit kleiner Hardware, das dann Schrittweise erweitern.

Wenn du gleich alles auf einmal machen willst, dann wirst du verzweifeln und alles hinwerfen.

Gunther