Fun with JD ATU 200

So, I thought I’d write up how I’m getting on with this JD ATU 200. Might help someone out… and maybe someone might know the missing info I’m stuck on.

Was asked if I could get this going with AOG so I thought it would be worth a go. First, a quick look at the bits:

image

That 9-pin connector is this:

Per the diagram, and as in the cable, only pins 1,3,4,5,6,7 and 8 are present.

According to wiring diagram

  • 911 (emergency? :smiley:) goes to the seat sensor (12v)
  • 904 goes to CAN Hi
  • 905 goes to CAN Lo
  • 080 not sure yet
  • 922 switched 12v power
  • 070 Gnd

Raymond pointed me towards this video: Reparo piloto John Deere ATU 200 - YouTube

So I already knew it was CANBUS, so this should be relatively easy, right? Power it up, get CanHacker on the case, few code changes… job done?

Hmmmmm… let’s see. Limited data set (because of course things like engine temp aren’t around to mess the output), so that’s good news surely…

image

Using csselectronics tool here, I decoded them as:

First two are the standard address-claim (steering unit has claimed address 13) and with low counts, we can immediately see which codes we should be focussing on for things like steer angle

Moving the steering wheel, I could see that bytes 4 and 5 of 18FFFB13 appeared to be the wheel position, byte 4 being the minor and byte 5 being the major (little endian, in other words). I also noticed that when I pressed the guidance button on the wheel, the third byte flipped from 04 to 14. Great when there’s such little data around, makes things relatively simple. If I linked 12V to pin 3 at connector, the 04 flipped to 44.

04 - steer ready perhaps?
14 - guidance button pressed
44 - seat alarm triggered

So we can perhaps infer the bitmask here and that would be

  1 | x | ?
  2 | x | ?
  4 | 1 | Ready to steer?
  8 | x | ?
 16 | 1 | Guidance button pressed
 32 | x | ?
 64 | 1 | Seat alarm triggered
128 | x | ?

But… this was the wheel rotation angle tho - this system doesn’t have a wheel angle sensor. So what kind of range does it read? Well, it can be turned infinitely in either direction, and when the scale reads 0, it doesn’t wrap around or anything - it just sits at zero while you carry on spinning the wheel. Likewise, it tops out at 60,000 too and that roughly equates to about 14 turns. If you power it off and back on, it remembers that position, so there must be some sort of re-zero code or something surely, either that or it’ll have to be positioned just right and then fitted which wouldn’t make sense.

However, from the ATU guide:

Edit: a friend who’s well versed in JD autosteers said:

I do know the steering angle is self calibrating some how, it just does it on the move, no actual calibration function, must be if you drive manually in a straight line for a period of time, or maybe even needs to auto steer on the line to calibrate, not :100: % sure

Zooming in on the youtube video, I was able to make this out:

Google translate helped with that from Portuguese:

  • Rotate left
  • “as order to be sent together with the defined rotation”
  • Rotate right
  • Init command

And I noted the values as:

00d7132a 8 04 20 02 00 ff ff ff ff
00d9132a 8 01 15 05 00 00 81 ff ff
00d7132a 8 04 2e 01 00 ff ff ff ff
08eeff2a 8 ab 29 25 04 00 20 00 a0

I put the same values into Canhacker and ran it. And the wheel started turning. But in steps and apparently it was random as to whether it would go left or right (possibly as it appeared the left/right lines were being sent approximately the same time, I had thought that script ran top to bottom, but apparently not).

It was at a similar pace to the video above tho…

So, guessing the video author had sniffed those codes from having the monitor attached, but I don’t have that - so very thankful for his video. But, I’ve no idea how to make it turn for longer, turn smoother or faster or anything as yet.

On with more testing - fuzzing the inputs!

First, D7132A
I noticed left turn and right turn are identical PGN with differing data; third byte - 2 for left, 1 for right.
The first byte doesn’t seem to matter and if you increase the 20 to 40, you can narrow the gap between turns so there’s almost none - but it does still stop and start again

D9132A - order
Second byte, it’ll turn with 14, 15 or 16
Third byte - anything other than 5 stops it
Sixth byte - anything other than 81 stops it

8EEFF2A
If the third byte is “OR 16” (fifth bit set), then the motor will run. Otherwise it will not.
Fourth byte will run if 4

And that’s about where I am at the moment. Still trying to figure out why SavvyCAN isn’t playing any more. And I lost a day as I think a dodgy sketch broke Canhacker too.

If anyone spots any huge errors here, please let me know - and likewise if you have any help to add, please do!

I suspect without the terminal I might be stuck, but let’s see how far we get…

Some other notes found:

ATU 200 requires a steady power source with 12.5 V and 4.0 amp while engaged. If there is inadequate current, ATU 200 disengages due to ATU temperature exit code or invalid steering control unit (SSU) voltage exit code.

Activation Criteria:

  • To activate system, the following criteria must be met:
  • Machine speed is greater than 0.5 km/h (0.3 mph).
  • Reverse machine speed is less than 10 km/h (6.0
    mph).
  • In reverse, AutoTrac™ remains activated for 45 seconds. After 45 sec., place machine in a forward gear before reverse activates again.
  • Machine is within 45 degrees of desired track.
  • Operator is seated.
  • Terrain compensation module (TCM) is on.
  • Receiver activation required for SF2 or real-time kinematics (RTK).

So, some things to watch out for there. “TCM must be on” sounds a bit ominous…

8 Likes

Hi,

I have the same setup with the JD2600 monitor.
Can you send me the setup on how I can sniff the can? (What hardware do I need to have and where to connect)

I’m connecting direct to the wheel at the moment, and am using CanHacker (until I can get SavvyCAN to work) with an Arduino Nano and an MCP2515 board.

I will try to connect to the monitor and get the messages.

1 Like

hello my friends, any news on this subject? I own a repair business and would like to test engines for more than a day before shipping them out to customers.

I was logging in to check for any updates on this as well. Do you think it will turn fast enough for u turns?

Haven’t had much chance to get back to this, but I did have a quick go on Sunday. No further forward, but I’ve been promised a JD terminal to see if I can work it out from there. Various forums and such around the place do suggest that it’s not as simple as other systems, and there’s a fair bit of one component talking to the other to get it working.

1 Like

Out of boredom, had another go with this today…

First thing I noticed was that with less than around 13v power, the motor wouldn’t really turn at all - just jerk the chain…

Something I just realised I didn’t do above was decode the lines that were being sent from CanHacker, and they work out like this:

Binary data transfer and memory access request… uh-oh. That doesn’t sound very friendly…

Now SavvyCAN and the Meatpi are working nicely (together with my stim board), it was easy enough to wire things up again for another look.

When I sent the 0x08eeff2a (line 4 in the commands above), SavvyCAN decoded it as:

Again, that info came from a DBC somewhere and it looks like a standard PGN for “ISO address claim”. Why that would be necessary to be sent time and again, not sure, but it seems the wheel doesn’t turn unless this is active… is my Meatpi pretending to be the JD steering unit perhaps, acting as an authorisation?

SavvyCAN made it simple to spot that if I send a direction command 0x00d7132a, the module responds immediately with what appears to be some sort of acknowledgement:

Likewise, if I tell it to steer in the other direction, same acknowledgement:

Notice the change of direction in 3rd byte that we went, 00 or 01 for left or right. The ack response appears to be identical either way. (Incidentally, those code breakdowns were found in various DBC files I found around the place, I don’t know for sure that they are particular or correct for JD).

If I send what I had tagged above as being “as order to be sent together with the defined rotation”, I get a different response:

That 0x18D82A13 is curious… sometimes the wheel turns a lot, sometimes it just jerks and comes to an immediate stop. Watching the output as the commands are sent, I can see various fields here in the following (and it’s quick so hard to capture, but I’ll summarise):

image

NumberAllowed is either a 0 or a 1
Seed is either 65535 or “SeedCompleted_BeginSendingKey” (uh oh!!!)
EDCP_Extension is either “DataInErrorIndicator” or “NoErrIndicator/EDCParamAvailable”
ErrorIndicator is either “ProcessingWriteReq”, “NoErrorIndicatorAvailable” or “ProcessUnspecReqFromThisAddress”
Status is “OperationFailed”, “OperationCompleted”, “Proceed”, or “Busy”

Some observations on that:
If I send 00d9132a every 2 seconds, the 0x18d82a13 responses are quicker than the 2 seconds:
image
Notable that OperationFailed is here and status toggling between that and Proceed.
image

Every 5 seconds, 0x18FFFF13 sends a different status:

The fact I’m seeing terms such as “Seed”, “Binary Data Transfer” and “Memory Access Requested” is making me think there’s a bit of handshaking going on here.

Made a video showing what happens: https://youtu.be/8wOnaG9M-EY

3 Likes

Looks like some good work on the ATU. Would it be easier to figure out what CAN messages are needed / being used by watching the active message bus while a Deere display is communicating with the ATU and actively steering?

That would be ideal, if I had access to one :frowning:

A cousin and myself just took apart a atu 200 a few days ago and it appears to be a Nema 23 or equivalent bipolar stepper motor in there. If you pull the back cover off and and then pull off the circuit board underneath there on the opposite side of the plug where the atu wire comes in are 4 pins which I’m quite sure are just the connections for powering the motor. So if you can just program your system to control said stepper motor then presto. You wouldn’t be able to use the built-in encoder, but if you have a WAS anyway then you wouldn’t need that. In theory that should work😉

2 Likes

Google Photos
Google Photos
Google Photos
Google Photos
Google Photos
Google Photos
Google Photos
Google Photos
Google Photos

This is my atu200. bought it 3 weeks ago, for box of ice-cream it cost me 8€.

1 Like

where did you buy it? I would like to buy one to play with too.

Friend

Maybe someone near you could lend one for testing?