PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst]Bedingung schreiben?



Christian3
22.07.2009, 13:39
Hallo,
ich steuere grade einen joystick mit hilfe von den adc eingangen an.
jetzt will ich den rp6 damit steuern. also links recht vorwärts
und rückwärts. ich habe vorwärts so gemacht das wenn der mess wert von adc1 >als 600 ist fahre vorwärts das klapt ganz gut aber jetzt will ich aber die geschwindig keit regeln können aber ich weiß nicht wie ich eine bedingung schreibe die zwichen zwi werten liegt z.b 500 bis 600 mache ...... und 601 bis 650 mache ..........
könnt ihr mir helfen?
hoffe ich verseht meine frage
LG

Hubert.G
22.07.2009, 15:12
Es kommt darauf an wie du die Geschwindigkeit regelst, machst du das mit PWM? Dann kannst du den ADC-Wert umgerechnet ins OCR-Register schreiben.

Christian3
22.07.2009, 16:17
naja mein code geht so:

if (adc2 <= 10) {
//hier muss dann halt das hin was er tuhen soll wenn die bedingung eintrift.
}
so hier ist der vergleich ob adc2 kleiner als 10 ist ich brauche es aber
größer als 5 und kleiner als 10

Dirk
22.07.2009, 17:22
ich brauche es aber größer als 5 und kleiner als 10
if ((adc2 > 5) && (adc2 < 10)) { ... }

Gruß Dirk

radbruch
22.07.2009, 18:19
Hallo

Ich würde das proportional lösen:

// Steuerung mit Joystick (proportional, vor/zurück) 22.7.09 mic

// Der eingelesen Joystickwert wird auf maximal 210 umgerechnet.
// Um einen Überlauf zu verhindern wird zuerst mit 105 gerechnet
// und das Ergebniss später verdoppelt.

// (Maximaler Ausschlag pro Richtung ist 512, das ergibt 512*105=53760
// und passt so in eine 16Bit-Variable)

#include "RP6RobotBaseLib.h"

#define joy_x_min 0
#define joy_x_max 1023
#define joy_x_mid 511
#define joy_y_min 0
#define joy_y_max 1023
#define joy_y_mid 511

uint8_t speed_l, speed_r;
uint16_t joy_x, joy_y;

int main (void)
{
initRobotBase();
powerON();

while(1)
{
joy_x=readADC(0);
joy_y=readADC(1);

writeInteger(joy_x, 10);
writeChar(':');
writeInteger(joy_y, 10);
writeChar(' ');

if(joy_x > joy_x_mid)
{ // vorwärts
writeChar('F');
setMotorDir(FWD,FWD);
speed_l=speed_r=(joy_x-joy_x_mid)*105/(joy_x_max-joy_x_mid);
}
else
{ // rückwärts
writeChar('B');
setMotorDir(BWD,BWD);
speed_l=speed_r=(joy_x_mid-joy_x)*105/(joy_x_mid-joy_x_min);
}

writeInteger(speed_l*2, 10);
writeChar('\n');

//moveAtSpeed(speed_l*2,speed_r*2);
//task_motionControl();
mSleep(200);
}
return(0);
}
Blöderweise kann ich es nicht testen weil ich erst meine Encoder einstellen muss *knirsch* Wenn das erledigt ist kommt noch das Mischen der Richtung dazu. Das hatte ich schon mal mit einer RC-Anlage gelöst:

http://img.youtube.com/vi/A_GYUeFAgY8/2.jpg (http://www.youtube.com/watch?v=A_GYUeFAgY8)
http://www.youtube.com/watch?v=A_GYUeFAgY8
(Aus https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=328824#328824)

Zur Lösung der eigentlichen Threadfrage: Teile die ADC-Werte ganzzahlig z.b durch 100, dann erhälst du nur einstellige Ergebnisse (0-5). 5 würde dann den Bereich 500-599 abdecken. Oder du teilst durch 50, dann ist z.B. if(x==10)... der Bereich von 500-549, if(x==9)... wäre 450-499 usw.

Gruß

mic

[Edit]Ohne Encoderauswertung funktioniert es zufriedenstellend:
http://i4.ytimg.com/vi/orBghV1S_L4/1.jpg (http://www.youtube.com/watch?v=orBghV1S_L4)
http://www.youtube.com/watch?v=orBghV1S_L4

Christian3
23.07.2009, 20:40
cool Danke euch