Forum: Mikrocontroller und Digitale Elektronik Motordrehzahl eingeben Arduino


von Max U. (talha74)


Lesenswert?

Hallo,
ich will die Motordrehzahl im seriellen Monitor eingeben, so dass wenn 
ich z.B. 255 (PWM) eingebe der Motor sich mit maximaler Geschwindigkeit 
dreht.
Ich habe folgenden Code geschrieben, der aber leider nicht funktioniert:
1
#define MOTOR_IN1 9
2
#define MOTOR_IN2 10
3
uint8_t drehzahl;
4
int pwm;
5
void setup() {
6
  Serial.begin(9600);
7
  pinMode(MOTOR_IN1, OUTPUT);
8
  pinMode(MOTOR_IN2, OUTPUT);
9
  while (! Serial); // warten bis System bereit ist
10
  Serial.println("Drehzahl eingeben: ");
11
}
12
13
void loop() {
14
15
    pwm = Serial.read();
16
    delay (50);
17
    while (pwm >=0 && pwm <=255){
18
    
19
    digitalWrite(MOTOR_IN1, LOW);
20
    analogWrite (MOTOR_IN2, pwm);
21
    }
22
}

Man hört, dass sich da was tut aber der Motor bewegt sich nicht.
Ich vermute, dass es an der while-Schleife liegt.
KÖnnt Ihr mir da behilflich sein?

Danke.

: Bearbeitet durch Moderator
von Adam P. (adamap)


Lesenswert?

Der Wert 255 besteht aus 3 Byte, die du empfangen musst.
Diese musst du dann in ein "int" erst konvertieren.

So empfängst du:
2
5
5

somit ist deine pwm Variable maximal 5.

: Bearbeitet durch User
von Max U. (talha74)


Lesenswert?

Adam P. schrieb:
> Der Wert 255 besteht aus 3 Byte, die du empfangen musst.
> Diese musst du dann in ein "int" erst konvertieren.
>
> So empfängst du:
> 2
> 5
> 5
>
> somit ist deine pwm Variable maximal 5.

Okey habe der Variable pwm den Typ uint8_t zugewiesen.
jedoch funktioniert mein Wunsch immernoch nicht. Sobald ich Spannung 
draufgebe dreht der Motor voll auf. Das was ich im Seriellen Monitor 
eingebe wird ignoriert.

von Michael B. (laberkopp)


Lesenswert?

Max U. schrieb:
> Ich vermute, dass es an der while-Schleife liegt.

Es liegt so ziemlich an Allem.

Dir fehlen alle Grundlagen der Programmierung.

Ein read liest ein Byte, nicht eine Dezimalzahl in Ziffern.

Ein while welches den PWM Wert nicht ändert läuft ewig.

Eine Drehzahl regelt man nicht über das PWM Tastverhältnis, sondern 
regeln heisst MESSEN und dann NACHSTEUERN.

Ein digitalWrite gefolgt von einem analogWrite ist Unsinn.

Wer in einer loop arbeitet, liest mehrfach von serial ein, muss also 
auch jedesmal was eingeben.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Max U. schrieb:
> Das was ich im Seriellen Monitor eingebe wird ignoriert.
Ist wohl noch ein Fehler im Programm.

> Okey habe der Variable pwm den Typ uint8_t zugewiesen.
Du bekommst über die serielle Schnitte 3 ASCII-Zeichen, von denen jedes 
einzelne ein uint8_t ist. Du musst aus diesen drei ASCII-Zeichen den 
eigentlichen pwm-Wert erst noch ausrechnen. Stichwort atoi() oder 
ähnlich.

> Sobald ich Spannung draufgebe dreht der Motor voll auf. Das was ich im
> Seriellen Monitor eingebe wird ignoriert.
Was passiert denn, wenn du da mal testweise feste Werte im Programm 
vorgibst? Also drei Programme, mal mit pwm=10, und dann pwm=50, und dann 
pwm=200?

Max U. schrieb:
> so dass wenn ich z.B. 255 (PWM) eingebe der Motor sich mit maximaler
> Geschwindigkeit dreht.
Wie ist denn "der Motor" an den Andruiden angeschlossen?

: Bearbeitet durch Moderator
von Bastler (Gast)


Lesenswert?

Wenn du von Hand in die serielle Konsole etwas eingibst dann werden 
ASCII Zeichen übertragen.
Wie bereits geschrieben sendest du eine "2" "5" "5" also 0x32,0x35,0x35.
Diese DREI Werte musst du in EINE PWM-Variable umrechnen.

von Sebastian R. (sebastian_r569)


Lesenswert?

Max U. schrieb:
> Okey habe der Variable pwm den Typ uint8_t zugewiesen.

Abgesehen davon dass du das ganz sicher nicht getan hast, löst das immer 
noch nicht das Problem, das Adam angesprochen hat.


Guck dir mal die Serial.ReadString() an. Die könnte helfen. Und dann 
atoi().

von Max U. (talha74)


Lesenswert?

Michael B. schrieb:
> Max U. schrieb:
>> Ich vermute, dass es an der while-Schleife liegt.
>

> Eine Drehzahl regelt man nicht über das PWM Tastverhältnis, sondern
> regeln heisst MESSEN und dann NACHSTEUERN.
Wer sagt denn dass ichhier was regeln will, wozu soll ich die Drehzahl 
messen. Du weißt doch garnicht worum es geght. Ich will nix messen 
brauche es auch nicht. Der Motor soll sich nur mit meiner vorgegebenen 
Drehzahl durch die Software drehen da brauche ich nichts zu messen.
>
> Ein digitalWrite gefolgt von einem analogWrite ist Unsinn.
Wieso ist das Unsinn

von Sebastian R. (sebastian_r569)


Lesenswert?

Max U. schrieb:
>> Ein digitalWrite gefolgt von einem analogWrite ist Unsinn.
> Wieso ist das Unsinn

Weil du den Pin ziemlich schnell zwischen ausgeschaltetem Ausgang und 
PWM-Ausgang mit Timer im Hintergrund umschaltest.

"AnalogWrite" ist eine sehr irreführende Bezeichnung. Damit stellst du 
das Tastverhältnis vom am Ausgang erzeugten PWM ein. Du musst nichts 
ausschalten.


Ah. Vergiss es. Es sind unterschiedliche Pins. Das hat Michael 
vermutlich auch übersehen.

: Bearbeitet durch User
von Max U. (talha74)


Lesenswert?

Sebastian R. schrieb:
> Max U. schrieb:
>>> Ein digitalWrite gefolgt von einem analogWrite ist Unsinn.
>> Wieso ist das Unsinn
>
> Weil du den Pin ziemlich schnell zwischen ausgeschaltetem Ausgang und
> PWM-Ausgang mit Timer im Hintergrund umschaltest.
>
> "AnalogWrite" ist eine sehr irreführende Bezeichnung. Damit stellst du
> das Tastverhältnis vom am Ausgang erzeugten PWM ein. Du musst nichts
> ausschalten.

Ich sage doch nur, dass an einen Pin ein LOW-Signal geschrieben werden 
soll und an den anderen der PWM-Wert, sodass der Motor in eine Richtung 
dreht.

von Hannes (Gast)


Lesenswert?

Max U. schrieb:
> Michael B. schrieb:
>> Max U. schrieb:
>>> Ich vermute, dass es an der while-Schleife liegt.
>>
>
>> Eine Drehzahl regelt man nicht über das PWM Tastverhältnis, sondern
>> regeln heisst MESSEN und dann NACHSTEUERN.
> Wer sagt denn dass ichhier was regeln will, wozu soll ich die Drehzahl
> messen. Du weißt doch garnicht worum es geght. Ich will nix messen
> brauche es auch nicht. Der Motor soll sich nur mit meiner vorgegebenen
> Drehzahl durch die Software drehen da brauche ich nichts zu messen.
>>
>> Ein digitalWrite gefolgt von einem analogWrite ist Unsinn.
> Wieso ist das Unsinn

Du schreibst du möchtest eine Drehzahl einstellen. Eine Drehzahl ist 
unabhängig von der PWM. So könntest du eine PWM mit dem Wert 100 
einstellen und den Motor festhalten. Dann ist deine Drehzahl 0. Also 
müsste dein uC dann nachregeln um auf eine Drehzahl X zu kommen.

Was du möchtest ist keine Drehzahl einstellen sondern nur ein PWM 
Tastverhältnis. Was der Motor im Endeffekt draus macht ist dir egal.

Wenn du sinnvolle Hilfe möchtest, beschreibe lieber mal deinen Code in 
der Loop, das sieht alles sehr "spannend" aus. Beachte auch den Hinweis 
mit dem ASCII Code. Die '2' '5' '5' sieht zwar aus wie ne Zahl ist aber 
letztendlich mit einem Buchstaben zu vergleichen.
Der erste Schritt wäre somit die Daten zu empfangen z.B. in einem 
String. Dann die einzelnen Elemente zu ihren Eigenwerten umzuwandeln, 
bei Zahlen ist das immer -48, also z.B. fünf = (int)'5'-48; Dann musst 
du noch die erste Stelle mit 10^2 und die 2. mit 10^1 multiplizieren.

Dann postet du dein Ergebnis und wir können weiter arbeiten.

von Udo S. (urschmitt)


Lesenswert?

Welcher Vollhonk hat eigentlich Michael B. (laberkopp) ein Minus 
gegeben.
Er hat völlig recht und praktisch alle groben Fehler des TOs aufgezählt!

Ja die Wahrheit kann manchmal wehtun, aber vieleicht kann der 
Minusbewerter ja das korrekte Programm tanzen.

von Adam P. (adamap)


Lesenswert?

@ Max U. (talha74)

Am besten du unterteilst dein Problem in Abschnitte,
dann wirst du dabei am meisten lernen.

1) Wie empfange ich mehrere Zeichen in einen String (char oder uint8_t 
Array).

2) Wie prüfe ich die empfangenen Zeichen auf eine korrekte Zahl.

3) Wie konvertiere ich die empfangenen Zeichen in eine Ganzzahl 
(Variable).

Und wenn das alles funktioniert, dann wird wohl auch deine PWM 
funktionieren.

von Max U. (talha74)


Lesenswert?

>
> Wenn du sinnvolle Hilfe möchtest, beschreibe lieber mal deinen Code in
> der Loop, das sieht alles sehr "spannend" aus. Beachte auch den Hinweis
> mit dem ASCII Code. Die '2' '5' '5' sieht zwar aus wie ne Zahl ist aber
> letztendlich mit einem Buchstaben zu vergleichen.
> Der erste Schritt wäre somit die Daten zu empfangen z.B. in einem
> String. Dann die einzelnen Elemente zu ihren Eigenwerten umzuwandeln,
> bei Zahlen ist das immer -48, also z.B. fünf = (int)'5'-48; Dann musst
> du noch die erste Stelle mit 10^2 und die 2. mit 10^1 multiplizieren.
>
> Dann postet du dein Ergebnis und wir können weiter arbeiten.

void zahl2string ( char zahl)
{
  char hunderter, zehner, einer;
  hunderter = zahl / 100;
  zehner = ( zahl - 100 * hunderter) / 10;
  einer = ( zahl - 100  hunderter - 10  zehner);
  ADstring [0] = 0x30 + hunderter;
  ADstring [1] = 0x30 + zehner;
  ADstring [2] = 0x30 + einer;
  return;
}

Habe diese Umrechnung vorgenommen. Hoffe sie ist richtig. Wie schreibe 
ich nun den Wert an den Pin?

von Sebastian R. (sebastian_r569)


Lesenswert?

Max U. schrieb:
> void zahl2string ( char zahl)
> {
>   char hunderter, zehner, einer;
>   hunderter = zahl / 100;
>   zehner = ( zahl - 100 * hunderter) / 10;
>   einer = ( zahl - 100  hunderter - 10  zehner);
>   ADstring [0] = 0x30 + hunderter;
>   ADstring [1] = 0x30 + zehner;
>   ADstring [2] = 0x30 + einer;
>   return;
> }
>
> Habe diese Umrechnung vorgenommen. Hoffe sie ist richtig. Wie schreibe
> ich nun den Wert an den Pin?

void-Funktion und dann ein Return? Naja gut. Wird der Compiler nicht 
mögen.

Aber: Du willst ja einen String in eine Zahl umwandeln. Deine Funktion 
scheint genau die andere Richtung zu versuchen.

Ich nenne noch einmal atoi() als Recherche-Ausgangspunkt. Denn solche 
Standard-Funktionen haben schon andere vor dir versucht. Und sogar so 
gut gelöst, dass sie standardmäßig bei C(++) mit dabei ist :D

von Reiner Gast (Gast)


Lesenswert?

Max U. schrieb:
>>
>> Wenn du sinnvolle Hilfe möchtest, beschreibe lieber mal deinen Code in
>> der Loop, das sieht alles sehr "spannend" aus. Beachte auch den Hinweis
>> mit dem ASCII Code. Die '2' '5' '5' sieht zwar aus wie ne Zahl ist aber
>> letztendlich mit einem Buchstaben zu vergleichen.
>> Der erste Schritt wäre somit die Daten zu empfangen z.B. in einem
>> String. Dann die einzelnen Elemente zu ihren Eigenwerten umzuwandeln,
>> bei Zahlen ist das immer -48, also z.B. fünf = (int)'5'-48; Dann musst
>> du noch die erste Stelle mit 10^2 und die 2. mit 10^1 multiplizieren.
>>
>> Dann postet du dein Ergebnis und wir können weiter arbeiten.
>
> void zahl2string ( char zahl)
> {
>   char hunderter, zehner, einer;
>   hunderter = zahl / 100;
>   zehner = ( zahl - 100 * hunderter) / 10;
>   einer = ( zahl - 100  hunderter - 10  zehner);
>   ADstring [0] = 0x30 + hunderter;
>   ADstring [1] = 0x30 + zehner;
>   ADstring [2] = 0x30 + einer;
>   return;
> }
>
> Habe diese Umrechnung vorgenommen. Hoffe sie ist richtig. Wie schreibe
> ich nun den Wert an den Pin?

Ohje... warum einfach machen, wenn es kompliziert geht:

Nimm für die Umwandlung von...
... Integer in String: http://www.cplusplus.com/reference/cstdlib/itoa/
... String in Integer: http://www.cplusplus.com/reference/cstdlib/atoi/

Ist alles schon in C/C++ vorhanden

von Hannes (Gast)


Lesenswert?

Wie die Funktion schon sagt zahl2string, was du brauchst ist 
string2zahl.
Der Wertebereich char ist auch eher schlecht weil nur er nur bis 127 
geht, du könntest unsigned char nutzen dann hast du 0 - 255.

Ist dir inzwischen bewusst, wie die Daten aussehen die du per serieller 
Kommunikation erhälst? Übermittelt dir die Funktion einen string mit 
allen gesendeten Bytes oder immer nur ein Byte?

von PittyJ (Gast)


Lesenswert?


von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Adam P. schrieb:
> Und wenn das alles funktioniert, dann wird wohl auch deine PWM
> funktionieren.
Und dann wissen wir immer noch nicht, ob der Motor mit der korrekten PWM 
auch das tut, was sich der Max wünscht.

Max U. schrieb:
> Du weißt doch garnicht worum es geght.
Dann ändere das. Ich hatte z.B. schonmal danach gefragt, WAS zur Hölle 
denn da eigentlich angesteuert werden soll. Und dann habe ich auch noch 
einen Tipp zur systematischen Fehlersuche gegeben (fixe PWM-Werte 
vorgeben und schauen, ob sich da was ändert). Aber wenn du lieber 
planlos herumwursteln willst, dann mach einfach weiter wie bisher.

: Bearbeitet durch Moderator
von Adam P. (adamap)


Lesenswert?

Das folgende ist NICHT SCHÖN und wird so auch nicht programmiert,
da es sich um ein blockierendes Einlesen handelt.

Aber vllt. wird dir dadurch klar wie das mit dem Einlesen ablaufen 
sollte.

Code ist nicht getestet! Soll dir lediglich die Funktionsweise zeigen.
1
#define INPUT_MAX_LENGTH  4
2
3
void loop()
4
{
5
  uint8_t ch;
6
  uint8_t input[INPUT_MAX_LENGTH];
7
  uint8_t index = 0;
8
9
  uint8_t pwm;
10
11
  bool read_end = false;
12
  
13
  while (!read_end)
14
  {
15
    ch = Serial.read();
16
    
17
    /* Abbruch durch ENTER */
18
    if (ch == '\n')
19
    {
20
      read_end = true;
21
    }
22
    /* Wert zuweisen */
23
    else
24
    {
25
      input[index] = ch;
26
      index++;
27
      
28
      /* Kein Platz mehr */
29
      if (index == (INPUT_MAX_LENGTH-1))
30
      {
31
        read_end = true;
32
      }
33
    }
34
  }
35
  
36
  /* String abschliessen */
37
  input[index] = '\0';
38
  
39
  /* Wert konvertieren */
40
  pwm = atoi(input);
41
  
42
  /* Hier den pwm Wert an den Ausgang übergeben */
43
}

von Adam P. (adamap)


Lesenswert?

Lothar M. schrieb:
> Und dann wissen wir immer noch nicht, ob der Motor mit der korrekten PWM
> auch das tut, was sich der Max wünscht.

Ich glaub er will einfach nur dass im Leerlauf ein Unterschied zwischen 
0, 50, oder 255 zu erkennen ist...

Wenn das Einlesen mit Hilfe von Arrays schon solche Schwierigkeiten 
bereitet - dann bezweifel ich, dass die Idee mit der "Regelstrecke" so 
schlau war.

von Adam P. (adamap)


Lesenswert?

Adam P. schrieb:
> /* Wert konvertieren */
>   pwm = atoi(input);

Weiterhin würde man an dieser Stelle noch eine Bereichsprüfung 
durchführen, da du ja auch 380 eingeben könntest:
1
/**
2
* Mal davon ausgegangen, dass jmnd. ein Minuszeichen eingibt
3
* auch wenn dann nur noch 2 Zeichen für die Zahl bleiben.
4
*/
5
int32_t tmp;
6
7
tmp = atoi(input);
8
9
if (tmp < 0)    pwm = 0;
10
if (tmp > 255)  pwm = 255;

von Joachim B. (jar)


Lesenswert?

unabhängig was schon alles geschriebn wurde, vielleicht hilft das auch

Zeichen einsammeln bis <ENTER> kommt per Serial.event (also im 
Interrupt)

Max U. schrieb:
> ich will

nanu, fehlt nur noch mit dem Fuß aufstampfen, haben wir nicht gelernt 
"ich möchte" zu sagen?

nun gut, vieles wurde schon geschrieben, auch vieles richtige, vor allem 
steht erst mal lernen an:

Serial.event ist z.B. eine gute Idee
1
#define MAXBUFFER 20
2
uint8_t chr_cnt=0;
3
4
char serial_in_command[MAXBUFFER];
5
char serial_in_buff[MAXBUFFER];
6
7
char serial_in_command[MAXBUFFER]={0};
8
char serial_in_buff[MAXBUFFER]={0};
9
10
setup();
11
{
12
  //Serial.begin(9600); warum so langsam 19k2 ist auch gut!
13
  Serial.begin(19200); 
14
  delay(200); // etwas warten bis alle Spannungen stehen war immer gut
15
16
//------ section seriell PRINT ------
17
  Serial.println(F("tach auch...."));
18
  Serial.print(F("Arduino             = ")); Serial.println(ARDUINO); // ardu_
19
  Serial.print(F("__VERSION__         = ")); Serial.print(__VERSION__); // versio_
20
//  Serial.print(F("__GNUC_MINOR__      = ")); Serial.println(__GNUC_MINOR__);
21
//  Serial.print(F("__GNUC_PATCHLEVEL__ = ")); Serial.println(__GNUC_PATCHLEVEL__);
22
#if defined(__AVR_ATmega328P__)
23
  Serial.println(F(", auf nanoV3 oder proMINI auf 328p"));
24
#endif
25
}
26
27
boolean stringComplete = false;
28
29
void inSTR_Auswertung(void) 
30
{ Serial.println(); Serial.print(serial_in_command);  Serial.println(F(" -> erkannt")); 
31
    
32
  if( !strcmp(serial_in_command, "help") || ( !strcmp(serial_in_command, "?") && strlen(serial_in_command)==1 ) )
33
  { // help screen
34
    Serial.println();
35
    Serial.println(F("commands: "));
36
    Serial.println();
37
    Serial.println(F("eigene_Kommandos"));
38
39
    Serial.println(F("reset")); // jaja kein echter reset bzgl. der Hardware ich weiss
40
    Serial.println();
41
  } // if( !strcmp(serial_in_command, "help") || ( !strcmp(serial_in_command, "?") && strlen(serial_in_command)==1 ) )
42
        
43
  else if( strstr(serial_in_command, "eigene_Kommandos") )
44
  { 
45
    // was halt zu tun ist
46
  }
47
  else if( !strcmp(serial_in_command, "reset") )
48
  { // "reset"
49
    *serial_in_command=0;
50
    Serial.println(F("reset in 5s!"));
51
    delay(5000);
52
    {asm("ldi r30,0"); asm("ldi r31,0"); asm("ijmp");}
53
  } // if( !strcmp(serial_in_command, "reset") )
54
  else
55
    *serial_in_command=0;
56
  
57
  *serial_in_command=0;
58
  stringComplete = false;
59
} // void inSTR_Auswertung(void)
60
61
62
63
void serialEvent(void) 
64
{ while (Serial.available()) 
65
  { char incomingByte = (char)Serial.read();
66
    if(incomingByte == 13)  // Wenn das Enter ankommt
67
    { serial_in_buff[chr_cnt] = '\0';
68
      strcpy(serial_in_command, serial_in_buff);
69
      memset(&serial_in_buff[0], 0, sizeof(serial_in_buff));
70
      chr_cnt = 0;
71
      stringComplete = true;
72
    }
73
    else // Falls kein Enter kommt muss der Text gespeichert werden in dem inText Array
74
    { if(isprint(incomingByte))
75
      { if(chr_cnt<(MAXBUFFER-2))
76
          serial_in_buff[chr_cnt++] = incomingByte;
77
        else
78
        { Serial.println(F("serBUF ov-> DEL"));
79
          memset(&serial_in_buff[0], 0, sizeof(serial_in_buff));
80
          memset(&serial_in_command[0], 0, sizeof(serial_in_command));
81
          chr_cnt=0;
82
        } // if(chr_cnt<(MAXBUFFER-2))
83
      } // if(isprint(incomingByte))
84
    } // if !(incomingByte == 13)
85
  } // while (Serial.available()) 
86
} // void serialEvent() 
87
88
89
void loop(void) 
90
{ 
91
92
// was so zu tun ist
93
94
  if(stringComplete) 
95
  { inSTR_Auswertung();
96
    stringComplete = false;
97
  } // if(stringComplete)
98
} // void loop(void)

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Adam P. schrieb:
> Lothar M. schrieb:
>> Und dann wissen wir immer noch nicht, ob der Motor mit der korrekten PWM
>> auch das tut, was sich der Max wünscht.
> Ich glaub er will einfach nur dass im Leerlauf ein Unterschied zwischen
> 0, 50, oder 255 zu erkennen ist...
Dann soll er naheliegenderweise doch mal genau das ausprobieren. Und 
wenn das dann funktioniert, dann kann er die Sache mit der seriellen 
Schnitte und der Interpretation der dort ankommenden Zeichen angehen.

> Ich glaub er will einfach nur
Und um ihm dabei zu helfen, wäre es m.E. nicht ganz umwichtig, die 
verwendete Hardware zu kennen. Wenns dumm kommt, dann hat er nämlich 
selber eine Brücke aus dem "Lehrbuch für Anfänger des Brückenbaus" 
aufgebaut und die tut jetzt aufgrund ihrer schlichten Einfachheit 
einfach nicht.

von Stephan.M (Gast)


Lesenswert?

Hallo Max,

die loop-Schleife wird permanent ausgeführt, daher ist die 
while-Schleife
in deinem Fall unnütz.
Um den Variablenbereich auf Gültigkeit zu prüfen sollte while durch if 
ersetzt werden.

Serial.read() liest ein einziges 'int' ein und setzt die 
Programmausführung fort.
Wenn der Serielle Puffer leer ist blockiert diese Funktion und wartet 
auf einen 'int'. Das Programm ist blockiert.
Deshalb vorher nachschauen ob was zun einlesen da ist.
Da im Seriellen Monitor der Arduino IDE ASCII zeichen übergeben werden 
könntest du es einmal mit der Eingabe eines Buchstaben versuchen:
Die Ziffer 0 entspricht dem wert 30 DEZ
Der Buchstabe A -> 41 Dez
Der Buchstabe a -> 61 Dez
Das Zeichen ~  -> 126 Dez
Wenn in der Arduino IDE zum abschicken des Zeichens ein Return 
erforderlich ist, und dieses mitgesendet wird lesen wir es einfach mit 
ein um den Puffer zu leeren. Sonst würde beim nächsten 'loop' der Return 
als PWM wert eingelesen.

void loop() {
    if (Serial.available() > 0) {
    pwm = Serial.read();
    Serial.read();  // Return einlesen
    }
    delay (50);
    if (pwm >=0 && pwm <=255){

    digitalWrite(MOTOR_IN1, LOW);
    analogWrite (MOTOR_IN2, pwm);
    }
}

Ich habe dies nicht getestet daher: Vorsicht gefährliches Halbwissen!

Gruß Stephan

von guest (Gast)


Lesenswert?

Max U. schrieb:
> Ich sage doch nur, dass an einen Pin ein LOW-Signal geschrieben werden
> soll und an den anderen der PWM-Wert, sodass der Motor in eine Richtung
> dreht.

Liest sich, als ob da ein Stepper-Controller dranhängt (wegen dem 
Direction Pin). Dann wäre PWM allerdings völlig für den Allerwertesten.

von Sebastian R. (sebastian_r569)


Lesenswert?

guest schrieb:
> Liest sich, als ob da ein Stepper-Controller dranhängt (wegen dem
> Direction Pin). Dann wäre PWM allerdings völlig für den Allerwertesten.

Bei nem L293 oder so nicht unbedingt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.