- 12V Akku mit 280 Ah bauen         
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 32

Thema: RN-Control von PC steuern

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    13.09.2007
    Beiträge
    39

    RN-Control von PC steuern

    Anzeige

    Powerstation Test
    Hallo!
    Ich hab vor ein kleines Projekt zu erstellen, da ich mich jedoch das erste mal an so etwas wage weiß ich nicht so recht, was ich brauche und wie ich anfangen soll. Ich würde ja gerne das Forum durchsuchen aber ich weiß nicht so recht wonach ich suchen soll.

    Also es sieht so aus, ich möchte am RN-Control eine RN-Relais Kkarte anstecken wo 2 Motoren dran hängen, am RN-Control Motortreiber möchte ich einen Schrittmotor anhängen. Ausserdem wird irgendwie noch ein Scheinwerfer angeschlossen, wo/wie weiß ich noch nicht genau.
    Nun sollen per PC die Funktionen gesteuert werden, in etwa so:

    • Uparrow => Motor #1 vorwärts
      Downarrow => Motor #1 rückwärts
      Leftarrow => Motor #2 vorwärts
      Rightarrow => Motor #2 rückwärts
      W => Schrittmotor vor
      S => Schrittmotor zurück
      F => Scheinwerfer an/aus


    So, clientseitig (PC) wird es mit C++ und Qt (zusätzlich GUI) programmiert, serverseitig (RN-Control) mit C. Mein bisheriger Denkansatz war, dass ich einfach für jeden der 7 Befehle ein Byte mit inkludierter Prüfziffer bzw. mit UART an das RN-Control sende und dort in der main() Methode am RN-Control einfach auf empfangene Bytes warte und je nach Byte etwas anderes ausführe (Motor #x vor/zurück, etc).
    Nun ist meine Frage, macht man dies so (mittels UART) oder anders?
    Gleichzeitiges ansteuern von den 2 Motoren (Motor #1 vor und Motor #2 zurück) wenn ich 2 Tasten gleichzeitig drücke bereitet mir z.B. Probleme, vor allem wenn dann noch währenddessen Licht an/aus kommt.
    Ich verlange nicht, dass ihr mir fertigen Code postet sondern hätte einfach nur gerne eine Art Beschreibung wie ich mein kleines Projekt (ist ja nicht kompliziert) bestmöglich realisieren kann.

    LG

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    44
    Beiträge
    1.273
    Hallo!
    Das hört sich auf jeden Fall schonmal so an als bist du kein Programmieranfänger mehr, im Gegensatz zu mir... Aber vielleicht kann ich dir ja trotzdem helfen. Ich hatte ca. das gleiche Problem wie du, hab es mittlerweile gelöst.
    Ich sende vom PC einfach über RS232 bei jedem Tastenereignis einen String, z.B. "LAMPEa1", "MOTORb300", "RELAISa1". Im RN-Control empfange ich dann einfach alles per "INPUT EmpfangsString noecho". Dann untersucht der µC die empfangenen Strings auf substrings, z.B. "LAMPEa" "MOTORb" etc., schneidet diesen Substring ab und schaltet dann das Relais bzw. den Motor entsprechend dem Rest des Strings.
    Gleichzeitige Tastendrücke dürften eigentlich kein Problem sein, es wird zwar nacheinander ausgeführt, aber das geht sooo schnell dass man es nicht merkt.

    Hoffe geholfen zu haben,
    Viele Grüße,
    William

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    13.09.2007
    Beiträge
    39
    Hallo!
    Danke für die Antwort!
    Ja ich hab schon etwas Programmiererfahrung allerdings in anderen Bereichen. Von daher ist jeder Tipp von euch gern gesehen. Hab mit HTML angefangen und dann kam irgendwann das obligatorisch Aufstocken auf JavaScript, ActionScript und PHP. Hab zwischendurch auch mal Python angeschaut, ist recht lustig. Da ich seit diesem Semester Technsiche Informatik studiere hab ich jetzt auch Java als Lehrveranstaltung. C / C++ hab ich nur mal kurz angeschaut, aber mittlerweile macht mir ein Sprachenumstieg keine großen Probleme. Die Problemstellung ist bei Webseiten allerdings doch anders

    Zitat Zitat von Willa
    Ich sende vom PC einfach über RS232 bei jedem Tastenereignis einen String, z.B. "LAMPEa1", "MOTORb300", "RELAISa1". Im RN-Control empfange ich dann einfach alles per "INPUT EmpfangsString noecho".
    Im Prinzip will ich dasselbe machen. Ich sende aber nur ein Byte um weniger übertragen zu müssen. Das Paritybit lasse ich evtl weg. Da bei mir die Distanz etwas größer ausfallen wird, werde ich am PC von RS232 auf RS485 und am Board von RS485 auf RS232 wandeln.
    Dein Code schaut mir irgendwie nach BASIC aus, da kenn ich mich nicht aus. Meine main() Funktion am Board wird irgendwie so aussehen:
    Code:
    /* Das ist nur ein Pseudocode */
    #include<alles_noetige.h>
    
    char M1VOR = 0b00000010;
    char M1RUE = 0b00000011;
    char M2VOR = 0b00000100;
    char M2RUE = 0b00000101;
    ...
    
    int main()
    {
        while(true)
        {
            char befehl = UART_get();
            
            switch(befehl)
            {
                case M1VOR:
                    /* Relais von Motor 1 entsprechend ansteuern */
                    break;
                ...
            } /* !switch */
        } /* !while */
    }
    Weiß nicht ob der Code in C keine Fehler wirft, muss ich erst testen aber so iwie war mein Plan.

    Also mit UART Senden und Empfangen und dann Handlung ausführen ist der Richtige Weg? Dann ist ja alles gut.

    LG

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Schau dir den Code mal an, der ist für einen Mega8 geschrieben.
    Code:
    #include <avr/io.h>         
    //#include <stdbool.h>
    #include <stdlib.h>
    //#include <AVR/iom8.h>
    //#include <inttypes.h>
    #include <avr/interrupt.h>
    
    #define F_CPU 8000000    // clock
    #define	BAUD	9600
    #define bauddivider (unsigned int)(F_CPU / BAUD / 16 - 0.5)
    volatile unsigned char rxwert=0x30; /* ASCII-Wert für die Taste 0 */
    
    ISR(USART_RXC_vect){	/* Zeichen wurde empfangen */
    rxwert= UDR;		/* Empfangener Wert wird Übergeben */
    PORTB^=(1<<PB0);
    }
    
    void timer1_init(void){
     TCCR1A = (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0); // initalize mega8 Timer1 with 9Bit, inverted, Prescaler 256
     TCCR1B = (1<<CS12); // this gives us a signal with 21.76ms at 12MHz
    
     OCR1A = 486; // pulse of 1.5ms 512- 1500*(F_CPU/256/1000000)/2
                 
     OCR1B = 486;
    }
    
    void usart_init(void){
    UBRRL = bauddivider;			//set baud rate
    UBRRH = bauddivider >> 8;
    UCSRB = (1<<RXCIE)|(1<<RXEN);	/* RX-Interrupt und RX freigeben */
    UCSRC = (1<<URSEL)|(3<<UCSZ0);
    }
    
    int main (void){
    timer1_init();
    usart_init();
    
         DDRB = (1<<PB0)|(1<<PB1)|(1<<PB2);           /* Pin PB1 2  als Ausgang für Servo */
       
         DDRD  &= (~ (1<<PD2)|(1<<PD3)|(1<<PD0)|(1<<PD1)); /* Pin D als Eingang */
         PORTD |= (1<<PD2)|(1<<PD3)|(1<<PD0)|(1<<PD1); /* Pull Up  aktivieren */
    sei();
       
    while(1){
    if(rxwert==0x30){			/* Tasten nur aktiv wenn rxwert == Taste 0 */
       if (!( PIND & (1<<PIND2)))      /* mache was wenn PinD2 low ist */
       {
    		OCR1A=470;
          }
       
       if (!( PIND & (1<<PIND3)))      /* mache was wenn PinD3 low ist */
       {
    		OCR1A=499;
       }
       
       if (( PIND & (1<<PIND2))&&(PIND & (1<<PIND3))) {  /* Mitte wenn keine Taste */
    		OCR1A = 486;
       }
       if (!( PIND & (1<<PIND0)))      /* mache was wenn PinD0 low ist */
       {
    		OCR1B=470;
          }
      
       if (!( PIND & (1<<PIND1)))      /* mache was wenn PinD1 low ist */
       {
    		OCR1B=499;
       }
       
       if (( PIND & (1<<PIND0))&&(PIND & (1<<PIND1))) {  /* Mitte wenn keine Taste */
    		OCR1B=486;
       }
       }
    switch(rxwert){
    	case 0x38 :		/* rxwert == Taste 8 */
    		OCR1A=470;
    		break;
    	case 0x32 :		/* rxwert == Taste 2 */
    		OCR1A=499;
    		break;
    	case 0x34 :		/* rxwert == Taste 4 */
    		OCR1B=470;
    		break;
    	case 0x36 :		/* rxwert == Taste 6 */
    		OCR1B=499;
    		break;
    		}
    }
    }
    Es werden damit zwei Servos angesteuert, fahren nach rechts oder links und mit der Taste 0 wieder in Neutralstellung.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Es gibt da meines Erachtens 2 Möglichkeiten, Dein Problem "2 Tasten gleichzeitig drücken" zu lösen:

    1) Schick nicht den Tastendruck, sondern Tastenereigniss: "Taste W gedrückt, Taste S gedrückt, Taste W losgelassen, Taste S losgelassen". In einem solchen Fall kannst Du viele Tasten kurz nacheinander drücken, solang Du sie nicht GENAU GLEICHZEITIG drückst, sollte das gehen und der µC kann dann auch solange die Taste nutzen, wie sie gedrückt bleibt, ohne dass ständig Daten fließen (müssen).

    2) Schick dauernd den Zustand aller Tasten in bspw. einem Bit-Array. Du schickst also alle 250ms den Zustand aller Tasten in einem einzelnen Byte an den Controler, wobei verschiedene Bits den Zustand darstellen.
    Beispiel 1: 0110000 -> Bedeutet UpArrow und RightArrow gedrückt, alle anderen nicht.
    Beispiel 2: 1000001 -> Bedeutet LeftArrow und LichtAn gedrückt, alle anderen nicht. So kannst Du auch nach und nach mehrere Tasten drücken oder eben ein paar GLEICHZEITIG, denn er kann ja 0100000 oder 0110000 senden.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    13.09.2007
    Beiträge
    39
    Danke für den Beispielcode!
    Das ganze Controllerprogrammieren ist für mich wie bereits erwähnt Neuland. Die Bitverschiebung an sich ist kein Problem aber ich muss immer wieder nachschauen welche Verschiebung welche Auswirkung hat.

    Bin mal kurz den Code durchgegangen, du weist der variable rxwert den Inhalt vom UART receive zu mittels Interrupt. Wird das Interrupt-Signal automatisch erzeugt bei Erhalt einer Nachricht oder hast du dies irgendwo festlegen müssen?

    LG

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    13.09.2007
    Beiträge
    39
    Zitat Zitat von thewulf00
    Es gibt da meines Erachtens 2 Möglichkeiten, Dein Problem "2 Tasten gleichzeitig drücken" zu lösen:
    Danke!
    Werde wahrscheinlich eine dieser Möglichkeiten nützen, wahrscheinlich die erste.

    Noch etwas: ich überlege eine Kamera einzubauen, kann ich die Daten irgendwie über den RN-Control RS232 (über RS485) Bus an den PC übertragen oder wäre es besser die Daten über ein separates Kabel zu übertragen?
    Ein Kabel wäre mir lieber. Kann ich vl ein CAT5 Kabel nehmen und 2 Adernpaare für RS485 (4 Draht heisst doch 4 Adern und nicht 4 Adernpaare oder?) und X Adernpaare für die Kamera nehmen und dann am Schluss die Adernpaare trennen (2 RN-Control, X Kamera)?

    LG

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Also gut, dann nimm die 1. Variante. So macht es das PC-Keyboard ja auch. Aber um die vielen Tasten über die wenigen Leitungen zu bekommen, macht es noch etwas mehr, vielleicht willst Du das auch: Er sendet Drücken/Loslassen und Tastennummer. (Meines Wissens auch gleich die richtige Sondertasten-Kombi, aber das ist Dir egal)

    Also könntest Du eine Nummer für eine Taste schicken gleich danach GEDRÜCKT(1) oder LOSGELASSEN(0). Oder auch umgekehrt. Oder Du kombinierst es:
    11 -> Taste '1' gedrückt (Bspw. UpArrow)
    20 -> Taste '2' losgelassen (Bspw. DownArrow)
    31 -> Taste '3' gedrückt (Bspw. F)
    ...

    Dann könntest Du über ein simples "Wegfiltern" der Bits den Vergleich machen. Bsp: Wenn Du die Taste selbst rausfinden willst, dann verUNDest Du einfach das Byte mit 0b11110000, so werden nur die oberen 4 Bits "durchgelassen" usw.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    13.09.2007
    Beiträge
    39
    Zitat Zitat von thewulf00
    Also könntest Du eine Nummer für eine Taste schicken gleich danach GEDRÜCKT(1) oder LOSGELASSEN(0). Oder auch umgekehrt. Oder Du kombinierst es:
    ...
    Ich hab mir das gerade so überlegt:
    • Übertragen wird 1 Byte, also 8 Bit ( MSB 6 5 4 3 2 1 LSB)
      MSB = 1 => Taste mit Code Bit 6 bis Bit LSB losgelassen
      MSB = 0 => Taste mit Code Bit 6 bis Bit LSB gedrückt

    Die genauen Tastencodes hab ich noch nicht nachgeschaut, falls einer der Codes das MSB benötigt dann setze ich die Werte per Hand neu.

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Diese Idee ist eine Abwandlung des Beispiels und geht ebensogut. Ich würde Dir dennoch empfehlen in Deinem PC-seitigen Programm die Tasten umzudefinieren: Kommt ein UpArrow, dann mach ne 1, kommt ein DownArrow, dann mach ne 2. usw.

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test