grazie NID.
se ho capito bene, fino a 12 volts , posso alimentare la motor shield e prelevare 5 volts per arduino al pin VCC. Da 12 in su, tolgo il ponticello dietro ai morsetti dell'alimentazione, e ho 2 circuito separati. uno per i motori che vanno da 12 a 24 V, e l'altro , per la logica, che puo' essere alimentato dai 5 volts di arduino.
Quindi secondo me, il collegamento dal famigerato pin dietro a ENB, e' un refuso del progetto originale, perche' forse l'avevano alimentato con piu' di 12 V, togliendo pero' anche il ponticello dell'alimentazione e separando di fatto i due circuiti. Pero' non mi quadra ancora.....
Ad ogni modo ecco lo sketch (e' un po' lunghetto ma lo devo ottimizzare). Allo stato attuale, non so perche', gira solo il motore di sinistra....
grazie per la pazienza
#include <Servo.h>
#include <SimpleTimer.h>
const int ENA = 6;
const int IN1 = 7;
const int IN2 = 5;
const int IN3 = 4;
const int IN4 = 10;
const int ENB = 9;
const int trigPin = 13;
const int echoPin = 12;
int Tentativi = 0;
int lSPEED = 160;
int rSPEED = 160;
int SensorAngle [7] = {0, 30, 60, 90, 120, 150, 180};
int SensorDistance [7] = {0, 0, 0, 0, 0, 0, 0};
int Angle ;
int Distance = 0;
int OldDistance;
int DistanzaLetta;
int MoveT;
float rotation1;
float rotation2;
boolean MOTOR = true;
boolean MoveHead = true;
// Integers for pulse counters
volatile int counter1 = 0;
volatile int counter2 = 0;
float diskslots = 20;
bool flag = false;
Servo servoHead;
SimpleTimer firstTimer(1000);
void setup() {
Serial.begin(9600);
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(3, INPUT); // motore sinistro interrupt 0
servoHead.attach(8);
Angle = SensorAngle [3];
ServoScan();
meanDistance();
rSPEED = 180;
lSPEED = 180;
attachInterrupt (1, contastep1, RISING);
}
void loop() {
if (meanDistance() > 30) {
Serial.println("DISTANZA > 30");
MoveForward();
SimpleTimer firstTimer(1000);
OldDistance = DistanzaLetta;
Tentativi = 0;
}
while (meanDistance() > 30) {
if (firstTimer.isReady() ) {
Serial.print("RUOTA MOTORE 1 ha fatto giri:");
Serial.println (counter1); //---------da dividere per 20------------------------------
counter1 = 0;
// Do something ...
// Set the flag so as not to fall into this condition
flag = true;
firstTimer.reset();
SimpleTimer firstTimer(1000);
}
Serial.println("WHILE Meandistance>30");
Serial.println(DistanzaLetta);
Serial.println(OldDistance);
if (OldDistance == DistanzaLetta) {
Tentativi++;
}
else {
Tentativi = 0;
}
if (Tentativi >= 3) {
MoveStop();
while (meanDistance() > 30 && DistanzaLetta == OldDistance) {
Serial.println("ASPETTO");
}
Tentativi = 0;
}
OldDistance = DistanzaLetta;
}
ChooseDirection();
}
void ChooseDirection() {
Serial.println("CHOOSEdirection");
MoveStop();
for (Tentativi = 1; Tentativi <= 3; Tentativi++) {
for (int a = 0; a < 7; a++) { /* rilevo distanze al momento */
Angle = SensorAngle [a];
ServoScan();
SensorDistance [a] = meanDistance();
}
int Dir2Go = 0; /* Scelta maggior spazio libero */
int MaxDistance = SensorDistance[0];
for ( int a = 0 ; a < 7 ; a++) {
if (SensorDistance[a] > MaxDistance) {
Dir2Go = a;
MaxDistance = SensorDistance [a];
}
}
if (MaxDistance <= 30) {
MoveT = 500; // indietro
Serial.println("INDIETRO");
MoveBack();
MoveT = 600;
MoveRight();
MoveStop();
}
else {
if (Dir2Go < 3) { // sinistra
Serial.println("SINISTRA");
MoveT = 500;
MoveBack();
MoveT = (200 * (3 - Dir2Go));
MoveLeft();
MoveStop();
break;
}
else { //destra
Serial.println("DESTRA");
MoveT = 500;
MoveBack();
MoveT = (200 * (Dir2Go - 3));
MoveRight();
MoveStop();
break;
}
}
}
Angle = SensorAngle [3];
ServoScan();
if (Tentativi >= 3) {
// Non si sta muovendo. aspetta di essere rimosso da quella posizione
while (meanDistance() <= 30) {
Serial.println("PANICO");
}
}
else {
Tentativi = 0;
}
}
// ------------------------------------------------------------------------------------------
void ServoScan() {
if (MoveHead == true) {
//Serial.println ("SERVOSCAN");
servoHead.write(Angle);
delay(15);
//delay(1000);
}
}
//-------------------------------------------------------------------------------------------
float pingSensor() // returns the distance (cm)
{
long duration;
float distance;
digitalWrite(trigPin, HIGH); // We send a 10us pulse
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH, 20000); // We wait for the echo to come back, with a
// timeout of 20ms, which corresponds
// approximately to 3m
// pulseIn will only return 0 if it timed out.
// (or if echoPin was already to 1, but it should not happen)
if (duration == 0) // if we timed out
{
pinMode(echoPin, OUTPUT); // Then we set echo pin to output mode
digitalWrite(echoPin, LOW); // We send a LOW pulse to the echo pin
delayMicroseconds(200);
pinMode(echoPin, INPUT); // And finaly we come back to input mode
}
distance = (duration / 2.0) / 29.1;
return distance; //We return the result. Here you can find a 0 if we timed out
}
//-------------------------------------------------------------------------
float meanDistance() {
float mD = 0; // conterranno la media delle letture, e le letture stesse
float DX [15];
for (int a = 0; a < 15; a++) {
DX[a] = pingSensor();
delay(20); // NON TOCCARE!!!!!!!!!!!!!!!!!!!!!
}
for (int a = 0; a < 15; a++) {
mD = mD + DX [a];
}
mD = mD / 15;
DistanzaLetta = mD;
return mD;
}
void MoveBack() {
if (MOTOR) {
Serial.println("INDIETRO");
analogWrite(ENA, lSPEED);
digitalWrite(IN1, HIGH );
digitalWrite(IN2, LOW);
analogWrite(ENB, rSPEED);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay (MoveT);
MoveStop();
}
}
void MoveStop() {
Serial.println("STOP");
analogWrite(ENA, 0);
digitalWrite(IN1, LOW );
digitalWrite(IN2, LOW);
analogWrite(ENB, 0);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void MoveForward() {
Serial.println("FORWARD");
if (MOTOR) {
analogWrite(ENA, lSPEED);
digitalWrite(IN1, LOW );
digitalWrite(IN2, HIGH);
analogWrite(ENB, rSPEED);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
}
void MoveLeft() {
if (MOTOR) {
analogWrite(ENA, lSPEED);
digitalWrite(IN1, HIGH );
digitalWrite(IN2, LOW);
analogWrite(ENB, rSPEED);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay (MoveT);
MoveStop();
}
}
void MoveRight() {
if (MOTOR) {
analogWrite(ENA, lSPEED);
digitalWrite(IN1, LOW );
digitalWrite(IN2, HIGH);
analogWrite(ENB, rSPEED);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay (MoveT);
MoveStop();
}
}
void contastep1() {
counter1++;
}