|
916
|
International / Deutsch / Re: arduino wird sehr heiß...
|
on: May 03, 2012, 06:23:23 am
|
@mario: werde auf jeden fall über den "normalen" eingang in den arduino gehen. wohl über einen 7806 mit kühlkörper. von dort 4m kabel zum tablet und in den über einen 7805. spricht was dagegen ? muß nur noch die schaltung für die 78xx auftreiben...
7806 könnte knapp werden, 7808 ist besser, dann bist du für den internen des Regler des Arduino auf alle Fälle 3V über den 5V. Den zweiten 7805 zum Tablet verstehe ich noch nicht so ganz. Kannst Du den nochmal erklären? Schaltungen für den78xx finden sich recht viele im Netz: z.b. http://www.hobby-bastelecke.de/halbleiter/fest.htm Solche Schaltungen mit den Angaben zu den Kondensatoren finden sich in der Regel auch direkt in den Datenblättern der einzelnen Hersteller. Wichtig wäre noch die Freilaufdiode, die würde ich zur Sicherheit immer mit verbauen.
|
|
|
|
|
917
|
International / Deutsch / Re: arduino wird sehr heiß...
|
on: May 03, 2012, 05:47:25 am
|
Da bleibt die Verlustleistung dann allerdings gleich - wird nur auf zwei Regler verteilt ^^
Das ist klar, nur werden dann beide Bauteile weniger warm als ein einzelnes. Jeder Spannungsregler hatt dann nur noch die Hälfte der Verlustleistung abzuführen. Zumal man dem externen Spannungsregler einen vernünftigen Kühlkörper verpassen könnte. 5V auf das Arduino 5V-Pin zu geben ist trotzdem ein gewisses Risiko, da Du damit z.B. die Diode für den Verpolungsschutz umgehst. Außerdem sollte man sich dann bei dem 5V Netzteil sehr sicher sein, das eine stabile Spannung geliefert wird. Mario.
|
|
|
|
|
918
|
International / Deutsch / Re: arduino wird sehr heiß...
|
on: May 03, 2012, 04:52:04 am
|
|
Das Problem ist das Spannungsregler auf dem Board, der wird heiss. Der macht aus Deinen 12V 5V, dabei wird die Differenz in Wärme umgewandelt. Die Verlustleistung in W errechnet sich dabei aus der Spannungsdifferenz und dem Strom der fliesst. 12V - 5V sind schon mal 7V bei sagen wir mal geschätzten 200 bis 300 mA wären das schon knappe 2 Watt Wärme die da entstehen. Ich vermute mal, das die Darlington Treiber und die Schieberegister werden sicher auch über den 5V Pin des Arduino betrieben, keine Ahnung was die selbst an Strom ziehen. Die LEDs die Du schaltest haben damit nix zu tun, da deren Strom nicht durch den Arduino fliesst. Du könntest erstmal den Arduino nur mit 7V betanken (extra netzteil), 5V sind zu wenig, der Spannungsregler braucht immer etwas mehr Spannung als er am Ausgang liefern soll. Wichtig ist, das die beiden Massen (aber nur die) der beiden Netzteile dann miteinander verbdunden werden. Wenn Du bei einem Netzteil bleiben willst, dann kannst Du evtl. mit einem zusätzlichen vorgeschalteten Spannungsregler z.B. 7808 (plus den obligatorischen Kondensatoren) die Spannung erstmal auf 8V bringen, ehe die in den Arduino gehen. Mario.
|
|
|
|
|
919
|
International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP
|
on: May 02, 2012, 11:37:52 pm
|
Zur Motivation Ich habe das heute Morgen mal fix umgesetzt. Es war einfach zu warm um noch schlafen zu können  Es funktioniert. Sogar recht einfach. Auch die Steuerung der "Timer" über millis() ist eigentlich recht simple. Hier der Auszug zur Steuerung: //prüfen ob eine Sekunde vergangen ist if(millis()-previousMillis >= 1000) { //aktuelle Zeit merken previousMillis = millis();
//alle timer auswerten for(int t=0; t<NUMTIMER;t++) {
//nur timer beachten, die auch verwendet werden sollen (positive PIN nummer) if(timerpin[t] > 0 ){
//bei aktuellem timer eine sekunde abziehen, wenn "0", dann abgelaufen if( --timerlength[t] == 0) {
//Ausgang umschalten ( HIGH -> LOW oder LOW -> HIGH) digitalWrite(timerpin[t],!digitalRead(timerpin[t]));
//timer deaktivieren ( timer mit pin "-1" sind inaktiv) timerpin[t] = -1;
//debug Serial.print("Timer "); Serial.print(t); Serial.println(" abeglaufen."); } } } }
Zur Erklärung. Ich verwende mehrere Timer deren Daten ich in zwei Arrays speichere. timerlength[] enthält die Dauer in Sekunden, die ein timer noch laufen muss. timerpin[] enthält die Pin-Nummer, die für diesen Timer geschaltet werden soll. Der Index der Arrays entspricht jeweils einem einzelnen Timer. Setzt man z.B. timerlength[2]=30 und timerpin[2]=9, hat man den 3. Timer auf 30 Sekunden Dauer für Pin 9 gesetzt. Gleichzeitig setzt man noch Pin 9 z.B. auf HIGH. Nach Ablauf des Timers wird der Code dann Pin 9 automatisch wieder auf LOW setzen. Setzt man Pin 9 beim Starten des Timers auf LOW, wird es nach Ablauf des Timers auf HIGH gesetzt.
|
|
|
|
|
920
|
International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP
|
on: May 02, 2012, 08:19:28 am
|
Da wird doch bei "led2[]" die Zeit, die Ausgewählt wird, rein gepackt, oder nicht ? Das ist schon richtig, aber was ist der Grund für das Array? Warum nicht eine "einfache" Variable also <select name="led2"> <option value="15">15 min</option> <option value="30">30 min</option> <option value="60">60 min</option> </select>
In Deinem PHP-Script hast Du dann ein $_GET['led2'] das den ausgewählten Wert aus dem select enthält. Du bekommst bei einem Formular immer nur den im select-Tag ausgewählten Wert zurück, nicht alle Werte als Array. Was den Arduino Sketch angeht. Wie immer schrittweise vorgehen. Also erstmal mit einem Pin und der Zeitsteuerung und viel Debugausgaben, bis es funktioniert und dann schrittweise erweitern.
|
|
|
|
|
921
|
International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP
|
on: May 02, 2012, 06:41:15 am
|
Du willst also eine Zeitshaltung bauen? Natürlich geht das, allerdings wird das aus verschiedenen Gründen etwas komplexer. Aber der Reihe nach. //pin setzen if(input[0] == 'S') { digitalWrite(input[1],input[2]); delay[3]; }
Das geht schon mal nicht, wenn schon dann delay(input([3]), was aber bei input[3]=15 nur 15 Millisekunden und nicht 15 Minuten wären. Ein 4. Byte übertragen ist kein Problem, das ist nur eine Anpassung im PHP Code, indem Du dem "$command" ein 4. byte hinzufügst. Dein Problem beim Delay ist aber, das der Arduino dann die nächsten X Minuten (im schlimmsten Fall eine Stunde) nicht auf weitere Verbindungen reagieren würde. Die Zeitsteuerung über PHP zu machen ist auch keine gute Idee, da Du ja ständig "reloads" der Seite machen müßtest, bzw. mit Ajax arbeiten. Und wenn der User den Browser schliesst, dann geht dein Ventil im schlimmsten Fall nie wieder zu :-) Ein guter Grundsatz bei komplexen Systemen ist immer, das Aufgaben nach Möglichkeit an den Stellen (in den Komponenten) gelöst werden, wo sie anfallen. In Deinem Fall ist das der Arduino, der ja nach z.b. 15 Minuten das Ventil wieder schliessen muss. Ich würde einfach für jedes "Ventil" (sprich Arduino Ausgang) eine Variable " unsigned long vtimer1 = millis() + (1000 * 60 * input[3])" definieren, wenn das "Ventil" über die PHP-Funktion geschaltet wird. vtimer1 (als Beispiel für Ventil 1) enthält dann den Zeitpunkt, wann das Ventil wieder umgeschaltet werden soll. Das kannst Du dann in jedem loop() Durchlauf mit dem aktuellen Wert von millis() vergleichen. Das kannst Du dann unabhängig für jedes Ventil machen, ohne ein delay() verweden zu müssen. Zu Deinem PHP-Code: Warum verwendest Du immer Arrays in den Variablennamen? z.b. <select name="led2[]"> Das ist eher unübersichtlich und eigentlich unnötig, außer Du willst ALLE "Ventile" in ein Array packen, dann würde es Sinn machen, müßte aber auch anders aussehen. Mario.
|
|
|
|
|
922
|
International / Deutsch / Re: LEDs und Transistoren
|
on: May 02, 2012, 03:21:23 am
|
|
Du verwendest den Transistor in diesem Fall nicht als "Verstärker" sondern als Schalter. Dabei kannst Du dann auch mit dem Transistor die 12V schalten, da Du dir ja 12V LEDs ausgesucht hast. Wichtig ist dabei, das Du die Massen von Arduino und dem vermutlich zusätzlichen 12V Netzteil verbindest, sonst funktioniert es nicht.
|
|
|
|
|
925
|
International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP
|
on: May 01, 2012, 08:37:11 am
|
Kein Problem, der Aufwand war ja überschaubar und Du hast einiges gelernt. Mit HTML und PHP wurschtel ich schon seit über 10 Jahren herum. Ich wollte halt nur nicht sofort die komplette Lösung liefern, Du solltest schon selbst bestimmte Dinge machen. Es geht ja schliesslich darum, das Du am Ende etwas lernst. Ansonsten würde ich noch aufpassen, beim Ethernet-Shield und beim Arduino-Ethernet wird das Pin 4 glaub ich für das Chip-Select der SD-Karte verwendet. Keine Ahnung, ob das einen Einfluss hat. Ich denke nicht zwar nicht, aber man weiss ja nie. 0 und 1 sollten eigentlich nicht vertauscht sein, ist es bei mir auch nicht. Schau mal nach, nicht das Dein HTML-Formular bei den radio-buttons die Werte vertauscht hat. Das ist der Grund warum ich GET statt POST verwende, da sehe ich in der URL sofort was verschickt wird. Hier der Code auf dem Arduino, den ich verwende: /* Arduino TCP Control A simple server that waits for incoming connections to set or read digital Output Pins Using an Arduino Wiznet Ethernet shield or an Arduino Ethernet. Circuit: * Ethernet shield attached to pins 10, 11, 12, 13 created 2012-04-28 by Mario Keller */
#include <SPI.h> #include <Ethernet.h>
// MAC und IP Konfiguration byte mac[] = { 0xDE, 0xAD, 0xBC, 0xAF, 0xFE, 0xED }; IPAddress ip(192,168,0, 29); IPAddress gateway(192,168,0, 252); IPAddress subnet(255, 255, 255, 0);
// warten auf port 23 EthernetServer server(23);
void setup() { //Ethernet initialisieren Ethernet.begin(mac, ip, gateway, subnet); // Server starten server.begin(); // serielle konsole öffnen (debug) Serial.begin(9600); }
void loop() {
// auf eine eingehende Verbindung warten EthernetClient client = server.available(); //wenn verbindung, dann 3 bytes lesen; if (client) {
char command =client.read(); byte pinnumber =client.read(); byte pinvalue =client.read(); byte returnvalue = 0;
//Kommando auswerten switch(command) {
case 'S': Serial.print("S Kommando empfangen, setze Pin "); Serial.print(pinnumber); Serial.print(" auf "); Serial.println(pinvalue); pinMode(pinnumber,OUTPUT); digitalWrite(pinnumber,pinvalue); //gesetzten wert auch zurückliefern returnvalue=pinvalue; break;
case 'R': returnvalue = digitalRead(pinnumber); Serial.print("R Kommando empfangen, lese Pin "); Serial.print(pinnumber); Serial.print(". Wert = "); Serial.println(returnvalue); break;
default: Serial.println("Fehler, unbekanntes Kommando"); break;
} // rückantwort senden (1 byte) die "+48" sorgen dafür das der Wert 0 oder 1 als Zeichen "0" oder "1" übertragen werden. //das vereinfacht die verarbeitung in php. client.write(returnvalue+48); //übertragung erzwingen client.flush(); //10ms delay damit daten sicher gesendet werden. delay(10); //wichtg! client verbindung beenden client.stop(); } }
|
|
|
|
|
926
|
International / Deutsch / Re: Poti an analogen Pin als MIDI ausgeben
|
on: May 01, 2012, 05:09:10 am
|
|
Du definierst knobFunction() mit einem Parameter "const int pin" also einem Integer als Wert. Es wird aber in Deinem Code die Variable volumePot übergeben, die aber kein Integer ist, sondern ein Array von mehreren Integern. Statt knobFunction(volumePot) muss es also heissen knobFunction(volumePot[0]) für den ersten Wert, knobFunction(volumePot[1]) für den zweiten Wert usw.
Außerdem brauchst Du in Deinem loop() vermutlich eine Schleife, die durch die einzelnen Werte des Arrays durchgeht. Da Du Dir mit "lastVolume" den vorherigen Wert merkst, sollte das vermutlich dann auch ein Array werden, sonst vergleichst Du plötzlich den lastVolume mit unterschiedlichen Ergebnissen der verschiedenen Eingänge die in volumePot[] definiert sind. Mario.
|
|
|
|
|
927
|
International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP
|
on: May 01, 2012, 05:03:22 am
|
if(isset($_POST["arduino_send(192.168.178.216,8088,'S'.chr(1).chr(1));"])) // Senden
Ist leider komplett daneben. $_POST[] ist zwar korrekt, weil Du die Daten ja im Formular per POST verschickst. Aber was soll der Aufruf der Funktion da drin? Als "Key" verwendet das $_POST[] Array doch den Namen des Input-Feldes, das Du abfragen willst. Also: //prüfen ob für led1 Daten übermittelt wurden if(isset($_POST['led1'])) { //übergebenen Wert speichern. $led1 = $_POST['led1']; //Wert an Arduino (Pin 9) senden arduino_send($arduino_ip,$arduino_port,"S".chr(9).chr($led1)); } else { //else-Zweig wird aufgerufen, wenn keine Daten per POST übermittelt wurden.
//daher daten vom Arduino (Pin 9) lesen und in $led1 speichern $led1 = arduino_send($arduino_ip,$arduino_port,"R".chr(9).chr(0)); }
Wichtig ist, das Du mit den Werten arbeitest, die Du von Deinem Formular bekommst. Du hast nur statisch den Wert "1" übermittelt, das bringt dann natürlich nicht viel. Hier nochmal mein vollständiger PHP-Code, der einzige Unterschied ist, das ich mit GET arbeite. Da sehen zwar die URLs nicht so schön aus, aber man sieht was übermittelt wird, das macht es einfacher Fehler zu finden. <h1>Test</h1> <?php
$arduino_ip="192.168.0.29"; $arduino_port="23";
function arduino_send($ip,$port,$command) { $res = fsockopen($ip,$port); if($res) { fwrite($res,$command); $ret =fread($res,1); echo "arduino_send() returned = $ret <br>\n"; return $ret; } else { echo "Fehler, Kommando konnte nicht abgesetzt werden"; } }
if(isset($_GET['led1'])) { $led1 = $_GET['led1']; arduino_send($arduino_ip,$arduino_port,"S".chr(9).chr($led1)); } else { $led1 = arduino_send($arduino_ip,$arduino_port,"R".chr(9).chr(0)); }
if(isset($_GET['led2'])) { $led2 = $_GET['led2']; arduino_send($arduino_ip,$arduino_port,"S".chr(4).chr($led2)); } else { $led2 = arduino_send($arduino_ip,$arduino_port,"R".chr(4).chr(0)); }
if(isset($_GET['led3'])) { $led3 = $_GET['led3']; arduino_send($arduino_ip,$arduino_port,"S".chr(5).chr($led3)); } else { $led3 = arduino_send($arduino_ip,$arduino_port,"R".chr(5).chr(0)); }
?> <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>
Ich verwendet die Pins 4,5 und 9 auf dem Arduino. Da ich einen Arduino-Ethernet verwende, der die interne LED statt auf Pin 13 auf Pin 9 hat, kann ich gleich optisch prüfen ob das Senden klappt.
|
|
|
|
|
928
|
International / Deutsch / Re: Brauche Hilfe: Ausgang per Web schalten mit PHP
|
on: May 01, 2012, 12:39:14 am
|
Nein, leider nicht. Ich glaub so ganz verstanden hast Du es noch nicht. Das "arduino_send()" ist eine Funktion, die Dein PHP-Script verwendet, um dem Arduino Befehle zu schicken. Also vom Webserver zum Arduino. Da wo Du den Aufruf eingetragen hast, ist das doch HTML-Code, der vom Browser ausgeführt wird. Woher soll der Browser denn wissen, was er machen soll, wenn im "action" Parameter ein Aufruf einer PHP-Funktion steht? Das klappt ja sonst auch nicht. Der Browser "spricht" nur mit dem Webserver, also dem PHP-Script. Also GET-Parameter an eine URL schicken und HTML-Code zurück bekommen. Mehr macht der Browser nicht, der weiss noch nicht mal was vom Arduino. Der Aufruf der arduino_send() Funktion gehört hier hin: <?php if(isset($_POST['led1'])) $led1 = $_POST['led1']; if(isset($_POST['led2'])) $led2 = $_POST['led2']; if(isset($_POST['led3'])) $led3 = $_POST['led3']; ?>
In diesem Block verarbeitet das Script die vom Browser kommenden Informationen. Dort musst Du den Aufruf der Funktion unterbringen. Mario.
|
|
|
|
|
929
|
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.
|
|
|
|
|