Arduino nano e sensore 9v

Ciao a tutti sono Mirko e sono nuovo del forum volevo un informazione, premetto che sono alle prime armi con arduino, ora passiamo al problema:
avrei la necessità di collegare ad un ingresso analogico un sensore di pressione (0-400bar)funzionante a 9v(oppure a 12) volevo sapere come fare a collegarlo in entrambi i casi , non penso possa collegarlo direttamente visto che l'alimentazione è data da un altra scheda e il limite di arduino è 5v, ho letto che serve una resistenza tra il gnd ma il valore non so calcolarlo
vi ringrazio a tutti in anticipo
Ciao

Da come descrivi le caratteristiche del sensore sembra che i 9V siano per l'alimentazione dello stesso, ma non citi le caratteristiche di uscite, quelle utili per interfacciarsi con Arduino.

prima di tutto grazie per la risposta, hai ragione mi ero dimenticato di darvi le specifiche del sensore :sweat_smile:
il sensore ha solo due cavetti gnd e l’alimentazione (9-30v) il modello è un 4-20mA Danfoss 3050 0-400bar ho letto che dovrei convertire il 4-20mA in 0-5v per riuscire a leggerlo tramite analogRead è vero?? per fare ciò dovrebbe servirmi una resistenza ma ho trovato solamente il valore per un alimentazione a 24v che dicevano essere 250 ohm.

Attento … quel sensore è fatto per dare un uscita 4-20 mA current loop

… il che significa che devi alimentarlo con una tensione compresa tra 9 e 30V (es. puoi usare un alimentatore a 12V) e, IN SERIE, devi mettere una resistenza AI CAPI DELLA QUALE misurerai una tensione data da V = Iloop x R.

Se usi quindi, ad esempio, una resistenza da 220 Ohm avrai che, alla corrente massima di 20mA, la tensione ai capi di quella resistenza sarà di 4.4V, mentre alla corrente minima di 4mA la tensione sarà di 0.88V.

Metti la resistenza il più vicino possibile hai pin di Arduino visto che il loop di corrente è piuttosto immune da disturbi, ma, una volta che trasformi in tensione … perdi detta immunità :wink:

Guglielmo

quindi mi basterebbe mettere una resistenza da 220 ohm tra il gnd del sensore dopo di che collegare un ingresso analogico su un capo della resistenza e sul altro capo il gnd del arduino vero?
per la distanza della resistenza dove avevo intenzione di metterla sarà circa ad 1 metro di cavo da arduino potrebbe andare bene oppure mi converrebbe metterlo più vicino?
grazie mille ancora

Il circuito deve essere :

                                            + ------- ARDUINO --------+
                                            |                         |
                                            |                         |
+---- ALIMENTATORE 12V ------ SENSORE ------+------ RESISTENZA -------+
|                                                                     |
|                                                                     |
+---------------------------------------------------------------------+

... e il collegamento dalla resistenza ad Arduino il più corto possibile.

Ovviamente, per sicurezza, prima di collegare Arduino, con un Voltmetro controlla che i valori ai capi della resistenza siano quelli che ti aspetti ... e NON superiori ai 5V !

Guglielmo

perfetto grazie ancora a tutti domani proverò a vedere se riesco a combinare qualcosa XD

Io proporrei di alzare il valore della resistenza a 250 ohm in modo tale che per una corrente limite di 20mA ottieni una tensione ai sui capi di 5V coprendo l’intera scala del covertitore di Arduino.
Non farebbe male aggiungere, come protezione un diodo zener in parallelo all’ingresso di Arduino.

Sullo schema ho lasciato volutamente un punto interrogativo sull’alimentazione, in quanto sui sensori in corrente si deve fare un minimo di verifica. Allora ipotizzando un valore massimo di 20mA, ai capi di Arduino avremo 5V, trovandosi in serie al circuito, a tale tensione dovremo aggiungere la tensione necessaria ad alimentare il sensore di 9V (vedi dati da te forniti) per un totale di 14V.

Comunque fai una verifica: alimenti il tutto a 12 V come da schema al minima portata (4mA), e misuri la tensione ai capi del sensore e tra i le debite conclusioni.

arduino.jpg

Dagli un'alimentazione di almeno 14Vcc

non posso alimentarlo io perche il sensore deve leggerlo anche un altra scheda che non posso modificare o toccare
sarebbe il sensore di portata di una gru idraulica e volevo provare a fare una pesa il sensore è collegato originalmente ad una scheda che fa bloccare la gru in caso di sovraccarico e alimenta il suddetto con 9v

Quindi e' gia utilizzato da un'altro circuito ... senza avere almeno le specifiche di quest'altro circuito, la vedo un po dura ...

Ti consiglio di mettere uno zener da 5.1V in parallelo all'ingresso analogico onde evitare che accidentali falsi contatti facciano arrivare all'ingresso del convertitore AD tensioni superiori a 5V.

mirko041294:
non posso alimentarlo io perche il sensore deve leggerlo anche un altra scheda che non posso modificare o toccare
sarebbe il sensore di portata di una gru idraulica e volevo provare a fare una pesa il sensore è collegato originalmente ad una scheda che fa bloccare la gru in caso di sovraccarico e alimenta il suddetto con 9v

Azz ... e adesso ce lo dici ??? :astonished:
E che fai ... vai a tagliare la linea e mandi per aria la sicurezza della gru idraulica ? :astonished: :astonished: :astonished:

Ho idea che devi cambiare strada ...
... quell'affare allora ha già un circuito che fa delle misure ... devi andare a vedere se arrivi ... in modo indolore e sicuro ... a quello e prelevi i segnali li ... :roll_eyes:

Come dice Etem ... la vedo dura ...

Guglielmo

Il problema piu grosso e' che non abbiamo le specifiche del circuito che c'e' gia ... ad esempio (ma e' solo un'esempio teorico), se la resistenza di carico che converte corrente/tensione avesse un capo a massa, Arduino potrebbe leggere il valore in parallelo al circuito preesistente, sia pure con una certa lentezza di risposta (collegando il pin di ingresso analogico, con impedenza di circa 100M, tramite un'altra resistenza da almeno 100K, al pin della scheda gia esistente ... ma solo se questa avesse di suo una bassa impedenza, perche' se fosse alta come quella di Arduino, falserebbe anche la sua lettura, e non e' il caso)

Oppure si potrebbe usare un secondo convertitore corrente/tensione in serie al circuito gia esistente (se l'alimentazione fosse abbastanza alta da garantire la stessa corrente, tanto essendo in serie, la corrente in entrambi i convertitori sarebbe uguale) .. e magari usandone uno con uscita galvanicamente isolata, se le masse non fossero in comune ...

Soluzioni ce ne sarebbero, solo che non sono economicissime :stuck_out_tongue:

le specifiche del circuito già presente non le so so solo che provando a collegare arduino con la resistenza non è cambiato nulla e riesco a leggere tranquillamente il valore anche se con un leggero sbaglio, mi spiego ogni tanto legge dei valori di 20-30 più alti, non c’è qualche sistema per stabilizzarli??
spiego il progetto sono due arduino, uno legge i valori del sensore e li trasmette mediante trasmettitori 315MHz,l’ altro invece riceve il valore e lo visualizza togliendo prima la pressione della gru a vuoto

il codice del trasmettitore è questo

#include <VirtualWire.h>
#define sensore A7
const int led_pin = 13;
const int transmit_pin = 11;
const int receive_pin = 2;
const int transmit_en_pin = 3;

void setup()
{
  // Initialise the IO and ISR
  vw_set_tx_pin(transmit_pin);
  vw_set_rx_pin(receive_pin);
  vw_set_ptt_pin(transmit_en_pin);
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);	 // Bits per sec
  pinMode(A7,INPUT);
 Serial.begin(9600);
}


void loop()
{
  int val = analogRead(sensore); // salvo il valore fotoresistenza dentro alla variabile val
  val=map(val,0,1023,0,400);
  Serial.println(val);
  char msg[3];
  itoa(val,msg,10);
  digitalWrite(led_pin, HIGH); // Flash a light to show transmitting
  vw_send((uint8_t *)msg, 3);
  vw_wait_tx(); // Wait until the whole message is gone
  digitalWrite(led_pin, LOW);
  delay(100);
}

questo invece è del ricevente:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <VirtualWire.h>
#include <EEPROM.h>
#define pok 2
#define prst 4
LiquidCrystal_I2C lcd(0x20,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display
const int led_pin = 13;
const int transmit_pin = 12;
int receive_pin = 11;
const int transmit_en_pin = 3;
char valoreletto[3];
int tara=0;
int bar=0;
int cambio=0;
int cpeso=0;
int peso=0;
int i=0;
int j=0;
int media=0;
int sbraccio=3;
unsigned long int timer;

void setup()
{
  lcd.init();                      // initialize the lcd 
  pinMode(pok,INPUT);
  pinMode(prst,INPUT);
  
    Serial.begin(9600);	// Debugging only
    Serial.println("setup");
    // Initialise the IO and ISR
    vw_set_tx_pin(transmit_pin);
    vw_set_rx_pin(receive_pin);
    vw_set_ptt_pin(transmit_en_pin);
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);	 // Bits per sec
    vw_rx_start();       // Start the receiver PLL running
}

void loop()
{  reset: 
sbraccio=3;
  if(digitalRead(pok)==HIGH)            //aspetto che il pulsante p2 venga premuto
  {
     if(millis()- timer >=2000){
    lcd.backlight(); 
    lcd.setCursor ( 0, 0 ); 
    lcd.print("INSERIRE METRI  ");
    lcd.setCursor ( 0, 1 ); 
    lcd.print("DI SBRACCIO     ");// visualizzare su display metri di sbraccio
    while(digitalRead(prst)==LOW)    
      {
        sbracc();
      }
      if(sbraccio==5)
      {
        cpeso = 0;
      }
      if(sbraccio==7)
      {
        cpeso = 0;
      }
      if(sbraccio==9)
     {
      cpeso = 0;
     }
     if(sbraccio==11)
     {
       cpeso = 0;
     }
     if(sbraccio==13)
     {
       cpeso = 0;
     }
     if(sbraccio==15)
     {
       cpeso = 0;
     }  
  
   lcd.setCursor(0,0);
    lcd.print("MISURO TARA     ");
    lcd.setCursor(0,1);
     lcd.print("                ");
     for(i=0;i<16;i++)
     {
       lcd.setCursor(i,1);
       lcd.print("#"); 
       uint8_t buf[VW_MAX_MESSAGE_LEN];
       uint8_t buflen = VW_MAX_MESSAGE_LEN;
       if (vw_get_message(buf, &buflen)) // Non-blocking
       {
         for (j = 0; j < buflen; j++)
         {                                                            //memorizzo tara 5 metri
           valoreletto[j]=buf[j];
         }
       }
       cambio=atoi(valoreletto);
       tara=tara+cambio;
       delay(300);
     }
     tara=tara/16;  
     
     uint8_t buf[VW_MAX_MESSAGE_LEN];
     uint8_t buflen = VW_MAX_MESSAGE_LEN;
     pulsante:
     lcd.setCursor(0,0);
    lcd.print("SOLLEVARE IL CAR");
    lcd.setCursor(0,1);
     lcd.print("ICO E PREMERE OK");
     if(digitalRead(pok)==HIGH)
     {
     for(j=0;j<100;j++)
     {
     if (vw_get_message(buf, &buflen)) // Non-blocking
     {
       for (i = 0; i < buflen; i++)
       {
         valoreletto[i]=buf[i];
       }
     }
     cambio=atoi(valoreletto);
     media=media+cambio;
     delay(30);
   }
     bar=cambio/100;
     peso=(bar-tara)*cpeso;
     vpeso:
   lcd.setCursor(0,0);
   lcd.print("IL PESO E'      ");
   lcd.setCursor(0,1);
   lcd.print("KG :            ");
   lcd.setCursor(6,1);
   lcd.print(peso);
   delay(200);
     }
     else
     {
       goto pulsante;
     }
   if(digitalRead(prst)==LOW)
   {
     goto vpeso;
   }
   else
   {
     lcd.clear();
     lcd.noBacklight();
     goto reset;
   }
     }
  }
  else
  {
    timer = millis();
  }
}

    
    
    
    void sbracc()
{
if(digitalRead(pok)==HIGH)
   {                                    //aumento sbraccio con pulsante p3 e confermo con p2
     if(sbraccio<15)
     {
 
       sbraccio=sbraccio+2;
       lcd.setCursor ( 13, 1 ); 
      lcd.print(sbraccio);
           delay(600);
     }
     else
     {
       
       sbraccio=5;
       lcd.setCursor (14,1);
       lcd.print(' ');
       lcd.setCursor ( 13, 1 ); 
      lcd.print(sbraccio);
      delay(600);
     }
   }
   else
   {
   
   }
}

Controlla bene che la massa dell ' arduino TX sia perfettamente isolata dal resto della macchina, Usa un alimentatore solo per lui isolato galvanicamente

dopo la resistenza da 250 ohm metti una rete RC con condensatore da 100nF e res 10K, il diodo di protezione 5V1 mettilo in parallelo al condensatore

Ehm ... forse e' meglio che inserisci i codici nei tag "code", prima che passi un mod e ti strini i baffi per aver postato mezzo chilometro di codice in plaintext :wink:

Grazie mille a Etemenanki mi ero completamente dimenticato!
per la risposta di Icio andrebbe bene come lo schema qua sotto?

IMG_0231[1].JPG

Ehm, non proprio … piu che altro cosi :wink:

Facci sapere se hai risolto...