FireFly 2012: start of a behaviour-based rewrite (unfinished, does not compile)
From 'FireFly 19.rar'.
This commit is contained in:
1 parent
0911543c03
commit
f0b272a1d3
10 files changed
+685
No files matched your search
@@ -0,0 +1,71 @@
|
||||
//Data.h Data Structure
|
||||
|
||||
#ifndef DATA
|
||||
#define DATA
|
||||
|
||||
#include "Arduino.h"
|
||||
#include "Def.h"
|
||||
#include "SerD.h"
|
||||
|
||||
// LAYOUT
|
||||
// _U_
|
||||
// 0==/ \==3
|
||||
// >***<
|
||||
// 1===|---|===4
|
||||
// >***<
|
||||
// 2==\___/==5
|
||||
|
||||
struct Data
|
||||
{
|
||||
//MAIN
|
||||
// Pointers to classes
|
||||
//hexapod FireFly;
|
||||
|
||||
//Watchdog
|
||||
boolean Send;
|
||||
double LastSendTime;
|
||||
int WalkTime;
|
||||
int HeadTime; //100
|
||||
|
||||
//Converter
|
||||
SerD ServoData[6];
|
||||
float HeadAngle;
|
||||
int ReadyToSend;
|
||||
|
||||
//IK
|
||||
int HeadPosition;
|
||||
boolean ReadyToConvert;
|
||||
float l3;
|
||||
float s;
|
||||
|
||||
//Init
|
||||
Data()
|
||||
{
|
||||
LastSendTime = 0;
|
||||
HeadAngle = 0;
|
||||
HeadTime = 100;
|
||||
|
||||
ServoData[0](5, 3, 8);
|
||||
ServoData[1](8, 3, 0);
|
||||
ServoData[2](5, 3, -8);
|
||||
ServoData[3](5, 3, 8);
|
||||
ServoData[4](8, 3, 0);
|
||||
ServoData[5](5, 3, -8);
|
||||
}
|
||||
|
||||
Data& operator() (DataObject *R)
|
||||
{
|
||||
ServoData[0] = R.s0;
|
||||
ServoData[1] = R.s1;
|
||||
ServoData[2] = R.s2;
|
||||
ServoData[3] = R.s3;
|
||||
ServoData[4] = R.s4;
|
||||
ServoData[5] = R.s5;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
// Def.h
|
||||
// Define some Hard Coded Variables
|
||||
// V3.0
|
||||
|
||||
//DEBUG CODES
|
||||
//#define DEBUGC // Converter
|
||||
//#define DEBUGIK // InverseKinemetics
|
||||
//#define DEBUGS // Servos
|
||||
//#define DEBUGHS // ServosHead
|
||||
//#define DEBUGW // Watchdog
|
||||
//#define Freeze // Protect all the servos
|
||||
|
||||
//InverseKinemetics VARIABLES
|
||||
#define l2 15
|
||||
#define l1 10
|
||||
|
||||
//Converter VARIABLES
|
||||
#define smin0 600
|
||||
#define smin1 960
|
||||
#define smin2 600
|
||||
#define smin3 600
|
||||
#define smax0 2400
|
||||
#define smax1 2100
|
||||
#define smax2 2400
|
||||
#define smax3 2400
|
||||
@@ -0,0 +1,196 @@
|
||||
// Hexapod FireFly
|
||||
// V3.0
|
||||
|
||||
#include "hexapod.h"
|
||||
#include "Data.h"
|
||||
#include "hexapod.h"
|
||||
//#include "Converter.h"
|
||||
//#include "InverseKinemetics.h"
|
||||
//#include "Servos.h"
|
||||
#include "Watchdog.h"
|
||||
#include "Ultrasone.h"
|
||||
|
||||
//Data *DataLine = new Data;
|
||||
/*Converter Con;
|
||||
InverseKinemetics IK;
|
||||
Servos SSC32;*/
|
||||
Watchdog WD;
|
||||
Ultrasone US;
|
||||
hexapod FireFly;
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(38400);
|
||||
Serial1.begin(38400);
|
||||
pinMode(13, OUTPUT);
|
||||
//DataLine->WalkTime = 100;
|
||||
FireFly.FireFly();
|
||||
}
|
||||
|
||||
int a=0;
|
||||
int b=6;
|
||||
int tt;
|
||||
byte Sit;
|
||||
byte SitC;
|
||||
|
||||
// Main loop.
|
||||
void loop()
|
||||
{
|
||||
int d = FireFly.GetNewCmd();
|
||||
|
||||
US.GetRadar(DataLine);
|
||||
|
||||
/*if(Sit == 1)
|
||||
if (SitC <= millis())
|
||||
{
|
||||
Sit = 0;
|
||||
DataLine->WalkTime = tt;
|
||||
} */
|
||||
|
||||
if (d != 0)
|
||||
{
|
||||
switch(d)
|
||||
{
|
||||
case power:
|
||||
DataLine->ServoData[0](5, 3, 8);
|
||||
DataLine->ServoData[1](8, 3, 0);
|
||||
DataLine->ServoData[2](5, 3, -8);
|
||||
DataLine->ServoData[3](5, 3, 8);
|
||||
DataLine->ServoData[4](8, 3, 0);
|
||||
DataLine->ServoData[5](5, 3, -8);
|
||||
break;
|
||||
case up:
|
||||
Serial.println("UP");
|
||||
for (int i=a; i<=b; i++)
|
||||
DataLine->ServoData[i].y -= 1;
|
||||
break;
|
||||
case down:
|
||||
Serial.println("DOWN");
|
||||
for (int i=a; i<=b; i++)
|
||||
DataLine->ServoData[i].y += 1;
|
||||
break;
|
||||
case left:
|
||||
Serial.println("LEFT");
|
||||
for (int i=a; i<=b; i++)
|
||||
{
|
||||
if (i<3)
|
||||
DataLine->ServoData[i].x += 1;
|
||||
else
|
||||
DataLine->ServoData[i].x -= 1;
|
||||
}
|
||||
break;
|
||||
case right:
|
||||
Serial.println("RIGHT");
|
||||
for (int i=a; i<=b; i++)
|
||||
{
|
||||
if (i<3)
|
||||
DataLine->ServoData[i].x -= 1;
|
||||
else
|
||||
DataLine->ServoData[i].x += 1;
|
||||
}
|
||||
break;
|
||||
case forward:
|
||||
Serial.println("forward");
|
||||
for (int i=a; i<=b; i++)
|
||||
DataLine->ServoData[i].z -= 1;
|
||||
break;
|
||||
case back:
|
||||
Serial.println("back");
|
||||
for (int i=a; i<=b; i++)
|
||||
DataLine->ServoData[i].z += 1;
|
||||
break;
|
||||
case ok:
|
||||
Serial.println("OK");
|
||||
|
||||
tt = DataLine->WalkTime;
|
||||
DataLine->WalkTime = 3000;
|
||||
|
||||
DataLine->ServoData[0](5, 3, 8);
|
||||
DataLine->ServoData[1](8, 3, 0);
|
||||
DataLine->ServoData[2](5, 3, -8);
|
||||
DataLine->ServoData[3](5, 3, 8);
|
||||
DataLine->ServoData[4](8, 3, 0);
|
||||
DataLine->ServoData[5](5, 3, -8);
|
||||
|
||||
/*IK.IK(DataLine);
|
||||
Con.Convert(DataLine);
|
||||
DataLine->Send = 1;
|
||||
SSC32.Send(DataLine);*/
|
||||
|
||||
Sit = 1;
|
||||
break;
|
||||
case IR_0:
|
||||
Serial.println("0");
|
||||
a = 0;
|
||||
b = 5;
|
||||
break;
|
||||
case IR_1:
|
||||
Serial.println("1");
|
||||
a = 0;
|
||||
b = 0;
|
||||
break;
|
||||
/*case IR_2:
|
||||
Serial.println("OK");
|
||||
a = ;
|
||||
b = ;
|
||||
break;*/
|
||||
case IR_3:
|
||||
Serial.println("3");
|
||||
a = 3;
|
||||
b = 3;
|
||||
break;
|
||||
case IR_4:
|
||||
Serial.println("4");
|
||||
a = 1;
|
||||
b = 1;
|
||||
break;
|
||||
/*case IR_5:
|
||||
Serial.println("OK");
|
||||
a = ;
|
||||
b = ;
|
||||
break;*/
|
||||
case IR_6:
|
||||
Serial.println("6");
|
||||
a = 4;
|
||||
b = 4;
|
||||
break;
|
||||
case IR_7:
|
||||
Serial.println("7");
|
||||
a = 2;
|
||||
b = 2;
|
||||
break;
|
||||
/*case IR_8:
|
||||
Serial.println("OK");
|
||||
a = ;
|
||||
b = ;
|
||||
break;*/
|
||||
case IR_9:
|
||||
Serial.println("9");
|
||||
a = 5;
|
||||
b = 5;
|
||||
break;
|
||||
default:
|
||||
Serial.println(d);
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*IK.IK(DataLine);
|
||||
Con.Convert(DataLine);*/
|
||||
WD.CheckTime(DataLine);
|
||||
|
||||
if (Sit){
|
||||
if ((DataLine->Send) & (SitC))
|
||||
{
|
||||
DataLine->WalkTime = tt;
|
||||
SitC = 0;
|
||||
Sit = 0;
|
||||
}
|
||||
else if (DataLine->Send)
|
||||
SitC = 1;
|
||||
}
|
||||
|
||||
//SSC32.Send(DataLine);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
//Gedrags classen,
|
||||
|
||||
#ifndef GCC
|
||||
#define GCC
|
||||
|
||||
#include "SerD.h"
|
||||
|
||||
// LAYOUT
|
||||
// _U_
|
||||
// 0==/ \==3
|
||||
// >***<
|
||||
// 1===|---|===4
|
||||
// >***<
|
||||
// 2==\___/==5
|
||||
|
||||
class DataObject
|
||||
{
|
||||
public:
|
||||
|
||||
SerD S0;
|
||||
SerD S1;
|
||||
SerD S2;
|
||||
SerD S3;
|
||||
SerD S4;
|
||||
SerD S5;
|
||||
|
||||
DataObject& operator() (SerD s0, SerD s1, SerD s2, SerD s3, SerD s4, SerD s5)
|
||||
{
|
||||
S0 = s0;
|
||||
S1 = s1;
|
||||
S2 = s2;
|
||||
S3 = s3;
|
||||
S4 = s4;
|
||||
S5 = s5;
|
||||
}
|
||||
|
||||
DataObject& operator() ( int a1, int a2, int a3,
|
||||
int b1, int b2, int b3,
|
||||
int c1, int c2, int c3,
|
||||
int d1, int d2, int d3,
|
||||
int e1, int e2, int e3,
|
||||
int f1, int f2, int f3)
|
||||
{
|
||||
S0(a1, a2, a3);
|
||||
S1(b1, b2, b3);
|
||||
S2(c1, c2, c3);
|
||||
S3(d1, d2, d3);
|
||||
S4(e1, e2, e3);
|
||||
S5(f1, f2, f3);
|
||||
}
|
||||
};
|
||||
|
||||
class WalkForward //Direction
|
||||
{
|
||||
|
||||
private:
|
||||
|
||||
DataObject LoopPatroon[8];
|
||||
DataObject HuidigePositie;
|
||||
|
||||
//Startup VARIABLES
|
||||
void init()
|
||||
{
|
||||
/*LoopPatroon.S0[0][0](, , );
|
||||
LoopPatroon.S1[0][1](, , );
|
||||
LoopPatroon.S3[0][2](, , );
|
||||
LoopPatroon.S4[0][3](, , );
|
||||
LoopPatroon.S5[0][4](, , );
|
||||
LoopPatroon.S6[0][5](, , );*/
|
||||
|
||||
LoopPatroon[0](0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public:
|
||||
|
||||
void Run()
|
||||
{
|
||||
//Start runnning code until exit or expection raises.
|
||||
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
// SerD.h
|
||||
|
||||
#ifndef SERD
|
||||
#define SERD
|
||||
|
||||
class SerD
|
||||
{
|
||||
public:
|
||||
|
||||
//Coordinate system
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
|
||||
//Angles
|
||||
int o1;
|
||||
int o2;
|
||||
int o3;
|
||||
|
||||
//Timings
|
||||
int t1;
|
||||
int t2;
|
||||
int t3;
|
||||
|
||||
//Input
|
||||
SerD& operator() (int X, int Y, int Z)
|
||||
{
|
||||
x = X;
|
||||
y = Y;
|
||||
z = Z;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
SerD& operator= (SerD& R)
|
||||
{
|
||||
x = R.x;
|
||||
y = R.y;
|
||||
z = R.z;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class DataObject
|
||||
{
|
||||
public:
|
||||
|
||||
SerD S0;
|
||||
SerD S1;
|
||||
SerD S2;
|
||||
SerD S3;
|
||||
SerD S4;
|
||||
SerD S5;
|
||||
|
||||
DataObject& operator() (SerD s0, SerD s1, SerD s2, SerD s3, SerD s4, SerD s5)
|
||||
{
|
||||
S0 = s0;
|
||||
S1 = s1;
|
||||
S2 = s2;
|
||||
S3 = s3;
|
||||
S4 = s4;
|
||||
S5 = s5;
|
||||
}
|
||||
|
||||
DataObject& operator() ( int a1, int a2, int a3,
|
||||
int b1, int b2, int b3,
|
||||
int c1, int c2, int c3,
|
||||
int d1, int d2, int d3,
|
||||
int e1, int e2, int e3,
|
||||
int f1, int f2, int f3)
|
||||
{
|
||||
S0(a1, a2, a3);
|
||||
S1(b1, b2, b3);
|
||||
S2(c1, c2, c3);
|
||||
S3(d1, d2, d3);
|
||||
S4(e1, e2, e3);
|
||||
S5(f1, f2, f3);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
//Ultrasone.cpp
|
||||
// V3.0
|
||||
|
||||
#include "Ultrasone.h"
|
||||
|
||||
void Ultrasone::GetRadar(Data *DataLine)
|
||||
{
|
||||
DataLine->HeadTime = 0;
|
||||
|
||||
#ifdef DEBUGUS
|
||||
Serial.print("### Ultrasone Direction/Position: ");
|
||||
Serial.print(CurrentDirection);
|
||||
Serial.print(", ");
|
||||
Serial.println(CurrentPosition);
|
||||
#endif
|
||||
|
||||
if (CurrentDirection == 0) // Left
|
||||
{
|
||||
if (CurrentPosition > MaxLeft)
|
||||
{
|
||||
CurrentPosition--;
|
||||
DataLine->HeadAngle = CurrentPosition;
|
||||
|
||||
Con.ConvertHead(DataLine);
|
||||
SSC32.MoveHead(DataLine);
|
||||
|
||||
Serial.print("### Ultrasone Distance: ");
|
||||
Serial.println(DataLine->FireFly.GetUltraSoneDistance());
|
||||
}
|
||||
else
|
||||
CurrentDirection = 1;
|
||||
}
|
||||
else if(CurrentDirection == 1) // Right
|
||||
{
|
||||
if (CurrentPosition < MaxRight)
|
||||
{
|
||||
CurrentPosition++;
|
||||
DataLine->HeadAngle = CurrentPosition;
|
||||
|
||||
Con.ConvertHead(DataLine);
|
||||
SSC32.MoveHead(DataLine);
|
||||
|
||||
Serial.print("### Ultrasone Distance: ");
|
||||
Serial.println(DataLine->FireFly.GetUltraSoneDistance());
|
||||
}
|
||||
else
|
||||
CurrentDirection = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
[Vector]
|
||||
X = Distance / Cos( CurrentPosition * pi2rad );
|
||||
Y = Distance / sin( CurrentPosition / pi2rad );
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
//Ultrasone.h
|
||||
// V3.0
|
||||
|
||||
#ifndef ULTRASONE_H
|
||||
#define ULTRASONE_H
|
||||
|
||||
#include "Arduino.h"
|
||||
#include "Data.h"
|
||||
#include "Servos.h"
|
||||
#include "Converter.h"
|
||||
|
||||
#define MaxLeft -45
|
||||
#define MaxRight 45
|
||||
|
||||
class Ultrasone
|
||||
{
|
||||
private:
|
||||
Servos SSC32;
|
||||
Converter Con;
|
||||
|
||||
public:
|
||||
void GetRadar(Data *DataLine);
|
||||
|
||||
int CurrentPosition;
|
||||
byte CurrentDirection;
|
||||
|
||||
Ultrasone()
|
||||
{
|
||||
CurrentPosition = 0;
|
||||
CurrentDirection = 0; // Left
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
// Watchdog.cpp
|
||||
|
||||
#include "Watchdog.h"
|
||||
|
||||
void Watchdog::CheckTime(Data *DataLine)
|
||||
{
|
||||
if ((millis() >= (DataLine->LastSendTime + DataLine->WalkTime)) & (DataLine->ReadyToSend = true ))
|
||||
{
|
||||
DataLine->Send = 1;
|
||||
|
||||
DataLine->LastSendTime = millis();
|
||||
#ifdef DEBUGW
|
||||
Serial.println("### WatchDog->Watchdog ###");
|
||||
Serial.print("### ");
|
||||
Serial.print( millis());
|
||||
Serial.println(" WatchDog->DataLine.Send = True");
|
||||
Serial.print("### WatchDog->Watchdog Walktime: ");
|
||||
Serial.println(DataLine->WalkTime);
|
||||
#endif
|
||||
}
|
||||
else if ((DataLine->LastSendTime == 0 ) & (DataLine->ReadyToSend = true))
|
||||
{
|
||||
DataLine->Send = 1;
|
||||
|
||||
DataLine->LastSendTime = millis();
|
||||
#ifdef DEBUGW
|
||||
Serial.println("### WatchDog->Watchdog Startup ###");
|
||||
Serial.print("### ");
|
||||
Serial.print( millis());
|
||||
Serial.println(" WatchDog->DataLine.Send = True");
|
||||
Serial.print("### WatchDog->Watchdog Walktime: ");
|
||||
Serial.println(DataLine->WalkTime);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
// Watchdog.h
|
||||
// V3.0
|
||||
|
||||
#ifndef WATCHDOG_H
|
||||
#define WATCHDOG_H
|
||||
|
||||
#include "Arduino.h"
|
||||
#include "Data.h"
|
||||
|
||||
class Watchdog
|
||||
{
|
||||
public:
|
||||
void CheckTime(Data *DataLine);
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
class gedrag{
|
||||
|
||||
private:
|
||||
|
||||
data_line PositieInformatie;
|
||||
body_struct main_positie;
|
||||
int HuidigePositieinProgramma;
|
||||
int matrix[..] MatrixmetdeGedragPatroonen;
|
||||
|
||||
public:
|
||||
|
||||
run()
|
||||
{
|
||||
/*
|
||||
run normaal gedrag patroon.
|
||||
|
||||
[loop patroon dat niet word beinvloed door userinput]
|
||||
vraag aankomende gedrag op uit matrix,
|
||||
-bereken de nieuwe posities
|
||||
--sla deze op in cache
|
||||
---wacht tot de watchdog een timeout geeft
|
||||
----geef de cache door aan de servo controller.
|
||||
|
||||
[loop patroon dat WORD beinvloed door userinput]
|
||||
vraag aankomende gedrag op uit matrix met userinput,
|
||||
-bereken de nieuwe posities
|
||||
--sla deze op in cache
|
||||
---loop tot de watchdog een timeout geeft
|
||||
----geef de cache door aan de servo controller.
|
||||
*/
|
||||
};
|
||||
|
||||
quite()
|
||||
{
|
||||
while()
|
||||
{
|
||||
/*
|
||||
maak routine af om terug te gaan naar de main positie.
|
||||
daarna return 0;
|
||||
|
||||
verplaats de body in een neutrale positie
|
||||
+als niet mogeleijk verplaats de poten die problemen geven
|
||||
-mogelijk ga verder met de poten een voor een in de goode positie te zetten
|
||||
*/
|
||||
}
|
||||
};
|
||||
|
||||
exit()
|
||||
{
|
||||
/*
|
||||
NOOD, stop nu en return positie;
|
||||
*/
|
||||
};
|
||||
|
||||
userinput()
|
||||
{
|
||||
/*
|
||||
Mogelijkheid tot user input.
|
||||
*/
|
||||
};
|
||||
|
||||
};
|
||||
Reference in new issue
Block a user