INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
I2C LCD mit Motorshield benutzen
05.06.2016, 22:58
Beitrag #1
I2C LCD mit Motorshield benutzen
Hallo Zusammen

Ich habe folgendes Problem und zwar benutze ich ein Motorshield welches einen Schrittmotor steuert. Das Motorshield benutzt den I2C Port des Arduinos. Jetzt habe ich noch ein I2C LCD Display, welches mir während ich den Motor benutze anzeigt wie weit der Motor gefahren ist. Das klappt auch alles nur wenn ich viel Text auf dem Display ausgebe, wird der Motor deutlich langsamer. Gibt es eine Möglichkeit viel Text anzuzeigen ohne die Geschwindigkeit des Motors zu beeinflussen? Oder Alternativ das Display an einen eigenen I2C Port anzuschließen http://playground.arduino.cc/Main/SoftwareI2CLibrary)?

Vielen Dank schonmal für eure Hilfe

Nomis
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.06.2016, 06:02
Beitrag #2
RE: I2C LCD mit Motorshield benutzen
(05.06.2016 22:58)nomis schrieb:  Hallo Zusammen

Ich habe folgendes Problem und zwar benutze ich ein Motorshield welches einen Schrittmotor steuert. Das Motorshield benutzt den I2C Port des Arduinos. Jetzt habe ich noch ein I2C LCD Display, welches mir während ich den Motor benutze anzeigt wie weit der Motor gefahren ist. Das klappt auch alles nur wenn ich viel Text auf dem Display ausgebe, wird der Motor deutlich langsamer. Gibt es eine Möglichkeit viel Text anzuzeigen ohne die Geschwindigkeit des Motors zu beeinflussen? Oder Alternativ das Display an einen eigenen I2C Port anzuschließen http://playground.arduino.cc/Main/SoftwareI2CLibrary)?

Vielen Dank schonmal für eure Hilfe

Nomis

Moin,
das ist in dem Fall letztendlich egal auf welche Art und an welchem Port du Display und Motor du angeschlossen hast. Die CPU kann immer nur ein Device ansteuern. Das einzige was vielleicht was bringt ist etwaige Delays zu ersetzen.
Poste doch mal deinen Code das wir den da mal durchsehen können.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.06.2016, 08:34 (Dieser Beitrag wurde zuletzt bearbeitet: 06.06.2016 08:42 von Bitklopfer.)
Beitrag #3
RE: I2C LCD mit Motorshield benutzen
Da es sonst bischen lang wird, poste ich nur mal einen Ausschnitt. Das gane funktioniert so, dass die entfernung mittels Ultraschallsensor gemessen wird. Wenn ich dann einen Taster betätige, fährt der Motor so lange, bis die maximale Höhe erreicht wurde.

Code:
void setup() {
  Serial.begin(9600); // set up Serial library at 9600 bps
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  pinMode(buttonhoch, INPUT);
  pinMode(buttonrunter, INPUT);
  lcd.begin();
  AFMS.begin();
  myMotor->setSpeed(200);
}

void loop() {
while (buttonhoch==HIGH)
{
    if((entfernung+cm)<=34)
    
    {
    myMotor->step(steps, FORWARD, DOUBLE);
    buttonhoch=digitalRead(3);
    Zaehler=Zaehler+steps;
    mm=Zaehler/100;
    cm=Zaehler/1000;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(mm);  
    }
    
    else
    
    {
    buttonhoch=digitalRead(3);  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Maximale Hoehe");  
    lcd.setCursor(0,1);
    lcd.print("wurde erreicht");  
    }  
}}
....und wenn du den Sketch in Code Tags setzt wird es auch noch übersichtlicher... das ist das # Zeichen im Editor... dann am Ende auf Tags schließen klicken und das wars... edit by Mod
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.06.2016, 08:59
Beitrag #4
RE: I2C LCD mit Motorshield benutzen
...also mit einem Teil Sketch kann man nicht wirklich viel anfangen...ABER...

...auch in dem Bruchstück sehe ich schon das du Anfänger bist.
Da fällt mir auf das du vor jeder Ausgabe das komplette LCD löschen tust...das kostet Zeit. Der Profi überschreibt nur die Bereiche wo sich ändern indem der den Ausgabewert formatiert in einen String schreibt.
Zweitens, bei der Whileschleife reicht es die buttonhoch-abfrage einmal vor dem beenden der Schleife abzufragen, das spart zudem Speicherplatz.

Um weniger Daten für das Display zu generieren gibt es Zwei Methoden, entweder sich per millis() per Zeitintervall die Werte nur alle 200mS oder weniger oft anzuzeigen oder einfach per Zähler sich alle 10...100...200 Durchgänge das Diskplay anzusteuern.

Was man in dem Schnippsel auch nicht sieht wie oft und wann du Daten auf der Seriellen ausgibst...die braucht auch sehr viel Zeit.

lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.06.2016, 11:34
Beitrag #5
RE: I2C LCD mit Motorshield benutzen
Okay danke schonmal für die Hilfe, ich bin in der Tat ein blutiger Anfänger Wink Das buttonread in der while Schleife hab ich geändert, allerdings wenn ich lcd.clear() nicht mit in die while-Schleife rein nehme, wird mir immer noch ein Teil der Abstandsmessung auf dem LCD Display angezeigt... Die Steps habe ich von 5 auf 10 erhöht, jetzt läuft es gefühlt auch einen ticken schneller...

Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);  
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 1);

int trigger=7;
int echo=6;
const int hoch=3;
const int runter=4;
int buttonhoch;
int buttonrunter;
unsigned long dauer=0;
int steps=10;
int Zaehler;
int mm;
int cm;

unsigned long entfernung=0;

void setup() {
  Serial.begin(9600); // set up Serial library at 9600 bps
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  pinMode(buttonhoch, INPUT);
  pinMode(buttonrunter, INPUT);
  lcd.begin();
  AFMS.begin();
  myMotor->setSpeed(200);
}

void loop() {

  buttonhoch=digitalRead(3);
  buttonrunter=digitalRead(4);
  Zaehler=0;
  mm=0;
  cm=0;

while (buttonhoch==HIGH)


  {
      hochfahren();
      //fastmodehoch();
      
  }
  
  
   while(buttonrunter==HIGH)

  {
      runterfahren();
      //fastmoderunter();  
  }



entfernungmessen();


}

void hochfahren()
{
    if((entfernung+cm)<=34)
    
    {
    
    myMotor->step(steps, FORWARD, DOUBLE);
    Zaehler=Zaehler+steps;
    mm=Zaehler/100;
    cm=Zaehler/1000;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(mm);
    }
    
    else
    
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Maximale Hoehe");  
    lcd.setCursor(0,1);
    lcd.print("wurde erreicht");  
    }
    buttonhoch=digitalRead(3);  
}

void runterfahren()
{
     if((entfernung-cm)>=14)
    {
    myMotor->step(steps, BACKWARD, DOUBLE);
    Zaehler=Zaehler+steps;
    mm=Zaehler/100;
    cm=Zaehler/1000;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(mm);
    
    }
    else
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Niedrigste Hoehe");  
    lcd.setCursor(0,1);
    lcd.print("wurde erreicht");
    }
    buttonrunter=digitalRead(4);
    
}

void fastmodehoch()
{
    myMotor->step(steps, FORWARD, DOUBLE);
    buttonhoch=digitalRead(3);
}

void fastmoderunter()
{
   myMotor->step(steps, BACKWARD, DOUBLE);
   buttonrunter=digitalRead(4);

}

void entfernungmessen()
{
  
digitalWrite(trigger, LOW);
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH);
entfernung = (dauer/2) / 29.1;

if (entfernung >= 500 || entfernung <= 0)

  {
    lcd.clear();  
    lcd.setCursor(0,1);
    lcd.print("Kein Messwert");
  }

else

  {
    lcd.clear();  
    lcd.setCursor(0,0);
    lcd.print("Abstand betraegt");
    lcd.setCursor(5,1);
    lcd.print(entfernung, DEC);
    lcd.print(" cm");
  }

delay(1000);

}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.06.2016, 12:31
Beitrag #6
RE: I2C LCD mit Motorshield benutzen
(06.06.2016 11:34)nomis schrieb:  Okay danke schonmal für die Hilfe, ich bin in der Tat ein blutiger Anfänger Wink Das buttonread in der while Schleife hab ich geändert, allerdings wenn ich lcd.clear() nicht mit in die while-Schleife rein nehme, wird mir immer noch ein Teil der Abstandsmessung auf dem LCD Display angezeigt... Die Steps habe ich von 5 auf 10 erhöht, jetzt läuft es gefühlt auch einen ticken schneller...

...blutig...na eher gewiefter alles Falsch Macher...Big Grin
Dein Sketch ist eine reine Provokation...Rolleyes

..also hier würde ich dir wirklich empfehlen das Anzeigekonzept ganzehitlich zu überdenken und die Ausgaben aus den Unterprogrammen komplett rausnehmen und nur ein paar Flags setzen über die dann die Anzeige gesteuert wird.
Die Anzeigewerte ziehst du dann aus den globalen Variablen raus....das geht.
Und nun hast aus dem hochfahren auch noch ein Unterprogramm gemacht....der Aufruf dazu kostet auch Zeit....
Dann solltest die Tasten gegenseitig verriegeln....so kann man rauf und runter gleichzeitig drücken....der Motortreiber freut sich dann und signalisiert das dann bald per Rauchzeichen...Tongue
Apropos Tasten, wie hast du die denn an die Port's gelegt bzw. wie sieht da die Schaltung aus ?
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.06.2016, 16:57
Beitrag #7
RE: I2C LCD mit Motorshield benutzen
mh ohje das es so schlimm ist hätte ich nicht gedacht Blush Das mit der Methode habe ich nur gemacht, dass man schnell wechseln kann, wenn man keine Anzeige möchte, das hab ich jetzt nochmal geändert.

Wie meinst du das mit den Flags? Dass wenn er z.b. 1mm gefahren ist, die while Schleife beendet wird und der Wert auf dem Display ausgegeben wird?

Ich hab die while Schleife jetzt so abgeändert : while (buttonhoch==HIGH&&buttonrunter==LOW), reicht das so?

Die Schaltung der Taster habe ich nach dieser Anleitung realisiert:

http://funduino.de/nr-5-taster-am-arduino

Danke für deine Geduld!
LG Nomis
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  A6 A7 benutzen ?? DL1AKP 3 362 08.04.2016 14:14
Letzter Beitrag: DL1AKP
  RX/TX als dig. Eingänge beim Mega 2560 benutzen? alpenpower 0 328 22.03.2016 12:13
Letzter Beitrag: alpenpower
  Wie steuere ich 2 DC Motoren über ein Motorshield mit einem Joystick? Vittelboy 12 5.580 29.12.2015 09:51
Letzter Beitrag: max123
  C++ string Klasse in Sketch benutzen? HaWe 4 858 01.05.2015 14:48
Letzter Beitrag: HaWe
Question AF Motorshield über IR steuern Tobi 14 2.512 23.10.2014 13:39
Letzter Beitrag: Tobi
  LCD am Motorshield Zerebrator 3 890 24.07.2014 20:38
Letzter Beitrag: SkobyMobil
  PS1 Controller auf Android benutzen ducha1969 0 590 23.06.2014 17:46
Letzter Beitrag: ducha1969

Gehe zu:


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