Forum: Mikrocontroller und Digitale Elektronik Motoren Ansteuerung mit Arduino Seeeduino atmega168


von Mario G. (mario_g)


Lesenswert?

Ich versuche mit einem arduino seeeduino atmega168 4 Motoren anzusteuern
(Signal kommt von einer selbst geschriebenen APP)

Zuerst sollten sich die Motoren alle gleich schnell drehen - Kein
Problem
Jetzt ist eine Art Steuerung dazugekommen
Folgendes Prinzip:

   Das Signal besteht aus 3 Zahlen
   Dies letzte Zahl ist die Richtung der Bewegung (1 Vor; 2 Zurück; 3
Links;
   4 Rechts; ) die forderen 2 Zahlen geben die Beschleunigung an

   BSP:   51;  Vor - Stärke 5
          73;  Links - Stärke 7

Ich versuche generell die Drehzahl rauszuschreiben und wenn ein Motor
schneller Drehen soll, einfach die Stärke dazu zu addieren

Anfangs Drehen sich die Motoren kurz und dann steht alles still?
1
#include <SoftwareSerial.h>
2
3
int bluetoothTx = 7;
4
int bluetoothRx = 5;
5
6
int M1 = 3;              //   Vorne Links
7
int M2 = 9;              //   Vorne Rechts
8
int M3 = 10;             //   Hinten Links
9
int M4 = 11;             //   Hinten Rechts
10
11
int zdM1=0;
12
int zdM2=0;
13
int zdM3=0;
14
int zdM4=0;
15
16
int x1 = 0;
17
int x2 = 0;
18
int x3 = 0;
19
int x4 = 0;
20
21
int b;
22
int bWert;
23
24
int x = 0;
25
int befehlsWert = 0;
26
int befehl = 0;         //    0 - Drehzahl
27
                        //    1 - Vorwärts
28
                        //    2 - Rückwärts
29
                        //    3 - Links
30
                        //    4 - Rechts
31
32
                        //    5 - Drehen Links
33
                        //    6 - Drehen Rechts
34
                        //    7 - KameraSerbo
35
36
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);
37
38
void setup()
39
{
40
41
  //Setup usb serial connection to computer
42
  Serial.begin(9600);
43
44
  //Setup Bluetooth serial connection to android
45
  bluetooth.begin(115200);
46
  bluetooth.print("$$$");
47
  delay(100);
48
  bluetooth.println("U,9600,N");
49
50
  bluetooth.begin(9600);
51
}
52
53
54
void loop()
55
{
56
  //Read from bluetooth and write to usb serial
57
  if(bluetooth.available())
58
  {
59
    char toSend = (char)bluetooth.read();
60
    x = toSend;
61
    if(x < 0)               // Korrektur des empfangenen Signal
62
    {
63
      x = 255 + x;
64
    }
65
    if(x>120)
66
    {
67
      x = x+1;
68
    }
69
70
    if(x>0)
71
    {
72
73
    //infoZerlegen(x);
74
    //Serial.println(x);
75
76
    b = x % 10;
77
    bWert = x/10;
78
    //Serial.println(b);
79
    if(b == 0){x = bWert*10;}                         //GAS
80
    if(b == 1){zdM3 = bWert; zdM4 = bWert;}           //Vor
81
    if(b == 2){zdM1 = bWert; zdM2 = bWert;}           //Zurueck
82
    if(b == 3){zdM2 = bWert; zdM4 = bWert;}           //Links
83
    if(b == 4){zdM1 = bWert; zdM3 = bWert;}           //Rechts
84
85
    x1  =   x + zdM1;
86
    x2  =   x + zdM2;
87
    x3  =   x + zdM3;
88
    x4  =   x + zdM4;
89
90
    analogWrite(M1,x1);
91
    analogWrite(M2,x1);
92
    analogWrite(M3,x1);
93
    analogWrite(M4,x1);
94
95
96
97
    }
98
99
    delay(100);
100
  }
101
102
  //Read from usb serial to bluetooth
103
  if(Serial.available())
104
  {
105
106
107
    char toSend = (char)Serial.read();
108
    bluetooth.print(toSend);
109
  }
110
}

von Otto (Gast)


Lesenswert?

Du schreibst:

> Das Signal besteht aus 3 Zahlen

dann aber:

>  BSP:   51;  Vor   - Stärke 5
>         73;  Links - Stärke 7


Was soll das?

>   if(x < 0)               // Korrektur des empfangenen Signal
>   {
>     x = 255 + x;
>   }
>   if(x>120)
>   {
>     x = x+1;
>   }

von Mario G. (mario_g)


Lesenswert?

Dies ist Korrektur des Signals das stimmt schon, soweit habe ich das 
schon überprüfft, es kommt erst zum Fehler wenn eine Richtung dazu 
kommt, nur das Gass (gleiche Drehzahl für alle Motoren funktioniert ja)

von Mario G. (mario_g)


Lesenswert?

es besteht MAX aus 3 Zeichen (0-255)

von Otto (Gast)


Lesenswert?

Du wertest aber die Zenerstelle für die Richtung und die Einerstelle für 
die Drehzahl aus - wie soll das funktionieren?

von Mario G. (mario_g)


Lesenswert?

Habe den Fehler gefunden

Einerstelle   -> welcher Motor
Zehnerstelle  -> wie schnell

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


Lesenswert?

Mann, was für ein Sautstall...
Ich habe das Doppelposting gelöscht und den Thread mal aufgeräumt.

@  Mario Gebhart (mario_g)
In Zukunft bitte C-Quelltext zwischen die Tokens setzen:
(Token ohne Leerzeichen verwenden!)
[ c ]
   ....
[ /c ]
Dann wird das so hübsch bunt wie im korrigierten Öffnungspost.

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.