alim arduino uno via batterie voiture

Les cartes Arduino, les platines

alim arduino uno via batterie voiture

Message non lude silversurfer » Lun 9 Fév 2015 08:18

Bonjour,

J'ai un petit projet de balance pour ruche via une arduino UNO et un shield data loger sur SD. Le projet comme celui ci :

http://fablab-lannion.org/wiki/index.php?title=Suivi_des_ruches

Pour l'alim j'aimerais bien utiliser une vieille batterie de voiture que je rechargerais via un petit panneau solaire. Y a t il un soucis si j'alimente en direct l'arduino via une batterie 12v. J'ai vu qu'en cas d'alimentation embarqué il fallait un varistor :

http://forum.arduino.cc/index.php?topic=13345.0

Comme ici la batterie n'est pas embarqué je suppose qu'elle délivre une tension constante ?
avez vous des conseils pour un petit kit solaire qui me permettrait de recharger cette batterie ?

merci
silversurfer
 
Messages: 9
Inscription: Dim 20 Oct 2013 20:08

alim arduino uno via batterie voiture - Monitoring ruches

Message non lude Vince » Mer 11 Fév 2015 12:12

Je suis aussi sur un projet de monitoring d'une dizaine de ruches :

Chaque ruche est équipée d’un micro contrôleur Promini 5V avec une carte HX711et sa sonde de poids, une sonde DS18B20 en I2C et un module RS485 pour la communication avec le maître. Dans un premier temps, c'est un nano qui fait office de Promini pour être plus simple à programmer.
Câblage RS485 : 3 entrées digitales comme D10 D11 et D12
Câblage HX711 : DT en A2 et SCK en A3
Câblage DS18B20 : une seule entrée digitale comme D2

La communication entre chaque ruche passe donc par un réseau RS485 qui a la bonne idée de pouvoir faire jusqu'à 1.2km ...ce qui permet de se rapprocher d'une source d'alimentation pour le master et le réseau : l'akéru qui fait la tournée des popotes régulièrement et envoie son faible message de 22 octets. 22 octets c'est pas grand chose donc on laisse juste un octet pour le poids et un octet pour la température par ruche :
Pour une température de -15°C à 45°C (70) en tablant sur des quarts de degrés, ça fonctionne et ça devrait suffire en précision :

Température Conversion en octet
-15 0
-10 20
0 60
10 100
20 140
30 180
40 220
45 240

temp1 = (temp+15)*4;
tempbyte = (byte) temp1; //Ça c'est du code puissant !

Pour le poids, même principe :
Capteur de poids de 20kg monté en face d’un axe. Le 0 à 20kg équivaut à un 0 à 40 kg avec une plage utile de 20 à 40 kg soit 20 kg pour 255 points soit 0.1 kg par unité : ça devrait pouvoir permettre de détecter l'envol d'un essaim.

Mesure avec offset à 20kg Poids réel Conversion en octet
0 20 0
0.05 20.1 kg 1
1 22 kg 20
5 30 kg 100
10 40 kg 200

C'est l'Amérique car il reste encore 2 octets pour faire remonter des codes d'erreur sur l'alim ou la défaillance d'un esclave...
weight1 = weight*10;
weightbyte = (byte) weight1; //deuxième démonstration de puissance du code !

Voila donc le code en mode brouillon pour l'esclave...mais uniquement pour renvoyer les 2 octets sur le PC via la liaison série, il n'y a pas de RS485 pour l'instant...par contre, la partie capteur fonctionne :
Code: Tout sélectionner
#include "HX711.h"
#include <OneWire.h> // Inclusion de la librairie OneWire pour la sonde de température

#define DS18B20 0x28     // Adresse 1-Wire du DS18B20, détectée en chargeant un utilitaire qui la renvoie sur le PC
#define BROCHE_ONEWIRE 2 // Broche utilisée pour le bus 1-Wire

HX711 scale(A2, A3);            // parameter "gain" is ommited; the default value 128 is used by the library

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds en intégrant le fait que ça se passe sur la patte 2 définie ci dessus dans les variables
float tempmax = 0 ; // variable d'enregistrement de la tempérarure max, initialisée à 0 pour être sur de la changer à la première boucle
float tempmin = 40 ; // variable d'enregistrement de la tempérarure min, initialisée à 40 pour être sur de la changer à la première boucle
float temp; //température en degré
float temp1; //température en quart de degré pour conversion en octet + 15°
byte tempbyte; //température convertie en octet
float weight; // poids
float weight1; //poids en hectogramme pour conversion en octet
byte weightbyte; //poids converti en octet

// FONCTION récupérant la température depuis le DS18B20 - pompée toute faite sur internet. Casse pied à décortiquer car relève de la lecture de messages série.
// Retourne true si tout va bien, ou false en cas d'erreur sur la variable booléan
boolean getTemperature(float *temp){
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté
 
  if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    return false;         // Retourne une erreur
  }
   
  if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
    return false;                        // Si le message est corrompu on retourne une erreur
 
  if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
    return false;         // Si ce n'est pas le cas on retourne une erreur
 
  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
   
  ds.write(0x44, 1);      // On lance une prise de mesure de température
  delay(800);             // Et on attend la fin de la mesure
   
  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad
 
  for (byte i = 0; i < 9; i++) // On lit le scratchpad
    data[i] = ds.read();       // Et on stock les octets reçus
   
  // Calcul de la température en degré Celsius
  *temp = ((data[1] << 8) | data[0]) * 0.0625;
   
  // Pas d'erreur
  return true;
}
//fin de la fonction de lecture de la température depuis le DS18B20 - pompée toute faite sur internet.



void setup() {
  Serial.begin(9600);           // lance le port série pour le retour vers le PC
  // la balance :
  scale.set_scale();            // initialise la balance pour détermination du facteur de conversion
  scale.tare();              // reset la balance à zéro
  delay(1000);                  // pause pour avoir le temps de lire
  scale.set_scale(100000.f);    // calibre la balance par division entre le poids de test connu et la valeur affichée lors du test
 
}

void loop() {
  // début de la routine d'affichage du poids
  weight = scale.get_units();
  Serial.print(" Poids : ");
  Serial.println(weight);
  //Serial.println(scale.get_units(), 3);
  //scale.power_down();                 // put the ADC in sleep mode 
  //scale.power_up();
  // fin de la routine d'affichage du poids
 
  // début de la routine d'affichage de la température
   getTemperature(&temp); // Lit la température ambiante à ~1Hz dans la fonction déja vue en début de programme et pompée intégrale
   Serial.print(" Temp : ");
   Serial.println(temp);
   // if(getTemperature(&temp)) { // Lit la température ambiante à ~1Hz dans la fonction déja vue en début de programme et pompée intégrale
   // fin de la routine d'affichage de la température
 
   // enregistrement des températures min et max 
   if (temp > tempmax) { // enregistrement de la température max, si la température lue est sup à la température max archivée alors
     tempmax = temp ; //la nouvelle température max devient la température lue
    } // fin de cette collecte de la température max 
   if (temp < tempmin) {// enregistrement de la température min, si la température lue est inf à la température min archivée alors
    tempmin = temp ;
    } // fin de la collecte de la température min
   // fin d'enregistrement des températures min et max 
   
   //routine de conversion de weight et temp en octet pour communication avec le maitre
   Serial.print(" Temp convertie en quart de degres : ");
   temp1 = (temp+15)*4;
   tempbyte = (byte) temp1;
   Serial.println(tempbyte);
   Serial.print(" Poids converti en hectogramme : ");
   weight1 = weight*10;
   weightbyte = (byte) weight1;
   Serial.println(weightbyte);
   //fin de routine de conversion de weight et temp en octet pour communication avec le maitre
   
}


Voila pour le début, les photos et la suite (le master) arrivent. Par contre, pas de faux espoirs : je n'ai pas abordé du tout l'aspect mise en œuvre de la communication via le RS485 entre l'akéru et ses dix esclaves. J'ai idée qu'il faut appeler chaque esclave à tour de rôle et lui demander ses 2 octets poids et température avec un code d'identification simple qui permet d'être sur que c'est le bon esclave qui a répondu et dans les temps. Ensuite, après avoir stocké les 20 octets et regardé la tension d'alim, la présence de 220V etc...on envoie le super message de 22 octets dans les airs...
Vince
 
Messages: 22
Inscription: Sam 27 Déc 2014 11:25

Re: alim arduino uno via batterie voiture

Message non lude Vince » Mer 11 Fév 2015 13:23

Les photos de la platine d'essai : balance avec sa carte HX711+ sonde de température DS18B20 + nano + une petite carte nourrice pour disposer de plus de pattes 5V et GND + la fameuse carte RS485 que je ne sais pas encore faire tourner...ceci est un appel, si quelqu'un a un petit bout de code qui fonctionne pour faire communiquer un maitre est 10 esclaves...
Platine esclave.JPG
La platine complète.
Platine esclave.JPG (127.82 Kio) Vu 1991 fois
Balance.JPG
La balance avec son capteur 20kg.
Balance.JPG (87.24 Kio) Vu 1991 fois
Balance2.JPG
Le capteur doit être correctement monté en porte à faux.
Balance2.JPG (92.56 Kio) Vu 1991 fois
.
Vince
 
Messages: 22
Inscription: Sam 27 Déc 2014 11:25

Re: alim arduino uno via batterie voiture

Message non lude Vince » Mer 11 Fév 2015 13:30

Maintenant, les signaux :
HX711.JPG
La platine de conversion pour le poids.
HX711.JPG (106.96 Kio) Vu 1991 fois
resistance DS18B20.JPG
La fameuse résistance de rappel sur la sonde de température : soudée directement sur le Nano.
resistance DS18B20.JPG (102.37 Kio) Vu 1991 fois

La nourrice :
Nourrice.JPG
La nourrice qui est juste un morceau de Veroboard avec 2 rangs de connecteurs pour distribuer le 5V et le GND. J'ai soudé volontairement les pattes coté CI pour montrer la fabrication mais normalement on s'ennuie moins en soudant de l'autre coté.
Nourrice.JPG (105.88 Kio) Vu 1991 fois
Vince
 
Messages: 22
Inscription: Sam 27 Déc 2014 11:25

Re: alim arduino uno via batterie voiture

Message non lude Vince » Mer 11 Fév 2015 13:50

Les dernières photos du jour :
Nano dessus.JPG
Le Nano vue de dessus.
Nano dessus.JPG (132.31 Kio) Vu 1990 fois
RS485 alim.JPG
La carte RS485 coté alim.
RS485 alim.JPG (110.14 Kio) Vu 1990 fois
RS485 Signal nano.JPG
Et la même carte RS485 coté signal vers le Nano.
RS485 Signal nano.JPG (98.41 Kio) Vu 1990 fois
.

Ça donne donc pour récapituler coté Nano :

D2 = signal sonde de Température
D3 = DE RS485
D10 = RO RS485
D11 = DI RS485
A2 = DT HX711
A3 = SCK HX711
5V = vers la nourrice +5V
GND = vers la nourrice GND

A oui, au fait, la carte HX711 est prévue pour faire rentrer 2 sondes de poids et comme il est aussi possible de mettre 2 sondes de température DS18B20 sur la même entrée...certains pourrait avoir idée de diviser par 2 le nombre de Nano. Pas de bol, la carte HX711 ne dispose pas de bibliothèque Arduino permettant de lire 2 sondes ! :oops:
Et je ne suis largement pas assez calé pour la concevoir (avis aux Geeks ou aux profs en recherche de projets un peu utile car c'est le début de la célébrité ...avec le nombre de pages sur cette limitation sur le net...). ;)
Vince
 
Messages: 22
Inscription: Sam 27 Déc 2014 11:25

Re: alim arduino uno via batterie voiture

Message non lude Vince » Mer 11 Fév 2015 14:11

Ah oui...pour l'instant tout ça ne fait que ça :
résultat.jpg
résultat.jpg (94.59 Kio) Vu 1988 fois
Faut bien démarrer par quelque chose ...:D

Pour le master ça sera plus facile :
Akéru en carte de base, module RTC pour avoir l'heure (et permettre les envois dans la limite du nombre de messages journalier avec le totalisateur de secondes), LCD Keypad Shield pour pouvoir faire défiler en local les informations horodatées température et poids des 10 ruches (ou autre chose selon imagination).
Dans l'état actuel des choses, l'Akeru + LCD keypad shield + RTC fonctionnent sur la base du code "tables de multiplication" que j'ai mis à dispo dans ma présentation auquel j'ai ajouté les lignes utiles au RTC.
Vince
 
Messages: 22
Inscription: Sam 27 Déc 2014 11:25


Retourner vers Arduino

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité