Nano als motorbediening

Hallo,

Ik wil een arduino als motor bediening gebruiken, maar loop tegen wat problemen aan.

De arduino ontvangt zijn commandos via serial.
Hier zit het eerste probleem, tussen verzenden, en dat de arduino iets doet zit er +- 2 seconden vertraging.

Het volgende probleem is dat de linker motor en rechter motor werken (het pwm signaal), maar de rest niet.
Ook de normale pinnen willen niet schakelen.

Hier mijn code:

String message = "0";
  int Ll1 = 0;
  int Rl1 = 0;
  int M1 = 0;
  int LM = 0;
  int RM = 0;
  int MM = 0;
  int Led = 0;

int LMotor  = 9;
int RMotor = 10;
int MMotor = 11;
int LED = 6;

int Lmotor = 2;
int Rmotor = 3;
int Mmotor = 4;
  

  
void setup() {
  Serial.begin(115200);
  // put your setup code here, to run once:
pinMode(LMotor, OUTPUT);//led pwm
pinMode(RMotor, OUTPUT);//links motor pwm
pinMode(MMotor, OUTPUT);//rechts motor pwm
pinMode(LED, OUTPUT);//midden motor pwm

pinMode(Lmotor, OUTPUT);//links voor/achteruit
pinMode(Rmotor, OUTPUT);//rechts voor/achteruit
pinMode(Mmotor, OUTPUT);//midden voor/achteruit
pinMode(13, OUTPUT);//controle led


}

void loop() {
  // put your main code here, to run repeatedly:
// message voorbeeld: L=255R=180M=100l=1r=0m=1led=190
if (Serial.available() > 0) {
  digitalWrite (13, 1);
message = Serial.readString();
Serial.print("ontvangen");
Serial.flush();


//pwm waarde voor links
if (message.startsWith("L=", 0)){
char o1[3];
 o1[0] = message[2];
 o1[1] = message[3];
 o1[2] = message[4];
Ll1 = atoi(o1);//int
}
//pwm waarde voor rechts
if (message.startsWith("R=", 5)){
char o2[3];
 o2[0] = message[7];
 o2[1] = message[8];
 o2[2] = message[9];
Rl1 = atoi(o2);//int
}
//pwm waarde voor op/neer
if (message.startsWith("M=", 10)){
char o3[3];
 o3[0] = message[11];
 o3[1] = message[12];
 o3[2] = message[13];
M1 = atoi(o3);//int
}
//links voor of achteruit
if (message.startsWith("l=", 15)){
char o4[1];
 o4[0] = message[15];
LM = atoi(o4);//int of bool
}
//rechts voor of achteruit
if (message.startsWith("r=", 18)){
char o5[1];
 o5[0] = message[17];
RM = atoi(o5);//int of bool
}
//op/neer
if (message.startsWith("m=", 21)){
char o6[1];
 o6[0] = message[19];
MM = atoi(o6);//int of bool
}
//led aan of uit
if (message.startsWith("led=", 24)){
char o7[3];
 o7[0] = message[21];
 o7[0] = message[22];
 o7[0] = message[23];
Led = atoi(o7);//int 
}




}


//D9, D10, D11
//analogWrite(PWM_Pin, PWM_Value);
analogWrite(LMotor, Ll1);
analogWrite(RMotor, Rl1);
analogWrite(MMotor, M1);
analogWrite(LED, Led);


digitalWrite(Lmotor, LM);
digitalWrite(Rmotor, RM);
digitalWrite(Mmotor, MM);

digitalWrite(13,0);




}

Hoi.

Je hebt een seriële verbinding open staan als je hier mee bezig bent.
Dat is een machtig hulpmiddel voor debuggen.
Wat als je nu eens niet alleen naar de terminal roept dat je iets hebt ontvangen, maar ook wat je dan hebt ontvangen ?
En is het misschien een idee als je het resultaat van je bewerkingen die je doet, en die je naar de pinnen stuurt, dat je dat dan ook via de seriële verbinding terugkoppelt ?

Daar zul je een hoop van opsteken.

Overigens vraag ik me af waarom een pin die op je motor is aangesloten, de naam LED heeft, en waarom er bij een naam over een motor een LED zou zitten.
Dit maakt je code lastig te volgen, en het gebruik van de variabele namen geheel overbodig.
Dan kun je net zo goed X, Y, A en B gebruiken.

Hoi,

Bedankt voor je reactie.
Ik had hiervoor inderdaad de "terugreactie" waarin het bericht herhaald werd. Dit bericht komt exact hetzelfde terug als wat ik verstuurd had.

Ik ga inderdaad nog eens kijken naar wat de bewerking doet. Had ik nog niet aan gedacht.

Er komt ook een dimbare lamp op te zitten, vandaar dat er een uitgang LED is.

Ik kon het niet laten en ben gaan proberen. Het werkt. Heel erg bedankt. Ik bleek dus de "Kijk naar" nummers goed te hebben aangepast, alleen de "pak deze nummers " niet. Dit aangepast en het werkte. Alleen pin 3 wil niet meewerken. Deze aangepast voor pin 5 en toen werkte ook deze functie.

Nu zit ik alleen nog met de vertraging. Kan dit zijn omdat hij met de pc is aangesloten? Dit had ik ook met een esp8266.

Ik kan dit alleen nu niet uit testen, omdat mijn ttl converter niet blijkt te werken, en ik daar nog iets op moet vinden

ja er zit veel tijd tussen serieel, dat komt vooral door de PC hoor.en doe de update maar af en toe in een aparte functie dan gaat het sneller.

shooter:
ja er zit veel tijd tussen serieel, dat komt vooral door de PC hoor.en doe de update maar af en toe in een aparte functie dan gaat het sneller.

Het stukje "ontvangen" bedoel je?
Dit gaat helaas niet omdat ik het programma op de pc zo gemaakt heeft dat hij pas wat verstuurd als hij antwoord gekregen heeft. Dat was voor mij de makkelijkste manier om te zien dat de arduino het inkomende bericht geheel had ontvangen.
Ik kan het bericht wel om de 100ms versturen, alleen dat houd de arduino niet bij

Al geprobeerd of Serial timeout aanpassen iets kan versnellen?
Serial.setTimeout()

ArdLab_Gent:
Al geprobeerd of Serial timeout aanpassen iets kan versnellen?
Serial.setTimeout()

Je leert iedere dag weer. Super, Bedankt.
Timeout op 100 gezet, en hij reageert zo goed als direct.
Ook de code nog iets aangepast zodat het bericht korter is.

Blij dat ik kan helpen.

Een time out is mooi als je niet weet wat er allemaal gaat komen.
Dan kijk je net zo lang tot je niets meer ziet komen, en dan moet het dus over zijn met de binnenkomende data.
Das dus een prima mechanisme als je onbekende data binnenkrijgt.
Maar dat is hier niet zo.
Jij krijgt wel bekende data binnen, en je weet van te voren al hoe dat er uit gaat zien.
Daarom kun je je data nog veel sneller verwerken dan nu met deze time out.
Default is dus 1 seconde, en jij hebt er een tiende seconde van gemaakt.
Maar als je weet dat er maximaal 38 tekens komen, dan kun je daar ook naar kijken en hoef je helemaal geen 0.1 seconde te wachten (maar je kunt het wel achter de hand houden).