- 12V Akku mit 280 Ah bauen         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Pan & Tilt Videoschiene. Mein erstes Projekt. Wie fange ich an?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    26.12.2013
    Beiträge
    38

    Pan & Tilt Videoschiene. Mein erstes Projekt. Wie fange ich an?

    Anzeige

    Powerstation Test
    Moin,
    wie beginne ich am besten ein Programm?
    Ich habe viel vor. Wenn ich fertig bin, sollen es eigentlich 3 Programme werden, zwischen denen ich wählen kann.
    -> komplett Manuell
    -> komplett Automatisch
    -> nur ein Teil Automatisch
    Dann möchte ich div. Parameter über Potis regeln.
    -> Schritttempo der Schrittmotoren
    -> Wartezeit zwischen gewissen Aktionen
    Am liebsten noch mit Codierschalter, so dass ich z.B. vorgeben kann, der Motor soll 10x 20 Schritte machen,

    Ein ähnliches Projekt habe ich letzten Winter mit nur einem Motor gemacht, das ganze nur in TTL Technik, mit Transystoren und NE555 Timer. Das das ist zu groß, zu ungenau und schwer zu erweitern.

    Ist sowas überhaupt möglich?
    Wo könnte ich Programmschnipsel finden, die ich verwenden kann? Bin hier noch nicht wirklich fündig geworden

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo,

    Zuerst solltest du dir ein Pflichtenheft zurecht legen, also wie die Bedienung sein soll und wie das Teil reagieren muss.
    Zudem wie das ganze aufgebaut wird, damit man auch weiss wie viel und was für Ein/Ausgänge man benötigt.

    Dann brauchst du auch noch die passende Hardware, den Schrittmotor kannst du nicht direkt am µC anschliessen, da brauchst du noch Hardware dazu.
    Da stellt sich zunächst due Frage ob du die Hardware- und dann auch die Software-Treiber selbst erstellen willst oder etwas fertiges nehmen willst.

    Wenn du z.B. einen der Arduinos nimmst, hast du schon mal einen fertigen Computer. Dazu gibt's dann Shields, also zusätzliche Platinen, welche verschiedene Interfaces enthalten.

    Nun gibt's aber unterschiedliche Modelle bei den Arduinos und nicht alle Shields passen zu jedem Modell. Hinzu kommt noch, dass sich nicht alle Shields miteinander kombinieren lassen und auch nicht immer mehrere identische Shields gleichzeitig betrieben werden können.

    Du musst also zuerst die Hardware zusammenstellen, was du brauchst hast du im Pflichtenheft festgehalten.
    Zu den Shields gibt es dann auch passende Bibliotheken und dazu wiederum passende Code-Beispiele.

    Zusätzlich musst du dich noch für eine Programmiersprache entscheiden und diese evtl. erst mal erlernen.
    Dies beeinflusst allerdings wiederum die Auswahl der Shields, die Bibliotheken müssen auch für deine Programmiersprache vorhanden sein.

    Wenn du das alles zusammen hast, kannst du erst mit dem Programmieren anfangen.

    Laut Theorie gibt es zwei Techniken, wie man ein Programm erstellt:
    Top Down oder Bottom Up

    Bei Top Down fängt man mit der abstrahierten Programm-Logik an, z.B. der Bedienerführung und verfeinert dann die ganzen Prozeduren bis man direkt die Hardware ansteuert.
    Bei Bottom Up fängt man bei der Hardware an und fasst dann die einzelnen einfachen Funktionen zu komplexeren immer Aktionen zusammen.

    Praktisch wird aber meistens Middle Out oder Outside In angewendet.

    Bei Outside In schreibt man zuerst ein paar einfache Hardware-Funktionen und eine Bedienoberfläche um diese zu testen. Also z.B. die Funktion um den Schrittmotor einen Schritt nach rechts zu drehen und verknüpft diese mit einer Taste, welche bei jedem Tastendruck die Funktion einmal aufruft. Dann baust du das aus, dass z.B. bei jedem Tastendruck 20 Schritte gemacht werden. Als nächstes liest du dann die Schrittzahl von deinen Codierschalter ein.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    26.12.2013
    Beiträge
    38
    Danke für deinen tollen Bereicht/Anleitung.
    Ich hätte vielleicht erwähnen sollen, das ich schon Hardware habe.

    Roboternetz RNFRA-Board mit Mega32 Bausatz
    RN-Stepp297 Schrittmotoransteuerung

    Programieren wollte ich mit BASECOM, erst mal die gratis Variante, wenn alles klappen sollte, die Pro Version. 2Kb Code ist nicht so riesig viel.

    Dann werde ich mir jetzt erst mal eine grobe Übersicht aufschreiben, und die ganzen Ports ect von dem Board raus suchen.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    26.12.2013
    Beiträge
    38
    Irgendwie fehlt mir der Faden.
    Ich möchte nun mit dem ersten Schritt beginnen.
    Mir fehlen aber Programmschnipsel und Beispiele, wie ich das machen kann.

    Ich möchte auf dem Roboternetz RNFRA-Board mit Mega32 die beiden Schrittmotoren, Analog über einen Joystick "2 Achsen über 10kOhm Poti" in der Geschwindigkeit und Richtung steuern.
    Wenn ich jetzt davon ausgehe, das das Joypad in Mittelstellung ca. 2,5 Volt hat, möchte ich gern das als Nullpunkt haben.
    Nun rechne ich die Werte A/D um.

    Volt=Bit
    0=0
    0,5=113
    1,0=226
    1,5=339
    2,5=452
    3,0=565
    3,5=678
    4,0=791
    4,5=904
    5,0=1017

    Ich möchte also zwischen ca. Bit 340-560 Null Impulse auf den Schrittmotor
    Rechtslauf:
    Bit=Impulse/Sek
    1=1000
    2=998
    3=996
    ..
    339=1
    340-560= Stop
    Linkslauf
    561=1
    ....
    1023=1000

    Ich hoffe das ist verständlich. Wie kann ich das umsetzten?
    Ich habe jetzt schon über 10h das Forum hier durchsucht, aber nichts in der Art gefunden.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    16.03.2011
    Ort
    Dresden
    Alter
    37
    Beiträge
    1.937
    Da würde ich mit einer if-Verzweigung rangehen.
    Kannst sie ja mit elseif aufteilen, dann die Bereiche ADC-Wert<340, ADC-Wert>560 und alles andere (also der Bereich dazwischen)
    Die Umwandlung von ADC-Wert in Pulsfrequenz in eine Formel verpacken und in den Teilen, wo der Motor laufen soll, jeweils ein anderes Richtungs-Bit setzen. Die Formeln kannst dir selber aufstellen, wahrscheinlich soll die Frequenz von 1 linear ansteigen, je weiter der ADC-Wert vom Mittelbereich abweicht. Also wirds dann irgendwas sein in der Form Pulsfrequenz=1018-3*ADC_Wert (würde in diesem Fall an den beiden Enden die Frequenzen 1018 und 1 ergeben). Im anderen Bereich dann sowas wie Pulsfrequenz=1018-3*(1023-ADC-Wert) oder so. Wie gesgt, ist eher als Skizze zu verstehen und müsste noch überprüft werden. Wär wahrscheinlich sinnvoll, den mittleren Bereich symmetrisch zu machen, so wie es jetzt ist hast du auf einer seite 23 Werte mehr als auf der anderen (so ein ADC-Wert kann Werte bis 1023 annehmen, eben volle 10 Bit). Um die Formeln in Bascom zu realisieren musst du wahrscheinlich ein paar Hilfsvariablen einführen, da du immer nur eine Rechenoperation pro Zeile ausführen kannst. Würde dann so aussehen:
    Code:
    Dim ADC_Wert as Integer
    Dim Pulsfrequenz as Integer
    Dim Temp as Integer
    
    Temp = 3*ADC_Wert
    Pulsfrequenz = 1018-Temp
    Ist jetzt auch nur ein Codeschnipsel als Beispiel, hoffe es hilft dir.
    AI - Artificial Idiocy

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    26.12.2013
    Beiträge
    38
    Danke. Ja den Grundgedanken habe ich verstanden, die Werte die ich erhalten mit if und elseif .. zu filtern.
    Mir fehlt gerade der komplette Einstieg in das Ganze.
    Wie frage ich die Eingänge ab? Ich nutze die Eingänge 1/2 und sind nach Standard 7E/7F gejumpert.
    Ich sollte vielleicht erst mal anfangen, einfach nur einen Taster zu nehmen, der bei "1" den Motor mit Takt xy laufen lässt und mit "0" wieder stoppt.
    Mir fehlen irgendwie Quellcodes die ich zum verstehen und begreifen an das RNFRA-Board anwenden kann.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    16.03.2011
    Ort
    Dresden
    Alter
    37
    Beiträge
    1.937
    Mit dem Board kenn ich mich leider auch nicht aus, aber mit ATmega32 und Bascom hab ich schon ein bisschen was gemacht. Eingänge abfragen geht eigentlich recht einfach:
    Erstmal den entsprechenden Pin als Eingang definieren mit beispielsweise
    Config PinA.0=Input
    und zum Abfragen einfach den Bezeichner wie eine Variable verwenden.
    Die digitalen Eingänge können dabei aber eben nur 0 oder 1 annehmen.
    Zum Abfragen eines Tasters wäre zB. so ein Konstrukt möglich:
    Code:
    if PinA.0=0 then
       <Anweisungen für gedrückten Taster>
    else
       <Anweisungen für Loslassen des Tasters>
    end if
    Wobei da die jeweilige Aktion immer auslöst, wenn die Hauptschleife ausgeführt wird. Besser ist es da, noch eine Variable für den Tasterstatus zu definieren, zB. so:

    Code:
    Dim status as boolean
    status=0      '0=nicht gedrückt, 1=gedrückt
    
    if PinA.0=0 and status=0 then
       <Anweisungen für gedrückten Taster>
       status=1
    elseif PinA.0=1 and status=1 then
       <Anweisungen für Loslassen des Tasters>
       status=0
    end if
    Somit geht das Ganze beim Drücken nur einmal in den oberen Teil und beim Loslassen einmal in den unteren Teil. In den Malen dazwischen geht das Programm zwar auch in die Verzweigung, allerdings sind dann beide Bedingungen nicht erfüllt, wodurch dann eben gar nix passiert. Das Else kann in dem Fall einfach weggelassen werden. Sowas ist dann wichtig, wenn bei einem Tastendruck eine Variable nur einmal hochgezählt werden soll und nicht konstant hochzählt solange man drückt (da kann in wenigen ms schon einiges zusammenkommen). Braucht man häufiger mal sowas. Oder einfach, um einen Ausgang umzuschalten. Würde man das nicht so machen, würde der Ausgang dauernd umschalten und welchen Zustand der Ausgang beim Loslassen dann hat ist eher zufällig.

    Ansonsten würde ich mich an deiner Stelle mal ein bisschen nach Grundkursen für Bascom umsehen. Ist an sich kein großes Hexenwerk, wenn man erstmal ein bisschen drin ist. Ich kann das hier empfehlen:
    http://halvar.at/elektronik/kleiner_bascom_avr_kurs/
    AI - Artificial Idiocy

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    26.12.2013
    Beiträge
    38

    Unglücklich

    Nun wollte ich gerade ein Testprogramm übertragen und bekomme immer die Fehlermeldung:
    Detected Micro ATMEGA32 does not match the selected Micro AT90CAN32

    Was habe ich denn jetzt schon wieder kaputt gemacht. ?

    EDIT: Sorry, habs gefunden, habe den Falschen Chip ausgewählt.

    - - - Aktualisiert - - -

    Ok, danke schön. Dann werde ich mal damit die Nacht verbringen.
    Vielleicht habe ich ja morgen schon, mein erstes Programm. ( Motor An / Motor Aus)

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    26.12.2013
    Beiträge
    38
    So, nun bin ich ne ecke schlauer geworden.
    Habe über den Joystick die Richtung des Schrittmotors ändern können und einen 2 Stufen Filter gebaut.

    Joystick in Mittelstellung: Stop
    Stufe 1 vorwärts : linkslauf
    Stufe 2 vorwärts: Stop
    Stufe 1 rückwärts: rechtslauf
    Stufe 2 rückwärts: Stop

    Das Funktioniert auch soweit, jetzt weis ich nur nicht, wie ich da noch einen Tacktgeber/Timer rein bekomme.
    Der Timer ist schon drinn, aber kann ich den Timer verändern mit meinem ADC oder muss ich mehrer Timer nehmen?


    Code:
    '###################################################
    'Testprogramm
    'für
    'RoboterNetz Standard-Roboter Board RBNFRA 1.2
    '
    'Aufgabe:
    '###################################################
    Const Writepowerport_adr = &H72                             'I2C Adr PCF 2
    Const Readpowerport_adr = &H73                              'I2C Adr PCF 2
    Const Writeeingabeport_adr = &H7E
    Const Readeingabeport_adr = &H7F
    Dim I2cdaten As Byte                                        'Datenbyte aus PCF8574
    Dim I As Word
    $crystal = 8000000                                          'Quarzfrequenz
    Config Scl = Portc.0                                        'Ports fuer IIC-Bus
    Config Sda = Portc.1
    I2cinit
    I2cstart
    I2cwbyte &H74                                               'Schreibbefehl an PCF3 schicken
    I2cwbyte &B00000010                                         'Datenbyte an PCF3
    I2cstop
    '*********
    Config Pind.6 = Output                                      'Schrittmotoren Ein/Aus
    Config Pinc.5 = Output                                      'Schrittmotor Links Richtung
    Config Pinc.3 = Output                                      'Schrittmotor Links Step
    Config Pinc.4 = Output                                      'Schrittmotor Rechts Richtung
    Config Pinc.2 = Output                                      'Schrittmotor Rechts Step
    
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    'Config Adc.1 = Single , Prescaler = Auto , Reference = Internal
    Start Adc
    Dim W1 As Word , Channel As Byte
    
    'Ocr1a = 10000
    'Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Disconnect
    'On Oc1a Timer1serv
    'Enable Oc1a
    'Enable Interrupts
    Do
    
    '############ Linker Schrittmotor
    
    W1 = Getadc(2)
      Print "Channel 0 " ; " value " ; W1
      'Incr Channel
    
       If W1 = 0 Then
         Portd.6 = 1                                            'Schritmotor Ein
       End If
        If W1 => 1 Then
         Portd.6 = 0                                            'Schrittmotor aus
    
       End If
    
    
    
       W1 = Getadc(1)
      Print "Channel 0 " ; " value " ; W1
      'Incr Channel
       If W1 =< 1 Or W1 => 100 Then                             'schnell
         Portc.5 = 0                                            'Rechtslauf
         Portc.3 = 0
    
       End If
       If W1 =< 101 Or W1 => 480 Then                           'langsam
         Portc.5 = 0                                            'Rechtslauf
         Portc.3 = 1
    
       End If
    
    
      If W1 => 481 Or W1 =< 539 Then                            'Stop
         Portc.3 = 0
         Else
         End If
    
    
       If W1 =< 540 Or W1 => 950 Then                           'langsam
         Portc.5 = 1                                            'linkslauf
         Portc.3 = 1
    
    
        End If
      If W1 =< 951 Or W1 => 1022 Then                           'schnell
         Portc.5 = 1                                            'linkslauf
         Portc.3 = 0
    
       End If
    
     Loop
    End
    'Timer1serv:
    'Statt Eine Led Zum Blinken Zu Bringen Kann Hier
    'Regelmässig Etwas Wichtiges Getan Werden
    'Toggle Portc.3
    
    
    
       'Return

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    16.03.2011
    Ort
    Dresden
    Alter
    37
    Beiträge
    1.937
    Hmm, wie lässt du denn jetzt die Schrittsignale generieren? Normalerweise würde man da einen Timer nehmen und dem dann mittels einer Variablen die Zeit vorgeben, bis er wieder ausgelöst wird. Variable wird kleiner -> Timer löst häufiger aus, Variable wird größer -> Timer löst weniger häufig aus. In der ISR dann nur den Step-Ausgang kurz an- und wieder ausschalten. So kannst du dann die Geschwindigkeit des Steppers steuern.
    Hier mal, wie es in einem meiner Codes steht:
    Code:
    Isr1:
       Load Timer1 , Zeit
       Porta.1 = 1
       Porta.3 = 1
       Porta.5 = 1
       Waitus 10
       Porta.1 = 0
       Porta.3 = 0
       Porta.5 = 0
    Return
    Wobei bei mir drei Schrittmotoren gleich angesteuert werden, die Step-Ausgänge befinden sich auf Porta.1, Porta.3 und Porta.5. Zeit hab ich bei mir einfach die Variable genannt, die für die ISR zuständig ist. Durch Load wird das gleich so verrechnet, dass die ISR erst in Zeit*Prescale Taktzyklen ausgelöst wird. Wenn beide Motoren unterschiedlich eingestellt werden sollen, wirst du wohl zwei Timer brauchen. Lies dir am besten mal den Abschnitt zu Timern im Tutorial durch, das wird da alles gut erklärt.

    Ansonsten sehen deine If-Verzweigungen noch ein wenig wirr aus. Mach am besten mal die Einrückungen ordentlich, der Übersicht zuliebe. Und wenn hinter dem else nix steht, kannst du es auch weglassen. Und elseif verwenden, das ist günstiger als zwei ähnliche ifs hintereinander.
    Der erste Teil in der Hauptschleife lässt sich beispielsweise so zusammenfassen:
    Code:
    if W1=0 then
       Portd.6 = 1
    else
       Portd.6 = 0
    end if
    Wenn du eine Variable mehrfach abfragst, kannst du auch eine Case-Struktur verwenden, macht sich besser als zig ifs hintereinander.
    AI - Artificial Idiocy

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Pan Tilt Head
    Von SmokeT im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 8
    Letzter Beitrag: 23.05.2014, 23:30
  2. Verkaufe Pan & Tilt - Kopf mit Servos
    Von kellerkind im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 1
    Letzter Beitrag: 14.11.2013, 19:04
  3. Verkaufe Räumung:US-Sensor, IR-Sensor,Displays,MTreiber,Servorboard, Pan&Tilt Köpfe
    Von kellerkind im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 3
    Letzter Beitrag: 18.06.2012, 18:42
  4. Projekt - wie fange ich am besten an :)
    Von Tobias Vonau im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 8
    Letzter Beitrag: 05.03.2012, 18:55
  5. Wie erstelle ich mein erstes Programm?
    Von Fabian1992 im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 08.03.2009, 16:35

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress