INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Motor Steuerung durch Sensoren Werte
08.06.2017, 18:29
Beitrag #1
Motor Steuerung durch Sensoren Werte
Hallo zusammen,

Leider habe ich ein kleines Problem welches ich ohne eure Unterstützung nicht lösen kann.

Ich will mein Panzer mit Arduino und 3 Sonar Sensoren ( zur Kollisionsvermeidung) steuern. Alles läuft eigentlich prima.
Doch jetzt würde ich die Motoren je nach Hindernis nach links oder Rechts drehen lassen bis ein Wert erreicht ist.

Wie kann ich dies in C++ meinem Arduino "sagen"

Mein Sonar Code :

unsigned int uS1 = sonar1.ping(); //Sensor rechts
//Serial.print("Ping: ");
//Serial.print(uS1 / US_ROUNDTRIP_CM);
//Serial.println("cm");
uS1=uS1 / US_ROUNDTRIP_CM;
if (uS1 ==0 ){
uS1=50; // hier wird 50 bei 0 übergeben da der Sensor alles was über 80 cm entfernt ist als 0 deklariert
}

So weit so gut nun möchte ich in einer Funktion aber dass er so lange die Motoren dreht bis ein Wert ( zb. 30cm ) erreicht ist.

if (uS1 < 10 ) {
digitalWrite(leftMtrDirPin1, LOW);
digitalWrite(leftMtrDirPin2, LOW);
digitalWrite(rightMtrDirPin1, HIGH);
digitalWrite(rightMtrDirPin2, LOW); //yes - messed up soldering motor leads - LOW makes FWD in this case.
analogWrite(leftMtrSpdPin, 255); //drive the motor
analogWrite(rightMtrSpdPin, 255);
}
else ....

Wie kann ich in der Funktion den Motoren "sagen" drehe solange bis 30 cm Abstand erreicht worden sind.

Die Werte die mein Sonar ausgibt sind in cm.

Vielen dank vorab.

Beste Grüße
Christoph
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2017, 10:17
Beitrag #2
RE: Motor Steuerung durch Sensoren Werte
Leider bin ich nicht weiter gekommen ....

Habe versucht es mit einer schleife zu lösen :

if ((uS1 < 16 )) {//abstand kleiner als 16cm und abstand links grösser als 30
for (; uS1 > 30 ; uS1++)
{
//Motor A bacward @ full speed
digitalWrite(12, LOW);
digitalWrite(9, LOW);
analogWrite(3, 255);

//Motor B forward @ full speed
digitalWrite(13, HIGH);
digitalWrite(8, LOW);
analogWrite(11, 255);

}
}
else {
//Motor A forward @ full speed
digitalWrite(12, HIGH);
digitalWrite(9, LOW);
analogWrite(3, 255);

//Motor B forward @ full speed
digitalWrite(13, HIGH);
digitalWrite(8, LOW);
analogWrite(11, 255);
}

Es wird nur die else Bedingung erfüllt.??
Wie kann ich der schleife den aktuellen us1 wert übergeben damit die bis zur Abbruchbedingung > 30 arbeiten kann ???

Gruß
Christoph
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2017, 10:34
Beitrag #3
RE: Motor Steuerung durch Sensoren Werte
(10.06.2017 10:17)Zerebrator schrieb:  Leider bin ich nicht weiter gekommen ....

Setze deinen Sketch bitte in Code-Tags, dann können wir alle den besser lesen.

Wie das geht, steht hier.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2017, 11:14
Beitrag #4
RE: Motor Steuerung durch Sensoren Werte
(10.06.2017 10:34)hotsystems schrieb:  
(10.06.2017 10:17)Zerebrator schrieb:  Leider bin ich nicht weiter gekommen ....

Setze deinen Sketch bitte in Code-Tags, dann können wir alle den besser lesen.

Wie das geht, steht hier.

OK
anbei der Code :
Code:
if ((uS1 < 16 )) {//abstand kleiner als 16cm und abstand links grösser als 30  
        for (; uS1 > 30 ; uS1++)
        {
        //Motor A forward @ full speed
     digitalWrite(12, LOW); //Establishes forward direction of Channel A
     digitalWrite(9, LOW); //Disengage the Brake for Channel A
     analogWrite(3, 255); //Spins the motor on Channel A at full speed
  
     //Motor B forward @ full speed
     digitalWrite(13, HIGH); //Establishes backward direction of Channel B
     digitalWrite(8, LOW); //Disengage the Brake for Channel B
     analogWrite(11, 255); //Spins the motor on Channel B at full speed
        
        }
}
else {
       //Motor A forward @ full speed
     digitalWrite(12, HIGH); //Establishes forward direction of Channel A
     digitalWrite(9, LOW); //Disengage the Brake for Channel A
     analogWrite(3, 255); //Spins the motor on Channel A at full speed
  
     //Motor B forward @ full speed
     digitalWrite(13, HIGH); //Establishes backward direction of Channel B
     digitalWrite(8, LOW); //Disengage the Brake for Channel B
     analogWrite(11, 255); //Spins the motor on Channel B at full speed
}

  
}  //end loop

Anbei ebenso der ganzer Code ( wobei es kommt hier nur auf die 1 Anweisung)

Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <NewPing.h>
#include <Servo.h>

#define CMPS10Addr  0x60 // Addresse des CMPS10

#define TRIGGER_PIN  26
#define ECHO_PIN     27
#define MAX_DISTANCE 50

NewPing sonar3(TRIGGER_PIN,ECHO_PIN, MAX_DISTANCE); // Sensor links

#define TRIGGER_PIN  28
#define ECHO_PIN     29  
#define MAX_DISTANCE 50

NewPing sonar2(TRIGGER_PIN,ECHO_PIN, MAX_DISTANCE); // Sensor mitte

#define TRIGGER_PIN  30  
#define ECHO_PIN     31  
#define MAX_DISTANCE 50

NewPing sonar1(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Sensor rechts


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

//Sharp Sensor initialisierung
int sharpsensorpin = 10;
int sharpval = 0;

//Ultraschallsensoren initialisierung
const byte TRIGGER1 = 26; //Sensor Links
const byte TRIGGER2 = 28; // Sensor mitte
const byte TRIGGER3 = 30; // Sensor rechts

const byte ECHO1 = 27; //sensor links
const byte ECHO2 = 29; //sensor mitte
const byte ECHO3 = 31; //sensor rechts
//Servo Initialisierung
Servo servo1;        //Servo Objekte erzeugen
Servo servo2;

const int servoPin1 = 33; // Servo vaagrechte bewegung
int servoPos1 = 70;

const int servoPin2 = 34; // Servo senkrechte bewegung
int servoPos2 = 140;


void setup()
{
Serial.begin(9600);  
  Serial1.begin(19200); // Serielle Schnittstelle Initieren
    //Setup Channel A
  pinMode(12, OUTPUT); //Initiates Motor Channel A pin
  pinMode(9, OUTPUT); //Initiates Brake Channel A pin

  //Setup Channel B
  pinMode(13, OUTPUT); //Initiates Motor Channel A pin
  pinMode(8, OUTPUT);  //Initiates Brake Channel A pin  
  
  lcd.begin(16,2);
  Wire.begin(); // Connect to I2C  
  servo1.attach(servoPin1); // Servo waagerecht
  servo2.attach(servoPin2);

  //servo1.write(servoPos1); // Servo senkrecht
  //servo2.write(servoPos2);
  

while (Serial.available()) {
  }
}

void loop()
{
   delay(30);                      
  unsigned int uS1 = sonar1.ping(); //Sensor rechts
  //Serial.print("Ping: ");
  //Serial.print(uS1 / US_ROUNDTRIP_CM);
  //Serial.println("cm");
  uS1=uS1 / US_ROUNDTRIP_CM;
  if (uS1 ==0 ){
uS1=50;
}

  delay(30);                      
unsigned int uS2 = sonar2.ping(); // Sensor mitte
//Serial.print("Ping: ");
//Serial.print(uS2 / US_ROUNDTRIP_CM);
//Serial.println("cm");
uS2=uS2 / US_ROUNDTRIP_CM;
  if (uS2 ==0 ){
uS2=50;
}

  delay(30);                      
  unsigned int uS3 = sonar3.ping(); // Sensor links
  //Serial.print("Ping: ");
  //Serial.print(uS3 / US_ROUNDTRIP_CM);
  //Serial.println("cm");
uS3=uS3 / US_ROUNDTRIP_CM;
  if (uS3 ==0 ){
uS3=50;
}

//Sharp Sensor Werte auslesen
sharpval = analogRead(sharpsensorpin);
Serial.println(sharpval);
delay (30);

// Drehung begrenzen
  if(servoPos1 < 20) servoPos1 = 20;
  if(servoPos1 > 140) servoPos1 = 140;
  if(servoPos2 < 100) servoPos2 = 100;
  if(servoPos2 > 170) servoPos2 = 170;

  // Position der Servos setzen
  servo1.write(servoPos1);
  servo2.write(servoPos2);

  /////////////////////////////////////////////////////////////
  //     Kompass Modul Abfrage und senden der Daten         ///
  ////////////////////////////////////////////////////////////
  
  byte byteHigh, byteLow; // byteHigh / byteLow für Bearing
  char pitch, roll;       // Pitch und Roll
  int bearing;            // Bearing

  Wire.beginTransmission(CMPS10Addr); // Kommunikation mit CMPS10
  Wire.write(2);                      // Start Register (2)
  Wire.endTransmission();
  Wire.requestFrom(CMPS10Addr , 4); // Abfrage von 4 Bytes vom CMPS10
  while (Wire.available() < 4); // Warten, bis 4 Bytes verfügbar
  byteHigh = Wire.read();       // High-Byte für Bearing speichern
  byteLow = Wire.read();        // Low-Byte für Bearing speichern
  pitch = Wire.read();          // Byte für Pitch speichern
  roll = Wire.read();           // Byte für Roll speichern
  bearing = ((byteHigh << 8) + byteLow) / 10; // Bearing berechnen
  
  sendData(bearing, pitch, roll);             // Daten versenden

// Funktion zur Kollisionvermeidung Beginnt

if ((uS1 < 16 )) {//abstand kleiner als 16cm und abstand links grösser als 30  
        for (; uS1 > 30 ; uS1++)
        {
        //Motor A forward @ full speed
     digitalWrite(12, LOW); //Establishes forward direction of Channel A
     digitalWrite(9, LOW); //Disengage the Brake for Channel A
     analogWrite(3, 255); //Spins the motor on Channel A at full speed
  
     //Motor B forward @ full speed
     digitalWrite(13, HIGH); //Establishes backward direction of Channel B
     digitalWrite(8, LOW); //Disengage the Brake for Channel B
     analogWrite(11, 255); //Spins the motor on Channel B at full speed
        
        }
}
else {
       //Motor A forward @ full speed
     digitalWrite(12, HIGH); //Establishes forward direction of Channel A
     digitalWrite(9, LOW); //Disengage the Brake for Channel A
     analogWrite(3, 255); //Spins the motor on Channel A at full speed
  
     //Motor B forward @ full speed
     digitalWrite(13, HIGH); //Establishes backward direction of Channel B
     digitalWrite(8, LOW); //Disengage the Brake for Channel B
     analogWrite(11, 255); //Spins the motor on Channel B at full speed
}

  
}  //end loop

void sendData(int bearing, int pitch, int roll) {
  String data = String(bearing) + ";" + String(pitch) + ";" + String(roll);
  
  lcd.setCursor(0,0);
    lcd.print("bear-pitch-roll");
    lcd.setCursor(0,1);
    lcd.print(data);
  
  
// Serial.println(data);
delay (100);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2017, 12:09
Beitrag #5
RE: Motor Steuerung durch Sensoren Werte
Ok, der Sketch ist so auch auf Mobilgeräten lesbar.
Und gleich deine erste if-Abfrage ist falsch.
Du verwendest für beide Auswertungen die Variable "uS1", das kann nicht funktionieren. Du musst unterschiedliche Variablen abfragen. Auch verstehe ich den Aufbau deiner "for-Schleife" nicht. Wozu diese überhaupt ?

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2017, 13:26
Beitrag #6
RE: Motor Steuerung durch Sensoren Werte
(10.06.2017 12:09)hotsystems schrieb:  Ok, der Sketch ist so auch auf Mobilgeräten lesbar.
Und gleich deine erste if-Abfrage ist falsch.
Du verwendest für beide Auswertungen die Variable "uS1", das kann nicht funktionieren. Du musst unterschiedliche Variablen abfragen. Auch verstehe ich den Aufbau deiner "for-Schleife" nicht. Wozu diese überhaupt ?

Jou kannst du mir bitte sagen was falsch ist ...

Sonst ... ja wie kann ich die Situation anders lösen.
Mir gehet es vor allem darum dass die Motoren so lange nach links laufen bis 30 cm Entfernung vom Hindernis erreich worden sind. Dann geht es weiter gerade aus. usw...

Dies würde ich gerne später auf mein Kompassmodul übertargen und es immer ja nach Position ( linker Sonar bzw. rechter Sonar ) um 90° nach links bzw nach rechts drehen .

Doch im Moment schaffe ich nicht mal die Funktion mit den Sonar Sensor...

Wie sollte der Code aussehen ?

SG
Chr.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2017, 13:44
Beitrag #7
RE: Motor Steuerung durch Sensoren Werte
(10.06.2017 13:26)Zerebrator schrieb:  Jou kannst du mir bitte sagen was falsch ist ...

Hatte ich doch geschrieben. Du verwendest die Variable doppelt !

Und warum die "for-Schleife" ?
Den Sinn kann ich nicht sehen.

Ich würde es so lösen (Beispiel):
Code:
if ((uS1 <= 16 ) && (uS2 >= 30)) {
// deine Anweisungen
}
und hoffe deine Funktion richtig verstanden zu haben.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2017, 14:31
Beitrag #8
RE: Motor Steuerung durch Sensoren Werte
Ja das löst aber meine Aufgabe nicht.
Denn wie aus dem Code ersichtlich, es sind 3 Sensoren
Links ; Mitte ; Rechts

Die anderen übernehmen ganz andre Aufgaben also nix mit wenn uS2 > 30.

Es muss doch gehen das ich die bei 16 cm anfange zu drehen und bei erreichen der 30 cm aufhöre.
Ebenso sollte das ganze auf Bearing übertragbar sein. Hindernis erkannt drehe um 90° ++ bzw. 90 ° --.

2 Variablen... dh.
Code:
uS1=xS1

if ((uS1 < 16 )) {//abstand kleiner als 16cm und abstand links grösser als 30  
        for (int xS1; xS1 > 30 ; xS1++)
        {
        //Motor A forward @ full speed

Stimmt das denn so ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  struct-Objekt - Werte zuweisung zeigt merkwürdiges Verhalten Jan99 3 174 31.01.2020 12:10
Letzter Beitrag: Tommy56
  Möchte einen 12V DC Motor mit H-Brücke, Abbremsen und Timer betreiben! Tibor 4 242 24.01.2020 10:58
Letzter Beitrag: hotsystems
Brick Rutschauto LED Steuerung TheUndecision 1 195 21.01.2020 08:38
Letzter Beitrag: hotsystems
  Kühllüfter Steuerung Matthias4x4 13 625 14.01.2020 15:11
Letzter Beitrag: RMR
  DC Motor Poti Drehzahl begrenzen Tyson123 6 386 09.01.2020 13:01
Letzter Beitrag: Tyson123
  zwei Werte im Eeprom ablegen senseman 2 398 14.12.2019 22:50
Letzter Beitrag: senseman
  DS3234 Werte auf Nextion Kurt 10 667 01.12.2019 16:27
Letzter Beitrag: Kurt
  Werte in Arduino mittels Drucktaster eingeben und mittels Formel Wert berechnen Pauli33_student 5 464 04.11.2019 13:20
Letzter Beitrag: Peter_hno3
  Falsche Werte im Array semmelsamu 6 536 27.10.2019 18:45
Letzter Beitrag: semmelsamu
Shocked Lin Bus / Motor / Arduino Marc2014 5 1.046 19.09.2019 21:51
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste