-
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():
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);
}
}
Gruß
mic
-
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:
http://www.youtube.com/watch?v=C9xVNq2Z1KA
http://www.youtube.com/watch?v=I0GNsYDZaB8
Outtake:
http://www.youtube.com/watch?v=NR-b-f1DS_s
Diesmal alles in Bascom:
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
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:
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