Ik ben momenteel bezig met het bouwen van een sumo robot voor school, het begint al een aardig complex te worden, maar heb momenteel een probleem met de c code.
hier onder even snel korte info over de robot:
Subo robot
Een sumo robot met een afstand sensor er op, die de tegenstander detecteert. het is duidelijk te vinden op http://subobv.nl
Functies:
- Tegenstander detecteren.
- Lijn detecteren
Eigenschappen:
- Besturing: 2x atmega 328p
- Programmeertaal: C
- Voeding: Lood accu 12V
- Sensoren: Afstand sensor( s80 datalogic) licht sensoren (s15 datalogic)
- Gewicht: 4 kilo
- Afmetingen (LxBxH): 50 x 50 x 40
- Geschatte materiaalkosten: €1500
- Geschatte productietijd: 50
- Geschatte programmeertijd: 10
ik ben momenteel bezig met de code voor de robot, alleen de wielen moeten gezamenlijk rond draaien op de bodemplaat wat de robot doet draaien. Alleen ik heb geen flauw idee hoe dit te programmeren.
momenteel ben ik zover met het script:
/*
Voorsturing:
PB6=direction
PB7=PWM
PC0=brake
Vooruit:
PORTB=0xC0;
Achteruit:
PORTB=0x80;
Remmen:
PORTC=0x01;
Draaien:
PC1=direction
PC2=PWM
PC3=brake
Links:
PORTC=0x06;
Rechts:
PORTC=0x04;
Remmen:
PORTC=0x08;
ENCODER:
PD5
*/
#include <interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
typedef unsigned char u08;
ISR(INT0_vect)
{
}
ISR(INT1_vect)
{
}
int main(void)
{
//-----------declareren van poorten-------------//
DDRB = 0xC0; /* pinnen poort B eerste 4 ingang, laatste 2 uitgang*/
DDRC = 0x0F; /* Pinnen poort C uitgang*/
DDRD = 0x00; /* pinnen poort D ingang */
//------------interrupts aanzetten--------------//
EICRA = 0x0F; //reageren op positieve flank int0 en int1
EIMSK = 0x03; //int0 aanzetten
sei(); //interrupts aanzetten in statusregister
TCCR1B |= (1<<ICES1) | (1<<CS12) | (1<<CS11) | (1<<CS10);
//-----------declaren van variabelen------------//
u08 input, input2;
unsigned int encoder;
unsigned int hoekwiel=0;
//-----------wachttijd voor opstart------------//
/*hier staat de vertraging die de robot heeft bij inschakelen, ik weet niet of we
aar afspraken overgemaakt hebben maar bij onze was dat 5000ms (5 seconden dus)*/
_delay_ms(1000);
//-----------aanmaken van functie--------------//
/*hier is ruimte om functie's aan te maken.*/
void lijndetectie() /* functie lijndetectie*/
{
PORTC=0x01;
_delay_ms(50);
PORTB=0x80;
_delay_ms(50);
TCNT1=0;
for(TCNT1=0, TCNT1<90);{
PORTC=0x06;
}
PORTC=0x08;
}
void lijndetectie1()
{
PORTC=0x01;
_delay_ms(50);
PORTB=0x80;
_delay_ms(50);
TCNT1=0;
for(TCNT1=0, TCNT1<90);{
PORTC=0x06;
}
PORTC=0x08;
}
void lijndetectie2()
{
PORTC=0x01;
_delay_ms(50);
PORTB=0x80;
_delay_ms(50);
TCNT1=0;
for(TCNT1=0, TCNT1<90);{
PORTC=0x04;
}
PORTC=0x08;
}
void rechtdoor() /* functie voor het rechtdoor rijden*/
{
PORTB=0xC0;
_delay_ms(100);
}
void tegenstander()
{
}
//-----------einde van de functies--------------//
//-----------Begin hoofdprogramma--------------//
for(;;) /* loopje voor hoofdprogramma, dit gaat vooreeuwig.*/
{
input=PINC; /* schrijf de waarde van PINC in de variabele input.*/
input2=PIND; /* schrijf de waarde van PIND in de variabele input2.*/
if(input2==0x01) /* stel 0x01 betekent dat je een lijn detecteert.*/
{
lijndetectie(); /* spring naar de funtie lijn detectie.*/
}
if(input2==0x02)
{
lijndetectie1();
}
if(input2==0x04)
{
lijndetectie2();
}
if(input==0x01) /* stel 0x02 betekent dat je je tegenstander ziet.*/
{
tegenstander(); /* spring naar de funtie tegenstander.*/
}
else
{
rechtdoor(); /* spring naar de funtie rechtdoor rijden.*/
}
} /* sluit de for loop af, hij begint weer bij for(;;) .*/
return 0;
}
De lijn sensoren zitten verboden met normale pins maar ook via een OR poort op de microcontroller. Deze or port komt op het interrupt gedeelte in het script. maar dat is momenteel niet belangrijk. Ik wil graag weten hoe ik het beste de wielen kan sturen in dit script.
Als die de lijn ziet (void lijndetectie , lijndetectie 1, lijndetectie 2) moet hij bij de lijn weg draaien. Maar als de 2de microcontroller door geeft onder welke hoek de andere robot zich bevind moet (void tegenstander) hier op reageren en richting deze robot sturen.
Kan iemand a.u.b. me hierbij helpen.
alvast dank,
noone
483726095 / Een foto zegt meer dan 1000 woorden.
maak een schema met alle voorkomende situaties, en bedenk dan hoe de robot er op moet reageren. en hoe ziet hij de tegenstander? (wat voor data krijgt hij binnen?
voor het draaien kun je naar een rupsvoertuig kijken
1) linksom: rechts vooruit of links achteruit
2) rechtsom: links vooruit of rechts achteruit
3) draaien op de plaats linksom: rechts vooruit en links achteruit
4) draaien op de plaats rechtsom: links vooruit en rechts achteruit.De wielen draaien in hun as. net als de wielen van een auto sturen. alleen deze wielen kunnen 90 graden draaien. Dus een rups voertuig werkt hier niet.
hij moet gaan voor:
1) kijken in welke hoek de wielen momenteel staan
2) kijken hoeveel graden de wielen moeten draaien om de richting van de tegenstander aan te nemen
3) de kortste draaihoek pakken.
4) nieuwe hoek van de wielen opslaan[Bericht gewijzigd door Henry S. op (41%)]
noone
483726095 / Een foto zegt meer dan 1000 woorden.
Een sumo robot met een afstand sensor er op, die de tegenstander detecteert. het is duidelijk te vinden op http://subobv.nl
ik moest meteen m'n anti-wagenziek pilletjes innemen.
ik begrijp dat de wielen allemaal dezelfde kant op wijzen, maar kunnen ze maar 90o draaien? welke hardware heb je voor het detecteren van de stand van de wielen?
dan even in het goede topic:
is het de bedoeling dat hij niet reageert als beide lijndetectoren iets oppikken?
nu heb je dit:
if(input2==0x01)
doet iets
en dan:
if(input2==0x02)
doe iets
als de input nu 0x03 is slaat hij ze beide over.
Heb je dit programmeren op school geleerd of had je zelf al voorkennis. in het geval van de eerste zijn ze al flink vooruit gegaan sinds vorig jaar (toen deed ik hetzelfde project op windesheim)
edit:
ik zie overigens ook wel bekende gezichten op die site
ja, dit is wat ik in 3 maand geleerd heb.
dus het is nog allemaal nieuw en wat onwennig. maar met de tips kom ik steeds verder
vergeleken met wat ik vorig jaar kreeg is er een stuk beter les gegeven op het gebied van programmeren.
welke docent gaf het?