Shop OBEX P1 Docs P2 Docs Learn Events
RoboRealm MCU Examples / Help Needed — Parallax Forums

RoboRealm MCU Examples / Help Needed

SteveWoodroughSteveWoodrough Posts: 190
edited 2013-07-16 17:47 in Propeller 1
Well I’ve gotten this far with my Robo Magellan project:

https://www.youtube.com/watch?v=8eACDNHX7Lw

and now I’ve decided to add some vision.

Does anybody have experience they can share on using the Propeller_Communicator.Spin object and the RoboRealm MCU module?

Robo Realm (RR) seems like a pretty low cost, powerful enough tool, and I’ve spent a few hours messing with it and I can now drive my Magellan Bot around the basement with BT and a mouse using the RR Serial module. The Serial module passes serial data to and from RR, but you cannot really associate data to a variable within RR.

What I want to do next is to get data from the Prop into RR using the MCU module. From what I can tell looking at the code below the key is the mailboxes, but I’m not real sure exactly how this is supposed to work. RR did not have any examples and I could not come up with much on Google or Forum searches.

Below is the spin code for the communicator from the RR website:

I just need a nudge in the right direction.

Best Regards,
Steve

CON 
  _clkmode = xtal1 + pll16x 
  _xinfreq = 5_000_000 
  
  rxpin = 31 ' Receive on I/O pin 1 <- black from master black txpin p1 
  txpin = 30 ' Transmit on I/O pin 0 -> red to master red rxpin p0 
  ServoCh1 = 0  'Steering servo                             
  ServoCh2 = 4 

  MCU_GET_ID  = 1
  MCU_END_FRAME = 2
  MCU_SET_NUMBER_MAILBOX = 3
  MCU_SET_TEXT_MAILBOX = 4
  MCU_SET_LOGIC_MAILBOX = 5
  MCU_GET_NUMBER_MAILBOX = 6
  MCU_GET_TEXT_MAILBOX = 7
  MCU_GET_LOGIC_MAILBOX = 8

VAR 

  BYTE mailboxToSend[20]
  BYTE mailboxSendFlag[20]

  LONG intValue[20]
  BYTE logicValue[20]
  LONG textValue[20]
  BYTE textStore[1024]
  LONG textStoreTop
  BYTE buffer[8]
  BYTE command
  BYTE crc
  BYTE mailbox
  LONG hold

  LONG i,j
  LONG lvalue
  LONG tvalue
  
OBJ 

  serial : "FullDuplexSerial"   ' "Extended_FDSerial" '' 
  f : "Float32Full"
  SERVO : "Servo32v7.spin" 

PUB Main | DutyCycle ' new stuff DutyCycle 

  dira[16]~~
  
  serial.start(rxpin,txpin,%0000, 115200)                  '- rxpin,txpin,mode,Baud 

  textStoreTop := 0
  
  repeat
    repeat
      command := serial.rx
    while command & 128 == 0

    crc := command
    
    command := command ^ 128
   
    case command
      MCU_GET_ID:
        serial.Str(String("MCUC"))
      MCU_SET_NUMBER_MAILBOX:
        if ((buffer[0] := serial.rx)&128)
          next
        crc ^= buffer[0]
        if ((buffer[1] := serial.rx)&128)
          next
        crc ^= buffer[1]
        if ((buffer[2] := serial.rx)&128)
          next
        crc ^= buffer[2]
        if ((buffer[3] := serial.rx)&128)
          next
        crc ^= buffer[3]
        if ((buffer[4] := serial.rx)&128)
          next
        crc ^= buffer[4]
        if ((buffer[5] := serial.rx)&128)
          next
        crc ^= buffer[5]
        if ((buffer[6] := serial.rx)&128)
          next
        if ((crc&127)<>buffer[6])
          next
        intValue[buffer[0]] := buffer[1]|(buffer[2]<<7)|(buffer[3]<<14)|(buffer[4]<<21)|(buffer[5]<<28)
        mailboxToSend[buffer[0]] := 0
      MCU_SET_LOGIC_MAILBOX:
        if ((buffer[0] := serial.rx)&128)
          next
        crc ^= buffer[0]
        if ((buffer[1] := serial.rx)&128)
          next
        crc ^= buffer[1]
        if ((buffer[2] := serial.rx)&128)
          next
        if ((crc&127) <> buffer[2])
          next
        logicValue[buffer[0]] := buffer[1]
        mailboxToSend[buffer[0]] := 0
      MCU_SET_TEXT_MAILBOX:
        if ((mailbox := serial.rx)&128)
          next
        crc ^= mailbox
        hold := textStoreTop
        textStoreTop--
        repeat
          textStoreTop++
          textStore[textStoreTop] := serial.rx
          crc^=textStore[textStoreTop]
        while (textStoreTop<1024)&(textStore[textStoreTop]<>0)
        textStoreTop++
        if ((crc&127)<>serial.rx)
          textStoreTop := hold
          next
        textValue[mailbox] := @textStore[hold]
        mailboxToSend[mailbox] := 0   
      { stream values to mailbox }
      MCU_GET_NUMBER_MAILBOX:
        mailbox := serial.rx
        if (((crc^mailbox)&127)<>serial.rx)
          next
        mailboxToSend[mailbox] := MCU_GET_NUMBER_MAILBOX
      MCU_GET_LOGIC_MAILBOX:
        mailbox := serial.rx
        if (((crc^mailbox)&127) <> serial.rx)
          next
        mailboxToSend[mailbox] := MCU_GET_LOGIC_MAILBOX
      MCU_GET_TEXT_MAILBOX:
        mailbox := serial.rx
        if (((crc^mailbox)&127) <> serial.rx)
          next
        mailboxToSend[mailbox] := MCU_GET_TEXT_MAILBOX
      MCU_END_FRAME:
        processMailboxes
        { note that Text values are lost after being processed as we }
        { will reuse the buffer for the next frame                   }
        textStoreTop:=0

    repeat i from 0 to 19    
      if (mailboxToSend[i]<>0)&(mailboxSendFlag[i]<>0)
        case (mailboxToSend[i])
          MCU_GET_NUMBER_MAILBOX:
            lvalue := intValue[i]
            serial.tx(buffer[0]:=MCU_GET_NUMBER_MAILBOX|128)
            serial.tx(buffer[1]:=i)
            serial.tx(buffer[2]:=lvalue&127)
            serial.tx(buffer[3]:=(lvalue>>7)&127)
            serial.tx(buffer[4]:=(lvalue>>14)&127)
            serial.tx(buffer[5]:=(lvalue>>21)&127)
            serial.tx(buffer[6]:=(lvalue>>28)&127)
            serial.tx((buffer[0]^buffer[1]^buffer[2]^buffer[3]^buffer[4]^buffer[5]^buffer[6])&127)
          MCU_GET_LOGIC_MAILBOX:
            serial.tx(buffer[0]:=MCU_GET_LOGIC_MAILBOX|128)
            serial.tx(buffer[1]:=i)
            serial.tx(buffer[2]:=logicValue[i]&127)
            serial.tx((buffer[0]^buffer[1]^buffer[2])&127)
          MCU_GET_TEXT_MAILBOX:
            tvalue := textValue[i]

            serial.tx(buffer[0]:=MCU_GET_TEXT_MAILBOX|128)
            serial.tx(buffer[1]:=i)
            crc := buffer[0]^buffer[1]
            j := 0
            repeat while (byte[tvalue[j]] <> 0)&(j<254)
              byte[tvalue[j]] &= 127
              crc ^= byte[tvalue[j]]
              j++
            j++
          
           buffer[2] := crc&127

           serial.tx(buffer[0])
           serial.tx(buffer[1])
           serial.str(tvalue)           
           serial.tx(buffer[2])
           
        mailboxSendFlag[i] := 0

PUB processMailboxes

  { Assumes values for servos are in mailbox 0 and 1 }
  SERVO.Set(ServoCh1,intValue[0]) 
  SERVO.Set(ServoCh2,intValue[1])

  if (intValue[2]<>0)
    outa[16]~~
  else
    outa[16]~

  intValue[3] := ina[17]
  mailboxSendFlag[3] := 1
         

Comments

  • Duane DegnDuane Degn Posts: 10,588
    edited 2013-07-15 21:11
    Sorry I can't help with the RoboRelm question but I'm curious what type of machine vision are you after?

    I have some links to Propeller based machine vision techniques in post #4 of my index. The CMUcam4 can detect color blobs.
  • SteveWoodroughSteveWoodrough Posts: 190
    edited 2013-07-16 17:47
    Duane
    Cone finding would be a logical use, but my hope is to circumnavigate my house and stay on the grass and out of the gardens! Essentially I’m looking for path planning and obstacle avoidance tools. Ping sensors are good, but there are limitations, etc.

    I’ve always found vision processing to be an amazing feat and to my untrained eye, RoboRealm seems to have some pretty diverse and powerful vision processing filters, and capabilities. I don’t think RR is “strong” enough to guide a car down a highway, but for a gear head hobbyist, it’s awful easy to use. I just need to get past this hurdle.

    Regards,
    Steve
Sign In or Register to comment.