4 Bit Display, Rotary und USB HID (Arduino Uno), Menü auswählen und USB HID senden

Hallo Zusammen,

wer kann mir eine Software (natürlich gegen Bezahlung) entwickeln, die die folgenden Funktionen erfüllt?

Zuerst vorab, ich habe selbst schon einige Dinge probiert, aber leider dauert das für das eine Projekt einfach viel zu lange Einarbeitungszeit, die ich einfach nicht habe, da ich totaler Neuling auf dem Thema bin. Einsteigeranleitungen bekomme ich zwar hin, aber nicht das hier.
Dennoch würde ich ungerne einfach alles begonnene wegwerfen.

Ich würde gerne über einen RotaryEncoder 3-5 Menüanzeigen in einem Oled-SPI-Display anzeigen und Tastenkombinationen per Arduino-Uno-Tastatur auf dem PC ausgeben.
Die einzelnen Baugruppen (Rotary Encoder, Display und USB Tastatur) habe ich schon mit Codefragmenten im einzelnen zum laufen gebracht, mir fehlt im Groben die Zusammenführung.

Grüße Georg

UNO als PC-Tastatur ist eine ganz schlechte Wahl.

Andere Arduinos können das ohne Probleme.

Schau mal, ob sich hier jemand findet: Jobs and Paid Consultancy - Arduino Forum
Allerdings solltest Du schon mal das Budget festsetzen.

Na wenn das schon bisher einzeln geht, dann komm doch mit Code und es wird Dir geholfen, das zusammenzubauen.

Der UNO kann als Tastatur fungieren, dann verlierst Du aber den Komfort, Code auf den 328 zu schreiben.

Wenn Du einen Arduino Micro — Arduino Official Store nimmst, kann der USB-Port beides sein.

Und auf englisch schreiben.
Grüße Uwe

Gibt es hierfür auch ein kurze Erklärung?
Immerhin funktioniert der Part ja schon....

Das ist eine sehr freundliche Denkweise von Dir :slight_smile:
Nach gut 20 Jahren Forenpowerusergeschichte habe ich die Erfahrung gemacht, dass niemand soviel Arbeit für low investieren möchte.
Nach 2 sinnvollen Sätzen und 4 Beleidigungen und 8 Selbstwerterhöhungen kommt man nicht wirklich weit, gerade wenn man als blutiger Anfänger gegen Himmel stinkt lol und mir müsste man echt alles erklären, das bemerke ich immer wieder wenn ich mir fertige Codefragmente anschaue.
Und ganz ehrlich, auch ich würde nicht mehr als paar Denkanstöße für low geben und nicht alles erklären wollen, deshalb würde ich das gar nicht von anderen verlangen, nur ein guter Ton mit hilfreichen Vorschlägen (wie lass das lieber von einem gegen Geld machen) wäre manchmal wünschenswert.
Wenn jemand aber dennoch sich das hier jemand antun will, kann ich die zusammen copy-pasted Codefragmente gerne hier oder in einem passenden Thread posten.

Lg Georg

Na mach doch mal und schreib nen paar Erläuterungen dazu.

Wo auch immer Du unterwegs bist.
Ein Beispiel was geht: Serielle Datenstring vom Computer im Adruino Mega einlesen und aufteilen
Vielleicht kann ich ja Dein Weltbild aufhellen.

Dann habe ich Dich wohl mißverstanden.

"Tastenkombinationen per Arduino-Uno-Tastatur auf dem PC ausgeben." hatte ich so interpretiert, daß der UNO sich am PC wie eine Tastatur verhalten soll. Sowas habe ich mit meinem Teensy 3.2 (kein Arduino, aber per Arduino-IDE programmierbar) schon mal gemacht. Beim Teensy ist das durch Hardware und zugehörige Bibliotheken unterstützt.

Es gibt auch Arduinos, die das können, aber die hatte ich noch nicht auf meinem Basteltisch.

Soweit meine Erklärung, aber wenn Du was anderes meinst, sind meine Überlegungen für Dich nicht relevant.

Moin agmue,
der UNO kann das auch. Der 16U2 bekommt dann nur eine andere Firmware. Allerdings geht wohl dann das flashen des 328 nur noch via ISP.

Das ist mir bekannt, möchte ich aber nicht empfehlen, wenn es bessere Lösungen gibt.

Ne alles gut, mir ist bekannt, dass man nur per ISP flashen kann, ist aber auch kein Problem, ich habe einen Flasher.
Aber gut zu wissen, dass es auch anders gehen kann :slight_smile:

Wirklich unfassbar, aber ich glaube da würde ich sogar als TO die Lust verlieren :slight_smile:
Aber vielleicht ist es ja auch nicht so kompliziert wie ich denke, ein Versuch ist es wert, ich poste es euch mal hier rein. -Aber in einem gesondertem Thread.

NE- Machs nicht.
Bleib hier und pass den ersten Post den Betreff an.

Arduino UNO hat zwar einen USB-Anschchluß aber dieser ist ein Slave. Am Arduino USB Slave kann man keine andere Slaves anschließen. Um USB-Slaves wie eben die USB-Tastatur braucht es einen USB-Host. Das ist Zusatzhardware wie zB den MAX3421.
Es gibt noch PS2 Tastaturen die von Arduino eingelesen werden können.

Ich kenne nur eine Arduino (orginal) Hardware die das nativ konnte und das war der Arduino MEGA ADK. Ich weiß nicht ob andere neuere Modelle oder mit der Arduinp-IDE programmierbare Hardware einen USB- Host hat bzw emulieren kann.

Grüeß Uwe

Guten Morgen Zusammen,

ja dann will ich mal dem Vorschlag nachgehen es selbst zu versuchen und mit dem Display EA W202-XDLG beginnen, dieses tut zwar schon, aber nicht richtig, es treffen die Zeichen nicht genau auf ein Pixelblock.
Ich verwende gerade die hier genannte SPI Bibliothek:

Und hier mein Code dazu:

#include "iwi_SPI_RS0010.h"
SPI_RS0010 rs;
void setup(){
 rs.initSPI(12,11,13,10);//uint8_t miso, uint8_t mosi, uint8_t clk, uint8_t cs
 rs.begin(0,0,1);
}
void loop(){
 rs.clearBuf();
 rs.drawString(35,0,"Filter",1,1,1);
 rs.displayBuf();
 delay(2000);
 rs.clearBuf();
 rs.drawString(35,0,"F",1,1,1);
 rs.drawString(40,0,"i",1,1,1);
 rs.drawString(45,0,"l",1,1,1);
 rs.drawString(50,0,"t",1,1,1);
 rs.drawString(55,0,"e",1,1,1);
 rs.drawString(60,0,"r",1,1,1);
 rs.displayBuf();
 delay(2000);
}

Im zweiten Teil habe ich mit so geholfen, dass die Zeichen auf die Pixel treffen, etwas mühsam...

Deshalb habe ich versucht eine Bibliothek zu finden die besser sein könnte:


//V1.1 Changes:
//Added 2ms delay for clear display function
//Added Return home in clear display function


//INFO

//Made for MBED LPC1768
//Made for EA W082-XLG In SPI mode (8x2 Oled display)
//Also works with other Oled displays

//Default Ports: (For LPC1768)
//p11 = mosi
//p12 = miso
//p13 = sck
//p10 = cs

//  8x2 display cursor location
// |---------------------------------------|
// |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |
// |---------------------------------------|
// | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 |
// |---------------------------------------|

//IF Degree Symbol is desired, write DEG instead of the symbol, it will display the ° symbol. Example: DispCharacter(DEG); //Writes ° to display


//FUNCTIONS:

//OpenDisplay();  //Configures the display, should be run at startup in main routine, Clears display and returns to (1,1)
//DispLocate(X,Y);  //For choosing where the cursor is located. X is the line position (1-8), Y is the line select (1 for first line, 2 is for second line)
//DispCharacter('X');  //For writing a single Character to the display
//DispLine("HELLO");  //For writing a string to the display, (max 8 bit)
 
//ClearDisp();  //For Clearing Display, also returns the cursor to home (1,1)
//DispReturn();  //For Returning the cursor to home (1,1)
//ShiftRight();  //Shifts the cursor one to the right
//ShiftLeft();  //Shifts the cursor one to the left




//Define Pins:
#define mosi p11
#define miso p12
#define sck  p13
#define DEG 0xD2 //IF Degree Symbol is desired, write DEG instead of the symbol, it will display the ° symbol. Example: DispCharacter(DEG); //Writes ° to display

DigitalOut cs(p10); //Chip select

//Define SPI connections:
SPI spi(mosi, miso, sck); // mosi, miso, sck 


//For Use in Main Routine:
void DispLocate(char Char1, char Char2); //For deciding location of cursor, for use in main routine
void ClearDisp(void); //Clears the display, also returns the cursor to home (1,1)
void DispReturn(void); //returns cursor to home (1,1)
void ShiftRight(void); //Shifts cursor right
void ShiftLeft(void); //Shifts cursor left
void DispCharacter(void); //For displaying a single character. Example: DispCharacter('A'); //Wrtites A on display
void DispLine(void); //For Writing Line to display. Example: DispLine("Hello"); //Writes Hello on the display


//Prototypes:
void DispConfig(char Char); //For sending command to configure the display, used in the OpenDisplay routine
void Delay2us(void); //2us delay, used as a small delay for setup purposes

//Init Oled Display:
void OpenDisplay(){
        
    //DigitalOut cs(p8); //Chip select
    cs = 1; //high at idle 
    
    spi.format(10,3); //10bit, high steady state clock
    spi.frequency(1000000); //1MHz spi clock 
    
    //Display init routine
    DispConfig(0x39); //function set european chararacter set
    DispConfig(0x08); //display off
    DispConfig(0x06); //entry mode set increment cursor by 1 not shifting display
    DispConfig(0x17); //Character mode and internel power on
    DispConfig(0x01); //clear display
    DispConfig(0x02); //return home
    DispConfig(0x0C); //display on
    
    wait_ms(10); //Time to stabilize (wont work without)
}


//Send single line to display
void DispLine(char textstr[]){
        
        char len = strlen(textstr);
        for(char i = 0; i < len; i++){
            
            cs = 0; //chip select to start data transmission
            
            spi.write(0x200 | textstr[i]); //add 0x02 for character transmission
            
            cs = 1; //chip select to end data transmission
            
            Delay2us(); //small delay for cs to stabilize
        }
        
    }
    

void DispCharacter(char instruction){
    
        cs = 0; //chip select to start data transmission
        
        spi.write(0x200 | instruction); //add 0x02 for character transmission
        
        cs = 1; //chip select to end data transmission
        
        Delay2us(); //small delay for cs to stabilize
        
    }


//Send single character to display
void DispConfig(char instruction){
        
        cs = 0; //chip select to start data transmission
        
        spi.write(instruction);
        
        cs = 1; //chip select to end data transmission
        
        Delay2us(); //small delay for cs to stabilize
    }


//Locate Cursor
void DispLocate(char X, char Y){
        
        DispReturn(); //Return the cursor to home
        
        char tempX;
        tempX = X;
        char tempY;
        tempY = Y;
        
        //Shift to next line (64 times to the right)
        if(tempY > 1){
               for(int i = 0; i < 64; i++){
               ShiftRight();    
            }
        }
        
        //Decides how many times the cursor is shifted
        while(tempX > 1){
            tempX--;
            ShiftRight();
        }
    }


//Toggle Chipselect
void Chipselect(){
        
        cs = !cs; 
    }


void Delay2us(){
    
        wait_us(2); //small delay for cs to stabilize
    }

    
void ClearDisp(){
    
        DispConfig(0x01); //Clear Display, Sets DDRAM-address 0 into adresscounter
        wait_ms(2); //wait a little, wont work without
        DispReturn(); //Returns cursor home
        
    }

    
void DispReturn(){
        
        DispConfig(0x02); //Returns the cursor to home       
    }


void ShiftRight(){
    
        DispConfig(0x14); //Shift cursor right
        Delay2us();
    }


void ShiftLeft(){
    
        DispConfig(0x10); //Shift cursor left
        Delay2us();
    }

Die bekomme ich aber nicht zum laufen, da kein Exempel dabei zur Verfügung steht, vielleicht wäre das der erste Ansatz wie man das Display erst mal richtig zum laufen bekommt.

Natürlich bin ich für weitere Vorschläge oder eine bessere Bibliothek offen.

Grüße Georg

Vielleicht noch eine Info dazu, ich habe den folgenden Text zu dem Display im Internet gefunden:

MMS Electronics Ltd hat sein Angebot an hochwertigen alphanumerischen Displays um das OLED-Display EA W202-XDLG erweitert. Die OLED-Technologie hat den Vorteil eines hohen Kontrasts (2000:1) kombiniert mit einer erstaunlichen Ablesbarkeit aus allen Blickwinkeln. Dieses Display ist nicht nur ästhetisch ansprechend bietet aber viele weitere Vorteile: breite Betriebstemperatur -40°C bis +80°C ohne Kontrastverlust, schnelle Reaktionszeit von 10 Mikrosekunden auch bei Minustemperaturen und geringer Stromverbrauch (15 bis 50mA). Das Display wird mit einer +3,3V- oder +5V-Versorgung betrieben. Der EA W202-XDLG hat eine Zeichenhöhe von 9,66m. Systementwickler befinden sich mit dem integrierten HD44780-kompatiblen Display-Controller auf vertrautem Terrain. Der Controller hat einen 4 oder 8 Bit Datenbus, kann aber auch über eine SPI Schnittstelle verfügen. Vier Schriftarten wählbar: Englisch, Europäisch I, Europäisch II und Kyrillisch.

Wenn du das Display umgelötet hast - zeig bitte ein Bild von der Rückseite damit wir das überprüfen können.

Zeig bitte auch ein Bild von der Verkabelung. Jedes Kabel zwischen Display und Controller muss am Bild erkennbar sein.

zeige auch ein Bild wie das aussieht:

Wenn du dir das Leben einfacher machen willst, dann beginn mit einem ganz einfachen 1602 LCD + I2C Expander auf PCF basis und leg das OLED zur Seite.

Guter Tipp! Ein 16x2 wird auch im 4-Bit Modus betrieben , so lässt sich auch dieses Display hier im 4-Bit Modus mit dem selben Code betreiben:

#include <LiquidCrystal.h>
const int rs = 4, en = 5, d4 = 6, d5 = 7, d6 = 8, d7 = 9;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

int Variable = 1234;

void setup() {
  lcd.begin(20, 2);
  lcd.print("12345678901234567890");
}
void loop() {
  lcd.setCursor(7, 1);
  lcd.print(Variable);
}

Damit bekomme ich den Text zumindest schon mal sauber angezeigt, jedoch bewirkt ein Reset per Software nach dem Hochladen einen Zeichenmüll, ebenso der Resettaster, ich frage mich gerade ob da noch was nicht stimmt...
Weis da jemand woran das liegen könnte?
Wenn ich die Spannung komplett unterbreche, dann läuft es immer sauber hoch!

ja das habe ich bei den Character OLEDs teilweise auch. Brauchen einen Powercycle.
Zumindest bei einigen Übetragungsarten (und glaub mir ich hab da schon einiges an Timings und Sequenzen probiert...).

Wenn du die anderen Fonts brauchst, kannst ja mal meine LCD Library probieren, möglicherweise ist diese kompatibel zu deinem Display. Deins hat keine eingebaute I2C unterstützung, also nimm das I2C PCF8574 Interface.

naja ich muss ja nicht unbedingt via spi, die 2 Leitungen habe ich noch zur Verfügung, Hauptsache es läuft sauber.
Aber kann auch mal deine Lib noch probieren, danke.