INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Bitte helft mir: RC Empfänger auslesen und an Motortreiber weitergeben.
21.10.2014, 20:38 (Dieser Beitrag wurde zuletzt bearbeitet: 23.10.2014 23:36 von christian@schiltkamp.info.)
Beitrag #1
Wink Bitte helft mir: RC Empfänger auslesen und an Motortreiber weitergeben.
Hallo ihr alle hier,

ich bin der Christian, 42J und habe folgendes vor:

Ich baue mir gerade einen ziemlich großen Modellstapler, welchen ich mit Arduino ansteuern möchte.
Da ich aber noch zu der Kategorie Anfänger gehöre, würde ich mich freuen, wenn ihr mit bei der Programmierung ein bissl unter die Arme greift.
Ich arbeite mich mit Google durch und lese wie ein wilder.

Was habe ich vor:

Der Stapler bekommt folgende Motoren:
- Neigung
- Hub
- Fahren
- Lenken
Das Lenken hab ich bereits gelöst und einen Getriebemotor auf Servo umgebaut. Er wird auch schon vom RC Empfänger angesteuert. Möchte ihn aber trotzdem über Arduino laufen lassen, um wenn nötig Schranken zu setzen.

Wie denke ich mir den Ablauf:

Auslesen des 4 Kanal Empfänger und Weitergabe der Daten an:
- Neigemotor ohne PWM nur vor und zurück (evtl über Relais)
- Hubmotor ohne PWM nur hoch und runter (hier sehr hohe Ströme)
- Lenkmotor = Servo als Servosteuerung, bei der ich evtl den Lenkanschlag und die Mittelstellung einstellen kann (ähnlich wie Trimmung an der Fernbedienung)
- Antriebsmotor mit PWM vor und zurück über einen krätigen Motortreiber (mehrere vorhanden)

Vorhanden:
- Arduino Mega
- Kabel etc.
- Motortreiber bis 30 A bei 24V

Das Auslesen der Fernbedienung habe ich schon bedingt geschafft. Kann im Monitor Zahlen sehen, die sich ändern, wenn ich den Gashebel bewege. Nur leider tut sich am Motortreiber gar nichts.

// Arduino Mega Motortreiber ansteuern mit Funke


#define pinRemoteSteer 11 // remote control steering
#define pinMotorDir 33
#define pinMotorPWM 3

unsigned long remoteSteerLastTime = 0;
int remoteSteer = 0; // range -100..100
boolean remoteSteerLastState = LOW;
unsigned long nextInfoTime = 0;

// L298N motor driver
// IN2/C(10)/PinPWM IN1/D(12)/PinDir
// H L Forward
// L H Reverse
void setL298N(int pinDir, int pinPWM, int speed){
if (speed < 0){
digitalWrite(pinDir, HIGH) ;
analogWrite(pinPWM, speed);
} else {
digitalWrite(pinDir, LOW) ;
analogWrite(pinPWM, speed);
}
}

// L9958 motor driver
// PinPWM PinDir
// H H Forward
// H L Reverse
void setL9958(int pinDir, int pinPWM, int speed){
if (speed > 0){
digitalWrite(pinDir, HIGH) ;
analogWrite(pinPWM, abs(speed));
} else {
digitalWrite(pinDir, LOW) ;
analogWrite(pinPWM, abs(speed));
}
}

int rcValue(int ppmTime){
int value = (int) (((double)((ppmTime) - 1500)) / 3.4);
if ((value < 5) && (value > -5)) value = 0;
return value;
}

// RC remote control driver
void setRemotePPMState(unsigned long timeMicros, boolean remoteSteerState){
if (remoteSteerState != remoteSteerLastState) {
remoteSteerLastState = remoteSteerState;
if (remoteSteerState) remoteSteerLastTime = timeMicros; else remoteSteer = rcValue(timeMicros - remoteSteerLastTime);
}
}

// remote control (RC) ppm signal change interrupt
ISR(PCINT0_vect)
{
unsigned long timeMicros = micros();
boolean remoteSteerState = digitalRead(pinRemoteSteer);
setRemotePPMState(timeMicros, remoteSteerState);
}

void setup(){
// enable signal change interrupt on pin11 (PCINT5)
// Diese Zeilen sind fuer Arduino Mega - fuere andere Arduinos anpassen (Handbuch)
PCICR |= (1<<PCIE0);
PCMSK0 |= (1<<PCINT5);
pinMode(pinMotorPWM, OUTPUT);
pinMode(pinMotorDir, OUTPUT);
Serial.begin(19200);
}

void loop(){
// Motortreiber ansteuern mit aktueller Stellung der Funke
int speed = ((double)remoteSteer) * 2.5f;

// for L9958 motor driver
//setL9958(pinMotorDir, pinMotorPWM, speed );

// for L298N motor driver
setL298N(pinMotorDir, pinMotorPWM, speed);

delay(15);
if (millis() >= nextInfoTime){
nextInfoTime = millis() + 500;
Serial.print("remoteSteer=");
Serial.print(remoteSteer);
Serial.print(" speed=");
Serial.println(speed);
}
}


Habe heute auch noch was neues gefunden zum Auslesen der FB.


// Arduino CookBook 18.0
// https://www.inkling.com/read/arduino-coo...ecipe-18-8
// ICP1-Pin für UNO & Timer1: Pin 8
// ICP5-Pin für Mega & Timer5: Pin 48

#define NUM_OF_CHL 8 // we are working with an 8-ch-Transmitter
#define NUM_OF_AVG 3 // 3 added values for average

const int inputCapturePin = 48; // input pin fixed to internal Timer
const int prescale = 8; // prescale factor (each tick 0.5 us @16MHz)
const byte prescaleBits = B010; // pecision scale factor 8
const long precision = (1000000/(F_CPU/1000)) * prescale; // time per counter tick in ns
volatile int overflows = 0;

volatile long valuesInt[9] = {0};
volatile long valuesUse[9] = {0};
volatile byte counter = NUM_OF_CHL;
volatile byte average = NUM_OF_AVG;
volatile boolean ready = false;
long timelastloop;


/* Overflow interrupt vector */
ISR(TIMER5_OVF_vect) // here if no input pulse detected
{
overflows++; // increment overflow count
}

/* ICR interrupt vector */
ISR(TIMER5_CAPT_vect)
{
TCNT5 = 0; // reset the counter
if( bitRead(TCCR5B ,ICES5) == true) // wait for rising edge
{
long time = ICR5 + (overflows * 65536); // save the input capture value
overflows = 0;
time = time * precision / 1000; // time in ms
if (time > 2500) // this is a gap between set of pulses
{
valuesInt[8] = valuesInt[8] + time;
counter = 0;
if (average == NUM_OF_AVG)
{ for (int i = 0; i < NUM_OF_CHL + 1; i++)
{
valuesUse[i] = (valuesInt[i] + 0.5) / average;
valuesInt[i] = 0;
}
average = 0;
ready = true;
}
average++;
}
else
{ if (counter < NUM_OF_CHL)
{
valuesInt[counter] = valuesInt[counter] + time;
counter++;
}
}
}
}

void setup()
{
Serial.begin(115200);
Serial.println(F("Start reading PPM-Signal from Remote-Control"));
Serial.print( precision); // report duration of each tick in nanoseconds
Serial.println(F(" nanoseconds per tick"));

pinMode(inputCapturePin, INPUT_PULLUP); // ICP pin (digital pin 8 on Arduino/48 on Mega) as input
TCCR5A = 0 ; // Normal counting mode
TCCR5B = prescaleBits ; // set prescale bits
TCCR5B |= _BV(ICES1); // enable input capture
TIMSK5 = _BV(ICIE1); // enable input capture interrupt for timer 1
TIMSK5 |= _BV(TOIE1); // enable overflow interrupt

timelastloop = micros(); // measure loop-time with "standard" micros()
}

void loop()
{
if (ready)
{
long timenew = micros();
Serial.print(timenew - timelastloop); Serial.print(F(" | "));
for (int i = 0; i < NUM_OF_CHL + 1; i++)
{
Serial.print(valuesUse[i]);
if (i < 8) Serial.print(F(" - "));
}
Serial.println();
ready = false;
timelastloop = timenew;
}
}

Freue mich auf eure Hilfe.

Grüße aus Neumarkt in der OPf.

Christian


Angehängte Datei(en) Thumbnail(s)
       
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.10.2014, 17:33
Beitrag #2
RE: Benötige bitte Hilfe = kleiner Programmierauftrag
Hallo Christian,

eine Auftragsarbeit habe ich nicht vor anzunehmen, allerdings denke ich, dass Dir hier geholfen werden kann, wenn Du mitarbeiten möchtest.

Dein Vorhaben klingt erstmal nicht besonders schwierig, wobei der Teufel immer im Detail liegt ;-)

Hat es einen bestimmten Grund, dass Du eine normale Funkfernbedienung nutzen möchtest? Die Arduinowelt bietet doch so viele Möglichkeiten, die Dich viel flexibler machen!

Wenn Du schreibst "evtl. über Relais, bedeutet dies, dass der Stapler noch nicht fertig ist?

Viele Grüße
itsy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.10.2014, 23:40
Beitrag #3
RE: Benötige bitte Hilfe = kleiner Programmierauftrag
(22.10.2014 17:33)itsy schrieb:  Hallo Christian,

eine Auftragsarbeit habe ich nicht vor anzunehmen, allerdings denke ich, dass Dir hier geholfen werden kann, wenn Du mitarbeiten möchtest.

Dein Vorhaben klingt erstmal nicht besonders schwierig, wobei der Teufel immer im Detail liegt ;-)

Hat es einen bestimmten Grund, dass Du eine normale Funkfernbedienung nutzen möchtest? Die Arduinowelt bietet doch so viele Möglichkeiten, die Dich viel flexibler machen!

Wenn Du schreibst "evtl. über Relais, bedeutet dies, dass der Stapler noch nicht fertig ist?

Viele Grüße
itsy

Hallo Itsy,

danke für deinen Tipp. Habe mich wohl sehr schlecht ausgedrückt. Natürlich arbeite ich intensiv mit.
Wie du aus den Bildern erkennen kannst, ist er noch nicht fertig. Ich baue die Hardware am WE zusammen.
Ich habe eine gute Funke mit Empfänger von meinem Heli über.
Relais hatte ich angedacht, da mit keine bessere Idee kam. Wobei das dann mit ner Polwendeschaltung gar nicht so einfach wird.

Gruß
Christian
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.10.2014, 19:14
Beitrag #4
RE: Bitte helft mir: RC Empfänger auslesen und an Motortreiber weitergeben.
Oh, also irgendwie habe ich Deine Bilder und den Code nicht gesehen Big Grin Sorry!!

Also die Steuersignale einer FB auszulesen habe ich noch nicht gemacht - aber das müssten doch einfach PWM-Signale sein, die Du Analog messen kannst, oder?

Viele Grüße
itsy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.10.2014, 13:03
Beitrag #5
RE: Bitte helft mir: RC Empfänger auslesen und an Motortreiber weitergeben.
Hi,
PWM-Signale analog zu messen ist nicht ganz so einfach. Zumindest braucht man dazu irgendeine Schaltung zum Glätten des Signals. Außerdem dürfte das nie glatt genug werden, um eine genaue Messung hinzubekommen.
Ausserdem machen die RC-Systeme kein normales PWM. Beim normalen PWM entspricht der Maximalwert einem "durchgehend HIGH", minimal ist "immer LOW". Beim RC-PWM kommt nur etwa alle 20ms ein Impuls von 1 bis 2 ms Dauer. Ich denke mal, dass man da gar nichts mehr sinnvoll analog messen kann.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.11.2014, 08:12
Beitrag #6
RE: Bitte helft mir: RC Empfänger auslesen und an Motortreiber weitergeben.
Hallo Christian,

aus meiner Sicht wäre folgende Vorgehensweise sinnvoll:

- die nicht zu beeinflussenden Kanäle gar nicht auslesen sondern direkt an Regler / Servo leiten
- die einzulesenden Kanäle nacheinander (in aufsteigender Reihenfolge der Kanäle) per Pulsein auslesen (es bleibt genügend Rechenzeit zwischen den Zyklen)
- die auszugebenden Steuersignale mit der Servo-Library erzeugen
- überall (Hub, Neigung, Lenkung) Servos verwenden (im Programm die gewünschten Werte erzeugen - das Servo läuft dann so schnell es kann in die gewünschte Position)

Soll ein Servo langsamer laufen, kann das in einer Schleife generiert werden (jedesmal Wert +/- x bis der Endwert erreicht ist). Du kannst auch bewusst langsame Servos verwenden - die sind dann meist auch noch preiswerter.

Servos gibt es bis 50 kg und mehr - das sollte dann maximal eine Preisfrage sein.

Gruß Rainer
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2015, 12:19
Beitrag #7
RE: Bitte helft mir: RC Empfänger auslesen und an Motortreiber weitergeben.
Hallo Itsy,
um deine Empfängersignale auszulesen gibt es eine Bibliothek die Du auf folgender Seite findest:

http://www.rcarduino.tk/

Such dort mal nach RC-Receiver.
Einfacher gehts dann nicht mehr. Erklärungen zur Verwendung findest Du dort auch. Mit dem Mega kannst Du leicht 5 Kanäle mit den internen Interrupts auslesen was dann sehr schnell geht und Du kein Signal verfehlst beim einlesen. Das Empfangssignal wird proportional zur Knüppelstellung in werte zwischen 0 und 255 übersetzt wobei 127 dann die Mittelstellung darstellt. Diese lassen sich dann mit der map() Funktion leicht in Werte für die servo Bibliothek umrechnen.
Was den Motortreiber angeht zum heben und senken habe ich beim überfliegen deines Programmes was vom l298 gelesen. Der schaft die 30a sicher nicht. Da musst Du dann in die Doku des Treibers schauen.

Hoffe das hilft Dir erst mal weiter?!

Gruß Sven

Nichts auf der Welt ist unnütz, es kann im schlimmsten Fall immer noch als schlechtes Beispiel dienen.
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.03.2015, 17:54
Beitrag #8
RE: Bitte helft mir: RC Empfänger auslesen und an Motortreiber weitergeben.
Hey Christian wärst du so nett und würdest du deine endlösung Posten also zumindest den Code
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Mit dem Arduino JSON Webseiten auslesen seb201 3 85 Gestern 22:25
Letzter Beitrag: Tommy56
  Messchieber auslesen mit nem UNO roadcaptain 8 297 15.11.2016 14:30
Letzter Beitrag: Tommy56
  U-blox Neo 6M GPS auslesen Matthias_Arduino 15 873 09.11.2016 16:40
Letzter Beitrag: AvrRobot
  mit Attiny85 Feuchtigkeitssensor auslesen toto1975 17 569 19.08.2016 22:40
Letzter Beitrag: hotsystems
  DCF77 Empfänger paq 19 911 23.07.2016 17:16
Letzter Beitrag: rkuehle
  Empfänger RF 433 peterfried 6 367 10.06.2016 23:01
Letzter Beitrag: hotsystems
  Wo finde ich bitte die LIB USBHOST ? arduinopeter 6 501 24.03.2016 16:53
Letzter Beitrag: arduinopeter
  Encoder auslesen Phil333 1 664 23.03.2016 21:40
Letzter Beitrag: hotsystems
  "WORT" über die serielle Schnittstelle auslesen hannes77 1 524 08.03.2016 12:13
Letzter Beitrag: Binatone
  Probleme beim Auslesen eines IR Empfängers linuxpaul 7 574 06.03.2016 14:44
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste