|
931
|
International / Deutsch / Re: Anfänger Projekt - Dimmen von LEDs mit Arduino
|
on: April 30, 2012, 12:59:39 pm
|
@Uwe: Von dieser begrenzung innerhalb eines Ports ist mir nichts bekannt. Die Begrenzungen sind 40mA pro Pin die durch die Ausgangstransistoren des ATmega fließen und 200 mA Gesamtstrom der über die Masse/Spannungsversorgungspinns fließt. Da git es keine Begrenzung innerhalb des Ports.
Ich bin auch nur über den Playground darüber gestolpert: http://arduino.cc/playground/Main/ArduinoPinCurrentLimitations Habe aber noch nicht im Datenblatt des ATMega geschaut ob das korrekt ist. Daß man den Gesamtstrom begrenzt, wenn man bei PWM nicht 100% durchsteuert ist ein Trugschluß. Da PWM nur die Ein- zu Aus-Zeit-Verhältnis ändert, heißt das nicht, daß nicht alle Ausgänge gleichzeitig HIGH sein können und somit die LEDS den vollen Gesamtstrom ziehen.
Damit hast Du natürlich recht, zumal es sehr wahrscheinlich ist, das sogar alle LEDs gleichzeitig angesteuert werden, da der PWM-Takt ja für alle gleich ist. Mario.
|
|
|
|
|
933
|
International / Deutsch / Re: Anfänger Projekt - Dimmen von LEDs mit Arduino
|
on: April 30, 2012, 08:03:07 am
|
Auf die Schnelle habe ich folgendes gefunden: http://arduino.cc/playground/Main/ArduinoPinCurrentLimitations. Genaue Details finden sich vermutlich nur im Datenblatt des Atmel Controllers. Ein einzelner Ausgang kann bis zu 40mA treiben, das ist richtig. Aber Du kannst nicht auf allen gleichzeitig 40mA abziehen, da die Gesamtlast aller Ausgänge ja komplett durch den Controller fliesst. Wie gesagt, bei low current LEDs sollte es keine Probleme geben, da Du bei 5mA bei allen 13 LEDs gerade mal auf 65 mA kommst, das schafft der Mega locker. Mario.
|
|
|
|
|
934
|
International / Deutsch / Re: Anfänger Projekt - Dimmen von LEDs mit Arduino
|
on: April 30, 2012, 06:28:03 am
|
|
Hallo Alexander,
ja Links sind erlaubt. Die Auswahl scheint auch erstmal schlüssig zu sein und Reichelt als Quelle ist auch nicht das schlechteste. Du solltest aber bei 13 LEDs bedenken, das auch der Arduino Mega nur einen begrenzten Gesamtstrom hat, der fliessen darf. Bei 13 LEDs * 20 mA (bei max. HElligkeit) hast Du schon 260 mA und das könnte bereits knapp werden. Die einzelnen Ausgänge des Arduino sind in Ports zu je 8 Pins zusammengefasst, diese Ports wiederum vertragen auch nur einen begrenzten Strom. Hier würden sich ggf. Low current LEDs anbieten, die mit maximal 5mA laufen und die dann kein Problem mehr darstellen sollten. Alternativ kannst Du auch die "normalen" LEDs mit deutlich weniger Strom betreiben, die sind dann halt nur nicht ganz so hell. Wenn Deine Anwendung nie alle LEDs auf einmal mit voller Helligkeit betreibt, ist das wohl auch nicht so tragisch, aber ich persönlich wäre da lieber vorsichtig. Mario.
|
|
|
|
|
935
|
International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP
|
on: April 29, 2012, 10:44:28 pm
|
|
Guten Morgen, es wird doch langsam :-). Du brauchst aber kein extra "senden.php". Du baust die Aufrufe direkt in das "Monkey-Script" ein. Die Stelle an der das passiert drängt sich auch geradezu auf, nämlich dort, wo Du die GET-Parameter auswertest. Genau an dieser Stelle hast Du ja alle Informationen, um die Ausgänge zu schalten. Ich habe das am Wochenende mal aufgebaut, es geht problemlos. Mario.
|
|
|
|
|
936
|
International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP
|
on: April 28, 2012, 12:33:36 am
|
Das Problem ist einfach. Wenn Du das Formular im Browser abschickst, dann werden die Werte übertragen, die Du im Formular eingegeben hast. Also z.B. led1=0;led2=1 und led3=1, weil Du die entsprechenden Radio-Buttons so angeklickt hast. Dein PHP-Script kann also diese Daten auswerten. Am Ende wird dann das Formular wieder ausgegeben. Wenn Du dabei nicht den eben übermittelten Zustand wieder setzt, wird im Browser das Formular wieder alle Radio-Buttons auf "aus" setzen. Das siehst Du, wenn Du meinen Code einfach ausprobierst. D.h. der Nutzer der Webseite sieht nicht mehr, was er eigentlich vor dem Abschicken angeklickt hat. Der folgende Code respektiert aber die Eingaben aus dem letzten Aufruf, die Webseite "merkt" sich also den Zustand zwischen den Aufrufen, indem das Script die Werte im Formular wieder mit den alten Daten vorbelegt. Sowas nennt man auch "Monkey Script" (siehe http://www.php.de/wiki-php/index.php/Affenformular_%28Standardverfahren%29) Der Vorteil dabei ist, das Du nur ein Script brauchst, weil es sich immer wieder selbst aufruft und Du sehr einfach prüfen kannst ob alle Daten korrekt übermittelt und verarbeitet werden. <html> <head> </head> <body><h1>Arduino - Monkey Script</h1> <?php if(isset($_GET['led1'])) $led1 = $_GET['led1']; if(isset($_GET['led2'])) $led2 = $_GET['led2']; if(isset($_GET['led3'])) $led3 = $_GET['led3']; ?> <form action=""> <p> LED 1 : <input type="radio" name="led1" value="0" <?php if($led1==0) echo "checked" ?> >aus - <input type="radio" name="led1" value="1" <?php if($led1==1) echo "checked" ?> >an<br> LED 2 : <input type="radio" name="led2" value="0" <?php if($led2==0) echo "checked" ?> >aus - <input type="radio" name="led2" value="1" <?php if($ led2==1) echo "checked" ?> >an<br> LED 3 : <input type="radio" name="led3" value="0" <?php if($led3==0) echo "checked" ?> >aus - <input type="radio" name="led3" value="1" <?php if($ led3==1) echo "checked" ?> >an<br> </p> <input type="submit" name="submit" value="Abschicken"> </form> </body> </html>
Es dauert manchmal ein wenig bis man dahinter kommt, wie eine Webanwendung "tickt". Das Problem im Gegensatz zu einem "normalen" Programm ist, das Dein PHP-Script sich den alten Zustand zwischen 2 Aufrufen nicht direkt merken kann (außer man verwendet Sessions, aber das ist ein ganz anderes Thema). Außerdem können ja parallel hunderte Requests von unterschiedlichen Browsern auf das gleiche Script gehen, die auch miteinander nichts zu tun haben. HTTP ist ein "zustandsloses" Protokoll. Dein Script verarbeitet immer nur genau die Daten die im Formular drin stehen, mehr nicht. Mario.
|
|
|
|
|
937
|
International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP
|
on: April 27, 2012, 04:09:47 pm
|
Ok, ich versuche es nocheinmal schrittweise zu erklären. Versuche evtl. erstmal Dich von der "Gesamtvorstellung" zu lösen und vergiss erstmal den Arduino. Vielleicht wird es dann einfacher. 1) Du willst eine Webseite bauen, mit der Du einer oder mehrere Variablen einen Zustand vorgeben willst. Sagen wir z.B. mal, Du hast die Variablen $led1, $led2, $led3. Jede dieser Variablen kann den Zustand 1 oder 0 annehmen. Das ganze wird zunächst in einem HTML-Formular umgesetzt: <form action=""> <p> <input type="radio" name="led1" value="0" <?php if($led1==0) echo "checked" ?> >aus - <input type="radio" name="led1" value="1" <?php if($led1==1) echo "checked" ?> >an<br> <input type="radio" name="led2" value="0" <?php if($led2==0) echo "checked" ?> >aus - <input type="radio" name="led2" value="1" <?php if($led2==1) echo "checked" ?> >an<br> <input type="radio" name="led3" value="0" <?php if($led3==0) echo "checked" ?> >aus - <input type="radio" name="led3" value="1" <?php if($led3==1) echo "checked" ?> >an<br> </p> <input type="submit" name="submit" value="Abschicken"> </form>
Der PHP-Code " <?php if($led1==0) echo "checked" ?>" sorgt dafür, das abhängig vom jeweiligen Wert der Variable der entsprechende Radio-Button ausgewählt ist. Du musst nun noch den Code für das Auswerten des Formulars drum herum bauen. Versuch erstmal soweit zu kommen, das Du beim Abschicken des Formulars danach die entsprechenden Buttons wieder korrekt ausgwählt angezeigt bekommst. Sich die Webseite sozusagen den Zustand merkt. Das sollte nicht weiter schwierig sein. 2) Die definiert Funktion arduino_send($ip,$port,$command) verwendest Du wie jede andere Funktion in PHP. Zum Beispiel im Daten in eine Datei zu schreiben oder aus einer Datei zu lesen. Nur das hier die Daten nicht in einer Datei landen, sondern an den Arduino geschickt werden. Das Prinzip ist aber genau das Gleiche. Dein PHP-Script verwendet eine "Schnittstelle" mit Hilfe der Funktion um Daten an ein "Medium" zu senden. Ob das eine Datei ist, oder Dein Arduino ist dabei egal. Statt z.B. "led1=0;led2=1;led3=1" in eine Datei "/tmp/daten.txt" zu schreiben (fopen() ... fwrite() ... fclose()) verwendest Du nun die Funktion arduino_send() um den Zustand Deiner Variablen an den Arduino zu schicken. Der Vorgang, die Daten in ein Format zu bringen, das Dein Arduino lesen kann, nennt man "Codieren". Du definierst also ein Format, das dem Zweck entspricht, den Du erreichen willst. In Deinem Fall ist das Format "1. Zeichen definiert ob setzen oder lesen eines Pins (S oder R)", "2.Zeichen definiert welcher Pin betroffen ist", "3.Zeichen definiert den Wert der evtl. gesetzt werden soll. Um Dir die Programmierung auf dem Arduino zu erleichtern, wenden IMMER 3 Bytes/Zeichen übertragen, auch wenn Du beim Lesen eigentlich kein 3. Zeichen brauchst. Dein Format das Du so definiert hast nennt man auch "Protokoll" (so wie HTTP für HyperText Transfer Protocol" steht. Es legt fest nach welchen Regeln die Daten übermittelt werden. Dein Aruino sendet dann immer genau ein Byte als Ergebnis zurück. Beim Lesen den Wert des Pins der für den Pin gerade gesetzt ist und beim Setzen den Wert der gesetzt wurde. Die Funktion "arduino_send()" baust Du nun in dein funktionierendes!!! PHP-Script ein. Also erst, wenn Punkt 1 angearbeitet ist. Das ist wichtig, denn wenn etwas nicht funktioniert musst Du nicht erst prüfen ob das PHP-Script die Eingaben vom Browser korrekt verabreitet, sondern kannst den Fehler bereits auf die Änderungen bezüglich Daten senden einschränken. 3) Dein Arduino muss die Daten verarbeiten. Als Basis kannst Du den Chat-Server Sketch aus den Beispielen der IDE nehmen, der enthält bereits alles was Du brauchst um auf ankommende Verbindungen zu warten, Daten aus der Verbindung zu lesen und etwas an den Client (in dem Fall dann Dein PHP-Script auf dem Webserver, nicht der Browser der die Webseite aufruft) zu antworten. Da das Protokoll sagt, das immer 3 Bytes gesendet werden, musst DU nur warten bis ein Client kommt (PHP-Script) und genau 3 Bytes aus der Verbindung lesen und diese verarbeiten. 1. Byte sollte "S" oder "R" sein. Das 2. Byte ist die Nummer des Pins und das 3. Byte der Wert. Wenn "S" dann setze das Pin mit der übermittelten Nummer auf den übermittelten Wert und schreibe diesen Wert auch zurück an den Client (wie im Protokoll definiert). Wenn "R", dann ignoriere den übermittelten Wert einfach und schicke an den Client den aktuellen Wert des Pins zurück. Danach beende die Verbindung mittles client.close(); Damit weiss dann auch Dein PHP-Script (Funktion arduino_send()) das die Übertragung abgeschlossen ist. Das ist "eigentlich" schon alles. Wichig ist das schrittweise vorgehen. Erst wenn ein Schritt funktioniert, dann den nächsten angehen. Bei Schritt 2, reagiert Dein Arduino ja noch nicht wirklich. Daher macht es da z.B. Sinn statt des tatsächlichen Sendens in der Funktion nur mit "echo" auszugeben was gemacht werden würde. Somit kannst Du auf der Webseite prüfen, ob sich Dein Script so verhält wie Du es erwartest. Wenn das dann klappt, machst Du mit Schritt 3 weiter. Wenn Dein Sketch sich dann compilieren und auf den Arduino spielen läßt, dann kannst Du im PHP-Script tatsächlich Daten senden. Ich hoffe dieser kleine "Roman" hat ein wenig zum besseren Verständnis beigetragen. Mario.
|
|
|
|
|
939
|
International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP
|
on: April 27, 2012, 07:12:46 am
|
Zum Senden an den Arduino kannst Du erstmal folgende einfache Funktion verwenden. <?php $arduino_ip="192.168.111.5"; $arduino_port="8088";
function arduino_send($ip,$port,$command) { $res = fsockopen($ip,$port); if($res) { fwrite($res,$command); return fread($res,1); } else { echo "Fehler, Kommando konnte nicht abgesetzt werden"; } } ?>
Aufgerufen wird die z.B. mit arduino_send(192.168.111.5,8088,'S'.chr(9).chr(1));
Das erste ist die IP, dann der Port auf dem der Arduino lauscht. Danach der Kommando S ist der Befehl zum "Setze Pin" chr(9) schreibt das Byte 0x09 in den String, das ist die Pin -Nummer chr(1) schreibt das Byte 0x01 in den String, das ist der Wert. Den übermittelten Befehl musst Du dann auf dem Arduino auswerten wie bereits vorgeschlagen. In Deinem PHP-Code werde ich aber noch nicht so recht schlau. Du hast zwei unabhängige Formulare gebaut, damit werden immer nur die Daten von einem Formular abgeschickt, jenachdem welchen Submit-Button Du anklickst. Die Schleife $auswahl1 = $_POST['Zeit_V1']; for($i=0;$i<count($auswahl1);$i++) { echo $auswahl1[$i] . ' min wurden gestartet'; }
verstehe ich aber nicht. Es kann immer nur ein Wert übermittelt werden, warum dann das Array und eine Schleife die immer nur einmal durchlaufen wird? Wenn das später mehr als ein Ventil werden soll, dann bau den Code dafür auch erst später. Jetzt geht es ja erstmal nur um die Kommunikation Webserver <-> Arduino. Immer schön an KIS denken: Keep It Simple! Mario.
|
|
|
|
|
940
|
International / Deutsch / Re: Gpsdaten auf Sd karte loggen
|
on: April 27, 2012, 06:17:51 am
|
|
Sieht so aus, als würde Dein Arduino resets bekommen / ausführen, denn dann wird jedesmal wieder die setup() aufgerufen. Wie schnell hintereinander kommen denn die Ausgaben?
|
|
|
|
|
941
|
International / Deutsch / Re: Licht auf bestimmte Musik !!!
|
on: April 26, 2012, 09:33:54 am
|
Im Code, den Du im Vixen-Forum gefunden hast, geht es ja eigentlich um die Ausgabe auf PWM-Pins. Dort wird ja auch analogWrite() verwendet und es macht Sinn, ein komplettes Byte zu schreiben. Da Du digitale Pins verwendest, solltest Du ein HIGH oder LOW mittelst digitalWrite() schreiben. Wie gesagt, das digitalWrite() nimmt Dir die Arbeit ab, daher ist das OK. Um es übersichtlicher zu machen, kannst Du auch ein if(incomingByte[i] != 0) { digitalWrite(pin,HIGH); } else { digitalWrite(pin,LOW); }
verwenden. Aber wie gesagt, das hat keinen Einfluss auf das Ergebnis, da digitalWrite() im Prinzip das Gleiche macht. Jetzt wäre es gut zu wissen, ob Vixen tatsächlich immer korrekterweise Nullen und "nicht Nullen" schickt, wenn ein Channel geändert wird. Mario.
|
|
|
|
|
942
|
International / Deutsch / Re: Licht auf bestimmte Musik !!!
|
on: April 26, 2012, 08:23:45 am
|
Wo werden denn da bitteschön bytes zu den pins gesendet ? Genau da: digitalWrite(Channel4, incomingByte[3]); Dazu hatte ich aber auch schon was geschrieben. Das ist kein schöner Stil, funktioniert aber, da alles was nicht 0 ist asl HIGH gewertet wird.
|
|
|
|
|
943
|
International / Deutsch / Re: Licht auf bestimmte Musik !!!
|
on: April 24, 2012, 01:35:04 pm
|
Der Code für die Schleife ist ja immer noch falsch und zwar in beiden Programmen. //diese schleife zählt von 0 bis 7, also 8 nicht 7 Werte!!! for (int i=0; i<8; i++) { // read each byte incomingByte[i] = Serial.read(); }
//diese schleife zählt von 0 bis 5, also 6 nicht 5 Werte!!! for (int i=0; i<6; i++) { // read each byte incomingByte[i] = Serial.read(); }
Entweder hast Du einen zusätzlichen Channel definiert, der mit ausgegeben wird, dann passt das evtl. oder es funktionieren beide Programme nicht richtig. Mario.
|
|
|
|
|
944
|
International / Deutsch / Re: Poti an analogen Pin als MIDI ausgeben
|
on: April 24, 2012, 01:31:15 pm
|
Code: /* Pinbelegung */ const int volumePot = A0; // Poti für die Lautstärke const int volumePot= A1; // Poti für die 2 Lautstärke
oder wenn es möglich ist:
Code:
/* Pinbelegung */ const int volumePot = A0;A1;A2; ... // Poti für die Lautstärke So geht es leider nicht. "VolumePot" ist eine Variable, also ein Platzhalter für EINEN Wert. Eigentlich stehen die Werte A0 und A1 ... nur für bestimmte Pin-Nummern des Arduino. Was Du machst ist folgendes: 1) Merke Dir, das volumePot für das erste analog Pin steht. 2) Merke Dir, das volumePot für das zweite analog Pin steht ... Was soll sich Dein Programm denn nun merken? Das erste oder das zweite Pin? Du kannst entweder ein Array nehmen: int volumePot[3]= { A0 , A1, A2}; //zugriff über index des array - achtung zählung beginnz bei 0 ... analogRead(volumePot[0]); ... analogRead(volumePot[1]); ... analogRead(volumePot[2]);
oder Du definierst Dir 3 verschiedene Variablen int volumePot1= A1; int volumePot2= A2; int volumePot3= A3; //zugriff über einzelne Variable ... analogRead(volumePot1); ... analogRead(volumePot2); ... analogRead(volumePot3);
|
|
|
|
|
945
|
International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP
|
on: April 24, 2012, 07:06:41 am
|
Ich würde mal sagen, falscher Ansatz. Wenn schon ein Webserver da ist, dann doch folgendermassen: Browser <--> Webserver (PHP/HTML) <--> Arduino Alternativ nur der Arduino als Webserver, aber wie da die Limits sind, haben wir ja schon gelernt :-) Als erstes bastelst Du Dir mit PHP und HTML auf dem Webserver ein Webseite, mit der Du den Zustand z.B. einer LED abbildest und per Link oder Button den Zustand umschalten kannst. Das alles noch komplett ohne den Arduino. Wenn das funktioniert, bringst Du Deinem PHP-Script bei, mit dem Arduino zu "reden". Dabei kannst Du auf den ganzen HTML-Kram verzichten und nur die wesentlichen Daten übertragen. Du kannst z.B. mit PHP eine TCP-Verbindung zum Arduino aufbauen und schickst erstmal nur ein Zeichen 'S' -> (SET) setze wert 'R' -> (READ) lese wert danach folgt z.b. die nummer des Pins als byte (z.b. 3 Wert, nicht das Zeichen '3') beim Setzen des Wertes kommt noch ein drittes Byte, mit dem Wert. Damit kannst Du aus mit 3 Bytes schon alle Pins setzen ('S',0x03,0x01) Auf dem Arduino liest Du einfach Zeichenweise aus der Verbindung in ein Array //Achtung super simpler Quickhack ohne Püfung der Eingabe oder ob Daten vorhanden sind char input[3]; for(int i=0;i<3;i++) { input[i] = client.read(); }
//pin setzen if(input[0] == 'S') { digitalWrite(input[1],input[2]); } //pin lesen und an den Client schicken if(input[0] == 'R') { client.print(digitalRead(input[1])); }
Die Lösung ist zwar für den Anfang komplexer, als nur der Arduino zu nehmen, dafür aber deutlich flexibler. Der Browser muss nicht mit dem Arduino reden, sondern nur mit dem Webserver. Wie der Webserver dann mit dem Arduino redet, ist für den Nutzer am Browser aber egal. Und Du kannst Die Seite auf dem Webserver so bunt und schick machen, wie Du lustig bist. Es gibt keine Limitierungen wie beim Arduino-Webserver.
|
|
|
|
|