PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 funktionierende Sketche in einem - Bitte um Hilfestellung für Anfänger



Benny1989
02.03.2014, 18:35
Guten Abend liebe Community,

ich bin schon des längeren hier angemeldet und habe nur im stillen mitgelesen!
Ich bin an einem Roboter Projekt tätig, der auch schon fast fertig ist,
das Projekt möchte ich hier auch noch ausführlich vorstellen!

Kurz zu mir: Bin 25 Jahre alt, gelernter CAD Konstrukteur und arbeite auch als dies im Familienbetrieb.
Daher die Technische Seite zur Durchführung kein problem, Elektronik Kenntnisse auch vorhanden.

Momentan wird der Roboter über eine herkömmliche Modellbaufernsteuerung ( Spektrum DX6i ) gesteuert,
diese spricht den Fahrtenregler an ( SGS Elektronisch TVC-B-30 ) und der wiederum 2 Elektromotoren.
Also Prinzip Panzersteuerung mit zwei unabhängig angetrieben Hinterräder und vorn zwei Lenkrollen.
( Habe 6 Jahre Modellbau betrieben daher war dies ein Kinderspiel )

Ich möchte aber den Roboter nicht über die Funkte steuern sondern später mal über den Arduino und die passende
selbstgeschriebene Software!. Aber erstmal Schritt für Schritt.

Nun aber zu meinem Problem:
Ich habe mir ein Arduino Starterkit besorgt ( Amazon ) bin auch hoch zufrieden.
Habe die letzten 3 Wochen mit verbracht, die Schaltungen nachzubauen, nach zu stecken auf dem Steckbrett und zu
verstehen und die Abläufe des Sketches zu verinnerlichen.
Habe mir auch ein Buch ( Die elektronische Welt mit Arduino entdecken - Amazon und ebenfalls hoch zufrieden ) gekauft und
auf Youtube diverse Tutorials nachgebaut und verstanden, also:

ich bekomme kleine LED Schaltungen hin oder Schaltungen die sonstige aufgaben erledigen ( Temperatursensor od Lichtsensor )

Jetzt möchte ich gerne zwei Schaltungen vereinen und in ein Sketch verbinden.
Habe hier schon im Forum gelesenen, das das nicht so einfach ist bzw für mich zumindest nicht :(

Habe auch den Rot befolgt und wie es in dem Beitrag geheißen hat, ein neues Programm zu schreiben.

Jetzt taucht aber folgender Fehler auf wo ich Hilfestellung benötige um es zu verstehen!
In den Sketch für die Netzwerkkamera ein und auszuschalten kommt die Operation : ledState = LOW; vor und
in dem zweiten Sketch bzw Operation kommt vor: low = lightLevel;

Jetzt bringt mir Arduino ein Fehler das er den Wert LOW ( und auch HIGH ) nicht zuordnen kann weil er zweimal in dem Sketch vorkommt.

Das leuchtet mir auch ein, aber den Lösungsweg also wie ich ihm sagen kann ledState = LOW gehört zur ersten Operation,
und low - lightlevel zu der anderen Operation!

Beide Programme laufen unabhängig voneinander auf dem Steckbrett und im Arduino.

Aber ich möchte ja das der Arduino mehrere Aufgaben erledigt, ich will ja nicht für jedes Programm ein eigenen Ardino :p:p:p:p:p
das währe auch eine Lösung, kann aber nicht der Weg sein :)


Ich hoffe mir kann jemand ein Tip geben, das ich es verstehe .... Versuche es schon 3 Tage zu lösen!

Mfg Benny


Hier noch mein geschriebener Code:




// Netzwerkkamera
const int switchPin = 2;
const int camPin = 3;

// LED SENSOR
const int sensorPin = 0;
const int ledPin = 4;

int state; // Variable für Operation1 = Netzwerkkammera Ein / Aus
int lastState; // Variable für Operation1 = Netzwerkkammera Ein / Aus
int ledState; // Variable für Operation1 = Netzwerkkammera Ein / Aus

int lightLevel, high = 0, Low = 1023; // Variable für Operation2 = LED Sensor

void setup()
{
pinMode(camPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT);

Serial.begin(9600);


}

void Operation1() // Netzwerkkamera Ein / Aus
{
state = digitalRead(switchPin);

if (state != lastState)
{
if (state == HIGH)
{
if (ledState == HIGH)
{
ledState = LOW;
Serial.println("LED AUS");
}
else
{
ledState = HIGH;
Serial.println("LED EIN");
}
}
lastState = state;
}

digitalWrite(ledPin, ledState);
delay(20);

}


// ----------------------------------------

void Operation2() // LED SENSOR
{
lightLevel = analogRead(sensorPin);

analogWrite(ledPin, lightLevel);

if (lightLevel < Low)
{
low = lightLevel;
}

if (lightLevel > High)
{
high = lightLevel;
}

lightLevel = map(lightLevel, Low+30, high-30, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
}


void loop()
{
Operation1(); // Netzwerkkamera ein und aus schalten
Operation2(); // Sensor steuert LED
}

cdk
02.03.2014, 19:06
Hey Benny!


Jetzt bringt mir Arduino ein Fehler das er den Wert LOW ( und auch HIGH ) nicht zuordnen kann weil er zweimal in dem Sketch vorkommt.

Glaube nicht daß sich der Compiler so ausdrückt hat :) - wie lautet denn die genaue Fehlermeldung?

"LOW" und "Low" (ebenso deine "Highs") haben doch garnichts miteinander zu tun weil unterschiedliche Schreibweise und sollten sich somit auch nicht in die Quere kommen. Nebenbei bemerkt würde ich aber zwecks Übersichtlichkeit dennoch unterschiedliche Bezeichnungen wählen...

Was mir auffällt sind aber einige Schreibfehler (?). Oben deklarierst Du "Low", unten verwendest Du "low" - also eine für den Compiler unbekannte Variable. Darüber aber auch wieder ein "Low", ganz zu schweigen vom Präprozessor-LOW. Auch bei Deinen highs herrscht Chaos bezüglich Groß-/Kleinschreibung. Alle 3 Varianten im Umlauf. Eine von Dir deklariert, eine vom Präprozessor, eine garnicht.

Gewöhne Dir am besten mal eine klare, durchgängige Linie an, z.B. Variablen immer mit kleinem Anfangsbuchstaben, Konstanten immer mit großem. Oder so in der Art. Hauptsache durchgängig und konsequent.

radbruch
02.03.2014, 19:13
Hallo

Ich vermute, du vermischt die boolschen Variablen HIGH und LOW mit den Werten von lightLevel die du in den Variablen high und low speicherst:


// Netzwerkkamera
const int switchPin = 2;
const int camPin = 3;

// LED SENSOR
const int sensorPin = 0;
const int ledPin = 4;

int state; // Variable für Operation1 = Netzwerkkammera Ein / Aus
int lastState; // Variable für Operation1 = Netzwerkkammera Ein / Aus
int ledState; // Variable für Operation1 = Netzwerkkammera Ein / Aus

int lightLevel, lightLevel_high = 0, lightLevel_low = 1023; // Variable für Operation2 = LED Sensor

void setup()
{
pinMode(camPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT);

Serial.begin(9600);


}

void Operation1() // Netzwerkkamera Ein / Aus
{
state = digitalRead(switchPin);

if (state != lastState)
{

if (ledState == HIGH)
{
ledState = LOW;
Serial.println("LED AUS");
}
else
{
ledState = HIGH;
Serial.println("LED EIN");
}

lastState = state;
}

digitalWrite(ledPin, ledState);
delay(20);

}


// ----------------------------------------

void Operation2() // LED SENSOR
{
lightLevel = analogRead(sensorPin);

analogWrite(ledPin, lightLevel);

if (lightLevel < lightLevel_low)
{
lightLevel_low = lightLevel;
}

if (lightLevel > lightLevel_high)
{
lightLevel_high = lightLevel;
}

lightLevel = map(lightLevel, lightLevel_low+30, lightLevel_high-30, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
}


void loop()
{
Operation1(); // Netzwerkkamera ein und aus schalten
Operation2(); // Sensor steuert LED
}(ungetestet)

Gruß

mic

Benny1989
02.03.2014, 19:29
Danke für die schnellen Antworten.

@cdk

ja davon habe ich schon gehört, grins, habe aber granicht drauf geachtet. Das man auf die Schreibweise achten muss.
Ich sag mal so wenn man das Prinzip verstanden hat, ist es schon fast eindeutig. aber für mein empfinden sehr viel Text
worauf man achten muss.

Grins:
klar hat er nicht geschrieben


Jetzt bringt mir Arduino ein Fehler das er den Wert LOW ( und auch HIGH ) nicht zuordnen kann weil er zweimal in dem Sketch vorkommt.

er hat gemekert: "low" was not declared in this scope


@ mic

danke für den Code ich muss jetzt mal beide vergleichen um zu verstehen, was du geändert hast
werde wieder berichten!

Aber nochmal kurz um, das ich es verstehe? -- lag der Fehler jetzt darin das is Low - low - LOW geschrieben hab und
er nicht wusste wohin was gehört?

gebe cdk recht kommen alle drei Varianten drin vor :(

radbruch
02.03.2014, 19:42
Hallo


... lag der Fehler jetzt darin das ich Low - low - LOW geschrieben habAuch daran lag es (aber teste erstmal den neuen Code)

Der wesentliche Fehler war, dass du beim Ändern des ledState auf logisches HIGH und LOW geprüft hast:
if (ledState == HIGH)

Bei den Werten des analogen Eingangs dagegen prüfst du auf größer oder kleiner:
if (lightLevel < lightLevel_low)
if (lightLevel > lightLevel_high)

Logische Werte können nur true oder false sein, analoge Werte hingegen (wie bei deinem 10bit-Wandler) können 0 bis 1023 sein.

Meine Änderung in deinem Quellcode beschränkte sich lediglich auf die Einführung zweier zusätzlicher Variablen (lightLevel_low und lightLevel_high) für die Min- und Maxwerte von lightLevel (wodurch auch die unterschiedlichen Schreibweisen von Llow eliminiert wurden :)

Gruß

mic

Benny1989
02.03.2014, 19:55
Okay soweit habe ich verstanden und werde es gleich ausprobieren, ob es funktioniert, der Tipp war wenigstens verständlich =)

Das ihr wisst um was es geht, kurz paar Bilder, wollt eigentlich noch nichts verraten aber für die schnelle Hilfe =)

Name: Roboter RSL7
Gewicht: 120 KG ( Gesamt)
Aufgaben( Rasenmäher, Schneeschieben, Straße kehren mit hinterhergezogener Kärger Handkermaschine ( S550))
Leistung Motoren: 1500 Watt (750 pro Motor )
Akkus: 2x 12V in Reihe auf 24V
Ausemaße(mm): 1200x600x500

Mehr will ich dann in meinem Ausführlichen Bericht schreiben

27657276582765927660

- - - Aktualisiert - - -

Sorry für die beiden ersten Bilder das sie auf dem Kopf stehen :(
kann man das hier irgendwo einstellen um 180 Grad drehen ?

Mfg Benny

radbruch
02.03.2014, 20:03
Hallo Benny,

ich bin echt beeindruckt von diesem Vehikel, befürchte aber auch, dass du dich da übernimmst. Bitte warne mich und deine nähere Umgebung, bevor du damit die Gegend unsicher machst. *lol

Ich bin sehr gespannt auf deinen ausführlichen Bericht...

Gruß

mic

Benny1989
02.03.2014, 21:18
Grins da hast du recht, jeder muss sich in Sicherheit begeben^^

Als größten Test zur maximal Belastung was ich gemacht habe:

Mein A3 BJ2002 - Gesamtgewicht: 1300 KG über eine Strecke von 100 Metern mit kleiner Steigung in unserem Industriegebiet zu ziehen .. haha

Mfg Benny

- - - Aktualisiert - - -

@radbruch

also das Resultat auf dem steckbret ist, das die led/cam angeht und die led von der zweiten operation ganz leich an ist,
wenn man die led/cam aber einschalten will reagiert die led von der operation 2 sie wird dann beim Knopf drücken ganz hell!

mfg Benny

- - - Aktualisiert - - -

Und nochmal info für Radbruch,

habe beide einzelnen Sketche ausprobiert, also separat auf dem Steckbrett und separat ausprobiert,
in den arduino reingeladen.

Also einzeln funktionieren sie

Mfg Benny

- - - Aktualisiert - - -

also nochmals der code wie mit " Radbruch" besprochen,

das prob is nun das beim drücken des schalters/tasters, die LED (ROT) von Operation 2 angeht
Obwohl diese LED (ROT) ja vom Lichtsensor gesteuert werden sollte.

Die LED (Gelb) die vom Schalter/Taster an und ausgeschalten wir also sprich die Netzwerkkammera passiert garnichts!

Sprich die falsche LED wird angesteuert .




/*

Autor: Benjamin Grammel
Datum: 28.02.2014
Projekt: Roboter RSL-7
Verwendungszweck: Operation 1: Netzwerkkamera am Roboter manuell ein und Ausschalten
Operation 2: LED´s per Lichtsensor steuern
Operation 3: Lüfter per Temperatursensor steuern
*/

// ----------------------------------------



// Netzwerkkamera
const int switchPin = 2;
const int camPin = 3;

// LED SENSOR
const int sensorPin = 0;
const int ledPin = 4;

int state; // Variable für Operation1 = Netzwerkkammera Ein / Aus
int lastState; // Variable für Operation1 = Netzwerkkammera Ein / Aus
int ledState; // Variable für Operation1 = Netzwerkkammera Ein / Aus

int lightLevel, lightLevel_high = 0, lightLevel_low = 1023; // Variable für Operation2 = LED Sensor

void setup()
{
pinMode(camPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT);

Serial.begin(9600);


}

void Operation1() // Netzwerkkamera Ein / Aus
{
state = digitalRead(switchPin);

if (state != lastState)
{

if (ledState == HIGH)
{
ledState = LOW;
Serial.println("LED AUS");
}
else
{
ledState = HIGH;
Serial.println("LED EIN");
}

lastState = state;
}

digitalWrite(ledPin, ledState);
delay(20);

}


// ----------------------------------------

void Operation2() // LED SENSOR
{
lightLevel = analogRead(sensorPin);

analogWrite(ledPin, lightLevel);

if (lightLevel < lightLevel_low)
{
lightLevel_low = lightLevel;
}

if (lightLevel > lightLevel_high)
{
lightLevel_high = lightLevel;
}

lightLevel = map(lightLevel, lightLevel_low+30, lightLevel_high-30, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
}


void loop()
{
Operation1(); // Netzwerkkamera ein und aus schalten
Operation2(); // Sensor steuert LED
}



hier zwei Bilder hoffe so ist es verständlich!

2766127662

Mfg Benny

cdk
02.03.2014, 21:36
Das ist auf dem Foto nicht richtig zu erkennen - kann sein daß Deine Peripherie nicht wie in der Software beschrieben auf Pin 2,3,4 sondern auf 3,4,5 steckt?

Außerdem denke ich daß der Sensorpin auf Analog 0 stecken soll, oder? Damit wäre der falsch definiert - der Pin heißt nicht "0", sondern "A0" oder "14". Das erklärt warum vom Sensor nichts ankommt.

Hey aber die Kiste sieht ja richtig spannend aus. Wenn das mit dem Rasen mähen und Straße fegen mal klappt könntest Du mir dann die Baupläne zur Verfügung stellen? :)

Benny1989
02.03.2014, 21:53
das freut mich wenn er dir gefällt, über die Baupläne sprechen wir noch :)

gibt keine Baupläne, jedes Teil was man sieht ist auf einer CNC Fräsmaschine (Eumach UMC1000 und Eumach HSM5X ) gefräst

Das RSL7 befindet sich bis zu jeder kleinsten Schrauben und unterlegscheibe im CAD.

Nochmal zum Code,

hab jetzt den Analogen Eingang auf A1 geändert und auch dort eingesteckt und des ledPin statt 4 auf 7 das es übersichtlicher ist.
nochmals wie gesagt einzeln funktionieren die einzelne Schaltungen.

27663

Mfg Benny

cdk
02.03.2014, 23:22
Und an den Fehlfunktionen hat sich nichts geändert, oder?

Was Op1 betrifft ist's klar - Du schreibst mit digitalWrite(ledPin, ledState); auf die rote LED, also geht diese auch an. Vermutlich wolltest Du da eher ein digitalWrite(camPin, ledState); drin haben.
Auch das wäre mit ausführlicherer Namensgebung (z.B. "ledRedPin") sofort aufgefallen.

Was Du bei Op2 treiben willst ist mit ehrlich gesagt nicht so klar. Allerdings ist's schonmal unsauber daß Du den 10bit-Wert des ADCs mit dem 8bit-Wert für PWM vermischst. Um das Problem zu beseitigen würde ich den Sensorwert schon beim Einlesen nach 8bit umformen mit
lightLevel = analogRead(sensorPin) >> 2;

Außerdem ist wohl die Reihenfolge von Codezeilen verrutscht. Die letzten beiden Befehle dort (map, constrain) sind wirkungslos. Sie verändern die Variable lightLevel und die nächste Operation mit dieser erfolgt beim nächsten Funktionseintritt - dort wird sie aber gleich wieder mit dem Sensorwert überschrieben bevor sie irgendetwas bewirkt hat.
Womöglich hilft's schon die ersten beiden Zeilen der Funktion (lightLevel =... und analogWrite...) zu vertauschen.

Benny1989
02.03.2014, 23:56
Also ich hab beides Ausprobiert!

Habe aus ledPin - camPin gemacht - ich denke das is einer der Fehler in der Schaltung.

Das andere in Operation 2 verstehe ich nicht was du meinst, also mit den 10bit und 8 bit?
dann nehme ich eben ein anderen pin wenn das besser ist. oder ?

ist ganz einfach was ich möchte =)

der arduino soll zwei aufgaben erledigen:

Aufgabe1: auf Druck auf Taster bzw Schalter Netzwerkkamera ein und ggf. wieder ausschalten
Aufgabe2: LED´s momentan 1x LED ( später auf dem RSL7 mehrere LEDs) per Sensor ein und ausschalten
so wie in meinem Tutorial, also nicht nur an aus, sondern auch solangsam über den Analogen Eingang.

Wie im Auto =) Hell - Licht aus / Dunkel - Licht an =)

Mfg Benny

cdk
03.03.2014, 06:26
Das andere in Operation 2 verstehe ich nicht was du meinst, also mit den 10bit und 8 bit?
dann nehme ich eben ein anderen pin wenn das besser ist. oder ? Alle Arduino-ADCs, egal von welchem ADC-Pin, liefern 10bit, also einen int-Wert. Einen solchen nimmst Du und schreibst ihn 8-bittig auf einen PWM-Ausgang, welcher nur unsigned char "versteht". Ob das in dem Fall ein wirkliches Problem ist weiß ich nicht, aber sauber ist's halt nicht.


Aufgabe2: LED´s momentan 1x LED ( später auf dem RSL7 mehrere LEDs) per Sensor ein und ausschalten
so wie in meinem Tutorial, ... Was für'n Tutorial?

So wie ich das verstehe (der Sinn der +-30 ist mir nicht ganz klar...) könntest Du Deine Operation2() übrigens auf eine einzige Zeile reduzieren:

analogWrite (ledRedPin, (map(analogRead(sensorPin), 1023, 0, 30, 225) ); // LED-PWM ist mindestens 30 und maximal 225
Dabei wird die Umsetzung 10bit->8bit durch den map Befehl berücksichtigt

Ganz allgemein solltest Du Dir wohl einiges an Debug-Code einfügen, d.h. Deine fraglichen Werte immer erstmal über Serial.print auf die Konsole ausgeben. Natürlich mußt Du dann auch noch einige Delays einfügen um die serielle Schnittstelle nicht zu überfluten, was die Sache ziemlich hakelig macht, klar. Aber - wer schön sein will muß leiden :p. Auf diese Weise kommst Du dann so nach und nach selber drauf wo es mit dem Code hapert. Und wenn's denn funktionier tkann man den Debug wieder entfernen oder auskommentieren...

Benny1989
03.03.2014, 09:37
Guten Morgen,

okay also das mit den 10bit und 8bit PWM leuchtet mir ein und habs registriert :)

Das Tutorial hab ich gemeint, das bei dem Starter Kit dabei war, allerdings, kann ich als Neuling diesen Code,
nicht richtig nachvollziehen, und wenn jemand was nicht nachvollziehen kann tut man sich schwer!

Also der ganze Code aus Operation 2 kommt aus dem Tutorial von dem Starterkit weil du schreibst ( @cdk)


So wie ich das verstehe (der Sinn der +-30 ist mir nicht ganz klar...)

habe dann deine Code Zeile eingefügt und das andere auskommentiert. Da hat er aber gemeckert das der Satz im zu lang sei.

Aber kurz um da ich den Code nicht richtig verstehe, hab ich mich gestern Nacht nochmal auf die Suche gemacht und für mich einen
verständlichen Code gefunden!




char led_front_Pin = 7;

void setup()
{
pinMode(led_front_Pin, OUTPUT);
Serial.begin(9600);
}

void loop()
{
int sensorValue = analogRead(A1);
int mappedValue = 0;

mappedValue = map(sensorValue, 350, 1016, 0, 255 * 3);
// Wert von Berreich 350 bis 1023 auf 0 bis 3 * 255 legen
// http://arduino.cc/de/Reference/Map

Serial.println(mappedValue); // Wert Seriel Übertragen

if(mappedValue < 0) // Wenn der Wert kleiner wie 0
mappedValue = 0; // Wert auf 0 setzen

if(mappedValue < 1016)
{
analogWrite(led_front_Pin, mappedValue); // LED leuchtet bei Wert kleiner 1016
}
}



Da ich aber nur Vesperpause hab konnte ich den Code nur umschreiben, und nicht testen mit dem Arduino.
Hab den Code praktisch für mich umgeschrieben.

Als Info noch: die led_front_Pin = 7; ist der Pin .... ledPin = 4; von gestern.


Mfg Benny

cdk
03.03.2014, 21:02
okay also das mit den 10bit und 8bit PWM leuchtet mir ein und habs registriert Du machst das jetzt aber schon wieder. Mit 8 Bit ist Schluss bei 255 - und 3*255 wäre dann abermals ein 10bit-Wert.


habe dann deine Code Zeile eingefügt und das andere auskommentiert. Da hat er aber gemeckert das der Satz im zu lang sei. Ja stimmt, da fehlt noch 'ne weitere abschliessende Klammer vor'm ';'. Wollte... *hust* ähm... nur mal sehen ob Du's merkst... :) ;)


Da ich aber nur Vesperpause hab konnte ich den Code nur umschreiben, ... Macht ganz schön süchtig, was? Mit hat's auch vor'n paar Wochen erwischt...

Benny1989
03.03.2014, 21:20
Guten Abend =)

ja das macht sehr sehr süchtig, da muss ich dir recht geben, vor allem wenn man am verstehen ist :).

Okay ; vergessen aber vor welchem M meinst du denn ? oder stelle ich mich jetzt an?

Desweiteren hab ich heute mittag gesehen das ich in der Operation 2, ein steckfehler hatte.
Auf einmal funktioniert der Code auch ohne den Satz von dir @cdk.

Wenn ich weis wohin die klammer dann, werde ich es testen.

Das winzigste ist nur das Die LED aus Operation 1 nicht angeht, obwohl der Serial Monitor ( LED an und LED aus ) ausgibt.

Habe aber geschaut das in der Operation 1 kein Steckfehler mehr drin ist

Mfg Benny

cdk
03.03.2014, 21:50
Okay ; vergessen aber vor welchem M meinst du denn ? oder stelle ich mich jetzt an? Nix M. Ich meinte damit "vor dem Strichpunkt fehlt eine Klammer". Also:

analogWrite (ledRedPin, (map ( analogRead(sensorPin), 1023, 0, 30, 225 ) ) ); // LED-PWM ist mindestens 30 und maximal 225

Allerdings steckt da halt meine gestrige Interpretation der +-30 Geschichte drin, siehe Kommentar.

Benny1989
03.03.2014, 22:04
okay ich bin grad an dem Code am testen, habe auch grad geschnallt was du meinst :=)

Jetzt kommt die Fehlermeldung " at this point in file " ..... und der bzw dein Satz is gelb markiert.
Direkt übersetzt " an diesem Punkt in Datei "

Hast du ein tip cdk was das sein kann ?

Lg

cdk
03.03.2014, 22:35
Da mußt Du schon etwas genauer sagen was da bemängelt wird bzw. die genaue Meldung posten.

Wahrscheinlich hat Du zuvor eine KLammer oder einen ; oder sowas vergessen. Bei mir geht das jedenfalls ohne meckern durch den Compiler und es funktioniert auch - drehe ich das Poti (=Sensor) hoch wird die LED dunkler, drehe ich es runter wird sie heller.

Benny1989
03.03.2014, 22:57
okay ich kontrolliere es nochmal, cool hast du es ausprobiert bei dir ?

und alle anderen Sätze auskommentieren und nur den einen gell hab ich richtig verstanden ?

- - - Aktualisiert - - -

hier noch als nachtrag, die komplette Fehlermeldung:

/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Arduino.h: In function 'void Operation2()':
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Arduino.h:101: error: too many arguments to function 'int analogRead(uint8_t)'
Roboter_RSL7_Hauptaufgaben:76: error: at this point in file
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Arduino.h:209: error: too few arguments to function 'long int map(long int, long int, long int, long int, long int)'
Roboter_RSL7_Hauptaufgaben:76: error: at this point in file

cdk
04.03.2014, 01:18
So sieht die komplette Funktion bei mir aus:

void Operation2() { // LED SENSOR
analogWrite (ledRedPin, (map ( analogRead(sensorPin), 1023, 0, 30, 225 ) ) ); // LED-PWM ist mindestens 30 und maximal 225
}
Alle Klammern und Kommas korrekt? Hast Du die Variablennamen auf Deine Umgebung angepasst? ledRedPin und sensorPin sind bei mir global deklariert.

Benny1989
04.03.2014, 09:25
okay wieder mein Fehler, hat eine Klammer nach sensorPin gefehlt :D

Habe jetzt noch eine Funktion testweise eingebaut, wo eine LED eine 1 Sekunde an bleibt und nach 200 ms wieder ausgeht.

Also Operation2 ( LED Sensor) und Operation3 ( Blinklicht ) funktunieren einwandfrei, hab bei OP2 noch den wert 30 und 255 vertauschen müssen,
sonst war der Effekt genau anders herum.

Jetzt hab ich nur noch ein Problem in Operation1 ( Netzwerkkamera Ein/Aus ), das der Serielle Monitor zwar "LED An" und "LED Aus" ausgibt,
aber die LED nicht an und aus geht! Habe aber geschaut das sich diesmal kein Fehler auf dem Steckbrett eingeschlichen hat.

Hier nochmal mein Momentaner Code, so wie er fast läuft:




/*

Autor: Benjamin Grammel
Datum: 28.02.2014
Projekt: Roboter RSL-7
Verwendungszweck: Operation 1: Netzwerkkamera am Roboter manuell ein und Ausschalten
Operation 2: LED´s per Lichtsensor steuern
Operation 3: Blinklicht
*/

// ----------------------------------------



// Konstante für Operation1 = Netzwerkkamera
const int switchPin = 2;
const int camPin = 3;

// Konstante für Operation2 = LED SENSOR
const int sensorPin = A1;
const int ledFrontPin = 7;

// Konstante für Operation3 = Blinklicht
const int controlPin = 10;

int state; // Variable für Operation1 = Netzwerkkammera Ein / Aus
int lastState; // Variable für Operation1 = Netzwerkkammera Ein / Aus
int ledState; // Variable für Operation1 = Netzwerkkammera Ein / Aus


void setup()
{
pinMode(camPin, OUTPUT);
pinMode(switchPin, INPUT);
pinMode(ledFrontPin, OUTPUT);
pinMode(controlPin, OUTPUT);

Serial.begin(9600);


}

void Operation1() // Netzwerkkamera Ein / Aus
{
state = digitalRead(switchPin);

if (state != lastState)
{
if (state == HIGH)
{
if (ledState == HIGH)
{
ledState = LOW;
Serial.println("LED AUS");
}
else
{
ledState = HIGH;
Serial.println("LED EIN");
}
}
lastState = state;
}

digitalWrite(camPin, ledState);
delay(20);

}


// ----------------------------------------

void Operation2() // LED SENSOR steuert LED´s
{
analogWrite(ledFrontPin, (map(analogRead(sensorPin), 1023, 0, 255, 30))); // LED-PWM ist mindestens 30 und maximal 255
}

// ----------------------------------------

void Operation3() // Kontroll LED
{
digitalWrite(controlPin, HIGH); // LED An
delay(1000);
//-----------------------------
digitalWrite(controlPin, LOW); // LED Aus
delay(200);
}


void loop()
{
Operation1(); // Netzwerkkamera ein und aus schalten
Operation2(); // Sensor steuert LED´s
Operation3(); // Kontroll LED
}

cdk
05.03.2014, 00:55
okay wieder mein Fehler, hat eine Klammer nach sensorPin gefehlt Sag mal - Du tippst das Zeug doch nicht etwa von Hand ab??? Das kann man doch markieren und über Zwischenablage einfügen...


Jetzt hab ich nur noch ein Problem in Operation1 ( Netzwerkkamera Ein/Aus ), das der Serielle Monitor zwar "LED An" und "LED Aus" ausgibt,
aber die LED nicht an und aus geht! Also bei mir geht das. Ziemlich hakelig aufgrund der langen Delays (man muß halt lange drücken) aber es geht.

Sisor
05.03.2014, 15:17
Also bei mir geht das. Ziemlich hakelig aufgrund der langen Delays (man muß halt lange drücken) aber es geht.

Wie wärs damit?:


void Operation3() // Kontroll LED
{
static unsigned long startTime = 0 ;
static unsigned long currentTime = millis();

if (currentTime-startTime < 1000)
digitalWrite(controlPin, HIGH); // LED An
else if (currentTime-startTime < 1200)
digitalWrite(controlPin, LOW); // LED Aus
else
startTime = currentTime;
}

Benny1989
05.03.2014, 17:08
@cdk

ja ich tippe momentan ab, is mir klar das sich dann Fehler einschleichen können, ABER ich finde ich lerne die Schreibweise
und ich lern dadurch auch verstehen, wenn ich es abschreibe, so kann ich vor mich hin plappern und es abtippen.

Hat mir bei konstruieren früher auch geholfen, wenn das jemand gehört hätte, würde er meinen ich führe Selbstgespräche =)
Finde einfach das hilft mir, es besser zu verstehen, werde nachher schon rein kopieren das is klar ...


@Sisor

cool, so hab ich es noch ned betrachtet, muss ich mir erst einmal genau anschauen das ich es verstehe =)
Wie gesagt Neuling und brauch immer ein paar Minuten bis ich es verstanden hab, besonders mit den "if" Anwendungen :(

ach und @cdk, es war in der Operation 1 - Netzwerkkamera Ein/Aus doch ein steck Fehler, die LED hat Falsch herum drin gesteckt,
hatte die Schaltung 5mal kontrolliert, aber die LED nicht herausgezogen =(

Ich hab euch ein kleines Video gemacht, das mann das auch mal Life sieht, jetzt funktioniert alles so wie ich es wollte, also vorab einmal.
Mein LCD Display is auch gekommen, hab ich auch schon gleich Integriert, sogar selbständig, das Programm geschrieben, freut mich das Ichs hinbekommen hab (grins)

Zum Video: Die Rote LED simuliert die Netzwerkkamera ( Ein/Aus ) und die Gelbe LED simuliert die LED´s die an der Front des RSL7 angebracht werden
und sollen über den Fotowiderstand gesteuert werden also Hell = Aus / Dunkel = An




http://www.youtube.com/watch?v=MS72iEjrdF0&feature=youtu.be



Und hier nochmals der Code, so wie es im Video zu sehen ist:



/*

Autor: Benjamin Grammel
Datum: 28.02.2014
Projekt: Roboter RSL-7
Version: 1.2
Verwendungszweck: Operation 1: Netzwerkkamera am Roboter manuell ein und Ausschalten
Operation 2: LED´s per Lichtsensor steuern
Operation 3: Schrift auf LCD Display anzeigen
*/

// ----------------------------------------
#include <LiquidCrystal.h> / LCD Bibliothek


// Konstante für Operation1 = Netzwerkkamera
const int switchPin = 9;
const int camPin = 8;

// Konstante für Operation2 = LED SENSOR
const int sensorPin = A1;
const int ledFrontPin = 7;


int state; // Variable für Operation1 = Netzwerkkammera Ein / Aus
int lastState; // Variable für Operation1 = Netzwerkkammera Ein / Aus
int ledState; // Variable für Operation1 = Netzwerkkammera Ein / Aus

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Inizialisirung der Bibliothek mit den Nummern
// der Pin´s für das LCD Display

void setup()
{
pinMode(camPin, OUTPUT);
pinMode(switchPin, INPUT);
pinMode(ledFrontPin, OUTPUT);

Serial.begin(9600);


// ---------- Variablen für LCD Display ----------

lcd.begin(16, 2); // Display Art / 16 Spalten & 2 Reihen

lcd.setCursor(0, 0); // Springe zu Reihe 1 & Platz 1
lcd.print("Roboter RSL7"); // Nachricht in Reihe 1

lcd.setCursor(0, 1); // Springe zu Reihe 2 & Platz 1
lcd.print("Betriebsbereit!"); // Nachricht in Reihe 2
}


void Operation1() // Netzwerkkamera Ein / Aus
{
state = digitalRead(switchPin);

if (state != lastState)
{
if (state == HIGH)
{
if (ledState == HIGH)
{
ledState = LOW;
Serial.println("LED AUS");
}
else
{
ledState = HIGH;
Serial.println("LED EIN");
}
}
lastState = state;
}

digitalWrite(camPin, ledState);
delay(20);
}


// ----------------------------------------

void Operation2() // LED SENSOR steuert LED´s
{
analogWrite(ledFrontPin, (map(analogRead(sensorPin), 1023, 0, 255, 30))); // LED-PWM ist mindestens 30 und maximal 255
}


void loop()
{
Operation1(); // Netzwerkkamera ein und aus schalten
Operation2(); // Sensor steuert LED´s
}



Mfg Benny

cdk
05.03.2014, 21:20
ach und @cdk, es war in der Operation 1 - Netzwerkkamera Ein/Aus doch ein steck Fehler, die LED hat Falsch herum drin gesteckt,
hatte die Schaltung 5mal kontrolliert, aber die LED nicht herausgezogen =(
Ich würde Dir empfehlen erstmal ein kleines Platinchen zusammenzulöten - 2 Taster, 2 LEDs, 1 Poti oder so in der Art und Jumperkabel zum Stecken dran. Damit kannst Du dann erstmal programmieren üben ohne Dich um Hardware scheren zu müssen.
So wie jetzt ist das ja ziemlich undankbar und hat viel Verzweiflungspotential wenn Du weder sicher sein kannst daß die Software funktioniert noch daß die Hardware funktioniert...

Benny1989
05.03.2014, 21:29
Ja da hast du recht, dann weis man das wenigstens die Hardware stimmt.

Hab ja schon angefangen, die Platine zu löten für mein RSL, aber nach 3 ständiger Fehlversuche, bin ich dann drauf gekommen, der Transistor lässt nur 0.6A an der
Basis durch, ich brauche für meine Netzwerkkamera aber mindestens einer der 1,5A an der Basis durch lässt. Bis ich da drauf gekommen bin, hast gedauert, ein kleiner
Lötfehler am Taster hatte sich auch noch eingeschlichen, aber gemerkt hatte ich es erst als ich den Transistor angelangt haben :P Dann bin ich die Daten nochmal durch
und habe gemerkt :)

Aber ich denke für 1 1/2 Wochen "Arduino" nicht schlecht =)

Soweit zufrieden, mit dem Display will ich noch etwas experimentieren, das er das Anzeigt wenn man die Netzwerkkamera ein und aus schaltet,
und ich hätte gern ein Ladebalken, der nach dem start des Arduino durchläuft und dann erst "Betriebsbereit!" erschein,
aber es ist ja noch kein Meister vom Himmel gefallen ;-)