Pregunta - Ethernet + Motor Shield

Buenas, es la primera vez que quiero empezar un proyecto con Arduino y compré estos dos dispositivos:

http://shieldlist.org/adafruit/motor
http://shieldlist.org/nuelectronics/ethernet

El proveedor que me lo vendió me dijo que eran compatibles, de hecho los pines encajan justo.
Cuando conecto los 2 shields al mismo tiempo el unico que funciona es el MotorShield y los examples del Ethernet dejan de funcionar, despues de buscar tengo entendido que puede ser al cargar el SPI del ethernet, pero no lo tengo muy claro como es que tengo que hacer para que ambos funcionen.

Lo que quiero hacer es que el motor se prenda cuando hace un GET a una URL.(Tengo ambos codigos que funcionan por separado, no muy distintos a los examples).

Espero haber sido claro.
Muchas gracias!.
Saludos,

Esos shields no son compatibles entre ellos. El de motores, usa pins vitales para la comunicacion SPI con el modulo ethernet. Yo montaria el shield ethernet, y el de motores, conectado externamente con cables, a otros pins, que no use el ethernet, eso si, programando los pins correspondientes al nuevo conexionado.

Uh!, garron, tenes algun enlace en el cual pueda ver como soldar el motor ed tiempos sencillo directo a los pines para hacerlo funcionar?

Muchas gracias!
Saludos,
Ger.

Basicamente, me he basado en los mismos enlaces que tu pusiste. Miralos con atencion. Mirando el del ethernet, veras los pines que no puedes usar para el de motores, y mirando el de motores, y dependiendo del tipo de motor y cantidad de motores que estés conectando, necesitaras conectar unos pines u otros.

Lo que te quiere decir carmeloco es que trabajes un poco, buscando en el codigo para entender que debes reservar los pines SPI para el shield Ethernet.
Lo demas es simplemente ver la librería de motor y elegir los pines mas apropiados.
Buscando el Shield Ethernet encuentras
Pins 10, 11, 12 and 13 are reserved for interfacing with the Ethernet module and should not be used otherwise
Por otro lado el motor shield usa estos pines

Function pins per Ch. A pins per Ch. B
Direction D12 D13
PWM D3 D11
Brake D9 D8
Current Sensing A0 A1

Tienes conflicto entonces con 11, 12 y 13
12 y 13 son digitales comunes asi que no es problema reemplazarlos.
11 es PWM asi que debes elegir un pin PWM disponible y no usarlo para otro fin.

Muchas gracias!

Pude cambiar los pines, estas son las dos clases que estoy trabajando para probar:

MotorClass

// Simple Motor Shield sketch
#include <Servo.h>

// Arduino pins for the shift register
#define MOTORLATCH 12
#define MOTORCLK 4
#define MOTORENABLE 7
#define MOTORDATA 8

// 8-bit bus after the 74HC595 shift register 
// (not Arduino pins)
// These are used to set the direction of the bridge driver.
#define MOTOR1_A 2
#define MOTOR1_B 3
#define MOTOR2_A 1
#define MOTOR2_B 4
#define MOTOR3_A 5
#define MOTOR3_B 7
#define MOTOR4_A 0
#define MOTOR4_B 6

// Arduino pins for the PWM signals.
#define MOTOR1_PWM 4
#define MOTOR2_PWM 3
#define MOTOR3_PWM 6
#define MOTOR4_PWM 5
#define SERVO1_PWM 2
//#define SERVO2_PWM 9

// Codes for the motor function.
#define FORWARD 1
#define BACKWARD 2
#define BRAKE 3
#define RELEASE 4


// Declare classes for Servo connectors of the MotorShield.
Servo servo_1;

int incomingData = 0;   // for incoming serial data

void setup()
{
  Serial.begin(9600);
  
  Serial.println("Clase Motor iniciada");
  
  // Use the default "Servo" library of Arduino.
  // Attach the pin number to the servo library.
  // This might also set the servo in the middle position.
  servo_1.attach(SERVO1_PWM);
  //delay(2000);
  //Websetup();
  
}


void loop()
{
  // send data only when you receive data:
  if (Serial.available() > 0) 
  {
    // read the incoming byte:
    incomingData = Serial.read();
    incomingData = (incomingData - '0');
    //Serial.println(incomingData, DEC);
  }
  
  if( incomingData == 1)
  {
    //servo_1.write(180);
    // say what you got:
    Serial.println("Motor encendido");
    // Suppose there is a relay, or light or solenoid
    // connected to M3_A and GND.
    motor_output(MOTOR3_A, HIGH, 255);
    delay(2000);
    //motor_output(MOTOR3_A, LOW, 255);
    incomingData = 2;
  }
  
  if( incomingData == 2)
  {
    // say what you got:
    Serial.println("Motor apagado");
    //Motor off
    motor_output(MOTOR3_A, LOW, 255);
    incomingData = 0;
  }
  
}

// ---------------------------------
// motor
//
// Select the motor (1-4), the command, 
// and the speed (0-255).
// The commands are: FORWARD, BACKWARD, BRAKE, RELEASE.
//
void motor(int nMotor, int command, int speed)
{
  int motorA, motorB;

  if (nMotor >= 1 && nMotor <= 4)
  {  
    switch (nMotor)
    {
    case 1:
      motorA   = MOTOR1_A;
      motorB   = MOTOR1_B;
      break;
    case 2:
      motorA   = MOTOR2_A;
      motorB   = MOTOR2_B;
      break;
    case 3:
      motorA   = MOTOR3_A;
      motorB   = MOTOR3_B;
      break;
    case 4:
      motorA   = MOTOR4_A;
      motorB   = MOTOR4_B;
      break;
    default:
      break;
    }

    switch (command)
    {
    case FORWARD:
      motor_output (motorA, HIGH, speed);
      motor_output (motorB, LOW, -1);     // -1: no PWM set
      break;
    case BACKWARD:
      motor_output (motorA, LOW, speed);
      motor_output (motorB, HIGH, -1);    // -1: no PWM set
      break;
    case BRAKE:
      // The AdaFruit library didn't implement a brake.
      // The L293D motor driver ic doesn't have a good
      // brake anyway.
      // It uses transistors inside, and not mosfets.
      // Some use a software break, by using a short
      // reverse voltage.
      // This brake will try to brake, by enabling 
      // the output and by pulling both outputs to ground.
      // But it isn't a good break.
      motor_output (motorA, LOW, 255); // 255: fully on.
      motor_output (motorB, LOW, -1);  // -1: no PWM set
      break;
    case RELEASE:
      motor_output (motorA, LOW, 0);  // 0: output floating.
      motor_output (motorB, LOW, -1); // -1: no PWM set
      break;
    default:
      break;
    }
  }
}

void motor_output (int output, int high_low, int speed)
{
  int motorPWM;

  switch (output)
  {
  case MOTOR1_A:
  case MOTOR1_B:
    motorPWM = MOTOR1_PWM;
    break;
  case MOTOR2_A:
  case MOTOR2_B:
    motorPWM = MOTOR2_PWM;
    break;
  case MOTOR3_A:
  case MOTOR3_B:
    motorPWM = MOTOR3_PWM;
    break;
  case MOTOR4_A:
  case MOTOR4_B:
    motorPWM = MOTOR4_PWM;
    break;
  default:
    // Use speed as error flag, -3333 = invalid output.
    speed = -3333;
    break;
  }

  if (speed != -3333)
  {
    // Set the direction with the shift register 
    // on the MotorShield, even if the speed = -1.
    // In that case the direction will be set, but
    // not the PWM.
    shiftWrite(output, high_low);

    // set PWM only if it is valid
    if (speed >= 0 && speed <= 255)    
    {
      analogWrite(motorPWM, speed);
    }
  }
}

void shiftWrite(int output, int high_low)
{
  static int latch_copy;
  static int shift_register_initialized = false;

  // Do the initialization on the fly, 
  // at the first time it is used.
  if (!shift_register_initialized)
  {
    // Set pins for shift register to output
    pinMode(MOTORLATCH, OUTPUT);
    pinMode(MOTORENABLE, OUTPUT);
    pinMode(MOTORDATA, OUTPUT);
    pinMode(MOTORCLK, OUTPUT);

    // Set pins for shift register to default value (low);
    digitalWrite(MOTORDATA, LOW);
    digitalWrite(MOTORLATCH, LOW);
    digitalWrite(MOTORCLK, LOW);
    // Enable the shift register, set Enable pin Low.
    digitalWrite(MOTORENABLE, LOW);

    // start with all outputs (of the shift register) low
    latch_copy = 0;

    shift_register_initialized = true;
  }

  // The defines HIGH and LOW are 1 and 0.
  // So this is valid.
  bitWrite(latch_copy, output, high_low);

  // Use the default Arduino 'shiftOut()' function to
  // shift the bits with the MOTORCLK as clock pulse.
  // The 74HC595 shiftregister wants the MSB first.
  // After that, generate a latch pulse with MOTORLATCH.
  shiftOut(MOTORDATA, MOTORCLK, MSBFIRST, latch_copy);
  delayMicroseconds(5);    // For safety, not really needed.
  digitalWrite(MOTORLATCH, HIGH);
  delayMicroseconds(5);    // For safety, not really needed.
  digitalWrite(MOTORLATCH, LOW);
}

webClient

/*
  Web client
 
 This sketch connects to a website (http://www.google.com)
 using an Arduino Wiznet Ethernet shield. 
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe, based on work by Adrian McEwen
 
 */

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)
char server[] = "xxxx..com.ar";    // name address for Google (using DNS)
  
// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192,168,0,177);

// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

void Websetup() {
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip);
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    // Make a HTTP request:
    client.println("GET /twitter.php?cmd=on HTTP/1.1");
    client.println("Host: xxx.com.ar");
    client.println("Connection: close");
    client.println();
    Serial.println("connected");
  } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed: retry...");
    webConnect();
  }
  
}

void webConnect()
{
  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    // Make a HTTP request:
    client.println("GET /twitter.php?cmd=on HTTP/1.1");
    client.println("Host: xxxx.com.ar");
    client.println("Connection: close");
    client.println();
    Serial.println("connected");
  } 
}

void Webloop()
{
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    while(true);
  }
}

Ya funcionan en "paralelo", el tema es que cuando cargo el setup de WebClient deja de funcionar automaticamente el motor, me parece que es debido #define MOTORLATCH 12, que cambiando el numero el motor no funciona de ninguna forma, actualmente tengo conectado el DC Motor en M3 del motorShield.

Recien empiezo la verdad y no me quedan muy claras algunas cosas.

Muchas gracias!
Saludos,
Ger.

La experiencia de camerloco y lo que yo te puse respecto a los pines en conflicto debería darte la solución.
Obviamente pin 12 nopuedes usarlo para el motor y debes dejarlo para el ethernet shield.
Busca otro que no sea compartido, cualquiera ya que es un pin digital que solo da dirección al motor

Pins 10, 11, 12 and 13 are reserved for interfacing with the Ethernet module and should not be used otherwise
Por otro lado el motor shield usa estos pines

Function pins per Ch. A pins per Ch. B
Direction D12 D13
PWM D3 D11
Brake D9 D8
Current Sensing A0 A1

Tienes conflicto entonces con 11, 12 y 13
12 y 13 son digitales comunes asi que no es problema reemplazarlos.
11 es PWM asi que debes elegir un pin PWM disponible y no usarlo para otro fin.

Perfecto, ya entendí, deberia utilizar un protoboard para soldarlo o evitar utilizar el pin 12?, sinceramente me llevo mejor con el software que con la parte de electronica, como deberia unirlo "externamente" ?

Gracias!!

Yo doblaría el pin en cuestión. Le suelto un cable y lo conecto al nuevo pin (ninguno de los conflictivos). Luego lo asigno a la librería y seguramente todo el conjunto podrá funcionar.