-
Hallo, alles bestens.
Lichtschranken, Motor, Drehzahl, alles funktioniert.
Hab grad versucht das selbe für den größeren Motor mit dem TB6560 Treibermodul anzupassen, aber da klappt das ganze weniger gut.
Das Treibermodul hat ja nur zwei Eingänge CW+ und CLK+, die beiden anderen gehen auf Masse.
Kannst Du mir sagen wie ich mein Programm umschreiben soll?
Momentan läuft es so:
PHP-Code:
#include <Bounce2.h>
int buttonPin = 13;
int sensorPin1 = A2;
int sensorPin2 = A3;
int sensorValue1 = 0;
int sensorValue2 = 0;
int motorPin1 = 8;
int motorPin2 = 9;
int motorSpeed = 0;
int buttonState = 0;
int merker = 0;
void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
pinMode(buttonPin, INPUT);
Serial.begin(9600);
}
void loop(){
buttonState = digitalRead(buttonPin);
sensorValue1 = analogRead(sensorPin1);
sensorValue2 = analogRead(sensorPin2);
Serial.println(buttonState);
if (buttonState != 1)
{
merker = 1;
}
if (sensorValue1 > 512 && sensorValue2 < 512 && merker == 1)
{
motorSpeed = 1;
counterclockwise();
}
if (sensorValue1 < 512 && sensorValue2 < 512 && merker == 1)
{
motorSpeed = 2;
counterclockwise();
}
if (sensorValue1 < 512 && sensorValue2 > 512)
{
motorSpeed = 0;
merker = 0;
counterclockwise();
}
}
void counterclockwise (){
// 1
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
delay(motorSpeed);
// 2
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
delay (motorSpeed);
}
Motor läuft sehr langsam bei motorSpeed = 1, etwa 6 sek für eine Umdrehung.
Bei motorSpeed = 2 dann die Hälfte, klar.
Aber bei Motor Speed = 0 wieder in etwa so schnell wie auf motorSpeed = 1
Hast du vielleicht ne Idee was ich anders machen könnte?
Die Beispielprogramme aus dem Netz hab ich schon durchprobiert, aber die anzupassen ist mir leider zu hoch.
Vielen Dank
Andy
-
Probier es mal so:
Code:
#include <Bounce2.h>
int buttonPin = 13;
int sensorPin1 = A2;
int sensorPin2 = A3;
int sensorValue1 = 0;
int sensorValue2 = 0;
int motorPin1 = 8;
int motorPin2 = 9;
int motorSpeed = 0;
int buttonState = 0;
int merker = 0;
void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
pinMode(buttonPin, INPUT);
Serial.begin(9600);
}
void loop(){
buttonState = digitalRead(buttonPin);
sensorValue1 = analogRead(sensorPin1);
sensorValue2 = analogRead(sensorPin2);
Serial.println(buttonState);
if (buttonState != 1)
{
merker = 1;
}
if (sensorValue1 > 512 && sensorValue2 < 512 && merker == 1)
{
motorSpeed = 1;
counterclockwise();
}
if (sensorValue1 < 512 && sensorValue2 < 512 && merker == 1)
{
motorSpeed = 2;
counterclockwise();
}
if (sensorValue1 < 512 && sensorValue2 > 512)
{
motorSpeed = 0;
merker = 0;
}
}
void counterclockwise (){
// 1
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
delay(motorSpeed);
// 2
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
delay (motorSpeed);
}
-
Gut, test ich morgen früh. Hab Nachtschicht. :roll:
Danke
Gruß
-
Moin..
Alles klar, funktioniert.
Grad hatte ich noch das Problem dass der Motor zwar mit nem Testprogramm sauber gelaufen ist, aber mit den Lichtschranken nur noch sehr langsam.
Hatte den Verdacht dass das UNO nicht mit Lichtschranken überwachen und Motor regeln hinterher kommt.
Zuerst wollte ich die Lichtschranken nicht bei jedem Durchlauf abfragen, hab aber keine Ahnung ob und wie das geht..
Also hab ich den letzten Teil jetzt zehnmal drin, und erst dann werden die Lichtschranken wieder abgefragt. Klappt wunderbar.
Liegt also anscheinend am UNO bzw. dessen fehlender Geschwindigkeit.
Hier nochmal der Code, vielleicht hilfts jemandem. Nicht schön, aber funktioniert.
Danke für die Hilfe.
PHP-Code:
#include <Bounce2.h>
int buttonPin = 13;
int sensorPin1 = A2;
int sensorPin2 = A3;
int sensorValue1 = 0;
int sensorValue2 = 0;
int PinCLK = 9;
int PinCW = 8;
int ledPin1 = 2;
int ledPin2 = 4;
int ledPin3 = 7;
int motorSpeed = 0;
int buttonState = 0;
int merker = 0;
void setup() {
pinMode(PinCLK, OUTPUT);
pinMode(PinCW, OUTPUT);
digitalWrite(PinCLK, LOW);
digitalWrite(PinCW, LOW);
pinMode(buttonPin, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
Serial.begin(9600);
}
void loop(){
buttonState = digitalRead(buttonPin);
sensorValue1 = analogRead(sensorPin1);
sensorValue2 = analogRead(sensorPin2);
Serial.println(buttonState);
if (buttonState != 1)
{
merker = 1;
}
if (sensorValue1 > 512 && sensorValue2 < 512 && merker == 1)
{
motorSpeed = 420;
digitalWrite (ledPin1, HIGH);
digitalWrite (ledPin2, LOW);
digitalWrite (ledPin3, LOW);
counterclockwise();
}
if (sensorValue1 < 512 && sensorValue2 < 512 && merker == 1)
{
motorSpeed = 12000;
digitalWrite (ledPin1, HIGH);
digitalWrite (ledPin2, HIGH);
digitalWrite (ledPin3, LOW);
counterclockwise();
}
if (sensorValue1 < 512 && sensorValue2 > 512)
{
motorSpeed = 0;
digitalWrite (ledPin1, HIGH);
digitalWrite (ledPin2, HIGH);
digitalWrite (ledPin3, HIGH);
merker = 0;
}
}
void counterclockwise (){
digitalWrite(PinCLK, HIGH);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, LOW);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, HIGH);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, LOW);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, HIGH);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, LOW);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, HIGH);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, LOW);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, HIGH);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, LOW);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, HIGH);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, LOW);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, HIGH);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, LOW);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, HIGH);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, LOW);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, HIGH);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, LOW);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, HIGH);
delayMicroseconds(motorSpeed);
digitalWrite(PinCLK, LOW);
delayMicroseconds(motorSpeed);
}
Gruß
Andy
-
Die Timingproblem liegen an den "delayMicroseconds()" Befehlen.
Der µC macht dann solange genau "nichts" (NOP = non operating).
Damit verzögert man den Schleifendurchlauf und macht das Programm langsam.
Der nächste Schritt beim Lernen von Arduino wäre Dein programm von einfach auf effektiv umzustellen und dann auf elegant und effektiv.
Ich habe ja weiter oben schon darüber geschrieben wie man das mit Timerabfagen und Interrupts machen kann.
Wenn es so läuft und das der einzige Zweck ist, kannst Du es auch so lassen (never change a running system).
Wenn Du Dich verbessern willst, gehe den nächsten Schritt.
-
Erstmal lass ich es so, was aber nicht heißt dass ich nicht noch dran rumfeile.
Bin für Vorschläge offen, vielleicht hast du ein Beispiel für ein Programm mit Interrupts das auch ein Anfänger versteht.
Aus Teilen was zusammenbasteln klappt schon einigermaßen..
Grad freu ich mich noch dass es funktioniert, steck das USB Kabel ab und der Motor fängt an zu laufen. Gut, mach die Lichtschranke zu, Motor aus. Lichtschranke wieder auf, läuft wieder an ohne Taster gedrückt zu haben. USB wieder dran, alles bestens. USB weg, spinnt.
Was ist da nun los?
Externe Stromversorgungen sind natürlich dran..
Auch wenn ich dem UNO USB nur Strom geb über ein Handy-Ladegerät funktioniert alles.
Wenn Netzteil und USB angeschlossen sind, auch. Nur 12V Netzteil, dann nicht.