Lab_interaccio/2015/Ballena/Ballena_base_v2/Ballena_base_v2.ino

350 lines
8.3 KiB
Arduino
Raw Normal View History

2025-02-25 21:29:42 +01:00
int G[5] = { 33, 31, 29, 27, 25};
boolean fc[40] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
unsigned long time_costilla[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
unsigned long time_final_costilla[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
unsigned long time_aleta[6] = { 0, 0, 0, 0, 0, 0 };
unsigned long time_final_aleta[6] = { 0, 0, 0, 0, 0, 0 };
unsigned long time_giro = 0;
unsigned long time_final_giro = 0;
#define A 39
#define B 37
#define C 35
#define PWM0 2
#define PWM1 6
#define PWM2 5
#define PWM3 4
#define PWM4 3
#define UP 15
#define DOWN 14
#define STOP 0
int latchPin0 = 7;
int clockPin0 = 8;
int dataPin0 = 9;
int latchPin1 = 12;
int clockPin1 = 11;
int dataPin1 = 10;
byte val_shift0[3] = { B10101010, B01010100, B00101010};
void shift0Write(int pin, boolean state)
{
if (pin < 24)
{
int var = pin / 8;
pin = pin - 8 * var;
bitWrite(val_shift0[var], pin, state);
digitalWrite(latchPin0, LOW);
for (int i = 3; i >= 0; i--) shiftOut(dataPin0, clockPin0, MSBFIRST, val_shift0[i]);
digitalWrite(latchPin0, HIGH);
}
}
void resetshift0()
{
digitalWrite(latchPin0, LOW);
for (int i = 3; i >= 0; i--) shiftOut(dataPin0, clockPin0, MSBFIRST, val_shift0[i]);
digitalWrite(latchPin0, HIGH);
analogWrite(PWM0, 0);
}
byte val_shift1[5] = { 0x00, 0x00, 0x00};
void shift1Write(int pin, boolean state)
{
if (pin < 24)
{
int var = pin / 8;
pin = pin - 8 * var;
bitWrite(val_shift1[var], pin, state);
digitalWrite(latchPin1, LOW);
for (int i = 3; i >= 0; i--) shiftOut(dataPin1, clockPin1, MSBFIRST, val_shift1[i]);
digitalWrite(latchPin1, HIGH);
}
}
void resetshift1()
{
digitalWrite(latchPin1, LOW);
for (int i = 3; i >= 0; i--) shiftOut(dataPin1, clockPin1, MSBFIRST, 0x00);
digitalWrite(latchPin1, HIGH);
}
void selgrup(int var)
{
switch (var)
{
case 0:
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
break;
case 1:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
break;
case 2:
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
break;
case 3:
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
break;
case 4:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
break;
case 5:
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
break;
case 6:
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
break;
case 7:
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
break;
}
}
boolean fcread(int pin)
{
int count = 0;
for (int j = 0; j < 5; j++)
{
for (int i = 0; i < 8; i++)
{
selgrup(i);
delay(2);
fc[count] = digitalRead(G[j]);
count++;
}
}
return fc[pin];
}
int flag_dir_c[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int dir[10] = { 2, 4, 6, 9, 11, 13, 15, 18, 20, 22};
int en_c[10] = { 1, 3, 5, 7, 10, 12, 14, 17, 19, 21};
void costilla(int num, int value)
{
if (num < 10)
{
if (value > 0) flag_dir_c[num] = 1;
else if (value < 0) flag_dir_c[num] = -1;
else flag_dir_c[num] = 0;
if (value != 0)
{
shift0Write(en_c[num], false);
analogWrite(PWM0, abs(value));
}
else shift0Write(en_c[num], true);
if (value > 0) shift0Write(dir[num], true);
else shift0Write(dir[num], false);
}
}
int flag_dir_a[6] = { 0, 0, 0, 0, 0, 0 };
int dirA[6] = { 21, 18, 10, 13, 2, 5 };
int dirB[6] = { 20, 19, 11, 12, 3, 4 };
int en_a[6] = { 22, 17, 9, 14, 1, 6 };
int PWM[6] = { PWM3, PWM4, PWM2, PWM1, PWM2, PWM1 };
int fc_aleta_up[6] = {2, 0, 4, 7, 8, 10};
int fc_aleta_down[6]= {3, 1, 5, 6, 9, 11};
void aleta(int num, int value)
{
if (num < 6)
{
if (value > 0) flag_dir_a[num] = 1;
else if (value < 0) flag_dir_a[num] = -1;
else flag_dir_a[num] = 0;
if (value != 0)
{
shift1Write(en_a[num], true);
analogWrite(PWM[num], abs(value));
}
else shift1Write(en_a[num], false);
if ((value > 0)&&(digitalRead(fc_aleta_up[num]))) {
shift1Write(dirA[num], true);
shift1Write(dirB[num], false);
}
else if ((value < 0)&&(digitalRead(fc_aleta_down[num]))) {
shift1Write(dirA[num], false);
shift1Write(dirB[num], true);
}
}
}
int flag_dir_g = 0;
void giro(int mode)
{
if (mode > 0)
{
flag_dir_g = 1;
digitalWrite(UP, HIGH);
digitalWrite(DOWN, LOW);
}
else if (mode < 0)
{
flag_dir_g = -1;
digitalWrite(UP, LOW);
digitalWrite(DOWN, HIGH);
}
else
{
flag_dir_g = 0;
digitalWrite(UP, LOW);
digitalWrite(DOWN, LOW);
}
}
int flag_costilla[10];
int flag_aleta[6];
int flag_giro;
void control()
{
for (int num = 0; num < 5; num++)
{
if ((flag_dir_a[num]==-1)&&(!digitalRead(fc_aleta_down[num]))) aleta(num,0);
else if ((flag_dir_a[num]==1)&&(!digitalRead(fc_aleta_up[num]))) aleta(num,0);
}
// for (int i = 0; i < 6; i++) flag_aleta[i] = 0;
// for (int i = 0; i < 10; i++) flag_costilla[i] = 0;
// flag_giro = 0;
// while (((!flag_aleta[0]) || (!flag_aleta[1]) || (!flag_aleta[2]) || (!flag_aleta[3]) || (!flag_aleta[4]) || (!flag_aleta[5]))
// ||((!flag_costilla[0]) || (!flag_costilla[1]) || (!flag_costilla[2]) || (!flag_costilla[3]) || (!flag_costilla[4]) || (!flag_costilla[5]) || (!flag_costilla[6]) || (!flag_costilla[7]) || (!flag_costilla[8]) || (!flag_costilla[9]))||(!flag_giro))
// {
// for (int num = 0; num < 6; num++)
// {
// if (((millis() - time_aleta[num]) >= time_final_aleta[num]) || (!fcread(fc_aleta_up[num]) && (flag_dir[num] == 1)) || (!fcread(fc_aleta_down[num]) && (flag_dir[num] == -1)))
// {
// flag_aleta[num] = 1;
// if (flag_dir[num] != 0)//&&((flag_dir[2] == 0)))
// aleta(num, 0, 0);
// }
// }
// for (int num = 0; num < 10; num++)
// {
// if ((millis() - time_costilla[num]) >= time_final_costilla[num])
// {
// flag_costilla[num] = 1;
// if (flag_dir_c[num] != 0)
// costilla(num, 0, 0);
// }
// }
// if ((millis() - time_giro) >= time_final_giro)
// {
// flag_giro = 1;
// if (flag_dir_g != 0)
// {
// giro(STOP,0);
// }
// }
// }
}
void reset_costillas()
{
for (int i = 0; i < 10; i++) costilla(i, -255);
delay(10000);
for (int i = 0; i < 10; i++) costilla(i, 0);
}
void setup() {
Serial.begin(9600);
for (int i = 0; i < 5; i++)
{
pinMode(G[i], INPUT);
digitalWrite(G[i], HIGH);
}
pinMode(PWM0, OUTPUT);
pinMode(PWM1, OUTPUT);
pinMode(PWM2, OUTPUT);
pinMode(PWM3, OUTPUT);
pinMode(PWM4, OUTPUT);
pinMode(UP, OUTPUT);
pinMode(DOWN, OUTPUT);
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(UP, LOW);
digitalWrite(DOWN, LOW);
analogWrite(PWM0, 0);
analogWrite(PWM1, 0);
analogWrite(PWM2, 0);
analogWrite(PWM3, 0);
analogWrite(PWM4, 0);
pinMode(latchPin0, OUTPUT);
pinMode(clockPin0, OUTPUT);
pinMode(dataPin0, OUTPUT);
resetshift0();
pinMode(latchPin1, OUTPUT);
pinMode(clockPin1, OUTPUT);
pinMode(dataPin1, OUTPUT);
resetshift1();
reset_costillas();
reset_aletas();
}
void reset_aletas()
{
aleta(0, -255);
aleta(1, -255);
aleta(4, -255);
control();
aleta(3, -255);
control();
aleta(3, 255);
delay(4000);
aleta(3, 0);
giro(255);
delay(120000);
}
byte command = 0x00;
int speed_motor = 0x00;
int address = 0x00;
void serialEvent() {
while (Serial.available()) {
command = Serial.read();
address = command>>4;
speed_motor = command&0x0F;
if (speed_motor>=8) speed_motor = map(speed_motor, 8, 15, 0, 255);//speed_motor - 8;
else speed_motor = map(speed_motor, 0, 7, 0, -255); //speed_motor * (-1);
if (address == 0) giro(speed_motor);
else if (address >= 5) aleta(address - 1, speed_motor);
else costilla(address - 6, speed_motor);
}
}
int M = 3;
int SPEED = 255;
void loop() {
control();
}