Hallo
Recht einfach kann man beim Probot die Antriebsplatine austauschen:
Bild hier
http://www.youtube.com/watch?v=Z7VJT-kw9VQ
Die Steuerplatine treibt die Motoren der umgebauten Servos über die orginalen Servoplatinen an. Die Potis dienen nun zum Kalibrieren des Nullpunkts (am Anfang des Videos). Leider haben meine Omniwheels fast keinen Grip auf dem Laminat.
Das kleine Demo erzeugt die Servoimpulse asurolike mit Sleep():
GrußCode:// Erster Test mit Omniwheels 19.10.09 mic #include "asuro-probot.h" #include "asuro-probot.c" void omniwheels(char x, char y, char z, int t) { int i; while(t--) { PORTB |= (1<<PB1); Sleep(36+x); PORTB &= ~(1<<PB1); PORTB |= (1<<PB2); Sleep(36+y); PORTB &= ~(1<<PB2); PORTB |= (1<<PB4); Sleep(36+z); PORTB &= ~(1<<PB4); for(i=15; i--; Sleep(36)); } } int main(void) { Init(); PORTC |= 3; // Odo-PullUps simulieren für PollSwitch() PORTB &= ~(1<<PB5 | 1<<PB4 | 1<<PB2 | 1<<PB1); while(!PollSwitch()); while(PollSwitch()); StatusLED(RED); while(!PollSwitch()) // kalibrieren { omniwheels(0,0,0,10); } while(PollSwitch()); //fertig StatusLED(YELLOW); Beep(200); Msleep(200); Beep(1000); while(1) // Demo { omniwheels(2,2,2,200); Beep(100); omniwheels(-2,-2,-2,300); Beep(200); omniwheels(5,5,5,400); Beep(100); omniwheels(-7,-7,-7,400); Beep(200); Msleep(200); Beep(200); omniwheels(2,-2,0,300); Beep(200); omniwheels(4,-4,0,300); Beep(200); omniwheels(0,5,-3,300); Beep(200); omniwheels(5,3,-5,300); Beep(200); Msleep(200); Beep(200); } }
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo
Da ich mich immer noch nicht für ein richtig großes Projekt entscheiden kann, spiele ich mit den Dingen, die ich hier so rumliegen habe:
Outtake:
Diesmal alles in Bascom:
Die Kamera hängt am Tasten-ADC des asuro, dieser wird bei meinem Clone nicht verwendet. Basis für das Kameraprogramm war die Bascomversion vom RP6 das ich nahezu unverändert eingebaut habe:Code:' asuro sendet vt100 23.7.2001 mic ' https://www.roboternetz.de/community/showthread.php?41788-Kameramodul&p=399123&viewfull=1#post399123 ' https://www.roboternetz.de/community/showthread.php?47457-Hardware-Mitmach-Projekt-Kamera-f%FCr-den-RP6&p=463226&viewfull=1#post463226 ' $regfile = "m8def.dat" ' asuro mit Mega8 $crystal = 8000000 ' taktet mit 8MHz $baud = 2400 ' IR-Baudrate ' https://www.roboternetz.de/community/showthread.php?44458-Grundsatzfrage-zu-Arrays-in-Bascom ' (Trick zu Index 0?) Dim Bildspeicher_000 As Byte ' Bildspeicher für 16*24 byte Dim Bildspeicher(383) As Byte 'allgemeine Variablen Dim X As Byte , Y As Byte Dim S As String * 30 ' max 30 Positionen ' VT100-Funktionen Declare Sub Set_cursor(byval X As Byte , Byval Y As Byte ) Declare Sub Print_at(byval X As Byte , Byval Y As Byte , Text As String ) ' Tasten Portc.0 = 1 ' Tastenpullups einschalten (ODOLed) Portc.1 = 1 ' beist sich mit den Servos :( ' Charlieplexing Declare Sub Charlie(byval Bitnr As Byte) Dim Charliedata(12) As Byte ' Bitmuster fürs Charlieplexing an PC0 bis PC3 Charliedata(01) = &B11001000 ' Highnipple ist DDR, Lownipple ist Port Charliedata(02) = &B10101000 Charliedata(03) = &B10011000 Charliedata(04) = &B11000100 Charliedata(05) = &B01100100 Charliedata(06) = &B01010100 Charliedata(07) = &B10100010 Charliedata(08) = &B01100010 Charliedata(09) = &B00110010 Charliedata(10) = &B10010001 Charliedata(11) = &B01010001 Charliedata(12) = &B00110001 ' Beeper Declare Sub Beep(byval Dauer As Word) ' Dauer in ms Config Pind.5 = Output ' Beeper ' Servos Declare Sub Servoimpuls() Dim Servo1 As Byte , Servo2 As Byte , Servo3 As Byte , Tmp As Byte Config Pinb.1 = Output Config Pinb.2 = Output Config Pinb.4 = Output ' Kamera Config Adc = Free , Prescaler = Auto , Reference = Avcc ' Dummy-Setup!!! Admux = 0 Set Admux.refs1 ' Internal 2.56V Voltage Reference Set Admux.refs0 ' with external capacitor at AREF pin Set Admux.adlar ' ausrichtung links (adch) für 8-bit Set Admux.2 ' Kanal 4 'Sfior = 0 ' eventuell besser für andere Funktionen: Sfior = Sfior And &B00011111 ' adts2=0 adts1=0 adts0=0 Adcsr = 0 Set Adcsr.aden ' ADC Enable Set Adcsr.adps0 ' ADC Prescaler Select Bits (2) Set Adcsr.5 ' adate (ADC Auto Trigger Enable) Set Adcsr.adif ' ADC Interrupt Flag Set Adcsr.adsc ' ADC Start Conversion Start Adc Enable Interrupts Dim Rewrite As Byte S = "asuro mit VT100-Terminal" Rewrite = 0 Print "{027}[1;1H"; ' Home Print "{027}[2J"; ' clear terminal screen Call Set_cursor(5 , 2) Print "hallo" Print "{027}[1m"; ' bold on Call Print_at(10 , 5 , S) Print "{027}[0m"; ' Attribute off Call Set_cursor(5 , 2) Print "calibrieren.." Call Beep(150) Waitms 100 Call Beep(150) Waitms 100 Call Beep(150) Waitms 100 Call Beep(150) Servo1 = 10 Servo2 = 10 Servo3 = 10 While Pinc.0 = 1 ' Servos kalibrieren, Abruch mit Taste "Boot" Call Servoimpuls() Waitms 17 Wend While Pinc.0 = 0 Wend Call Set_cursor(5 , 2) Print "and go! " Call Beep(1000) Servo1 = 10 ' 3 Sekunden vorwärts servo2 = 5 Servo3 = 15 For X = 0 To 150 Call Servoimpuls() Waitms 17 Next X Servo2 = 10 Servo3 = 10 Waitms 1000 ' Liniendemo Do Do ' Auf Bildanfang warten X = 0 While Adch > 30 Wend While Adch < 50 Incr X Wend Loop Until X > 40 X = 50 ' die zu lesende Zeile While X > 0 While Adch > 30 Wend While Adch < 50 Wend Decr X Wend X = 0 While Adch > 65 ' Hell/Dunkel-Schwelle Incr X Wend Servo1 = 10 ' zum Strich schwenken 'Servo2 = 10 'Servo3 = 10 If X > 13 Then ' gegenuhrzeiger Servo1 = 5 'Servo2 = 5 'Servo3 = 5 End If If X < 11 Then ' uhrzeiger Servo1 = 15 'Servo2 = 15 'Servo3 = 15 End If Call Servoimpuls() ' hihi :) If Rewrite > 0 Then ' Debug Decr Rewrite Else Call Set_cursor(0 , 15) Print X; Print " "; 'S = Space(x) 'Print S; 'Print "***" 'Waitms 300 Rewrite = 20 End If X = X / 2 ' Ausgabe per Charlieplexing Call Charlie(x) Loop End Sub Servoimpuls() Tmp = Servo1 * 10 'Servoansteuerung If Tmp > 0 Then Portb.1 = 1 While Tmp > 0 Waitus 10 Decr Tmp Wend Portb.1 = 0 End If Tmp = Servo2 * 10 If Tmp > 0 Then Portb.2 = 1 While Tmp > 0 Waitus 10 Decr Tmp Wend Portb.2 = 0 End If Tmp = Servo3 * 10 If Tmp > 0 Then Portb.4 = 1 While Tmp > 0 Waitus 10 Decr Tmp Wend Portb.4 = 0 End If End Sub Sub Beep(byval Dauer As Word) ' 2kHz, Dauer in ms While Dauer > 0 Portd.5 = 0 Waitus 250 Portd.5 = 1 Waitus 250 Portd.5 = 0 Waitus 250 Portd.5 = 1 Waitus 250 Decr Dauer Wend End Sub Sub Set_cursor(byval X As Byte , Byval Y As Byte ) Print Chr(27) ; "[" ; Str(y) ; ";" ; Str(x) ; "H"; ' set cursorpos End Sub Sub Print_at(byval X As Byte , Byval Y As Byte , Text As String) Print Chr(27) ; "[" ; Str(y) ; ";" ; Str(x) ; "H"; ' set cursorpos Print Text; End Sub Sub Charlie(byval Bitnr As Byte) ' Bitnummer 0-11 Incr Bitnr ' Startindex bei Arrays ist 1! Ddrc = 0 Portc = 0 If Bitnr > 0 Then If Bitnr < 13 Then Ddrc = Charliedata(bitnr) / 16 Portc = Charliedata(bitnr) And 15 End If End If End Sub
https://www.roboternetz.de/community...l=1#post399123
Die Servoimpulse werden recht trickreich erzeugt, denn die Impulspause wird durch das Einlesen der Kamera erzeugt. 50 Bilder pro Sekunde ergeben fast genau 20ms Impulspause;)
Die 12 Leds werden per Charlieplexing an PC0 bis PC3 angesteuert. Beim asuro sind das die Pins für die Linien- und ODO-Sensoren. Da diese Anschlüsse von meiner Omniplatine nicht verwendet werden, drängt sich diese Verwendung geradezu auf. Blöderweise überschneidet sich das aber mit der Tastenauswertung...
Das Kugelrad ist ein aufgeschnittener Tennisball mit Skaterlagern, Laminatlagerhaltern und Zollstockachse. Das ist eigentlich der Grund für meine aktuelle Omniwheel-Aktivität:
https://www.roboternetz.de/community...tatt-omniwheel
Da ich ja normalerweise in C programmiere, verblüffen mich die gelegentlichen Ausflüge in die Basccom-Welt. Ganz schön clever, was da alles geboten wird. Der Printbefehl z.B. funktioniert prima auch ohne eigenes Setup für den Timer2 (36kHz), weil dies schon im Bootloader erledigt wird. Wirklich überraschend ist auch das Terminal von Bascom, weil es offensichtlich doch TV100-Codes interpretieren kann:
https://www.roboternetz.de/community...-f%FCr-den-RP6
Es gibt noch viel zu erforschen...
Gruß
mic
Geändert von radbruch (02.05.2015 um 22:33 Uhr)
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen