Pages: 1 2 [3] 4 5   Go Down
Author Topic: [Risolto] Blink con millis() lettura PPM con pulseIn() Ritardi e Problemi  (Read 3696 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 2
Posts: 86
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ringrazio tutti voi per le cortesi spiegazioni, è stato tutto chiarissimo e spero per me compreso bene smiley-lol

il risutato è questo codice:    [Codice Aggiornato]
Code:
int luciPosIn = 0;
int fariLungIn = 1;
int frecceIn = 2;
int stopIn = 3;
int retroIn = 4;
int lampIn = 5;

int luciPosOut = 6;
int faroLung1 = 7;
int faroLung2 = 8;
int frecceOut = 9;
int stopOut = 10;
int retroOut = 11;

int stopInS;
int retroInS;

int val1;
int val2;
int val3;
int val4; //Possibile non necessario!!
int val5;

unsigned long previousMillis = 0;
unsigned long interval = 100;

extern unsigned long timer0_millis;

void setup() {
  pinMode(luciPosIn, INPUT); //Input PPM ricevente radio (luciPosIn)
  pinMode(fariLungIn, INPUT); //Input PPM ricevente radio (fariLungIn) Possibile anche lampeggio!!!
  pinMode(frecceIn, INPUT); //Input PPM ricevente radio (frecceIn)
  pinMode(stopIn, INPUT); //Input mosfet regolatore (stopIn)
  pinMode(retroIn, INPUT); //Input mosfet regolatore (retroIn)
  pinMode(lampIn, INPUT); //Input PPM ricevente radio (lampIn) Possibile non necessario!!!
 
  pinMode(luciPosOut, OUTPUT); //Accensione luci posizione
  pinMode(faroLung1, OUTPUT); //Accensione luce profondità !! o lampeggio strobo
  pinMode(faroLung2, OUTPUT); //Accensione luce profondità !! o lampeggio strobo
  pinMode(frecceOut, OUTPUT); //Accensione 4 frecce
  pinMode(stopOut, OUTPUT); //Accensione Stop e posizione posteriore 1/2 potenza
  pinMode(retroOut, OUTPUT); //Accensione retro
 
  digitalWrite(luciPosOut,LOW);
  digitalWrite(faroLung1,LOW);
  digitalWrite(faroLung2,LOW);
  digitalWrite(frecceOut,LOW);
  digitalWrite(stopOut,LOW);
  digitalWrite(retroOut,LOW);
 
}

void loop() {
 
  val1 = pulseIn(luciPosIn, HIGH);
  val2 = pulseIn(fariLungIn, HIGH);
  val3 = pulseIn(frecceIn, HIGH);
  val4 = pulseIn(lampIn, HIGH); //Possibile non necessario!!
  val5 = LOW;
 
  stopInS = digitalRead(stopIn);
  retroInS = digitalRead(retroIn);
 
 
  if (val1 > 1600) digitalWrite(luciPosOut, HIGH);
  if (val1 < 1600) digitalWrite(luciPosOut, LOW);
  if (val1 > 1600 && stopInS == LOW) analogWrite(stopOut, 10);
  if (val1 < 1600 || stopInS == HIGH) analogWrite(stopOut, 0);
  if (val2 > 1600) digitalWrite(faroLung1, HIGH);
  if (val2 < 1600) digitalWrite(faroLung1, LOW);
  if (val2 > 1600) digitalWrite(faroLung2, HIGH);
  if (val2 < 1600) digitalWrite(faroLung2, LOW);
  if (val3 > 1600) {
   
    if (millis() - previousMillis > interval) {
     
      previousMillis = millis();
     
      if (val5 == LOW) val5 == HIGH;
      else val5 == LOW;
     
      digitalWrite(frecceOut, val5);
    }
  }
     
  if (val4 > 1600 && val2 < 1600) {
 
    if (millis()>50 && millis()<100) digitalWrite(faroLung1,HIGH);
    if (millis()>100  && millis()<150) digitalWrite(faroLung1,LOW);
 
    if (millis()>150 && millis()<200) digitalWrite(faroLung1,HIGH);
    if (millis()>200  && millis()<250) digitalWrite(faroLung1,LOW);
 
    if (millis()>650 && millis()<700) digitalWrite(faroLung2,HIGH);
    if (millis()>700  && millis()<750) digitalWrite(faroLung2,LOW);
 
    if (millis()>750 && millis()<800) digitalWrite(faroLung2,HIGH);
    if (millis()>800  && millis()<1200) digitalWrite(faroLung2,LOW);

    if (millis()>1200) {
      cli();
      timer0_millis = 0;
      sei(); 
    } 
  }
 
  if (stopInS == HIGH) digitalWrite(stopOut, HIGH);
  if (stopInS == LOW) digitalWrite(stopOut, LOW);
  if (retroInS == HIGH) digitalWrite(retroOut, HIGH);
  if (retroInS == LOW) digitalWrite(retroOut, LOW);
 
}

di cui non capisco per quale motivo non va:

unsigned long previousMillis = 0;
unsigned long interval = 100;

if (millis() - previousMillis > interval) {
      
      previousMillis = millis();
      
      if (val5 == LOW) val5 == HIGH;
      else val5 == LOW;
      
      digitalWrite(frecceOut, val5);
    }


e altra cosa stranissima, prima di collegare tutti i led con i relativi transistor NPN
questo spezzone di codice andava da dio e poi da quando ho collegato tutto va solo 1 led a intervalli di 200 ms:
Code:
if (val4 > 1600 && val2 < 1600) {
  
    if (millis()>50 && millis()<100) digitalWrite(faroLung1,HIGH);
    if (millis()>100  && millis()<150) digitalWrite(faroLung1,LOW);
  
    if (millis()>150 && millis()<200) digitalWrite(faroLung1,HIGH);
    if (millis()>200  && millis()<250) digitalWrite(faroLung1,LOW);
  
    if (millis()>650 && millis()<700) digitalWrite(faroLung2,HIGH);
    if (millis()>700  && millis()<750) digitalWrite(faroLung2,LOW);
  
    if (millis()>750 && millis()<800) digitalWrite(faroLung2,HIGH);
    if (millis()>800  && millis()<1200) digitalWrite(faroLung2,LOW);

    if (millis()>1200) {
      cli();
      timer0_millis = 0;
      sei();  
    }  

in più ho un po di lag nella lettura del segnale PPM qualche idea?
« Last Edit: September 16, 2012, 05:29:05 am by DriftBoy » Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

L'errore che salta subito all'occhio è il non uso del tipo "unsigned long".


Logged


Offline Offline
Jr. Member
**
Karma: 2
Posts: 86
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cerco di spiegare un attimo la situazione.

if (val4 > 1600 && val2 < 1600) {
 
    if (millis()>50 && millis()<100) digitalWrite(faroLung1,HIGH);
    if (millis()>100  && millis()<150) digitalWrite(faroLung1,LOW);
 
    if (millis()>150 && millis()<200) digitalWrite(faroLung1,HIGH);
    if (millis()>200  && millis()<250) digitalWrite(faroLung1,LOW);
 
    if (millis()>650 && millis()<700) digitalWrite(faroLung2,HIGH);
    if (millis()>700  && millis()<750) digitalWrite(faroLung2,LOW);
 
    if (millis()>750 && millis()<800) digitalWrite(faroLung2,HIGH);
    if (millis()>800  && millis()<1200) digitalWrite(faroLung2,LOW);

    if (millis()>1200) {
      cli();
      timer0_millis = 0;
      sei(); 
    } 
  }

questa parte di codice prima di collegare tutte le componenti elettroniche andava benissimo, ora lampeggia 1 singolo led ed a intervalli costanti come se avessi messo un delay(200) in più non fa riferimento allo stato di pulseIn, e cioè non parte proprio inserendo il segnale.

Poi:
Mandando il PPM a luciPosIn si abilita l'uscita luciPosOut ed è giusto ma 1° punto si abilita con un gran ritardo e in secondo luogo comincia a lampeggiare leggermente retroOut

L'if delle frecce non da alcun cenno di vita

e perfino i digitalRead() anche se funzionano abilitano le uscite con un enorme ritardo

la situazione hardware è questa

int luciPosOut = 6; resistenza 1k + transistor BD 137 NPN + 2 led Alta Luminosità con resistenze 100 +2(bassa con res 220) collegate a massa al transistor  (invo segnale PWM all'uscita stopOut)
int faroLung1 = 7; led alta luminosità + resistenza 100
int faroLung2 = 8; led alta luminosità + resistenza 100
int frecceOut = 9; resistenza 1k + transistor BD 137 NPN + 4 led bassa luminosità 3mm con resistenze da 220 collegate a massa al transistor
int stopOut = 10; resistenza 1k + transistor BD 137 NPN + 2 led alta luminosità resistenze 100
int retroOut = 11; resistenza 1k + transistor BD 137 NPN + 2led alta res 100

il tutto alimentato da arduino tramite alimentazione USB

appunto importante avevo testato il blink senza collegamenti e andava bene, dopo collegato non va più e anche se scollego il tutto la situazione non cambia
Logged

0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se scolleghando tutto non funziona si e' probabilmente guastato qualcosa.
io testerei le singole uscite con blink, tutte, incluse le 6 analogiche, puo' essere che c'e' qualche uscita in corto.

inoltre hai fatto un calcolo sui mA necessari ? dici di alimentare tutto da usb quindi ne hai circa 250mA da utilizzare
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Offline Offline
Jr. Member
**
Karma: 2
Posts: 86
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Posto quì di seguito lo schema disegnato col programma che forse odiate parecchio, ma per me è il modo più veloce



per la questione porte, non saprei perchè collegando e caricando solo la parte del blink su 2 led va tutto bene

l'unico appunto è che quando ho fatto i test per far passare il segnale ppm attraverso arduino per poi tradurlo per il serve anche il servo mi faceva un'oscillazione ogni tot tempo costante e quindi mi viene il dubbio: non è che per caso ho la 5v del pc un po poco costante e quindi crea problemi ad arduino?
« Last Edit: September 16, 2012, 06:51:44 am by DriftBoy » Logged

0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

quale servo ? sempre alimentato solo da usb ? secondo me stai solo andando oltre l'assorbimento consentito ?
e cmq testare tutte le uscite ti costa 2 mnuti di lavoro, perche' non farlo ?
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Offline Offline
Jr. Member
**
Karma: 2
Posts: 86
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho fatto il test con solo il codice blink su tutte 14 le porte digitali e funziona, un unico appunto, per quale motivo la porta 0 e la porta 1 (tx & rx) nella situazione in cui da codice non le utilizzo collegandoci i led me li accende?

per quanto riguarda le porte analogice non saprei come testarle col blink

sto cmq facendo un alimentazione esterna a 12v con un 7805 esterno per l'alimentazione del tutto
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

se scolleghando tutto non funziona si e' probabilmente guastato qualcosa.
io testerei le singole uscite con blink, tutte, incluse le 6 analogiche, puo' essere che c'e' qualche uscita in corto.

inoltre hai fatto un calcolo sui mA necessari ? dici di alimentare tutto da usb quindi ne hai circa 250mA da utilizzare
Sono 500 mA. Ma il problema è che l'Arduino non può gestire più di 200 mA di corrente, compresa quella che gli serve per "sopravvivere", e comunque ci sono limitazioni di corrente a seconda dei pin usati. A pag. 317 trovi tutte le max. correnti gestibili.
Logged


Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ho fatto il test con solo il codice blink su tutte 14 le porte digitali e funziona, un unico appunto, per quale motivo la porta 0 e la porta 1 (tx & rx) nella situazione in cui da codice non le utilizzo collegandoci i led me li accende?
Se stai usando la seriale per debug o comunicazione, hai dei segnali sulla linea.

Quote
per quanto riguarda le porte analogice non saprei come testarle col blink
Basta indicarle come 14..19

Quote
sto cmq facendo un alimentazione esterna a 12v con un 7805 esterno per l'alimentazione del tutto
Meglio.
Logged


Offline Offline
Jr. Member
**
Karma: 2
Posts: 86
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il codice che utilizzo per le prove è il seguente

Code:
extern unsigned long timer0_millis;

int led1 = 12;
int led2 = 13;

void setup() {

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
}

void loop(){

  if (millis()>50 && millis()<100) digitalWrite(led1,HIGH);
  if (millis()>100  && millis()<150) digitalWrite(led1,LOW);
  
  if (millis()>150 && millis()<200) digitalWrite(led1,HIGH);
  if (millis()>200  && millis()<250) digitalWrite(led1,LOW);
  
  if (millis()>650 && millis()<700) digitalWrite(led2,HIGH);
  if (millis()>700  && millis()<750) digitalWrite(led2,LOW);
  
  if (millis()>750 && millis()<800) digitalWrite(led2,HIGH);
  if (millis()>800  && millis()<1200) digitalWrite(led2,LOW);

  

  if (millis()>1200) {
    cli();
    timer0_millis = 0;
    sei();
    }
}

quindi non interpello le porte in questione in alcun modo,
cmq ho fatto la prova anche sul mega ed il risultato porta 0 e 1 è lo stesso

Provate le analogiche ed il blink va anche se un pizzico più rapido delle digitali

PS. pensavo che le analogiche fossero solo ingressi... figata
« Last Edit: September 16, 2012, 09:55:45 am by DriftBoy » Logged

0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sono 500 mA. Ma il problema è che l'Arduino non può gestire più di 200 mA di corrente, compresa quella che gli serve per "sopravvivere", e comunque ci sono limitazioni di corrente a seconda dei pin usati. A pag. 317 trovi tutte le max. correnti gestibili.
lo so che sono 500 dalla usb, dicevo che ne ha 250mA a disposizione per il resto del circuito, visto che lui parla anche di servi ma li alimenta sempre da usb. i 200mA sono quelli gestibili dal micro, il resto che prendi dal pin5V viene dalla usb.
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Offline Offline
Jr. Member
**
Karma: 2
Posts: 86
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no no chiariamo una cosina, la questione del servo era un test separato dal problema di oggi, e cioè all'arduino c'era collegato solo il servo al quale mandava un semplicissimo segnale PPM, poi il servo si alimentava dall'uscita 5v di arduino ma parliamo di 200mah quindi 200arduino+200servo sono 400
ma non è questo il problema, la questione che cosa è cambiato da quando ho fatto la prova del blink nel programma completo
ad ora che non funziona più il blink?
Logged

0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma per blink che non funziona cosa intendi ?
tu hai detto che hai testato tutte le uscite con blink ed un led e funzionano tutte.
quindi il micro funziona.
Intendi che hai ricreato il circuito del lampeggiatore con il delay ? e prima funzionava ed adesso no ?
oltre a non funzionarti con millis ?

se e' cosi' possono solo essere sbagliati i collegamenti, perche' appunto, ripeto, se il blink sulle singole uscite e' ok, anche il tuo lampeggiatore con il blink e i tempi modificati deve funzionare.

posta anche il codice che tu chiami blink a questo punto
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Offline Offline
Jr. Member
**
Karma: 2
Posts: 86
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

allora il codice principale è quello con cui mi si sfanc.... tutto e per fare i test ho fatto con questo:

Code:
extern unsigned long timer0_millis;

int led1 = 18;
int led2 = 19;

void setup() {

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
}

void loop(){

  if (millis()>50 && millis()<100) digitalWrite(led1,HIGH);
  if (millis()>100  && millis()<150) digitalWrite(led1,LOW);
 
  if (millis()>150 && millis()<200) digitalWrite(led1,HIGH);
  if (millis()>200  && millis()<250) digitalWrite(led1,LOW);
 
  if (millis()>650 && millis()<700) digitalWrite(led2,HIGH);
  if (millis()>700  && millis()<750) digitalWrite(led2,LOW);
 
  if (millis()>750 && millis()<800) digitalWrite(led2,HIGH);
  if (millis()>800  && millis()<1200) digitalWrite(led2,LOW);

 

  if (millis()>1200) {
    cli();
    timer0_millis = 0;
    sei();
    }
}

sempre con millis
il delay non lo voglio proprio + vedere smiley-grin

mettendo solo questo spezzone funziona tutto
mentre mettendo tutto il resto posso dire amen
Logged

Offline Offline
Jr. Member
**
Karma: 2
Posts: 86
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

fatte le prove con alimentazione esterna a 5v 1A e non cambia na mazza.................sto sclerando
Logged

Pages: 1 2 [3] 4 5   Go Up
Jump to: