Close
0%
0%

Project 'Landlord'

Open source firmware for Worx Landroid robotic mower.

Similar projects worth following
Reverse engineering and develop a new and open source firmware for the Worx Landroid robotic mower family. Add new features. Smarter algoritm. Add GPS for smarter navigation.

DB275 models uses a NXP LPC1768 arm Cortex-m3.
DB504 models are very similar to DB275 but uses a NXP LPC1788 arm cortex-m3.
DB297 models - please share images!


IC's on DB275-10:


IC's on DB504-03:

The onboard bootloader checks USB after memory stick after firmware file and flashes the its contents.
Custom firmware does not overwrite the bootloader, so it is possible to revert to original firmware.
DB275 firmware start at 0x9000
DB504 firmware start at 0x10000


Source code: https://github.com/Damme/LandLord

To setup build enviroment follow How to install the ARM toolchain
Also possible to use KEIL-MDK.


Please feel free to donate money.
I currently own thrr landdroid's. Two 791e 2015, 794e 2014 - with DB275 motherboard and one wg791e.1 (2016) with DB504.

Bitcoin: 3FnkdzXjkyeHK5o5H3wzM9jDzw52Q3GEog

  • 1 × Brave owner In case the mower starts chasing your pets and begins to burn under your car!
  • 1 × Worx Landroid https://www.worxlandroid.com/
  • 1 × USB stick generic for flashing firmware - FAT32 formatted

  • Working on integratin OpenMower project

    Daniel Wiegert05/15/2022 at 07:55 0 comments

    Hello all, I am getting quite a few PMs about this project.

    I recently started programming again with the goal of making the firmware able to talk to OpenMower. https://github.com/ClemensElflein/OpenMower

    The code on my GitHub is NOT READY YET. At the moment lpc1788 version of the code compiles but not the lpc1768. I am prioritizing LPC1788 at the moment but then that is somewhat ready for use I will start looking at the lpc1768 code again.

    Pinout diagram can be found at https://github.com/Damme/LandLord

    edit; spelling

  • Not the update you all wanted I guess..

    Daniel Wiegert09/28/2021 at 10:51 0 comments

    Hello all!

    First of all, Sorry for not answering you guys at all more or less. Also, I just noticed the link is bad to the io diagram so here is the link again:
    https://drive.google.com/file/d/0B98aBL1DeE4uc3hLQUhHa1FXUGs/view?usp=sharing&resourcekey=0-qmhrLCdqSrvEi-HP7xEJgg

    And the progress? Well there is none. I didn't have energy or time to continue at the time and I also hoped that competition in the market would make the machines better. Not WORSE what I can see they went. So in my eyes the competition only made companies want more profit from existing customers... Sadly.. 
    I also made some progress with DB504 model. I made both 504 & 275 able to move around, start stop mower, start stop charging etc. but this is where I stopped.


    There are techniques to have GPS based navigation down to a few cm position (With RTK gps base station etc)
    I am pretty sure it would be possible to program a simple map only with compass and length meter too, it wouldn't be precise at all but I'm sure basic navigation with this technique would be possible, especially with the modern mcu:s that has a lot of compute power.

    So where am I with this project today?
    I am still interested in developing a new firmware. Especially since no progress have been made at all what I can see in the market..

    Worx still seems pretty cheap and rather easy enough. I don't have any motherboards from the later year models at all. Hopefully they haven't changed much at all but I have no idea.
    So if anyone out there would like to dokument, take hi res photos (Without a potato camera please!) I might be able to cross reference the different models. If I would continue this it would not be very smart to use a soon 8 year old robot for this. but if the motherboards are close enough the code could be somewhat universal.


    Hopefully some of you that are truly interested in this project developing a new firmware are getting this message and maybe we can figure something out together.

    //Daniel

  • Battery

    Daniel Wiegert07/21/2016 at 20:50 3 comments

    There have been some discussion over batteries and charging down in the comments. I'll publish images of inside of battery.

    The tabs are solders After case is screwed together. So to split it you need to cut the connecting tabs on one side...

    Cells are Sony 18650 1900mAh. Thanks to Jan B!

  • Unpacker for firmware .pck

    Daniel Wiegert07/19/2016 at 19:09 6 comments

    Warning etc etc, use with caution... Might contain bugs :)

    #!/usr/bin/python3.5
    import sys
    if len(sys.argv) <2:
      print( "usage:" )
      print("  " + sys.argv[0] + " [.PCK file]", "[Folder-prefix]" )
      print( "  " )
      exit()
    import os
    from binascii import crc32
    from struct import unpack
    #get unpack file
    src_file_path = sys.argv[1]
    #read file length
    src_file_size = os.path.getsize(src_file_path)
    #read file
    b = bytearray(open(src_file_path, 'rb').read())
    # crude bytearray to String converter
    def toStr(b):
      return "".join(["%c"%i for i in b]).strip("\x00")
    # convert 4 bytes to int
    def word2int(w):
      return unpack("<I", w)[0]
    # crude filetable parser
    def getHeader(b, datastart):
      beginstart=b.find(63) #"?"
      filename = toStr(b[0:beginstart]).replace("\\","/")
      beginstart+=1
      beginlength=b.find(63,beginstart) #"?"
      start = int(b[beginstart:beginlength],16) + datastart + 4
      beginlength+=1
      length = int(b[beginlength:beginlength+10],16)
      return {
        "filename": filename,
        "start" : start,
        "length" : length,
        }
    #crude way to create nonexisting directories
    def checkCreateDir(filename):
      if not os.path.exists(os.path.dirname(filename)):
        try:
            os.makedirs(os.path.dirname(filename))
        except OSError as exc: # Guard against race condition
            if exc.errno != errno.EEXIST:
                raise
    def save(filename, data):
      checkCreateDir(prefix + "/" + filename) #create missing directories
      print ("writing %s\t (%d bytes)"%(filename,len(data)))
      open(prefix + "/" + filename, 'wb').write(data)
    ## Start decoding
    print("Unknown byte 0:\t"+ str(b[0]))
    print("Unknown byte 1:\t"+ str(b[1]))
    print("Unknown byte 2:\t"+ str(b[2]))
    print("Unknown byte 3:\t"+ str(b[3]))
    prefix = sys.argv[2] if len(sys.argv)>=3 else "."
    headerstart_token = bytearray((int(62), int(0x0d), int(0x0a)))
    headerstart = b.find(headerstart_token,0)+3
    pos=headerstart
    datastart_token = bytearray((int(0x0d), int(0x0a), int(0x0d), int(0x0a)))
    datastart = b.find(datastart_token,0)
    print("header end: \t"+ str(datastart))
    nHeaders = b.count(int(13),4,datastart)
    print("# files \t: "+str(nHeaders))
    # crude way to parse the directory table
    files = []
    print ("found %i files\n"%nHeaders)
    token = bytearray((int(0x0d), int(0x0a)))
    for i in range(nHeaders):
      pos2=b.find(token,pos)
      h = getHeader(b[pos:pos2], datastart)
      files.append(h)
      print(h)
      pos = int(pos2)+2
    for h in files:
      bFile = b[h["start"]:h["start"]+h["length"]]
    #write stripped file
      save(h["filename"],bFile)
    print("Done!")
    

  • Help identifying component (solved)

    Daniel Wiegert07/06/2016 at 08:24 4 comments

    The right one, its a ST L3GD20H, Thanks Ajlitt!


    Left is MMA8452Q, 3-axis, 12-bit/8-bit digital accelerometerhttp://www.nxp.com/files/sensors/doc/data_sheet/MMA8452Q.pdf

  • Pinout DB504

    Daniel Wiegert06/27/2016 at 19:57 3 comments

  • Different motherboards.

    Daniel Wiegert06/20/2016 at 21:16 2 comments

    I've been working on mapping 2016 year model of worx, they use DB504 motherboard. Usually .pck-firmware, its a container and the start is plain-text. It's possible to do a splitter for that but I use dd to copy out the firmware.

    DB504 probably use LPC1788. I've been looking on some io's on a picture I've recieved and it seams to be correct. (not possible to read chip text without removing the conformal coating)

    My guess so far is U10 = spi flash. U11 + U12 compass / accelerometer / gyroscope. Yellow tape protects JTAG from the coating

    Display and Keyboard are the same as previous models. Wire sensor uses a daughter board:

    Should we assume they still uses LPC and that this might be an LPC11U6x?

    Wifi module are supplied from http://www.redpinesignals.com/, uses SPI (SSP0) communication. easy to mod! :)

    ( https://www.ghielectronics.com/catalog/product/282 looks like a suspect...)

    So far I've been developing and reversing DB275 (2015 WG790/791/794) It seams all 2016 has DB504.

    WG796e (2015) uses DB297 which I haven't seen yet. So if any one wants to send in pictures of that motherboard it would be very appreciated!

    I don't know much about earlier versions.

    //Daniel

    edit:

  • Some / Slow progress

    Daniel Wiegert06/07/2016 at 09:05 2 comments

    I had a small break, I let the mowers do their job outside! :)

    I've figured out the boundary wire and how it works. I finally got the idea to use the USB d+ and d- (p0.29 + p0.30) and output of p0.7 - p0.10 and measure with oscilloscope.. :) (4 wire inputs -> raising and falling each on pos / neg)

    The blue is probe directly on the boundary wire.

    So if negative measurement is before or after the positive, then you know if you are inside or outside wire.

    p0.21 select amplification or something, you can detect if you are within 1 meter of the wire or not.

    p0.22 probably selects between left and right sensor.

    And if you are close to the sensors you get some weird artifacts in the measurement, longer pulse, and even more than one pulse. It seams this is following a pattern and it might be possible to user and detect the distance to the wire at 0cm, 10cm, 20cm and 100cm.

    And the last one, wire right on top of the sensor.

  • Original firmware?

    Daniel Wiegert05/06/2016 at 12:32 4 comments

    I could use some owners help. I would like to have your firmware-files!
    I need to see how big of a difference it is between models.

    Please contact me!

    Thanks all!

  • Pinout!

    Daniel Wiegert05/03/2016 at 08:14 0 comments

    95% of the pin-out is finished. There are some questions still to be answered. Also the models with WIFI, How do they look inside? I would love to see some pictures of the main board in that one!

    One guess would be that the un-populated IC nead RTC battery is a SPI flash but not confirmed.

    Next important step would be to understand the how the wire sensor works.

    P0.0  GPIO Output, Motor Left, Select Forward/Reverse
    P0.1  GPIO Input, Dip switch 3
    P0.2  ADC6, Motor Right, Current ?? -> Need more investigation
    P0.3  ADC7, Motor Left, Current ?? -> Need more investigation
    P0.4 + P0.5 GPIO Output, Selector ADC4 input -> accelerometer LIS352AR pin S0, S1.
      0    0 - ADC4 = X
      0    1 - ADC4 = Y
      1    0 - ADC4 = Z
      1    1 - ADC4 = aux (temp batt)
    P0.6  GPIO Output, Speaker High volume
    P0.7  GPIO Input, ExtInt3 Raising edge - Wire sensor -> Need more investigation
    P0.8  GPIO Input, ExtInt3 Falling edge - Wire sensor -> Need more investigation
    P0.9  GPIO Input, ExtInt3 Raising edge - Wire sensor -> Need more investigation
    P0.10 GPIO Input, ExtInt3 Falling edge - Wire sensor -> Need more investigation
    P0.11 GPIO Output, Enable Charging (in charger, after P1.23 is set to 1)
    P0.15 SPI SCLK, LCD
    P0.16 SPI CSB, LCD
    P0.17 SPI MISO, LCD <- Unused? NC?
    P0.18 SPI SDA, LCD
    P0.19 SPI RSTB, LCD
    P0.20 SPI A0, LCD
    P0.21 GPIO OUTPUT, Selector Guide Wire sensor, Range / Amplification
    P0.22 GPIO OUTPUT, Selector Guide Wire sensor, Unknown function -> Need more investigation
    P0.23 ADC0, Charge current? (Or Charge voltage, Only >0 then charging) 
    P0.24 ADC1, Voltage Battery
    P0.25 ADC2, Accelerometer, Sideways (X/Y)
    P0.26 ADC3, Accelerometer, Forward (X/Y)
    P0.27 GPIO Input, Motor Rotor, Rotation tick? -> Need more investigation
    P0.28 GPIO Input, Charger state? Battery full? -> Need more investigation
    P0.29 USB D+, Maybe used for softUART for GPS / External mcu communication
    P0.30 USB D-, Maybe used for softUART for GPS / External mcu communication
    
    P1.0  GPIO Input/Output, Keypad matrix Row1
    P1.1  GPIO Input/Output, Keypad matrix Row2
    P1.4  GPIO Input/Output, Keypad matrix Row3
    P1.8  GPIO Input/Output, Keypad matrix Row4
    P1.9  GPIO Input/Output, Keypad matrix Col1
    P1.10 GPIO Input/Output, Keypad matrix Col2
    P1.14 GPIO Input/Output, Keypad matrix Col3
    P1.15 GPIO Input/Output, Keypad matrix Col4
    P1.16 GPIO Input, Hall Sensor, Lifted
    P1.17 GPIO Input, STOP Button
    P1.18 Unknown, NC?
    P1.19 Unknown, NC?
    P1.20 GPIO Output, LCD Backlight ON, PWM1.2 can be used here if motors are inactive. (Pulsing screen then charging)
    P1.21 GPIO Input, High then connected to charger and charger is RED
    P1.22 Unknown, NC? USB Power on??
    P1.23 GPIO Output, Initiate Charger, Keeps charger in RED mode. if low charger shows green light.
    P1.24 GPIO Output, Speaker Low volume
    P1.25 GPIO Output, Keep high for PCB Power on.
    P1.26 Unknown, NC? Sensor?
    P1.27 Unknown, NC? Sensor?
    P1.28 GPIO Input, Power key, Normal HIGH
    P1.29 GPIO Input, Sensor, Rain
    P1.30 ADC4, Output from LIS352AR, Selected by P0.4 + P0.5
    P1.31 ADC5, Motor Rotor, Current ?? -> Need more investigation
    
    P2.0  PWM1.1, Motor Right speed
    P2.1  PWM1.2, Motor Left speed
    P2.2  PWM1.3, Motor Rotor speed
    P2.3  GPIO Input, Dip switch 2
    P2.4  GPIO Output, Motor Right, Enable/Start | Disable
    P2.5  GPIO Output, Motor Right, Brake ON/OFF
    P2.6  GPIO Output, Motor Right, Select Forward/Reverse
    P2.7  GPIO Input, Dip switch 3
    P2.8  GPIO Output, Motor Left, Brake ON/OFF
    P2.9  GPIO Output, Motor Left, Enable/Start | Disable
    P2.10 GPIO Input, EInt0??, Sens Motor? Error?  -> Need more investigation
    P2.11 GPIO Input, EInt1 Edge, Motor Right Rotation tick
    P2.12 GPIO Input, EInt2 Edge, Motor Left Rotation tick
    P2.13 GPIO Output, Motor Rotor, Enable/Start | Disable
    
    P3.25 GPIO Output, Motor Rotor, Brake ON/OFF
    P3.26 GPIO Output, Motor Rotor, Select Forward/Reverse
    
    P4.28 GPIO Input, Hall Sensor, Cover
    P4.29 GPIO Input, Hall Sensor, Front

View all 21 project logs

Enjoy this project?

Share

Discussions

Juicie wrote 07/26/2016 at 20:56 point

After reading this project I'm planning on buying a Landriod M1000i (WG796E.1). I first planned to go for a Bosch Indego connect but was sold by the "open" nature of the Landroid. Keep up the good work. I'm a software developer/tester myself so I will try to make time to help, if needed, as soon as I got my Landroid.

  Are you sure? yes | no

Daniel Wiegert wrote 07/27/2016 at 06:41 point

Thanks! Always appreciated with help! :)

  Are you sure? yes | no

Matevz Gacnik wrote 07/20/2016 at 07:18 point

Regarding batteries and current (amps) (Worx Landroid WG796E.1): There seem to be seven (7) 18650 cells inside with 2 mAh capacity, serially linked. Exchanging them with good 3400+ mAh Panasonic/Sanyo/LG (NCR18650B, NCR18650GA, INR18650MJ1) cells should not be a problem.

Since the mower uses roughly 1.2 Ah of capacity per session (goes back with ~ 40% battery) and mows 1.5 hours, we could believe currents are in the range of 0.8 amps. This can be handled by any reputable 18650 cell.

Exchanging the cells within the battery with 3400+ mAh cells should give us ~2.5 hours of mowing per charge. As it seems the charger is quite gentle on the cells, kicking in at 24V and charging up to 28.7V, which gives us 3.42V - 4.1V cell voltage cycle, which is close to ideal for 18650 charging. This should, in theory, allow us to use the machine for at least 3 years without much impact on the cells (providing battery is stored appropriately during the winter). The only thing I'm worried about is the constant high temperatures that the cells are exposed to - they heat up to more than 40 C during summer.

I'm definitely changing the cells once the current battery goes belly up. If anyone opens the battery, detailed pictures would be great.

Greetings from Slovenia.

P.S. This is all based on the premise there are 7 cells. :) If there are 8, things change. My battery is quite new, so I'm opening it once it starts deteriorating.

  Are you sure? yes | no

Robert wrote 07/21/2016 at 13:04 point

Do you have any insights on the charger circuitry? I still do not feel comfortable starting the charging cycle with max current and also I suppose because of the internal resistance we should lower the current in the end to really load to whatever voltage we define for cut-off (ant not cut-off minus (max-current times internal resistance)).

So we would need the scaling of the "current-ADC" and an idea if we can PWM the charge-enable. I needed my worx being back assembled, so I can't figure out if the original firmware is PWMing the charge enable pin.

  Are you sure? yes | no

Matevz Gacnik wrote 07/21/2016 at 13:09 point

No. My hardware skills are basic - software guy. What I see from available data is, that WG796E.1 charges at ~1.4 amps until it gets to 28V, then slowly reduces amperage to ~0.8 amps to charge up to 28.7V. This is from what the machine is reporting over its REST interface.

  Are you sure? yes | no

Daniel Wiegert wrote 07/21/2016 at 19:51 point

1.4A is 0.7 C if battery only is 2000mAh, I would suppose they are at least 2200 and probably 2300mAh. If 2200 0.64C . Li Ion should be charged with C between 0.5 and 1. And this is right in the middle. So I don't see any problems with charging at 1.4A. I have not seen any PWM in code regarding charge pin but I'll take another look.
Temperature monitoring is very important though. I would like to test PWM charging to be easier to the battery in warm days.

edit; If its high current batteries, they are usually 2400mAh and can be charged and discharged with 1C.

One important feature would be to wait after entering charger for the battery to cool down before charging too.

  Are you sure? yes | no

Matevz Gacnik wrote 07/22/2016 at 11:47 point

Daniel, based on pictures I've seen till now, I think they might be Samsung INR 18650-R20 or INR 18650-20Q cells, 2000 mAh.

Waiting eagerly for you to post the inside pictures. There should be a clear indication on specific cells if they are.

Edit: Not true. Seem to be Sony US18650VC3, 1900 mAh only. :/

  Are you sure? yes | no

Daniel Wiegert wrote 07/22/2016 at 18:08 point

I wont crack open my battery just yet, Maybe then the season is over :) (or if battery dies before that..)

  Are you sure? yes | no

bengtsson.j wrote 08/01/2016 at 17:51 point

I hade some issues when the battery got too depleted. When I put the mower in the charging station the Emergency Charging would come up and disappear. One time it helped reinsert the battery but not always. 

So I put two nails in the nose of the mower and hooked it up to my lab power supply. When it starts charging in emergency it pulse high current, I had current limit set to about 4A. When it did that in the charging station the voltage dropped to zero, so I guess the charger powered down due to high current. 

After some time it started charging normal when hooked up to the lab PS. I had lowered the current limit to about 2.5A and that is what it was charging the battery with. So I guess the power supply to the charging station sets the charging current. 

  Are you sure? yes | no

Robert wrote 07/06/2016 at 06:45 point

Hi!

I just pushed some commits to https://github.com/robert-budde/LandLord - I tried to make use of the queues, events and other FreeRTOS stuff to somehow create (run-time-)independent modules for the ADC, the power managment and motor control. Nevertheless, this is still work in progress as in the long-term, I would like to have a central event queue instead of a queue for each module. Therefore, a central event dispatcher will be needed. This would allow us to work more independently on each module.

Working

- set up some automatic mux-switching so the ADC-task reads all available analog values

- scale the accelerometer readings

- implemented automatic shutdown once the batt falls below 23.7V in order to protect it from permanent damage through deep discharge

All status messages are output to the serial port using P0.15 and P0.16 from the display connector - therefore you need to unconnect the display. I see this step as neccessary as I want to connect the mower to a Linux plattform running ROS through a serial MAVLINK connection.

Yesterday I tried the charging and it worked. Right now, I supervise only battery voltage (<28.7V) and temperature (<50°C). The raw ADC readings for battery current were as high as 3000!

Therefore three questions:

- How to scale "battery current" ADC readings?

- P1.23 could also be set to be a PWM out - any idea if the original firmware might control battery current by PWM'ing this pin?

- Without charging, I still read a value of 10-12 at the battery current ADC. Is this a measurement error or might the circuit be able to measure current bi-directional and this is the actual current drain from the battery in normal mode?

Best regards,

Robert

  Are you sure? yes | no

Daniel Wiegert wrote 07/06/2016 at 07:37 point

Hello!

Nice work!

You could also use USB pin's as tx/rx/whatever, and leave lcd connected.
I haven't coded much at all the last couple of weeks. I did get a hold of an broken 791e.1  (2015 model, db504 motherboard) and started mapping the pin's out. It is very similar and program should be very easy to adapt (only include different define-files, one for lpc1768 and one for 1788).

I haven't tried pwm on p1.23. Have you connected a current-meter over the battery?
Raw adc for current Might be the in mA at battery terminal. (not the same as charge-pins, other voltages)

lMotorLeftCurrent etc might be measured speed and not current, this is based on db504 but I have no idea yet, current would seam more logical because of analog value. This will need to be determined.

I think circuit measure is current both directions.

  Are you sure? yes | no

Daniel Wiegert wrote 07/06/2016 at 07:41 point

Btw, did this work for you?? :o

void u8g_MicroDelay(void){
  vTaskDelay(1 / portTICK_PERIOD_MS);
}

portTICK_PERIOD_MS = 1ms (0.001) and lcd wants delay in micro µs (0.000001s) That's why I used a timer..

  Are you sure? yes | no

Daniel Wiegert wrote 07/06/2016 at 10:37 point

I made some changes too that you could test. It's for making code compatible with both KEIL and GCC.

  Are you sure? yes | no

Daniel Wiegert wrote 07/06/2016 at 17:44 point

I haven't looked into it, but every second batt debug shows:

-1.344
-1.168
Charge I: 1475mA
Battery U: 31.4V
Battery T: 4143380315.4294967295°C

the other one's are ok, 31.4v (adc 4095, I'm running on a development board.)

  Are you sure? yes | no

Robert wrote 07/06/2016 at 18:13 point

the first two are misreading from the accelerometer. the other ones are wrong measurements as well. The last one is probably an erroneous print out of -10°C, see print-func for negative accelerometer value to fix that if you like.

  Are you sure? yes | no

Daniel Wiegert wrote 07/06/2016 at 18:22 point

Thanks, I was just about to delete my message, I realized what I did wrong.. :) (me)

  Are you sure? yes | no

forgotten wrote 06/25/2016 at 19:16 point

Has anybody a Landroid with DB504-motherboard and wifi/wlan? I´m interested in the dip-switch-settings under the rubber. Why? Maybe wifi is easily upgradable. I´ve found that at least the firmware for 796e.1 and for 754e/756e the same , bit by bit. So the difference must be on the motherboard. 

And in the firmware you can find hints for

WG796E.1
WG790E.1
WG798E
WG797E.1
WG754E
WG755E
WG794
MG790E
WG793E.1
WG756E

  Are you sure? yes | no

Daniel Wiegert wrote 06/25/2016 at 20:13 point

There is a dip switch under gray rubber. Wifi module are supplied from http://www.redpinesignals.com/, uses SPI (SSP0) communication. All db504 runs same firmware. only dip switch setting that differs (and hardware parts, like wifi)

  Are you sure? yes | no

Matevz Gacnik wrote 06/26/2016 at 09:12 point

My WG796E.1 dip switches are all set to false, according to /jsonDebug.cgi, which spews out JSON debug states. Here's mine:

{
  "landroid": {
    "state": "home",
    "boardTemperature": 33.3,
    "distance": -6,
    "wheelLeftDistance": -4,
    "wheelRightDistance": -4,
    "angle": 0,
    "rainSensor": 3867,
    "aree": {
      "index": 0,
      "vet": [
        1,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0
      ]
    },
    "battery": {
      "percentage": 100,
      "voltage": 28.08,
      "temperature": 26.8,
      "ntcResistance": 9419
    },
    "batteryCharger": {
      "state": "idle",
      "chargeCurrent": 3.22
    },
    "accelerometer": {
      "gravity": [
        -0.039,
        0.035,
        1.016
      ],
      "angle": [
        -1,
        1,
        0
      ]
    },
    "gyroscope": {
      "angularSpeed": [
        -1.05,
        5.25,
        -2.152
      ],
      "angle": [
        0,
        0,
        0
      ]
    },
    "motor": [
      {
        "speed": 0,
        "maxSpeed": 51,
        "speedReduction": 0,
        "rpm": 0,
        "feedbackError": 0,
        "acceleration": 100,
        "deceleration": 220,
        "fault": false
      },
      {
        "speed": 0,
        "maxSpeed": 51,
        "speedReduction": 0,
        "rpm": 0,
        "feedbackError": 0,
        "acceleration": 100,
        "deceleration": 220,
        "fault": false
      },
      {
        "speed": 0,
        "maxSpeed": 92,
        "speedReduction": 0,
        "rpm": 0,
        "feedbackError": 0,
        "acceleration": 100,
        "deceleration": 250,
        "fault": false
      }
    ],
    "guide": {
      "straightSpeed": 0,
      "turningSpeed": 0,
      "straightDistanceError": 1,
      "straightCorrection": 0
    }
  },
  "id": {
    "stop1": false,
    "stop2": false,
    "lift1": false,
    "lift2": false,
    "trappedLeft": false,
    "trappedRight": false,
    "door1": false,
    "door2": false
  },
  "dipSw": {
    "sw1": false,
    "sw2": false,
    "sw3": false,
    "sw4": false
  },
  "wireSensor": {
    "fwVer": 0.7,
    "left": "inside",
    "right": "inside"
  }
}

Didn't open the machine, though.

  Are you sure? yes | no

Daniel Wiegert wrote 06/27/2016 at 20:01 point

If I didn't mess them up then I removed the silicone / rubber 791e1 has dip: 0,0,0,1 (sw4 = 1). Good to know about 0,0,0,0!

  Are you sure? yes | no

Robert wrote 06/18/2016 at 07:37 point

Still thinking about the direction to go:

- Just hook up GPS and Serial/WLAN bridge using some sw uarts

- Disconnect keypad and display and implement for example MAVLINK on the "rover", use some SBC such as Beaglebone/RPi to control / do SLAM / supply further sensors such as camera / connect to WiFI network

- do it some other way?

  Are you sure? yes | no

Daniel Wiegert wrote 06/18/2016 at 08:59 point

The easiest way would be soft-uart (or, soft-i2c/spi) via USB, I've already used this port for some output. I want to put a neo-m8n gps unit there to log gps and see how that works. Someone mentioned rtk-lib, needs some more expensive gps units but what I've read, wow! the resolution would be extremely good and you probably wouldn't need a guide wire!
But disconnecting keypad and use a custom built pcb, with a cpu, wifi etc and talk to mower in serial instead of keypad-matrix. 

  Are you sure? yes | no

Robert wrote 06/14/2016 at 11:49 point

Hi Daniel,

great work! I just bought a (presumably broken) WG794E on ebay just to join your efforts. I really hope to give the mower the cutting edge it needs for my quite demanding backyard.

Looking at your docs, I still have some questions important to me which lack some documentation:

- Can you describe how to SAFELY charge the robot? You mentioned there is no deep discharge protection - is there some overcharge protection?

From your doc:

P0.11 GPIO Output, Enable Charging (in charger, after P1.23 is set to 1)
P0.23 ADC0, Charge current? (Or Charge voltage, Only >0 then charging)
P0.24 ADC1, Voltage Battery
P0.28 GPIO Input, Charger state? Battery full? -> Need more investigation)
P1.23 GPIO Output, Initiate Charger, Keeps charger in RED mode. if low charger shows green light.

So how to start charging? If bat below xxxV (ADC1), go home and then? First P1.23 to 1, then P0.11? Control charging by monitoring ADC0 and ADC1? Is there some protection built in the charging station or the mower?

Couldn't 

P1.25 GPIO Output, Keep high for PCB Power on.

be used to disconnect the uC? Maybe pressing ON allows the uC to set this pin high and keep itself powered until it disconnects itself setting this pin to low to safe the battery?

- ADC muxing

From your doc:

P0.4 + P0.5 GPIO Output, Selector ADC4 input -> accelerometer LIS352AR pin S0, S1.
0 0 - ADC4 = X
0 1 - ADC4 = Y
1 0 - ADC4 = Z
1 1 - ADC4 = aux (temp batt)

P0.25 ADC2, Accelerometer, Sideways (X/Y)
P0.26 ADC3, Accelerometer, Forward (X/Y)

So when would I need Mux [0,0] or [0,1]? Different gain, other filtering? Or did they really ran out of ADC and needed to add "temp batt"?

Just forked your repo and already migrated to Keil MDK. Will start working on it as soon as I get the mower and get the error it has right now sorted out.

BR

Robert

  Are you sure? yes | no

Daniel Wiegert wrote 06/14/2016 at 17:01 point

Lots of questions, I'll answer them all but I'll start with what I have in my head.

Right out of the box I don't think my repo will compile in keil. I started using keil at first but left for opensource compiler. Sorry for the bad coding, the work have mostly been about the hardware and try things out. The code really need some cleanup, be split into many functions and files. I do have a star of the state machine, using function pointers instead of massive switch statement :)

Regarding P0.4 + P0.5, Mux [0,0] or [0,1] are the same as p0.25 0.26.. so yeah, it seams they ran out of ADC.

P1.25 GPIO Output, Keep high for PCB Power on. ->

When pressing pwr button, cpu gets power, cpu needs to set p1.25 high to not shut off after key been released. I do power down after holding power 3 sec and p1.25 is set low. I have not connected current meter yet. It could be as easy as I just need to leave some port low / pull down before shutting down. Or maybe bad design?

Regarding safe charging, I  have not done any investigation to this yet, maybe a good time to do so! :) (After I got my wire sens to work, I haven't had time to test my code yet)

I will write more about charging later on. Thanks for your interest! I hope we can speed things up now then I'm not alone programming. :)

Btw, use the robot.osd insead of my entry up there. I've been updating it more! (and I'll upload a new version right now)

  Are you sure? yes | no

Robert wrote 06/14/2016 at 18:53 point

Hi Daniel!

Thanks for your fast reply. I got the Landroid disassembled and was able to fix the error. I will start with the SWD connection next.

With respect to Keil: Just pushed all necessary changes to let it compile without any warning under Keil: https://github.com/robert-budde/LandLord - maybe we should/can make the sources toolchain-agnostic - just check if my changes would be acceptable and I can rebase.

Just to mention the goal I have in mind: I would like to add the mower to my "smarthome" based on KNX and smarthomeNG. Moreover, it should get smarter how to move around the yard by knowing where it can go uphill and where it can in fact only go downhill because its too steep for climbing. Quite sure i will therefore try to add gps and wlan while sacrifying keypad and display...

BR

Robert

  Are you sure? yes | no

Daniel Wiegert wrote 06/14/2016 at 19:21 point

Nice! I've just been looking through it really fast. Any reason for deleting all uint8_t ? To my understandning it saves some ram :)

I calculate the checksum in linker script, I'll take a look if I can use the (keil does this automagically then it compiles) so .long    __valid_user_code_checksum     /* Checksum of vector 0-6, Calculated in lpc17xx.ld*/ needs to be inserted as one of the reserved.. I can take a look and see if I can make minimal changes to make it compile for me too! :)

Regarding charging, I'm testing to charge right now, it does use CC and go to CV, it started at 1.4amp (charger dock connection) and after a while started dropping, right at this moment 0.8amp. The battery was 80% full then I started.

I'll update then I know more. :)

  Are you sure? yes | no

Daniel Wiegert wrote 06/14/2016 at 21:37 point

I left it on charge, and it leveled out at 110mA, ADC0 said aroung 150, it seams to follow measured current rather well, but seams to be measured at some other voltage. 1.4A on meter (at charger dock) said ~1550 on adc0.
it seams to be charging with a max voltage of around 30.5v, and this equals to 4095 on ADC1 :) There is a function in the original firmware that uses an 110 int long array to convert adc1 to volt. I'm taking notes of the battery discharging now.

30v on battery equals to 4.285v per cell, a bit high, but its the maximum voltage the charger supplies. So safe to stop charging before reaching 4000 on adc 1 :) (battery has 7 cells, unknown marking)
Mower draws ~90mA with lcd backlight on and no battery in charging mode.

  Are you sure? yes | no

Daniel Wiegert wrote 06/17/2016 at 17:54 point

Do not charge battery beyond ~adc reading 3800. 3770 seams safe, batt volt = 28,9. Overcharged battery will prevent mower to start. Internal dc/dc converter seams to go into protect.

28v = 3645
27,5v = 3580

  Are you sure? yes | no

Marcus wrote 06/11/2016 at 16:03 point

Hi!

Does the landroid output any logs via usb or serial interface in runtime? eg. status changes and errors and such.

  Are you sure? yes | no

Pontus wrote 06/09/2016 at 14:19 point

I don't know if you have any use of it but I got the 2.01 fw for db504 earlier this morning, at that time it wasn't released. I don't know if it is released now. 

  Are you sure? yes | no

Pontus wrote 06/06/2016 at 18:00 point

Hi! 

How it this project going? I just got my 790e.1 but I can already tell it need to get smarter. I have some ideas, a good knowledge of electronics.  Let me know if you need help figuring something out! And let us know when it is mowing ;) 

Greetings from Borås! 

  Are you sure? yes | no

Daniel Wiegert wrote 06/07/2016 at 08:31 point

My understanding is that all the 79Xe.1 has the newest motherboard DB504 which seams to be the same on all new models. I have not seen this yet. Hires photos would be nice ;)
It even has a space for a Wifi module so it should be upgrade-able.. :) You don't want to change mowers for a while? I got two with DB275 :( 

  Are you sure? yes | no

J B wrote 06/07/2016 at 09:10 point

I just bought the 796E.1 with WIFI. Just need to find a good time to open the mower up and take some pictures, without my wife knowing about it. :)

Im on V1.64 at the moment and found some bug, if i stress the wifi it stops and powers down. And its like drunk driving when it follows the edge line. Keeps over compensating.

  Are you sure? yes | no

Daniel Wiegert wrote 06/07/2016 at 09:15 point

haha, Yeah I've heard the new regulations with the transmit power in the boundary wire messed things up a lot, I don't really know why but maybe the hardware folks and software folks don't understand each other. I would love to compare the difference between <2016 and >2016 models.

  Are you sure? yes | no

Pontus wrote 06/07/2016 at 09:16 point

Hi! 

I think we are expecting rain on Thursdays and Friday. I'll see if I can get the time to tear it down gently to take some photos of the board. How far is the progress with your FW yet? 

  Are you sure? yes | no

Daniel Wiegert wrote 06/07/2016 at 09:21 point

DB275 is more or less completely reversed at the moment. It just needs a lot of programming to work.
Need to make functions like accelerate(target,acceleration), turn(left/right,speed), start spindle, a neat state-machine for all feedback etc.

  Are you sure? yes | no

Colin Hickey wrote 06/02/2016 at 10:14 point

Really interested in this, i've just purchased a 794e from ebay cheaply and it's prime for upgrading.  Should be getting mine opened up soon and looking at it.  I got it minus charger/docking station and boundary cable so need to get all these things one by one.

  Are you sure? yes | no

Daniel Wiegert wrote 06/07/2016 at 08:28 point

You could probobly get around without the charger unit with some soldering skills. Someone have made a pulse circuit somewhere, sadly I didn't write down the location but with some searching you might find it. And the charger is probobly rather stupid (read some comments below)

  Are you sure? yes | no

Dan L wrote 06/02/2016 at 08:41 point

Daniel, did you get hold of any firmware files yet? If not, have a look here:

http://tinyurl.com/gosb7xd

Very interested in progress of this project. Let us know if you need help. :)

  Are you sure? yes | no

Daniel Wiegert wrote 06/02/2016 at 13:16 point

Thanks!

  Are you sure? yes | no

Daniel Wiegert wrote 06/07/2016 at 08:26 point

Thanks! You have DB297 board. I have not had any look at this main PCB. I done all my reverse-engineering on DB275 so far.

  Are you sure? yes | no

J B wrote 05/16/2016 at 18:23 point

I've been reading the manual and it says the charger is rated at 28V 1,5A. Is the battery charging circuit built in the mower or the charge station? I would like a test to see if limits charging to 1,5A or it just takes what it can. If i upgrade the battery i want higher charging current so it can spend more time on the lawn then in the charging station.

  Are you sure? yes | no

Daniel Wiegert wrote 06/07/2016 at 08:23 point

I would guess the charger is stupid, and just pass current after mower and charger has been initiated (P1.23 high then charger has RED light (detected with P1.21)).
P0.11 starts the charger circuit, I havn't made any measurements but I would guess all the charge control is made inside the mower. 
The mower does not have under discharge protection, and I do not know if it has overcharge-protection or not yet.
This needs to be looked at. ADC0.1 (P0.24) shows the battery voltage in analog form.

  Are you sure? yes | no

J B wrote 05/09/2016 at 09:43 point

I would like to see what kind of cells the battery holds, and if it would be possible to exchange and/or add external power supply. And see how that effects the endurance. 

Also it would be cool to add RTK-LIB support for better GPS precision. Logging the movement to a map to see where its cutting the most.

Grettings from Södra Halland

  Are you sure? yes | no

Daniel Wiegert wrote 05/09/2016 at 09:46 point

Hi, Its ordinary 18650, but an odd number of them, I cant recall how many right now!

  Are you sure? yes | no

J B wrote 05/09/2016 at 09:57 point

Then I suppose its 7 of them. Usally 3,7V for each cell and it will add up to 26V. 9 cells would be 33V.

Don't know how trustworthy the Chinese battery seller are with their capacity ratings but it would be possible to double or triple the battery capacity within the battery holder.

A picture of the inside of battery would be great!

  Are you sure? yes | no

Daniel Wiegert wrote 05/09/2016 at 10:06 point

Thanks for telling me about RTK-LIB. I will look into that.
And yes, 7 batteries is correct. There are two plastic covers with adhesive on either side. But the battery tabs are spot welded after put in the case, so it is not to open the battery up fully without cutting apart the strips. There are 4-6 screws holding the plastic case together, no glue what I could see.
I haven't opened my more than the adhesive plastic covers. Inside the mower it is plenty of space, so it would be possible to double if not triple the capacity.

  Are you sure? yes | no

Daniel Wiegert wrote 05/09/2016 at 10:14 point

btw, chinese batteries can be extremly difficult to get good one's. I have had luck sometimes and once I got a pack of cells with a small watch-battery in it with sand..

  Are you sure? yes | no

J B wrote 05/09/2016 at 11:20 point

The reason I never ordered any 18650 cells yet.

Do you know max current drawn from the battery?

  Are you sure? yes | no

Daniel Wiegert wrote 06/07/2016 at 08:32 point

Sorry, no I have not made any measurements on this. I guess the speed on the motors has a sweet spot with current draw and movement speed.

  Are you sure? yes | no

bengan wrote 05/05/2016 at 12:22 point

I'd like to chime in. Happy that you started this project. I'll be following it closely. I'm on the look out for a second machine to experiment with. The one I've got is doing it's job happily right now so I wont take that one appart.

....from Värmland :)

  Are you sure? yes | no

Timm Murray wrote 05/05/2016 at 11:56 point

Thanks for starting this project! I'm not brave enough to void the warranty on mine just yet, but I'm happy to know someone is working on this.

  Are you sure? yes | no

fredrik wrote 05/05/2016 at 06:36 point

Cool project! I have a 790E that I would like to make smarter. Perhaps adding wifi?

Hälsningar från Borlänge :)

  Are you sure? yes | no

Daniel Wiegert wrote 05/05/2016 at 08:20 point

Thanks for showing interest! There could absolutely be possible to expand the mower with more peripherals.
The only problem is that almost all IO are used in the main CPU. Might even be using the two USB-pins as inputs under normal operation (Something weird with guide wire is going on..) 

So to expand the most logical way would be to use the 8 IO to the keypad and go by an extra CPU (esp8266? arduino? raspberry?) or with something like IO expander (MCP23017). But this requires the user to open the mower and connect a PCB between the keypad-cables.. :)

I really hope my suspicion that the USB IO is used in normal operation is wrong. Easy to access two GPIO through that port to communicate with something external over i2c-like protocol.
The program memory is no problems at all. So far I've only used 24KB out of 512KB.. (And that includes 3 font-sets) :)

Greetings from Halland!

  Are you sure? yes | no

Does this project spark your interest?

Become a member to follow this project and never miss any updates