Torrentula
04.08.2011, 20:57
Hallo ich bin es mal wieder!
Ich bin gerade dabei meinen Roboter zu programmieren. Das Mainboard ist das RN-Control mit Mega32 und als Hilfs-µC verwende ich einen ATmega8 beide laufen bei 16MHz. Beide sitzen auf dem Chassis des Robby RP5 von Conrad. Der ATmega8 liest periodisch den SRF05 aus und der Mega32 holt sich über I2C die Daten beim ATmega8 ab. Die Datenübertragung funktioniert, das habe ich bereits getestet. Wenn ich nun den Mega32 die Entfernung verarbeiten lasse und daraufhin die Motoren ansteuern lassen will, drehen die Motoren nur in kurzen "schüben".
Solange der Abstand zu einem Objekt mehr als 50cm beträgt, rollt der Roboter einfach weiter geradeaus. Wenn der SRF05 ein Hindernis in weniger als 50cm Entfernung erkennt, bremst der Roboter ab, fährt zurück, dreht sich ein kurzes Stück nach links und fährt wieder vorwärts los.
Die Software treibt mich schon den ganzen Tag in den Wahnsinn und hoffe, dass andere vielleicht einen simplen Fehler entdeckt, den ich einfach nicht finde...
#include <avr/io.h>
#include <util/delay.h>
#include "twimaster.c"
#include "rncontrol.h"
uint8_t data = 0;
void getDistance(void){
i2c_start_wait(0x50+I2C_WRITE);
i2c_write(0xB8);
i2c_stop();
i2c_rep_start(0x50+I2C_READ);
data = i2c_readNak();
i2c_stop();
data += 1;
}
void accelerate(void){
Mrechtsvor();
Mlinksvor();
for(uint8_t i = 0; i <= 200; i += 10){
setPWMlinks(i);
setPWMrechts(i);
_delay_ms(20);
}
setPWMlinks(200);
setPWMrechts(200);
}
void slowdown(void){
for(uint8_t i = 200; i >= 0; i -= 10){
setPWMlinks(i);
setPWMrechts(i);
_delay_ms(20);
}
setPWMlinks(0);
setPWMrechts(0);
Mlinksstop();
Mrechtsstop();
}
void goBack(void){
Mrechtszur();
Mlinkszur();
for(uint8_t i = 0; i <= 200; i += 10){
setPWMlinks(i);
setPWMrechts(i);
_delay_ms(20);
}
setPWMlinks(200);
setPWMrechts(200);
_delay_ms(1000);
for(uint8_t i = 200; i >= 0; i -= 10){
setPWMlinks(i);
setPWMrechts(i);
_delay_ms(20);
}
Mlinksstop();
Mrechtsstop();
}
void leftTurn(void){
// Turn a bit
Mlinkszur();
Mrechtsvor();
for(uint8_t i = 0; i <= 200; i += 10){
setPWMlinks(i);
setPWMrechts(i);
_delay_ms(20);
}
setPWMlinks(200);
setPWMrechts(200);
while(data <= 50){
getDistance();
}
for(uint8_t i = 200; i >= 0; i -= 10){
setPWMlinks(i);
setPWMrechts(i);
_delay_ms(20);
}
setPWMlinks(0);
setPWMrechts(0);
Mlinksstop();
Mrechtsstop();
accelerate();
}
int main(void)
{
i2c_init();
init_timer1();
DDRB |= 0x03; // Channels for right motor
DDRC |= 0xC0; // Channels for left motor
DDRD |= 0x30; // PWM-Channels for motors
accelerate();
while(1)
{
getDistance();
while(data > 50){
// Just wait
getDistance();
}
slowdown();
goBack();
leftTurn();
}
}
MfG Torrentula
Ich bin gerade dabei meinen Roboter zu programmieren. Das Mainboard ist das RN-Control mit Mega32 und als Hilfs-µC verwende ich einen ATmega8 beide laufen bei 16MHz. Beide sitzen auf dem Chassis des Robby RP5 von Conrad. Der ATmega8 liest periodisch den SRF05 aus und der Mega32 holt sich über I2C die Daten beim ATmega8 ab. Die Datenübertragung funktioniert, das habe ich bereits getestet. Wenn ich nun den Mega32 die Entfernung verarbeiten lasse und daraufhin die Motoren ansteuern lassen will, drehen die Motoren nur in kurzen "schüben".
Solange der Abstand zu einem Objekt mehr als 50cm beträgt, rollt der Roboter einfach weiter geradeaus. Wenn der SRF05 ein Hindernis in weniger als 50cm Entfernung erkennt, bremst der Roboter ab, fährt zurück, dreht sich ein kurzes Stück nach links und fährt wieder vorwärts los.
Die Software treibt mich schon den ganzen Tag in den Wahnsinn und hoffe, dass andere vielleicht einen simplen Fehler entdeckt, den ich einfach nicht finde...
#include <avr/io.h>
#include <util/delay.h>
#include "twimaster.c"
#include "rncontrol.h"
uint8_t data = 0;
void getDistance(void){
i2c_start_wait(0x50+I2C_WRITE);
i2c_write(0xB8);
i2c_stop();
i2c_rep_start(0x50+I2C_READ);
data = i2c_readNak();
i2c_stop();
data += 1;
}
void accelerate(void){
Mrechtsvor();
Mlinksvor();
for(uint8_t i = 0; i <= 200; i += 10){
setPWMlinks(i);
setPWMrechts(i);
_delay_ms(20);
}
setPWMlinks(200);
setPWMrechts(200);
}
void slowdown(void){
for(uint8_t i = 200; i >= 0; i -= 10){
setPWMlinks(i);
setPWMrechts(i);
_delay_ms(20);
}
setPWMlinks(0);
setPWMrechts(0);
Mlinksstop();
Mrechtsstop();
}
void goBack(void){
Mrechtszur();
Mlinkszur();
for(uint8_t i = 0; i <= 200; i += 10){
setPWMlinks(i);
setPWMrechts(i);
_delay_ms(20);
}
setPWMlinks(200);
setPWMrechts(200);
_delay_ms(1000);
for(uint8_t i = 200; i >= 0; i -= 10){
setPWMlinks(i);
setPWMrechts(i);
_delay_ms(20);
}
Mlinksstop();
Mrechtsstop();
}
void leftTurn(void){
// Turn a bit
Mlinkszur();
Mrechtsvor();
for(uint8_t i = 0; i <= 200; i += 10){
setPWMlinks(i);
setPWMrechts(i);
_delay_ms(20);
}
setPWMlinks(200);
setPWMrechts(200);
while(data <= 50){
getDistance();
}
for(uint8_t i = 200; i >= 0; i -= 10){
setPWMlinks(i);
setPWMrechts(i);
_delay_ms(20);
}
setPWMlinks(0);
setPWMrechts(0);
Mlinksstop();
Mrechtsstop();
accelerate();
}
int main(void)
{
i2c_init();
init_timer1();
DDRB |= 0x03; // Channels for right motor
DDRC |= 0xC0; // Channels for left motor
DDRD |= 0x30; // PWM-Channels for motors
accelerate();
while(1)
{
getDistance();
while(data > 50){
// Just wait
getDistance();
}
slowdown();
goBack();
leftTurn();
}
}
MfG Torrentula