Anfänger sucht hilfe !€!

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
schnutzkurt
Junior Member
**

Beiträge: 3
Registriert seit: Feb 2014
Bewertung: 0
#1
22.02.2014, 12:34

Hallo Profis,
Suche Hilfe bei meinem Projekt.
Ich möchte mit einem Poti den Programablauf für einen Motor steuern.
Also ständig den Wert des Potis auslesen wenn er sich ändert zu den verschiedenen
Funktionen springen.

zb wenn Poti Wert zwischen 10 + 50 springe zu funktion
if (poti>=10 && poti <=50)
md.setM1Speed(100);
delay(V);
md.setM1Speed(300);
delay(V);

oder wenn wenn Poti Wert zwischen 100 + 150 springe zu funktion
if (poti>=100 && poti <=150)
md.setM1Speed(10);
delay(V);
md.setM1Speed(100);
delay(V);
usw.
wer kann mir dabei helfen?
bin neueinsteiger mit Adruino Uno und DualVNH5019MotorShield
mir währe die Grundstruktur des Codes wichtig von dem aus ich weiter experimenieren kann.

würde mich den code auch ein paar euronen kosten lassen!
Zitieren
Rene
Junior Member
**

Beiträge: 26
Registriert seit: Dec 2013
Bewertung: 1
#2
22.02.2014, 17:44

Hallo Schnutzkurt

Um ein funktionierendes Programm zu schreiben, sind das etwas zu wenig Informationen. Ausserdem habe ich auch noch nicht so viel Erfahrung und mit Motorshields habe ich noch nichts gemacht.
Ich denke aber begriffen zu haben, wo dein Problem liegt.

Das eigentliche Programm läuft ja immer in void loop(). Dort fragst du das Poti ab und rufst dann die entsprechende Funktion auf. Dein Problem liegt in dieser Funktion. Du verwendest dort delay. Ein delay verhindert, dass dein Programm wieder zu loop() zurückkehrt und dort den nächsten Wert abfragt. Die Reaktionsverzögerung ist immer mindestens die Summe aller delays innerhalb eines loop() - Durchlaufs.

Aus diesem Grund ist delay nur erlaubt, wenn es sich dabei um wenige Millisekunden handelt. Um delay zu verhindern, musst du eine eigene Zeitbuchhaltung machen. Hier hilft z. Bsp. millis().
Zitieren
tesacrep
Administrator
*******

Beiträge: 504
Registriert seit: Dec 2013
Bewertung: 2
#3
23.02.2014, 13:44

Ich muss mich meinem Vorgänger anschließen, Hallo erstmal freut mich das du den weg in dieses Forum gefunden hast.
Die Programm Struktur muss in etwa so aussehen:

void setup () {

}

void loop() {
// Hier muss dein Code hin
}

Das mal zu erst. Hast du schon mal einen Poti mit dem Arduino verbunden? Dazu musst du den Poti an einen der Analog Eingänge anschließen, und vom Signal Ausgang des Potis zu GND noch einen 10K Widerstand zwischenschalten, um ein richtiges Ergebnis zu erhalten. Dieses muss dann berechnet werden, und danach kannst du dann deinen Motor setzen, leider habe ich kein Motorshield, und kann dir nicht sagen wie man den Motor ansteuert.
Hier lese ich den Code von 2 Potis aus: http://micro-dev.de/showthread.php?tid=35
Wenn du dich da kurz durchliest, weist du zumindest schon mal wie du die Spannung am Arduino misst, wenn du das geschafft hast schauen wir weiter.
Ansonsten sieht das was du da geschrieben hast schon ganz gut aus, als nächsten Schritt schalten wir mit der Schleife mal eine LED, und wenn das tut schauen wir das dass mit dem Motorshield auch noch so klappt wie du willst.
Zitieren
schnutzkurt
Junior Member
**

Beiträge: 3
Registriert seit: Feb 2014
Bewertung: 0
#4
23.02.2014, 16:45

Hallo Tesacrep,

Danke für deine Hilfe!
Also Poti auslesen, Motorshield ansteuern das klappt schon,
was mir zu schaffen macht ist:
ich möchte den poti "ständig" auslesen oder bei Spannungsänderung zu einer Funktion im code springen.
als wenn poti wert >20 bis< 30
dann mache dies
oder wenn poti wert >30 bis< 40
dann mache das
zb.
md.setM1Speed(400);
delay(1000):
usw.
mir geht es darum wie ich die "ständige" Abfrage vom Poti und die verzweigung zum Code bewerkstellige!
nochmals danke für eure Hilfe!!

das ist mein Code
was mir noch fehlt ist, das wenn ich den poti verstelle(während des Programm läuft) es denn neuen Wert vom Poti nimmt und zu dem Code springt der den Wert erfüllt.
wie mach ich das ?? ;(
Hoffe habe mich verstädlich ausgedrückt. Smile

 
#include "DualVNH5019MotorShield.h"
DualVNH5019MotorShield md;
//Freie pins digi:1,3,5,11,13 analog:2,3,4,5,6,7,8,9
//link zum Shield <a href="http://www.pololu.com/docs/0J49/2" target="_blank" class="mycode_url">http://www.pololu.com/docs/0J49/2</a>
 
int PotiPin = A2;
int WertPoti = 0;
 
void setup()
{
md.init();
pinMode(PotiPin,INPUT);
Serial.begin(9600);
}
 
void loop()
{
int WertPoti = analogRead(A2);
Serial.println(WertPoti);
 
if (WertPoti >=10 && PotiPin <=150)
md.setM1Speed(100);
delay(500);
md.setM1Speed(0);
delay(50);
if (WertPoti >=150 && PotiPin <=300)
md.setM1Speed(400);
delay(500);
md.setM1Speed(0);
delay(50);
 
}
 
Zitieren
tesacrep
Administrator
*******

Beiträge: 504
Registriert seit: Dec 2013
Bewertung: 2
#5
24.02.2014, 12:42

Okay ich glaube ich habe deinen Fehler gefunden:
- Zuerst würde ich den Wert den du vom Poti ausliest in Volt umrechnen, dann ist deine Programmierung besser nachvollziehbar.
- Warum verwendest du delay? Wenn du wie du sagst kontinuierlich einen Wert abfragen willst, dann verhindert die delay das.
 
#include <Wire.h>
#include <LiquidCrystal.h>
 
 
LiquidCrystal lcd( 8, 9, 4, 5, 6, 7 ); // Pinbelegung Display
int back = 10; // Hintergrundbeleuchtung
 
 
const float referenceVolts = 5.0; // Vergleichsspannung (Wird gebraucht um Buttons auszulesen)
const int bp = 0;
 
void setup()
{
lcd.begin(16, 2);
pinMode(back, OUTPUT); // Hintergrundbeleuchtung als Output definieren
digitalWrite(back, HIGH); // Sinlos
delay (500);// Sinlos
digitalWrite(back, LOW);// Sinlos
delay (500);// Sinlos
digitalWrite(back, HIGH);// Sinlos
delay (500);// Sinlos
}
 
void loop()
{
lcd.clear(); // LCD leeräumen

int val = analogRead(bp); // Wert von buttonpin (A0)einlesen
float volts = (val / 1023.0) * referenceVolts; // Verhältnis berechnen
lcd.print ("Volt: ");
lcd.print(volts); // und Wert in Volt ausgeben
int ref = volts;
if (volts == 5.00) { // bei 5 v
lcd.setCursor(0, 1);
lcd.print("Keine Auswahl"); // Keine auswahl angeben
}
if (ref < 3.13) {
lcd.setCursor(0, 1);
lcd.print("Auswahl");
}
if (ref < 2.01) {
lcd.setCursor(0, 1);
lcd.print("Links ");

}
if (ref < 1.26) {
lcd.setCursor(0, 1);
lcd.print("Unten ");
}
if (ref < 0.48) {
lcd.setCursor(0, 1);
lcd.print("Oben ");
}
if (volts == 0.00) {
lcd.setCursor(0, 1);
lcd.print("Rechts ");
}
delay (50);

}
 
Das ist ein Code den ich zum Auslesen von mehreren Buttons verwende, hier sind Widerstände zwischen jeden Button geschaltet, um viele Buttons an einem Pin verwenden zu können, weil so jedes Mal eine andere Volt Zahl bei raus kommt.
So könntest du deinen Code auch gestalten, bloß das statt dem Display dein Motorshield eingebunden ist.
Das könnte dann in etwa so aussehen:
 
#include "DualVNH5019MotorShield.h"
DualVNH5019MotorShield md;
//Freie pins digi:1,3,5,11,13 analog:2,3,4,5,6,7,8,9
//link zum Shield <a href="http://www.pololu.com/docs/0J49/2" target="_blank" class="mycode_url">http://www.pololu.com/docs/0J49/2</a>
 
int PotiPin = A2;
int WertPoti = 0;
 
void setup()
{
md.init();
pinMode(PotiPin,INPUT);
Serial.begin(9600);
}
 
void loop()
{
int WertPoti = analogRead(A2);
Serial.println(WertPoti);
 
if (WertPoti >=10){
md.setM1Speed(100);
}
if (WertPoti >=150){
md.setM1Speed(400);
}
 

Und dann weiter absteigend, wie gesagt mach’s wie in meinem Beispiel und lass alles auf Volt umrechnen, des Weiteren ist wichtig das du geschweifte klammern {} bei jedem if Statement verwendest.
(Dieser Beitrag wurde zuletzt bearbeitet: 15.02.2015, 01:27 von tesacrep.)
Zitieren
schnutzkurt
Junior Member
**

Beiträge: 3
Registriert seit: Feb 2014
Bewertung: 0
#6
24.02.2014, 20:42

Super DANKE werde das demnächst testen.
Das mit den Schaltern und Wiederständen hatte ich auch schon im Kopf.

Das Forum hier ist SUPER werde Werbung machen !!
Die im Ardurino Forum.de Undecided diskutieren herum wie man ne Frage stellt oder irgendwelche Bücher gibt wo man nachlesen soll ,
die letzte ähnliche Frage wurde mit "nein S.O." beantwortet usw...

Hallo Tesacrep,

Was ich aber möchte und keine Ahnung habe
wie geht das, wenn in der "IF" Schleife ein längeres Programm läuft und der Wert des Poti oder Taster veändert wird und dementsprechend Gleich in eine andere Schleife verzweigen soll?
Wie unterbreche ich die IF-Schleife und gehe zum neuen Potiert-Wert?
HuhHuh
Zitieren
tesacrep
Administrator
*******

Beiträge: 504
Registriert seit: Dec 2013
Bewertung: 2
#7
24.02.2014, 21:20

Als erstes Mal Danke,

Im void loop () werden alle Tasks nacheinander abgearbeitet, eine Unterbrechung auch genannt Interrupt. Das sieht dann in etwa so aus:

 
int versuch()
{
if(digitalRead(7) == HIGH)
{
return 0;
}
}
 
aber das ist schon wesentlich komplexer.
Nochmals Danke für dein Lob.
(Dieser Beitrag wurde zuletzt bearbeitet: 15.02.2015, 01:28 von tesacrep.)
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 794
Registriert seit: Apr 2014
Bewertung: 5
#8
09.05.2014, 09:21

Der Beitrag ist zwar schon älter, aber ich möchte trotzdem noch kurz etwas dazu sagen:

Das Poti ständig abzufragen ist eine Möglichkeit. Man nennt das "Polling". Prinzipiell funktioniert das auch, ist aber anstrengend für den Arduino. Leichter bekommt man das mit einer Interrupt-Steuerung hin.

In diesem Fall wird nur dann ein Stückchen Programm ausgeführt, wenn man am Poti dreht. Das ist wesentlich schlanker und in der Hauptschleife können alle möglichen anderen Dinge gemacht werden.

Ich muss allerdings zugeben, dass ich mit der Interruptsteuerung unter Arduino-C wenig bis keine Erfahrung habe. Ich weiß aber zumindest dass das geht!

Mein Beitrag war jetzt nicht sonderlich hilfreich zur Lösung des Problems, aber ich wollte doch kurz auf die Möglichkeit hinweisen Smile

Gruß
Uni
-----

Sic mundus creatus est.
(Dieser Beitrag wurde zuletzt bearbeitet: 09.05.2014, 09:21 von Unilein.)
Zitieren
wedelchen
Junior Member
**

Beiträge: 39
Registriert seit: Jun 2014
Bewertung: 0
#9
09.06.2014, 15:08

Wieso speicherst du den letzten Wert nicht in einer gesonderten Variable und vergleichst ihn dann mit dem aktuellen Wert? Wenn sie sich unterscheiden, kannst du die Auswertung machen.

Code:
if(poti!=potilast)
  {

  // Auswertung
  
  potilast=poti;
  }
Zitieren


Gehe zu:


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