Let's Make Robots!

NINA's new Chassis

Act as a mobile chassis platform for the NINA robot.

NINA's new robotic chassis. The first one was rediculously heavy! This one is still very sturdy and strong and I can lift it with one arm! All aluminum material (except for the nuts and bolts). Treads are lynxmotion with custom made hubs. The motors look a little small, but they're still very powerful (one of those motors could push around a ride-on toy and not even when its that geared down. These motors are geared down to 256:1 with a no-load RPM of 96 and a stall torque of 110 ft-lbs each. They run on 12 volts and I expect they will draw no more than 10 Amps each from the 20 AH battery pack I have constructed for them (plus I've got lots of 20 Amp fuses ready). That's if the robot is going up an incline (which I'm not intending it to do). Forward and backward will be much easier. But because the robot runs on treads and not wheels, it may make the job a little toughe. Still, I think they'll do the trick.

Update--October 27, 2010:

Finsihed building the rest of the chassis! Very stury, very light (I can actually pick it up and carry the whole thing in both hands). There are a lot of loose wires right now, but I'll definitely be sure to organize them safely before this beauty is operational. All I have to do now is plug in the electronics and run the program I've created for her. That'll be for tomorrow. I'll be sure to have my camera ready.

Update--October 28, 2010:

Connected the electronics and tested the servos. Results are shown in the new video.

Update--November 5, 2010

NINA is now fully articulated with interpolation alorithms for her servo movements! She tracks faces, shakes hands, and waves hello. NINA actually was put on display for Halloween this week where she had a line of trick-or-treaters forgetting about the candy and anxious to shake her hand. I will keep everyone updated on her progress and her programming is very easy to implement. Most of the hard part is over. Permitting the venue will allow it, I'm thinking of having her on display at the Autism Conference in February where I'll demonstrate her "social machine" functionality (Right now, NINA's main niche as a robot is to serve as an experimental social machine--to aid communication skills in those with communication disabilities like autism--particularly Asperger Syndrome.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

need more INPUT Stephanie!

Amazing work! My son loves that NINA looks like J5 from Short Circuit.

It looks like you have a great platform for innovation. Now that the physical build has reached this stage, I look forward to seeing what you can do with her.

Well, I guess I gotta add Python to my list of languages to learn... If programming languages were real languages, I could be a tour guide at the UN by now.

 

BTW --Processing, which is so far, my language of choice on the PC, simply does not have much in the way of speach recognition... alas.

waoh! I never seen such a thing! I don't know a thing in programming but that looks real nice result!

What are you using for voice recognition software and what are you using for text to speech?

 

Hi there, Chris.

I'm using windows speech recognition which is imported into NINA's main python program. A good friend of mine wrote the module speech.py for me--he was inspired to write it after seeing the difficulty I was having on the daniweb forums. This great module, speech.py, is able to use speech recognition and and text-to-speech and pass on functions based on recognized text (like moving servos). The text-to-speech voice is Cepstral Robin--a child-like voice. I bought a liscense for it after listening to it and said, "Yes, that's the voice for NINA." Using python, I'm able to tie in all the functionality into one central program (speech, servos, motors, OpenCV computer vision--and eventually I'll get sensors in there).

Hey, I like how your robot responds. Of course, voice recognition makes troubles when you want to show it, it happened to me too many times. I have a suggestion:

I noticed that the servos move at their max speed. To keep them from breaking, you need to interpolate the moving and play it at lower speeds. I'm working on a function for Arduino that takes care of calculating the intermediary points between the start and end positions based on a Speed variable you pass on to that function. I'll show you an example tonight.

 

 

 

I wrote this code after John Palmisano's code for his ERP robot. All the math is his, I just wrote the code in Arduino. At the moment there is just one Move, similar moves can be added and played at various speeds (higher numbers will create more steps, thus slower actual speeds). I don't particularly like the fact that I have to use empty arrays for servos that don't move so I will try to store only the positions for the servos that actually move. But that will be done at some other time. Until then, here is the code:

 

//MiniEric test code to interpolate servo moves
//adapted after http://www.societyofrobots.com/robot_ERP.shtml code

#include <Servo.h>

// Servo pins

#define WaistPin     2  // digital pin 2
#define LshoulderPin 3  // digital pin 3
#define RshoulderPin 4  // digital pin 4
#define RarmPin      6  // digital pin 6
#define LarmPin      7  // digital pin 7

// Servos
Servo Waist;
Servo Lshoulder;
Servo Rshoulder;
Servo Larm;
Servo Rarm;

//various common initialized variables
int i;
int j;
float per_a;
float per_b;
int next;

//initialize variables
//these variables store only current servo location
int waist;
int leftShoulder;
int rightShoulder;
int leftArm;
int rightArm;

//initialize home variables - HOME POSITION
//tweak these numbers until the pose is right
int home_waist=65;
int home_leftShoulder=180;
int home_leftArm=80;
int home_rightShoulder=180;
int home_rightArm=90;

//define the Right_Arm_Wave Move
//all positions are added to the home position to get 
//the real positionn where the servo will be
//
//the robot lifts the right arm (rotating right shoulder 180 degrees) then moves the arm
//right-left-right-center
byte wave_count=6; //number of positions in the move array
int wave_waist[6]=         {   0,   0,   0,   0,   0, 0};
int wave_leftShoulder[6]=  {   0,   0,   0,   0,   0, 0};
int wave_leftArm[6]=       {   0,   0,   0,   0,   0, 0};
int wave_rightShoulder[6]= {-180,-180,-180,-180,-180, 0};
int wave_rightArm[6]=      {   0,  30, -30,  30,   0, 0};

void setup() { 

  Waist.attach(WaistPin);
  Lshoulder.attach(LshoulderPin);
  Rshoulder.attach(RshoulderPin);
  Larm.attach(LarmPin);
  Rarm.attach(RarmPin);
  Home_Position();

}

//-----------------------------------------------------------------------------

void loop(){
  for (int x=10; x<=100;x+=10){
    Rarm_wave(x); //try out different speeds, see wich works best
    delay(1000);
  }
}  

//-----------------------------------------------------------------------------

//home position
//all current positions are zeroed onto home position
void Home_Position(void){
  waist=0;
  leftShoulder=0;
  rightShoulder=0;
  leftArm=0;
  rightArm=0;

  Servos_Move();
}

//command robot to do stuff
void Servos_Move(void) {
  Waist.write(home_waist + waist);
  Lshoulder.write(home_leftShoulder + leftShoulder);
  Larm.write(home_leftArm + leftArm);
  Rshoulder.write(home_rightShoulder + rightShoulder);
  Rarm.write(home_rightArm + rightArm);
}

//this function calculates move factors
void calculate_per(int Speed, int move_count)
{
//mesh current move position with future move position
per_a = ((float)(Speed-j)) / ((float)Speed);
per_b = (float)1.0-per_a;

//make sure future move position isn't outside array
if(i!=move_count-1)
next=i+1;
else //if it is, then restart back at zero
next=0;
}

 

void Rarm_wave(int Speed){
  for (i=0;i<wave_count;i++){
    //to test a particular position, uncomment i and j below
    //and set it to a particular value
    //i=3;

    //send each command several times
    for (j=0;j<Speed;j++){
      //j=0;//for testing particular kinematics points 

      //calculate factors
      calculate_per(Speed, wave_count);

      //calculate curent positions
      waist=wave_waist[i]*per_a + wave_waist[next]*per_b;
      leftShoulder=wave_leftShoulder[i]*per_a + wave_leftShoulder[next]*per_b;
      leftArm=wave_leftArm[i]*per_a + wave_leftArm[next]*per_b;
      rightShoulder=wave_rightShoulder[i]*per_a + wave_rightShoulder[next]*per_b;
      rightArm=wave_rightArm[i]*per_a + wave_rightArm[next]*per_b;

      //move one step
      Servos_Move();
    }
  }
}

 

Thanks Ro-Bot-X! I certainly don't want these servos to break, so I'll await your example on interpolating servos. I've been trying to find a way to control the speed of servos using python (the robots programming language that ties in all the functionality together). I've also beening thinking about some arithemetic I could use to control the speed but then I run into implementing it in the program. I'll observe your example and see how I might do it in python. Thanks so much for your offer.

Awesome looking robot - sort-of Johnny-five-esque! Nice sturdy looking construction so far too. Nice change from the hot-glue bots of late (though I really have nothing against hot glue either - the fact people here are playing with building robots is what really counts!). Looking forward to seeing your videos when you get them posted!