Forum: Mikrocontroller und Digitale Elektronik 4 Schrittmotoren ansteuern über IR-Fernbedienung (Schulprojekt)


von Laurent B. (Firma: Fischer Reinach AG) (derpolymechaniker)


Angehängte Dateien:

Lesenswert?

Hallo geschätzte Elektronikfreunde

In der Schule entwickeln wir gerade eine Maschine, welche zum Trainieren 
von Spurhunden dienen soll. Eine Funktion deren ist, dass sich 4 
Drehteller drehen sollen. Diese sind von 4 Schrittmotoren angetrieben.

Soweit habe ich ein Programm geschrieben, wo sich die Schrittmotoren 
über den seriellen Monitor ansteuern lassen.

Nun möchte ich das Signal über eine IR-Fernbedienung geben und die 
Steppers so steuern.

Habe das Programm erweitert, bekomme aber ständig diese Fehlermeldungen 
(Anhang Bild):


Mein Programm:

#include <IRremote.h>                        // Library wird eingebunden
#include "MeMegaPi.h"
#include <SoftwareSerial.h>

MeStepperOnBoard stepper1 (SLOT_1);          //Schrittmotor 1 am SLOT 1
MeStepperOnBoard stepper2 (SLOT_2);          //Schrittmotor 2 am SLOT 2
MeStepperOnBoard stepper3 (SLOT_3);          //Schrittmotor 3 am SLOT 3
MeStepperOnBoard stepper4 (SLOT_4);          //Schrittmotor 3 am SLOT 4


int RECV_PIN = 30;                           // Definiere Sensor 
Pin_IR-Empfänger am Pin 30
IRrecv irrecv(RECV_PIN);
decode_results results;





void setup()
{

  irrecv.enableIRIn();                       // Starte den Empfänger

  Serial.begin(9600);                        // Setze die Baudrate auf 
xy (bits/sec)

  stepper1.setMaxSpeed(100);                 // Einstellungen der 
Schrittmotoren
  stepper1.setAcceleration(20000);
  stepper1.setMicroStep(10);
  stepper1.enableOutputs();

  stepper2.setMaxSpeed(100);
  stepper2.setAcceleration(20000);
  stepper2.setMicroStep(10);
  stepper2.enableOutputs();

  stepper3.setMaxSpeed(100);
  stepper3.setAcceleration(20000);
  stepper3.setMicroStep(10);
  stepper3.enableOutputs();

  stepper4.setMaxSpeed(100);
  stepper4.setAcceleration(20000);
  stepper4.setMicroStep(10);
  stepper4.enableOutputs();

}


void loop()

  {

  if (Serial.available())

  if(irrecv.decode(&results))                  //Überprüfe ob ein Code 
empfangen wurde



  switch(results.value){

    char a = Serial.read();
    switch (a)

    {
      case 0xFF6897:
        stepper1.moveTo(0);
        stepper2.moveTo(0);
        stepper3.moveTo(0);
        stepper4.moveTo(0);
        break;

      case 0XFF30CF:
        stepper1.move(66.6666666667);
        break;

      case 0xFF18E7:
        stepper2.move(66.6666666667);
        break;

      case 0xFF7A85:
        stepper3.move(66.6666666667);
        break;

      case 0xFF10EF:
        stepper4.move(66.6666666667);
        break;
    }

  }
  stepper1.run();
  stepper2.run();
  stepper3.run();
  stepper4.run();
}






Wäre sehr froh, wenn mir jemand helfen würde. :)
Besten Dank im Vorraus

Freundliche Gruesse

Laurent

von Alex G. (dragongamer)


Lesenswert?

Hmm, hast du denn erstmal ein Beispielprogramm welches den IR Empfänger 
verwendet, erfolgreich kompiliert und verwendet?
Wenn ja, dann such nach Unterschieden zu deinem Programm.

Womöglich liegt es an der Reihenfolge.
Muss nicht MeMegaPi.h als allererstes rein?

von Sven K. (quotschmacher)


Lesenswert?

und so wie es aussieht wollen auch 2 libraries den interruptvektor 13 
nutzen...

von Laurent B. (Firma: Fischer Reinach AG) (derpolymechaniker)


Lesenswert?

Hallo

Ja ich habe bereits ein Beispielprogramm welches den IR-Empfänger 
verwendet, kompiliert und hochgeladen. Dies hat funktioniert.
Auch die Reihenfolge habe ich geändert bei #include, aber bekomme immer 
noch dieselbe Fehlermeldung.

Gruesse

von Johannes S. (Gast)


Lesenswert?

Dieses MeMegaPi.h includiert ja Gott und die Welt und wird sich wohl 
alle Resourcen krallen. Da darin aber auch ein IRReceiver enthalten ist 
macht es wohl Sinn den zu benutzen und IRremote.h rauszuschmeissen. Auch 
SoftwareSerial.h kann raus weil MegaPi das auch benutzt.

Edit:
Das Makeblock Zeug verwendet einen Hardware Decoder für das IR Modul, 
die IRReceiver daraus kann man also nicht mit einem einer einfachen 
Empfängerdiode verwenden.

von Laurent B. (Firma: Fischer Reinach AG) (derpolymechaniker)


Lesenswert?

Hallo

Habe die Datei MeIR.cpp gelöscht und konnte das Programm erfolgreich 
kompilieren und hochladen.

Jedoch, kommt das Signal nicht an bzw. die Motoren lassen sich bei 
Tastendruck nicht in Bewegung versetzen.

Der IR-Empfänger und die Steppers sind intakt. Mit einzelnen Programmen 
lassen sie sich steuern.

Habt Ihr eine Idee?


Gruesse

von Alex G. (dragongamer)


Lesenswert?

Du kannst doch nicht einfach ne Datei löschen...
Beachte was Johannes geschrieben hat. Er scheint auf der richtigen Spur 
zu sein.
Im Gegensatz zum PC muss man bei uCs mehr darauf achten ob zwei libs 
miteinander kompatibel sind.

von Johannes S. (Gast)


Lesenswert?

Laurent B. schrieb:
> switch(results.value){
>
>     char a = Serial.read();
>     switch (a)
>
>     {
>       case 0xFF6897:

das sieht sehr unsinnig aus. Ein Char kann nicht den Wert 0xFF6897 
annehmen, das Serial.read und switch(a) muss weg.

von Johannes S. (Gast)


Lesenswert?

Alex G. schrieb:
> Du kannst doch nicht einfach ne Datei löschen...

scheint eher zufällig zu gehen (wenn es wirklich) klappt. Schön ist was 
anderes...
Ich weiss schon warum ich lieber mbed benutze :)

von Laurent B. (Firma: Fischer Reinach AG) (derpolymechaniker)


Lesenswert?

Johannes S. schrieb:
> Laurent B. schrieb:
>> switch(results.value){
>>
>>     char a = Serial.read();
>>     switch (a)
>>
>>     {
>>       case 0xFF6897:
>
> das sieht sehr unsinnig aus. Ein Char kann nicht den Wert 0xFF6897
> annehmen, das Serial.read und switch(a) muss weg.

Hallo Johannes, schön von Dir zu hören.

Habe ich mir zuerst auch gedacht. :D
Ich habe das in etwa so übernommen vom MegaPiOnBoardStepperTest.ino 
Sketch.
Danach versucht ihn zu erweitern.

Der TSOP-IR-Empfänger funzt auch auf dem MegaPi. Getestet im IRrecvDemo.

Hier ist mein Programm ohne die IRrecv etc. Erweiterung.
Der char bzw. im case '1' '2' etc. Wenn ich diese Nummern im seriellen 
Monitor eingebe und bestätige, dann drehen sich die Motoren wie 
erwünscht.
Doch wie bringe ich den Code der IR-fernbedienung iwie ins Case oder wie 
auch immer? :D


Programm:

#include "MeMegaPi.h"
#include <SoftwareSerial.h>

MeStepperOnBoard stepper  (SLOT_1);
MeStepperOnBoard stepper2 (SLOT_2);
MeStepperOnBoard stepper3 (SLOT_3);
MeStepperOnBoard stepper4 (SLOT_4);

void setup()
{
  Serial.begin(9600);

  stepper.setMaxSpeed(100);
  stepper.setAcceleration(20000);
  stepper.setMicroStep(10);
  stepper.enableOutputs();

  stepper2.setMaxSpeed(100);
  stepper2.setAcceleration(20000);
  stepper2.setMicroStep(10);
  stepper2.enableOutputs();

  stepper3.setMaxSpeed(100);
  stepper3.setAcceleration(20000);
  stepper3.setMicroStep(10);
  stepper3.enableOutputs();

  stepper4.setMaxSpeed(100);
  stepper4.setAcceleration(20000);
  stepper4.setMicroStep(10);
  stepper4.enableOutputs();

}

void loop()
{
  if (Serial.available())
  {
    char a = Serial.read();
    switch (a)
    {
      case '0':
        stepper.moveTo(0);
        stepper2.moveTo(0);
        stepper3.moveTo(0);
        stepper4.moveTo(0);
        break;

      case '1':
        stepper.move(66.6666666667);
        break;

      case '2':
        stepper2.move(66.6666666667);
        break;

      case '3':
        stepper3.move(66.6666666667);
        break;

      case '4':
        stepper4.move(66.6666666667);
        break;
    }

  }
  stepper.run();
  stepper2.run();
  stepper3.run();
  stepper4.run();
}

von Laurent B. (Firma: Fischer Reinach AG) (derpolymechaniker)


Lesenswert?

Hallo

Habe die Sachen weggenommen und komplett auf char und das ganze Zeug 
verzichtet.

Funktioniert jetzt. :)


Besten Dank für Eure Inputs. :)

von Johannes S. (Gast)


Lesenswert?

Gut, aber jetzt nicht weiter nach fertigen Libs googlen sondern mal nach 
einem C Tutorial. So geheimnisvoll und schwierig ist die Switch-Case 
Syntax nicht.

von Laurent B. (Firma: Fischer Reinach AG) (derpolymechaniker)


Lesenswert?

Johannes S. schrieb:
> Gut, aber jetzt nicht weiter nach fertigen Libs googlen sondern mal nach
> einem C Tutorial. So geheimnisvoll und schwierig ist die Switch-Case
> Syntax nicht.

Ja bin dran. Aber habe leider nicht so die Zeit, da die Schule wieder 
anfängt und Prüfungen anstehen. Und bissl Urlaub habe ich auch noch. :)

Vielen Dank Dir nochmals Johannes :)


Gruesse

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.