Motoransteuerung mit 2 Potis und Display am Nano

Hallo Leute,

ich habe ein Problem bei meinem Sketch und hoffe, dass ihr mir weiterhelfen könnt. Vorab - ich bin kein Programmierer und blutiger Anfänger. Habt Nachsicht mit mir :wink:

Ich habe folgendes vor:
Über meinen Nano soll ein Motor angesteuert werden der eine gewisse Zeit läuft und dann wieder die doppelte Zeit ausgeht. Ich habe zwei Potis vorgesehen, einen für die Zeit die er an sein soll und einen Poti um die Geschwindigkeit zu regeln. Soweit so gut. Klappt auch soweit. Um den Arduino zu schützen habe ich einen ULN2803A in die Schaltung mit integriert ( auch wenn ich quasi nur einen Ausgang davon nutze ). Es klappte auch tatsächlich soweit, bis ich dann auf die Idee kam ein I2C Display dazu zu basteln um die eingestellten Werte als Prozentzahl auszugeben. Da das ganze an einem Akku betrieben wird wollte ich ebenfalls, dass die Hintergrundbeleuchtung nach 1 Minute ausgeht. Joa und da fangen die Probleme dann an. Seit ich die Schaltung auf "Display" umgebaut habe - klappt die Motoransteuerung nicht mehr (Das Display selbst habe ich aktuell noch gar nicht dran). Ich habe mich bei dem Code an den Tutorials Blinkwithoutdelay bedient und auch mit allen anderen möglichen Codes hier aus dem Forum kombiniert.

Kann mir einer von euch vielleicht helfen ? Ich finde meinen Fehler nicht und mein Sketch wird sauber hochgeladen. :frowning: :confused:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

const int speedPin = A0;
const int motorPin = 3;
const int zeitPin = A3;
unsigned long einschaltdauer = 0;
int sensorzeit = 0;
int sensorpwm = 0;
int pwm = 0;
int prozentzeit = 0;
int prozentpwm = 0;
int prozentspeed = 0;

void setup() {
  lcd.begin(16,2);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Test V.1.1");
  lcd.setCursor(0,1);
  lcd.print("Vibromator");
  lcd.setBacklight(HIGH);
  delay(2000);
}

void loop() {
  // Hintergrundbeleuchtung nach 1 Minute abschalten
  if(millis() - einschaltdauer >= 60000) {
  einschaltdauer = millis();
  lcd.setBacklight(LOW);
}
  sensorzeit = analogRead(zeitPin);
  sensorpwm = analogRead(speedPin);
  pwm = map(sensorpwm, 0, 1023, 0, 255);
  analogWrite(motorPin, pwm);
  delay (sensorzeit*2);
  prozentzeit = map(sensorzeit, 0, 1023, 0, 100);
  prozentpwm = map(pwm, 0, 255, 0, 100);
  prozentspeed = map(sensorpwm, 0, 1023, 0, 100);
  lcd.setCursor(0,0);
  lcd.print("Speed = ");
  lcd.print(prozentspeed);
  lcd.print("Vibrator = ");
  lcd.setCursor(0,1);
  lcd.println(prozentpwm);
  lcd.print("Zeit = ");
  lcd.println(prozentzeit);
  analogWrite(motorPin, 0);
  delay (sensorzeit*4);

  delay(10);
}

Liebe Grüße und danke an alle vorab,
Christopher

PS: Nein, auch wenn da Vibrator steht, es ist kein Sexspielzeug :slight_smile: :slight_smile:

![](http://<a href=)1">

Hab gerade nochmal schnell zur Veranschaulichung die Schaltung aufgebaut. Vielleicht hilft das ja weiter.

Liebe Grüße,
Christopher

(deleted)

Peter-CAD-HST:
Moin exzetus
Herzlich willkommen im Forum und danke für deine super Problembeschreibung. KARMA+
Versuche komplett auf die delay()´s zu verzichten. Diese halten den Programmablauf an, sodass deine Motorsteuerung nicht mehr funktioniert.
Um eine Steuerung zu programmieren empfehle ich immer nach dem EVA-Prinzip, Eingabe-, Verarbeitung- und Ausgabefunktion, vorzugehen. D.h. die Aufgabenstellung in die Funktionen aufteilen und diese über die funktionalen Anhängigkeiten "zusammenzulöten".
Viel Erfolg
Gruß Peter
und gesund bleiben

Hallo Peter und vielen Dank für nette Begrüßung und deine schnelle Antwort.

Es ist ja glücklicherweise keine zeitkritische Schaltung - mir ist das mit dem millis()-gedönz ehrlich gesagt einfach zu kompliziert und für mich ist es auch okay wenn die Schaltung erst nach den 2 Sekunden, nachdem "Test V1.1" abgefrühstückt ist, losläuft. Wenn Sie denn loslaufen würde :slight_smile: Aber du hast natürlich vollkommen recht - die Programmierung ist sehr unstrukturiert. Ich werde es versuchen zu überarbeiten.
Ich hab vorher auschließlich mit Delay gearbeitet und erst jetzt millis mit eingebaut. Vorher lief die Schaltung aber einwandfrei. Glaubst du es liegt einzig am Delay ?

Liebe Grüße und Danke für dein Karma :slight_smile: ,
Christopher

exzetus:
(Das Display selbst habe ich aktuell noch gar nicht dran).

Das dürfte zumindest eines deiner Probleme sein. Du kannst eine I2c Schnittstelle nicht ohne Gegenstück betreiben,da auf eine Quittung gewartet wird. Wenn die nicht kommt, muss ein Timeout abgwartet werden. Und das passiert jetzt bei jedem Datum, dass Du an das Display sendest.

Hallo,

irgendwann sollte der Motor aber doch einschalten, denke ich. Mach doch erst mal jeweils vor das analogWrite() für den Motor eine Serielle ausgabe auf den Monitor.

zusätzlich kannst Du ja erst mal alle LCD.print auskommentieren.

Heinz.

Hallo MicroBahner und Rentner,

vielen Dank für eure Antworten. Ich glaube Microbahner hat recht.
Wenn ich, wie Rentner empfohlen hat, alles was mit Display zu tun hat auskommentiere, läuft der Motor wieder an. Das Display kommt morgen - vielleicht war das ja wirklich das Problem. Ich hätte mir noch einen Wolf gesucht. Ich werde mal berichten ob es mit Display funktioniert oder der gleiche Fehler auftritt. Dazu morgen Abend dann mehr :wink:

Herzliche Grüße und vielen Dank,
Christopher

So, ich nochmal :wink:

Für alle, die ein ähnliches Problem hatten oder haben sollten -> wenn am i2c-Bus kein Gerät angeschlossen ist und somit keine Rückmeldung an den Arduino geben kann, bleibt das Programm stehen.

Mit angeschlossenem Display läuft dann alles :stuck_out_tongue: Danke für die Hilfe.

Ich habe aktuell das Problem, dass meine Displayhelligkeit schwankt wenn der Motor an ist. Hab versucht mit einem 1000uF Kondensator das Schwanken (0,5V ca.) auszugleichen. Leider klappt das aber auch nur in meiner Theorie gut :slight_smile: . Hat jemand von euch noch eine Idee ? Die Schaltung wird übrigens mit 5V betrieben.

Vielen Dank im Voraus :wink:

Hallo,
hast du am Motor eine Freilaufdiode dran ?
Evtl. packt die im Treiber-IC das nicht.

Hast du am I2C-Bus Pullup-Widerstände dran ?
Die solltest du unbedingt einbauen.

Ob welche vorhanden sind, kannst du ohne Spanmung nachmessen.

Was ich grad sehe, die 5 Volt am Vin reichen nicht.
Der Vin braucht min. 6,5 Volt für den Onboard-Regler.

(deleted)

HotSystems:
Hallo,
hast du am Motor eine Freilaufdiode dran ?
Evtl. packt die im Treiber-IC das nicht.

Hast du am I2C-Bus Pullup-Widerstände dran ?
Die solltest du unbedingt einbauen.

Ob welche vorhanden sind, kannst du ohne Spanmung nachmessen.

Ich habe am Motor keine weitere Freilaufdiode dran. Nur die vom 2803A. Auch ein Pullup Widerstand habe ich nicht mehr verbaut - ist es nicht so, dass diese im i2c Display-modul schon verbaut sind ? Da bin ich allerdings auch überfragt :o

HotSystems:
Was ich grad sehe, die 5 Volt am Vin reichen nicht.
Der Vin braucht min. 6,5 Volt für den Onboard-Regler.

Sorry wenn die Frage komisch erscheint - was hat das für Auswirkungen ? Der Arduino läuft ja sauber bei 5V. Ich habe eine Powerbank auseinandergeschraubt und nutze quasi die 5V USB Spannung für meine Schaltung. Der Akku an sich hat 3,7V und 4000mAh. Würde dann ein 9V Block mehr Sinn machen ? Oder gibts alternativen ?

Ich schicke gleich nochmal zur Veranschaulichung des Phänomens ein paar Bilder.

exzetus:
Ich habe am Motor keine weitere Freilaufdiode dran. Nur die vom 2803A. Auch ein Pullup Widerstand habe ich nicht mehr verbaut - ist es nicht so, dass diese im i2c Display-modul schon verbaut sind ? Da bin ich allerdings auch überfragt :o

Sorry wenn die Frage komisch erscheint - was hat das für Auswirkungen ? Der Arduino läuft ja sauber bei 5V. Ich habe eine Powerbank auseinandergeschraubt und nutze quasi die 5V USB Spannung für meine Schaltung. Der Akku an sich hat 3,7V und 4000mAh. Würde dann ein 9V Block mehr Sinn machen ? Oder gibts alternativen ?

Ich schicke gleich nochmal zur Veranschaulichung des Phänomens ein paar Bilder.

Du solltest dich zwingend an die Datenblatt Vorgaben halten.
Das I2C Modul kannst du messen, ob Widerstände drauf sind.
Die braucht der Bus.

Auch wenn dein Nano aktuell funktioniert, hast du ja ein Problem.

Also bringe das in Ordnung.
Du kannst die 5Volt Versorgung auch am 5V-Pin anschließen.

Ein 9Volt Block reicht nicht, da dieser zu wenig Strom liefert.

So, jetzt wird´s bisschen grafisch. Also die Schaltung sieht aktuell wie folgt aus:
![](http://<a href=)Schaltung">

Die Kondensatorkurve sieht so aus :

![](http://<a href=)

">

Die Spannung, parallel zu + und - sieht so aus:

![](http://<a href=)

">

Ja, ich bin mir bewusst, dass das Oszi kein Profigerät ist und wahrscheinlich nicht hundertprozentig. Habe auch schon per PWM die Spannung limitiert die der 2803 freigibt. bei 100% bzw. 255 am Ausgang des PWM geht die Spannung noch mehr in die Knie. Limitiere aktuell auf 150.

Okay, also schließe ich die Spannung an +5V an. Was aber wenn ich dann parallel noch einen USB Stecker anschließe ? Gibt das Probleme ? der VIN ist ja genau dafür da oder ?

Zum Pull-Up Widerstand - wo messe ich den ? Zwischen SDA und VCC ? Und wie hoch sollte der Widerstand sein ?
Grüße

exzetus:
Okay, also schließe ich die Spannung an +5V an. Was aber wenn ich dann parallel noch einen USB Stecker anschließe ? Gibt das Probleme ? der VIN ist ja genau dafür da oder ?

Zum Pull-Up Widerstand - wo messe ich den ? Zwischen SDA und VCC ? Und wie hoch sollte der Widerstand sein ?

Ja, der 5V Pin ist richtig.
Darf aber nicht gleichzeitig mit USB betrieben werden.
Da solltest du dir ein spezielles Kabel fertigen, bei dem die +5V durchgetrennt ist.

Pullup ca. 4,7k an SDA und VCC sowie an SCL und VCC.

Edit:
So wie du den Elko jetzt angeschloeesn hast, wird das Problem größer.
Der muss beim Einschalten das Motors auch noch geladen werden.

Und die +5V sind immer noch falsch.

HotSystems:
Ja, der 5V Pin ist richtig.
Darf aber nicht gleichzeitig mit USB betrieben werden.
Da solltest du dir ein spezielles Kabel fertigen, bei dem die +5V durchgetrennt ist.

Pullup ca. 4,7k an SDA und VCC sowie an SCL und VCC.

Edit:
So wie du den Elko jetzt angeschloeesn hast, wird das Problem größer.
Der muss beim Einschalten das Motors auch noch geladen werden.

Und die +5V sind immer noch falsch.

Ja ich habe ein wenig rumprobiert - wenn ich den Kondensator zwischen VCC zum Motor und GND betreibe ändert sich nichts. So wie ich ihn jetzt betreibe läuft der Motor zumindest schneller und am Ergebnis ändert sich auch nichts :slight_smile:

VCC habe ich jetzt an 5V vom Nano angeschlossen. Ich suche gerade 4,7k Widerstände

Edit: So, 4,7k liegen an VCC und SCL sowie VCC und SDA

exzetus:
Ja ich habe ein wenig rumprobiert - wenn ich den Kondensator zwischen VCC zum Motor und GND betreibe ändert sich nichts. So wie ich ihn jetzt betreibe läuft der Motor zumindest schneller und am Ergebnis ändert sich auch nichts :slight_smile:

VCC habe ich jetzt an 5V vom Nano angeschlossen. Ich suche gerade 4,7k Widerstände

Edit: So, 4,7k liegen an VCC und SCL sowie VCC und SDA

Das der Motor so schneller läuft, liegt vermutlich daran, dass durch den Elko die Spannungseinbrüche am Motor geringer sind.
Lässt sich mittels Oszi sicher auch feststellen.

Sollte das Display immer noch flackern, dann da bitte die Spannung mittels Oszi messen.

(deleted)

exzetus:
Ja ich habe ein wenig rumprobiert - wenn ich den Kondensator zwischen VCC zum Motor und GND betreibe ändert sich nichts. So wie ich ihn jetzt betreibe läuft der Motor zumindest schneller und am Ergebnis ändert sich auch nichts :slight_smile:

Besser wäre der Elko direkt an VCC +5V aufgehoben.
Dann würde er evtl. vorhandene Spannungsschwankungen komplett ausgleichen.

Allerdings wenn du ein gutes Netzteil (oder Akku) verwendest, ist das auch nicht nötig.