En continu

01 févr. 2015
Catégorie : General
Posté par : administrateur

Le raspberrypi a un petit frère (un grand frère je devrais dire ...) le bananapi. Ce dernier est très similaire mais présente des performances plus intéressantes. A découvrir!

Bananapi

CMS - 1.11.2 - Isabela
 

Réalisation d'un "Tracker" solaire à l'aide d'Arduino

Cette maquette s'inscrit dans un contexte de développement durable car elle optimise un système de production d'énergie renouvelable, et également d'informations numériques.

La maquette réalisée est un automate d'une trentaine de centimètres de hauteur, capable de suivre une source lumineuse mobile afin d'orienter de façon optimale le panneau solaire en direction des rayons du soleil.

Les mouvements de rotation se produisent selon deux axes (un vertical et un horizontal). Deux moteurs commandés par la carte électronique Arduino assure la mise en rotation. L'orientation optimale est calculée à partir des données de 3 cellules photorésistantes.

Démonstration en video

Arduino Solar tracker Lycée Cantau Anglet from Philippe Lawrence on Vimeo.

Matériels

Les principaux éléments sont les suivants:

  • Carte Arduino
  • Mini Panneau Solaire 10x7,5 cm 5,5 W
  • 2 roulements Diamètre 26 mm
  • Batterie 6 V
  • 2 servomoteurs
  • 3 PhotoRésistances 1 kOhm
  • Quincaillerie : Tige filletée Diamétre 3 mm, L=1 m ; 4 équerres, lame bois ; cornière alu 15x15 mm ; rondelles, écrous

Maquette

Cablage et fonctionnement

Le principe consiste à remarquer que la lumière reçue par les trois photorésistances est identique dès que le capteur (ensemble des trois photorésistances) est orienté dans l'axe de la lumière. Il faut donc mesurer la lumière reçue par chaque photorésistance en mesurant la tension à leurs bornes. Cette mesure est réalisée grâce à la connexion des ports pin 1 à 3 de la carte (ces derniers sont configurés en port analogique).
Le programme compare ensuite ces tensions ordonnant aux servomoteurs de pivoter dans la direction de la ou des photorésistances qui reçoivent le moins de lumière.

Algorigramme

Ci-dessous l'algorigramme simplifié de fonctionnement du programme.

Algorigramme

Programmation de la carte

La programmation de la carte s'effectue via une interface logicielle en pseudo langage C. Une fois le programme écrit, il est envoyé sur la carte qui peut ensuite fonctionner en autonomie (sans connexion avec l'ordinateur).

Code Arduino

#include <servo.h> 

//IO Pins
int pinL = 1;              //Left Sensor IO Pin
int pinR = 2;              //Right Sensor IO Pin
int pinServo1 = 10;        //Servo 1 PWM pin
int pinU = 3;              //up Sensor IO Pin
int pinServo2 = 11;        //Servo 2 PWM pin

int leftValue = 0;         //The left Sensor Value
int rightValue = 0;        //The right Sensor Value
int upValue = 0;           //The left Sensor Value
int error1 =0;              //The Deviation between the 2 sensors
int errorAVG1 = 0;          //Error Average - Rolling 2 Point
int error2 =0;              //The Deviation between the 2 sensors
int errorAVG2 = 0;          //Error Average - Rolling 2 Point


Servo hServo1;              //The servo object
Servo hServo2;   
int Position = 45;         //Position to write out

int minPos = 7;            //Min Position
int maxPos = 160;          //Max Position


float output1 = (maxPos - minPos) /2;  //Initial output Position
float output2 = (maxPos - minPos) /2;  //Initial output Position

void setup()
{

Serial.begin(9600);  //9600
//pinMode(pinV, INPUT);
hServo1.attach(pinServo1);
hServo2.attach(pinServo2);

//Set Servo to Centre for Alignment Purpose
Serial.println("Moving Servo to start Position");
hServo1.write(output1);
hServo2.write(output2);
delay(2000);
Serial.println("Going Live................");
}
void loop()
{
  //Input Reading
   leftValue = analogRead(pinL);
   rightValue = analogRead(pinR);
   upValue = analogRead(pinU);
   error1 = leftValue - rightValue;
   error2 = -upValue + (leftValue+rightValue)/2;
   errorAVG1 = (errorAVG1 + error1) / 2;
   errorAVG2 = (errorAVG2 + error2) / 2;
 
 float newOutput1 = output1 + getTravel(errorAVG1);
 if (newOutput1 > maxPos)
 {
   newOutput1 = maxPos;
 }
 else
 { 
   if (newOutput1 < minPos)
   {
     newOutput1 = minPos;
   }
 }
    hServo1.write(newOutput1);
    output1 = newOutput1;
    
 float newOutput2 = output2 + getTravel(errorAVG2); 
 if (newOutput2 > maxPos)
 {
   newOutput2 = maxPos;
 }
 else
 { 
   if (newOutput2 < minPos)
   {
     newOutput2 = minPos;
   }
 }
    hServo2.write(newOutput2);
    output2 = newOutput2;
}

int getTravel(float errorAVG)
{
  int deadband = 50;         //Range for which to do nothing with output 10 = -10 to +10  
  // -1 = Left; +1 = Right
 
 if (errorAVG < (deadband * -1))
 {
   return -1;
 }
 else 
 {
   if (errorAVG > deadband)
   {
     return 1;
   }
   else
   {
     return 0;
   }
 }
}

Acquisition des données

Les données peuvent être acquises soit à partir d'un terminal relié au port série virtuel de l'ordinateur (ce qui permet d'exporter ensuite les données vers un tableur), soit tracées en temps réel à l'aide d'une interface programmée en python, comme celle de la figure suivante.

Previous page: Carte Arduino  Page suivante : Serial live viewer