3x LDR-Sensor - 1x funktioniert

Als erstes mein Aufbau: Uno R3, mir l293d Shield, 3 LDR-Sensoren, 4 Räder, 9V Batteriefach

Die LDR Sensoren haben einen Ausgang für analog und für digital. Sie hängen bei mir alle an den digitalen Pins 2, 5 und 8. Der LDR an Pin 2 funktioniert tadelos. Die anderen beiden geben max. ihre Status LED aus. Die Aktionsleuchte bleibt immer aus, egal wie sehr ich den Poti drehe.

Ich vermute es liegt nicht an den Sensoren, den diesen Fall habe ich schon überprüft, der Status bleibt gleich. Ich habe auch bereits die Lötpunkte überprüft und lockere Kabel ausgetauscht.

#include <AFMotor.h>
#include <Arduino.h>
#include <SoftwareSerial.h>
//#include <HCSR04.h>
int number;
char BT_input;
char oldInput;

/*byte triggerPin = 9;
byte echoPin = 7;
int duration, distance;*/

SoftwareSerial BlueTooth(10, 11);  // RX, TX
const int MOTOR_1 = 1; 
const int MOTOR_2 = 2; 
const int MOTOR_3 = 3; 
const int MOTOR_4 = 4; 

AF_DCMotor motor1(MOTOR_1, MOTOR12_64KHZ); // create motor object, 64KHz pwm
AF_DCMotor motor2(MOTOR_2, MOTOR12_64KHZ); // create motor object, 64KHz pwm
AF_DCMotor motor3(MOTOR_3, MOTOR12_64KHZ); // create motor object, 64KHz pwm
AF_DCMotor motor4(MOTOR_4, MOTOR12_64KHZ); // create motor object, 64KHz pwm

void setup() {
  Serial.begin(57600);
  Serial.println(F("Start..."));
  BlueTooth.begin(9600);
  //pinMode(triggerPin, OUTPUT);
  //pinMode(echoPin, INPUT);
  motor1.setSpeed(180);          // set the motor speed to 0-255
  motor2.setSpeed(180);
  motor3.setSpeed(180);
  motor4.setSpeed(180);
}

void loop() {
  getData();
  bluetooth();
  //getNewDistance();
}

void bluetooth() {


  switch (BT_input) {
  case 'X': taschenlampe();break;

    case 'B': car_back(); break;

    case 'F': car_front(); break;

    case 'L': car_left(); break;

    case 'R': car_right(); break;

    case 'S': car_Stop(); break;
  }
}

void getData() {
  while (BlueTooth.available()) {
    //char myChar = Serial.read();
    char myChar = BlueTooth.read();

    if (isAlpha(myChar)) {
      myChar = ucase(myChar);

      switch (myChar) {
        case 'X':
        case 'B':  //backward
        case 'F':  //forward
        case 'L':  //left
        case 'R':  //right
        case 'S':  //stop
          Serial.print(F("Input Char: "));
          Serial.println(myChar);
          BT_input = myChar;
          break;  //gültiges Zeichen

        default:
          if (myChar >= ' ') {
            Serial.print(F("FailChar: "));
            Serial.println(myChar, HEX);
            BT_input = 'S';
          }
      }
    }
  }

  if (oldInput != BT_input) {
    car_Stop();
    delay(20);  // kurze Pause schont die Antriebe!
    oldInput = BT_input;
  }
}
/*void getNewDistance() {
  distance = 0;
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(4);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = round(duration * .0343) / 2;
  Serial.print("Distance: ");
  Serial.println(distance);
}
void switchdrive() {
  switch (distance) {
    case 1 ... 15:
      car_front();
      Serial.println(F("zurueck"));
      delay(1200);
      drive();
      Serial.println(number);
      matrix_display(herz);
      break;

    case 16 ... 30:

      car_back();
      Serial.println(F("langsam vor"));
      matrix_display(smile);
      break;

    case 31 ... 45:
      car_back();
      Serial.println(F("Vorwaerts"));
      matrix_display(vor);
      break;

    default:
      car_back();
      Serial.println(F("default"));
      matrix_display(vor);
      break;
  }
}*/
char ucase(const char c) {
  if (c >= 'a' && c <= 'z') {
    return (c + ('A' - 'a'));
  }

  return c;
}
void car_back() {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
}
void car_front() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}
void car_left() {
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}
void car_right() {
  motor3.run(RELEASE);
  motor4.run(RELEASE);
  motor1.run(FORWARD);
  motor2.run(FORWARD);
}
void car_Stop() {
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
}
void taschenlampe() {
 int ldrright = digitalRead(5);
 Serial.println (ldrright);
 int ldrmiddle = digitalRead(2);
 Serial.println (ldrmiddle);
  int ldrleft = digitalRead(8);

  if (ldrright == 0 && ldrleft == 0 && ldrmiddle == 1) {

    Serial.println("F");

   car_front();

  }

  if (ldrright == 0 && ldrleft == 1 && ldrmiddle==0) {

    Serial.println("R");

    car_right();

  }

  if (ldrright == 1 && ldrleft == 0 && ldrmiddle==0) {

    Serial.println("L");

    car_left();

  }

  if (ldrright == 1 && ldrleft == 1 && ldrmiddle==1) {

    Serial.println("S");

   car_Stop();

  }

  delay(100);

}

Gibt es einen Grund was gegen 3 LDR Sensoren spricht? Ich hab den Eindruck die LDR's beeinflussen sich gegenseitig. Wenn ich an einem Poti drehe der aktuell nicht funktioniert, verändert sich die Helligkeit aller3 LDRs (Status LED's). Kann jetzt Einbildung sein.

Auch an analog macht er das selbe.

Wie sollen die funktioniren wenn die nicht deklariert werden?
Am Pin 2 hängt schon ein Motor.
Mach dir ein einfaches Programm womit mann die testet.

Wo zu int, es reicht byte.

Deine Sensoren am Digitalausgang sind wie Taster , die schalten erst wen es genug licht bekommen, den Schaltpunkt stellt mann mit dem Poti ein.

Also muss ich die Motor-Ports mit den digitalen Ports 1 bis 4 gleichsetzen? Ich dachte bisher die sind getrennt, aber eigentlich logisch, 2x2 kann nicht funktionieren bzw. der an 2 funktioniert komischerweise tadellos. Da wird auch der If-Befehl ausgeführt

Las die Motoren wie sie sind!
Du hast eine LDR Pin2 geklemmt dort ist doch schon Motor 2 drauf, man kann, sollte nicht auf einem PIN zwei Sachen machen! Was für PINs hast noch frei?

#include <AFMotor.h>
#include <Arduino.h>
#include <SoftwareSerial.h>
//#include <HCSR04.h>
int number;
char BT_input;
char oldInput;
int tl_links;
int tl_mitte;
int tl_rechts;
/*byte triggerPin = 9;
byte echoPin = 7;
int duration, distance;*/

SoftwareSerial BlueTooth(10, 11);  // RX, TX
const byte MOTOR_1 = 1; 
const byte MOTOR_2 = 2; 
const byte MOTOR_3 = 3; 
const byte MOTOR_4 = 4; 

AF_DCMotor motor1(MOTOR_1, MOTOR12_64KHZ); // create motor object, 64KHz pwm
AF_DCMotor motor2(MOTOR_2, MOTOR12_64KHZ); // create motor object, 64KHz pwm
AF_DCMotor motor3(MOTOR_3, MOTOR12_64KHZ); // create motor object, 64KHz pwm
AF_DCMotor motor4(MOTOR_4, MOTOR12_64KHZ); // create motor object, 64KHz pwm

void setup() {
  Serial.begin(57600);
  Serial.println(F("Start..."));
  BlueTooth.begin(9600);
  //pinMode(triggerPin, OUTPUT);
  //pinMode(echoPin, INPUT);
  motor1.setSpeed(180);          // set the motor speed to 0-255
  motor2.setSpeed(180);
  motor3.setSpeed(180);
  motor4.setSpeed(180);
  pinMode (5, INPUT);
  pinMode (7,INPUT);
  pinMode (8,INPUT);
}

void loop() {
  getData();
  bluetooth();
  //getNewDistance();
}

void bluetooth() {


  switch (BT_input) {
  case 'X': taschenlampe();break;

    case 'B': car_back(); break;

    case 'F': car_front(); break;

    case 'L': car_left(); break;

    case 'R': car_right(); break;

    case 'S': car_Stop(); break;
  }
}

void getData() {
  while (BlueTooth.available()) {
    //char myChar = Serial.read();
    char myChar = BlueTooth.read();

    if (isAlpha(myChar)) {
      myChar = ucase(myChar);

      switch (myChar) {
        case 'X':
        case 'B':  //backward
        case 'F':  //forward
        case 'L':  //left
        case 'R':  //right
        case 'S':  //stop
          Serial.print(F("Input Char: "));
          Serial.println(myChar);
          BT_input = myChar;
          break;  //gültiges Zeichen

        default:
          if (myChar >= ' ') {
            Serial.print(F("FailChar: "));
            Serial.println(myChar, HEX);
            BT_input = 'S';
          }
      }
    }
  }

  if (oldInput != BT_input) {
    car_Stop();
    delay(20);  // kurze Pause schont die Antriebe!
    oldInput = BT_input;
  }
}
/*void getNewDistance() {
  distance = 0;
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(4);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = round(duration * .0343) / 2;
  Serial.print("Distance: ");
  Serial.println(distance);
}
void switchdrive() {
  switch (distance) {
    case 1 ... 15:
      car_front();
      Serial.println(F("zurueck"));
      delay(1200);
      drive();
      Serial.println(number);
      matrix_display(herz);
      break;

    case 16 ... 30:

      car_back();
      Serial.println(F("langsam vor"));
      matrix_display(smile);
      break;

    case 31 ... 45:
      car_back();
      Serial.println(F("Vorwaerts"));
      matrix_display(vor);
      break;

    default:
      car_back();
      Serial.println(F("default"));
      matrix_display(vor);
      break;
  }
}*/
char ucase(const char c) {
  if (c >= 'a' && c <= 'z') {
    return (c + ('A' - 'a'));
  }

  return c;
}
void car_back() {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
}
void car_front() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}
void car_left() {
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}
void car_right() {
  motor3.run(RELEASE);
  motor4.run(RELEASE);
  motor1.run(FORWARD);
  motor2.run(FORWARD);
}
void car_Stop() {
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
}
void taschenlampe() {
 int ldrright = digitalRead(5);
 Serial.println (ldrright);
 int ldrmiddle = digitalRead(7);
 Serial.println (ldrmiddle);
  int ldrleft = digitalRead(8);

  if (ldrright == 0 && ldrleft == 0 && ldrmiddle == 1) {

    Serial.println("F");

   car_front();

  }

  if (ldrright == 0 && ldrleft == 1 && ldrmiddle==0) {

    Serial.println("R");

    car_right();

  }

  if (ldrright == 1 && ldrleft == 0 && ldrmiddle==0) {

    Serial.println("L");

    car_left();

  }

  if (ldrright == 1 && ldrleft == 1 && ldrmiddle==1) {

    Serial.println("S");

   car_Stop();

  }

  delay(100);

}

Allerdings funktionieren jetzt alle 3 nicht mehr

@fony deswegen hängen sie ja an digital, da ich nur hell und dunkel brauche, also 0 und 1. Und der bisher an 2 gehangen hat, hat das wie gesagt bisher auch gemacht, aber jetzt nach dem umlöten funzt garkeiner mehr.

[quote="daria87, post:5, topic:1405481"]

const byte MOTOR_1 = 1; 
const byte MOTOR_2 = 2; 
const byte MOTOR_3 = 3; 
const byte MOTOR_4 = 4; 

dann wird nur Motor3 funktionieren :wink:
Bei Uno können nur die Pins 3, 5, 6, 9, 10, 11 PWM
Also für LDR wurde 1, 2, 7 nehmen

constexpr uint8_t LDR1 = 1;  //LDR  Digital auslesen!
constexpr uint8_t LDR2 = 2;
constexpr uint8_t LDR3 = 7;

constexpr uint8_t MOTOR_1 = 3; 
constexpr uint8_t MOTOR_2 = 5; 
constexpr uint8_t MOTOR_3 = 6; 
constexpr uint8_t MOTOR_4 = 9; 

uint8_t = Byte.

ich hab auf allen 3 Pins einzeln folgenden Code getestet:

int sensorPin = 8; // select the input pin for LDR

int sensorValue = 0; // variable to store the value coming from the sensor
void setup() {
Serial.begin(9600); //sets serial port for communication
}
void loop() {
sensorValue = analogRead(sensorPin); // read the value from the sensor
Serial.println(sensorValue); //prints the values coming from the sensor on the screen

delay(100);

}

Und es funktioniert weiterhin nur Pin 5. Die anderen änderen ihren Status nicht

das ist die Beschreibung von analogRead
https://docs.arduino.cc/language-reference/de/funktionen/analog-io/analogRead/

auf einem Uno R3 verwende

A0 A1 A2 A3 A4 A5

auch wenn ich es in digital umändere, ändert sich nichts.

Pin 8: beide Lampen leuchten, keine Änderung bei hell oder dunkel
Pin 5: beide Lampen leuchten, eine geht aus bei hell bzw dunkel
Pin 7: 1 LED leuchtet, wenn ich Poti drehe passiert nix, außer das bei allen LDR's die LED heller bzw dunkler werden.

Ich hab auch nochmal den anderen Sensortest gemacht, aber der Status bleibt immer identisch

Wenn du das Motorshield aufgesteckt hast gilt

The shield uses Pins D3,D4, D5, D6, D7, D8, D11 and D12 for DC and stepper motor control.

dir ist hoffentlich klar, dass du diese Pins dann nicht für deine Sensoren nutzen kannst, weil sie eben durch das Motorshield schon belegt sind und du nicht weist, welche Elektronik da an welchem Pin hängt außer du würdest im Schaltplan nachsehen.

Nutze für deine Sensoren freie Pins.

nagut, ich geh langsam tatsächlich davon aus, das 2 defekt sind. Anderer Uno ohne irgendwas anderes dran und sie gehen weiterhin nicht

da scheinst Du entweder was falsch verdrahtet zu haben oder ein Modul ist kaputt. Mach mal ein gutes Foto der 3 Sensoren.

Ich würde beim UNO R3 Pin 1 nicht nehmen.

grüße Uwe

ich denke die 2 Module sind kaputt. ich kann machen was ich will, es ändert sich einfach nichts daran.

Dann weiß ich wenigstens, dass ich da nicht mehr weiter experimentieren muss...

Habe auch nochmal meinen letzten LDR ausgepackt und schau her, es funktioniert. Also erstmal den Verkäufer kontaktieren :slight_smile:

Ich Danke euch für eure Hilfe

Bei einem Uno R3 liegen auf Pin 0/1 die serielle Schnittstelle... Möchte man vielleicht fürs flashen frei haben.

Pin 7 ist von den Motorshield belegt.

Da bieten sich die analogen Pins an. Die man übrigens auch digital abfragen kann.

Wenn man Ausgang gegen Ausgang schaltet kann da schon mal was kaputt gehen. Wie hast du das getestet?

Das mit Seial Pins hast recht , seit Ewigkeit kein Uno, Nano genutzt.
Und wennt ein Schild benutzt wird ist so wie so alles für die Katz sein, zu den verstehe nicht das alle paar Tage der Aufbau wird geändert.

Will nicht glauben das die defekt sind, mit dem Poti rumgespielt?
Und notfals die "Defekten" kannst doch an Analogenpins nutzen, mit analogRead auslesen, jedoch wird die LED nicht reagieren.

Zu dem es gibt 3 Sorten vom dem Schild, wen der gezeigter wird benutzt sind am Uno alle Digitale Pins belegt bis auf D2 und D3.
Man muss eben die gezeigte und Analoge nutzen, was ja auch geht.

Hast du links zu denen?

D3 ist belegt, aber D9 und D10 werden nur auf Pinheader geführt und sind somit verfügbar.

@daria87 woher hast den Sketsch?
Nutzt du ein Motorschield?
Wen die zweite Frage mit ja beantwortet wird, wird das niemals funktionieren.