mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Arduino Software Fehler


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Johann D. (johann_d)
Datum:

Bewertung
-5 lesenswert
nicht lesenswert
Hallo habe ein Auto gebaut was an einer Schwarz weißen Lienie entlang 
fahren soll. Mein Auto fährt allerdings mur auf einem schwarzen 
streifen. Wisst ihr wo mein fehler ist.
Hier meine Software:
#include <AFMotor.h>

#include <QTRSensors.h>


#include <AFMotor.h> // Adafruit Motor Shield Bibliothek. Zuerst müssen Sie die AFMotor-Bibliothek herunterladen und installieren
#include <QTRSensors.h> // Pololu QTR-Sensorbibliothek. Zuerst müssen Sie die QTRSensors-Bibliothek herunterladen und installieren
  
AF_DCMotor Motor1 (1, MOTOR12_1KHZ); // erzeuge Motor Nr. 1 unter Verwendung des M1-Ausgangs am Shield Motor Drive, eingestellt auf 1 kHz PWM-Frequenz
AF_DCMotor motor2 (2, MOTOR12_1KHZ); // erzeuge Motor Nr. 2 mit M2-Ausgang am Shield Motor Drive, eingestellt auf 1 kHz PWM-Frequenz
  
#define KP 2 // Experimentieren Sie, um dies zu bestimmen, beginnen Sie mit etwas, das Ihren Bot der Linie langsam folgen lässt
#define KD 5 // experimentieren Sie, um dies zu ermitteln, erhöhen Sie langsam die Geschwindigkeit und passen Sie diesen Wert an. (Anmerkung: Kp <Kd)
#define M1_minumum_speed 150 // Mindestgeschwindigkeit des Motors1
#define M2_minumum_speed 150 // Mindestgeschwindigkeit des Motors2
#define M1_maksimum_speed 250 // max. Geschwindigkeit des Motors1
#define M2_maksimum_speed 250 // max. Geschwindigkeit des Motors2
#define MIDDLE_SENSOR 4 // Nummer des verwendeten mittleren Sensors
#define NUM_SENSORS 5 // Anzahl der verwendeten Sensoren
#define TIMEOUT 2500 // wartet auf 2500 us, damit die Sensorausgänge niedrig werden
#define EMITTER_PIN 2 // emitterPin ist der digitale Arduino-Pin, der steuert, ob die LEDs ein- oder ausgeschaltet sind. Der Emitter wird über den digitalen Pin 2 gesteuert
#define DEBUG 0

// Die Sensoren 0 bis 5 sind mit den analogen Eingängen 0 bis 5 verbunden
QTRSensorsRC qtrrc ((nicht signiertes Zeichen []) {A4, A3, A2, A1, A0}, NUM_SENSORS, TIMEOUT, EMITTER_PIN);
  
unsigned int sensorValues [NUM_SENSORS];
  
void setup ()
{
Verzögerung (1500);
manual_calibration ();
set_motors (0,0);
}
  
int lastError = 0;
int last_proportional = 0;
int Integral = 0;
  
Leere Schleife ()
{
unsigned int Sensoren [5];
int position = qtrrc.readLine (Sensoren); // Erhalten Sie kalibrierte Messwerte zusammen mit der Zeilenposition. Weitere Informationen zur Zeilenposition finden Sie in der QT Sensors Arduino Library.
int error = Position - 2000;
  
int motorSpeed = KP * Fehler + KD * (Fehler - lastError);
lastError = Fehler;
  
int leftMotorSpeed = M1_minumum_speed + motorSpeed;
int rightMotorSpeed = M2_minumum_speed - Motorgeschwindigkeit;
  
// Stellen Sie die Motordrehzahlen mit den beiden oben genannten Motordrehzahlvariablen ein
set_motors (leftMotorSpeed, rightMotorSpeed);
}
  
void set_motors (int motor1gang, int motor2gang)
{
if (Motor1> M1_Maximum_Geschwindigkeit) Motor1Geschwindigkeit = M1_Maksimum_Geschwindigkeit;
if (motor2speed> M2_maximum_speed) motor2speed = M2_maximum_speed;
if (Motorgeschwindigkeit <0) Motorgeschwindigkeit = 0;
if (motor2speed <0) motor2speed = 0;
motor1.setSpeed (motor1speed);
motor2.setSpeed (motor2speed);
motor1.run (FORWARD);
motor2.run (FORWARD);
}

// Kalibrieren Sie für einige Zeit, indem Sie die Sensoren über die Linie schieben, oder verwenden Sie stattdessen die automatische Kalibrierung
void manuelle_kalibrierung () {
  
int i;
für (i = 0; i <250; i ++)
{
qtrrc.calibrate (QTR_EMITTERS_ON);
Verzögerung (20);
}
  
wenn (DEBUG) {
Serial.begin (9600);
für (int i = 0; i <NUM_SENSORS; i ++)
{
Serial.print (qtrrc.calibratedMinimumOn [i]);
Serial.print ('');
}
Serial.println ();
  
für (int i = 0; i <NUM_SENSORS; i ++)
{
Serial.print (qtrrc.calibratedMaximumOn [i]);
Serial.print ('');
}
Serial.println ();
Serial.println ();
}
}


Danke für eure Antworten

: Bearbeitet durch Moderator
Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Trotz der Quellcode-Tags, die ich nachträglich in Deinen Quelltext 
eingefügt habe, ist das ganze grottenschlecht zu lesen, da sämtliche 
Einrückungen fehlen.


Obendrein scheint der Quelltext automatisch ins Deutsche übersetzt zu 
sein, was dann gar nicht mehr funktionieren kann:

> QTRSensorsRC qtrrc ((nicht signiertes Zeichen []) {A4, A3, A2, A1, A0}, 
NUM_SENSORS, TIMEOUT, EMITTER_PIN);

> Leere Schleife ()

> für (i = 0; i <250; i ++)

> Verzögerung (20);

> wenn (DEBUG) {

>

Und was soll das hier?

> if (Motor1> M1_Maximum_Geschwindigkeit) Motor1Geschwindigkeit = 
M1_Maksimum_Geschwindigkeit;

Maximum oder Maksimum?



Poste den tatsächlichen Quelltext, am besten als Dateianhang, lass' 
den Quatsch mit der Übersetzung sein, und rücke alles anständig ein, 
damit man es vernünftig lesen kann.

Autor: Joachim B. (jar)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Johann D. schrieb:
> Mein Auto fährt allerdings mur auf einem schwarzen
> streifen.

das nennt sich normalerweise Asphalt und ist auch normal für Autos.
Mehr gibt dein Code nicht her.

Autor: Mario M. (thelonging)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Kommentare sagen, dass die Sensoren kalibriert und Reglerparameter 
angepasst werden müssen. Hast Du das schon getan?

Autor: Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Die Kommentare in dem obigen Quelltext sind doch ein deutlicher Hinweis, 
dass selbiger überhaupt nicht von Dir selbst stammt, sondern offenbar 
ein Vorlage ist, die von irgendeiner Lehranstalt zur Verfügung gestellt 
wurde.

Haben denn der Autor und/oder Rechteinhaber Dir explizit gestattet, 
den Quelltext in irgendwelchen Foren zu veröffentlichen, und zwar ohne 
Nennung der Urheberschaft? Falls nicht, handelt es sich ggf. um einen 
Rechtsverstoß.

Ich gehe davon aus, dass es sich bei dem TE nur um einen faulen und 
gleichzeitig kriminellen Studenten handelt, für den wir die Hausaufgaben 
machen sollen.

Autor: Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Mario M. schrieb:
> Die Kommentare sagen, dass die Sensoren kalibriert und Reglerparameter
> angepasst werden müssen. Hast Du das schon getan?

Nein, natürlich nicht. Wir sollen schließlich seine Hausaufgaben 
erledigen und ihm inklusive Kalibrierung auf dem Silbertablett 
servieren.

Autor: Stefanus F. (Firma: Äppel) (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hallo habe ein Auto gebaut was an einer Schwarz weißen Lienie
> entlang fahren soll. Mein Auto fährt allerdings mur auf einem
> schwarzen streifen.

Was meinst du mit "Schwarz weißen Linie"?

Wie ist der Sensor mechanisch aufgebaut?
Was ist das für eine seltsame Programmiersprache?
Kannst du bitte mal ordentlich einrücken?

Du hast nirgends eine Regelung der Position. Du subtrahierst 2000 von 
dem gemessenen Wert und machst dann nichts mit dem Ergebnis.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann D. schrieb:
> Wisst ihr wo mein fehler ist.

Für den Arduino solltest du ein Arduino Programm verwenden und das 
sollte zumindest eine Funktion loop() enthalten.
https://www.arduino.cc/en/Reference/Loop/

Das Werkzeugt zum vernünftigen formatieren findest du in der Arduino IDE 
im Menü Werkzeuge ;-)

Autor: PittyJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Johann D. schrieb:
>> Wisst ihr wo mein fehler ist.
>
> Für den Arduino solltest du ein Arduino Programm verwenden und das
> sollte zumindest eine Funktion loop() enthalten.
> https://www.arduino.cc/en/Reference/Loop/

Vielleicht ist das ja schon der Fehler.

Autor: Marco H. (damarco)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So sieht es aus wenn man Code über den Google Übersetzer schickt und der 
hatte auch keine Ahnung.

Autor: Marco H. (damarco)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schuss ins Blaue... Beim starten werden die Sensoren kalibriert. Das 
Auto bzw. dessen Sensoren müssen auf der Line stehen. Die Spannungen 
werden gelesen und gespeichert. So kann nachher die Abweichung ermittelt 
werden.

Entweder wurde die Sensoren vertauscht oder falsch kalibriert.

Autor: Stefanus F. (Firma: Äppel) (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls es dem TO noch nicht klar war:

Anfänger verwenden meist zwei Sensoren zwischen denen sie den Streifen 
positionieren. Beim NiboBee sind sogar drei Sensoren angebracht, ich 
habe keine Ahnung, was ich mit dem dritten anfangen soll.

Nach einigen schlechten Ergebnissen mit primitiver Software, die nur 
drei Zustände kennt (links, geradeaus, rechts) kommt man früher oder 
später auf eine Lösung mit PD oder PID Regelung und stellt dann fest, 
dass die Umsetzung mit nur einem Sensor einfacher und zuverlässiger 
funktioniert.

Man muss sich nur Gedanklich von diesen drei harten Zuständen trennen 
und den Roboter so programmieren, dass er der Kante einer Linie folgt. 
Die Kante hat mittlere Helligkeit, weiter links ist es dunkler, weiter 
rechts ist es heller. Der Sensor liefert ein analoges Signal, welches 
der Abweichung vom Soll entspricht. Die Lenkung lässt sich quasi-analog 
(damit meiner ich weit mehr als 3 Zustände) viel besser steuern.

Der Quelltext oben scheint diesen Lösungsweg zu unterstützen.

Vielleicht hilft das dem TO. Mehr möchte ich dazu nicht verraten, denn 
wer einfach nur 1:1 nach macht, lernt wenig.

: Bearbeitet durch User
Autor: npn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann D. schrieb:
> int i;
> für (i = 0; i <250; i ++)
> {
> qtrrc.calibrate (QTR_EMITTERS_ON);
> Verzögerung (20);
> }

Stefanus F. schrieb:
> Der Quelltext oben scheint diesen Lösungsweg zu unterstützen.

Der tut das ganz bestimmt nicht...

Autor: Stefanus F. (Firma: Äppel) (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Der Quelltext oben scheint diesen Lösungsweg zu unterstützen.
> Der tut das ganz bestimmt nicht...

Er ist natürlich offensichtlich noch unvollständig.

Autor: npn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
>>> Der Quelltext oben scheint diesen Lösungsweg zu unterstützen.
>> Der tut das ganz bestimmt nicht...
>
> Er ist natürlich offensichtlich noch unvollständig.

Nicht nur das. Er ist schlicht und einfach falsch und läßt sich 
garantiert nicht mal compilieren.
> für (i = 0; i <250; i ++)
oder
> Verzögerung (20);
oder die vielen anderen Übersetzungen frißt kein Compiler ;-)

Autor: molte (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Johann D. schrieb:
> Hallo habe ein Auto gebaut was an einer Schwarz weißen Lienie entlang
> fahren soll. Mein Auto fährt allerdings mur auf einem schwarzen
> streifen.

Wenn ich mir schon hier den Kopf zerbrechen muß, lese ich gar nicht erst 
weiter.

Autor: Bernhard S. (b_spitzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man den Google-Translator-Quatsch wieder zurückübersetzt, wird 
sogar Arduino-Code draus ;-)

QTRSensorsRC qtrrc ((nicht signiertes Zeichen [])... 
soll sein
QTRSensorsRC qtrrc ((unsigned char [])... 
 :
 :
   Verzögerung (1500);
soll sein
   delay(1500);
 :
 : 
   Leere Schleife ()
soll sein
   void loop()
 :
 :
   int error = Position - 2000;
   int motorSpeed ​​= KP * Fehler + KD * (Fehler - lastError);
   lastError = Fehler;
soll sein (hab den PD-Regler gefunden!!)
   int error = Position - 2000;
   int motorSpeed ​​= KP * error + KD * (error - lastError);
   lastError = error;

Schon Krass, was Google-Translate, Faulheit und Ignoranz zusammen 
ergeben :-)

Autor: Bernhard S. (b_spitzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielleicht sollte der OP mal mit der Original-Beschreibung anfangen und 
die dann -nach und nach - an sein Projekt anpassen:
https://www.pololu.com/docs/0J19/3

Autor: C.Ompiler (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Bernhard S. schrieb:
> Wenn man den Google-Translator-Quatsch wieder zurückübersetzt, wird
> sogar Arduino-Code draus ;-)

Na ich vermute mal, dass der TO irgendwo gehört oder gelesen hat, dass 
man den Quellcode übersetzen muss, bevor man ihn auf den Controller 
lädt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.