Innerbreed Pull-Pull Animatronics (3D Printed)

Awesome! 8)
Great to see it in action. I’m amazed to see how well the pull-pull system work. Also, the 3D parts are just perfect!
I’m wondering, is there much play/backlash in the pull/pull system?

Like Kurt said. Using the GP player is a great tool for sequences, especially long and complex sequences.

Was looking to use a ProMini alone (well on my shield).
It would be autonomus with random moving sequences.

With my so little knowledge in programming… i made some code.

The cables are pulled tight to make sure it gets every part of rotation pulling as it should ’ although i have noticed that even with the cables tight there is backlash. This is due to the tubes that house the cables.
Iv used 0.6mm and 1mm cables… The ID of the tubes in nearly 3mm and so the cables get slack during some rotations.

Using the right ID tubes is critical for precise actions.
Will apply this discipline next time.

Thank you Kurt for your input. Yes that would be a very good option but ill not be using the ssc as Eric has pointed out.
The code will work on very simple and basic routines. Ill build up a command code inputting very simple servo commands, and string it all together from the moment power is applied.
Even if the routines are not called up randomly Im not concerned. Along as i manage a long enough string of commands at least it shouldn’t look repetitive.

Sounds Good,

Let me know if you need any help. Your projects always sound like fun!

Kurt

P.S. - Forgot to ask, which Arduino are you using? Probably mentioned somewhere in the thread… For the Megas I do have what I call my ServoEx library, which has some of the timed move capabilities like the SSC-32. i.e. you can say start a group move, move these servos to their new location and do it in N milliseconds…

Kurt,

This is only “Mega” based library ?
He is using a Pro Mini ATmega328 16mhz 5v

The simple answer is, I don’t know, it may work on 328s as well, I think I did try it out on the BotBoarDuino earlier. It has been awhile since I played with it… May have to dig it up and try it out again.

Kurt

Forgot to mention, that a version of the ServoEx Library is up on the thread: viewtopic.php?t=8038&p=80023#p80023
This was developed I believe for Arduino 1.0. I took a look at the differences to the Servo library between 1.0 and 1.0.1 and they are not much. Made local changes, which I will upload later as part of my refactoring the Hex code thread.

Kurt

ok i have started to get somewhere with the programming… :smiling_imp:

Using the unsigned Servo_Trigger and millis(); function as shown in one of Eric’s earlier posts i have managed to get the Blink servo to randomly move at random times as well as getting the Head_Rotate servo to move at random times along with random values by assigning the selected output pin with “Random_Trigger” set as its triggered value. so now the head looks and pause at random places in the room.

Kinda creepy having this bird keep looking at me as i type. :stuck_out_tongue:

Progress… :wink:

[code]//— Turn 160deg all the time —
void HeadRotate(){

//---------------- Part that trigger the blink sequence ----------------
unsigned long Servo_Trigger_currentMillis = millis();

if (Servo_Trigger_currentMillis - Trigger_lastMillis >= Random_Trigger) {
  Trigger_lastMillis = Servo_Trigger_currentMillis;
  Random_Trigger = random(1000, 2000);
  ServoMove_Count = 0;
}

unsigned long curren_Millis = millis();

//---------------- Part that do the blink once triggered ----------------
if (curren_Millis - last_Millis >= Fast_ServoDelay) { // Delay of Fast_ServoDelay so the millis update those value at that rate
last_Millis = curren_Millis;
ServoMove_Count = (ServoMove_Count + 1);

  switch (ServoMove_Count) {
    case 90:
      Head_Rotate.write(Random_Trigger);
      break;
    case 390:
      Head_Rotate.write(Random_Trigger);
      break;
    case 590:
      Head_Rotate.write(Random_Trigger);
      break;
    
      
  }    
}

}[/code]

I ain’t look at the code itself… but nice to see your making it move… :slight_smile:

Lol…
DiaLFonZo Shield with Arduino Pro Mini 328 test

Hey Jonny,

He looks a little empty headed to me. Is that why they call them birdbrained? :laughing:

Some very encouraging progress really.

I do always feel somewhat credited by your responses.
The new head and eyelid meg will arrive mid next week to fill that space in the head. so more testing then.

The armature is fully operational with the exception of the “eyelid mech” that arrives next week. :smiley:

Eric i solved the trigger problem we talked about.
I made two triggers and called them up as routines rather than adding individual triggers per servo :slight_smile: .

:smiley:
Perfect:

//====================--- I N N E R B R E E D F X ---=========================
//Project; Animatronic Owl for InnerbreedFX
//Description: Control for Jonny Poole - InnerbreedFX Animatronics
//Software version: V1.0
//Date: 01-10-2012
//Program origin: Eric Nantel.
//Programmer/s: Jonny Poole.        
//        
//
// This version of the code runs on the DiaLFonZo-Copter Shield with ProMini for the Arduino Environement
//
//=============================================================================


#include <Servo.h> 


Servo Eye_Blink;
Servo Head_Rotate; 
Servo Head_LeftRight; 
Servo Head_UpDown; 
Servo Neck_UpDown; 
Servo Neck_LeftRight; 
Servo Open_Wings;  
Servo Wings; 

int Eye_Blink_Pos = 90;
int Head_Rotate_Pos = 90;
int Head_UpDown_Pos = 90;
int Head_LeftRight_Pos = 90;
int Neck_LeftRight_Pos = 90;
int Neck_UpDown_Pos = 90;
int Open_Wings_Pos = 90;
int Wings_Pos = 90;


unsigned long lastServoMillis_1 = 0;
unsigned long lastServoMillis_2 = 0;

unsigned long last_Millis = 0;
int Fast_ServoDelay = 1;      //Fast
int Medium_ServoDelay = 10; //Medium
int Slow_ServoDelay = 20; //Slow

unsigned long Trigger_lastMillis = 0;
boolean Servo_Trigger = false;
int Random_Trigger = random(1000, 2000);

int Servo_pos = 1;
int ServoMove_Count = 0;

int Head_Rotate_posDirection = 1;
int Head_LeftRight_posDirection = 1;
int Head_UpDown_posDirection = 1;
int Neck_UpDown_posDirection = 1;
int Neck_LeftRight_posDirection = 1;
int Open_Wings_posDirection = 1;
int Wings_posDirection = 1;


void setup() 
 {Eye_Blink.attach(9);          
  Head_Rotate.attach(3); 
  Head_LeftRight.attach(11);
  Head_UpDown.attach(10);            
  Neck_UpDown.attach(A0);          
  Open_Wings.attach(A1);         
//  FREE.attach(A2);          
  Wings.attach(A3);   
  delay(1000);}


//--- Main Loop ---
void loop()

{EyeBlinkFast();
 HeadMovements();
 WingsOC();}

//---------------- Sequence ----------------
void EyeBlinkFast()
    {TriggerCommand();
      
      switch (ServoMove_Count) 
        {case 100:
          Eye_Blink.write(90);
          break;
        case 200:
          Eye_Blink.write(10);
          break;
        case 300:
          Eye_Blink.write(90);
          break;}}
                    
//---------------- Sequence ----------------
void HeadMovements()
    {TriggerCommand2();
      
      switch (ServoMove_Count) 
        {case 1000:
          Head_Rotate.write(Random_Trigger);
          break;
        case 1500:
          Head_LeftRight.write(Random_Trigger);
          break;
        case 1200:
          Head_UpDown.write(Random_Trigger);
          break;
        case 2000:
          Neck_UpDown.write(Random_Trigger);
          break;}}
           
//---------------- Sequence ----------------
void WingsOC()
    {TriggerCommand2();
      
      switch (ServoMove_Count) 
 
          {Open_Wings.write(160);
          break;
          case 500:
          Open_Wings.write(90);
          break;
          case 1800:
          Open_Wings.write(160);
          break;
          case 1000:
          Wings.write(130);
          break;
          case 1200:
          Wings.write(30);
          break;
          case 1400:
          Wings.write(130);
          break;}}

    

//---------------- Trigger Sequence One ------------
void TriggerCommand()
{unsigned long Servo_Trigger_currentMillis = millis();

    if (Servo_Trigger_currentMillis - Trigger_lastMillis >= Random_Trigger) 
     {Trigger_lastMillis = Servo_Trigger_currentMillis;
      Random_Trigger = random(1000, 2000);
      ServoMove_Count = 0;}
    
    
    unsigned long curren_Millis = millis();
    

    if (curren_Millis - last_Millis >= 1)   
     {last_Millis = curren_Millis;
      ServoMove_Count = (ServoMove_Count + 1);}}


//---------------- Trigger Sequence Two ------------
void TriggerCommand2()
{unsigned long Servo_Trigger_currentMillis = millis();

    if (Servo_Trigger_currentMillis - Trigger_lastMillis >= Random_Trigger) 
     {Trigger_lastMillis = Servo_Trigger_currentMillis;
      Random_Trigger = random(1200, 1800);
      ServoMove_Count = 2;}
    
    
    unsigned long curren_Millis = millis();
    

    if (curren_Millis - last_Millis >= 20)   
     {last_Millis = curren_Millis;
      ServoMove_Count = (ServoMove_Count + 10);}}

What’s perfect… i don’t see a video…!

HaHA. Just waiting for Lipo to charge for its first non-tethered, autonomous test.

Better late than never… :blush:

AWESOME

do you like Arduino now?