RoboterNetz.de Foren-Übersicht Werbung
 Home  •  Forum  •  Suchen •  Mitgliederliste  •  RN-Landkarte  •  Ränge  •  Statistik  •  Download •  Album  •  Links  •  Kalender  •  Letzte Themen
 RN-Wissen Artikelbereich  •  Mitarbeiter  •  Benutzergruppen  •  Chat  •  Registrieren  •  FAQ  •  Profil  •  log in, Nachrichten zu lesen  •  Login
Kalender 
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Neues Thema eröffnenNeue Antwort erstellen
Vorheriges Thema anzeigen Dieses Thema einem Freund schickenZeige Benutzer, die dieses Thema gesehen habenDieses Thema als Textdatei speichernPrintable versionlog in, Nachrichten zu lesen Nächstes Thema anzeigen
Autor Nachricht
Bensch

Öfters hier
Öfters hier




Anmeldungsdatum: 02.02.2009
Beiträge: 29

Beitrag Verfasst am: 08.02.2009, 00:45 Antworten mit ZitatNach oben

Das Umrechnen Servowinkel -> Impulslänge ist eine einfache lineare Zuordnung. Wenn du mir eine Formel für die Servowinkel lieferst, mach ich dir den Rest Very Happy
Nein mal im Ernst: Ich finde, dass bei dieser Bauart gerade die Ansteuerung der Witz an der Sache ist. Ohne diese ist es nur eine mechanische Spielerei, man kann sich an der immerwährenden Parallelität der bewegten Plattform freuen, aber wirklich nützlich ist das so nicht. Man kann nicht einmal eine lineare Bewegung der Plattform erzeugen. Ich würde deshalb wirklich gerne eine elegante Ansteuerung, verzeihung: Rückwärtskinematik für den Delta entwickeln.
Offline Benutzer-Profile anzeigen
MeckPommER

Roboter Genie
Roboter Genie




Anmeldungsdatum: 19.07.2007
Beiträge: 1124

Alter: 45

germany.gif
Beitrag Verfasst am: 08.02.2009, 02:20 Antworten mit ZitatNach oben

radbruch hat folgendes geschrieben::
... Damit wären sicher auch sehr feinfühlige Bewegungen möglich (plotten/schreiben?), mit Servos kann mal eigentlich nur Positionen anfahren ohne dabei die Wege genau festzulegen...


Nun ja, du hast eine Position, die du anfahren willst, schickst diese an die Servos und ScHwUpS nimmt der Arm die Position ein. Die Kunst besteht meiner Meinung nach darin, eben diese Position "oft und flüssig" an die Steuerung weiterzugeben.

Wenn ich zwei entfernte Punkte ansteuern will und diese ohne errechnete Zwischenpunkte anfahre, dann ergeben sich mit Sicherheit unschöne Bewegungen.

Wenn ich aber eine steuerungstechnische Zwischenstufe einfüge, die mir aus meinen Ansteuerungspunkten zunächst eine Reihe von Zwischenpunkte errechnet, die ich so schnell als möglich anfahre, dann habe ich auch geschmeidige Bewegungen ohne Gezappel Smile

Eben diese Zwischenstufe muss realisieren können, wie schnell die Mechanik ist. Je weiter der Weg ist, desto höher muss sie diese Bahn auflösen können.

Gruß MeckPommER

_________________
Mein Hexapod im Detail auf www.vreal.de
Offline Benutzer-Profile anzeigen Website dieses Benutzers besuchen
radbruch






Anmeldungsdatum: 27.12.2006
Beiträge: 3330
Wohnort: Stuttgart
Alter: 47

blank.gif
Beitrag Verfasst am: 08.02.2009, 21:41 Antworten mit ZitatNach oben

Hallo

Mit lausig geteachten Positionen (zwei Stunden Arbeit, ich muss mir wohl ein kleines Tool schreiben) sieht das Ergebniss recht nett aus:

Image
http://www.youtube.com/watch?v=QeY_KkZRlDc

Ehrlich, das Demo lief minutenlang ohne Probleme. Aber für das Filmchen musste ich ja unbedingt noch die Akkus laden. Naja, der Kater hat seinen Spass dabei.

Dass die Wiederholgenauigkeit der Billigservos ziemlich schlecht ist wußte ich schon seit den Dominosteinen. Ohne eine getrennte Wegmessung direkt an den Armen wird das wohl nichts werden.

"Hat schonmal jemand versucht einen Delta Robot selber zu bauen?" Ja, habe ich und das macht Spaß! *lol*

Gruß

mic

_________________
Image
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Offline Benutzer-Profile anzeigen
Bensch

Öfters hier
Öfters hier




Anmeldungsdatum: 02.02.2009
Beiträge: 29

Beitrag Verfasst am: 09.02.2009, 01:21 Antworten mit ZitatNach oben

find ich super. wie hast du die Positionen geteacht? du hast doch gar keine Sensorik?!
Ich code Grad eine Ansteuerung, hier mein Stand der Dinge:
Leider fehlt noch alles, was kompliziert ist Silenced Silenced Silenced


'
' Alle Berechnungen gehen von Folgendem aus:
' Der Bot ist an einer Ebene befestigt, die parallel zur xy-Ebene liegt
' Der Arm 1 liegt in y-Richtung.
' Der Arm 2 liegt, von oben gesehen, 120° links gedreht (Negative y- und x-Richtung).
' Der Arm 3 liegt, von oben gesehen, 120° rechts gedreht (Negative y-, positive x-Richtung).
' Alle Werte für Längen, Abstände und Positionen werden in Nanometern (nm) angegeben!
'


Declare Function Tastenabfrage() As Byte
Declare Sub Eins()
Declare Sub Zwei()
Declare Sub Drei()
Declare Sub Vier()
Declare Sub Fuenf()


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000                                         'Quarzfrequenz
$baud = 9600

Config Adc = Single , Prescaler = Auto                      'Für Tastenabfrage und Spannungsmessung
Config Pina.7 = Input                                       'Für Tastenabfrage
Porta.7 = 1                                                 'Pullup Widerstand ein

Dim Taste As Byte

' Deklaration der Variablen, die die Proportionen des Roboters beschreiben
' Alle Angaben in nm und als "Long" (32bit genauigkeit)
' Zulässig sind Werte zwischen -2147483648 und +2147483647

Print
Print "= = = = Delta-Steuerung = = = ="
Print
Print "Lade Konstruktionsparameter..."

' Fixer Befestigungspunkt B im Raum
Dim B_x As Long
Dim B_y As Long
Dim B_z As Long
                           B_x = 0
                           B_y = 0
                           B_z = 0


' Länge des Servoseitigen Armteils ("Oberer Armteil" -> Oa)
Dim Oa As Long
                           Oa = 100000000                   '=10cm


' Länge des Servofernen Armteils ("Unterer Armteil" -> Ua)
Dim Ua As Long
                           Ua = 200000000                   '=20cm


' Abstand der Armservoachsen vom Befestigungspunkt B auf der xy-Ebene
Dim Abst_b_aa_xy As Long
                           Abst_b_aa_xy = 70000000          '=7cm


' Abstand der Armservoachsenvom von der xy-Ebene
Dim Abst_b_aa_z As Long
                           Abst_b_aa_z = 30000000           '=3cm


' Abstand der Armenden vom Tool auf der xy-Ebene
Dim Abst_t_ae_xy As Long
                           Abst_t_ae_xy = 40000000          '=4cm

' Abstand der Armenden von der xy-Ebene
Dim Abst_t_ae_z As Long
                           Abst_t_ae_z = 10000000           '=1cm

Print "Konstruktionsparameter geladen"
Print
Print "Montagepunkt = (" ; B_x ; "," ; B_y ; "," ; B_z ; ")"
Print "Armanfangs-Versatz:"
Print Abst_b_aa_xy ; "nm vom Montagepunkt in xy-Ebene"
Print "und " ; Abst_b_aa_z ; "nm in z-Richtung"
Print "Armende-Versatz:"
Print Abst_t_ae_xy ; "nm vom Toolpunkt in xy-Ebene"
Print "und " ; Abst_t_ae_z ; "nm in z-Richtung"
Print
Print "Berechne Konstruktionsabhaengige Fixwerte"

' Arm-Anfangspunkte:
' Arm1: (Der von oben gesehen hintere Arm, genau in y-Richtung)
Dim A1a_x As Long
Dim A1a_y As Long
Dim A1a_z As Long
A1a_x = B_x
A1a_y = B_y + Abst_b_aa_xy
A1a_z = B_z - Abst_b_aa_z

'Arm2: (Der von oben gesehen linke Arm)
Dim A2a_x As Long
Dim A2a_y As Long
Dim A2a_z As Long
Dim Hilf1 As Single                                         'Hilfsvariable für Zwischenergebnisse
Dim Hilf2 As Long
Dim Hilf3 As Long
Hilf1 = 0.866025403784435                                   '=Cos(30°)
Hilf2 = Hilf1 * Abst_b_aa_xy
A2a_x = B_x - Hilf2
Hilf3 = Abst_b_aa_xy / 2                                    '=Sin(30°)*Abst_b_aa_xy = Abst_b_aa_xy / 2
A2a_y = B_y - Hilf3
A2a_z = B_z - Abst_b_aa_z

'Arm3: (Der von oben gesehen rechte Arm)
Dim A3a_x As Long
Dim A3a_y As Long
Dim A3a_z As Long
A3a_x = B_x + Hilf2
A3a_y = B_y - Hilf3
A3a_z = B_z - Abst_b_aa_z

Print "Fixwert-Berechnung abgeschlossen."
Print "Arm1-Anfang = ( " ; A1a_x ; " , " ; A1a_y ; " , " ; A1a_z ; " )"
Print "Arm2-Anfang = ( " ; A2a_x ; " , " ; A2a_y ; " , " ; A2a_z ; " )"
Print "Arm3-Anfang = ( " ; A3a_x ; " , " ; A3a_y ; " , " ; A3a_z ; " )"

Do
   Taste = Tastenabfrage()
   If Taste <> 0 Then

      Select Case Taste
         Case 1
            Call Eins
         Case 2
            Call Zwei
         Case 3
            Call Drei
         Case 4
            Call Vier
         Case 5
            Call Fuenf
      End Select
   End If
   Waitms 1000
Loop

End

Sub Eins()
Print "Sub 1"
End Sub


Sub Zwei()
Print "Sub 2"
End Sub


Sub Drei()
Print "Sub 3"
End Sub


Sub Vier()
Print "Sub 4"
End Sub


Sub Fuenf()
Print "Sub 5"
End Sub


'Diese Unterfunktion fragt die Tastatur am analogen Port ab
Function Tastenabfrage() As Byte
Local Ws As Word

   Tastenabfrage = 0
   Start Adc
   Ws = Getadc(7)
  ' Print "Tastenabfrage anpassen!ADC Wert ws=" ; Ws
   If Ws < 500 Then
      Select Case Ws
         Case 400 To 450
            Tastenabfrage = 1
         Case 330 To 380
            Tastenabfrage = 2
         Case 260 To 305
            Tastenabfrage = 3
         Case 180 To 220
            Tastenabfrage = 4
         Case 90 To 130
            Tastenabfrage = 5
      End Select
   End If
End Function
Offline Benutzer-Profile anzeigen
radbruch






Anmeldungsdatum: 27.12.2006
Beiträge: 3330
Wohnort: Stuttgart
Alter: 47

blank.gif
Beitrag Verfasst am: 09.02.2009, 01:43 Antworten mit ZitatNach oben

Zitat:
wie hast du die Positionen geteacht?

teachen=solange an den Servopositionen fummeln bis es halbwegs passt.

In C sieht das bei mir dann so aus:
// Deltaarm ansteuern mit dem RP6                                  3.2.09  mic

#include "rblib.h"
#include "rblib.c"

volatile uint16_t p=0;
uint8_t  xpos=120, ypos=120, zpos=120, demo;
uint16_t speed;

void servo_init(void);
void pause(uint16_t p_10ms);
void moveto(uint8_t x, uint8_t y, uint8_t z, uint8_t pause_10ms);
void holen1(void);
void holen2(void);
void holen3(void);
void bringen1(void);
void bringen2(void);
void bringen3(void);
int main(void)
{
   rblib_init();
   servo_init();
   pause(100);
/*   for(demo=120; demo<190; demo++) moveto(demo,demo,demo,5);
   for(demo=189; demo>120; demo--) moveto(demo,demo,demo,4);
   for(demo=121; demo<190; demo++) moveto(demo,demo,demo,3);
   for(demo=189; demo>120; demo--) moveto(demo,demo,demo,2);
   for(demo=121; demo<190; demo++) moveto(demo,demo,demo,2);
   for(demo=189; demo>120; demo--) moveto(demo,demo,demo,1);
   moveto(190,190,190,50);
   moveto(120,120,120,50);
*/

   // heben und legen
   holen1(); bringen1();
   holen3(); bringen3();

   while(1)
   {
   // tauschen
      holen1(); bringen2();
      holen3(); bringen1();
      holen2(); moveto(90,160,90,40); bringen3();
   }
   return(0);
}
ISR(TIMER0_COMP_vect)
{
   static uint16_t count=0;
   if(count>xpos) PORTA &= ~16; else PORTA |= 16;   // E_INT1 (Pin8)
   if(count>ypos) PORTC &= ~1;  else PORTC |= 1;   // SCL (Pin10)
   if(count>zpos) PORTC &= ~2;  else PORTC |= 2;   // SDA (Pin12)
   if(count<1000)count++; else { count=0; if(p) p--; }
}
void servo_init(void)
{
   DDRA |= 16;            // E_INT1 als Ausgang
   DDRC |= 3;            // SCL und SDA als Ausgang

   TCCR0 =  (0 << WGM00) | (1 << WGM01);               // CTC-Mode
   TCCR0 |= (0 << COM00) | (0 << COM01);               // ohne OCR-Pin
   TCCR0 |=   (0 << CS02)  | (1 << CS01) | (0 << CS00);   // prescaler /8
   TIMSK =  (1 << OCIE0);                               // Interrupt ein
   OCR0  = 10; // 100kHz?
}
void pause(uint16_t p_10ms)
{
   p=p_10ms;
   while(p);
}
void moveto(uint8_t x, uint8_t y, uint8_t z, uint8_t p_10ms)
{
   xpos=x;
   ypos=y;
   zpos=z;
   p=p_10ms;
   while(p);
}
void holen1(void)
{
      moveto(99,104,91,50);
      moveto(80,90,73,20);
      moveto(99,104,91,30);
}
void holen2(void)
{
      moveto(60,111,83,50);
      moveto(50,95,65,20);
      moveto(60,111,83,30);
}
void holen3(void)
{
      moveto(84,110,52,50);
      moveto(69,95,47,20);
      moveto(84,110,52,30);
}
void bringen1(void)
{
      moveto(99,104,91,50);
      pause(200);
}
void bringen2(void)
{
      moveto(60,111,83,50);
      pause(200);
}
void bringen3(void)
{
      moveto(81,107,50,50);
      pause(200);
}
*GG*

_________________
Image
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Offline Benutzer-Profile anzeigen
Bensch

Öfters hier
Öfters hier




Anmeldungsdatum: 02.02.2009
Beiträge: 29

Beitrag Verfasst am: 09.02.2009, 02:21 Antworten mit ZitatNach oben

fein fein,
ich bin zwar nicht der Knaller in C, aber ich glaube ich versteh's.

Wirst du eine Rückwärtskinematik umsetzen?
Offline Benutzer-Profile anzeigen
MeckPommER

Roboter Genie
Roboter Genie




Anmeldungsdatum: 19.07.2007
Beiträge: 1124

Alter: 45

germany.gif
Beitrag Verfasst am: 09.02.2009, 06:21 Antworten mit ZitatNach oben

ich
ich bin
ich bin schwer
ich bin schwer beeindruckt

bravo, radbruch Freudig

_________________
Mein Hexapod im Detail auf www.vreal.de
Offline Benutzer-Profile anzeigen Website dieses Benutzers besuchen
vohopri

Roboter Genie
Roboter Genie




Anmeldungsdatum: 11.09.2004
Beiträge: 1395
Wohnort: südlich der Alpen

blank.gif
Beitrag Verfasst am: 09.02.2009, 13:11 Antworten mit ZitatNach oben

Hallo mic,

sehr schönes und interessantes Projekt. Mich würd noch interessieren, wie du den Saugnapf für die Kugeln ansteuerst.

grüsse,
Hannes

_________________
Autonome Fahrzeuge:
http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=36497 Land
http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=49258 Wasser
Offline Benutzer-Profile anzeigen Website dieses Benutzers besuchen
radbruch






Anmeldungsdatum: 27.12.2006
Beiträge: 3330
Wohnort: Stuttgart
Alter: 47

blank.gif
Beitrag Verfasst am: 09.02.2009, 13:53 Antworten mit ZitatNach oben

Es ist ein passiver Saugnapf (ein Werbeschlüsselanhänger von einem Lufthandlingfritzen) Deshalb auch die Wartezeit beim Bringen: Der Ball fällt einfach von alleine ab ;)

_________________
Image
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Offline Benutzer-Profile anzeigen
vohopri

Roboter Genie
Roboter Genie




Anmeldungsdatum: 11.09.2004
Beiträge: 1395
Wohnort: südlich der Alpen

blank.gif
Beitrag Verfasst am: 09.02.2009, 13:59 Antworten mit ZitatNach oben

Danke für die Info, es sah mir danach aus, war aber nicht sicher, ob das tatsächlich so geht.

grüsse, Hannes

_________________
Autonome Fahrzeuge:
http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=36497 Land
http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=49258 Wasser
Offline Benutzer-Profile anzeigen Website dieses Benutzers besuchen
Bensch

Öfters hier
Öfters hier




Anmeldungsdatum: 02.02.2009
Beiträge: 29

Beitrag Verfasst am: 09.02.2009, 14:58 Antworten mit ZitatNach oben

So ein Mist.
Meinem Programmierwahn wurde ein jäher Einhalt geboten:
DEMO/BETA only supports 4096 bytes of code

Wo bekomm ich günstig eine BASCOM-Vollversion her? Möglichst natürlich mit Studenten-Rabatt....

Grüße,
Benjamin
Offline Benutzer-Profile anzeigen
Bajuvar

Öfters hier
Öfters hier




Anmeldungsdatum: 19.11.2008
Beiträge: 26

Alter: 32

germany.gif
Beitrag Verfasst am: 09.02.2009, 18:21 Antworten mit ZitatNach oben

Bensch hat folgendes geschrieben::
So ein Mist.
Meinem Programmierwahn wurde ein jäher Einhalt geboten:
DEMO/BETA only supports 4096 bytes of code

Wo bekomm ich günstig eine BASCOM-Vollversion her? Möglichst natürlich mit Studenten-Rabatt....

Grüße,
Benjamin


Elektor hätte momentan das Angebot noch: 69 statt 89 €uro

www.elektor.de/products/offers/software/bascom-avr.759187.lynkx

Gruß Bajuvar

_________________
Bitte habt Geduld mit mir, mit zunehmendem Alter lernt es sich schwerer Brick wall
Offline Benutzer-Profile anzeigen
Bensch

Öfters hier
Öfters hier




Anmeldungsdatum: 02.02.2009
Beiträge: 29

Beitrag Verfasst am: 10.02.2009, 00:24 Antworten mit ZitatNach oben

Bajuvar hat folgendes geschrieben::
Bensch hat folgendes geschrieben::
So ein Mist.
Meinem Programmierwahn wurde ein jäher Einhalt geboten:
DEMO/BETA only supports 4096 bytes of code

Wo bekomm ich günstig eine BASCOM-Vollversion her? Möglichst natürlich mit Studenten-Rabatt....

Grüße,
Benjamin


Elektor hätte momentan das Angebot noch: 69 statt 89 €uro

www.elektor.de/products/offers/software/bascom-avr.759187.lynkx

Gruß Bajuvar


Ist bestellt, vielen Dank für den Tipp!

Auch wenn ich mit der Demo noch nicht kompilieren kann, mach ich trotzdem am Code weiter. Ich bin jetzt soweit, dass die Endpunkte der Arme im Raum zu einer beliebigen Tool-Position T berechnet werden und anschließend geprüft wird, ob der Bot die Position erreichen kann. Wenn ja, wird ein Bit "Erreichbar" gesetzt.


'(
################################################################################
Name : Delta-Ansteuerung.bas
Zweck : Stellt Eine Rückwärtskinematik Für Einen 3 -armigen
                               "Delta" -roboter Zur Verfügung.
Mikroprozessor : : Atmega32 Auf Rn -control V1.4

 Alle Berechnungen Gehen Von Folgendem Aus:
 Der Bot Ist An Einer Ebene Befestigt , Die Parallel Zur Xy -ebene Liegt
 Der Arm 1 Liegt In Y -richtung.
 Der Arm 2 Liegt , Von Oben Gesehen , 120° Links Gedreht(negative Y - Und X -richtung).
 Der Arm 3 Liegt , Von Oben Gesehen , 120° Rechts Gedreht(negative Y - , Positive X -richtung).
 Alle Werte Für Längen , Abstände Und Positionen Werden In Nanometern(nm) Angegeben!
################################################################################
')
Declare Function Tastenabfrage() As Byte
Declare Sub Update_ae()
Declare Sub Change_t()
Declare Sub Nix()


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000                                         'Quarzfrequenz
$baud = 9600

Config Adc = Single , Prescaler = Auto                      'Für Tastenabfrage und Spannungsmessung
Config Pina.7 = Input                                       'Für Tastenabfrage
Porta.7 = 1                                                 'Pullup Widerstand ein

Dim Taste As Byte

' Deklaration der Variablen, die die Proportionen des Roboters beschreiben
' Alle Angaben in nm und als "Long" (32bit genauigkeit)
' Zulässig sind Werte zwischen -2147483648 und +2147483647

Print
Print "= = = = Delta-Steuerung = = = ="

' Fixer Befestigungspunkt B im Raum
Dim B_x As Long
Dim B_y As Long
Dim B_z As Long
                           B_x = 0
                           B_y = 0
                           B_z = 0


' Länge des Servoseitigen Armteils ("Oberer Armteil" -> Oa)
Dim Oa As Long
                           Oa = 100000000                   '=10cm


' Länge des Servofernen Armteils ("Unterer Armteil" -> Ua)
Dim Ua As Long
                           Ua = 200000000                   '=20cm


' Abstand des Armanfangs (aa) vom Befestigungspunkt B auf der Befestigungsebene (parallel zur xy-Ebene)
Dim Abst_b_aa_xy As Long
                           Abst_b_aa_xy = 70000000          '=7cm


' Abstand des Armanfangs (aa) von der Befestigungsebene
Dim Abst_b_aa_z As Long
                           Abst_b_aa_z = 30000000           '=3cm


' Abstand des Armendes (ae) vom Tool auf der xy-Parallel-Ebene
Dim Abst_t_ae_xy As Long
                           Abst_t_ae_xy = 40000000          '=4cm

' Abstand des Armendes (ae) von der xy-Parallel-Ebene
Dim Abst_t_ae_z As Long
                           Abst_t_ae_z = 20000000           '=2cm

'##### Berechne nun Konstruktionsabhängige Fixwerte #####

' Arm-Anfangspunkte:
' Arm1: (Der von oben gesehen hintere Arm, genau in y-Richtung)
Dim A1a_x As Long
Dim A1a_y As Long
Dim A1a_z As Long
A1a_x = B_x
A1a_y = B_y + Abst_b_aa_xy
A1a_z = B_z - Abst_b_aa_z

'Arm2: (Der von oben gesehen linke Arm)
Dim A2a_x As Long
Dim A2a_y As Long
Dim A2a_z As Long
Dim Hilf1 As Single                                         'Hilfsvariable für Zwischenergebnisse
Dim Hilf2 As Long
Dim Hilf3 As Long
Hilf1 = 0.866025403784435                                   '=Cos(30°)
Hilf2 = Hilf1 * Abst_b_aa_xy
A2a_x = B_x - Hilf2
Hilf3 = Abst_b_aa_xy / 2                                    '=Sin(30°)*Abst_b_aa_xy = Abst_b_aa_xy / 2
A2a_y = B_y - Hilf3
A2a_z = B_z - Abst_b_aa_z

'Arm3: (Der von oben gesehen rechte Arm)
Dim A3a_x As Long
Dim A3a_y As Long
Dim A3a_z As Long
A3a_x = B_x + Hilf2
A3a_y = B_y - Hilf3
A3a_z = B_z - Abst_b_aa_z

'Maximale und minimale "Länge" des Arms (Abstand von Armanfang zu Armende)
'jeweils mit sicherheitsabsatnd von 10% bzw 30%, um instabile Positionen zu vermeiden.
Dim Abst_min As Long
Dim Abst_max As Long
Hilf2 = Oa - Ua
Hilf2 = Abs(hilf2)
Abst_min = Hilf2 * 1.3
Hilf2 = Oa + Ua
Abst_max = Hilf2 * 0.9


Print "Montagepunkt = (" ; B_x ; "," ; B_y ; "," ; B_z ; ")"
Print "Armanfangs-Versatz:"
Print Abst_b_aa_xy ; "nm vom Montagepunkt in xy-Ebene"
Print "und " ; Abst_b_aa_z ; "nm in z-Richtung."
Print "Armende-Versatz:"
Print Abst_t_ae_xy ; "nm vom Toolpunkt in xy-Ebene"
Print "und " ; Abst_t_ae_z ; "nm in z-Richtung."
Print "Arm1-Anfang = ( " ; A1a_x ; " , " ; A1a_y ; " , " ; A1a_z ; " )"
Print "Arm2-Anfang = ( " ; A2a_x ; " , " ; A2a_y ; " , " ; A2a_z ; " )"
Print "Arm3-Anfang = ( " ; A3a_x ; " , " ; A3a_y ; " , " ; A3a_z ; " )"

'Deklariere restliche Variablen:
'Tool-Punkt T (Dieser Punkt soll angefahren werden)
Dim T_x As Long
Dim T_y As Long
Dim T_z As Long
'Kontroll-Bits:
Dim Erreichbar As Bit                                       'Ist 1, wenn der derzeitig geladene Toolpunkt erreichbar ist.
Erreichbar = 0
'Arm-Endpunkte
'Arm1
Dim A1e_x As Long
Dim A1e_y As Long
Dim A1e_z As Long
'Arm2
Dim A2e_x As Long
Dim A2e_y As Long
Dim A2e_z As Long
'Arm3
Dim A3e_x As Long
Dim A3e_y As Long
Dim A3e_z As Long
'Abstände der Armenden:
Dim Abst(3) As Long
'Hilfsvariablen für Zwischenergebnisse
Dim Hilf4 As Single
Dim Hilf5 As Long
Dim Hilf6 As Long
Dim Hilf7 As Single
Dim I As Integer

Print "Tastenbelegung:"
Print "1 = Armendpunkte berechnen + Pruefen, ob Punkt ereichbar"
Print "2 = Tool-z-Koordinate testweise aendern"

'
'## ## ## ## ## ## ## ## ## Hauptprogramm-Schleife ## ## ## ## ## ## ## ## ##
'
Do
   Taste = Tastenabfrage()
   If Taste <> 0 Then

      Select Case Taste
         Case 1
            Call Update_ae
         Case 2
            Call Change_t
         Case 3
            Call Nix
         Case 4
            Call Nix
         Case 5
            Call Nix
      End Select
   End If
   Waitms 20
Loop

End


Sub Update_ae()
' Berechnen der Arm-Endpunkte bei gegebenem Werkzeugpunkt W = ( W_x , W_y , W_z )
' und die Abstände der Arm-Enden "Abst1" bis "Abst3"
' Muss für jede Position natürlich neu vorgenommen werden!
' Arm1: (Der von oben gesehen hintere Arm, genau in y-Richtung)
A1e_x = T_x
A1e_y = T_y + Abst_t_ae_xy
A1e_z = T_z + Abst_t_ae_z

' Arm2: (Der von oben gesehen linke Arm)
Hilf4 = 0.866025403784435                                   '=Cos(30°)
Hilf5 = Hilf4 * Abst_t_ae_xy
A2e_x = T_x - Hilf5
Hilf6 = Abst_t_ae_xy / 2
A2e_y = T_y - Hilf6
A2e_z = T_z + Abst_t_ae_z

' Arm3: (Der von oben gesehen rechte Arm)
A3e_x = T_x + Hilf5
A3e_y = T_y - Hilf6
A3e_z = T_z + Abst_t_ae_z

' Debug-Ausgabe
Print "Arm-Endpunkte:"
Print "A1e = ( " ; A1e_x ; " , " ; A1e_y ; " , " ; A1e_z ; " )"
Print "A2e = ( " ; A2e_x ; " , " ; A2e_y ; " , " ; A2e_z ; " )"
Print "A3e = ( " ; A2e_x ; " , " ; A2e_y ; " , " ; A2e_z ; " )"

' Prüfen, ob der Punkt erreicht werden kann.
Erreichbar = 0
' Arm1:
Hilf2 = A1a_x - A1e_x
Hilf1 = Hilf2 * Hilf2
Hilf2 = A1a_y - A1e_y
Hilf4 = Hilf2 * Hilf2
Hilf2 = A1a_z - A1e_z
Hilf7 = Hilf2 * Hilf2
Hilf7 = Hilf7 + Hilf4
Hilf7 = Hilf7 + Hilf1
Abst(1) = Sqr(hilf7)
' Arm2:
Hilf2 = A2a_x - A2e_x
Hilf1 = Hilf2 * Hilf2
Hilf2 = A2a_y - A2e_y
Hilf4 = Hilf2 * Hilf2
Hilf2 = A2a_z - A2e_z
Hilf7 = Hilf2 * Hilf2
Hilf7 = Hilf7 + Hilf4
Hilf7 = Hilf7 + Hilf1
Abst(2) = Sqr(hilf7)
' Arm3:
Hilf2 = A3a_x - A3e_x
Hilf1 = Hilf2 * Hilf2
Hilf2 = A3a_y - A3e_y
Hilf4 = Hilf2 * Hilf2
Hilf2 = A3a_z - A3e_z
Hilf7 = Hilf2 * Hilf2
Hilf7 = Hilf7 + Hilf4
Hilf7 = Hilf7 + Hilf1
Abst(3) = Sqr(hilf7)

Print "Abstaende der Armenden: Arm1: " ; Abst(1) ; " Arm2: " ; Abst(2) ; " Arm3: " ; Abst(3)

Erreichbar = 0

For I = 1 To 3                                              ' Teste Arme 1-3
   If Abst(i) < Abst_max And Abst(i) > Abst_min Then        ' Wenn der Abstand ok ist...
      Erreichbar = 1                                        ' Dann setze das erreichbar-bit
   Else                                                     ' Sonst
      Erreichbar = 0                                        ' Clear das Erreichbar-bit
      Exit For                                              ' Und verlasse sofort die Schleife
   End If
Next I

If Erreichbar = 1 Then
   Print "Punkt ist erreichbar!"
   Else
   Print "Punkt ist NICHT erreichbar! Fehler!"
End If

Waitms 500

End Sub


' Ändert den Punkt T (zu Testzwecken) in z-Richtung, also nach oben/unten
Sub Change_t()
   Select Case T_z
      Case 0
         T_z = -50000000
      Case -50000000
         T_z = -100000000
      Case -100000000
         T_z = -150000000
      Case -150000000
         T_z = -300000000
      Case -300000000
         T_z = 0
   End Select
Print "T_z geändert auf " ; T_z

Waitms 500

End Sub

Function Tastenabfrage() As Byte
Local Ws As Word

   Tastenabfrage = 0
   Start Adc
   Ws = Getadc(7)
   If Ws < 500 Then
      Select Case Ws
         Case 400 To 450
            Tastenabfrage = 1
         Case 330 To 380
            Tastenabfrage = 2
         Case 260 To 305
            Tastenabfrage = 3
         Case 180 To 220
            Tastenabfrage = 4
         Case 90 To 130
            Tastenabfrage = 5
      End Select
   End If
End Function

Sub Nix()
End Sub


Edit:
Ich habe jetzt viele Deklarationen in Arrays gepackt, wodurch sich auch der rest des Codes deutlich verkürzt, weil ich vieles in "For I = 1 To 3" verpacken kann, wenn identische Berechnungen für alle 3 Arme gemacht werden.
Morgen stell ich den neuen Code ein, is zur Zeit nicht sehr ansehlich Zwinkern
Offline Benutzer-Profile anzeigen
user529

Roboter Genie
Roboter Genie




Anmeldungsdatum: 19.02.2005
Beiträge: 937
Wohnort: Innsbruck/Ludwigsburg
Alter: 21

austria.gif
Beitrag Verfasst am: 10.02.2009, 19:38 Antworten mit ZitatNach oben

unbedingt einstellen und die berechnung kommentieren, bin gerade am überlegen ob ich ein altes spielzeug wieder belebe und auch auf kipphebel umrüste.
Image
http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=9069

mfg clemens

_________________
Neun von zehn Stimmen in meinen Kopf sagen ich bin nicht verrückt. Die andere summt die Melodie von Tetris...
Offline Benutzer-Profile anzeigen E-Mail senden MSN Messenger
Bensch

Öfters hier
Öfters hier




Anmeldungsdatum: 02.02.2009
Beiträge: 29

Beitrag Verfasst am: 11.02.2009, 00:22 Antworten mit ZitatNach oben

wenn du auf kipphebel umrüstest, hast du auf jeden fall einen viel größeren Arbeitsraum. Ich halt dich auf dem laufenden, keine Sorge.

Zur Zeit schreibe ich den Code nochmal komplett um. Ich mach wenig mit software, deshalb bin ich da nicht so bewandert, was strukturiertes Programmieren angeht. aber ich geb mit mühe Zwinkern

Gruß,
Ben
Offline Benutzer-Profile anzeigen
goara

Roboter Genie
Roboter Genie




Anmeldungsdatum: 23.04.2007
Beiträge: 870
Wohnort: stuttgart

blank.gif
Beitrag Verfasst am: 07.03.2009, 03:48 Antworten mit ZitatNach oben

wozu willst du es benutzen?
Problem bei Parallelkinematik ist, dass 1. die Regleung komplex ist, 2. der Arbeitsraum sehr klein ist, Vorteil ist hohe Steifigkeit, aber auch nur in einem kleinen bereich... macht also nur für sehr spezielle Anwendungen Sinn..

_________________
meine projekte: robotik.dyyyh
Offline Benutzer-Profile anzeigen Website dieses Benutzers besuchen ICQ-Nummer
radbruch






Anmeldungsdatum: 27.12.2006
Beiträge: 3330
Wohnort: Stuttgart
Alter: 47

blank.gif
Beitrag Verfasst am: 21.03.2009, 14:28 Antworten mit ZitatNach oben

Hallo

Naja, so wirklich brauchbar ist das in meiner Spielzeuggröße wohl nicht.

Irgendwie zieht sich das Projekt nun auch etwas in die Länge. Für die Potis (die noch nicht verwendet werden) habe ich mit Irrwegen locker 3 Wochen gebraucht, die Basis ist verändert, eine kleine Adapterplatine wurde zusammengelötet und der RP6 hat nun einen genutzten USRBUS und einen dritten "freien" ADC. Zudem habe ich endlich eine pfiffige Servoansteuerung gefunden die sich mit den RP6-Libs verträgt. Und schliesslich habe ich noch einen kleinen Greifer zusammengebastelt, der wiederrum war nach einer Stunde fertiggebogen:

Image Image Image
Image Image Image
(Digitales 5€-Miniservo: http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=42121)

Zusammengebaut sieht das nun so aus:

Image Image
http://www.youtube.com/watch?v=O1G1xVg6CcU
http://www.youtube.com/watch?v=94sjwaqIeAI


Das Programm (für einen 8MHz-Mega32) fährt stur die einzelnen Positionen an:

// Parallele Kinematik                                            21.3.2008 mic
// RP6 steuert Deltaroboter mit Greifer

#include "RP6RobotBaseLib.h"

// Servoausgänge 1-4
#define servoinit {DDRB |= (1<<PB7); PORTB &= ~(1<<PB7); DDRC |= 0b01110000; PORTC &= ~0b01110000;}
#define servo1on  PORTC |=  (1<<PC4)
#define servo1off PORTC &= ~(1<<PC4)
#define servo2on  PORTC |=  (1<<PC5)
#define servo2off PORTC &= ~(1<<PC5)
#define servo3on  PORTC |=  (1<<PC6)
#define servo3off PORTC &= ~(1<<PC6)
#define servo4on  PORTB |=  (1<<PB7)
#define servo4off PORTB &= ~(1<<PB7)

typedef struct
{
   uint16_t pos1, pos2, pos3, pos4;
   uint8_t pause;
} schritt;

schritt schrittfolge[10];
uint8_t servo1, servo2, servo3, servo4, s[5]={0,200,200,200,200};  //oben offen
uint16_t adc1, adc2, adc3;

void getadcs(void)
{
   adc1=readADC(7);
   adc2=readADC(1);
   adc3=readADC(0);
}
int main(void)
{
   initRobotBase();
   getadcs();
   servoinit;

   //Timer2 Initialisierung
   TCCR2 = (0 << WGM21) | (0 << COM20) | (1 << CS22); // Normal Mode, prescaler /64
   TIMSK |= (1 << TOIE2); // Timer2 Overflow-Interrupt erlauben
   //TIMSK &= ~(1 << TOIE2); // Timer2 Overflow-Interrupt verbieten

   servo1=s[1];
   servo2=s[2];
   servo3=s[3];
   servo4=s[4];
   while(1)
   {
     servo1=200; // hoch
     servo2=200;
   servo3=200;
   mSleep(600);

    servo4=154; // aufpicken
   mSleep(200);
    servo1=150;
     servo2=150;
   servo3=150;
   mSleep(400);

     servo1=220; // hoch
     servo2=220;
   servo3=220;
   mSleep(400);
   servo2=70;  // rueber
   servo3=250;
   mSleep(150);
     servo1=130;
   mSleep(500);

   servo4=170; // oeffnen
   mSleep(200);
   servo1=120; // neu positionieren
   servo2=60;
   servo3=240;
   mSleep(300);
   servo4=154; // schliesen
   mSleep(200);

     servo1=200; // hoch
     servo2=120;
   servo3=240;
   mSleep(200);

     servo1=220; // mitte oben
     servo2=220;
   servo3=220;
   mSleep(600);
     servo1=170; // runter
     servo2=170;
   servo3=170;
   mSleep(500); // fallenlassen
   servo4=170;
   mSleep(300);
   }
   return(0);
}
ISR (TIMER2_OVF_vect)
{
   static uint8_t servo_nr=0, grundimpuls=0;
   static uint16_t impulspause;
   if(servo_nr)
   {
      if(grundimpuls++ & 1) TCNT2=200; else
      {
         if(servo_nr==1) {TCNT2=servo1; servo1on; impulspause-=servo1;}
         if(servo_nr==2) {TCNT2=servo2; servo1off; servo2on; impulspause-=servo2;}
         if(servo_nr==3) {TCNT2=servo3; servo2off; servo3on; impulspause-=servo3;}
         if(servo_nr==4) {TCNT2=servo4; servo3off; servo4on; impulspause-=servo4;}
         if(servo_nr==5) {servo4off; servo_nr=0;}
         if(servo_nr) servo_nr++;
      }
   }
   else
   {
      if(impulspause>256) impulspause-=256;
         else {TCNT2=-impulspause; servo_nr++; impulspause=1500;}
   }
}


Gruß

mic

_________________
Image
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Offline Benutzer-Profile anzeigen
orph

Fleißiges Mitglied
Fleißiges Mitglied




Anmeldungsdatum: 07.05.2006
Beiträge: 153

Alter: 21

switzerland.gif
Beitrag Verfasst am: 22.03.2009, 23:29 Antworten mit ZitatNach oben

Hei,

echt super der Greifer!!!
und mit nur einem Servo.
Ist wirklich ne gute alternative zum Saugnapf.
Danke!

_________________
Anything that can go wrong, will go wrong. Kabel sind entweder zu lang oder zu kurz...
Offline Benutzer-Profile anzeigen E-Mail senden Website dieses Benutzers besuchen MSN Messenger
vohopri

Roboter Genie
Roboter Genie




Anmeldungsdatum: 11.09.2004
Beiträge: 1395
Wohnort: südlich der Alpen

blank.gif
Beitrag Verfasst am: 23.03.2009, 09:04 Antworten mit ZitatNach oben

Ha,

was für eine elegante Konstruktion. Sowas begeistert mich immer.

Nur die arme Katze bekommt keine Bälle mehr geworfen.

grüsse,
Hannes

_________________
Autonome Fahrzeuge:
http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=36497 Land
http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=49258 Wasser
Offline Benutzer-Profile anzeigen Website dieses Benutzers besuchen
Brantiko

Roboter-Spezialist
Roboter-Spezialist




Anmeldungsdatum: 12.10.2006
Beiträge: 234
Wohnort: Kohlenpott
Alter: 22

sweden.gif
Beitrag Verfasst am: 22.04.2009, 22:06 Antworten mit ZitatNach oben

Auf der Hannovermesse hat wohl Jemand meine/unsere Idee geklaut.
Generell war dieses Jahr deutlich mehr im Bereich Linearkinematik zu sehen.
Fast in jeder Halle stand ein Hexapod. Einer war sogar so klein dass er problemlos als Überrschsungsei-Extra daher kommen könnte..

Das Ding auf dem Bild konnte man selber steuern.. also jeden Servo einzeln.
Wird Zeit dass ich mir auch mal einen baue.



fgr.jpg
 Beschreibung:
 Dateigröße:  37.65 KB
 Angeschaut:  6132 mal

fgr.jpg


Offline Benutzer-Profile anzeigen AIM-Name ICQ-Nummer
Goblin

Roboter Genie
Roboter Genie




Anmeldungsdatum: 09.05.2004
Beiträge: 1396
Wohnort: Bielefeld / Paderborn

germany.gif
Beitrag Verfasst am: 25.05.2009, 14:07 Antworten mit ZitatNach oben

Ich hab meinen Deltabot jetzt auch mal zusammengebastelt und werd mich mal ein wenig mit Mathe rumschlagen. Ich habe ein recht interessantes Paper für die Inverse Kinematik gefunden, welches ich mal auseinandernehmen werde:

http://www.cim.mcgill.ca/~paul/clavdelt.pdf

edith: Fotos

Image Image Image

_________________
-> MEIN PROJEKTBLOG <-
Offline Benutzer-Profile anzeigen ICQ-Nummer
Brantiko

Roboter-Spezialist
Roboter-Spezialist




Anmeldungsdatum: 12.10.2006
Beiträge: 234
Wohnort: Kohlenpott
Alter: 22

sweden.gif
Beitrag Verfasst am: 17.06.2009, 21:51 Antworten mit ZitatNach oben

Klasse!
Woher hast du die Teile? Wasserstrahl?

Hat mal jemand überlegt ob mit einem Hexapod nicht auch eine CNC-Fräse machbar wäre, zumindist für kleine Gravuraufgaben bzw. weiche Materialien?
Offline Benutzer-Profile anzeigen AIM-Name ICQ-Nummer
Beiträge vom vorherigen Thema anzeigen:      
Neues Thema eröffnenNeue Antwort erstellen
Vorheriges Thema anzeigen Dieses Thema einem Freund schickenZeige Benutzer, die dieses Thema gesehen habenDieses Thema als Textdatei speichernPrintable versionlog in, Nachrichten zu lesen Nächstes Thema anzeigen



 Gehe zu:   



Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen




Die große Community für Robotik-, Mikrocontroller- und Elektronik Bastler als auch Experten
 Roboternetz RSS2.0 News Feed
Alle Zeiten sind GMT + 1 Stunde