- LiFePO4 Speicher Test         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 29 von 29

Thema: Odometrie / Fernsteuerung - Fragen+Probleme

  1. #21
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2009
    Beiträge
    19
    Anzeige

    Praxistest und DIY Projekte
    Hallo,


    im Rahmen meines Projekts sind ein paar Fragen aufgekommen.
    Mein Thema ist ja die Fernsteuerung mit einer Fernbedienung, das klappt auch hervorragend
    Ich möchte jedoch um die Reichweite zu erhöhen und um zu verhindern, dass der Empfänger (IC2) von den Motoren o.Ä. verdeckt werden kann, eine Art Antenne bauen.

    Hab mir dazu heute einen runden Holzstab (Durchmesser ca. 1cm, länge auf 8cm zugeschnitten) gekauft und ihn mit einem Bohrer durchlöchert.

    Soweit dazu, jetzt frag ich mich, ob ich den IC2 nach oben setzen kann (die 8cm) ohne das die Kabellänge die Funktion verschlechtert und ob das Flashen noch funktioniert, da die Infrarotdiode (D10) unten bleibt und diese meines Wissens nach auch zum Flashen gebraucht wird.

    Falls das geht, muss ich auf eine bestimmte Dicke der Kabel achten?
    Hab mir welche von einem alten Elektronikbaukasten rausgesucht, davon würden 3 Stück (IC2 hat 3 Anschlüsse) durch das Röhrchen passen.
    Die sind aber n bisschen dünner als die vom Motor oder dem Batteriefach.
    Geht das mit denen, oder soll ich mich an die Dicke von den Motorkabeln halten, oder noch dicker? (dann wird mit dem Röhrchen problematisch)

    Ich habe gedacht, dass Röhrchen mit einer Heißklebepistole auf die Platine zu kleben, genau an den Punkt wo der IC2 normal ist, muss ich aufpassen, dass kein Kleber auf die Lötstellen kommt oder ist das unwichtig(er)?

    Hoffe ihr könnt mir schnell helfen, mir läuft die Zeit davon.

    Gruß
    Seuche

  2. #22
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hoffe ihr könnt mir schnell helfen, mir läuft die Zeit davon
    Die Querschnitte der Kabel ist unkritisch, nimm was du hast. Wenn der IR-Empfänger (IC2) und die IR-LED zu weit auseinander sind muss der Transceiver extrem "schielen" um beide zu erfassen. 8 cm Abstand würde mein (USB-)Transceiver vermutlich nicht tolerieren.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #23
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2009
    Beiträge
    19
    Zitat Zitat von radbruch
    Hoffe ihr könnt mir schnell helfen, mir läuft die Zeit davon
    Die Querschnitte der Kabel ist unkritisch, nimm was du hast. Wenn der IR-Empfänger (IC2) und die IR-LED zu weit auseinander sind muss der Transceiver extrem "schielen" um beide zu erfassen. 8 cm Abstand würde mein (USB-)Transceiver vermutlich nicht tolerieren.
    Vielen dank, dann probier ich das morgen einfach mal, wenns mit dem Flashen nicht geht, muss ich die Diode eben auch noch hochlöten, kann man nix machen.

    Gruß
    Seuche

  4. #24
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2009
    Beiträge
    19
    Meine Antenne funktioniert soweit, die Diode hat nur nen leichten Wackelkontakt, muss ich nochmal nachlöten.

    Andere Frage, ich untersuche gerade die Schaltung der Infrarotschnittstelle (IC2 & D10).
    In der AsuroWiki steht dabei folgendes:

    "Die IR-LED hängt zwischen Pin PD1 und PB3. PD1 ist als UART TxD konfiguriert, während über PB3 ein 36kHz Signal als IR-Trägersignal dem gesendeten Signal zugemischt wird. "

    Heißt das, dass von PD1 das zu sendende Signal kommt (heißt ja UART TxD = Transmit = senden) und von PB3 die Trägerfrequenz? Das wäre doch ein Widerspruch, da die Diode nur ich Richtung PB3 -> PD1 durchlässt und andersrum sperrt!

    Kann mir jemand auf die Sprünge helfen, bin nicht so erfahren mit Elektronik ;(


    Gruß
    Seuche

  5. #25
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Heißt das, dass von PD1 das zu sendende Signal kommt (heißt ja UART TxD = Transmit = senden) und von PB3 die Trägerfrequenz?
    Ja, genau das heißt das. Welche Kombinationen der Pins können denn auftreten? Wie häufig wechselt PB3 bis BD1 wechselt? PB3 sind die 36kHz mit der die IR-LED getaktet wird.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #26
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2009
    Beiträge
    19
    Zitat Zitat von radbruch
    Heißt das, dass von PD1 das zu sendende Signal kommt (heißt ja UART TxD = Transmit = senden) und von PB3 die Trägerfrequenz?
    Ja, genau das heißt das. Welche Kombinationen der Pins können denn auftreten? Wie häufig wechselt PB3 bis BD1 wechselt? PB3 sind die 36kHz mit der die IR-LED getaktet wird.
    Ich weiß aufgrund meines sehr begrenzten Elektronikwissens nicht was du meinst, ich verweise einfach mal auf den entsprechenden Artikel, in dem ich diese Informationen gefunden habe: http://asuro.pytalhost.de/pmwiki/pmw...tschnittstelle


    Gruß
    Seuche

  7. #27
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2009
    Beiträge
    19
    Ich bin gerade beim verstehen des Programms:

    Code:
    /************************************************************/
    /*                                                          */
    /*	 Fernsteuern mittels IR-Fernbedienung (RC-5)            */
    /*                                                          */
    /*                      14.05.2009                          */
    /*                                                          */
    /************************************************************/
    
    
    #include "asuro.h"
    
    #define pow1 150 						// Langsame Geschwindigkeit
    #define pow2 200 						// Schnelle Geschwindigkeit
    #define taste (!(PINC & (1<<PC4))) 		// Tastenabfrage
    #define keine_taste (PINC & (1<<PC4))
    
    unsigned int count, temp; 				// Zaehler, IR-Kommando
    unsigned char daten[14], ir_status; 	// IR-Datenspeicher, IR-Eingangspegel
    
    int main(void) 
    {
      Init();
      do
      {
        temp=0;
        while (PIND & (1 << PD0)) 	// warten auf die Flanke des Startbits
        {
          if keine_taste StatusLED(GREEN); else StatusLED(RED);	// Tastenspielerei
          if taste BackLED(ON,ON); else BackLED(OFF,OFF);
        }
        StatusLED(RED); 						// Alarmstufe ROT: ein Zeichen ist im Anflug
        for (count=0; count<14; count++)  		// im Gesamten warten wir auf 14 Bits
        { 						
    
    /*******************************************************************/
    /*     laut Spettel-Diagramm betraegt die Bitlaenge 1,778 ms.      */
    /*     Bei 36 Takten pro Millisekunde ergibt das 36*1,778 = 64     */
    /*******************************************************************/
    
          Sleep(48); 												// Information einlesen nach 3/4 der Bitlaenge
          ir_status=(PIND & (1 << PD0));							// Pegel Speichern
          if (ir_status) daten[count]='1'; else daten[count]='0';	// und merken
          if (ir_status) temp |= (1 << (13-count)); 				// das MSB(=mostsuefikantbit) zuerst
          while (ir_status == (PIND & (1 << PD0))); 				// Bit gelesen, warten auf naechste Flanke
          }
    
          temp=temp/2 & 0xf; 	// Die Info steht in den Bits 1-4
          StatusLED(YELLOW); 	// Daten gelesen
          //Msleep(2000); 		// Zeit um den IR-Transceifer ueber den asuro zu bringen
          SerWrite("\n\r",2);
          SerWrite(daten,14); 	// Bitmuster zum PC senden
          SerWrite("-",1);
          PrintInt(temp); 		// erkannte Daten zum PC senden
    
    
    /*******************************************************************************/
    /* 								Asuro steuern:                                 */
    /*   Mit dem 10er-Block der Fernbedienung kann der Asuro nun gesteuert werden; */
    /*   		    	Alle anderen Tasten stoppen den Asuro                      */
    /*******************************************************************************/
    
          switch (temp) 
          {
          	 case 1:	MotorDir(FWD,FWD);		MotorSpeed(pow1,pow2);	break;
         	 case 2:	MotorDir(FWD,FWD);		MotorSpeed(pow2,pow2);	break;
          	 case 3:	MotorDir(FWD,FWD);		MotorSpeed(pow2,pow1);	break;
        	 case 4:	MotorDir(BREAK,FWD);	MotorSpeed(0,pow1);		break;
         	 case 5:	MotorDir(BREAK,BREAK);	MotorSpeed(0,0);		break;
         	 case 6:	MotorDir(FWD,BREAK);	MotorSpeed(pow1,0);		break;
         	 case 7:	MotorDir(RWD,BREAK);	MotorSpeed(pow1,0);		break;
         	 case 8:	MotorDir(RWD,RWD);		MotorSpeed(pow1,pow1);	break;
         	 case 9:	MotorDir(BREAK,RWD);	MotorSpeed(0,pow1);		break;
         	 default:	MotorDir(BREAK,BREAK);	MotorSpeed(0,0);		break;
        		
          }
          StatusLED(GREEN); //endlos
          //Msleep(1000);
      }
      while (1);
      return 0;
    }
    Ich möchte es möglichst genau verstehen, deshalb sind dabei viele Fragen enstanden, da mir ein Großteil der Befehle vollkommen unbekannt sind:

    "while (PIND & (1 << PD0))"

    soll das heißen, solange noch nichts empfangen wird und deshalb die Spannung an den PINs noch 0 ist?


    "Sleep( 48 ); // Information einlesen nach 3/4 der Bitlaenge"

    Warum wartet das Programm bis 3/4 der Bitlänge angekommen ist? Welcher Grund steckt dahinter?


    Allgemein verstehe ich diesen Kernabschnitt trotz der Kommentare nicht:

    Sleep( 48 ); // Information einlesen nach 3/4 der Bitlaenge
    ir_status=(PIND & (1 << PD0)); // Pegel Speichern
    if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken
    if (ir_status) temp |= (1 << (13-count)); // das MSB(=mostsuefikantbit) zuerst
    while (ir_status == (PIND & (1 << PD0))); // Bit gelesen, warten auf naechste Flanke
    }
    temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4

    Ich hoffe die kann mir jemand in einer für mich verständlichen Sprache erklären.

    Ansonsten bin ich schon öfters auf "SerWrite("\n\r",2);" gestoßen, was bedeutet der Klammerinhalt?


    Wenn mir jemand diese Fragen beantworten könnte, wäre ich sehr sehr dankbar und könnte endlich das, was hinter dem Programm steckt, verstehen.



    Gruß
    Seuche

  8. #28
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Na dann wollen wir das mal aufbröseln:

    "while (PIND & (1 << PD0))"

    soll das heißen, solange noch nichts empfangen wird und deshalb die Spannung an den PINs noch 0 ist?
    Da der IR-Empfänger das Signal invertiert(!) wird hier solange gewartet bis der Eingang nicht mehr high ist.

    "Sleep( 48 ); // Information einlesen nach 3/4 der Bitlaenge"

    Warum wartet das Programm bis 3/4 der Bitlänge angekommen ist? Welcher Grund steckt dahinter?
    Dahinter steckt die ungefähre Bitlänge von 64 Sleep()s und die Manchestercodierung des RC5-Signals. Nach dem Pegelwechsel nach halber Bitlänge sitzt der Eingang auf dem Pegel des Datenbits und kann zwischen Sleep(32) und Sleep(63) eingelesen werden. Um das ungenaue Timeing durch Sleep() auszugleichen wird quasi in der Mitte dieses Bereichs bei Sleep(48) eingelesen.

    Allgemein verstehe ich diesen Kernabschnitt trotz der Kommentare nicht:

    for (count=0; count<14; count++) // im Gesamten warten wir auf 14 Bits
    {
    Sleep( 48 ); // Information einlesen nach 3/4 der Bitlaenge
    ir_status=(PIND & (1 << PD0)); // Pegel Speichern
    if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken
    if (ir_status) temp |= (1 << (13-count)); // das MSB(=mostsuefikantbit) zuerst
    while (ir_status == (PIND & (1 << PD0))); // Bit gelesen, warten auf naechste Flanke
    }
    temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
    Ich hoffe die kann mir jemand in einer für mich verständlichen Sprache erklären.
    Oje. Es werden 14 RC5-Bits in die Zeichenkette daten[] und die 16 bit-Variable temp eingelesen. Ablauf beim ersten Bit: Warten bis Übertragung startet, dann nach sleep(48) den Pegel nach ir_status einlesen. Abhängig von ir_status werden dann in daten[] eine '0' oder '1' eingetragen und das entsprechende Bit in temp gesetzt (MSB beachten!). Nun wird noch gewartet bis sich der Eingangspegel wieder ändert (!=ir_status), damit ist das erste Bit fertig.

    Nun wird count erhöht und die Schleife steigt bei sleep(48) wieder ein um die restlichen Bits einzulesen.

    Ansonsten bin ich schon öfters auf "SerWrite("\n\r",2);" gestoßen, was bedeutet der Klammerinhalt?
    Die Steuerzeichen in der Zeichenkette bedeuten '\n'=newline (neue Zeile) und '\r'=carrige return (Wagenrücklauf) Das zwinkt das Treminalprogramm eine neue Zeile darzustellen und alles anzuzeigen was in der letzten Zeile gesendet wurde.

    "PrintInt(temp); // erkannte Daten zum PC senden"

    Was sind das für Daten? Das erkannte Bitmuster mit der dazugehörigen Befehlskennung wurden ja bereits an den Computer gesendet!
    In temp stehen die 14 RC5-Bits rechtsbündig, das der Fernbedienungstaste zugeordnete Kommando in den Bis 1-4: "temp=temp/2 & 0xf;" bedeutet Bits eine Stelle nach rechts schieben und Bits 4-15 ausblenden. Dann enthält temp das Kommando.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #29
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2009
    Beiträge
    19
    Vielen vielen Dank für deine Hilfe!
    Das wars erstmal von meiner Seite, meine Arbeit ist fertig! Ich mach erstmal Urlaub

    Gruß
    Seuche

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

Labornetzteil AliExpress