Motor mit Motorshield und Ultraschallsensor steuern
in Ich bin neu hier! 05.07.2022 19:42von kein Name angegeben • ( Gast )
Hi,
muss für mein Schulprojekt einen Aufzug bauen und mit Arduino programmieren. Er soll immer auf der gleichen Höhe bleiben, wenn er z.B. manuell verschoben wird. Genutzt wird ein gewöhnlicher Ultraschallsensor, Arduino UNO, Arduino Motor Shield Rev3 und zwei Motoren. Ich habe ein Problem mit meinem Code. Der Ultraschallsensor gibt beim ersten Mal einen Wert aus, danach kommt immer nur der Wert 0, egal was passiert... Um zu checken, wo das Problem liegt, habe ich ein Serial.Print eingefügt. Das zeigt das eben beschriebene. Weiß jemand, wo das Problem liegt? Da ich kein Profi bin, kann der Fehler auch recht banal sein... :)
Bei der Hardware liegt kein Problem, das ist sicher!
Hier der Code:
/**set control port**/
const int E1Pin = 6;
const int M1Pin = 7;
const int E2Pin = 11;
const int M2Pin = 13;
/**inner definition**/
typedef struct {
byte enPin;
byte directionPin;
} MotorContrl;
const int M1 = 0;
const int M2 = 1;
const int MotorNum = 2;
const MotorContrl MotorPin[] = { {E1Pin, M1Pin}, {E2Pin, M2Pin} } ;
const int Forward = LOW;
const int Backward = HIGH;
float Schallgeschwindigkeit=0.03432; //Schallgeschwindigkeit in cm/microsekunde
int Trigger=6;
int Echo=7;
int Idealabstand=4; //Gewünschter Abstand in cm
long Dauer=0; // Dauer der Schallreflektion
long Entfernung=0; // Berechnete Entfernung
void setup()
{
Serial.begin (9600);
pinMode(Trigger, OUTPUT); // Trigger-Pin ist ein Ausgang
pinMode(Echo, INPUT); // Echo-Pin ist ein Eingang
}
/**functions**/
void initMotor( ) {
int i;
for ( i = 0; i < MotorNum; i++ ) {
digitalWrite(MotorPin[i].enPin, LOW);
pinMode(MotorPin[i].enPin, OUTPUT);
pinMode(MotorPin[i].directionPin, OUTPUT);
}
}
/** motorNumber: M1, M2
direction: Forward, Backward **/
void setMotorDirection( int motorNumber, int direction ) {
digitalWrite( MotorPin[motorNumber].directionPin, direction);
}
/** speed: 0-100 * */
inline void setMotorSpeed( int motorNumber, int speed ) {
analogWrite(MotorPin[motorNumber].enPin, 255.0 * (speed / 100.0) ); //PWM
}
void MotorHoch(){
initMotor();
setMotorDirection( M1, Backward );
setMotorSpeed( M1, 100 );
delay(1000);
setMotorSpeed( M1, 0 );
delay(100);
Serial.println("zu niedrig - Motor Hoch");
setMotorSpeed( M2, 0 );
setMotorDirection( M2, Backward );
for (int value = 0 ; value <= 100; value += 5) {
setMotorSpeed( M2, value );
delay(100);
}
setMotorSpeed( M2, 0 );
}
void MotorRunter(){
initMotor();
setMotorDirection( M1, Forward );
setMotorSpeed( M1, 100 );
delay(1000);
setMotorSpeed( M1, 0 );
delay(100);
Serial.println("zu hoch - Motor Runter");
setMotorSpeed( M2, 0 );
setMotorDirection( M2, Forward );
for (int value = 0 ; value <= 100; value += 5) {
setMotorSpeed( M2, value );
delay(100);
}
setMotorSpeed( M2, 0 );
}
void loop(){
digitalWrite(Trigger, LOW); //Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
delay(5); //warte 5 Millisekunden
digitalWrite(Trigger, HIGH); //schalte Ton an
delay(10); //warte 1s
digitalWrite(Trigger, LOW);//schalte Ton aus
Dauer = pulseIn(Echo, HIGH); //Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Mikrosekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
Entfernung = (Dauer/2) * Schallgeschwindigkeit; //Berechne die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Zentimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.
Serial.print("Entfernung:");
Serial.println(Dauer);
if (Entfernung >= Idealabstand) {
MotorRunter();
}
else{
if (Entfernung <= Idealabstand) {
MotorHoch();
}
}
delay(100); //Das delay von einer Sekunde sorgt in ca. jeder neuen Sekunde für einen neuen Messwert.
}
|
Forum Statistiken
Das Forum hat 139
Themen
und
223
Beiträge.
|
Forum Software von Xobor.de Einfach ein Forum erstellen |