Go Down

Topic: Antireset arduino (Read 7283 times) previous topic - next topic

leo72

Vedo che inizi a spedire dati sulla seriale da subito, ci sta che l'Arduino si blocchi come ti ho descritto.
Come sono i led integrati dell'Arduino, quando riavvii il computer a cui è collegato e sembra che l'Arduino non faccia più girare lo sketch?

francescoprisco

Nel funzionamento normale uno rimane fisso un altro lampeggia.Quando riavvio tutto rimane acceso solo quello che è fisso mentre l'altro che lampeggia non da segni di vita

leo72


Nel funzionamento normale uno rimane fisso un altro lampeggia.Quando riavvio tutto rimane acceso solo quello che è fisso mentre l'altro che lampeggia non da segni di vita

Se specifichi anche il nome di questi LED....

PaoloP

Nel Setup(): il delay(1000); cambialo in delay(2000); e dopo attachInterrupt(0, Counter, RISING); e prima della graffa aggiungi
Code: [Select]
Serial.println(F("Counter Start!"));  
loopTime = millis();


Dopo aver modificato il codice e caricato su Arduino, apri il serial monitor.
Dopo circa 2 secondi DEVE apparire la scritta Counter Start! e un secondo dopo il conteggio.

francescoprisco

il codice messo così

Code: [Select]
const byte ButtonPinuno = 11;        //pin pulsante incremento
const byte ButtonPindue = A0;    //pin pulsante decremento
int CurrentStateuno;                  //variabile per lo stato uno corrente
int LastStateuno = 0;                //variabile per l'ultimo stato uno
int CurrentStatedue;                  //variabile per lo stato due corrente
int LastStatedue = 0;            //variabile per l'ultimo stato due
byte contprima = 0;          //Holds number of button presses.
const byte ButtonPintre = 3;        //pin pulsante incremento
const byte ButtonPinquattro = 4; //pin pulsante decremento
int CurrentStatetre;                  //variabile per lo stato uno corrente
int LastStatetre = 0;                //variabile per l'ultimo stato uno
int CurrentStatequattro;              //variabile per lo stato due corrente
int LastStatequattro = 0;            //variabile per l'ultimo stato due
byte contseconda = 0;          //Holds number of button presses
const byte ButtonPincinque = 5;        //pin pulsante incremento
const byte ButtonPinsei = 6; //pin pulsante decremento
int CurrentStatecinque;              //variabile per lo stato uno corrente
int LastStatecinque = 0;              //variabile per l'ultimo stato uno
int CurrentStatesei;                  //variabile per lo stato due corrente
int LastStatesei = 0;                //variabile per l'ultimo stato due
int short contterza = 0;            //Holds number of button presses
unsigned long currentTime = 0;
unsigned long loopTime = 0;
unsigned long lastTimeReed = 0;
unsigned long loopTimeReed = 0;
const byte moton = 7;
const byte motoff= 8;
const byte aumenta= 9;
const byte diminuisci= 10;

const byte sensvel = 2;
const float radius = 13.5;// tire radius (in inches)
const float circumference = TWO_PI*radius*0.0254; // (in metri)
unsigned int ms = 0;
byte reedCounter = 0; // max 255
const byte reedNumber = 1; // numero di magneti per giro

void setup(void)
{
  delay(2000);
  Serial.begin(9600);          //Begins communication with computer
  pinMode(ButtonPinuno,INPUT);    //Sets ButtonPin as input.
  pinMode(ButtonPindue,INPUT);    //Sets ButtonPin as input.
  pinMode(ButtonPintre,INPUT);    //Sets ButtonPin as input.
  pinMode(ButtonPinquattro,INPUT);    //Sets ButtonPin as input.
  pinMode(ButtonPincinque,INPUT);    //Sets ButtonPin as input.
  pinMode(ButtonPinsei,INPUT);    //Sets ButtonPin as input.
  pinMode(moton, OUTPUT);
  pinMode(motoff, OUTPUT);
  pinMode(aumenta, OUTPUT);
  pinMode(diminuisci, OUTPUT);
  pinMode(sensvel, INPUT); // sensore reed velocità
  attachInterrupt(0, Counter, RISING);
  Serial.println(F("Counter Start!")); 
loopTime = millis();
}

void Counter(void){
  reedCounter++;
}

void loop(void)
{
  CheckButton();
  CheckSerial();
  SpeedCalc();

  currentTime = millis();
  if(abs(currentTime - loopTime) >= 1000)
  {
    Serial.print(contprima);
    Serial.print(F(","));
    Serial.print(contseconda);
    Serial.print(F(","));
    Serial.print(contterza);
    Serial.print(F(","));
    Serial.print(ms);
    Serial.print(F(","));
    Serial.println(reedCounter);
    loopTime = currentTime;
  }
}

void SpeedCalc(void){
  loopTimeReed =  abs(lastTimeReed - millis()); // intervallo in millisecondi degli n rilevamenti
  if (reedCounter > 1){ // MAX >254
    int rpm = (60*reedCounter)*(1000/loopTimeReed)/reedNumber; // giri al minuto dell'asse del motore
    reedCounter = 0;
    lastTimeReed = millis();
    ms = ((rpm * circumference)/60); // velocità lineare in metri al secondo
  }
  if (loopTimeReed > 2000){
    Serial.print(F("Motore fermo?"));
  }
}

void CheckButton(void){
  CurrentStateuno = digitalRead(ButtonPinuno);         
  CurrentStatedue = digitalRead(ButtonPindue);       
  CurrentStatetre = digitalRead(ButtonPintre);         
  CurrentStatequattro = digitalRead(ButtonPinquattro);   
  CurrentStatecinque = digitalRead(ButtonPincinque); 
  CurrentStatesei = digitalRead(ButtonPinsei);
  delay(10);  // debounce                                                 

  if(CurrentStateuno != LastStateuno)
  {
    if(CurrentStateuno == HIGH)
    {
      contprima++;
    }
  }
  LastStateuno = CurrentStateuno;

  if(CurrentStatedue != LastStatedue)
  {
    if(CurrentStatedue == HIGH)
    {
      contprima--;
    }
  }
  LastStatedue = CurrentStatedue;

  if(CurrentStatetre != LastStatetre)
  {
    if(CurrentStatetre == HIGH)
    {
      contseconda++;
    }
  }
  LastStatetre = CurrentStatetre;

  if(CurrentStatequattro != LastStatequattro)
  {
    if(CurrentStatequattro == HIGH)
    {
      contseconda--;
    }
  }
  LastStatequattro = CurrentStatequattro;

  if(CurrentStatecinque != LastStatecinque)
  {
    if(CurrentStatecinque == HIGH)
    {
      contterza++;
    }
  }
  LastStatecinque = CurrentStatecinque;

  if(CurrentStatesei != LastStatesei)
  {
    if(CurrentStatesei == HIGH)
    {
      contterza--;
    }
  }
  LastStatesei = CurrentStatesei;
}

void CheckSerial(void){
  if(Serial.available() >0)
  {
    switch (Serial.read()){

    case 'A':
      digitalWrite(moton, HIGH);
      delay(1000);
      digitalWrite(moton, LOW);
      break;

    case 'B':
      digitalWrite(motoff, HIGH);
      delay(1000);
      digitalWrite(motoff, LOW);
      break;

    case 'C':
      digitalWrite(aumenta, HIGH);
      delay(1000);
      digitalWrite(aumenta, LOW);
      break;

    case 'D':
      digitalWrite(diminuisci, HIGH);
      delay(1000);
      digitalWrite(diminuisci, LOW);
      break;

    default:
      break;
    }
  }   
}



mi chiede in continuazione  Motore fermo? e poi alla fine valori a caso °_°

PaoloP

#20
Mar 21, 2013, 07:06 pm Last Edit: Mar 21, 2013, 07:12 pm by PaoloP Reason: 1
Questo lo puoi commentare
Code: [Select]
if (loopTimeReed > 2000){
Serial.print(F("Motore fermo?"));
}

in modo da escluderlo per il momento.

Ma il motore sta girando?

I valori che stampa sono: contaprima, contaseconda, contaterza, velocità e il contatore

EDIT:
Volendo avere una segnalazione del motore fermo senza intasare la seriale potresti inserire questo al posto del precedente.
Code: [Select]
if (loopTimeReed > 2000){
digitalWrite(13, HIGH); // Accende il led integrato in Arduino
} else
{
digitalWrite(13, LOW); // Spegne il led integrato in Arduino
}

Sempre che il pin 13 non sia già occupato da qualcosa.

Ricorda di aggiungere nel setup(); -->  pinMode(13, OUTPUT);

francescoprisco

arduino non è collegato a nessun sensore per ora.Lo tengo qui affianco al pc.In ordine gli output sono conta prima contaseconda condaterza e velocità

PaoloP

Ovvio, se non hai messo le pull-down sui pulsanti, basta che passi il dito sugli ingressi o anche la mano a sfiorarli che Arduino ti segna numeri a caso.

Se non vuoi mettere le pull-down esterne puoi attivare le pull-up interne e invertire la logica HIGH-LOW.

leo72

Potresti rispondere a questa domanda?


Nel funzionamento normale uno rimane fisso un altro lampeggia.Quando riavvio tutto rimane acceso solo quello che è fisso mentre l'altro che lampeggia non da segni di vita

Se specifichi anche il nome di questi LED....

francescoprisco

Ragazzi tutto funziona correttamente.Il led che rimane fisso è il primo quello con il sibolo L.Finchè non apro il terminale il LED con il TX non si accende.Una volta aperto il terminale tutto funziona bene.Le pull-down sono sullo shield che mi sono autocostruito quindi non ci sono problemi.Vi ringrazio

Go Up