- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 22

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    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.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    15.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

  3. #3
    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)

  4. #4
    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

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    15.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

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    26.12.2013
    Beiträge
    38
    Also erst mal muss ich einen ganz großen Danke aussprechen, das du dir die Zeit nimmst für mich.

    Dann zu dem Takt. Ich weis auch nicht, wo er aktuell her kommt, ich denke durch die Schleife, die immer wieder abgearbeitet wird. Aktuell dreht sich der Motor mit ca. 30-40Hz.
    Zum testen für die Richtung und die Stufen, war das ok, aber das muss noch irgendwie weg.

    Mehr Probleme habe ich mit den Timern und die Einbindung in die Schaltung.
    Gehen wir erst mal von einem Motor mit 2 Richtungen und 2 Geschwindigkeiten aus.

    Das mit der Richtung läuft ja schon ganz gut. Nun kommt aber die Geschwindigkeit.
    Wie kann ich:
    A. Sagen, das der Timer seine Geschwindigkeit/Takt ändern soll?
    oder
    B. einen bzw dann 2 Timer in die Schaltung mit z.B. einer AND Anweisung einbinden.
    Code:
    If W1 =< 1 Or W1 => 100 AND Timer1 = 1  Then
    Portc.3 = 1
    Darüber habe ich nichts gefunden.

    Aus der SPS Programierung kenne ich noch die Merker. Damit konnte man schön solche zusammenhänge realisieren.


    Zur Struktur. Sorry, ich Kopiere/Schiebe/Lösche/Klammer,.. so viel rum. Da fällt das echt schwer. Aber ich werde mir mühe geben, das ordentlicher zu halten.


    Nachtrag. Ich glaube ich habe da was gefunden. Das gucke ich mir morgen mal in Ruhe an.

    Code:
    
    $regfile = "m8def.dat"
    $framesize = 24
    $swstack = 32
    $hwstack = 32
    $crystal = 1000000
    
    
    
    Config Pinb.1 = Output
    
    Dim Timer1reload As Word
    Timer1reload = 1
    Config Timer1 = Timer , Prescale = 64
    Timer1 = Timer1reload
    Enable Timer1
    On Timer1 Timer1_isr
    Enable Interrupts
    
    
    &#39;TimerRelaod Werte mit "AVR Timer.exe" berechnet
    
    Const Akku_leer = 63193 ****** ca. 0,3 Sekunden
    Const Akku_halb_voll = 60849 &#39;ca. 0,6 Sekunden
    Const Akku_voll = 49911 ****** ca. 1 Sek
    
    Dim Adc_wert As Word
    
    Do
    
    ADC_wert = Getadc(3) ****** Beispiel
    
    Select Case ADC_wert
    
    Case 800 to 1024
    Timer1reload = Akku_voll
    
    Case 700 to 799
    Timer1reload = Akku_halb_voll
    
    Case 0 to 699
    Timer1reload = Akku_leer
    
    End select
    
    Loop
    
    End
    
    Timer1_isr:
    Timer1 = Timer1reload
    Toggle Pinb.1 ****** PIN anpassen
    Return
    Geändert von AtomicIX (31.10.2014 um 00:35 Uhr)

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    15.03.2011
    Ort
    Dresden
    Alter
    37
    Beiträge
    1.937
    Nein, so funktioniert das nicht, du fragst den Timer nicht ab, sondern der Timer selber löst eine kleine Unterfunktion (ISR, Interrupt Service Routine) aus, in der du dann deine Pins umschalten kannst. Du musst dir das so vorstellen, dass du einmal deine Hauptschleife hast, in der allgemeine Sachen drin stehen und die sich immer wiederholt, wenn sie abgearbeitet wurde -> Abarbeitungszeit ist nicht konsistent, da durch abweichende Abläufe die Zeit verändert werden kann (zB. in einer If-Verzweigung wird nur ein Pin abgefragt und im Else-Zweig kommen eine komplexe berechnung und Ausgabe auf einem Display -> dauert viel länger). Die Timer sind nun so, dass man ihnen eine Zahl vorgeben kann, welche die Anzahl an Taktzyklen ist, die der Timer zählt, bis er sich wieder zurücksetzt und die ISR auslöst. Dadurch wird das, was in der ISR ist, in einem festen Intervall ausgeführt. In der ISR lässt sich dann der der Zählwert wiederrum verändern, wodurch man auch Einfluss auf das Intervall hat. Die ISR an sich sollte eher kurz gehalten werden, alles, was länger braucht, gehört in die Hauptschleife. So bekommt man mit den Timern eine ziemlich gute zeitliche Kontrolle und kann so recht präzise zeitliche Abläufe koordinieren. Und guck dir wirklich mal den Artikel im Tutoril zu den Timern an, anscheinend hast du das nicht gemacht, sonst wär dir das mittlerweile klar.
    AI - Artificial Idiocy

Ä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, 22:30
  2. Verkaufe Pan & Tilt - Kopf mit Servos
    Von kellerkind im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 1
    Letzter Beitrag: 14.11.2013, 18: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, 17: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, 17:55
  5. Wie erstelle ich mein erstes Programm?
    Von Fabian1992 im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 08.03.2009, 15:35

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress