PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mein erster Roboter



Franky55555
05.04.2009, 19:03
Hi!



Mein erster Roboter ist fast fertig und da dachte ich mir, ich stelle ihn hier mal rein. Der Roboter war als Projekt zum Einstieg in die Welt der Mikrocontroller gedacht.

Er ist 22*17cm groß und Besteht größtenteils aus Alu-Platten und Schrauben. Als Antrieb sind 2 fertige Getriebemotor-Module von der Firma Winkler Schulbedarf verbaut. Die Stromversorgung besteht aus 4 AA-Batterien die so verschaltet sind dass 3V herauskommen (für die Motoren), und aus einer 9VBatterie+5V Spannungsregler für den µC.

Als Mikrocontroller ist ein Atmega 8 verbaut und die Motoren werden über 2 H-Brücken angesteuert. Er hat vorne vier Microschalter als Kollisionssensoren.

So, jezt Kommen die Bilder:

http://danielfrank.bplaced.net/bilder/Roboter_Bilder/IMG_8887.JPG
Hier sieht man das Chassis (vorne ist ein Stützrad, das man auf dem Bild nicht sieht).

http://danielfrank.bplaced.net/bilder/Roboter_Bilder/IMG_8879.JPG
Diesmal mit aufgesetzter Platine

http://danielfrank.bplaced.net/bilder/Roboter_Bilder/IMG_8881.JPG
Der µC mit 3 Kontroll-Leds und ISP-Anschluss

http://danielfrank.bplaced.net/bilder/Roboter_Bilder/IMG_8882.JPG
Die H-Brücken (Es fehlen bei der einen noch 2 Transistoren)

http://danielfrank.bplaced.net/bilder/Roboter_Bilder/IMG_8883.JPG
Auf diesem Bild sieht man die Anschlüsse zu den Motoren und Batterien, und den Spannnungsregler.

http://danielfrank.bplaced.net/bilder/Roboter_Bilder/IMG_8884.JPG
Die Platine von unten

So, das wars erstmal, aber wenn es Fortschritte gibt, werde ich sie posten.


Und falls ihr anregungen, Kritik, Verbesserungsvorschläge... habt dann bitte Posten!



MfG

NXTbotFreak
06.04.2009, 07:15
Der Robotter sieht wirklich sehr gut aus. Irgndwie erinnerte mich die Aluplatte an meinen AAtis Roboter. Ein Problem wird doch aber sein, dass der Roboter wen er vorne anstößt, beim Rückwärtsfahren hinten gegen eine Wand stößt oder??? :-k

thewulf00
06.04.2009, 08:14
Ja, mir gefällt er auch. Die elektronische Verarbeitung ist ziemlich cool gemacht.

Franky55555
06.04.2009, 11:15
Hi!
Erstmal Danke für das Lob!


Ein Problem wird doch aber sein, dass der Roboter wen er vorne anstößt, beim Rückwärtsfahren hinten gegen eine Wand stößt oder??? :-k
Ja das is ein Problem, aber vllt werde ich hinten auch noch einen Schalter dranbauen.

Der Code ist auch schon fertig:


#define F_CPU 1000000UL

#include <avr/io.h>
#include <util/delay.h>

int x;

//################################################## #############

int main (void)
{
DDRB=0x07;
DDRC=0x0f;
DDRD=0x00;
PORTD=0x0f;

PORTB=0x01; //Led1 ein

while(1)
{
PORTB &= ~(1<<PB3); //Led3 aus
PORTB |= (1<<PB2); //Led2 ein
x=0;
motor_right(1);
motor_left(1);

int taster();

if (x==1) //Schalter rechts außen gedrückt
{
PORTB &= ~(1<<PB2); //Led2 aus
PORTB |= (1<<PB3); //Led3 ein

motor_right(-1);
motor_left(-1);
_delay_ms(1000);
motor_right(1);
_delay_ms(700);
}

if (x==2) //Schalter rechts mitte gedrückt
{
PORTB &= ~(1<<PB2); //Led2 aus
PORTB |= (1<<PB3); //Led3 ein

motor_right (-1);
motor_left (-1);
_delay_ms(1000);
motor_right(1);
_delay_ms(700);


}

if (x==3) //Schalter links mitte gedrückt
{
PORTB &= ~(1<<PB2); //Led2 aus
PORTB |= (1<<PB3); //Led3 ein

motor_right(-1);
motor_left(-1);
_delay_ms(1000);
motor_left(1);
_delay_ms(700);


}

if (x==4) //Schalter links außen gedrückt
{
PORTB &= ~(1<<PB2); //Led2 aus
PORTB |= (1<<PB3); //Led3 ein

motor_right(-1);
motor_left(-1);
_delay_ms(1000);
motor_left(1);
_delay_ms(700);
}

else
{

}
}

return 0;
}

//################################################## #############

int motor_right (int mr) //mr=1=vorwärts mr=0=aus mr=-1=rückwärts
{
if (mr==0)
{
PORTC &= ~( (1<<PC0) | (1<<PC1) ); //Pins PC0 und PC1 "low"
}

if (mr==1)
{
PORTC &= ~(1<<PC1); //PC1 aus
PORTC |= (1<<PC0); //PC0 ein
}

if (mr==-1)
{
PORTC &= ~(1<<PC0); //PC0 aus
PORTC |= (1<<PC1); //PC1 ein
}

return 0;
}

//################################################## #############

int motor_left (int ml) //ml=1=vorwärts ml=0=aus ml=-1=rückwärts
{
if (ml==0)
{
PORTC &= ~( (1<<PC3) | (1<<PC4) ); //Pins PC3 und PC4 "low"
}

if (ml==1)
{
PORTC &= ~(1<<PC4); //PC4 aus
PORTC |= (1<<PC3); //PC3 ein
}

if (ml==-1)
{
PORTC &= ~(1<<PC3); //PC3 aus
PORTC |= (1<<PC4); //PC4 ein
}

return 0;}

//################################################## #############

int taster (void)
{
if (bit_is_clear(PIND,0)) //Schalter rechts außen
{
x=1;
}

if (bit_is_clear(PIND,1)) //Schalter rechts mitte
{
x=2;
}

if (bit_is_clear(PIND,2)) //Schalter links mitte
{
x=3;
}

if (bit_is_clear(PIND,3)) //Schalter links außen
{
x=4;
}

return x;
}


Aber er funktioniert nicht ganz richtig. Ich hab 3 Kontroll-Leds. Eine Leuchtet immer wenn der Controller aktiv ist (das funktioniert auch), die 2 leuchtet wenn er im Forwärts-Fahr-Modus ist (die leuchtet nie, warum?), und eine die dann leuchtet, wenn der Roboter gerade das Ausweichmanöver macht (die leuchtet komischerweise immer, warum?).
Ob der µC die H-Brücken richtig ansteuert, weiß ich noch nicht, aber die H-Brücken selbst funktionieren (die eine nur theoretisch, weil noch Transen fehlen).

Ich hoffe ihr findet den Fehler im Code.


MfG


Edit: Ich hab den Fehler gefunden und ich stelle den Code bald hier rein.

Franky55555
07.04.2009, 19:58
So, das is jetzt der verbesserte Code:



#define F_CPU 1000000UL

#include <avr/io.h>
#include <util/delay.h>

int x;

//################################################## #############

int main (void)
{
DDRB=0x07;
DDRC=0x0f;
DDRD=0x00;
PORTD=0x0f;

PORTB=0x01; //Led1 ein

while(1)
{
PORTB &= ~(1<<PB2); //Led3 aus
PORTB |= (1<<PB1); //Led2 ein
x=0;
motor_right(1);
motor_left(1);

int taster();

if (x==1) //Schalter rechts außen gedrückt
{
PORTB &= ~(1<<PB1); //Led2 aus
PORTB |= (1<<PB2); //Led3 ein

motor_right(-1);
motor_left(-1);
_delay_ms(1000);
motor_right(1);
_delay_ms(700);
}

if (x==2) //Schalter rechts mitte gedrückt
{
PORTB &= ~(1<<PB1); //Led2 aus
PORTB |= (1<<PB2); //Led3 ein

motor_right (-1);
motor_left (-1);
_delay_ms(1000);
motor_right(1);
_delay_ms(700);


}

if (x==3) //Schalter links mitte gedrückt
{
PORTB &= ~(1<<PB1); //Led2 aus
PORTB |= (1<<PB2); //Led3 ein

motor_right(-1);
motor_left(-1);
_delay_ms(1000);
motor_left(1);
_delay_ms(700);


}

if (x==4) //Schalter links außen gedrückt
{
PORTB &= ~(1<<PB1); //Led2 aus
PORTB |= (1<<PB2); //Led3 ein

motor_right(-1);
motor_left(-1);
_delay_ms(1000);
motor_left(1);
_delay_ms(700);
}

else
{

}
}

return 0;
}

//################################################## #############

int motor_right (int mr) //mr=1=vorwärts mr=0=aus mr=-1=rückwärts
{
if (mr==0)
{
PORTC &= ~( (1<<PC0) | (1<<PC1) ); //Pins PC0 und PC1 "low"
}

if (mr==1)
{
PORTC &= ~(1<<PC1); //PC1 aus
PORTC |= (1<<PC0); //PC0 ein
}

if (mr==-1)
{
PORTC &= ~(1<<PC0); //PC0 aus
PORTC |= (1<<PC1); //PC1 ein
}

return 0;
}

//################################################## #############

int motor_left (int ml) //ml=1=vorwärts ml=0=aus ml=-1=rückwärts
{
if (ml==0)
{
PORTC &= ~( (1<<PC3) | (1<<PC4) ); //Pins PC3 und PC4 "low"
}

if (ml==1)
{
PORTC &= ~(1<<PC4); //PC4 aus
PORTC |= (1<<PC3); //PC3 ein
}

if (ml==-1)
{
PORTC &= ~(1<<PC3); //PC3 aus
PORTC |= (1<<PC4); //PC4 ein
}

return 0;}

//################################################## #############

int taster (void)
{
if (bit_is_clear(PIND,0)) //Schalter rechts außen
{
x=1;
}

if (bit_is_clear(PIND,1)) //Schalter rechts mitte
{
x=2;
}

if (bit_is_clear(PIND,2)) //Schalter links mitte
{
x=3;
}

if (bit_is_clear(PIND,3)) //Schalter links außen
{
x=4;
}

return x;
}



Jetzt leuchten die ersten 2 Leds aber die dritte nach dem Tastendruck nicht. d.h. er erkennt den Tastendruck nicht. Warum? Die Taster sind an den Pins 2-5 angeschlossen und sie sziehen die Pins nach Masse.

Ich hoffe ihr könnt mir helfen.


Mit freundlichen Grüßen


Edit:
Den Schaltplan habe ich ja ganz vergessen:
http://danielfrank.bplaced.net/bilder/Roboter_Bilder/roboter.png