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

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

Du bist doch der VBA-Fuzzy, obiwan!

Frage an den Excel-VBA Experten: gibt es ein ActiveX control, das serielle Schnittstelle kann:

  • Herausfinden welche es Ports gibt
  • Port öffnen
  • Baudrate einstellen
  • Text senden.

Und kannst du das in deine ExcelUmgebung integrieren ?

Sonst steigst du halt mal von VBA auf VB.net um. Da ist sowas auf jeden Fall drin.

BÖMISCHE DÖRFER DAS SIND FÜR MICH... :blush:

Ich bauche nur den Hinweis zur Verbindung beider Welten.

Hinweis zur Verbindung beider Welten

Hast du schonmal google nach
"vba serielle schnittstelle ansprechen"
gefragt?

Der Arduino ist eine serielle Schnittstelle ( COM4 oder so, wie du es auch in der IDE / SerialMointor siehst. )

Danke für den Tip! Werde mich da mal einlesen.

Es gibt ein ActiveX -> http://www.parallax.com/tabid/393/Default.aspx
Das ist zwar mehr zur Datenerfassung gedacht bietet aber auch einige Möglichkeiten der Rückmeldung.
Das habe ich für mein Projekt Pulsmonitor Ding des Monats 11/2012 – Biofeedback mit Arduino | DingFabrik Köln e.V. | Fritz-Voigt-Straße 1 | 50823 Köln benutzt.

So, hier habe ich jetzt mal das "einfache" Programm zur Steuerung des Arduino:

// Programm zur Steuerung von 3 Ventilen und 2 Kameras

int VENTIL1 = 2;     // Pin 2 = Ventil 1
int VENTIL2 = 3;     // Pin 3 = Ventil 2
int VENTIL3 = 4;     // Pin 4 = Ventil 3

int KAMERA1 = 8      // Pin 8 = Kamera 1 (Nikon D700)
int KAMERA2 = 9      // Pin 9 = Kamera 2 (Nikon D90)

int START = 13       // Pin 13 = Startknopf

void setup()
{
   pinMode(VENTIL1, OUTPUT);
   pinMode(VENTIL2, OUTPUT);
   pinMode(VENTIL3, OUTPUT);
   pinMode(KAMERA1, OUTPUT);
   pinMode(KAMERA2, OUTPUT);
   pinMode(START, INPUT);
}

void loop()
{
   // hier muß der “START-Befehl” erfolgen

   Delay3000;			// Pause für drei Sekunden

   // Steuerung Ventil 1
   digitalWrite(VENTIL1, HIGH);	// Ventil 1 öffnen
   delay 1000;			// Pause für eine Sekunde
   digitalWrite(VENTIL1; LOW);	// Ventil 1 schließen
   delay 1000;			// Pause für eine Sekunde

   // Steuerung Ventil 2
   digitalWrite(VENTIL2, HIGH);	// Ventil 2 öffnen
   delay 1000;			// Pause für eine Sekunde
   digitalWrite(VENTIL2; LOW);	// Ventil 2 schließen
   delay 1000;			// Pause für eine Sekunde

   // Steuerung Ventil 3
   digitalWrite(VENTIL3, HIGH);	// Ventil 3 öffnen
   delay 1000;			// Pause für eine Sekunde
   digitalWrite(VENTIL3; LOW);	// Ventil 3 schließen
   delay 1000;			// Pause für eine Sekunde


   // Steuerung Kamera 1+2
   digitalWrite(KAMERA1, HIGH);	// Kamera 1 auslösen
   digitalWrite(KAMERA2, HIGH);	// Kamera 2 auslösen
}

Da habe ich ein paar Fragen zu:

  1. Wie genau muss der "START"-Befehl aussehen, um das ganze durch Drücken des Buttons in Bewegung zu setzen?
  2. Werden so wie im Programm angegeben beide Kameras auch gleichzeitig ausgelöst?
  3. Was wenn die Kamera schon vor Öffnen des Ventil 3 auslösen soll? Den Abalauf dann komplett umzuschreiben währe sehr aufwendig.
    Kann man das irgendwie geschickter lösen, dass nicht "starr" Ventil 1 dann 2 dann 3 dann Kamera 1+2 im "Programmablauf" stehen
    sondern irgedwie mit Variablen o.ä. so das man einen "Zeitablauf" vorgeben kann?

erni-berni:
Das habe ich für mein Projekt Pulsmonitor Ding des Monats 11/2012 – Biofeedback mit Arduino | DingFabrik Köln e.V. | Fritz-Voigt-Straße 1 | 50823 Köln benutzt.

Hmm... soweit ich das sehen kann liest du aber nur die Werte vom Arduino aus - ich will ja genau den anderen Weg gehen... aber die "zündende" Idee ist mir noch nicht gekommen :blush:

obiwan:

  1. Wie genau muss der "START"-Befehl aussehen, um das ganze durch Drücken des Buttons in Bewegung zu setzen?

Schau dir mal die Beispiele "Button" und "Debounce" an. Da wird das beschrieben.

obiwan:
2. Werden so wie im Programm angegeben beide Kameras auch gleichzeitig ausgelöst?

ja. Mit wenigen µs Verzögerung.

obiwan:
Kann man das irgendwie geschickter lösen, dass nicht "starr" Ventil 1 dann 2 dann 3 dann Kamera 1+2 im "Programmablauf" stehen
sondern irgedwie mit Variablen o.ä. so das man einen "Zeitablauf" vorgeben kann?

Natürlich.
Schau' dir mal das Beispiel "BlinkWithoutDelay" an.
Da wird die Methode beschrieben.
Im Prinzip sollte das so gehen:
Bei Knopfdruck millis() merken.

startzeit = millis();

Dann für die einzelnen Aktionen abfragen:

if (startzeit + Ventil1zeit < millis()){
  digitalWrite(VENTIL1, HIGH);
}

Wie gesagt, im Beispiel BlinkWithoutDelay ist der Ansatz beschrieben.

Die Zeiten mußt du dir alle als Variable definieren.

unsigned long Ventil1ein = 5000;
unsigned long Ventil1aus = 6000;
unsigned long Ventil2ein = 5500;
unsigned long Ventil2aus = 6700;
etc

.
Die Zeiten am besten immer absolut von Start an gerechnet, muß aber nicht sein, dann musst du halt addieren.

Warum unsigned long und nicht "nur" long?

Währ das Proggi so jetzt "richtig" im Ansatz:?

// Programm zur Steuerung von 3 Ventilen und 2 Kameras

int VENTIL1 = 2;     // Pin 2 = Ventil 1
int VENTIL2 = 3;     // Pin 3 = Ventil 2
int VENTIL3 = 4;     // Pin 4 = Ventil 3

int KAMERA1 = 8    // Pin 8 = Kamera 1 (Nikon D700)
int KAMERA2 = 9    // Pin 9 = Kamera 2 (Nikon D90)

int START = 13       // Pin 13 = Startknopf

int VALUE = 0

unsigned long VENTIL1_EIN = 5500;
unsigned long VENTIL1_AUS = 6000;
unsigned long VENTIL2_EIN = 6500;
unsigned long VENTIL2_AUS = 7000;
unsigned long VENTIL3_EIN = 7500;
unsigned long VENTIL3_AUS = 8000;
unsigned long KAMERA1_EIN = 7500;
unsigned long KAMERA2_EIN = 7500;

void setup()
{
   pinMode(VENTIL1, OUTPUT);
   pinMode(VENTIL2, OUTPUT);
   pinMode(VENTIL3, OUTPUT);
   pinMode(KAMERA1, OUTPUT);
   pinMode(KAMERA2, OUTPUT);
   pinMode(START, INPUT);
}

void loop()
{
   VALUE = digitalRead(START)

   if (VALUE = 1)
   {
      Delay3000;
      STARTZEIT = millis();
         if (STARTZEIT + VENTIL1_AN == millis())
         {
         digitalWrite(VENTIL1, HIGH);
         }
         if (STARTZEIT + VENTIL1_AUS == millis())
         {
         digitalWrite(VENTIL1, LOW);
         }
         if (STARTZEIT + VENTIL2_AN == millis())
         {
         digitalWrite(VENTIL2, HIGH);
         }
         if (STARTZEIT + VENTIL2_AUS == millis())
         {
         digitalWrite(VENTIL2, LOW);
         }
…
…