radbruch
29.10.2008, 15:45
Hallo
Bei meiner Suche nach einer GUI für meinen RP6 bin ich mal über Profan (http://xprofan.com/start.html) 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:
// 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--;}
}
Das kann man mit dem Terminal des RP6-Loader bedienen. Die Mini-GUI mit Profan kann es aber auch:
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
Noch ein weiteres Beispiel: Ein Terminal aus den Beispielcodes an den RP6 angepasst (Baudrate 38400 und RTS gelöscht):
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
Gruß
mic
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.