/hoverbot

Hoverboard + Raspberry Pi

Primary LanguagePython

hoverbot

Hoverboard + Raspberry Pi

mounting from pi to dev machine

sudo mount.cifs //loki.local/hoverbot /home/dave/loki -o user=dave,uid=$(id -u),gid=$(id -g)

TODO

hoverboard's responsibilities:

  • reporting current state - battery, temperature, wheel speeds
  • adjust speed to target speed, but in such a way that the transition is smooth
  • safely slow down and stop if there's no msg from the app
  • power on/off, including auto poweroff if no activity for awhile

app's responsibilities:

  • receive inputs from joystick
  • send target speeds for each wheel to hoverboard
  • read status data from hoverboard and shutdown on low power or high temp or whatever
  • figure out and impose safety limits: top wheel speeds, top opposite wheel speeds, acceleration rates, turning rates

msg TO hoverboard: 16b msgID (a counter, so we can detect skipped) 8b cmd - the command defines the length payload - maybe it's fixed sized?

TO commands:

  • heartbeat, just a way to say "keep going". payload:null
  • poweroff - stop listening for new data, set speed goal=0, and when reached, power off. payload: null
  • echomode. payload: on or off. maybe an echo debug mode where all it does is send back ACKs?
  • turn on/off various debug flags/values. payload: 1Bknob num, 2B:value
  • set max acceleration. payload: max pwm diff in... a second maybe?
  • set max speed. payload: max pwm value perhaps?
  • set max turn rate - maybe max wheel differential. payload: 2B int max diff
  • set target speed for each wheel. payload: 2B per wheel

msg FROM hoverboard: 16b msgID (a counter, so we can detect skipped) 8b cmd - the command defines the length payload - maybe it's fixed sized (but not necessarily the same as the IN msg size)

FROM commands:

  • startup / hello msg
  • unknown msg
  • heartbeat. just some stats on current speed, voltage, power draw, missed messages, speed goal, powering down or not
  • ACK any set commands?
  • auto powerdown w/ reason ID

main: all the init stuff set state = running # running, powerdown, echo speedL,R=0 speedGoalL,R=0 maxAccel = X maxTurn = X haveMsg = false trigger interrupt listener send a version / hello msg loop: sleep a little if state == echo: if haveMsg: loopsWithoutMsg = 0 if msg == echo and payload=off state = running else: echo the msg back trigger interrupt listener to start again else: need to do same no-msg countdown

    if state == running:
        if battery is too low:
            state = powerdown
            speedGoalL,R=0
            send auto-powerdown msg, reason=low battery
        if haveMsg:
            loopsWithoutMsg = 0
            make a note of any skipped msgs
            haveMsg = false
            if msg == heartbeat:
                pass
            elif msg == poweroff:
                state = powerdown
                speedGoalL,R=0
                send a powerdown msg, reason=host initiated
            elif msg == echomode:
                if payload == on:
                    state = echo
            #elif msg == set debug knob <-- implement this once we have a use case
            elif msg == set max accel
                set
            elif msg == set max speed
                set
            elif msg == set max turnrate
                set
            elif msg == set speed goal
                set
            else:
                send unknown msg msg

            trigger interrupt listener to start again
        else: # no msg ready
            loopsWithoutMsg++
            if loopsWithoutMsg > TOO_MANY:
                state = powerdown
                speedGoalL,R=0
                maybe send a msg indicating auto-powerdown w/ reason=listen timeout

    if state == powerdown:
        if speedL,R==0
            break

    # TODO: adjust speeds to get closer to goals, but also apply limits

    # TODO: if enough time has elapsed since last heartbeat out, send a status msg out

# post-loop
beep
poweroff

on interrupt: haveMsg = true