Go Down

Topic: Umbau ferngesteuertes Auto (Read 303 times) previous topic - next topic

Maff91

Feb 20, 2019, 10:19 pm Last Edit: Feb 21, 2019, 08:44 am by Maff91
Hallo zusammen,

ich versuche ein ferngesteuertes Auto ohne Fernbedienung lauffähig zu machen. Ich habe mich viel an dem unten angefügten Youtube Video orientiert.

https://www.youtube.com/watch?v=JZYHW2hK20A

Das Auto lässt sich bereits fernsteuern.

Da bisher geringe bis keine Programmkenntnisse vorhanden sind, orientiere ich mich an andere Programmschnipseln.

1) Ich hätte gerne die Möglichkeit, dasss das Auto stoppt, sollte die Funkverbindung abreißen. Sollte die Verbindung abbrechen, muss meiner Meinung nach das folgende Unterprogramm ausgeführt werden.

Code: [Select]
void stop()
{
analogWrite(ena, 0);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
digitalWrite(in5, LOW);
digitalWrite(in6, LOW);
}


2) Ich hätte noch eine allgemeine Verständnisfrage. Der Sender (Fernbedienung) sowie der Empfänger (Auto)  haben bei die Adresse 0xE8E8F0F0E1LL. Kann ich diese Adresse individuell ändern?

Code: [Select]
#include <SPI.h>
#include "RF24.h"
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int msg[1];
int data;
int pos;
int motorSpeedF;
int motorSpeedB;
int left1;
int right1;
const int in1 = 7;
const int in2 = 8;
const int in3 = 4;  
const int in4 = 2;
const int in5 = 3;
const int in6 = 6;
const int ena = 5;    // PWM pin to change speed
void setup()
{
 pinMode(in1, OUTPUT);
 pinMode(in2, OUTPUT);    
 pinMode(ena, OUTPUT);    
 pinMode(in3, OUTPUT);
 pinMode(in4, OUTPUT);
 pinMode(in5, OUTPUT);
 pinMode(in6, OUTPUT);
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
}
void loop()
{
 if (radio.available())radio.read(msg, 1);
if (msg[0] >=128 && msg[0] <=185)data = msg[0], motorSpeedB = map(data, 185, 128, 0, 255), backward(motorSpeedB);
 if (msg[0] >=201 && msg[0] <=255)data = msg[0], motorSpeedF = map(data, 201, 255, 0, 255), forward(motorSpeedF);
if (msg[0] >=0 && msg[0] <=60)data = msg[0], left1 = map(data, 60, 0, 0, 255), left();
if (msg[0] >=65 && msg[0] <=127)data = msg[0], right1 = map(data, 65, 127, 0, 255), right();
if (msg[0] >185 && msg[0] <200)data = msg[0], stop();
}
void stop()
{
 analogWrite(ena, 0);
 digitalWrite(in1, LOW);
 digitalWrite(in2, LOW);
 digitalWrite(in3, LOW);
 digitalWrite(in4, LOW);
 digitalWrite(in5, LOW);
 digitalWrite(in6, LOW);
}
void forward(int motorSpeedF)
{
 digitalWrite(in1, LOW);
 digitalWrite(in2, HIGH);
 digitalWrite(in3, LOW);
 digitalWrite(in4, HIGH);
 analogWrite(ena, motorSpeedF);
}
void backward(int motorSpeedB)
{
 digitalWrite(in1, HIGH);
 digitalWrite(in2, LOW);
 digitalWrite(in3, HIGH);
 digitalWrite(in4, LOW);
 analogWrite(ena, motorSpeedB);
}
void left()
{
digitalWrite(in5, HIGH);
digitalWrite(in6, LOW);
}
void right()
{
digitalWrite(in5, LOW);
digitalWrite(in6, HIGH);
}

postmaster-ino

Hi

Packe bitte Deinen Sketch in CODE-Tags (code)...(/code) (nur in eckigen Klammern).
Dann noch ein Zusatzbitte: Drücke in der IDE STRG+T und entferne ALLE unnötigen Leerzeilen.

Das kannst Du im Ausgangspost jederzeit abändern. (ggf. 5 Minuten-Sperre, da <100 Post's)

Die 'Pipe' ist eine Art Kennung, Die muß bei Sender und Empfänger identisch sein - Da hört's dann aber langsam bei mir auch schon wieder auf.
Versuch doch einfach, was passiert, wenn Du in diesem Buchstaben/Ziffern-Salat was änderst - solltest Das auf beiden Seiten identisch machen ;).

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

gregorss

Angesichts des ziemlich unformatierten Codes erlaube ich mir, mal wieder auf das hier hinzuweisen :-)

Gruß

Gregor
„Ich glaube, ich leg' mich noch mal hin", sagte das Bit.

DrDiettrich

Vermutlich gibt es keine Meldung, wenn die Verbindung abreißt. Man könnte dann z.B. 1 min. nach dem letzten empfangenen Kommando stoppen, oder regelmäßig ein Kontrollkommando schicken und stoppen sobald das ausbleibt (Totmann...).

themanfrommoon


postmaster-ino

Hi

Macht diese Zeile:
Code: [Select]
  if (msg[0] >= 128 && msg[0] <= 185)data = msg[0], motorSpeedB = map(data, 185, 128, 0, 255), backward(motorSpeedB);was ich von der Darstellung her vermuten würde?
Also, daß 'die ganze Zeile'  von der IF-Abfrage abhängig ausgeführt wird, da Diese erst bei dem ; endet?
... schaut zumindest 'unrund' aus, gefällt mir nicht ...

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Maff91

Danke für das Feedback. Dennoch hätte ich die Frage wie ich am besten den failsafe in meinen Programmcode integriere.

postmaster-ino

Hi

Du merkst Dir bei jedem empfangenem Telegramm die 'Uhrzeit' - millis().
Code: [Select]
if (millis()-lastmillis>failwait){
  Kommandant an Maschine: Stop;
}


MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Go Up