Problem with Ethernet Shield, NTP, and Servos

Hi,

I have an application that uses two servos, connected to Adafruit’s Motor Shield, and an Ethernet shield. I’m using Ethernet for NTP, based on the example code UdpNtpClient.

Whenever getNtpTime() is called, the servos lose their position between sendNTPpacket() and when the reply is received. All other times, the servos track the writes I send them.

I put the servo output on a scope, and it looks like the period drifts during the Ethernet activity. Is this maybe from interrupts being disabled during some Ethernet activity?

Has anyone else tried using servos and Ethernet NTP?

Here is my NTP code. getNtpTime() is called every 5 minutes or so by setSyncProvider(getNtpTime), which is set in setup().

// send an NTP request to the time server at the given address
void sendNTPpacket(char *address)
{
    // set all bytes in the buffer to 0
    memset(packetBuffer, 0, NTP_PACKET_SIZE);

    // Initialize values needed to form NTP request
    // (see URL above for details on the packets)
    packetBuffer[0] = 0b11100011;   // LI, Version, Mode
    packetBuffer[1] = 0;     // Stratum, or type of clock
    packetBuffer[2] = 6;     // Polling Interval
    packetBuffer[3] = 0xEC;  // Peer Clock Precision

    // 8 bytes of zero for Root Delay & Root Dispersion
    packetBuffer[12]  = 49;
    packetBuffer[13]  = 0x4E;
    packetBuffer[14]  = 49;
    packetBuffer[15]  = 52;

    // all NTP fields have been given values, now
    // you can send a packet requesting a timestamp:                 
    Udp.beginPacket(address, 123); //NTP requests are to port 123
    Udp.write(packetBuffer, NTP_PACKET_SIZE);
    Udp.endPacket();
}

time_t getNtpTime()
{
    while (Udp.parsePacket() > 0) {
	// discard any previously received packets
	p(F("Discarding UDP packet\n"));
    }
	
    Serial.println("Transmit NTP Request");
    sendNTPpacket(timeServer);
  
    uint32_t beginWait = millis();
    while (millis() - beginWait < 3000) {
	int size = Udp.parsePacket();
	if (size >= NTP_PACKET_SIZE) {
	    Serial.println("Receive NTP Response");
	    Udp.read(packetBuffer, NTP_PACKET_SIZE);  // read packet into the buffer
	    unsigned long secsSince1900;

	    // convert four bytes starting at location 40 to a long integer
	    secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
	    secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
	    secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
	    secsSince1900 |= (unsigned long)packetBuffer[43];

	    return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
       	}
    }
    Serial.println("No NTP Response :-(");
    return 0; // return 0 if unable to get the time
}

Thanks,

Ag Primatic

The new Adafruit motor shield has its own clock for PWM that is set by I2C. If the servos are losing their position, it must have something to do with the motor shield.

I don't think the PWM chip is used for the stepper motor interfaces:

It looks like they are connected directly to digital outputs 9 and 10 on the Arduino.

And, my code is using the standard Servo.h library.

Ag

Then you must change D10. That is the slave select for the ethernet shield w5100 IC.

edit: I use this servo breakout board with my ethernet shield. No problems here.

OK, that explains my issue.

Thanks for the info.

Ag