Hallo
So die Motoren gehn jetzt ,hab die Fahrtenrgler über ADC0-ADC1 angeschlossen.
Aber leider drehn sich die räder gegengesätzt, aber wie schon gesagt ich bin absolut neu was das alles betrieft. Kann mir wehr helfen mit dem Programm
Druckbare Version
Hallo
So die Motoren gehn jetzt ,hab die Fahrtenrgler über ADC0-ADC1 angeschlossen.
Aber leider drehn sich die räder gegengesätzt, aber wie schon gesagt ich bin absolut neu was das alles betrieft. Kann mir wehr helfen mit dem Programm
]Hallo
So die Motoren gehn jetzt ,hab die Fahrtenrgler über ADC0-ADC1 angeschlossen.
Aber leider drehn sich die räder gegengesätzt, aber wie schon gesagt ich bin absolut neu was das alles betrieft. Kann mir wehr helfen mit dem Programm.
}Code:#include "RP6RobotBaseLib.h"
uint8_t i;
int main(void)
{
initRobotBase();
DDRA |= 1;
DDRA |= 2;
while(true)
{
for(i=1;i<100; i++)
{
PORTA |= 1;
sleep(20);
PORTA &= ~1;
sleep(10-1);
PORTA |= 2;
sleep(20);
PORTA &= ~2;
sleep(10-2);
}
}
return(0);
}
Vorschlag: Einen Motor umpolen?Zitat:
Aber leider drehn sich die räder gegengesätzt,...
Gruß Dirk
Hallo
Ich habe jetzt mal den Motor umgepolt, aber damit ist das Problem leider nur halb behoben, weil der Roboter ja auch mal rückwärts fahren soll.
Ich hab schon viele Sachen an dem Programm Code geändert. Gibts da nicht eine andere Möglichkeit (Programm Code) um vorwärts, rückwärts links und rechts zu Fahren, hab echt schon viele Sachen versucht aber leider ist der Erfolg ausgeblieben, leider. Als kompletter Anfänger ist das nicht ganz so einfach und die Programme für den RP6 sind halte auch alle so geschrieben das der Antrieb über den normalen Ausgang geht ,und die was im Roboternetz Forum zu finden sind, sind so geschrieben, dass sie Servos Ansteuern und den Programm Code den ich da habe von mic geht echt super aber nur in eine Richtung.
Ähm, Einspruch, SO geht das eher gar nicht. Mein Code ist hier mehr schlecht als recht kopiert. Damit erzeugst du nur irgendwelchen Impulsmüll den der Regler nicht interpretieren kann. Auch mit der einfachen Sleep()-Ansteuerung muss man sich an das Timeing der Servos halten:Zitat:
...den Programm Code den ich da habe von mic geht echt super ...
Code:PORTA |= 1;
sleep(5);
PORTA &= ~1;
PORTA |= 2;
sleep(15);
PORTA &= ~2;
sleep(180);
Hey,
also wie du sicher schon irgendwo gelesen hast (falls nicht dann geh hier hin: Servo) wird der servo über die länge des impulses an seine position dirigiert
bei motoren wird es normal über die spannung gemacht, der fahrtenregler übernimmt das aber für dich...
beim servo sind 1ms länge = linker anschlag (oder rechts kA) und 2 ms der andere
bei 1,5 ms steht er in der mitte
bei motoren ist es so, dass der motor bei 1,5 ms stillsteht, alles was drüber (bis maximal 2ms) ist ist vorwärts (oder rückwärts kA; je näher an 2 desto schneller) und alles was drunter ist bis minimal 1 ms ist rückwärts (vgl. drüber)
versuchs also mal so:
ach ja, ich hab mal die for-schleife raus, die war ja unnötig xDCode:#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
DDRA |= 1;
DDRA |= 2;
int x = 12; // 10<=x<=20; wenn x >15 in die eine richtung, x<15 in die andre, x=15 stillstand
while(true)
{
PORTA |= 1;
sleep(x);
PORTA &= ~1;
PORTA |= 2;
sleep(30-x);
PORTA &= ~2;
sleep(170);
}
return(0);
}
LG Pr0gm4n
Hi Paolo,
da hast du ja jetzt ne Menge Möglichkeiten, die Fahrtregler anzusteuern.
Hier kommt noch eine:
Wenn du meine RP6BaseServoLib für 8 Servos aus diesem Beitrag:
https://www.roboternetz.de/phpBB2/ze...ag.php?t=45180
... nehmen willst, dann hier eine Demo dafür zur Ansteuerung eines Fahrtreglers an der Status LED 1:
Die Änderungen für 2 Fahrtregler an ADC0/1 im Programm und in der Lib sind einfach und werden in der Lib beschrieben.Code:/*
* ****************************************************************************
* RP6 ROBOT SYSTEM - ROBOT BASE TESTS
* ****************************************************************************
* Test: Servo Test 2
* Author(s): Dirk
* ****************************************************************************
* Description:
* This is a small test for the RP6 Base Servo Library for the RP6 ROBOT BASE.
*
* COMMENT: It is a good idea to use a separate power supply for the servos!
*
* Servo connections:
* SERVO1 -> Status LED 1 (SL1) SERVO5 -> Status LED 5 (SL5)
* SERVO2 -> Status LED 2 (SL2) SERVO6 -> Status LED 6 (SL6)
* SERVO3 -> Status LED 3 (SL3) SERVO7 -> PC0 (I2C bus: SCL)
* SERVO4 -> Status LED 4 (SL4) SERVO8 -> PC1 (I2C bus: SDA)
* If you want to use the RP6 bumpers in your program, you should not
* connect servos to SL3 and SL6.
* It is not possible to use the I2C bus, if servos are connected to SCL
* and/or SDA. Instead of SCL/SDA you could use ADC0/ADC1 for servo 7/8,
* if you want to use the I2C bus.
*
* ############################################################################
* The Robot does NOT move in this example! You can simply put it on a table
* next to your PC and you should connect it to the PC via the USB Interface!
* ############################################################################
* ****************************************************************************
*/
/*****************************************************************************/
// Includes:
#include "RP6BaseServoLib.h" // The RP6 Base Servo Library.
/*****************************************************************************/
// Defines:
#define MOTOR_FORWARD_FULL RIGHT_TOUCH
#define MOTOR_FORWARD_HALF (MIDDLE_POSITION / 2 + MIDDLE_POSITION)
#define MOTOR_STOP MIDDLE_POSITION
#define MOTOR_BACK_HALF (MIDDLE_POSITION / 2)
#define MOTOR_BACK_FULL 0
/*****************************************************************************/
// Variables:
uint16_t pos = 0;
/*****************************************************************************/
// Functions:
/*****************************************************************************/
// Main function - The program starts here:
int main(void)
{
initRobotBase(); // Always call this first! The Processor will not work
// correctly otherwise.
// ---------------------------------------
// Write messages to the Serial Interface:
writeString_P("\n\n _______________________\n");
writeString_P(" \\| RP6 ROBOT SYSTEM |/\n");
writeString_P(" \\_-_-_-_-_-_-_-_-_-_/\n\n");
writeString_P("################\n");
writeString_P("<<RP6 Base>>\n");
writeString_P(" Servo - Test 2 \n");
writeString_P(" Version 1.00 \n");
writeString_P("################\n\n");
mSleep(2500);
setLEDs(0b111111); // Turn all LEDs on
mSleep(500); // delay 500ms
// Initialize the servo lib for use of only servo 1:
initSERVO(SERVO1);
startStopwatch2(); // Used for the demo
pos = 2; // Start with motor stopped
servo1_position = MOTOR_STOP;
while(true)
{
// ---------------------------------------------------------------------
// The demo code for positioning a drive controller (servo 1):
if (getStopwatch2() > 5000) { // Change position every ~5s
if (pos == 0) {
servo1_position = MOTOR_BACK_FULL;}
if (pos == 1) {
servo1_position = MOTOR_BACK_HALF;}
if (pos == 2) {
servo1_position = MOTOR_STOP;}
if (pos == 3) {
servo1_position = MOTOR_FORWARD_HALF;}
if (pos == 4) {
servo1_position = MOTOR_FORWARD_FULL;}
if (pos == 5) {
servo1_position = MOTOR_FORWARD_HALF;}
if (pos == 6) {
servo1_position = MOTOR_STOP;}
if (pos == 7) {
servo1_position = MOTOR_BACK_HALF;}
pos++;
if (pos > 7) {pos = 0;}
setStopwatch2(0);
}
// ---------------------------------------------------------------------
task_SERVO(); // The main servo task
task_RP6System();
}
return 0;
}
/******************************************************************************
* Additional info
* ****************************************************************************
* Changelog:
* - v. 1.0 (initial release) 08.03.2009 by Dirk
*
* ****************************************************************************
*/
/*****************************************************************************/
Die Demo steuert den Motor von Stop auf halbe Kraft vorwärts, volle Kraft vorwärts, wieder halbe Kraft, Stop, halbe Kraft rückwärts, volle Kraft rückwärts, usw. Jede Stellung wird 5 Sekunden gehalten.
Gruß Dirk
Hi,
also Dirk, ich erkenn da nen kleinen fehler:
ich nehm mal an die defines stehen für zeiten...Code:#define MOTOR_FORWARD_HALF (MIDDLE_POSITION / 2 + MIDDLE_POSITION)
da MIDDLE_POSITION ja 1,5 ms sind gäbe MOTOR_FORWARD_HALF ja dann 1,5/2 + 1,5 = 2,25
der impuls darf aber bloß 2 ms lang sein, also warum machst du's so und nicht über (MIDDLE_POSITION - 1)/2 + (MIDDLE_POSITION - 1) ?
(oder hab ich mich getäuscht und middle_position ist bei dir nur 0,5 ms und du addest jedes mal unabhänig vom wert eine ms? ich hab die lib leider ned vorliegen, ich hol se mir gleich und guck nochmal nach :-D)
LG Pr0gm4n
Hi Pr0gm4n,
Danke für den Hinweis!
Bei meinen Libs nehme ich immer Werte für die Servoposition von 0 (linker Anschlag) bis Maximum, z.B. 254 (rechter Anschlag).
MIDDLE_POSITION (= MOTOR_STOP) ist dann 127 und RIGHT_TOUCH (= MOTOR_FORWARD_FULL) ist 254.
Dann ist MOTOR_FORWARD_HALF = 127 / 2 + 127 = 191 (3/4 Servoweg).
MOTOR_BACK_HALF = 127 / 2 = 64 (1/4 Servoweg).
Aber du hast Recht: Wahrscheinlich wird der Fahrtregler keine lineare Abhängigkeit der Motorgeschwindigkeit von der Impulslänge haben, so dass man die halben Geschwindigkeiten noch "eichen" müßte.
Gruß Dirk
Hi,
doch, der fahrtenregler hat da eine lineare abhängigkeit, zwar nicht von motorgeschwindigkeit und impulslänge sondern von stromfluss ~ (impulslänge - 1ms)
LG Pr0gm4n