INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ferngesteuertes Lego-Auto: AFMotor.h, VirtualWire.h & ServoTimer2 .h zusammen?
03.12.2015, 21:05
Beitrag #1
Ferngesteuertes Lego-Auto: AFMotor.h, VirtualWire.h & ServoTimer2 .h zusammen?
Hallo Leute,

momentan versuche ich ein Lego-Technik Auto fernzusteuern. Ich verwende dazu ein Arduino Uno mit einem Adafruit Motorshield v.1 und der entsprechenden Bibliothek (AFMotor.h). Die Lenkung soll über einen Servomotor betätigt werden (X-Achse des Joysticks); der Antriebsmotor ist aus dem 9V-Electric-System Set (Y-Achse des Joysticks).

Die Fernbedienung habe ich mit einem Arduino Nano und einem 2-Achsen Joystick gebaut.

Zunächst habe ich den Servomotor mit der Standard-Servobibliothek (Servo.h) eingebunden; da aber die VirtualWire- und die Servobibliothek nicht zusammen funktionieren, hab ich die ServoTimer2.h Bibliothek benutzt.

Die Werte der einzelnen Achsen des Joysticks werden einwandfrei übertragen und lassen sich auch gut im gewünschten Format ausgeben. Wenn ich allerdings den Servomotor anlege (servo1.attach(ServoPin)), dann funktionieren sowohl der Servomotor als auch der Gleichstrommotor nicht mehr. Der Antriebsmotor lässt sich per Fernbedienung ansteuern, wenn dieser Codeschnipsel weggelassen wird.

Den Code habe ich aus verschiedenen Quellen (u.A. auch diesem Forum) zusammengesetzt und angepasst. Ist mir bei dem Zusammensetzen und Anpassen ein Fehler unterlaufen oder funktionieren die unterschiedlichen Bibliotheken nicht nebeneinander? Oder gibt es andere Gründe für den Einfluss des Servomotors auf den Antriebsmotor?

Über Hilfestellungen wäre ich sehr froh, da ich momentan mit diesem Projekt nicht weiterkomme. Vielen Dank schon einmal…!

Code:
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@open.com.au)
// Copyright (C) 2008 Mike McCauley
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <ServoTimer2.h>
#include <AFMotor.h>
#include <VirtualWire.h>

AF_DCMotor motor2(2, MOTOR12_64KHZ); // create motor #2, 64KHz pwm

#define ServoPin  9

int x_position;
int y_position;

ServoTimer2 servo1;


void setup() {

  // Servo
  //servo1.attach(ServoPin);  // attaches the servo???

    // Inizialize Serial
    Serial.begin(9600);

    Serial.println("setup");
  
    // Due to lack of access to Digital Pins with Motor Shield in place, using Analogue A0 (Arduino Pin 14) as Digital
    vw_set_rx_pin(14);
    
    // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);  // Bits per sec

    vw_rx_start();       // Start the receiver PLL running

  
    Serial.println("setup done");
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
        int i;
        int j;


  digitalWrite(13, true); // Flash a light to show received good message
  // Message with a good checksum received, dump it.
  Serial.print("Got: ");
  
  for (i = 0; i < buflen; i++)
  {
    Serial.print(buf[i], HEX);
    Serial.print(" ");
  }
    Serial.println("");
    digitalWrite(13, false);

    // Format is XnnnnYnnnnAnBnCnDn
    // X is X position of joystick as 4 digits
    // Y is Y position of joystick as 4 digits
    // A is A button on joystick. 0= Not pressed. 1 = pressed
    // B is B button on joystick. 0= Not pressed. 1 = pressed
    // C is C button on joystick. 0= Not pressed. 1 = pressed
    // D is D button on joystick. 0= Not pressed. 1 = pressed

    //Serial.println("");

    x_position = (1000 * (buf[1] - 48)) + (100*(buf[2] - 48)) + (10*(buf[3] - 48)) + (buf[4] - 48);
    y_position = (1000 * (buf[6] - 48)) + (100*(buf[7] - 48)) + (10*(buf[8] - 48)) + (buf[9] - 48);

    Serial.println(x_position);
    Serial.println(y_position);
  
    x_position = map(x_position, 0, 1020, 0, 180);     // scale it to use it with the servo (result  between 0 and 180)

    servo1.write(x_position);                           // sets the servo position according to the scaled value

    delay(15);            // waits for the servo to get there

    Serial.print ("Servo= ");Serial.println (x_position);

  
if(y_position >= 500)
           { y_position = map(y_position, 500, 1020, 0, 255);
           int S1 =  constrain (y_position, 0, 255);
           motor2.run(FORWARD);
           motor2.setSpeed(S1);
           Serial.print ("Vorwaerts= ");Serial.println (S1);
           }
else if(y_position <= 500)
           {y_position = map(y_position, 500, 0, 0, 255);
           int S2 =  constrain (y_position, 0, 255);
           motor2.run(BACKWARD);
           motor2.setSpeed(S2);
           Serial.print ("Rueckwaerts= "); Serial.println (S2);
           }

      }
}

MFG Musashi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.12.2015, 21:24 (Dieser Beitrag wurde zuletzt bearbeitet: 03.12.2015 21:27 von Musashi.)
Beitrag #2
RE: Ferngesteuertes Lego-Auto: AFMotor.h, VirtualWire.h & ServoTimer2 .h zusammen?
Der Servomotor wird über das Adafruit Shield mit Strom versorgt (Servo_2). Ich habe ihn auch schon an den Digitalpin 15 angeschlossen und entsprechend mit Gnd und +5 am Arduino mit Strom versorgt. Das machte keinen Unterschied, falls es hilft, das Problem einzugrenzen...?!? Einen Schaltplan habe ich leider nicht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.12.2015, 21:40 (Dieser Beitrag wurde zuletzt bearbeitet: 03.12.2015 23:10 von Musashi.)
Beitrag #3
RE: Ferngesteuertes Lego-Auto: AFMotor.h, VirtualWire.h & ServoTimer2 .h zusammen?
Danke schon einmal für die schnelle Hilfe!!!

Ich versorge das Motorshield mit 6 NiMH AA Akkus a 1,2 V, wobei der Arduino automatisch mit versorgt wird. Könnte das ein Problem sein?

Ansonsten habe ich bereits den Joystick ohne Fernbedienung direkt an den Arduino angeschlossen und es hat alles einwandfrei funktioniert, auch mit der oben beschriebenen Versorgung. Deswegen ging ich von einem Codeproblem aus...

   

   

   

Ich habe es eben getestet: Leider bleibt das Problem auch bei separater Stromversorgung des Servomotors bestehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Question Auto Projekt dglvnc 2 627 10.06.2015 15:09
Letzter Beitrag: gregors
  Auto Level Quadrocopter (Modellbau Empfänger) Neumi 12 1.694 20.01.2015 13:47
Letzter Beitrag: Eichner
  RF24 und GPS funktionieren nicht zusammen Jochen82 6 1.158 10.10.2014 08:19
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste