-

Kommentare

  1. Avatar von Searcher
    Zitat Zitat von witkatz
    ... Kainka schreibt in dem Artikel Wir schlachten einen Videorecorder, dass in dem Flachmotor mehrere Hall-Sensoren verbaut sind.
    Den habe ich noch nicht auseinandergenommen. Dafür von mehreren 3 1/2" Floppylaufwerken den Diskettenantrieb. Da sind meistens drei Hallsensoren für verbaut. Sind aber immer so winzig, daß es mir bisher keinen Spaß gemacht hat die auszuprobieren.

    Sehr interessant ist noch die Kopftrommel im Videorekorder. Die überträgt irgendwie die Infos der rotierenden Schreib/Leseköpfe von und zur feststehenden Auswerteelektronik

    Gruß
    Searcher
  2. Avatar von witkatz
    Gut zu wissen. Übrigens, Kainka schreibt in dem Artikel Wir schlachten einen Videorecorder, dass in dem Flachmotor mehrere Hall-Sensoren verbaut sind.
    Wenn ich das nächste mal über den Trödelmarkt schlendere, nehme ich mal einen Videorecorder zum Ausschlachten mit. Unser läuft nämlich noch und ist zu schade dafür.
  3. Avatar von Searcher
    Zitat Zitat von witkatz
    Aber ehrlich gesagt ist es wurscht ob du über deinen Werkstattalltag bloggst oder es lässt, weil die Blogs generell kaum noch jemand liest...
    Egal. Ich schreibe trotzdem wenn mir danach ist. Möglicherweise lesen es doch einige, haben aber nicht unbedingt etwas dazu zu schreiben. Und vielleicht erbarmt sich doch jemand einen allzu groben Unsinn nicht unwidersprochen zu lassen
  4. Avatar von witkatz
    Aber ehrlich gesagt ist es wurscht ob du über deinen Werkstattalltag bloggst oder es lässt, weil die Blogs generell kaum noch jemand liest...
    Aktualisiert: 11.06.2014 um 22:54 von witkatz
  5. Avatar von witkatz
    Manchmal fühle ich mich doch recht einsam hier im Blog
    Kommt mir bekannt vor
    probiere mal dieses oder jenes. Wäre eigentlich auch ab und zu einen Blogeintrag wert...?
    Klar doch, eben dafür wurde doch Blog erschaffen.
  6. Avatar von Searcher
    Danke witkatz.

    Manchmal fühle ich mich doch recht einsam hier im Blog. Die etwas provokante Bemerkung sollte andere herausfordern, doch auch mal was über
    den gemeinen Bastelalltag im Blog zu schreiben

    Im Augenblick habe ich kein festes Projekt und probiere mal dieses oder jenes. Wäre eigentlich auch ab und zu einen Blogeintrag wert...?...!

    Gruß
    Searcher
  7. Avatar von witkatz
    konnte ich meine Blogeintragsbilanz nun noch mal erhöhen und in uneinholbare Höhen schrauben
    Find ich gut, weil ich deine Blogs gerne lese! =D>
  8. Avatar von Searcher
    Ich hab die Stepper ohne Last von Null auf 30U/s beschleunigen können. Mit Rampe ging es dann gut mit 70 bis 80 U/s bis sie ALLE Schritte verloren Hatten aber echt dabei auch keine Kraft mehr.

    @PlasmaTubeI²C: Dein Kommentar bringt mich dazu erstmal den Antriebsblock mit Ansteuerschaltung auf Steckbrett zu testen. Achsen werd ich dann demnächst sauber lagern und das ganze Ding feinjustieren.

    Dann kann ich auch 'ne Treiberschaltung ausprobieren. Ich versuche mit den Teilen, ich hier noch lagern habe auszukommen; leider kein Steppertreiber dabei. Nur in der allergrößten Not und mit Aussicht auf durchschlagenden Erfolg schau ich mal danach. Wär vielleicht das bequemste...

    Hab auch schon einige CD-Laufwerke auseinandergenommen aber leider noch keine Stepper darin gefunden. Waren immer DC-Motore oder diese BLDC für den Tellerantrieb. Auch wenn ich 8 U/s auf die Straße kriegen würde, wär ich schon zufrieden. Am Antriebsblock wären noch Modifikationen möglich. 6:1 oder 4:1 sollten relativ "einfach" machbar sein.
  9. Avatar von PlasmaTubeI²C
    Hm hört sich schonmal nicht schlecht an

    Aber 20U/s klingt doch ein bisschen arg schnell oder? Ich hab mal nen Stepper aus einem DVD-Brenner auf knapp 8 U/s gebracht, aber mit deutlichen Leistungseinbußen,
    kritisch wirds dann halt bei Robotern, weil Schrittmotoren dann gerne nen Schritt "verschlucken" wenn die Kraft ned reicht...

    Und: Ja die Motoren ziehen echt viel Strom, aber ein bisschen Diät tut denen trotzdem gut, sonst kannste Spiegelei drauf braten bei der Wärme

    Meinst du nicht ein simpler Stepper-Controller macht das ein bisschen einfacher? Dann brauchst du nur ein Taktsignal für einen Schritt und Microstepping ist auch problemlos möglich.
  10. Avatar von Searcher
    Endlich einer der sich traut zu überlegen damit einen Versuch zu wagen .
    Der Code enthält, wie vermutlich alle Codes, immer noch einen kleinen mir bekannten Bug. Falls der Übergang von einer Betriebsart in eine andere etwas hakelt könnte es der sein

    Viel Erfolg
  11. Avatar von p@ty
    Danke für Deine Arbeit und den Code!
    Werde ich bei Gelegenheit aus probieren!

    Alte Laufwerke hat man ja zur Genüge im Keller liegen! ^^

    Viele Grüße,
    p@
  12. Avatar von Searcher
    Im RampenTest.bas.txt gab es einen Bug (fehlende Initialisierung einer Variablen). Programm ist gegen berichtigte Version ausgetauscht.
  13. Avatar von Searcher
    Hallo Marcus,

    danke für Erläuterung zur knick- und ruckelfreien Kurve. Hab ich echt zum erstenmal gehört. Gegoogelt und gleich Lust bekommen so eine Linie zu konstruieren. Es könnte aber sein, daß mein Problem damit verschwunden wäre und ich meine Meßapparatur gar nicht mehr ausnützen müßte.

    Nein, Quatsch. Es ist nicht soooo wichtig für mich, eine Teststrecke mit Höchstgeschwindigkeit zu durchfahren; da ist sowieso bei den Voraussetzungen von Motor, Getriebeübersetzung wg Höchstgeschwindigkeit und differentieller Lenkung, einfache Elektronik des TT bald Schluß. Es interessiert mich, wie ich auftretende Probleme in den Griff bekommen kann (ohne die Strecke zu verändern - das käme mir dann gemogelt vor). Falls mir das in diesem Fall für die gegenwärtige Strecke gelingt, könnte es sein, daß ich danach auch andere Streckenkonstruktionen ausprobiere.

    In der letzten Zeit habe ich weniger experimentiert und bin deshalb kaum weitergekommen. Allerdings habe ich schon einige Meßwerte bekommen können und es lassen sich daraus die Schlingerbewegungen schon erkennen. Die muß ich noch aufbereiten, genauer analysieren hinsichtlich Frequenz und Stärke und sicher noch ein paar Messungen mit unterschiedlichen Geschwindigkeiten machen.

    Werd dann mal sehen, wie ich Deinen Input in Gegenmaßnahmen praktisch verwerten kann.


    Gruß
    Searcher
  14. Avatar von Marcus Blesius
    Hi

    Knick und Ruckfrei haben wir damals im Mathe-LK gemacht, meint:

    DIe FUnktion, auf die der Roboter fährt, sowie die erste und zweite Ableitung sind stetig.
    Die erste Ableitung gibt an, wie die Lenkposition ist.
    Die zweite ABleitung gibt an, wie schnell die Lenkposition verändert wird.

    am Ende des Kreisen, wo du in die Gerade übergehst, muss der Robotor sehr schnell von der Lenkposition eingeschlagen auf neutral wechseln. Für diesen Wechsel hast du nur begrenzte Zeit zur Verfügung, die davon abhängt wie lange man noch die Linie sieht und natürlich wie schnell man ist. Bist du also zu schnell verliert man die Linie.

    SOweit die Theorie, hätte nie gedacht, dass mir Mathe so in der Praxis etgegen kommt^^
  15. Avatar von Searcher
    Zitat Zitat von Marcus Blesius
    Hast du mal probiert, wie dein Robo auf Knick und Ruckfreie Strecken reagiert?
    Hallo Marcus,
    mein Robo ist sehr einfach aufgebaut. Er kann nur vorwärts fahren und ich kann ihn nicht aktiv bremsen. Deshalb sind alle meine Teststrecken Knick- und "Ruckfrei"? d.h. keine Winkel drin. Winkel würd er nur mit geringer Geschwindigkeit schaffen.

    Für Messungen habe ich einen kleinen Rundkurs und eine Acht "aufgebaut". Die Kurven sind mit Zirkel gezogen, also Kreisbögen mit kleinstem Durchmesser von 22 cm. Im Prinzip wie im Video in diesem Blogeintrag zu sehen:
    http://www.roboternetz.de/community/...s-Linienfolger

    Ich bin eigentlich sehr zufrieden mit dem Fahrverhalten unter den Voraussetzungen auf den Teststrecken.

    Das Schlingern tritt nur sichtbar bei hoher Geschwindigkeit am Ausgang einer engen Kurve auf und das möchte ich versuchen zu verbessern. Liegt wahrscheinlich an den schwachen Motoren, die es nicht schaffen, rechtzeitig kräftig genug auf die Steuerimpulse zu reagieren und den TT auf Spur zu bringen, und ich hoffe durch Messungen Aufschlüsse über Gegenmaßnahmen zu bekommen.

    Gruß
    Searcher
  16. Avatar von Marcus Blesius
    Hast du mal probiert, wie dein Robo auf Knick und Ruckfreie Strecken reagiert?
  17. Avatar von Searcher
    Hier noch der hingefrickelte Code

    Code:
    '###############################################################################
    'File: Messprogramm_08.bas
    '
    'Funktionen:
    'Meßprogramm zum Abfahren einer geraden weißen Meßstrecke mit 100 schwarzen Strichen
    'Die Striche sind im Abstand von 0,5cm aufgetragen und werden von einem CNY70 abgetastet
    'Die verstrichenen Zeiteinheiten seit Start werden für jeden Strich im eeprom gesichert
    'Nachbereitung der Meßwerte in externen Programmen auf PC
    'Linienfolgefunktion sorgt für das Nichtabweichen von der Meßstrecke
    'Meßfahrt wird mit RC5 Infrarotfernbedienung gestartet und nach Zählen von 100 Strichen gestoppt
    '
    'IDE: BASCOM-AVR Demoversion 1.11.9.8
    '
    'HW circuit: Linienfolger_mit_FB.aac plus angeflanschtem CNY70 mit Schmittrigger an PB0
    'Timer1 für PWM Erzeugung, Timeticks und Start der ADC Messungen für Linienfolgung
    'TSOP für FB an PB3. BASCOM Kommando Getrc5 nutzt Timer0 !!!
    '###############################################################################
    
    $regfile = "attiny45.dat"
    $eepleave
    $framesize = 4
    $swstack = 4
    $hwstack = 34
    $crystal = 8000000
    $lib "mcsbyteint.lbx"                   'only byte and word operations
    
    Dim Address As Byte , Command As Byte   'variables for getrc5
    
    Dim Sr_tick(101) As Word                'Zwischenspeicher für Meßwerte
    Dim Ee_tick(101) As Eram Word At &H02   'eeprom Speicher wird am Ende der Meßfahrt gefüllt
    
    Dim Time_tick As Word
    Dim Toggle_bit As Bit
    
    Dim Index As Byte
    
    Dim Average_speed As Byte
    Average_speed = 0                       'Durchschittsgeschwindigkeit mit 0 initialisieren
    
    Dim Adc_low As Byte                     'variable for adc result
    
    Config Portb = Input                    'ports initialisieren
    Portb = Portb Or &H1F                   'ports mit pullups auf definierten Pegel
    
    Config Rc5 = Pinb.3                     'TSOP at PB3
    Config Portb.4 = Output                 'PB4 as output, OC1B, MotorX
    Config Portb.1 = Output                 'PB1 as output, OC1A, MotorY
    
    Tccr1 = Tccr1 Or &B01100000             'set PWM1A & OC1A (PB1)
    Gtccr = Gtccr Or &B01100000             'set PWM1B & OC1B (PB4) clear TCNT1 on OCR1C match
    Ocr1a = 0                               'initialise OCR1A -> low, no pulses at OC1A
    Ocr1b = 0                               'initialise OCR1B -> low, no pulses at OC1B
    Ocr1c = 249                             'set pwm frq. 8Mhz / 4 / (249 + 1)= 8kHz
    Tccr1 = Tccr1 Or &B00000011             'Einschalten TIMER1 - prescaler = 4
    
    Didr0 = &B00110100                      'ADC power save PB2,4,5. PB3 (TSOP) nicht abschalten
    Admux = &B10101011                      '1,1V internal reference, ADLAR=1 (left adjusted), PB5 PB2 gain 20
    Adcsrb.7 = 1                            'bipolar mode
    
    Adcsra = Adcsra Or &B00001111           'ADC Int. enable, ADC prescaler auf 128 (62500Hz at 8MHz systemclock)
                                            'Messung braucht 13 Takte -> 13 * 16µs = 208µs
    Adcsra.7 = 1                            'turn on ADC
    
    Pcmsk.pcint3 = 1                        'Pin Change Interrupt PCINT3 auf Pin PB3 für FB TSOP erlauben
    Enable Pcint0                           'Pin Change Interrupts erlauben
    
    On Adc Adcmessung_to_pwm                'Wenn ADC Messung fertig -> Interrupt zum PWM Tastverh. setzen
    On Pcint0 Get_time_tick                 'Zeitnahme wenn Pin Change Interrupt vom CNY70
    On Ovf1 Set_time_tick                   'Timer1 Overflow INT -> ISR zum Timeticks hochzählen
    
    Enable Interrupts                       'Interrupts generell erlauben
    
    
    Do                                      'Hauptschleife
       While Pcmsk.pcint0 <> 1              'Schleife für Startbefehl von Fernbedienung,
                                            'nur wenn PCINT auf PB0 für CNY70 NICHT zugelassen
          Getrc5(address , Command)         'procedure returns FF FF if no RC5 message
          If Address <> &HFF Then           'RC5 Nachricht empfangen then...
             Command = Command And &B01111111       'toggle bit auf Null
             Select Case Command
                Case &H1D : Average_speed = 0       'stop bei home taste
                            Tccr1 = Tccr1 And &B11011111       'OC1A (PB1) output abschalten
                            Gtccr = Gtccr And &B11011111       'OC1B (PB4) output abschalten
                            Portb.1 = 0     'OC1A auf low (Motor abschalten)
                            Portb.4 = 0     'OC1B auf low (Motor abschalten)
                            Ocr1a = 0
                            Ocr1b = 0
                Case &H01 : Average_speed = 60       'verschiedene Fahrstufen
                Case &H02 : Average_speed = 70
                Case &H03 : Average_speed = 80
                Case &H04 : Average_speed = 100
                Case &H05 : Average_speed = 120
                Case &H06 : Average_speed = 140
                Case &H07 : Average_speed = 160
                Case &H08 : Average_speed = 180
                Case &H09 : Average_speed = 200
             End Select
             If Average_speed <> 0 Then     'FB Befehl zum Losfahren/Messen erkannt
                Incr Index
                Time_tick = &HFF00 + Average_speed       'Fahrstufe mit highbyte HFF versehen
                Sr_tick(index) = Time_tick  'Fahrstufe speichern
                Time_tick = 0
                Pcmsk.pcint3 = 0            'Disable weitere interrupts von FB TSOP an PB3
                Pcmsk.pcint0 = 1            'Enable Interrupts vom CNY70 an PB0
                Tccr1 = Tccr1 Or &B01100000 'set PWM1A & OC1A (PB1) -Motor an PWM Generator anschalten
                Gtccr = Gtccr Or &B01100000 'set PWM1B & OC1B (PB4) clear TCNT1 on OCR1C match, Motor an PWM-Gen.
                Enable Ovf1                 'Timer1 Overflow Int enable (8kHz für Timetick hochz.)
             End If
          End If
       Wend
    
       If Index = 101 Then                  'Teststrecke bewältigt - 100 Striche gezählt plus Fahrstufe gespeichert
          Disable Ovf1
          Average_speed = 0
          Tccr1 = Tccr1 And &B11011111      'OC1A (PB1) output abschalten
          Gtccr = Gtccr And &B11011111      'OC1B (PB4) output abschalten
          Portb.1 = 0                       'OC1A auf low (Motor abschalten)
          Portb.4 = 0                       'OC1B auf low (Motor abschalten)
          Ocr1a = 0
          Ocr1b = 0
          Pcmsk.pcint0 = 0
          Pcmsk.pcint3 = 1
          Time_tick = 0
          Toggle_bit = 0
          For Index = 1 To 101
             Ee_tick(index) = Sr_tick(index)       'sram array zum eeprom array übertragen
          Next Index
          Index = 0
       End If
    Loop
    
    Set_time_tick:                          'wird alle 125µs aufgerufen (8kHz PWM freq.)
       Incr Time_tick                       'Zeiteinheiten hochzählen
       Adcsra.6 = 1                         'ADC Messung für Liniensensoren starten, benötigt ca 208µs
                                            'damit wird eine Messung jeden zweiten ISR Aufruf gestartet
                                            'und somit die PWM zum Lenken mit 4kHz aktualisiert
    Return
    
    
    Adcmessung_to_pwm:                      'ISR f. ADC Auslesen und Setzen der PWM (Aufruf alle 250µs)
       Adc_low = Adch                       'nur 8 bit der Messung nutzen
       If Adc_low.7 = 1 Then                'negativer Wert vom ADC
             Adc_low = Not Adc_low          'umsetzen des 2er Komplements
             Adc_low = Adc_low + 1          'umsetzen des 2er Komplements
             Shift Adc_low , Right , 1      'Trimmen des Meßwertes/Abschneiden Meßschwankungen
             Ocr1a = Average_speed - Adc_low       'PWM Pulsweite setzen
             Ocr1b = Average_speed + Adc_low       'PWM Pulsweite setzen
          Else                              'Meßwert positiv - keine Umwandlung
             Shift Adc_low , Right , 1      'Trimmen
             Ocr1a = Average_speed + Adc_low       'PWM Pulsweite setzen
             Ocr1b = Average_speed - Adc_low       'PWM Pulsweite setzen
       End If
    Return
    
    Get_time_tick:                          'ISR Aufruf durch PCINT
       If Pcmsk.pcint0 = 1 Then             'Gilt nur, wenn CNY70 Interrupt verursacht
          If Toggle_bit = 0 Then            'Nur jeder zweite Interrupt zählt, da PCINT nicht nur bei
                                            'schwarzen Strichen sondern auch bei weißen auftritt
             Incr Index
             If Index = 102 Then Index = 101       'Arrayindexüberlauf verhindern
             Sr_tick(index) = Time_tick     'Zeiteinheit in den Zwischenspeicher
             If Index = 50 Then Average_speed = Average_speed + 40       'Während Fahrt speed erhöhen
          End If
          Toggle Toggle_bit
       End If
    Return
    Gruß
    Searcher
  18. Avatar von Searcher
    @radbruch: Ein etwas spätes Danke für die Erläuterung. Sieht so aus, als wenn die email Nachricht bei Kommentaren auf ältere oder nicht letzte Blogeinträge nicht geht. Hab mich in der letzten Zeit mit, im weiteren Sinne, Odometrie Messungen beschäftigt. Komme sicher nochmal auf Deine Untersuchungen bezüglich LED-Entladekurve zurück.

    Gruß
    Searcher
  19. Avatar von radbruch
    ... ich habe damals nicht wirklich verstanden, was Du da genau mißt.
    In Sperrrichtung geschaltet bilden LEDs eine kleine Kapazität die man aufladen kann. Abhängig von der Beleuchtungsstärke stellt sich zusätzlich ein Entladestrom ein. Die Entladungskurve ist deshalb proportional zur Beleuchtungsstärke und kann sogar mit einem digitalen Eingang erfasst werden.
  20. Avatar von Searcher
    @radbruch: Hallo, jetzt hab ich endlich mal in die Links von Dir geschaut. Die kamen mir sehr bekannt vor und ich habe damala, als ich sie gelesen hatte, nicht wirklich verstanden, was Du da genau mißt.

    Es gibt bei der differential conversion auch den unipolar mode. Den kann man verwenden, wenn die Polarität der angelegten Spannung bekannt ist. Mißt man da keine gegeneinander geschalteten LEDs, sondern nur eine LED, könnte die sogar genug Spannung liefern um ein brauchbares Meßergebnis mit 10Bit Auflösung zu bekommen. Dann hat man nicht die Last des 2er Komplements und liest den ADC "normal" aus.

    ADC_PIN1---->|------ADC_PIN2

    Gruß
    Searcher
Seite 1 von 2 12 LetzteLetzte