PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bumper / ACS Fehlfunktion



Dasive
26.12.2010, 10:41
Hallo liebe User

Ich habe am 24. einen RP6 bekommen O:) und schon mal mit dem Code herumexperimentiert.
Ich habe gedacht das er am Anfang eifach mal die Status (Die mehrzahl von Status ist doch Status! ...oder?) an das Terminal übermittelt.

Einiges geht schon ganz gut, nur beim Abfragen des Linken Bumpers und vom ACS gibt es Probleme.
Der Linke Bumper scheint immer aktiv zu sein (auch wenn er das nicht ist).
Ausserdem gibt das ACS immer negative Werte aus.

Mein Code dazu:

void Bumper_Zustaende_ausgeben(void){
task_Bumpers();
if(bumper_left)
writeString_P(" Linker Bumper: aktiv ,");
else
writeString_P(" Linker Bumper: inaktiv ,");

if(bumper_right)
writeString_P("Rechter Bumper: aktiv\n");
else
writeString_P("Rechter Bumper: inaktiv\n");
}
void ACS_Zustaende_ausgeben(void){
setACSPwrLow();
task_ACS();
if (obstacle_left == true && obstacle_right == true)
writeString_P(" Hinderniss nahe vorne: ja, ");
else
writeString_P(" Hinderniss nahe vorne: nein, ");

if(obstacle_left == true)
writeString_P("Hinderniss nahe links: ja, ");
else
writeString_P("Hinderniss nahe links: nein, ");

if(obstacle_right == true)
writeString_P("Hinderniss nahe rechts: ja\n");
else
writeString_P("Hinderniss nahe rechts: nein\n");

setACSPwrOff();


Weis nicht genau was ich falsch mache hänge hier schon ne Zeit fest. :(
Wärte nett wenn ihr mir helfen könntet, ist mein erster Post hier. O:)

Mario94
26.12.2010, 10:47
Wär nett wenn du den gesamten Code posten könntest, und nicht nur den Teil mit ACS & Bumper.

Außerdem hab ich das selbe Problem mit dem linken ACS, mein code sieht so aus:

#include "RP6RobotBaseLib.h"

void acsStateChanged(void)
{
if(obstacle_left || obstacle_right)
{
moveAtSpeed(0,0);
move(100,BWD,DIST_CM(10),true);
changeDirection(RIGHT);
move(100,RIGHT,DIST_CM(15),true);
changeDirection(FWD);
moveAtSpeed(100,100);
}
}
int main(void)

{
initRobotBase();
setLEDs(0b111111);
mSleep(1500);
setLEDs(0b000001);
setACSPwrLow();
powerON();
ACS_setStateChangedHandler(acsStateChanged);

{
changeDirection(FWD);
moveAtSpeed(100,100);
}
{
while(true)
task_RP6System();
}
return 0;
}

Dasive
26.12.2010, 10:56
der gesamte code:

#include "RP6RobotBaseLib.h"

void RobotBase_initialisieren (void){
initRobotBase();
writeString_P("RobotBase initialisiert\n");
}

void Motorkomponenten_starten (void){
powerON();
writeString_P("Energie fuer Motorenkomponenten freigegeben\n");
}

void LEDs_pruefen(void){
int LEDs_angeschaltet = 0;
while(LEDs_angeschaltet < 3)
{
statusLEDs.LED1 = true;
statusLEDs.LED4 = true;
updateStatusLEDs();
mSleep(100);
statusLEDs.LED2 = true;
statusLEDs.LED5 = true;
updateStatusLEDs();
mSleep(100);
statusLEDs.LED3 = true;
statusLEDs.LED6 = true;
updateStatusLEDs();
mSleep(100);

statusLEDs.LED1 = false;
statusLEDs.LED4 = false;
updateStatusLEDs();
mSleep(100);
statusLEDs.LED2 = false;
statusLEDs.LED5 = false;
updateStatusLEDs();
mSleep(100);
statusLEDs.LED3 = false;
statusLEDs.LED6 = false;
updateStatusLEDs();
mSleep(100);
LEDs_angeschaltet = LEDs_angeschaltet +1;
}

int Alle_LEDs_angeschaltet = 0;
while(Alle_LEDs_angeschaltet < 3)
{
statusLEDs.LED1 = true;
statusLEDs.LED2 = true;
statusLEDs.LED3 = true;
statusLEDs.LED4 = true;
statusLEDs.LED5 = true;
statusLEDs.LED6 = true;
updateStatusLEDs();
mSleep(100);

statusLEDs.LED1 = false;
statusLEDs.LED2 = false;
statusLEDs.LED3 = false;
statusLEDs.LED4 = false;
statusLEDs.LED5 = false;
statusLEDs.LED6 = false;
updateStatusLEDs();
mSleep(100);
Alle_LEDs_angeschaltet = Alle_LEDs_angeschaltet +1;
}
writeString_P("LEDs geprueft\n");
}

void LED_Zustaende_ausgeben(void){
if(statusLEDs.LED1)
writeString_P(" LED 1: An, ");
else
writeString_P(" LED 1: Aus, ");

if(statusLEDs.LED2)
writeString_P("LED 2: An, ");
else
writeString_P("LED 2: Aus, ");

if(statusLEDs.LED3)
writeString_P("LED 3: An, ");
else
writeString_P("LED 3: Aus, ");

if(statusLEDs.LED4)
writeString_P("LED 4: An, ");
else
writeString_P("LED 4: Aus, ");

if(statusLEDs.LED5)
writeString_P("LED 5: An, ");
else
writeString_P("LED 5: Aus, ");

if(statusLEDs.LED6)
writeString_P("LED 6: An\n");
else
writeString_P("LED 6: Aus\n");
}
void Bumper_Zustaende_ausgeben(void){
task_Bumpers();
if(bumper_left)
writeString_P(" Linker Bumper: aktiv ,");
else
writeString_P(" Linker Bumper: inaktiv ,");

if(bumper_right)
writeString_P("Rechter Bumper: aktiv\n");
else
writeString_P("Rechter Bumper: inaktiv\n");
}
void ACS_Zustaende_ausgeben(void){
setACSPwrLow();
task_ACS();
if (obstacle_left == true && obstacle_right == true)
writeString_P(" Hinderniss nahe vorne: ja, ");
else
writeString_P(" Hinderniss nahe vorne: nein, ");

if(obstacle_left == true)
writeString_P("Hinderniss nahe links: ja, ");
else
writeString_P("Hinderniss nahe links: nein, ");

if(obstacle_right == true)
writeString_P("Hinderniss nahe rechts: ja\n");
else
writeString_P("Hinderniss nahe rechts: nein\n");

mSleep(50);
setACSPwrMed();
task_ACS();
if (obstacle_left == true && obstacle_right == true)
writeString_P(" Hinderniss mittel vorne: ja, ");
else
writeString_P(" Hinderniss mittel vorne: nein, ");

if(obstacle_left == true)
writeString_P("Hinderniss mittel links: ja, ");
else
writeString_P("Hinderniss mittel links: nein, ");

if(obstacle_right == true)
writeString_P("Hinderniss mittel rechts: ja\n");
else
writeString_P("Hinderniss mittel rechts: nein\n");

mSleep(50);
setACSPwrHigh();
task_ACS();
if (obstacle_left == true && obstacle_right == true)
writeString_P(" Hinderniss weit vorne: ja, ");
else
writeString_P(" Hinderniss weit vorne: nein, ");

if(obstacle_left == true)
writeString_P("Hinderniss weit links: ja, ");
else
writeString_P("Hinderniss weit links: nein, ");

if(obstacle_right == true)
writeString_P("Hinderniss weit rechts: ja\n");
else
writeString_P("Hinderniss weit rechts: nein\n");

mSleep(50);
setACSPwrOff();
}
void Zustaende_ausgeben(void){
writeString_P("Zustaende:\n");
LED_Zustaende_ausgeben();
Bumper_Zustaende_ausgeben();
ACS_Zustaende_ausgeben();
}

int main (void)
{
RobotBase_initialisieren();
Motorkomponenten_starten();
LEDs_pruefen();
Zustaende_ausgeben();

return 0;
}

Ich hab wegen der Übersichtlichkeit nur den Teil geschrieben

Mario94
26.12.2010, 10:59
RobotBase_initialisieren();
Motorkomponenten_starten();
LEDs_pruefen();
Zustaende_ausgeben();

Seit wann gibt es Deutsche Worte in der RP6 Libary ?

Dasive
26.12.2010, 11:01
Das sind meine eigegen Funktionsnamen, ich benenne die immer auf Deutsch^^

Geht denn dein Linker Bumper wie gewollt?

Mario94
26.12.2010, 11:04
Ich bin selbst neu auf diesem Gebiet..aber ich bezweifle das du einfach so Deutsche funktionsnamen verwenden kannst.

Ja bei mir funktioniert alles bis auf das linke ACS.
Hier ist mein Code für die Freie Fahrt mit Bumper :

#include "RP6RobotBaseLib.h"

void bumpersStateChanged(void)
{
if(bumper_left || bumper_right)
{
moveAtSpeed(0,0);
move(100,BWD,DIST_CM(10),true);
changeDirection(RIGHT);
move(100,RIGHT,DIST_CM(15),true);
changeDirection(FWD);
moveAtSpeed(70,70);
}
}

int main(void)
{
initRobotBase();
setLEDs(0b111111);
mSleep(1500);
setLEDs(0b000001);

powerON();

BUMPERS_setStateChangedHandler(bumpersStateChanged );


changeDirection(FWD);
moveAtSpeed(70,70);


{
while(true)
task_RP6System();
}
return 0;
}


Damit fährt er gegen etwas, setzt ein stück zurück und fährt nach rechts weiter .

Dasive
26.12.2010, 11:09
Das mit den Funktionsname ist ok.

Ich definiere die Funktion ja vorher mit "void Bumper_Zustaende_ausgeben(void"

Mario94
26.12.2010, 11:15
Ich weiß nicht ob das geht, bin ja selbst neu auf dem Gebiet.
Wird zeit das mal jemand mit etwas mehr Ahnung als ich online kommt ;D


http://www.youtube.com/user/MyRP6?feature=mhum

Hier ist mein YouTube kanal, dort ist ein Video wie mein RP6 mit ACS fährt,
dort sieht man auch wie ich meine Hand links an das ACS halte und nichts passiert. Es funktioniert nur das Rechte.

TrainMen
26.12.2010, 13:27
@Mario94
Versuch doch bitte ein klein wenig von der Programmiersprache C zu verstehen, Bevor Du hier rummüllst. Quellen findest Du im Handbuch, was Du übrigens mal lesen solltest.
Trainmen

Fabian E.
26.12.2010, 16:08
@Mario94
Versuch doch bitte ein klein wenig von der Programmiersprache C zu verstehen, Bevor Du hier rummüllst. Quellen findest Du im Handbuch, was Du übrigens mal lesen solltest.
Trainmen
Ich glaube nicht, das du andere User hier so beschimpfen musst.
Sorry, aber das ist einfach der falsche Ton für so ein Forum.

Zum Thema, ihr testet das ganze nicht zufällig vor einem Bildschirm, oder?
Der kann das ACS nämlich stark stören.

Liebe Grüße,

Fabian

Mario94
26.12.2010, 16:10
Also ich teste es ohne Bildschirm^^
Aber ich glaube mein ACS ist einfach kaputt, leider.
Und das obwohl es gestern noch klappte ( mit ACS links, rechts ging noch nie)
Denn selbst mit dem Selftest Programm zeigt er keine Reaktion ( manchmal "sieht" er mit links etwas).

Dasive
26.12.2010, 16:12
Also ich hab das ganze nochmal überprüft und festgestellt das mein linker Bumper kein Signal auslösen kann?! Woran kann das liege? Hat da jemand Erfahrungen damit?
Die LED6 leuchtet bei Kontakt aber auf...

Mario94
26.12.2010, 16:14
Wie hast du das festgestellt ? Mit Selftest oder mit einem deiner Programme?

Dasive
26.12.2010, 16:33
Miit meinem Programm, dachte da sei die Fehlerchance gering:


#include "RP6RobotBaseLib.h"

void RobotBase_initialisieren (void){
initRobotBase();
writeString_P("RobotBase initialisiert\n");
}

void Motorkomponenten_starten (void){
powerON();
writeString_P("Energie fuer Motorenkomponenten freigegeben\n");
}

void LEDs_pruefen(void){
int LEDs_angeschaltet = 0;
while(LEDs_angeschaltet < 3)
{
statusLEDs.LED1 = true;
statusLEDs.LED4 = true;
updateStatusLEDs();
mSleep(100);
statusLEDs.LED2 = true;
statusLEDs.LED5 = true;
updateStatusLEDs();
mSleep(100);
statusLEDs.LED3 = true;
statusLEDs.LED6 = true;
updateStatusLEDs();
mSleep(100);

statusLEDs.LED1 = false;
statusLEDs.LED4 = false;
updateStatusLEDs();
mSleep(100);
statusLEDs.LED2 = false;
statusLEDs.LED5 = false;
updateStatusLEDs();
mSleep(100);
statusLEDs.LED3 = false;
statusLEDs.LED6 = false;
updateStatusLEDs();
mSleep(100);
LEDs_angeschaltet = LEDs_angeschaltet +1;
}

int Alle_LEDs_angeschaltet = 0;
while(Alle_LEDs_angeschaltet < 3)
{
statusLEDs.LED1 = true;
statusLEDs.LED2 = true;
statusLEDs.LED3 = true;
statusLEDs.LED4 = true;
statusLEDs.LED5 = true;
statusLEDs.LED6 = true;
updateStatusLEDs();
mSleep(100);

statusLEDs.LED1 = false;
statusLEDs.LED2 = false;
statusLEDs.LED3 = false;
statusLEDs.LED4 = false;
statusLEDs.LED5 = false;
statusLEDs.LED6 = false;
updateStatusLEDs();
mSleep(100);
Alle_LEDs_angeschaltet = Alle_LEDs_angeschaltet +1;
}
writeString_P("LEDs geprueft\n");
}

void LED_Zustaende_ausgeben(void){
if(statusLEDs.LED1)
writeString_P(" LED 1: An, ");
else
writeString_P(" LED 1: Aus, ");

if(statusLEDs.LED2)
writeString_P("LED 2: An, ");
else
writeString_P("LED 2: Aus, ");

if(statusLEDs.LED3)
writeString_P("LED 3: An, ");
else
writeString_P("LED 3: Aus, ");

if(statusLEDs.LED4)
writeString_P("LED 4: An, ");
else
writeString_P("LED 4: Aus, ");

if(statusLEDs.LED5)
writeString_P("LED 5: An, ");
else
writeString_P("LED 5: Aus, ");

if(statusLEDs.LED6)
writeString_P("LED 6: An\n");
else
writeString_P("LED 6: Aus\n");
}
void Bumper_Zustaende_ausgeben(void){
task_Bumpers();
if(bumper_left)
writeString_P(" Linker Bumper: aktiv ,");
else
writeString_P(" Linker Bumper: inaktiv ,");

if(bumper_right)
writeString_P("Rechter Bumper: aktiv\n");
else
writeString_P("Rechter Bumper: inaktiv\n");
}
void ACS_Zustaende_ausgeben(void){
setACSPwrLow();
task_ACS();
if (obstacle_left == true && obstacle_right == true)
writeString_P(" Hinderniss nahe vorne: ja, ");
else
writeString_P(" Hinderniss nahe vorne: nein, ");

if(obstacle_left == true)
writeString_P("Hinderniss nahe links: ja, ");
else
writeString_P("Hinderniss nahe links: nein, ");

if(obstacle_right == true)
writeString_P("Hinderniss nahe rechts: ja\n");
else
writeString_P("Hinderniss nahe rechts: nein\n");

mSleep(50);
setACSPwrMed();
task_ACS();
if (obstacle_left == true && obstacle_right == true)
writeString_P(" Hinderniss mittel vorne: ja, ");
else
writeString_P(" Hinderniss mittel vorne: nein, ");

if(obstacle_left == true)
writeString_P("Hinderniss mittel links: ja, ");
else
writeString_P("Hinderniss mittel links: nein, ");

if(obstacle_right == true)
writeString_P("Hinderniss mittel rechts: ja\n");
else
writeString_P("Hinderniss mittel rechts: nein\n");

mSleep(50);
setACSPwrHigh();
task_ACS();
if (obstacle_left == true && obstacle_right == true)
writeString_P(" Hinderniss weit vorne: ja, ");
else
writeString_P(" Hinderniss weit vorne: nein, ");

if(obstacle_left == true)
writeString_P("Hinderniss weit links: ja, ");
else
writeString_P("Hinderniss weit links: nein, ");

if(obstacle_right == true)
writeString_P("Hinderniss weit rechts: ja\n");
else
writeString_P("Hinderniss weit rechts: nein\n");

mSleep(50);
setACSPwrOff();
}
void Zustaende_ausgeben(void){
writeString_P("Zustaende:\n");
LED_Zustaende_ausgeben();
Bumper_Zustaende_ausgeben();
ACS_Zustaende_ausgeben();
}

void Fahre_Rueckwaerts(int Distanz)
{

}
void Bumper_beruehrt(void) {
if (bumper_left == true && bumper_right == true)
{
}
else if(bumper_left)
{
}
else
{
}
}
int main (void)
{
RobotBase_initialisieren();
Motorkomponenten_starten();
LEDs_pruefen();
Zustaende_ausgeben();
BUMPERS_setStateChangedHandler(Bumper_beruehrt);

moveAtSpeed(70,70);

while(true)
{
task_RP6System();
}

return 0;
}

Mario94
26.12.2010, 16:39
Ob da ein Fehler drin ist kann ich nicht genau sagen ( bin ja auch neu auf dem Gebiet ). Versuch einfach mal das Selftest Programm drüber laufen zu lassen. Dadurch siehst du ja ob er wirklich kein Signal zurück gibt.

Fabian E.
26.12.2010, 17:08
Miit meinem Programm, dachte da sei die Fehlerchance gering:


#include "RP6RobotBaseLib.h"

void RobotBase_initialisieren (void){
initRobotBase();
writeString_P("RobotBase initialisiert\n");
}

void Motorkomponenten_starten (void){
powerON();
writeString_P("Energie fuer Motorenkomponenten freigegeben\n");
}

void LEDs_pruefen(void){
int LEDs_angeschaltet = 0;
while(LEDs_angeschaltet < 3)
{
statusLEDs.LED1 = true;
statusLEDs.LED4 = true;
updateStatusLEDs();
mSleep(100);
statusLEDs.LED2 = true;
statusLEDs.LED5 = true;
updateStatusLEDs();
mSleep(100);
statusLEDs.LED3 = true;
statusLEDs.LED6 = true;
updateStatusLEDs();
mSleep(100);

statusLEDs.LED1 = false;
statusLEDs.LED4 = false;
updateStatusLEDs();
mSleep(100);
statusLEDs.LED2 = false;
statusLEDs.LED5 = false;
updateStatusLEDs();
mSleep(100);
statusLEDs.LED3 = false;
statusLEDs.LED6 = false;
updateStatusLEDs();
mSleep(100);
LEDs_angeschaltet = LEDs_angeschaltet +1;
}

int Alle_LEDs_angeschaltet = 0;
while(Alle_LEDs_angeschaltet < 3)
{
statusLEDs.LED1 = true;
statusLEDs.LED2 = true;
statusLEDs.LED3 = true;
statusLEDs.LED4 = true;
statusLEDs.LED5 = true;
statusLEDs.LED6 = true;
updateStatusLEDs();
mSleep(100);

statusLEDs.LED1 = false;
statusLEDs.LED2 = false;
statusLEDs.LED3 = false;
statusLEDs.LED4 = false;
statusLEDs.LED5 = false;
statusLEDs.LED6 = false;
updateStatusLEDs();
mSleep(100);
Alle_LEDs_angeschaltet = Alle_LEDs_angeschaltet +1;
}
writeString_P("LEDs geprueft\n");
}

void LED_Zustaende_ausgeben(void){
if(statusLEDs.LED1)
writeString_P(" LED 1: An, ");
else
writeString_P(" LED 1: Aus, ");

if(statusLEDs.LED2)
writeString_P("LED 2: An, ");
else
writeString_P("LED 2: Aus, ");

if(statusLEDs.LED3)
writeString_P("LED 3: An, ");
else
writeString_P("LED 3: Aus, ");

if(statusLEDs.LED4)
writeString_P("LED 4: An, ");
else
writeString_P("LED 4: Aus, ");

if(statusLEDs.LED5)
writeString_P("LED 5: An, ");
else
writeString_P("LED 5: Aus, ");

if(statusLEDs.LED6)
writeString_P("LED 6: An\n");
else
writeString_P("LED 6: Aus\n");
}
void Bumper_Zustaende_ausgeben(void){
task_Bumpers();
if(bumper_left)
writeString_P(" Linker Bumper: aktiv ,");
else
writeString_P(" Linker Bumper: inaktiv ,");

if(bumper_right)
writeString_P("Rechter Bumper: aktiv\n");
else
writeString_P("Rechter Bumper: inaktiv\n");
}
void ACS_Zustaende_ausgeben(void){
setACSPwrLow();
task_ACS();
if (obstacle_left == true && obstacle_right == true)
writeString_P(" Hinderniss nahe vorne: ja, ");
else
writeString_P(" Hinderniss nahe vorne: nein, ");

if(obstacle_left == true)
writeString_P("Hinderniss nahe links: ja, ");
else
writeString_P("Hinderniss nahe links: nein, ");

if(obstacle_right == true)
writeString_P("Hinderniss nahe rechts: ja\n");
else
writeString_P("Hinderniss nahe rechts: nein\n");

mSleep(50);
setACSPwrMed();
task_ACS();
if (obstacle_left == true && obstacle_right == true)
writeString_P(" Hinderniss mittel vorne: ja, ");
else
writeString_P(" Hinderniss mittel vorne: nein, ");

if(obstacle_left == true)
writeString_P("Hinderniss mittel links: ja, ");
else
writeString_P("Hinderniss mittel links: nein, ");

if(obstacle_right == true)
writeString_P("Hinderniss mittel rechts: ja\n");
else
writeString_P("Hinderniss mittel rechts: nein\n");

mSleep(50);
setACSPwrHigh();
task_ACS();
if (obstacle_left == true && obstacle_right == true)
writeString_P(" Hinderniss weit vorne: ja, ");
else
writeString_P(" Hinderniss weit vorne: nein, ");

if(obstacle_left == true)
writeString_P("Hinderniss weit links: ja, ");
else
writeString_P("Hinderniss weit links: nein, ");

if(obstacle_right == true)
writeString_P("Hinderniss weit rechts: ja\n");
else
writeString_P("Hinderniss weit rechts: nein\n");

mSleep(50);
setACSPwrOff();
}
void Zustaende_ausgeben(void){
writeString_P("Zustaende:\n");
LED_Zustaende_ausgeben();
Bumper_Zustaende_ausgeben();
ACS_Zustaende_ausgeben();
}

void Fahre_Rueckwaerts(int Distanz)
{

}
void Bumper_beruehrt(void) {
if (bumper_left == true && bumper_right == true)
{
}
else if(bumper_left)
{
}
else
{
}
}
int main (void)
{
RobotBase_initialisieren();
Motorkomponenten_starten();
LEDs_pruefen();
Zustaende_ausgeben();
BUMPERS_setStateChangedHandler(Bumper_beruehrt);

moveAtSpeed(70,70);

while(true)
{
task_RP6System();
}

return 0;
}


Folgendes:

Die Funktionen, die aktiv dein ACS und deine Bumper überprüfen werden nur EIN EINZIGES MAL aufgerufen, nämlich direkt bei Start.

Die einzige Funktion die öfters aufgerufen wird ist: bumper_beruehrt.
Allerdings ist diese Funktion quasi leer und macht dementsprechend nichts.

Alles was öfters aufgerufen werden soll, muss in die while(true)-Schleife.

Noch was: Du überprüfst deine Variablen immer auf == true. Das würde ich nicht machen. Du kannst auch einfach so prüfen: if(obstacle_left).
Das ganze hat einen Grund: C kennt true und false nicht, eine bool'sche Variable gibt es nicht.
true und false sind in der Bibliothek vom RP6 definiert, und zwar so:
// Boolean:
#define true 1
#define false 0
#define TRUE 1
#define FALSE 0
Da die Variablen wie obstacle oder bumper aber auch größere Zahlen als 1 annehmen können, falls z.B. der Bumper gedrückt ist, klappt die Abfrage nicht.

Du prüfst dann quasi folgendes:
if(64 ==1)
Das wird natürlich niemals klappen, obwohl der Bumper eigentlich gedrückt war.

Dasive
26.12.2010, 17:15
Der Selbsttest ist auch fehlgeschlagen!

CleanBot
26.12.2010, 17:19
Ich kenne zwar den RP6 nicht aber das riecht evtl. nach eine Konfigurationsproblem:

Bumper-Taster funktionieren normalerweise nach folgendendem Prinzip:
Ein digitaler Eingang wird über einen sogenannten Pull-up-Widerstand, der and der Versorgungsspannung liegt (üblicherweise +5V), auf logisch HIGH geschaltet. Der Bumper-Taster zieht dann bei Betätigung diesen Eingang auf Masse, sprich logisch LOW. Dieser Low-Pegel (oder auch die abfallende Flanke) wird dann vom Mikrocontroller registriert und kann somit per Software verwertet werden.

Der AVR besitzt z.B. interne Pull-up's, die man aber über die Software erst entsprechend aktivieren muss. Möglicherweise ist das hier nicht geschehn?!

Mario94
26.12.2010, 17:20
Würde mich auch mal interessieren was dann noch hilft,
denn ich habe das selbe Problem.

Beim Selftest gehe ich 30 mal mit der Hand nah an den RP6, und dann zeigt er mit vielleicht 2 mal eine reaktion bei links. ( Rechts geht garnicht)

Irgendjemand eine Idee ?

Dasive
26.12.2010, 17:50
CleanBot der linke geht ja!
Weisst du wie ich das machen müsste?

Fabian E.
26.12.2010, 18:26
Also Leute, wenn der unveränderte SelfTest fehlschlägt ist irgendwas mit der Hardware kaputt...
Also umtauschen und dann dran freuen.

Dasive
26.12.2010, 18:36
Könnte es an fast leeren Akkus liegen?

...Akkus laden

Fabian E.
26.12.2010, 18:44
Könnte es an fast leeren Akkus liegen?

Lad sie auf und teste es ;)

Dasive
26.12.2010, 20:07
Die frischen Akkus sind drin, keine Besserung. :(

Dasive
26.12.2010, 21:21
Ich hab mal ein ACS System entworfen, funktioniert überraschend gut :)

Mario94
26.12.2010, 21:25
Wie meinst du das mit entworfen ?

Dasive
27.12.2010, 07:38
Sorry, ich meinte natürlich einfach programmiert. Ich habs jetzt auch nochmal mit dem Bumper verbunden, falls das ACS was übersieht (Halt nur mit dem rechten) und ich glaube es läuft einigermassen gut.

Mario94
27.12.2010, 09:17
Also im Selftest funktioniert dein ACS nicht und mit deinem "entworfenen" geht es ?

Dasive
27.12.2010, 09:21
Das ACS geht einwandfrei, das einzige was nicht funktioniert ist der linke Bumper.

Mario94
27.12.2010, 09:24
Ok, ich dachte dein ACS ging auch nicht.

Dasive
27.12.2010, 09:31
Lag aber an mir...

Mario94
27.12.2010, 09:38
Meins geht immer noch nicht. Wie stellt man fest ob die Akkus voll sind oder nicht ? Kann man das nicht irgendwie im RP6 Loader ablesen ? Entweder liegt es an der Hardware oder die Akkus sind einfach nicht mehr voll geladen.

Dasive
27.12.2010, 10:28
Steht im Loader nicht sowas wie Voltage (bei Status)?
Ich glaube der Wert sollte etwa über 5.5 Volt liegen, Bei meinen 1.5 V * 6 Akkus könnten es 9 V sein, ich hab gerade etwa 7.5.

Und ich kann es an meinem Ladegerät ablesen (Ausserhalb des RP6).

TrainMen
27.12.2010, 10:49
Hi,
Ich glaube @Mario94 ladet über die M32 und da sieht man die Akku Spannung nicht.
und bist Du dir sicher das Deine Akkus 1,5V haben? Akkus haben meist nur 1,2 V.
Nimmst Du Deine Akkus immer aus den RP6 ? Wie lange sollen denn da die 4 Schräubchen halten ? Für was hat denn der RP6 eine Ladebuchse?
Trainmen

SlyD
27.12.2010, 13:20
@Dasive:
Steck mal das Kabel von der Bumperplatine nochmal neu ein word zwar vermutlich nicht daran liegen aber wer weiss.
Hast Du zufällig ein Multimeter zur Verfügung (ein billiges 5 Euro Teil reicht schon)?
Was genau passiert denn im entsprechenden Selfttestprogramm wenn Du beide Bumper 1-2 Sekunden gedrückt hälst?


Der RP6 ist für den Betrieb mit AKKUS entworfen die mit einem externen Ladegerät im eingebauten Zustand geladen werden können wenn der RP6 am Hauptschalter abgeschaltet wurde.

Entsprechende Ladegeräte sind hier:
http://www.arexx.com/rp6/html/de/acc.htm
unten auf der Seite aufgelistet.

ES DARF KEIN NORMALES STECKERNETZTEIL ANGESCHLOSSEN WERDEN!
Es muss ein Akkupack Ladegerät für 6 NiMH Zellen in Serie sein.

Normale Batterien sind aufgrund des hohen Innenwiderstandes übrigens nicht zu empfehlen, genauso wie sehr alte oder schlecht behandelte Akkus.
Die Spannung ist nur ein ANHALTSPUNKT für den Ladezustand des Akkus, bei schlechten Zellen kann die Spannung beim schalten von Verbrauchern kurzzeitig stark einbrechen und so Störungen verursachen (alles können die Kondensatoren auf dem Mainboard auch nicht abfedern).

MfG,
SlyD

PS:
Das man ACS und alle anderen Sensoren zunächst mal mit dem mitgelieferten Selftest programm testen sollte und erst dann im Forum posten habt ihr ja schon selbst rausgefunden ;)