Pages: 1 [2] 3   Go Down
Author Topic: 4 einzelne digitale Pins als Variable zusammenfassen  (Read 1908 times)
0 Members and 1 Guest are viewing this topic.
Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20218
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn es um Laufzeit geht, ist das direkte Auslesen von PORTD am besten (wie guntherb vorgeschlagen hat):
Da wird sich guntherb aber freuen  smiley-wink smiley-wink smiley-wink
Grüße Uwe
Logged

Offline Offline
Edison Member
*
Karma: 31
Posts: 1040
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Da wird sich guntherb aber freuen   smiley-wink smiley-wink
Grüße Uwe

Klar freue ich mich!
Man kann sich doch auch über fremde Federn freuen! smiley-wink
Nein, die Lorbeeren gebühren eindeutig Dir!
Logged

Grüße
Gunther

Offline Offline
Full Member
***
Karma: 4
Posts: 140
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sorry uwefed, hab nur auf den letzten Post geachtet und gedacht alle seien von gunterb smiley-wink
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20218
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sorry uwefed, hab nur auf den letzten Post geachtet und gedacht alle seien von gunterb smiley-wink

Ist nicht schlimm, ich muß nur manchmal etwas lärmen.  smiley-wink smiley-wink smiley-wink

guntherb hat's aber eindeutiger ausführlicher behandelt. smiley-cool smiley-cool

Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hey,
ich war in den letzten Tagen leider nicht im Forum aktiv, möchte mich aber nochmal für alle Tipps bedanken.

Mein Problem ist jetzt jedoch, dass mir für die 4 Lichtsensoren ingesamt nur 4 Pins zur verfügung stehen, da alle anderen Pins bereits belegt sind.

Wie lese ich diese 4 am besten aus?
Und wie kann ich die Varaible danach wieder auswerten?



ich würde mich über eine weitere schnelle Antwort freuen.


Gruß Sam
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 140
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn die Sensoren tatsächlich an Pins 4 - 7 angeschlossen sind, dann liest du die mit der bereits geposteten Zeile aus:
Code:
byte var = PORTD >> 4;

Den Status der einzelnen Pins kannst du wiederrum dannmit einer Verundung auswerten:
if (var & 1 ) für den ersten Sensor
if (var & 2 ) für den zweiten Sensor
if (var & 4 ) für den dritten Sensor
if (var & 8 ) für den vierten Sensor
Stichwort: Bitweise Operatoren

Diese Variante ist v. A. dann sinnvoll, wenn es darauf ankommt, dass alle Sensoren exakt gleichzeitig reingelesen werden sollen und deren Zustände mit wenig Speicherbedarf zu speichern und zu kopieren. Wenn es darauf nicht ankommt, würde ich auch den klassischen digitalRead() benutzen!

Anmerkung (1):
Evtl musst du mit geigneten Pull-up- bzw. -down-Widerständen die Sensoren so anpassen, dass sie als klare High- und Low-Signale erkannt werden können (High: Spannung > ~2/3 der Versorgung, Low: Spannung < ~1/3 der Versorgung)

Anmerkung (2):
Wenn du die Lichtsensoren analog betreibst, müssen sie natürlich an die analogen Arduino-Pins angeschlossen werden. Hier ist es dann aber nicht möglich, alle Werte gleichzeitig einzulesen, da es nur einen Analog-Digital-Wandler gibt, der nacheinander mit dem jeweiligem Pin verknüpft wird.
Stichwort: analogRead()
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

#include <Servo.h>


Servo SERVO_LINKS; // Linkes Rad
Servo SERVO_RECHTS; // Rechtes Rad
int SERVOANSCHLUSS_RECHTS=2; //Zuordnung Servoanschluss vom rechten Rad
int SERVOANSCHLUSS_LINKS=3; //Zuordnung Servoanschluss vom linken Rad
byte LICHTSENSORWERT=0; // In dieser Variablen werden die Ergebnisse der 4 Lichtsensoren zusammengefasst
boolean LICHTSENSOR_1=10; //Lichtsensor 1 wird Pin 10 zugeordnet
boolean LICHTSENSOR_2=11; //Lichtsensor 2 wird Pin 11 zugeordnet
boolean LICHTSENSOR_3=12; //Lichtsensor 3 wird Pin 12 zugeordnet
boolean LICHTSENSOR_4=13; //Lichtsensor 4 wird Pin 13 zugeordnet


void setup()
{
  SERVO_LINKS.attach(SERVOANSCHLUSS_LINKS); //linkes Rad 89-0 Vorwärts 91-180 Rückwärts
  SERVO_RECHTS.attach(SERVOANSCHLUSS_RECHTS); //rechtes Rad 91-180 Vorwärts 89-0 Rückwärts

 }
void loop()
{
  LICHTSENSOREN();
 
  switch (LICHTSENSORWERT)
  {
   case 0:
    SERVO_LINKS.write(0);    //Links vorwärts
     break;
     
   case 1:
    SERVO_LINKS.write(0);    //Links vorwärts
     break;
     
   case 2:
    SERVO_LINKS.write(0);    //Links vorwärts
     break;
     
   case 3:
    SERVO_LINKS.write(0);    //Links vorwärts
     break;
     
   case 4:
    SERVO_LINKS.write(180);  //Links rückwärts
     break;
     
   case 5:
    SERVO_LINKS.write(180);  //Links rückwärts
     break;
     
   case 6:
    SERVO_LINKS.write(180);  //Links rückwärts
     break;
     
   case 7:
    SERVO_LINKS.write(180);  //Links rückwärts
     break;
     
   case 8:
    SERVO_RECHTS.write(180); //Rechts vorwärts
     break;
     
   case 9:
    SERVO_RECHTS.write(180); //Rechts vorwärts
     break;
     
   case 10:
    SERVO_RECHTS.write(180); //Rechts vorwärts
     break;
     
   case 11:
    SERVO_RECHTS.write(180); //Rechts vorwärts
     break;
     
   case 12:
    SERVO_RECHTS.write(0);   //Rechts rückwärts
     break;
     
   case 13:
    SERVO_RECHTS.write(0);   //Rechts rückwärts
     break;
     
   case 14:
    SERVO_RECHTS.write(0);   //Rechts rückwärts
     break;
     
   case 15:
    SERVO_RECHTS.write(0);   //Rechts rückwärts
     break;   

   
  }
}



void LICHTSENSOREN()
{
LICHTSENSORWERT=0;
LICHTSENSORWERT = digitalRead(LICHTSENSOR_1);  // Pin 4 ins unterste Bit schreiben
LICHTSENSORWERT <<= 1;                         //  eines nach links schieben.,
LICHTSENSORWERT |= digitalRead(LICHTSENSOR_2);
LICHTSENSORWERT <<= 1;
LICHTSENSORWERT |= digitalRead(LICHTSENSOR_3);
LICHTSENSORWERT <<= 1;
LICHTSENSORWERT |= digitalRead(LICHTSENSOR_4);
}


Das ist mein Programmcode.
Wenn ich es ablaufen lasse, drehen sich aus irgend einem Grund beide Servos.

Habe ich einen Fehler gemacht?


Wenn jemand den Fehler findet, würde ich mich sehr freuen.

Gruß Sam
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 140
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hab den Fehler smiley-wink. Du hast die Pin-Nummern als "boolean" festgelegt (die können dann nur true oder false annehmen, nicht 10,11,12..."- das geht natürlich nicht, die sollten entweder vom Typen "(const) int" sein oder vordefiniert (#define).

Code:
boolean LICHTSENSOR_1=10; //Lichtsensor 1 wird Pin 10 zugeordnet  - neee!!!
...

Machs besser so:
Code:
const int LICHTSENSOR_1=10; //Lichtsensor 1 wird Pin 10 zugeordnet
...

oder so:
Code:
#define LICHTSENSOR_1 10; //Lichtsensor 1 wird Pin 10 zugeordnet
...
hier darfst du kein "=" setzen!

Tipp: verwende doch die Code-Tags wenn du Quellcode postest, das macht es einfacher zu lesen smiley-wink (das Rautezeichen "#")
« Last Edit: May 31, 2013, 05:15:10 am by MGOS » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für deine Hilfsbereitschaft, aber das mit Boolean muss so sein, weil ich die Variable ja sowieso nur mit 1 & 0 (binär) füllen möchte.

Das Programm läuft jetzt auch fehlerfrei:

Code:
#include <Servo.h>

Servo SERVO_LINKS; // Linkes Rad
Servo SERVO_RECHTS; // Rechtes Rad
int SERVOANSCHLUSS_RECHTS = 2; //Zuordnung Servoanschluss vom rechten Rad
int SERVOANSCHLUSS_LINKS = 3; //Zuordnung Servoanschluss vom linken Rad
byte LICHTSENSORWERT = 0; // In dieser Variablen werden die Ergebnisse der 4 Lichtsensoren zusammengefasst
boolean LICHTSENSOR_1 = 10; //Lichtsensor 1 wird Pin 10 zugeordnet
boolean LICHTSENSOR_2 = 11; //Lichtsensor 2 wird Pin 11 zugeordnet
boolean LICHTSENSOR_3 = 12; //Lichtsensor 3 wird Pin 12 zugeordnet
boolean LICHTSENSOR_4 = 13; //Lichtsensor 4 wird Pin 13 zugeordnet
int LED = 7; // Der LED wird Pin 7 zugeordnet (Später der Pin vom Taster)
int ZAHL_BLINKEN = 0; //Die Anzahl wie oft das Programm LED_BLINKEN ausgeführt wird
int ZAHL_GEBLINKT = 0; //Die Anzahl wie oft schon geblink wurde

void setup()
{
  pinMode(LED, OUTPUT);
 }
 
 
void loop()
{
   ZAHL_GEBLINKT=0;
   delay(5000);

  LICHTSENSOREN();
  
  switch (LICHTSENSORWERT)
  {
   case 0:
  ZAHL_BLINKEN = 2;  //Lichtsensoren 1+2+3+4 aktiviert
     break;
    
   case 1:
  ZAHL_BLINKEN = 3; //Lichtsensoren 1+2+3 aktiviert
     break;
    
   case 2:
  ZAHL_BLINKEN = 4;  //Lichtsensoren 1+2+4 aktiviert
     break;
    
   case 3:
  ZAHL_BLINKEN = 5;  //Lichtsensoren 1+2 aktiviert
     break;
    
   case 4:
  ZAHL_BLINKEN = 6;  //Lichtsensoren 1+3+4 aktiviert
     break;
    
   case 5:
  ZAHL_BLINKEN = 7;  //Lichtsensoren 1+3 aktiviert
     break;
    
   case 6:
  ZAHL_BLINKEN = 8;  //Lichtsensoren 1+4 aktiviert
     break;
    
   case 7:
  ZAHL_BLINKEN = 9;  //Lichtsensor_1 aktiviert
     break;
    
   case 8:
  ZAHL_BLINKEN = 10; //Lichtsensoren 2+3+4 aktiviert
     break;
    
   case 9:
  ZAHL_BLINKEN = 11;  //Lichtsensoren 2+3 aktiviert
     break;
    
   case 10:
  ZAHL_BLINKEN = 12;  //Lichtsensoren 2+4 aktiviert
     break;
    
   case 11:
  ZAHL_BLINKEN = 13; //Lichtsensor_2 aktiviert
     break;
    
   case 12:
  ZAHL_BLINKEN = 14;  //Lichtsensoren 3+4 aktiviert
     break;
    
   case 13:
  ZAHL_BLINKEN = 15;  //Lichtsensor_3 aktiviert
     break;
    
   case 14:
  ZAHL_BLINKEN = 16;  //Lichtsensor_4 aktiviert
     break;
    
   case 15:
  ZAHL_BLINKEN = 17;   //0 Sensoren aktiviert
     break;  
  }
  
  while (ZAHL_GEBLINKT < ZAHL_BLINKEN)
  {
    LED_BLINKEN();    
    ZAHL_GEBLINKT++;
  }
}



void LICHTSENSOREN()
{
LICHTSENSORWERT=0;
LICHTSENSORWERT = digitalRead(LICHTSENSOR_1);  // Pin 4 ins unterste Bit schreiben
LICHTSENSORWERT <<= 1;                         //  eines nach links schieben.,
LICHTSENSORWERT |= digitalRead(LICHTSENSOR_2);
LICHTSENSORWERT <<= 1;
LICHTSENSORWERT |= digitalRead(LICHTSENSOR_3);
LICHTSENSORWERT <<= 1;
LICHTSENSORWERT |= digitalRead(LICHTSENSOR_4);
}

void LED_BLINKEN()
{
 digitalWrite(LED, HIGH);
 delay(500);            
 digitalWrite(LED, LOW);  
 delay(500);  
}
« Last Edit: May 31, 2013, 06:46:15 pm by uwefed » Logged

Austria
Offline Offline
Full Member
***
Karma: 2
Posts: 107
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für deine Hilfsbereitschaft, aber das mit Boolean muss so sein, weil ich die Variable ja sowieso nur mit 1 & 0 (binär) füllen möchte.

In der Variable speichertst du aber nicht den Zustand des Sensors, sondern den Pin, an welchen er hängt. Deswegen kannst du hier nicht boolean verwenden.

Code:
boolean LICHTSENSOR_1 = 10; //Lichtsensor 1 wird Pin 10 zugeordnet

Hier willst du LICHTSENSOR_1 den Wert 10 zuweisen. 10 ist aber kein boolean.

Grüße,
J3RE
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20218
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Außerdem ist der Kode etwas kompliziert.

die ganze Swich Case Konstruktion:

Code:
switch (LICHTSENSORWERT)
  {
   case 0:
  ZAHL_BLINKEN = 2;  //Lichtsensoren 1+2+3+4 aktiviert
     break;
     
   case 1:
  ZAHL_BLINKEN = 3; //Lichtsensoren 1+2+3 aktiviert
     break;
...
kannst Du mit
Code:
ZAHL_BLINKEN = LICHTSENSORWERT +  2; 

gleichwertig ersetzen.

Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für den Tipp Uwe, aber ich will ja später verschiedene Aktionen dabei starten, aus dem Grund die Case abfrage.


J3RE ich ordne der boolean doch den Pin zu und keinen Wert.


Und es läuft fehlerfrei.


Als nächstes möchte ich einen analogen Taster anschließen, welcher als Ein/Aus Schalter genutzt wird.
Wie werte ich denTaster Analog am besten aus (möchte Analogmachen, weil ich nicht genug Digitale Pins habe).


Würde mich über einen weiteren Tipp sehr freuen


Gruß Sam
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20218
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J3RE ich ordne der boolean doch den Pin zu und keinen Wert.

Mit dem Kode und in C/C++ aber nicht

Quote from: SamBOT
Als nächstes möchte ich einen analogen Taster anschließen, welcher als Ein/Aus Schalter genutzt wird.
Wie werte ich denTaster Analog am besten aus (möchte Analogmachen, weil ich nicht genug Digitale Pins habe).

Was ist ein analoger Taster?
Die analogen Eingänge des Arduino können auch als digitale Ein/Ausgänge verwendet werden. beim Arduino UNO: A0 wird D14 ... A6 wird D19.

Grüße Uwe

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

das mit den Digitalen Pins die aus den Analogen entstehen wusste ich noch gar nicht.

Aber das hilft mir sehr weiter.

Muss man dafür was konfigurieren, oder einfach die entsprechenden Pins zuordnen?
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20218
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Einfach mit pinMode() als Eingang oder Ausgang definieren.
Grüße Uwe
Logged

Pages: 1 [2] 3   Go Up
Jump to: