Penny - An Arduino SHR

Introducing Penny. She's beginning her existence as a Start Here style robot. However, she's based on an Arduino Mega.

  • Video 1: Early testing of the servo and Sharp IR sensor used to test my code.
  • Video 2: Penny prototyped on a breadboard and running fine

Chassis

I re-used the motors, wheels and chassis from my original SHR, which has been gathering dust for a while.

Penny is configured back-to-front from the old SHR, with her drive wheels in the lead. I set the Sharp IR sensor back as far as practical, since it doesn't work well closer than 10 cm anyway.

The messy breadboard will get cleaned up. I plan to use Ro-Bot-X's Arduino shield for building robots, which will take care of .some of that wiring for me.

Update 2010-10-05: I have received the Ro-Bot-X designed Arduino shield and gave Penny an upgrade. Look at her now. Quite a difference!

Code

Penny 1.0 is based on a straight translation of fritls' Start Here code for the Picaxe. This is my first Arduino robot, so I wanted to start simple. I'm very pleased with the result.

I have attached the original code as well as an updated version that is fit for the Arduino shield and adds a backup function.

Electronics

I'm using an SN754410NE dual h-bridge motor driver. No other electronics yet.

Execution

As you can see in the 2nd video, Penny is working fine. I adjusted some parameters, like how far away she reacts to an obstacle. There's plenty of room for enhancement of the basic SHR code, and I'll use Penny as a platform for learning more about  the Arduino.

Future

The future is bright for Penny. I have a lot of possible enhancements with an Arduino Mega as the brain power. We may see features like:

  • Wheel encoders
  • PWM
  • Line following
  • Edge/cliff detection
  • More actuators
  • Perhaps... penmanship
  • Actuators / output devices: 2 GM9 from Hobby Engineering with upgrade, DAGU mini servo
  • CPU: Arduino Mega
  • Power source: 4xAA alkaline batteries
  • Programming language: Arduino
  • Sensors / input devices: Sharp GP2Y0A21YK0F IR sensor
  • Target environment: Indoors. Carpet or smooth floors

This is a companion discussion topic for the original entry at https://community.robotshop.com/robots/show/penny-an-arduino-shr

Good job

Congratulations.

Code!!! We want to see the

Code!!! We want to see the code!! (Or at least I do…  :P )

Also, what are you using for motor drivers? 

Hey my friend,I like your

Hey my friend,I like your robot,well done and great video explanations. It’s good to have comments while the robot is running.

Thanks for posting and I’ll keep an eye on your projects for sure :slight_smile:

You look like a nice and

You look like a nice and cool guy.  By the way would the code work on the arduino Duemilanove too?

Yes it will. You just have

Yes it will. You just have to change the analog pin number from 54 to whatever you are using on the Duemilanove.

I’m only using the Mega because it is what I have. It’s HUGE overkill for this robot.

**nice **

you got further then my arduino start here robot :stuck_out_tongue:

Strange coding though…On

Strange coding though…

On the duemilanove you would need to address the pin with it’s “pin number” when using pinMode and digitalWrite, while you would use a number from 0 to 5 (duemilanove has 6 analog inputs) when using the analogRead. I’ll explain myself better: let’s say you want to set the first adc pin as input and activate internal pull-ups, you would do something like this:

pinMode(14, OUTPUT);

digitalWrite(14, HIGH);

and to read from the SAME analog pin you’d write:

analogRead(0); 

For pinMode and digitalWrite you gotta start counting from the first arduino pin, and analog ones come right after. For analogRead you start counting from 0, which represents the first pin. You may want to write it down in case you want to make an arduino-based SHR so that folks using duemilanoves can get it working :=)

ps: you probably know this much better than me…main purpose of my post was just reminding :=)

 

Nice SHR!

NICE example SHR! Great video explanation - something I need to do in my own videos… :slight_smile:

I really ought to get an order in to Ro-Bot-X for his robo-shield. I seem to keep building the SN754410NE on a breadboad shield for a quick test project, then tear it down, then later end up building it all over again. Would probably spare me some wasted time and effort… :-/

 

Thanks for your help both :slight_smile:

Thanks for your help both :slight_smile:

Thumbs Up!

Nice to see you’ve joined the “Show Your Face Club” @ LMR.  Keep up the good work !

Actually, since I’m totally

Actually, since I’m totally new to the Arduino, it is an interesting point. I read that about the Duemilanove. When it came time to code, I figured out I would need to use pin 54 for my pinMode and digitalWrite commands to set the pullup high, just as you say. But why declare a second variable just so the pin matches the printing on the board?

Since I wasn’t used to this convention, I kept it simple and used the same variable storing ‘54’ for the analogRead command as well. It worked fine, but it is helpful to know that Arduino convention is as you describe it. Thanks for the education. ; j

Welcome!I just thought you

Welcome!

I just thought you couldn’t adress the pin the same way as you did with pinMode/digitalWrite. That’s what the reference on arduino.cc says: 

pin: the number of the analog input pin to read from (0 to 5 on most boards, 0 to 7 on the Mini and Nano, 0 to 15 on the Mega)

…guess they gotta update it! :=)

You can use both, the

You can use both, the digital pin number or the analog channel number. See the Arduino code:

 

int analogRead(uint8_t pin)
{
        uint8_t low, high;

#if defined(AVR_ATmega1280) || defined(AVR_ATmega2560)
        if (pin >= 54) pin -= 54; // allow for channel or pin numbers

        // the MUX5 bit of ADCSRB selects whether we’re reading from channels
        // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high).
        ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#else
        if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif

I prefer to use the analog channel number. BTW, nice job ignoblegnome, Arduino rules.

Righto, so here seems a good

Righto, so here seems a good place to ask a few questions that are bugging me (not about penny, s/he’s lovely).

You use a SN754410NE -  in the case of penny, is there any difference between the functionality of an h-bridge, and of a L293 motordriver?

By using robot-x’s shield, you’ve cleaned up a lot of that wiring;  I assume it’s possible to achieve a similar outcome if you customised a circuit board? So is it true that using robot-x’s board is a kind of multi-purpose re-wirer?

While I’m at it, what is the difference between “shield” and “board” in this context?

Now you have the arduino shield/board and RX’s shield on penny, does that mean it will ALWAYS be on penny (as long as she lives)? or do you intend to later cannibalise her for parts - specifically the arduino and RX’s shield/board? (I don’t have an arduino, and I’m not sure what they give that isn’t accessible from a picaxe, and they seem to be much less versatile-per-dollar. since you’ve done both - what’s your view?)

 

Thanks for all the

Thanks for all the questions.

The SN754410NE is described as being pin for pin compatible with teh L293 driver. They are both h-bridges. The L293 includes internal clamp diodes, while I’ve heard that external clamp diodes are recommended for the SN754410NE (though I’m not using any).

Ro-Bot-X’s shield is just a custom board that happens to suit my needs. The term “shield” is an Arduino community term for a board that stacks onto an Arduino.

This is my first Arduino. I have futher plans for Penny, so she’s safe for now. We’ll see what happens in the future.

I have found the Aruino to be more flexible than the Picaxe, and pretty easy to learn. I’m playing with some navigation routines right now that require floating point math, which is something you can’t do on the Picaxe.

Are those capacitors across

Are those capacitors across the motor terminals? What are they for?

The capacitors are used to

The capacitors are probably used to reduce electrical noises from the motors.

Yes, those caps are for

Yes, those caps are for reducing motor noise. You add 0.1 uF caps across the motor terminals. You can optionally add two more caps per motor. Each connects from one motor terminal to the metal case of the motor.

So they’re not connecting

So they’re not connecting terminal to terminal on the motors? It’s kind of hard to see in the pictures…

Thanks, BTW, for answering noob questions!