Willkommen! Anmelden Ein neues Profil erzeugen

Erweiterte Suche

Tiny OLED I2C + RADDS 1.5 + Marlin4Due

geschrieben von hansilein 
Tiny OLED I2C + RADDS 1.5 + Marlin4Due
07. January 2016 20:14
Hallo zusammen,

ich habe endlich mal wieder etwas Zeit übrig und kann an meinem Sparkcube weiter arbeiten.

Bei der Elektronik habe ich mich für das RADDS 1.5 entschieden und da ich bisher mit Marlin sehr zufrieden war, fiel die Wahl auf Marlin4Due von Wurstnase.
Als Display wollte ich das Tiny OLED von Enif nachbauen.
Und jetzt habe ich ein Problem.

Und jetzt habe ich 2 Probleme.

Die initiale Konfiguration und Upload lief, abgesehen von einer Kleinigkeit, ohne Probleme. Da hatte ich das Display noch nicht aktiviert.
Die Kleinigkeit:
#if ENABLED(SERVO_ENDSTOPS) || ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED)
Richtig wäre:
#if defined(SERVO_ENDSTOPS) || ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED)

Anschließend wollte ich das Display aktivieren. Um Schritt für Schritt vorzugehen und nur minimale Änderungen vornehmen zu müssen, habe erstmal nur eine Zeile einkommentiert:
#define U8GLIB_SSD1306
Benötigte Libs hatte ich schon installiert.

Dann hatte ich schon mal ein Bild.



Und hier sieht schon Problem Nr. 1, das ganze Bild ist 2 Pixel zu weit links.
Wo müsste ich was umstellen, damit das wieder richtig aussieht? Gibt es dafür zentrale Variablen in der Bibliothek (U8glib), die ich einfach anpassen kann?
Oder muss ich dafür die gesamte Display-Implementierung überarbeiten?
Ja, ich weiß. Das ist etwas, das ich früher oder später auch selbst herausfinden könnte. Aber da mir früher lieber ist als später, frage ich einfach mal in die Runde.
Vielleicht weiß jemand bescheid...




Problem Nr. 2 betrifft den Drehencoder. Der funktioniert nicht.
Deswegen habe ich mir den Code genauer angesehen und herausgefunden, dass die Encoder-Pins nur zugewiesen werden,
wenn ULTRA_LCD, NEW_PANEL und SSD1306_OLED_I2C_CONTROLLER aktiviert wurden.
#ifdef ULTRA_LCD

	// RADDS LCD panel
	#ifdef NEWPANEL

		#ifdef RADDS_DISPLAY
			#define LCD_PINS_RS 		42
	  	  	#define LCD_PINS_ENABLE 	43
	  	  	#define LCD_PINS_D4 		44
	  	  	#define LCD_PINS_D5 		45
	  	  	#define LCD_PINS_D6 		46
	  	  	#define LCD_PINS_D7 		47

		  	#define BEEPER 41

		  	#define BTN_EN1 50
		  	#define BTN_EN2 52
		  	#define BTN_ENC 48
			
		  	#define BTN_BACK 71

		  	#undef SDSS
		 	#define SDSS  10
          	#define SDCARDDETECT 14
          
		#elif defined(SSD1306_OLED_I2C_CONTROLLER)
      		#define BTN_EN1 50
          	#define BTN_EN2 52
          	#define BTN_ENC 48
          	#define BEEPER 41
          	#define LCD_SDSS 10
          	#define SDCARDDETECT 14
			#define KILL_PIN -1

		// Sparklabs Full Graphic Display for RADDS
		#elif defined(SPARK_FULL_GRAPHICS)
			#define LCD_PINS_D4 29
			#define LCD_PINS_ENABLE 27
			#define LCD_PINS_RS 25

			#define BTN_EN1 35
			#define BTN_EN2 33
			#define BTN_ENC 37

			#define KILL_PIN -1
    		#undef BEEPER
			#define BEEPER -1
		#endif // SPARK_FULL_GRAPHICS

	#endif

#endif //ULTRA_LCD

Da die Conditionals.h für "UG8LIB_SSD1306" aber folgendermaßen aussieht,
#if defined(U8GLIB_SSD1306)
    #define ULTRA_LCD  //general LCD support, also 16x2
    #define DOGLCD  // Support for I2C LCD 128x64 (Controller SSD1306 graphic Display Family)
#endif
habe ich einfach mal folgendes hinzugefügt
    #define NEWPANEL
    #define SSD1306_OLED_I2C_CONTROLLER

Wenn ich den DUE mit diesen Einstellungen flashe, wird es aber ganz verrückt. Man sieht eine Reaktion auf dem Display und hört den Buzzer.
Aber das nur in den ersten paar Sekunden nach dem Einschalten.

Die Reaktion ist aber ganz anders als erwartet. Wenn ich den Encoder nur drehe, ändert sich auf dem Info-Screen die Soll-Temperatur für Hotend, Heatbed und die Feed-Rate.
Drücke ich den Encoder komme ich manchmal ins Menü manchmal nicht, aber ich höre immer den Buzzer. Und das Menü kann ich dann aber nicht verlassen oder durchscrollen.
Wahrscheinlich weil die Zeit einfach abläuft, also die 2 Sekunden.

Ich habe die Display-Module und die Drehencoder (jeweils 2) mit einem Arduino UNO getestet, mit denen ist alles in Ordnung. Abgesehen von der "2-Pixel-Verschiebung".

Um die ganze Schaltung zu testen, habe ich folgendes zusammen gesteckt:


Auf diesem Foto versorge ich den Drehencoder mit 5V. Das war nur ein verzweifelter Versuch smiling smiley
Sonst wurde der auch immer nur mit 3,3V versorgt. Das nur am Rande...


Ich hoffe Ihr habt ein paar Ideen.

Viele Grüße

hansi

1-mal bearbeitet. Zuletzt am 08.01.16 07:37.
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
08. January 2016 01:50
I erinnere mich vage, dass ich auch mal das Problem mit dem seitlichen Versatz der Pixel hatte. Bei mir hat der Wechsel von SSD1306 nach SH1106 schliesslich das Problem gelöst.
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
08. January 2016 06:13
Kann ich bestätigen. Ich habe auch ein OLED das angeblich einen SSD1306-Controller verbaut hat. Gleicher Effekt. Ist aber wohl ein SH1106, damit funktioniert es einwandfrei.

Die Chinesen sind manchmal seeeehr großzügig hinsichtlich der technischen Angaben.

Das tollste war ein OLED, das als I2C verkauft wurde, auch die Pins waren auch auf der Platine entsprechend gelabelt, aber in Wirklichkeit ein SPI Interface hat eye popping smiley. Hab dann noch ein paar nachgeordert, weil die im Preis ziemlich abgesackt sind grinning smiley. Zuviele Reklamationen wahrscheinlich...
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
08. January 2016 07:23
Laut Händler sind das Display-Module mit SSD1306-Controllern, aber ich versuche es auf jeden Fall.

Danke euch Beiden.

Ich werde es sofort testen. Melde mich gleich wieder.
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
08. January 2016 07:34
Problem Nr. 1 ist nicht mehr smileys with beer

Vielen Dank für Eure Hilfe.




Jetzt bleibt nur noch das Problem mit dem Drehencoder....
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
08. January 2016 10:50
Ich habs:

#define ENCODER_PULSES_PER_STEP 2
#define ENCODER_STEPS_PER_MENU_ITEM 1 
#define ULTIPANEL 
#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100
#define LCD_FEEDBACK_FREQUENCY_HZ 1000

So funktioniert es
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
09. January 2016 10:36
Na geht doch auch ohne mich thumbs up

Wenn du die Änderungen wie bei den anderen Displays (Rades LCD oder so) zusammenfassen kannst und dann ben Pullrequest machst oder die Änderungen hier hochlädst, dann pack ich es gleich mit rein und andere haben auch was davon smiling smiley


Triffid Hunter's Calibration Guide --> X <-- Drill for new Monitor Most important Gcode.
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
10. January 2016 07:13
Hallo Wurstnase,

das wollte ich noch erledigen, aber vorher wollte ich den Funktionsumfang ein klein wenig erweitern:

1 Status LED für das Hotend
1 Status LED für das Heatbed
... die leuchten, sobald die Zieltemperatur erreicht wurde.

1 Pause-Schalter, wenn man den drückt soll der Drucker eine bestimmte Position anfahren und bei erneutem Drücken die Arbeit fortsetzen.

Das sollte in den nächsten Tagen fertig sein.
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
14. January 2016 02:24
Ich habe das Marlin 4 due für das radds board auch mal umgeschrieben, aber ich habe ein großes 2,42" oled in blau. Das sieht echt geil aus spinning smiley sticking its tongue out
Nur hatte ich den Bug, dass ich den Drucker nach jedem Druck resetten musste, da er sich irgendwie aufgehängt hat.
Weiß jemand, wo man ein Delay für die Temperatureinlese einbauen kann, also beim Starten der Firmware.
Ich habe ein Heizbett mit 2,8K Thermistor, und ich bekomme mit dem Heizbett beim Start einen MaxTemp error und die Firmware stoppt.
Sorry, falls die Frage villeicht net ganz zum Thema passt, aber hoffentlich kann mir trotzdem jemand weiterhelfen. smileys with beer

grüße,
Matze
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
14. January 2016 02:26
Was ich villeicht noch erwähnen sollte, dass es funktioniert, wenn ich aus dem Start den Temperature check rausnehme tongue sticking out smiley
Aber dadurch muss ich den Drucker nach jedem Druck resetten.
Also Die Temperatur wird auch richtig ausgelesen, aber am Anfang "pendelt" sie sich ja immer ein.
Wenn ich die Maxtemp auf 300 setze, oder so geht es auch so
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
14. January 2016 04:19
Mach bitte einen eigenen Thread auf!

Dein Problem passt überhaupt nicht ins Thema. Hier geht es um die Inbetriebnahme des Displays.

Weiterhelfen kann ich Dir auch nicht, ich stecke nicht tief genug im Thema.

Ich habe mir bisher nur die Teile angesehen, die für mich relevant waren.
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
14. January 2016 04:36
Á propos Inbetriebnahme:

Ich habe ein Problem mit dem EEPROM.
Sobald ich speichern möchte, geht nichts mehr.

Enif hat dieses Problem schon erkannt:

Quote
Enif
As for the I2C problem on the Arduino Due that caused some conflict when activating simultaneously the I2C OLED (using the U8glib I2C routines) and the I2C EEPROM (using Arduino's Wire.h), I have made some progress:

I removed the '//' from the (3 each) commented out statements "//u8g->pin_list[U8G_PI_SET_A0] = 1;" and "// u8g_i2c_stop();" in file U8glib/utility/u8g_com_arduino_ssd_i2c.c :

$diff u8g_com_arduino_ssd_i2c.c.ori u8g_com_arduino_ssd_i2c.c
125c125
<       //u8g->pin_list[U8G_PI_SET_A0] = 1;
---
>       u8g->pin_list[U8G_PI_SET_A0] = 1;
130c130
<       // u8g_i2c_stop();
---
>       u8g_i2c_stop();
134c134
<       //u8g->pin_list[U8G_PI_SET_A0] = 1;
---
>       u8g->pin_list[U8G_PI_SET_A0] = 1;
146c146
<       // u8g_i2c_stop();
---
>       u8g_i2c_stop();
150c150
<       //u8g->pin_list[U8G_PI_SET_A0] = 1;
---
>       u8g->pin_list[U8G_PI_SET_A0] = 1;
163c163
<       // u8g_i2c_stop();
---
>       u8g_i2c_stop();

Leider hat mir dieser Lösungsvorschlag nicht wirklich weitergeholfen.


Daraufhin habe ich ein bisschen im Netz gesucht und habe einen Thread von Enif im Arduino-Forum gefunden.
Er hat sich mit dem Entwickler der Lib über diese Sache unterhalten und hat anscheinend eine Lösung gefunden.

Quote
Enif
Essentially I had just to add some Wire.begin() statements to reinitialize the I2C lines in ConfigurationStore.cpp where the EEPROM is read and written


@Enif: Kannst Du mir die ConfigurationStore.cpp zukommen lassen? Oder ein Diff?

1-mal bearbeitet. Zuletzt am 14.01.16 04:36.
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
14. January 2016 04:42
void _EEPROM_writeData(int &pos, uint8_t* value, uint8_t size) {
  uint8_t c;
  while(size--) {
    eeprom_write_byte((unsigned char*)pos, *value);
    _delay_ms(2);
    c = eeprom_read_byte((unsigned char*)pos);
    if (c != *value) {
      SERIAL_ECHO_START;
      SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE);
    }
    pos++;
    value++;
  };
}
void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) {
  do {
    *value = eeprom_read_byte((unsigned char*)pos);
    pos++;
    value++;
  } while (--size);
}

Es scheint, als müsste ich nur diese 2 Funktionen anpassen...

@Enif: Korrigiere mich bitte, falls ich falsch liege.
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
14. January 2016 05:47
Ist schon etwas lange her und ich erinnere mich nicht mehr genau an alle Details...

Hab mal letzte Version von ConfigurationStore.cpp gesucht, die hatte aber noch Spuren von verschiedenen "Versuchen" drin, die mich zuerst verwirrten. Ich hab dann den unnötigen "Ballast" weggenommen und nochmals kompliliert. Meinen Due habe ich aber nicht neu geflasht und getestet, da er im Moment funktioniert - also mit Vorsicht geniessen...

Hier der Output von diff -u ConfigurationStore.cpp.ori ConfigurationStore.cpp - im Wesentlichen wirklich nur zwei Aufrufe von Wire.begin() :
--- ConfigurationStore.cpp.ori  2015-04-24 14:44:41.000000000 +0200
+++ ConfigurationStore.cpp      2016-01-14 11:29:17.421633493 +0100
@@ -99,6 +99,9 @@
    #include "mesh_bed_leveling.h"
 #endif  // MESH_BED_LEVELING
 
+
+#include  < Wire.h>                          // I2C library (
+
 void _EEPROM_writeData(int &pos, uint8_t* value, uint8_t size) {
   uint8_t c;
   while(size--) {
@@ -120,6 +123,7 @@
     value++;
   } while (--size);
 }
+
 #define EEPROM_WRITE_VAR(pos, value) _EEPROM_writeData(pos, (uint8_t*)&value, sizeof(value))
 #define EEPROM_READ_VAR(pos, value) _EEPROM_readData(pos, (uint8_t*)&value, sizeof(value))
 
@@ -135,6 +139,7 @@
   float dummy = 0.0f;
   char ver[4] = "000";
   int i = EEPROM_OFFSET;
+  Wire.begin();
   EEPROM_WRITE_VAR(i, ver); // invalidate data first
   EEPROM_WRITE_VAR(i, axis_steps_per_unit);
   EEPROM_WRITE_VAR(i, max_feedrate);
@@ -289,6 +294,7 @@
 
 void Config_RetrieveSettings() {
 
+  Wire.begin();
   int i = EEPROM_OFFSET;
   char stored_ver[4];
   char ver[4] = EEPROM_VERSION;
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
14. January 2016 07:39
Vielen Dank für Deine Hilfe. Ich werde das noch heute Abend testen.
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
14. January 2016 15:24
Das war die Lösung! Danke...

thumbs up
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
15. January 2016 02:03
Macht doch mal nen Pullrequest daraus auf das Master. Dann haben auch andere was davon. Ich komme aktuell zu nix.


Triffid Hunter's Calibration Guide --> X <-- Drill for new Monitor Most important Gcode.
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
15. January 2016 05:20
OK, ich werde das mit den vorläufigen Anpassungen machen...


Die Zusatz-Features kommen dann nach.


Ich wollte das Ganze nicht für mich behalten smiling smiley
Re: Tiny OLED I2C + RADDS 1.5 + Marlin4Due
23. January 2016 12:36
Ich habe sämtliche Anpassungen zusammengetragen.

Wurstnase wird das ins offizielle Marlin4Due einbauen, so dass es für Alle verfügbar ist.
Diejenigen, die nicht warten wollen können sich die Dateien hier im Anhang runterladen und lokal auf dem eigenen Rechner Marlin anpassen.

Ihr müsst nur die Dateien runterladen und in dem "Marlin"-Ordner ( \Marlin4Due\Marlin\ ) ablegen.

Eine Ausnahme ist die "Configuration.h". Diese Datei solltet Ihr nicht einfach kopieren, sonst überschreibt Ihr damit Eure Konfiguration.

Ihr müsst einfach diesen Code einfügen:
// SH1106 OLED generic display support
// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: [code.google.com]
//#define U8GLIB_SH1106
am besten direkt nach:
// SSD1306 OLED generic display support
// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: [code.google.com]
//#define U8GLIB_SSD1306

Anschließend einfach das verwendete Modell aktivieren
Alles Weitere wird automatisch in der Conditionals.h aktiviert.
Hier kann man auch den Buzzer und den Encoder ggf. einstellen.


Änderungen, die nicht direkt mit dem Display in Verbindung stehen:
configuration_store.cpp => Bugfix, I2C Konflikt, EEPROM
Marlin_main.cpp => Bugfix, macros.h "ENABLED", Funktionsaufruf fehlerhaft
Anhänge:
Öffnen | Download - Conditionals.h (18 KB)
Öffnen | Download - configuration_store.cpp (25.7 KB)
Öffnen | Download - dogm_lcd_implementation.h (19 KB)
Öffnen | Download - Marlin_main.cpp (210 KB)
Öffnen | Download - pins_RADDS.h (4.2 KB)
Öffnen | Download - pins_RAMPS4DUE.h (6.3 KB)
Öffnen | Download - Configuration.h (40.4 KB)
In diesem Forum dürfen leider nur registrierte Teilnehmer schreiben.

Klicke hier, um Dich einzuloggen