Ardu5 para S4A
Ardu5 para S4A
Ardu5 para S4A
com/ ):
/*
Tiene como adicion la conexion del sensor de ultrasonido HC-SR04
para calcular distancia en centimetros entre 2cm y 400cm Pin3 = Trig, A5 = Echo
ARDUINO HC-SR04
5V Vcc
3 Trig
A5 Echo
GND Gnd
*/
// Habilitado para trabajar con el robot Ardu5
//
// Sitio para descargar el programa en S4A que controla Ardu5:
http://dinastiatecnologica.com/producto/ardu5/
//
// NEW IN VERSION 1.6c (by Jorge Gomez):
// Fixed variable type in pin structure: pin.state should be int, not byte
// Optimized speed of execution while receiving data from computer in
readSerialPort()
typedef enum {
input, servomotor, pwm, digital }
pinType;
void setup()
{
Serial.begin(38400);
Serial.flush();
configurePins();
resetPins();
}
void loop()
{
static unsigned long timerCheckUpdate = millis();
if (millis()-timerCheckUpdate>=20)
{
sendUpdateServomotors();
sendSensorValues();
calculardistancia(); //////////////////////////// nueva funcion
timerCheckUpdate=millis();
}
readSerialPort();
}
void calculardistancia(){
//// Calculo de distancia en cm desde 2cm a 400cm hecho por
http://elprofegarcia.com/
void configurePins()
{
arduinoPins[0].type=input;
arduinoPins[1].type=input;
arduinoPins[2].type=input;
///////////////////////////arduinoPins[3].type=input;
arduinoPins[3].type=digital; // triger del sensor de ultrasonido hc-sr04
arduinoPins[4].type=servomotor;
arduinoPins[5].type=pwm;
arduinoPins[6].type=pwm;
arduinoPins[7].type=servomotor;
arduinoPins[8].type=servomotor;
arduinoPins[9].type=pwm; // Placa izquierda de Ardu5
arduinoPins[10].type=digital; // Placa centrode Ardu5
arduinoPins[11].type=digital; // Placa Derecha de Ardu5
arduinoPins[12].type=digital; // Ojo Derecho de Ardu5
arduinoPins[13].type=digital; // Ojo izquierdo de Ardu5
}
void resetPins() {
for (byte index=0; index <=13; index++)
{
if (arduinoPins[index].type!=input)
{
pinMode(index, OUTPUT);
if (arduinoPins[index].type==servomotor)
{
arduinoPins[index].state = 255;
servo (index, 255);
}
else
{
arduinoPins[index].state=0;
digitalWrite(index,LOW);
}
}
}
}
void sendSensorValues()
{
unsigned int sensorValues[6], readings[5];
byte sensorIndex;
{
for (byte p = 0; p < 5; p++)
readings[p] = analogRead(sensorIndex);
insertionSort(readings, 5); //sort readings
sensorValues[sensorIndex] = readings[2]; //select median reading
}
void readSerialPort()
{
byte pin;
int newVal;
static byte actuatorHighByte, actuatorLowByte;
static byte readingSM = 0;
if (Serial.available())
{
if (readingSM == 0)
{
actuatorHighByte = Serial.read();
if (actuatorHighByte >= 128) readingSM = 1;
}
else if (readingSM == 1)
{
actuatorLowByte = Serial.read();
if (actuatorLowByte < 128) readingSM = 2;
else readingSM = 0;
}
if (readingSM == 2)
{
lastDataReceivedTime = millis();
pin = ((actuatorHighByte >> 3) & 0x0F);
newVal = ((actuatorHighByte & 0x07) << 7) | (actuatorLowByte & 0x7F);
if(arduinoPins[pin].state != newVal)
{
arduinoPins[pin].state = newVal;
updateActuator(pin);
}
readingSM = 0;
}
}
else checkScratchDisconnection();
}
void reset() //with xbee module, we need to simulate the setup execution that
occurs when a usb connection is opened or closed without this module
{
resetPins(); // reset pins
sendSensorValues(); // protocol handshaking
lastDataReceivedTime = millis();
}
void sendUpdateServomotors()
{
for (byte p = 0; p < 10; p++)
if (arduinoPins[p].type == servomotor) servo(p, arduinoPins[p].state);
}