Interfacing a Rasperry Pi 3B to Arbotix-M Robocontroller


#1

I am working on a Humanoid style Robot as seen here. I ran into a dead stop yesterday as the Arbotix Pro Robocontroller appears to have up and died on me (R.I.P. Arbotix Pro: 2016 - 2019). I contacted Trossen Robotics to see what my options are due to its age (1.5 - 2 years old, don’t remember exact purchase date), while waiting for a reply I was planning on purchasing another Arbotix Pro. I found that the Arbotix Pro is no longer listed for sale on their website. I searched high and low and can’t find any for sale online, not even on the manufacturer website. They only list the Arbotix-M for sale which brings you to Trossen Robotics.

So here’s the issue. I have a Arbotix-M already, but I don’t know how to get it connected up with the Raspberry Pi 3B or 3B+. The next concern is, if I can get it connected, will it run the code that I already have in place with maybe a driver tweak. This needs to control 20 DYNAMIXEL AX-12A Actuators and eventually a camera for head/color tracking that will be added in the future (possibly other sensors later). I searched the web and have been unsuccessful at finding the guidance I am looking for.

Is there a better way? The software code is a direct copy of the HR-OS1 from here.. This is for a Raspberry Pi 2. I fully updated the image using:

sudo apt-get update && suds apt-get upgrade

After that, I used git to clone the repository to the RaspBerry Pi 3B, then installed all required libraries and compiled node.js (took nearly 3 hours on the RaspBerry Pi).

Since I have an HR-OS1, I swapped the Micro SD card with the one I am building to confirm it all works, and as suspected it worked. Trossen hasn’t released an updated image since 2016, their latest image doesn’t work with the RaspBerry Pi 3B out of the box.

Any ways, I now have no immediate way to solve this and am looking for ideas. My knowledge here is still limited but growing. Looking for a method to get this robot running.

  • How do I successfully connect the RPi3 to the Arbotix-M?
  • Anyone have a link to purchase another Arbotix-Pro?
  • Anyone have a working Arbotics Pro they want to sell for a reasonable price?
  • Is there another method to accomplish this task? (I know there is but what actually works)

Any help would be appreciated.


#2

I’m not quite sure what you’re attempting to accomplish since I don’t have any of the Arbotix boards. Maybe I can help with the Raspberry Pi stuff though…

Personally, I always use the default Raspbian images and install stuff into them manually to avoid the issue with stale images.

It sounds like the Arbotix-M is arduino compatible so I would image the way to go would be to program it from your main dev computer.

https://www.trossenrobotics.com/p/arbotix-robot-controller.aspx claims that the board supports i2c so that sounds like a way of connecting the board to the Raspberry PI 3

Could you say a bit more about what you are trying to do with the Arbotix-M and Raspberry Pi?


#3

Thanks for the reply.

In short I typically use the ArbotiX Pro. But my spare one died and they don’t appear to be available anymore. I have never used the ArbotiX M with a Raspberry Pi.

So I am hoping to use the ArbotiX M to interface 20 AX-12A actuators to allow my Humaoid Robot to walk and such. But I don’t seem to see how to connect the ArbotiX M to the Raspberry Pi. If you check out the HR-OS1, I am trying to get my humanoid to do the same things. Mine is here:

Forgive the non technical description as I am pretty new to this side of robotics. The issue or concern is how to interface the RPi 3 with the ArbotiX and have it communicate. Rebuilding the framework shouldn’t be an issue once I am able to get the communication working.

I forget where I read it today but it’s suggested to use the USB to FTDI cable. I ordered one today.


#4

USB to FTDI would be one way to go, but recently I have been moving away from that and, as @thesocialrobot suggested, been using I2C to connect external devices to my Arbotix-M board.

I have used the I2C method to connect my Arduino Mega to my Arbotix-M on my version of your Hexabot robot. The code to receive commands over I2C on the Arbotix-M is pretty straight forward and I am happy to post some examples where I send packets of information if it helps. I haven’t tried this with a Raspberry Pi but I am sure it would work as the Pi’s have I2C, the only thing I would check is the signal voltage levels. If the Pi signal voltage is 3.3v you will need a level shifter, as the Arbotix-M is a 5v arduino compatible.


#5

Thank you for the info @CarlC and @thesocialrobot.

As mentioned I am new/green to this area of robotics. If you have any info how I might learn to do this please share links / videos / code examples aimed at the beginner. I learn best by visual examples. I typically pick things up rather quick this way.

I am looking for the best alternative to the Arbotix-Pro. I have the Arbotix-M on hand so I thought that may be best since the code was designed for its big brother.

Hoping I don’t have to start from scratch here as it will delay finishing the Humanoid I have almost done at least as a first rev.

I guess the easiest way to say what I want to do is this. Pretend you have the HR-OS1 kit I mentioned above. It uses the Arbotix-Pro with RaspberryPi 3B. Now say the Arbotix-Pro has up and died. You have an Arbotix-M, how would you make that work in the place of the Arbotix-Pro? The reason to do this is because you can’t currently get an Arbotix-Pro.

I know there is a wiring change as the Arbotix-M doesn’t have the 4-Pin Dyamixel Port that was use on the Arbotics-Pro to connect to USB. That is likely the FTDI to USB cable I mentioned and @CarlC said is one way to do it. Then I assume there is some sort of driver/firmware change in the Framework to allow the code to know it’s to use the Arbotix-M and not the Arbotix-Pro.

So I think I understand the basics here, but just not how to do it.

But as both @thesocialrobot and @CarlC have mentioned I2C is another method that seems to be either a better choice or more popular choice these days. I am open to either method as long as it will perform as good or even better than how the HR-OS1 works.


#6

I’ll try and explain my approach to the I2C interface between my Arbotix-M and my Arduino Mega ADK boards and hopefully, some of it may be useful.

Let’s start at the Arbotix-M end:

Firstly, you’ll need to include the wire library as follows

#include <Wire.h>

Next, in the setup function you will need to start the I2C interface and assign your Arbotix-M an unused address on the I2C bus

//start I2C communications for inter-board communication
Wire.begin(8);                // join i2c bus with address #8
Wire.onReceive(receiveEvent); // register event

In the case above I have assigned the Arbotix-M board an ID of 8 on the I2C bus, and have defined a callback. If the I2C library receives incoming data it will call the function receiveEvent()

I use a simple byte array to pass more complex data across the I2C board. My structure is:

1st Byte = message type - value of 255 denotes a command
2nd Byte = Xspeed for my hexabot
3rd Byte = Yspeed for my hexabot
4th Byte = Rotation in 1/255th of a circle
5th Byte = pose to call in pyPose (1 = stand, 2=rest etc.) - this is 0 if speed or rotation data is passed, if a value is passed in one of the speed values and pose is not 0 I ignore it - Speed takes precedence over poses
6th Byte = basic checksum - although I haven’t got around to implementing it on the receiving end yet

So all my receiveEvent() function does is read the bytes coming in on the I2C and copy them into an Array. Arduino can get a bit funny about arrays being updated like this so I have had to initialise the array in the variable definitions as follows:

byte rec[6];
byte rectmp[6] = {0, 0, 0, 0, 0, 0};

Then in the receiveEvent() function you will see a memcopy where I create an empty array based upon the rectmp array previosuly defined. Here is the full receiveEvent function:

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
if (howMany==6){
memcpy(rec, rectmp, 6);
int cnt = 0;
while (0 < Wire.available()) { // loop through all but the last
byte b = Wire.read(); // receive byte as a character
rec[cnt] = b; // print the character
cnt++;
}
processCMD=true;
}

When the command is processed it iterates through the rec[] array and processes the command values.

On the sending end - in my case an Arduino Mega ADK - you just create the command byte array and send it. So on the Mega, I have included the wire library as follows:

#include <Wire.h>

Then define a byte array for the command:

/Byte Array for I2C commands/
byte buffer[6];

In the setup routine I start the wire library as the master:

Wire.begin();

And my function to create the byte array and sent it to the Arbotix-M is this:

bool sendCMD(int CMD, int XS, int YS, int RS, int seq){
buffer[0] = CMD;
buffer[1] = byte(XS);
buffer[2] = byte(YS);
buffer[3] = byte(RS);
buffer[4] = byte(seq);
buffer[5] = (XS + YS + RS + seq) % 255;
Wire.beginTransmission(8); // transmit to device #8
Wire.write(buffer,6); // sends six bytes
Wire.endTransmission(); // stop transmitting
return true;
}

Sorry the code seems to have lost its indents but I think it is still readable. I hope that makes sense, obviously the code on the raspberry pi will be significantly different to the code I use on the Mega but the principle should be the same.


#7

@CarlC

Thank you for this info. I am going to have to start looking into this. Maybe I will convert my Hexabot to use this type of setup, and experiment / learn this. Thanks for sharing.

I received a reply from Trossen Robotics Support today. Here is a direct quote on some of the reply:

There is no direct replacement for the Arbotix Pro board, we stopped producing this in 2016 and carried inventory up until 2018 to accommodate those people that did purchase the OS1 platform. We still do have a forum for users of the OS1 http://forums.trossenrobotics.com/forumdisplay.php?140-HR-OS1-Development-and-Discussion and we are still hosting all of the documentation regarding the OS1 https://learn.trossenrobotics.com/38-interbotix-robots/164-hr-os1-humanoid-overview.html , we’re just not developing / supporting the platform anymore.

Also in the reply was the offer to give me a replacement from one they had in the office. There is no guaranty that it works, but they offered it for free including shipping. That was cool of them to do. So I am going to wait it out a couple days to see if that works, as I would like to complete the humanoid. Th en maybe I will start on a rev 2 with the ideas from @CarlC and @thesocialrobot. This will be good considering I have some revisions I want to make to my design anyways.

So while some good may come of the issue, it also forces me to learn new things which I am all for. So in the end it’s a win win.


#8

What a kind offer from Trossen Robotics, I have heard good things about them before, I just wish they would open an office in the UK :wink:


#9

I couldn’t agree more. I honestly expected the response, sorry but we stopped producing it, your out of luck. But got a board for free with the understanding that it may not be functional.

I am pleased with that. I also am glad in a way, as it will force me to move forward. And to continue what I want to do, this is a must. So I will give it a try in hopes I can complete this part of the project.

But I will also start to look into the suggestions, with thoughts of converting my Hexabot.


#10

Yesterday I received the replacement Arbotix-Pro and initial testing suggested that the replacement (was used without a guarantee) was also bad, I could connect to it and the OS could see it, but no communication to the servos.

Unfortunately, as I seen last night the software sees the Arbotix Pro and can initiate the RME (Robot Motion Editor) and I can play a sequence, I tried sequence 002 (play 002) which is “Init Slow” which will cause the robot to stand. The sequence plays but the robot does not stand.

[IMG_0617

Now if I open the DXL Monitor it will show which servos are present and their programmed ID. At a minimum there would be at least 1 ID as ALL Dynamixel servers are programmed to ID 1. I had previously programmed each of these and labeled them all right after doing so. So any AX-12A that I have will contain either a label with a number 1-20 or no label. No label means they are still factory settings. And when I open the DXL Monitor all servo connections fail. There is no load on any of them yet and I have a 12 Volt 10 Amp Power Supply connected so I know they are getting plenty of power.

[image

So I am now off finding a method to use the Arbotix-M controller. I was in hopes of using a Raspberry Pi 3 B+ that I purchased for this project but everything I am finding is suggesting to use an Arduino board (which I have many of).

So I may consider doing so, I just don’t know if the Arduino will run the robot like the HR-OS1. By this I mean will it allow for the walking and poses.

Besides walking I would like to make custom poses / movement as seen with my HR-OS1 below:

I don’t necessarily mean to duplicate all of this. But I intend to have a vision tracking system in it as well as some sort of sonar so it don’t walk into walls. Can the Arduino do all of that? Basically make it autonomous to some level. It would be nice to connect a Playstation Controller to it so it can be run via remote control too.


#11

Personally, I would try and stick with the Raspberry Pi. Arduinos are great in their place but have very limited processing power. I am not saying that things like vision tracking would be impossible but they would be much, much harder (would probably need a smart camera like a Pixy).


#12

I am thinking the same here. I was looking at ROS as well as PyPose. I found this link directly from the manufacturer of the Arbotix-M, it seems they recommend it.

http://vanadiumlabs.github.io/pypose/

http://vanadiumlabs.github.io/arbotix/#arbotixsetup


#13

Just be aware that PyPose hasn’t been updated for quite some time, that said it works okay, I had to hack the interface for NUKE (Nearly Universal Kinematics Engine) but that only works for hexapods and quadrupods. The sequence recording and playback works really well, or it has for me so far :grin:


#14

I agree with Carl. I suspect the arduino would be fine for basic movement control, but anything more and you’d want the sort of CPU power and RAM that a Pi can provide


#15

Thanks for the additional input.

I also tend to agree with both of you. I have started watching training videos on ROS and ordered several books too. Best I can tell is that ROS is the way to go for anyone serious about Robotics and I am just that.

It may take me some time to get where I need to be but that’s fine. I have other projects I can work on and share here too. Especially the InMoov Robot as I still have to complete the hands and finish the electrical.

When that’s all done and I am happy I hope to design one circuit board for the entire robot. I have a few small ones already designed and incorporated into the robot.


#16

Well all the books but one have arrived. Now to figure out where to start.

I am just waiting on this one from Robotis.