PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Erfahrungen und Erfahrungsaustausch mit Arexx Robot-Arm-mini



ralf
11.02.2011, 00:08
Nach der Beschäftigung mit RP6 +M32 leistete ich mir diesen Roboterarm.

1. Das Metallgrundgestell ist stark mit schwarzen Lack bespritzt, so daß es fast unmöglich war, die Gewindeabstandshalter einzudrehen --- etwas mehr Kraft – und KNACK der erste ist abgebrochen ---- Also mit Gewindeschneider die restlichen 3 nachschneiden, aber wer hat schon passende Gewindeschneider ständig vor Ort?

2. Die mitgelieferte CD war zerkratzt (an einer Stelle durchsichtig), trotz vom großen "C" in Berlin mit festem Band verschlossen – war also kein Kunde dran. Es gelang mit trotzdem die Daten auf Festplatte zu übertragen.

3. Nach erheblichen Schwierigkeiten den Arm über den PC anzusprechen (Gerät nicht erkannt, und wenn zufällig doch --- war kein Programm ladbar ---falsche Id ....) gelangt es mir trotzdem, aber ein Servo arbeitete nicht ---- Ursache nachdem ich alle Servos mit einem Tester überprüft hatte ----ein Verlängerungskabel war defekt. Also Anschluß abgeschnitten und neuen Stecker angelötet.

4. Im Testprogramm mit der "Tastatur" funktionierte eine Taste nicht (Servo6 UP).
Nachdem ich das Programm umgeschrieben habe und die Funktion auf eine andere Taste umgelegt hatte, konnte ich erleichtert feststellen, daß zumindest der Port i.O. ist.
Die Fehlersuche auf der Tastatur ergab, daß die Diode D9 auf der einen Seite nicht angelötet war. Nun geht es, bis zum nächsten Fehler :-)))

Nachdem ich tagelang für die "Inbetriebnahme" gebraucht habe, ist es doch ein sehr interessantes Gerät.

Gibt es hier jemanden, der kein "Montagsgerät aus Hinter-China" erwischt hat, und schon eigene Programme für den Arm vielleicht in Verbindung mit dem RP6 geschrieben hat ?

Es gibt ja leider kein eigenes Forum für den Arm.

Bin noch nicht tiefer eingestiegen, da ich fast nur mit der Fehlerbehebung beschäftigt war, daher noch eine Frage:

Es gibt ja für mini und den teuren Metallarm auf der CD zwei verschiedene Programmverzeichnisse, obwohl die Elektronicplatine mit dem µProzessor scheinbar gleicht ist. Wo ist der Unterschied ??

o.k viele Fragen , aber wo ist man besser aufgehoben, als im roboternetz?

Ralf

Dirk
11.02.2011, 19:41
Hallo Ralf,

da will ich mich gern beteiligen:

1. Beim Auspacken fiel auf, dass der Beutel der Hauptplatine auf der Lötseite an einer Stelle durchgescheuert war, da lagen auch 2 Leiterbahnen blank (d.h. ohne Lötstoplack). Durchgemessen: Leiterbahnen noch ok, mit Schutzlack nachlackiert.

2. In der Tüte der Tastatur lag eine halbe Diode 4148. Das war D12, die mechanisch (wohl im Karton) einseitig abgebrochen war. Neue SMD-Diode eingelötet (Problem: Die eine Lötfläche war mit abgerissen, so dass ich da tricksen mußte).

3. Aufbau: Auch bei mir war das Grundgestell dick schwarz lackiert. Die Abstandhalter für die Hauptplatine konnte man bei 2 Löchern nicht eindrehen, so dass ich mit M3 Stahlschrauben vorgedreht habe. Trotzdem ist dann ein Gewinde eines Abstandhalters abgebrochen. Ich konnte eine M3 Mutter auf beide "Stummel" setzen, so dass das auch so hält.

4. Es gibt (zu) viele Sorten von Schrauben, die man sich sorgfältig vorsortieren muss, um hinterher nicht durcheinander zu kommen.

5. Der mechanische Aufbau des Arms gelang erstaunlich gut, keine wesentlichen Probleme. Er ist auch recht gut beschrieben. Es gibt ein paar Hürden, wo man sich etwas mehr Hilfe von der Anleitung wünschen würde:
- Montage Bodenservo: Es fehlt ein Hinweis, dass man die Mittelstellung des Bodenservos später nur noch mechanisch ändern kann, wenn man umständlich den Maxi-Servohalter öffnet und das Maxi-Servo wieder entfernt. Überhaupt sollte noch deutlicher erwähnt werden, dass man die Servos in Mittelstellung montieren muss.
- Scheibe mit Achse: Die Schraube M3x8 ließ sich bei mir nur extrem schwer in die Scheibe eindrehen. Ich habe das Loch bei allen Scheiben leicht aufgeweitet.
- Montage Doppelservohalter: In den Zeichnungen sieht es so aus, dass das Loch im Doppelservohalter (Kabelauslaß) oben beim Handgelenk liegt. Dann sind aber die Kabel zu kurz, so dass ich den Halter umgekehrt montiert habe.
- Verkabelung (S. 19/20): Es ist nicht sofort erkennbar, welches Servo 1 und welches 6 ist. Ich bin dann erst im Kapitel 7.2 RACS-Verbindungsaufbau, Abbildung 2, darauf gestoßen, das der "gripper" Servo 1 ist.
- Servo-Kabellänge: Ich finde: Ziemlich knapp. Ich habe mir noch 2 kurze Verlängerungskabel geleistet.

6. Die Software-Installation klappte bei mir gut (auch durch den RP6 schon geübt!). Bei mir auch zunächst eine falsche ID, die ich nur durch Installation eines anderen RobotLoaders wegbekommen konnte.

7. Tastatur-Test: Trotz meiner Reparatur der Tastatur (siehe 2.) funktionierten einzelne Tasten nicht. Durchmessen: Beim Tastaturkabel war ein Stecker so schräg aufgequetscht, dass 1 Ader keinen Kontakt bekam. Reparatur: Neuen Stecker aufgequetscht. Danach: Funktion der Tastatur ok.

Materialeinsatz bis hier:
- SMD Diode LL4148
- Schutzlack
- M3-Stahlschrauben, M3-Mutter
- 2 Servo-Verlängerungskabel
- Quetschstecker 8-pol für Tastaturkabel
- Ein bißchen Lötzinn und Kleinigkeiten

8. Programme und Library:
Nur sehr basale Demos. In der Library Fehler bei ...
- Port-Initialisierung PortC, E, G
- Zu niedriger ADC Vorteiler
- Für den Beeper wird PWM benutzt. Besser wäre eine echte Frequenzerzeugung (z.B. mit CTC), wenn man "Musik" machen will.
Lösung: Habe die Library angepaßt an meine Bedürfnisse.

Jetzt kanns losgehen ...

Gruß Dirk

ralf
15.02.2011, 21:31
Hallo Dirk,
deine Probleme signatisieren mir, daß ich nicht ganz allein dastehe.
Ich habe es jetzt auch hinbekommen, den Arm mit der Loader-Software vom RP6 zu kombinieren.
Der Loader vom Arm brachte fast nur Fehler, brauchte 2 Rechner.
Wie sieht es bei dir mit " ID nicht erkannt" aus ?

Ich habe festgestellt, daß der Arm sich schlecht "resetten" läßt, d.h. es wird sofort das Programm im
µP gestartet. Damit ist das Loaderprogramm nicht aktiv und der µP über serielle Schnittstelle nicht
erreichbar.
Durch schnelles Drücken der Reset/Start-Taster komme ich jetzt doch rein ---ist aber nicht normal.
Beim RP6 klappt das problemlos ---- ist ja fast das gleiche System.
Vom Schaltplan ist RP6 und ARM fast gleich ---Resettaste ----ich dachte schon an Kontaktprellen---
aber der Sofortstart beim einschalten ist der Taster noch garnicht betätigt ?????
Daher bin ich etwas ratlos , ist ja fast der gleiche µP wie M32 (32 / 64).

Kannst du bei deinen erkannten Library Fehlern etwas genauer werden, ehe ich auch darauf reinfalle ?

es soll jetzt bei mir auch endlich losgen, ohne viel Fehlersuche

Ralf

Dirk
16.02.2011, 18:09
Hallo Ralf,

Wie sieht es bei dir mit " ID nicht erkannt" aus ?
Das hatte sich nach Neuinstallation des Loaders erledigt.


Ich habe festgestellt, daß der Arm sich schlecht "resetten" läßt, ...
Ja, das habe ich auch bemerkt. Vor allem betrifft das bei mir die Demos, die die Tastatur benutzen.
Eine Erklärung habe ich (noch) nicht. Das Prellen des Reset Tasters kann keine Rolle spielen, weil das (Software-)Reset aus dem Loader ja auch nicht funktioniert.

Gruß Dirk

radbruch
17.02.2011, 16:56
Hallo

Ich habe auch einen RA2, gesponsert von arexx. Es handelt sich allerdings um ein Versuchsgerät das teilweise nicht dem Auslieferstand entspricht. Da ich den Arm eh nach eigenen Vorstellungen zusammengebaut habe, kann ich zu den mechanischen Mängeln nichts sagen. Das ID-Problem hatte ich auch mit der Installation das aktuellen Loaders gelöst. Das Resetproblem umgehe ich mit einer langen Pause beim Programmstart. Erst nach dieser Pause aktiviere ich die Servos, weil ich den Verdacht habe, dass der Start der Servos erneut einen Reset auslöst. Flashprobleme treten bei mir nicht mehr auf, seit ich das Board mit 4X4000mA-Babyzellen versorge. Da mein Arm auf dem RP6 sitzt, habe ich erfolglos versucht, beide mit den Akkus des RP6 zu versorgen. Die nominalen 7,2V sind aber scheinbar zu wenig für den Spannungsregler auf der arm64-Platine. Selbst mit überbrückter D1 hatte das nicht funktioniert. Möglicherweise liegt das aber auch an den Akkus meines RP6, es ist immer noch der erste Satz den ich gnadenlos mit mit einem Steckernetzteil über Nacht nachlade ;)

Leider habe ich noch nicht viel damit angestellt. Mein Hauptproblem war die fehlende Erfahrung mit I2C. Da ich bisher keine Erweiterungsplatinen hatte, war das völliges Neuland für mich. Erste zaghafte Schritte waren die Anpassung der m32-Lib an das arm64 um den RP6 über I2C und und das RP6-Slave-Demo zu steuern:

// RA2 steuert RP6 1.11.2010 mic

// Das I2C-Masterdemo6 des m32 angepasst an das arm64-Modul.
// Eine Ergänzung in der Abfrage des Keypads ermöglicht gleichzeitige Bewegungen
// aller Servos und des RP6.
// Auf dem RP6 läuft das unveränderte I2C-Slave-Demo.

// Verbindung zwischen RP6-XBUS Pin8(E_INT), Pin10(SCL), Pin12(SDA) und Pin14(GND)
// und IIC Pin 8-14 auf dem arm64. Beide Boards werden getrennt versorgt.

// PollSwitch16() liefert ein 16bit Abbild der Tasten
// scan_keyboard1() liefert die Tastennummer mit geänderter Portabfrage

// Infos zum Portexpander
// http://www.mikrocontroller.net/articles/Port-Expander_PCF8574

#include "RobotArmBaseLib.h"
#include "RP6I2CmasterTWI.h"
#include "RP6Control_I2CMasterLib.h"

#define I2C_RP6_BASE_ADR 10 // The default address of the Slave Controller (RP6)

/************************************************** ***************************/
// I2C Error handler

/**
* This function gets called automatically if there was an I2C Error like
* the slave sent a "not acknowledge" (NACK, error codes e.g. 0x20 or 0x30).
* The most common mistakes are:
* - using the wrong address for the slave
* - slave not active or not connected to the I2C-Bus
* - too fast requests for a slower slave
* Be sure to check this if you get I2C errors!
*/
void I2C_transmissionError(uint8_t errorState)
{
writeString_P("\nI2C ERROR - TWI STATE: 0x");
writeInteger(errorState, HEX);
writeChar('\n');
}


/************************************************** ***************************/
// Motor function

uint8_t transmit_buffer[10]; // temporary transmit buffer
// A global variable saves space on the heap...

#define CMD_ROTATE 8

#define LEFT 2
#define RIGHT 3

/**
* Rotate function - you can define nearly the same functions as you have on
* the RP6 and just forward the commands with I2C Bus transfers...
* We will make an improved version of this and other functions in another example!
*/
void RP6_rotate(uint8_t desired_speed, uint8_t dir, uint16_t angle)
{
transmit_buffer[0] = 0;
transmit_buffer[1] = CMD_ROTATE;
transmit_buffer[2] = desired_speed;
transmit_buffer[3] = dir;
transmit_buffer[4] = ((angle>>8) & 0xFF);
transmit_buffer[5] = (angle & 0xFF);
I2CTWI_transmitBytes(I2C_RP6_BASE_ADR, transmit_buffer, 6 );
}

#define CMD_MOVE 7

#define FWD 0
#define BWD 1

void RP6_move(uint8_t desired_speed, uint8_t dir, uint16_t ticks)
{
transmit_buffer[0] = 0;
transmit_buffer[1] = CMD_MOVE;
transmit_buffer[2] = desired_speed;
transmit_buffer[3] = dir;
transmit_buffer[4] = ((ticks>>8) & 0xFF);
transmit_buffer[5] = (ticks & 0xFF);
I2CTWI_transmitBytes(I2C_RP6_BASE_ADR, transmit_buffer, 6 );
}

/************************************************** ***************************/
// Read all registers function

uint8_t RP6data[32]; // This array will contain all register values of RP6
// after you called readAllRegisters()

// It is better to keep such big arrays GLOBAL as
// they otherwise fill up the stack in memory...

/**
* This function reads ALL registers available in the standard I2C Bus Slave
* Example program for the Robot Base and outputs their values on the serial interface.
* You will see a lot of zeros when the Motors are not running. The main values that are not
* zero are the two Light Sensors and the two free ADC Channels.
*/
void readAllRegisters(void)
{
I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 0); // Start with register 0...
I2CTWI_readBytes(I2C_RP6_BASE_ADR,RP6data, 30); // and read all 30 registers up to
// register Number 29 !

// Now we output the Data we have just read on the serial interface:
writeString_P("\nREADING ALL RP6 REGISTERS:");
uint8_t i = 0;
for(i = 0; i < 30; i++)
{
if(i % 8 == 0) // add some newline chars otherwise everything
writeChar('\n'); // is printed on ONE single line...
else
writeString_P(" | ");
writeChar('#');
writeIntegerLength(i,DEC,2);
writeChar(':');
writeIntegerLength(RP6data[i],DEC,3);
}
writeChar('\n');
}

/**
* Here we demonstrate how to read a few specific registers.
* It is just the same as above, but we only read 4 registers and
* start with register Number 13...
* We also show how to combine values from high and low registers
* back together to a 16 Bit value...
*/
void readLightSensors(void)
{
uint8_t lightSens[4];

I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 13); // Start with register 13 (LSL_L)...
I2CTWI_readBytes(I2C_RP6_BASE_ADR, lightSens, 4); // and read all 4 registers up to
// register Number 16 (LSR_H) !
writeString_P("Light Sensor registers:\n");
writeString_P(" | LSL_L:"); writeInteger(lightSens[0], DEC);
writeString_P(" | LSL_H:"); writeInteger(lightSens[1], DEC);
writeString_P(" | LSR_L:"); writeInteger(lightSens[2], DEC);
writeString_P(" | LSR_H:"); writeInteger(lightSens[3], DEC);

writeString_P("\n\n Light Sensor Values:");
writeString_P(" | LSL:"); writeInteger(lightSens[0] + (lightSens[1]<<8), DEC);
writeString_P(" | LSR:"); writeInteger(lightSens[2] + (lightSens[3]<<8), DEC);
writeChar('\n');

//setCursorPosLCD(1, 3);
//writeIntegerLengthLCD(lightSens[0] + (lightSens[1]<<8), DEC, 4);
//setCursorPosLCD(1, 11);
//writeIntegerLengthLCD(lightSens[2] + (lightSens[3]<<8), DEC, 4);
}

/************************************************** ***************************/
// Main function - The program starts here:

int PollSwitch16(void)
{
int i, j, mask=0, x=0;

for(j=0; j<4; j++)
{
DDRA = (1<<j); // PAj auf Ausgang
PORTA = ~(1<<j); // PA7 bis PA4 ist Eingang mit Pullup, PAj ist LOW (Tilde!)
sleep(10); // Warten auf Pegel
x=(PINA>>4); // Eingang PA7-4 wird zu Bit3-0 in x
for(i=0; i<4; i++) // Bits 0-3 überprüfen
if(!(x & (1<<i))) // Wenn Eingang low ist wurde die Taste gedrückt
mask += (1 << (i*4)) * (1<<j); // entsprechendes Bit in Maske setzen
}
PORTA = 0; // Port A deaktivieren
DDRA = 0;

return(mask);
}

int scan_keyboard1(void)
{
int i, mask = PollSwitch16();

for(i=0; i<16; i++) // wurde eine Taste gedrückt?
{
if(mask & (1<<i)) // Taste i gedrückt?
{
if(mask & ~(1<<i))
return(0); // mehrere Tasten gleichzeitig gedrückt!
else
return(i+1); // Tastennummer zurückgeben
}
}
return(0); // keine Taste gedrückt
}

int speed;
void Event( int x )
{
if(x == 0)
{
if(PING & LED_GREEN) PowerLEDoff(); else PowerLEDgreen();
mSleep(300);
}
else
{
PowerLEDred();
//Power_Servos();
if(x & (1<<0)) { Pos_Servo_1-=speed; Power_Servos();}
if(x & (1<<1)) { Pos_Servo_1+=speed; }
if(x & (1<<2)) { Pos_Servo_2+=speed; } // Drehrichtung invers!
if(x & (1<<3)) { Pos_Servo_2-=speed; }
if(x & (1<<4)) { Pos_Servo_3-=speed; }
if(x & (1<<5)) { Pos_Servo_3+=speed; }
if(x & (1<<6)) { Pos_Servo_4-=speed; }
if(x & (1<<7)) { Pos_Servo_4+=speed; }
if(x & (1<<8)) { Pos_Servo_5-=speed; Pos_Servo_6-=speed; }
if(x & (1<<9)) { Pos_Servo_5+=speed; Pos_Servo_6+=speed; }
if(x & (1<<10)) { PowerLEDorange(); speed=5; }
if(x & (1<<11)) { PowerLEDorange(); speed=1; }
if(x & (1<<12)) { RP6_rotate(35,BWD,40); }
if(x & (1<<13)) { RP6_rotate(35,FWD,40); }
if(x & (1<<14)) { RP6_rotate(35,RIGHT,40); }
if(x & (1<<15)) { RP6_rotate(35,LEFT,40); }
}
/*
writeInteger(Pos_Servo_1, 10);
writeString_P(" | ");
writeInteger(Pos_Servo_2, 10);
writeString_P(" | ");
writeInteger(Pos_Servo_3, 10);
writeString_P(" | ");
writeInteger(Pos_Servo_4, 10);
writeString_P(" | ");
writeInteger(Pos_Servo_5, 10);
writeString_P(" | ");
writeInteger(Pos_Servo_6, 10);
writeString_P("\n");
*/
}
int Batterie(void)
{
#define BATTERIE 6
ADMUX = (1 << REFS0) | (1 << REFS1) | BATTERIE; // internal 2.56V reference with external capacitor
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
return ADCL + (ADCH << 8);
}

void printUBat(uint16_t ubat)
{
writeIntegerLength((((ubat/204.8f)+0.1f)), DEC, 2);
writeChar('.');
writeIntegerLength((((ubat/2.048f)+10)), DEC, 2);
writeChar('V');
}
int main(void)
{
initRobotBase();
PORTA = 0; // Port A deaktivieren
DDRA = 0;

writeString_P("\n\nRA2 arm64 I2C Master Example Program! 3.11.2010 mic\n\n");
int ubat = readADC(ADC_UBAT);
printUBat(ubat);
writeString_P("\n");


// IMPORTANT:
I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation
// with 100kHz SCL Frequency
// Register the event handlers:
I2CTWI_setTransmissionErrorHandler(I2C_transmissio nError);

//char counter = 1;

//Start_position(); //Use this function to set the servomotor in the centre.
//This function must be called before using Power_Servos();

speed=1; //Speed for servo from '1'(slow) - '10'(fast!)
Pos_Servo_1=1500;
Pos_Servo_2=1530;
Pos_Servo_3=1100;
Pos_Servo_4=1640;
Pos_Servo_5=580;
Pos_Servo_6=580;
//Power_Servos(); //Use this function to power the servo motors on

while(true)
{
Event(PollSwitch16());

/*
if(scan_keyboard1())
{
writeInteger(scan_keyboard1(), 10);
writeChar('\n');
switch(0)
{
case 1: // Increment a counter and send value to LEDs of the
// Slave Controller:
//setLEDs(0b0001);
//showScreenLCD("INCREMENT", "LED COUNTER");
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, 3, counter);
counter++;
break;
case 2: // Read and display ALL registers of the slave controller:
//setLEDs(0b0010);
//showScreenLCD("READ ALL RP6", "REGISTERS");
readAllRegisters();
break;
case 3: // Read the light sensors and show value on display:
//setLEDs(0b0100);
//showScreenLCD("LIGHT SENSORS:", "L: R:");
readLightSensors();
break;
case 4: // Rotate a very small distance to the left:
//setLEDs(0b1000);
//showScreenLCD("ROTATE A BIT...", "... LEFT!");
RP6_rotate(35,LEFT,40);
break;
case 5: // Rotate a very small distance to the right:
//setLEDs(0b1001);
//showScreenLCD("ROTATE A BIT...", "... RIGHT!");
RP6_rotate(35,RIGHT,40);
break;
}
while(scan_keyboard1());
}
*/
}
return 0;
}


Außerdem mußte ich meine Tastenabfrage ändern, weil das Keypad nicht vollständig bestückt war:
http://www.arexx.com/forum/viewtopic.php?f=19&t=1179

Mein Arm ist nicht drehbar, dafür besitzt er die zwei gespiegelten Servos die ich noch rumliegen hatte:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=462535#462535

Das Keypad und ein LCD betreibe ich inzwischen über I2C mit je einem PCF8574:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=525681#525681

Mein RA2 auf dem RP6 sieht im Moment so aus:

http://radbruch.bplaced.net/arm/ra2_auf_rp6_klein.jpg (http://radbruch.bplaced.net/arm/ra2_auf_rp6.jpg)
(Leider wie immer extrem unscharf)

Weiter bin ich nicht gekommen, denn dann bin ich über das Pong (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=57205) gestolpert. Und zur Zeit versuche ich den RP6 zu einer Ladestation zu locken. Es gibt noch viel zu erforschen ;)

Gruß

mic

Dirk
17.02.2011, 20:58
@Ralf:

Kannst du bei deinen erkannten Library Fehlern etwas genauer werden, ehe ich auch darauf reinfalle ?
Ich hänge 'mal die Lib an, wie ich sie z.Zt. verwende. Sie ist so kompatibel zur 1. Version. Hauptänderung ist eigentlich erst einmal nur der CTC Modus für den Beeper.

Gruß Dirk

ralf
19.02.2011, 17:47
hallo,
danke Dirk für die Software.
Mein Arm ist gerade "teilzerlegt", da ich Servo 6 (unten Grundgestell) mit einem stabileren tauschen will.
Der Arm wackelte ziemlich mit dem Plastelager, nun baue ich gerade ein Servo (Metallgetriebe und Kugellager)ein (12,95 Euro).
Na ja, radbruch dürfte das Problem ja nicht haben, da die Drehbewegung von seinem RP6 ausgeführt wird.
Hoffe, daß es jetzt einigermaßen stabil läuft, sonst wird mir die Sache langsam zu teuer.

Ralf

Dirk
19.02.2011, 19:12
... nun baue ich gerade ein Servo (Metallgetriebe und Kugellager)ein (12,95 Euro).
Ralf, welches Servo nimmst du denn dafür? Bei mir wackelt der Arm auch ziemlich.
Auch mit dem "Bottom"-Servo bin ich nicht so zufrieden, weil es den Arm gestreckt z.B. kaum heben kann, mit einem Gewicht im Greifer schon gar nicht. Das müßte man fast auch tauschen ...

Gruß Dirk

ralf
20.02.2011, 12:32
Hallo Dirk,
habe Servo ohne Probleme eingebaut und brauchte nicht mal den Servohebel am schw. Plastekasten wechseln.
Es lief auf Anhieb und macht einen stabilen Eindruck, aber habe es natürlich noch nicht im Dauerbetrieb.

Das Servo ist bei Conrad erhältlich, bei mir in Berlin sogar direkt in der Filiale:
TOP-LINE STANDARD SERVO RS 2 MG/BB
Best.-Nr.: 205111 - 62 [Teilenummer: RS2 MG/BB] 12,95 €

Unter "Bottom-Servo" meinst du sicherlich Servo 5 /Schulter, ja das ist auch mein nächster Wechselkandidat.
Einziges kleines Problem vielleicht, dieses Servo ist geringfügig breiter
--unten ist das kein Problem, paßt wie angegossen.
In dem unteren "Plastekasten" könnte es ev. Probleme mit dem Deckel geben, aber der ist bei mit jetzt in der
Testphase sowieso offen.
Maße des neuen Servo LBH 41x20x42

Gruß Ralf

ralf
26.02.2011, 22:56
Hallo Dirk,
habe nun auch den zweiten Standard-Servo ausgetauscht, da in Grundstellung der Arm zitterte. Servo hat auch problemlos gepaßt und auch der Deckel ließ sich anschrauben....
aber dann --trotz korrekten Einbau mußte ich feststellen, daß die Drehrichtung vertauscht war ??????????
Servotester benutzt --- mit meinem Oszi Pulse überprüft ---bei gleicher Einbauweise (Antriebswelle ist ja nicht in der Mitte, Verwechslungen ausgeschlossen) Drehrichtung rechts/links entgegengesetzt. :-s
Bin da nicht so der SERVO-Pofi, aber gibt es links- oder rechtsdrehende SERVOS und wenn ja, wie kann man aus den techn. Daten das erkennen?

Na ok, man kann ja die Programme umschreiben --trotzdem nicht so toll [-(

Der etwas x-drehende
Ralf

radbruch
26.02.2011, 23:20
Hallo

Meine zwei parallelen Servos sind auch RS2, allerdings ohne MG. Das Spiegeln der Drehrichtung hatte ich mal beschrieben (und oben auch verlinkt;)

Man muss lediglich den Motor umpolen und die äußeren Anschlüsse des Potis überkreuzen:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=462535#462535

Bei der Version mit Kunstoffgetriebe ist das Ritzel auf der Motorwelle am vorderen Ende so dick, dass man es nicht ohne das Zahnrad zu beschädigen rausziehen kann. Deshalb muss man unbedingt das Getriebe zerlegen bevor man den Motor demontiert. Ich vermute, beim Metallgetriebe ist es genauso:
http://radbruch.roboterbastler.de/servoumbau/servo-umbau2_klein.jpg (http://radbruch.roboterbastler.de/servoumbau/servo-umbau2.jpg)
(Rechts oben im Bild kann man das Ritzel erkennen,
Einbaulage des Motors wurde vor dem Auslöten markiert;)

Gruß

mic

efb
08.03.2011, 17:33
Hier ist noch einer:

hatte sehr ähnliche Probleme wie in den ersten Posts geschildert. Alles letztlich nicht sooo wild, bis auf zwei schon ziemlich ärgerliche Sachen:

Auch bei mir brach promt der erste Abstandshalter ab, weil man einfach nicht damit rechnet, das der nicht vollständig reingeht. Man denkt so lange, das es durch die Farbreste so schwer geht, bis das Teil abbricht und man gemerkt hat, das das Loch nicht tief genug ist!
Später merkte ich, das man die Teile gar nicht so tief reindrehen solle, da sonst die Platine mit einzelnen Lötstellen auf das Metallgehäuse aufsetzen kann...
Da gehört dringend ein Hinweis in die Anleitung.

Und zweitens etwas zeitraubend:
Tastatur war auch bei mir defekt. Ersteinmal muss man drauf kommen, das es die Tastatur ist und dann noch die Fehler finden.
1) Eine SMD- Diode war ohne Ring und der Kollege hat sie also einfach auf gut Glück eingelötet. Prompt verkehrtherum. Umlöten war nicht so schwer.
2) Zu merken, das aber auch noch das blöde Flachbandkabel nicht richtig Kontakt bekam hat schon etwas länger gedauert. Auch ich dachte erst einmal, durch die falsche Diode sei etwas an den Ports kaputt gegangen...

Na, ich werde leider nicht der letzte sein, der diese Posts zu spät liest...
Schreib ich also noch mal für die Suche: Roboterarm RA-2 Hobby oder so: Arexx RA2-Hobby

Das der Ganze Kram trotzdem Spaß macht will ich aber nicht abstreiten :-)

Viel Erfolg noch allen Roboterarm-Nutzern.

efb

ralf
09.03.2011, 17:15
Hallo efb,

Willkommen in der Arexx-Arm-Gemeinde. Hast also auch viel "Lehrgeld" zahlen müssen.

Inzwischen habe ich einen Joystick zur Armsteuerung (Keybordanschluß) angeschlossen (plus Masse extra)
Port 0 bis 5 auf Eingang und Widerstände ein 0b00011111 ergibt 32 Möglichkeiten.
Aber es ist kein analoger PC-Joystick --- sondern ein älterer Joystick von meinem
ATARI 800/130 -Hobby(ältere Homecomputer). Dieser hat 5 Microschalter, die auf Masse geschaltet
werden.

Schade, daß es keine neuen Digital-Joysticks mehr zu kaufen gibt, denn meiner ist schon etwas ausgeleiert.

Hallo radbruch,
die Servos habe ich (noch ??) nicht umgebaut, sondern die Programme entsprechend umgeschrieben.

Ein weiteres Projekt wäre, eine Steuerung über eine IR-Fernbedienung, wie z.B. bei ROBBY6.
Die Arm-Platine hat leider keinen Empfänger, müßte doch aber nachzurüsten sein.
Kann man da vielleicht dann die Lib vom Robby nehmen ?
IR bei Robby an PD7, am Arm geht PD7 an eine Buchse SPI und scheint frei zu sein.

MfG

Ralf

efb
09.03.2011, 18:18
Inzwischen habe ich einen Joystick zur Armsteuerung (Keybordanschluß) angeschlossen
...
Schade, daß es keine neuen Digital-Joysticks mehr zu kaufen gibt, denn meiner ist schon etwas ausgeleiert.



Hallo Ralf,
gute Idee mit den alten digitalen Joysticks, habe ich auch noch da, vom C64 :-).
Und die gibts auch noch reichlich bei ebay: z.B. "competition pro"
Viele Grüße

efb

ralf
09.03.2011, 19:58
Hallo efb,
darf man dich auch mit einem Vornamen ansprechen ?

Die ebay "competition pro" sind ja auch nicht neu oder einige Jahre alt.
Kenne die auch, sehr robust für viele alte WeltraumBallerspiele sehr geeignet aber nicht gerade feinfühlig.
Benutze einen QuickShot II, der den Feuerknopf oben im Hebel hat, damit ist eine EinHandBedienung möglich, beim
"compiPro" geht das nicht.

Eine Frage am Rande--- hast du noch einen C64 und benutzt ihn auch ? --
Die alte Konkurrenz C64-Atari ist doch wohl vorbei :-)

Gruß Ralf

Dirk
11.03.2011, 19:05
@Ralf:

Ein weiteres Projekt wäre, eine Steuerung über eine IR-Fernbedienung, wie z.B. bei ROBBY6. Die Arm-Platine hat leider keinen Empfänger, müßte doch aber nachzurüsten sein.
Kann man da vielleicht dann die Lib vom Robby nehmen ? IR bei Robby an PD7, am Arm geht PD7 an eine Buchse SPI und scheint frei zu sein.
Man könnte da einfach einen TSOP z.B. an PD7 (ist frei!) anschliessen. Eine Lib dafür kriegen wir hier schon hin !

Mizu
19.03.2011, 16:46
Hallo zusammen,

ich schließe mich dann auch mal mit einem Erfahrungsbericht an:

Der Fuß war bei mir aehnlich schwergaengig, hab jedoch alle schrauben mit nur geringen problemen rein bekommen.
Die Teile sind ansonsten in ordnung, bis auf ein Steckverbindungskabel - was ich dann durch verwunderung feststellen musste als ich den angeschlossenen Motor ansteuern wollte - war aber sehr einfach zu beheben.
Das Geraet funktioniert ansonsten einwandfrei.
Die tastatur hatte ich auch einmal dran und aehnliche Erfahrungen gemacht, das eine Taste nicht funktioniert aber nicht weiter beachtet, da man mit der mitgelieferten racs software auch alle motoren testen kann. (das kommt dann wohl wenn ich von der tastatur mal gebrauch machen will^^ weis jetzt ja aber wonach ich gucken muss bzw. das es durchaus an Baufehlern an der Tastatur liegt.

Mehr faellt mir grad nicht ein wie gesagt er funktioniert und hebt momentan in einem ersten Testprogramm ein Bierdeckel durch die gegend. Demnach werd ich jetzt mal weiter diesen Thread durchstoebern, unter anderem zum Thema Motor- (bzw. Gelenk-) werte. Moecht mir nach Moeglichkeit ne inverse Kinematik bauen, hab aber noch anfaengliche Probleme mit der Umsetzung, da ich das nur mit winkel Berechnung kenne, ma schaun.

korrigiere:
die tastatur hat 4 funktionierende tasten aber wie ich sehe sind wohl die dioden an den nicht funktionierenden tasten garnicht richtig angeloetet^^ naja... ziehmlicher kaese, aber is nun wirklich nicht sonderlich schlimm. nur frag ich mich wer die dinger zusammen loetet wenns in nem arexx forum heisst die sind per hand geloetet...

ralf
20.03.2011, 15:56
@Dirk
"Man könnte da einfach einen TSOP z.B. an PD7 (ist frei!) anschliessen. Eine Lib dafür kriegen wir hier schon hin ! "

Habe mir jetzt ein IR-Empfänger besorgt und angeschlossen --- kleines Testprogramm "---bei erkannter Fernbedienung Umleitung auf LED "
hardwaremäßig also o.k. .
Die Einbeziehung der Programme vom RP6 brachte aber nichts ---schon beim übersetzen viele Fehler.
RC5-Struktur ist mir schon einigermaßen klar -- aber die seriellen Daten zu übernehmen und dann in ..code, adresse umzusetzen ,da komm ich nicht richtig klar.
Habe zwar Programme gefunden ,untersucht (ASURO oder "RC5-Decoder für ATMega" hier im Netz) aber die müssen erstmal verstanden und dann angepaßt werden.
Wo setze ich da am besten an ? Gibt es Proramme, die nur leicht umgesetzt werden müssen ?

Gruß Ralf

Dirk
25.03.2011, 20:47
@Ralf:
Ok, ich würde den RC5-Code in die Lib in die ISR(TIMER2_COMP_vect), also in den 100us Interrupt einklinken.
Beispiel:

// Dies VOR die ISR:
volatile RC5data_t RC5_newdata; // Decoded RC5 data

// Dies hier IN die ISR (ans Ende!):
// ----------------------------------------------------------------------------
// RC5 reception code (adapted for Robot Arm from Asuro Lib):
#define F_ISR 10e3 // 10kHz (100µs)
#define RC5_TIME 1.778e-3 // 1.778ms
#define RC5_SAMPLES_PER_BIT_MIN (uint8_t)(F_ISR * RC5_TIME * 0.4)
#define RC5_SAMPLES_PER_BIT_EARLY (uint8_t)(F_ISR * RC5_TIME * 0.75)
#define RC5_SAMPLES_PER_BIT_LATE (uint8_t)(F_ISR * RC5_TIME * 1.25)
#define RC5_PAUSE_SAMPLES 250 // 25ms (RC5 pause: 88.889ms)
static uint8_t RC5_lastsample = 0; // Last read sample
static uint8_t RC5_timecounter = 0; // Bit time counter
static uint16_t RC5_bitstream = 0; // RC5 bit stream
static uint8_t RC5_bitcounter = 0; // RC5 bit counter
uint8_t sample = 1;
if(PIND & RESERVE_PD7) // Read RC5 input (PD7)
sample = 0;
if(RC5_timecounter < 255) // Time counter limited to 8 bit
RC5_timecounter++;
if(RC5_lastsample != sample) { // Detect edges
if(RC5_timecounter <= RC5_SAMPLES_PER_BIT_MIN)
RC5_bitcounter = 0; // Edge to early
else {
if(RC5_bitcounter == 0) { // RC5 start bit
if((sample == 1)
&& (RC5_timecounter > RC5_PAUSE_SAMPLES)) {
RC5_bitstream = 1; // Store start bit
RC5_bitcounter++;
}
else
RC5_bitstream = 0; // To long pause: Error
RC5_timecounter = 0; // Reset bit time counter
}
else { // RC5 bits 2..14:
if(RC5_timecounter >= RC5_SAMPLES_PER_BIT_EARLY) {
if(RC5_timecounter <= RC5_SAMPLES_PER_BIT_LATE) {
RC5_bitstream = (RC5_bitstream << 1) | sample;
RC5_bitcounter++;
}
else
RC5_bitcounter = 0; // To late: Error
RC5_timecounter = 0; // Reset bit time counter
}
}
}
}
else {
if(RC5_timecounter > RC5_SAMPLES_PER_BIT_LATE) { // No edge in bit?
if(RC5_bitcounter == 14) { // All 14 RC5 bits read?
RC5_newdata.data = RC5_bitstream;
RC5_Ready = 1; // New data received!
}
RC5_bitcounter = 0; // Reset RC5 bit counter
}
}
RC5_lastsample = sample; // Store sample in sample buffer
// ----------------------------------------------------------------------------


Dazu müßte man im Header der Lib die Variablen definieren:

typedef union {
uint16_t data; // RC5 data structure (14 bits):
struct {
unsigned key_code : 6; // RC5 key code C0..C5
unsigned device : 5; // RC5 device address A0..A4
unsigned toggle_bit : 1; // RC5 toggle bit F
unsigned key_codeC6 : 1; // RC5 key code bit 6 !(C6)
unsigned start_bit : 1; // RC5 start bit 1
unsigned notused : 2;
};
} RC5data_t;
// RC5data_t RC5_data; // Received RC5 data
volatile uint8_t RC5_Ready; // RC5 data ready (true/false)

Probier das mal! Wenn RC5_Ready true (1) wird, wurden Daten in RC5_newdata empfangen. Das Hauptprogramm müßte also RC5_Ready ständig pollen (z.B. in einer task_RC5 in der Hauptschleife). Nachdem die Daten aus RC5_newdata gelesen wurden, muss man noch RC5_Ready false setzen, damit die nächsten Daten empfangen werden können.
Als Eingangspin habe ich PD7 genommen.

ralf
28.03.2011, 17:38
Hallo Dirk,
vielen Dank für dein Programmvorschlag. Meine Wochenendversuche haben leider noch keinen Erfolg gebracht.

--"Nachdem die Daten aus RC5_newdata gelesen wurden" RC5_newdata wird leider nicht gefunden , habe es auch mit RC5_newdata.data versucht
Prinzipiell scheint es aber bei mir auch nicht zu funktionieren, da RC5_Ready nicht true (1) wird.

Mal eine Fage zum Einlesen -" if (PIND & RESERVE_PD7 ) " - was ist RESERVE_PD7 ? ( ich nutze z.B. x=PIND; x=mask & x; ....)

Ich bleibe weiter dran ( du schreibst " in den Timer Interrupt einklinken " ok. habe ich gemacht. Ist der dann mit initRobotBase(); automat. aktiv ? )

Gruß Ralf

Dirk
28.03.2011, 19:14
Hallo Ralf,

... RC5_newdata wird leider nicht gefunden ...
Ok, man könnte RC5_newdata im Header als extern definieren oder die Definition überhaupt in den Header verschieben.


... was ist RESERVE_PD7 ?
Das ist so:
#define RESERVE_PD7 (1 << PIND7) //EXTERN PIN PD7, (SPI)
... in der RobotArmBase.h definiert. Du kannst auch 1<<PD7, 1<<PinD7, 128 o.ä verwenden.


... Timer Interrupt ... Ist der dann mit initRobotBase(); automat. aktiv ?
Ja, du inkludest ja die RobotArmBaseLib in das Hauptprogramm und du hast ja vorher den RC5-Code in die RobotArmBaseLib.c eingefügt.
Wenn du die Lib verändert hast und neu kompilierst, müßtest du immer vorher die .o und .lst Dateien löschen, weil die Lib sonst u.U. nicht neu kompiliert wird.

Dirk
16.04.2011, 22:27
@Ralf,

:?

mich würde interessieren, ob die IR-Fernsteuerung jetzt bei dir läuft ... ?

ralf
17.04.2011, 10:58
Hallo Dirk,

die IR-Fernsteuerung läuft nicht.
Ich habe nach vielen Versuchen und vielen Fluchen (:( ) die Sache etwas entnervt aufgegeben.
Nun, da das Wetter etwas frühlingshafter wird, ist man auch öfter draußen und nicht nur stundenlang am Computer/Arm.
Trotzdem vielen Dank für deine Tips, vielleicht mache ich mich später noch mal daran.


Gruß Ralf