What's next after Arduino?

Hello all-

So I've been playing around with my Arduino for a few months now, and I love the thing. However, I think I'm ready to move onto bigger things. I want to learn how to basically wire my netbook to a roomba and drive it, or basically use a computer to replace the arduino. I guess I'm looking to head into more professional applications (by no means am I slighting the Arduino, I love them, and own 3). What is my next step? I've tried googling it, but I can't find what my next step should be. What's the programming language, whats the UI, whats the board that I'll plug into my computer to interface with servos? Can I use it with LabView?

So many questions, any guidance would be greatly appreciated. I'm starting an education in the robotics industry, and would love to learn where I should focus, and where to start. Any info would be greatly appreciated! Thanks!

http://www.ros.org/wiki/
http://opencv.willowgarage.com/wiki/

I've looked at ROS (the Robot OS), but dont see any tutorials on actually implementing it. One of my favorite things with Arduino was its low barrier-to-entry, where anyone can learn it. I guess I'm looking for the same.

Why not use the Arduino (or multiple Arduinos - or, more like, multiple standalone 328s) to interface to the servos/motors/sensors, and communicate with them using the laptop/PC/whatever? In other words, make your "end components" "smart", and communicate with them using a PC.

If you don't have enough USB ports, then you could, potentially, use a single "master" Arduino, the Wire library, and have the other Arduinos (remember, these are likely all going to be standalone instances - I am just using the term "Arduino" as a placeholder) be "slaves" over I2C/SPI. That way, only the master Arduino needs a USB connection, and the slaves are just hooked into the master I2C/SPI adressable bus.

Another option would be to give each Arduino an ethernet interface, then connect them to the PC via a small switch (a variant of this would be to put groups of Arduinos, using the master/slave I2C/SPI concept above, with the master having the ethernet connection - grouping could be based upon logical end-uses: Sensor Group, Servo Group, Motor Group, Arm Group(s), etc).

A benefit of such a system would be that as a standalone type distributed system, you could give each a level of autonomy, error reporting, etc - it could be configured in such a manner so that should something go wrong, that portion could be shutdown automatically, and throw a flag that the main PC could be looking for to indicate an issue (and either take action or just pop a log entry or something). Also, you could easily do "set and forget" functionality, so that the main PC (or the "master" Arduino) wouldn't need to get bogged down in coordination and control issues. Just set it, forget it, and check the queue every now and then to see if an issue has occurred, if not, continue with more important processing tasks (like vision or routing - things that the PC needs a lot of horsepower to begin with to perform well).

Of course, all of this leads to a much more complex system, but at the same time, it could become more fault tolerant. You don't have to take the Arduino out of the loop; instead, incorporate it into the loop. That's what microcontrollers are for (and why there's one in a PC keyboard, among other myriad places).

Ok cool, I like that idea. Now, looking at the Wire library, my question is this, say I had a master arduino, and then a servo attached to a slaved arduino. If i wanted to send a move command to the servo, does it have to be translated into binary or anything, or do i just pass the code as usual. Thanks again for the help and ideas :slight_smile:

ttkoshi:
Ok cool, I like that idea. Now, looking at the Wire library, my question is this, say I had a master arduino, and then a servo attached to a slaved arduino. If i wanted to send a move command to the servo, does it have to be translated into binary or anything, or do i just pass the code as usual. Thanks again for the help and ideas :slight_smile:

Just as if you were trying to control the servo on the Arduino via the USB serial interface, you would have to come up with a communication protocol to send from the master to the slave via the Wire library. There isn't any easy ways around this (but there is a lot of example code). Something to keep in mind when you design this is how this protocol is going to work (in both directions, ideally); you need to, from the PC, be able to say "move this servo to here", and the system needs to be able to easily translate that. Depending on how smart you make everything, you could (for instance) have the PC query the network, and discover all the nodes and logical groupings, then command them as needed (that way, if you move a node or something, not much code has to change, and most or all of it will be on the PC itself).

Passing the code from the master to slaved arduino, would i basically:

  • Send code to the master arduino to turn servo A to position 90
  • Have master arduino take that command and parse it into a simple string easily sent via serial (i.e., "a90")
  • send that command via the Wire library to the slaved arduino
  • slaved arduino acts
  • slaved arduino sends a "operation complete" code

I'm making this up as I go, i've never used the Wire or Serial libraries (apart from using serial to sent text to the debugger). Thanks!

ttkoshi:
Passing the code from the master to slaved arduino, would i basically:

  • Send code to the master arduino to turn servo A to position 90
  • Have master arduino take that command and parse it into a simple string easily sent via serial (i.e., "a90")
  • send that command via the Wire library to the slaved arduino
  • slaved arduino acts
  • slaved arduino sends a "operation complete" code

I'm making this up as I go, i've never used the Wire or Serial libraries (apart from using serial to sent text to the debugger). Thanks!

Yes, essentially. The trick, depending on how complex your network is, is in routing the messages properly to the appropriate points. You might take a cue from the internet on this, and have some kind of "addressable" system, so that each point along the way knows how to pass things up and down the chain. It certainly wouldn't need to be as complex as the NIS layering topology. If you set it up right (and perhaps have some kind of "self-discovery" mechanism involved), you could end up with a system that could make it easier for future uses (as in a library that could be put onto multiple arduinos, specifying which are masters, which are slaves, addresses, etc - and it "just works").

Or - if your goal is more on the robot - just take the "quick-n-dirty" approach, but keep good notes of what goes where so your PC control code can be written and work properly.

:slight_smile:

ttkoshi:
Hello all-

So I've been playing around with my Arduino for a few months now, and I love the thing. However, I think I'm ready to move onto bigger things. I want to learn how to basically wire my netbook to a roomba and drive it, or basically use a computer to replace the arduino. I guess I'm looking to head into more professional applications (by no means am I slighting the Arduino, I love them, and own 3). What is my next step? I've tried googling it, but I can't find what my next step should be. What's the programming language, whats the UI, whats the board that I'll plug into my computer to interface with servos? Can I use it with LabView?

So many questions, any guidance would be greatly appreciated. I'm starting an education in the robotics industry, and would love to learn where I should focus, and where to start. Any info would be greatly appreciated! Thanks!

Sorry to be mean (or rude), but... looking to other platforms before actually learning the "Arduino" is not the way to go.
The Arduino is really the ATmega328 (and the USB chip, of course), and if I ask you how to setup the ADC, or create a timed interrupt by using the registers inside the ATmega328, would you be able to?

So before moving on, if I were you, I'd learn C, get the AVR-GCC and start learning how to setup the internal peripherals on the ATmega328 to do what you need. Once that is covered, you'll probably feel like there is a bit more you can do, or at least in a different way than by using the Arduino IDE.
No UI is needed with AVR-GCC. And to interface the servos you can continue to use your Arduino, or create a board with a controller chip for servos. Maybe in a shield form. I don't think people use high power controllers to control servos either way... that is normally done by some other chip on the board.

Hope to have answered your question. It's not really where you should go... it's how deep you should learn stuff. And right now, your head is still above the water.

Wireless (mesh) sensor networks with a few mobile nodes are the robots of the future. This is a great presentation,

Think of Hawking Technologies mesh network with a few mobile nodes, that's where everything will converge,

or in Star Trek terminology, everything will converge in The Borg, faster than most people think,

Where i can get AVR-GCC and some tutorials?

AVR-GCC is embedded in the Arduino IDE. If you want to bypass the Arduino
stuff, you might go over to the avrfreaks forum and ask there.

One should also consider wireless solutions. If you wire Bluetooth to your Arduino robot, your laptop can communicate with it over the virtual serial port. No need to 'glue' it to the robot.

Another option is to add a Raspberry Pi or a Beagle to your robot which works with the Arduino in a similar fashion. For example, the new RPi camera could become a cheap and effective robot vision system.

Your laptop can then talk to the Pi (or Beagleboard) which talks to the Arduino. A 3 level solution!

When you walk down the street your neocortex talks to your cerebellum which talks to the brain stem which fowards commands to nodes in the lower spinal column. That is at least 4 levels.

Note that mother nature adds new layers on top of what already works. She discards nothing. So keep the Arduino - it is natures way :slight_smile:

Joe

oric_dan:
AVR-GCC is embedded in the Arduino IDE. If you want to bypass the Arduino
stuff, you might go over to the avrfreaks forum and ask there.

Thank you :slight_smile: i just want to learn how atmega really works inside and all this stuff

You could buy a cheap Bluetooth module and connect your arduino to your android phone. There is an easy way to program your android phone. It's called basic4android. I'm currently trying to learn it. You could also do open cv on your android phone

I am also a beginner in Robotics but I've used Arduino for a while now.

I think you can do a lot more with Arduino type boards. I've started a project which sounds similar to what you suggest. A connection between smart phone / tablet and an arduino controlled robot over bluetooth. I'm using the mega2560 board.

I'm sharing the project here as it develops: Gampa Geek . It's very raw at the moment but I have made some progress and posted code and hardware designs.

cheers

ttkoshi:
Hello all-

So I've been playing around with my Arduino for a few months now, and I love the thing. However, I think I'm ready to move onto bigger things. I want to learn how to basically wire my netbook to a roomba and drive it, or basically use a computer to replace the arduino.

So, you want to do something more advanced than this?