Das ist alles eine Frage der Programmierung.
Nur Versuch mach kluch.
Das ist alles eine Frage der Programmierung.
Nur Versuch mach kluch.
hi @ carlitoco,
sag mal woher hast du denn dieses Bild überhaupt. Interessiere mich dafür weil da oben Bioloid dran steht...vielleicht kann ich das für meinen Bioloid nutzen. Vielen Dank schon mal
mfg
Laut Link kommt das von dieser Seite.Zitat von HeXPloreR
Dazu gibts auch ein generelles Wiki.
Hallo
Bei meiner Suche nach einer GUI für meinen RP6 bin ich mal über Profan gestolpert. Voller Zugriff auf alle Windows-Geräte, grafikfähig und vor allem kostenlos! Die Syntax ist etwas gewöhnungsbedürftig, aber viele praktische Beispiele und eine aktive Kommunity machen den Einstieg einfach. Für meinen Greifer hatte ich mir ein paar Buttons zusammengebastelt die beim Anklicken ein paar Zeichen über die com-Schnittstelle zum RP6 senden. Auf der RP6-Seite läuft dann ein Programm das diese Zeichen auswertet und entsprechend die Positionen der Servos ändert. Das Ganze dient zum Teachen einer Folge von Greiferpositionen:
Das kann man mit dem Terminal des RP6-Loader bedienen. Die Mini-GUI mit Profan kann es aber auch:Code:// Domino Day für den RP6 mit neuem Greifarm und ADC-ISR 5.2.2008 mic #include "RP6RobotBaseLib.h" uint8_t s0, s1, s2, s3, s4 ,s5, s6, s[7],s_aktiv, n, eingabe; uint8_t step, step_start, step_stop, steps[26][7]; uint16_t pause; uint8_t adc_pos, adc_count; uint16_t adc_servo; void servo_ON(void) { cli(); // Freeruning, 5V-Ref, ISR enable, prescale /16 // AVCC with external capacitor at AREF pin, Ergebniss rechtsbündig, Kanal ADC7 (UBAT) ADMUX = (0<<REFS1) | (1<<REFS0) | (0<<ADLAR) | 4; // setzte free running triggern SFIOR = (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); // Interrupt ein, Wandler einschalten, prescaller /16 ADCSRA = (1<<ADIE) | (1<<ADEN) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // Autotriggern bedeutet jetzt free running aktivieren, altes Flag löschen ADCSRA |= (1<<ADATE) | (1<<ADIF); // Initialisierung starten ADCSRA |= (1<<ADSC); // und noch die wohl eher unnötige Initiallesung while (!(ADCSRA & (1<<ADIF))); ADCSRA |= (1<<ADIF); DDRC |= 0x70; // LED1-3 auf Ausgang und low PORTC &= ~0x70; DDRB |= 0x83; // LED4-6 auf Ausgang und low PORTB &= ~0x83; //DDRC |= 3; // SCL und SDA auf Ausgang und low //PORTC &= ~3; //DDRA |= 16; // E_INT auf Ausgang und low //PORTA &= ~16; sei(); } void servo_OFF(void) { cli(); // Initialize ADC: (Defaultsetup der RP6-Library) ADMUX = 0; //external reference ADCSRA = (0<<ADIE) | (0<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF); SFIOR = 0; sei(); updateStatusLEDs(); // LEDs restaurieren } int main(void) { initRobotBase(); s0=s[0]=20; s1=s[1]=68; s2=s[2]=84; s3=s[3]=58; s4=s[4]=22; s5=s[5]=92; s6=s[6]=46; servo_ON(); s_aktiv=1; step=0; step_start=step_stop=0; while(1) { s0=s[0]; s1=s[1]; s2=s[2]; s3=s[3]; s4=s[4]; s5=s[5]; s6=s[6]; writeString_P("Step: "); writeChar(step+'a'); writeChar(' '); for(n=1; n<7; n++) { if(n == s_aktiv) writeString_P(" >|s"); else writeString_P(" s"); writeChar(n+'0'); writeString_P(":"); writeInteger(s[n], 10); if(n == s_aktiv) writeString_P("|<"); } if(0 == s_aktiv) writeString_P(" >|"); else writeString_P(" "); writeString_P("pause:"); writeInteger(s[0], 10); if(0 == s_aktiv) writeString_P("|<"); writeString_P("\n"); writeString("1-6 Servo | + - Wert ändern | S speichern | a-z Schritt | I Einfügen | L list\n"); while(!getBufferLength()); eingabe=readChar(); n=readChar(); switch(eingabe) { case ('0'): s_aktiv=0; break; case ('1'): s_aktiv=1; break; case ('2'): s_aktiv=2; break; case ('3'): s_aktiv=3; break; case ('4'): s_aktiv=4; break; case ('5'): s_aktiv=5; break; case ('6'): s_aktiv=6; break; case ('+'): s[s_aktiv]++; break; case ('-'): s[s_aktiv]--; break; case ('*'): if (step<25) step++; break; case ('_'): if (step>0)step--; break; } } return 0; } ISR(ADC_vect) { static uint16_t count=0; //uint8_t dummy; //dummy=ADCH; (count>s1)?(PORTC&=~SL1):(PORTC|=SL1); (count>s2)?(PORTC&=~SL2):(PORTC|=SL2); (count>s3)?(PORTC&=~SL3):(PORTC|=SL3); (count>s4)?(PORTB&=~SL4):(PORTB|=SL4); (count>s5)?(PORTB&=~SL5):(PORTB|=SL5); (count>s6)?(PORTB&=~SL6):(PORTB|=SL6); //(count>s1)?(PORTC&=~1):(PORTC|=1); // SCL //(count>s2)?(PORTC&=~2):(PORTC|=2); // SDA if (count>adc_pos) // E_INT { DDRA &= ~16; PORTA &= ~16; if (count == adc_pos+100) { adc_servo=ADC; } } else { DDRA |= 16; PORTA |= 16; } if(count<1000) count++; else {count=0; if (pause) pause--;} }
Noch ein weiteres Beispiel: Ein Terminal aus den Beispielcodes an den RP6 angepasst (Baudrate 38400 und RTS gelöscht):Code:Declare f%, Ende%, meldung$ declare s1%, s2%, s3%, s4%, s5%, s6%, fertig%, pause%, test% declare s1_dec%, s2_dec%, s3_dec%, s4_dec%, s5_dec%, s6_dec% declare s1_inc%, s2_inc%, s3_inc%, s4_inc%, s5_inc%, s6_inc% declare pos1%, pos2%, pos3%, pos4%, pos5%, pos6% windowtitle "RP6 mit Greifer v1.0 5.2.2008 mic" 'windowstyle 24 windowstyle $1C window 0,0-1024,768 TextColor @RGB(255,255,255),@RGB(0,16,16) Cls @RGB(0,16,16) loadbmp "rp6.bmp",130,80;0 let pos1%=68 let pos2%=84 let pos3%=58 let pos4%=22 let pos5%=92 let pos6%=46 let pause%=10 let s1_dec%=@createbutton(%HWnd,"+",200,104,56,24) ' 3408848 let s2_dec%=@createbutton(%HWnd,"+",264,104,56,24) ' 1573810 let s3_dec%=@createbutton(%HWnd,"+",328,104,56,24) ' 3408848 let s4_dec%=@createbutton(%HWnd,"+",392,104,56,24) ' 1573810 let s5_dec%=@createbutton(%HWnd,"+",456,104,56,24) ' 3408848 let s6_dec%=@createbutton(%HWnd,"+",520,104,56,24) ' 1573810 let s1%=@createbutton(%HWnd,"s1",200,136,56,40) ' 3408854 let s2%=@createbutton(%HWnd,"s2",264,136,56,40) ' 2032418 let s3%=@createbutton(%HWnd,"s3",328,136,56,40) ' 1901522 let s4%=@createbutton(%HWnd,"s4",392,136,56,40) ' 1573664 let s5%=@createbutton(%HWnd,"s5",456,136,56,40) ' 1704780 let s6%=@createbutton(%HWnd,"s6",520,136,56,40) ' 6095828 let s1_inc%=@createbutton(%HWnd,"-",200,184,56,24) ' 1573826 let s2_inc%=@createbutton(%HWnd,"-",264,184,56,24) ' 1442478 let s3_inc%=@createbutton(%HWnd,"-",328,184,56,24) ' 1573826 let s4_inc%=@createbutton(%HWnd,"-",392,184,56,24) ' 1442478 let s5_inc%=@createbutton(%HWnd,"-",456,184,56,24) ' 1573826 let s6_inc%=@createbutton(%HWnd,"-",520,184,56,24) ' 1442478 let fertig%=@createbutton(%HWnd,"Ende",200,216,376,48) ' 1442478 let s6%=@DestroyWindow(s6%) let s6%=@createbutton(%HWnd,"123",520,136,56,40) ' 6095828 'SetText s5%,"test" 'let test%=567 Let f% = @OpenCom("COM5",1024,1024) @setCom("com5: baud=38400 parity=n data=8 stop=1 rts=off") Let Ende% = 0 WhileNot Ende% 'Solange Ende den Wert 0 hat ... settext s1%,@str$(pos1%) settext s2%,@str$(pos2%) settext s3%,@str$(pos3%) settext s4%,@str$(pos4%) settext s5%,@str$(pos5%) settext s6%,@str$(pos6%) WaitInput 'Auf Tastendruck oder Mausklick warten If @GetFocus(s1%) meldung$= "s1 " @WriteCom(f%,"1") elseif @GetFocus(s1_inc%) meldung$= "s1-" @WriteCom(f%,"-") sub pos1%,1 elseif @GetFocus(s1_dec%) meldung$= "s1+" @WriteCom(f%,"+") add pos1%,1 endif If @GetFocus(s2%) meldung$= "s2 " @WriteCom(f%,"2") elseif @GetFocus(s2_inc%) meldung$= "s2-" @WriteCom(f%,"-") elseif @GetFocus(s2_dec%) meldung$= "s2+" @WriteCom(f%,"+") endif If @GetFocus(s3%) meldung$= "s3 " @WriteCom(f%,"3") elseif @GetFocus(s3_inc%) meldung$= "s3-" @WriteCom(f%,"-") elseif @GetFocus(s3_dec%) meldung$= "s3+" @WriteCom(f%,"+") endif If @GetFocus(s4%) meldung$= "s4 " @WriteCom(f%,"4") elseif @GetFocus(s4_inc%) meldung$= "s4-" @WriteCom(f%,"-") elseif @GetFocus(s4_dec%) meldung$= "s4+" @WriteCom(f%,"+") endif If @GetFocus(s5%) meldung$= "s5 " @WriteCom(f%,"5") elseif @GetFocus(s5_inc%) meldung$= "s5-" @WriteCom(f%,"-") elseif @GetFocus(s5_dec%) meldung$= "s5+" @WriteCom(f%,"+") endif If @GetFocus(s6%) meldung$= "s6 " @WriteCom(f%,"6") elseif @GetFocus(s6_inc%) meldung$= "s6-" @WriteCom(f%,"-") elseif @GetFocus(s6_dec%) meldung$= "s6+" @WriteCom(f%,"+") endif If @GetFocus(fertig%) meldung$= "end" let ende%=1 endif TextColor @RGB(255,255,255),@RGB(0,16,16) DrawText 0,0,meldung$+" " Wend @CloseCom(f%) Waitinput End
GrußCode:Declare a$, f%, ende% Proc GetComInput '--------------- Parameters id% Declare x$ Let x$=@ReadCom$(id%,1) @ComError(id%) Print x$; WhileNot @equ$(x$,"") Let x$=@ReadCom$(id%,1) @ComError(id%) Print x$; EndWhile EndProc Window 0,0-%MaxX,%MaxY Let f% = @OpenCom("COM5",1024,1024) @setCom("com5: baud=38400 parity=n data=8 stop=1 rts=off") WhileNot ende% Let a$ = @inkey$() ' Tastatur abfragen If @Equ$(a$,"§") ' Ende mit SHIFT-3 Let ende%=1 Else IfNot @equ$(a$,"") ' Wurde ein Zeichen eingegeben, dann ans Modem @WriteCom(f%,a$) Endif GetComInput f% ' empfangene Zeichen lesen Endif Wend @CloseCom(f%) End
mic
thx carlitoco für die Links [-o<
leider alles in "english", war irgendwie noch nie meins...
...aber da kann man sich durchbeißen...auf jedenfall ziemlich imteresant was so alles geht...wenn ich nur 10% davon raelisiert bekommen was ich grade die letzte Stunde gelesen habe dann bin ich echt begeistert.
nochmals vielen Dank
mfg
Lesezeichen