Bólia

Envoyé par le 1 Fév 2014

Ce projet a été réalisé pendant la première semaine d’inter-semestre 2014 au Téléfab par Chloë Garcia, Laurianne Fournier, Jasek Przemyslaw, Carlos Eduardo Rosar Kos Lassance, Matias Prieto, Oussama Nejjar et Younes Benhoumich.

Introduction :

C’est une voiture télécommandée par accéléromètre à l’aide de bluetooth. Elle dispose d’un capteur de température connecté à un LED qui change de couleur selon la température extérieure.

Matériel utilisé :

bouton poussoir

capteur de mouvement

LED RGB

2 x Arduino  Uno

2 x breadboard

des fils

des résistances

Module Bluetooth CMS RFM70-S

La voiture et sa batterie

photo1

photo2

Code arduino de la voiture :

#include <SoftwareSerial.h>
#include <OneWire.h>

#define DS18B20 0x28
#define BROCHE_ONEWIRE 2

SoftwareSerial BTSerial(10, 9); // RX | TX

OneWire ds(BROCHE_ONEWIRE);
byte adresseCapteur1 [8];   // Adresse du premier capteur

const float maxVit = 120.0;
const float upSlope = 0.8;
const float downRate = 0.002;
const float turnRate = 0.3;
const float changeSlope = 0.2;
//const unsigned int maxTimes = 10;

String inputString = «  »;         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete
//boolean noCmd = true;
//boolean turnAlive = false;
float vit1 = 0.0;
float vit2 = 0.0;
float vit0 = 0.0;
//unsigned int timeCmd = 0;

float temp = 20;

int motor1PinPwm = 6;
//int motor1PinEnab = 7;
int motor2PinPwm = 5;
//int motor2PinEnab = 4;

unsigned int count=0;

void setup() {
// initialize serial:
Serial.begin(9600);
BTSerial.begin(9600);  // HC-05 default speed in AT command more
// reserve 2 bytes for the inputString:
inputString.reserve(16);
// set the digitals pins as outputs:
pinMode(motor1PinPwm, OUTPUT);
pinMode(motor2PinPwm, OUTPUT);

ds.reset();
ds.search(adresseCapteur1); // Recherche et stocke l’adresse du capteur 1
}

void loop() {
count++;
if(count == 50){
getTemperature (&temp, adresseCapteur1);     // Demande la température
int dizaine = temp/10;
int unite = temp – dizaine*10;
BTSerial.print(dizaine);
BTSerial.print(unite);
Serial.print(dizaine);
Serial.println(unite);
count = 0;
}

btSerialEvent();

// print the string when a newline arrives:
if (stringComplete) {

//noCmd = false;
//timeCmd = 0;

if(inputString[0]==’1′){
vit0 = min((vit1 + vit2)*0.5 + upSlope, maxVit);
vit1 = vit1+(vit0-vit1)*changeSlope;
vit2 = vit2+(vit0-vit2)*changeSlope;
//turnAlive = false;
}

if(inputString[0]==’0′){
vit1 = 0.0;
vit2 = 0.0;
//turnAlive = false;
}

if(inputString[0]==’3′){
// vit1 < vit2 turn to left
vit2 = min(vit2 + upSlope, maxVit);
vit1 = vit1+(turnRate*vit2-vit1)*changeSlope;
}

if(inputString[0]==’2′){
// vit2 < vit1 turn to right
vit1 = min(vit1 + upSlope, maxVit);
vit2 = vit2+(turnRate*vit1-vit2)*changeSlope;
}

// clear the string:
inputString = «  »;
stringComplete = false;

}
else{
vit1 = vit1*(1-downRate);
vit2 = vit2*(1-downRate);

//turnAlive = false;
//timeCmd = min(timeCmd++, maxTimes);
}

//Serial.print(« VIT1 = « );
//Serial.println(vit1);
//Serial.print(« VIT2 = « );
//Serial.println(vit2);

analogWrite(motor1PinPwm, vit1);
analogWrite(motor2PinPwm, vit2);

delay(1);
}

void btSerialEvent() {
while (BTSerial.available() && !stringComplete) {
// get the new byte:
char inChar = (char)BTSerial.read();
// add it to the inputString:
if (inChar == ‘\n’) {
stringComplete = true;
continue;
}
inputString += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
}
}

void getTemperature (float *temp, byte addr[])
{
byte data[2];

ds.reset();
ds.select(addr);        // Sélectionne le capteur de température

ds.write(0x44,1);       // Lance la mesure de température
//delay(800);

ds.reset();             // Reset pour envoyer maintenant la demande de lecture
ds.select(addr);
ds.write(0xBE);         // Demande de lecture du scratchpad

data[0] = ds.read();    // Lit les 2 premiers octets du scratchpad sur lesquels est scontenue la température
data[1] = ds.read();
*temp = ((data[1] << 8) | data[0]) * 0.0625;       // Conversion en degrés celsius
}

Code arduino de la télécommande :

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(10, 9); // RX | TX

int tilt_s1 = 2;
int tilt_s2 = 3;
int buttonPin = 7;
int bpin = 11;
int rpin = 6;
int gpin = 5;
int a = 0;
int b = 0;
int c = 0;

int sortie = 11;
void setup() {
pinMode(tilt_s1, INPUT);
pinMode(tilt_s2, INPUT);
pinMode(buttonPin, INPUT);
pinMode(sortie, OUTPUT);
Serial.begin(9600);
BTSerial.begin(9600);
}

void loop() {

int but = digitalRead(buttonPin);
int position = getTiltPosition();
if (but) {
switch (position) {
case 0 :
BTSerial.println(‘0’);
//digitalWrite(moteurDr,HIGH);
//digitalWrite(moteurGa,HIGH);
break;
case 1 :
BTSerial.println(‘2’);
//digitalWrite(moteurDr,HIGH);
//digitalWrite(moteurGa,LOW);
break;
case 2 :
BTSerial.println(‘3’);
//digitalWrite(moteurDr,LOW);
//digitalWrite(moteurGa,HIGH);
break;
case 3 :
BTSerial.println(‘1’);
//digitalWrite(moteurDr,LOW);
//digitalWrite(moteurGa,LOW);
break;
}
}
if (!but && BTSerial.available()) {

if (b == 0) {
a = BTSerial.read() – 48;
b = -40;
}
else {
b = 10 * a + BTSerial.read() – 48;
Serial.println(b);
if(b==-40){}
else if (b >= 27) {
solid(0, 255, 0, 500); // red
b = 0;
}
else if (b >= 24) {
solid(255, 0, 0, 500); // green
b = 0;
}
else {
solid(0, 0, 255, 500); // blue
b = 0;
}
}
}

}

// Fonction qui garde une couleur
// (valeur du rouge, valeur du vert, valeur du bleu, durée)
void solid(int r, int g, int b, int t)
{

// Inverse les valeurs car 5V = couleur éteinte
r = map(r, 0, 255, 255, 0);
g = map(g, 0, 255, 255, 0);
b = map(b, 0, 255, 255, 0);

// Envoie les valeurs
analogWrite(rpin,r);
analogWrite(gpin,g);
analogWrite(bpin,b);

// Attends la durée demandée
}

// Fonction qui passe d’une couleur à une autre petit à petit
// (rouge début, vert début, bleu début,
//   rouge fin, vert fin, bleu fin, durée)
void fade(int r1, int g1, int b1,
int r2, int g2, int b2, int t)
{
float r_float1, g_float1, b_float1;
float r_float2, g_float2, b_float2;
float grad_r, grad_g, grad_b;
float output_r, output_g, output_b;

// Transforme les valeurs en flottants
r_float1 = (float) r1;
g_float1 = (float) g1;
b_float1 = (float) b1;
r_float2 = (float) r2;
g_float2 = (float) g2;
b_float2 = (float) b2;

// Calcule la vitesse de changement de chaque couleur
grad_r = (r_float2-r_float1)/t;
grad_g = (g_float2-g_float1)/t;
grad_b = (b_float2-b_float1)/t;
// Incrémente les couleurs petit à petit
// jusqu’au temps demandé
for ( float i=0; i<=t; i++ )
{
output_r = r_float1 + grad_r*i;
output_g = g_float1 + grad_g*i;
output_b = b_float1 + grad_b*i;
// Inverse les valeurs (5V = éteint)
output_r = map (output_r,0,255,255,0);
output_g = map (output_g,0,255,255,0);
output_b = map (output_b,0,255,255,0);
// Envoie les valeurs
analogWrite(rpin, (int)output_r);
analogWrite(gpin, (int)output_g);
analogWrite(bpin, (int)output_b);
// Attends 1 ms
}
}

int getTiltPosition() {
int s1 = digitalRead(tilt_s1);
int s2 = digitalRead(tilt_s2);
return (s1 << 1) | s2; //bitwise math to combine the values
}

Laisser une réponse

Votre adresse e-mail ne sera pas publiée.