Forum: Mikrocontroller und Digitale Elektronik Arduino Software Fehler


von Johann D. (johann_d)


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:
1
#include <AFMotor.h>
2
3
#include <QTRSensors.h>
4
5
6
#include <AFMotor.h> // Adafruit Motor Shield Bibliothek. Zuerst müssen Sie die AFMotor-Bibliothek herunterladen und installieren
7
#include <QTRSensors.h> // Pololu QTR-Sensorbibliothek. Zuerst müssen Sie die QTRSensors-Bibliothek herunterladen und installieren
8
  
9
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
10
AF_DCMotor motor2 (2, MOTOR12_1KHZ); // erzeuge Motor Nr. 2 mit M2-Ausgang am Shield Motor Drive, eingestellt auf 1 kHz PWM-Frequenz
11
  
12
#define KP 2 // Experimentieren Sie, um dies zu bestimmen, beginnen Sie mit etwas, das Ihren Bot der Linie langsam folgen lässt
13
#define KD 5 // experimentieren Sie, um dies zu ermitteln, erhöhen Sie langsam die Geschwindigkeit und passen Sie diesen Wert an. (Anmerkung: Kp <Kd)
14
#define M1_minumum_speed 150 // Mindestgeschwindigkeit des Motors1
15
#define M2_minumum_speed 150 // Mindestgeschwindigkeit des Motors2
16
#define M1_maksimum_speed 250 // max. Geschwindigkeit des Motors1
17
#define M2_maksimum_speed 250 // max. Geschwindigkeit des Motors2
18
#define MIDDLE_SENSOR 4 // Nummer des verwendeten mittleren Sensors
19
#define NUM_SENSORS 5 // Anzahl der verwendeten Sensoren
20
#define TIMEOUT 2500 // wartet auf 2500 us, damit die Sensorausgänge niedrig werden
21
#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
22
#define DEBUG 0
23
24
// Die Sensoren 0 bis 5 sind mit den analogen Eingängen 0 bis 5 verbunden
25
QTRSensorsRC qtrrc ((nicht signiertes Zeichen []) {A4, A3, A2, A1, A0}, NUM_SENSORS, TIMEOUT, EMITTER_PIN);
26
  
27
unsigned int sensorValues ​​[NUM_SENSORS];
28
  
29
void setup ()
30
{
31
Verzögerung (1500);
32
manual_calibration ();
33
set_motors (0,0);
34
}
35
  
36
int lastError = 0;
37
int last_proportional = 0;
38
int Integral = 0;
39
  
40
Leere Schleife ()
41
{
42
unsigned int Sensoren [5];
43
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.
44
int error = Position - 2000;
45
  
46
int motorSpeed ​​= KP * Fehler + KD * (Fehler - lastError);
47
lastError = Fehler;
48
  
49
int leftMotorSpeed ​​= M1_minumum_speed + motorSpeed;
50
int rightMotorSpeed ​​= M2_minumum_speed - Motorgeschwindigkeit;
51
  
52
// Stellen Sie die Motordrehzahlen mit den beiden oben genannten Motordrehzahlvariablen ein
53
set_motors (leftMotorSpeed, rightMotorSpeed);
54
}
55
  
56
void set_motors (int motor1gang, int motor2gang)
57
{
58
if (Motor1> M1_Maximum_Geschwindigkeit) Motor1Geschwindigkeit = M1_Maksimum_Geschwindigkeit;
59
if (motor2speed> M2_maximum_speed) motor2speed = M2_maximum_speed;
60
if (Motorgeschwindigkeit <0) Motorgeschwindigkeit = 0;
61
if (motor2speed <0) motor2speed = 0;
62
motor1.setSpeed ​​(motor1speed);
63
motor2.setSpeed ​​(motor2speed);
64
motor1.run (FORWARD);
65
motor2.run (FORWARD);
66
}
67
68
// Kalibrieren Sie für einige Zeit, indem Sie die Sensoren über die Linie schieben, oder verwenden Sie stattdessen die automatische Kalibrierung
69
void manuelle_kalibrierung () {
70
  
71
int i;
72
für (i = 0; i <250; i ++)
73
{
74
qtrrc.calibrate (QTR_EMITTERS_ON);
75
Verzögerung (20);
76
}
77
  
78
wenn (DEBUG) {
79
Serial.begin (9600);
80
für (int i = 0; i <NUM_SENSORS; i ++)
81
{
82
Serial.print (qtrrc.calibratedMinimumOn [i]);
83
Serial.print ('');
84
}
85
Serial.println ();
86
  
87
für (int i = 0; i <NUM_SENSORS; i ++)
88
{
89
Serial.print (qtrrc.calibratedMaximumOn [i]);
90
Serial.print ('');
91
}
92
Serial.println ();
93
Serial.println ();
94
}
95
}

Danke für eure Antworten

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


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.

von Joachim B. (jar)


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.

von Mario M. (thelonging)


Lesenswert?

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

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


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.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


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.

von Stefan F. (Gast)


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.

von Wolfgang (Gast)


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 ;-)

von PittyJ (Gast)


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.

von Marco H. (damarco)


Lesenswert?

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

von Marco H. (damarco)


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.

von Stefan F. (Gast)


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.

von npn (Gast)


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...

von Stefan F. (Gast)


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.

von npn (Gast)


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 ;-)

von molte (Gast)


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.

von Bernhard S. (b_spitzer)


Lesenswert?

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

1
QTRSensorsRC qtrrc ((nicht signiertes Zeichen [])... 
2
soll sein
3
QTRSensorsRC qtrrc ((unsigned char [])... 
4
 :
5
 :
6
   Verzögerung (1500);
7
soll sein
8
   delay(1500);
9
 :
10
 : 
11
   Leere Schleife ()
12
soll sein
13
   void loop()
14
 :
15
 :
16
   int error = Position - 2000;
17
   int motorSpeed ​​= KP * Fehler + KD * (Fehler - lastError);
18
   lastError = Fehler;
19
soll sein (hab den PD-Regler gefunden!!)
20
   int error = Position - 2000;
21
   int motorSpeed ​​= KP * error + KD * (error - lastError);
22
   lastError = error;

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

von Bernhard S. (b_spitzer)


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

von C.Ompiler (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.