Buongiorno a tutti, voglio parlarvi e magari cercare di capire lo strano problema che si presenta nel circuitino che ho realizzato.
Stiamo parlando di un progettino abbastanza semplice, formato da un MPU6050 e un AtTiny che legge la posizione del sensore. Il funzionamento è paragonabile ad un antifurto che memorizza la posizione (inclinazione), e se il sensore viene inclinato più di un tot, fa scattare un relè.
Dopo aver creato un prototipo sulla breadboard, ho creato attraverso easyeda un pcb, di cui allego il circuito elettrico e sketch dell'attiny.
Arrivato il pcb, saldato il tutto ho giusto verificato se funzionasse correttamente.
Mi è capitato di soffiare sopra il sensore perchè c'era un po' di polvere e FATTO STRANO, è scattato il relè :o :o
Ed è proprio questo il fatto strano, basta soffiare sul MPU (con forza) e il relè scatta, come se il sensore venisse inclinato.
L'Attiny e l'MPU utilizzano il protocollo i2C con resistenze di pull-up da 4k7 e sono distanti circa 10cm.
Allora per fare un test, ho collegato l'MPU ad un arduino uno, lasciando l'mpu nel pcb ed effettivamente se ci soffio sopra, ottengo dal sensore una lettura di un movimento quindi come se in quell'istante avessi spostato/inclinato l'mpu. A parer mio, il problema sembra essere hardware.
Com'è possibile? :o Vi è mai capitato qualcosa di simile?
La stessa cosa accade se "punzecchio" con il puntale del tester, il pin 5V del MPU.
Il mio obiettivo è quello di creare un circuito affidabile, e non che basti soffiarci sopra per crea un falso
positivo.
#include <TinyWireS.h>
#include <TinyWireM.h>
const byte MPU = 0x68;//0x53
const byte pin_allarme = 1;
const byte I1 = 3;
const byte I2 = 4;
unsigned long int t_acce, t_attesa, t_suono;
char comando[9] = {0};
unsigned int k = 0;
int att_x = 0;
int att_y = 0;
int AcX = 0;
int AcY = 0;
uint8_t val_pin3 = 0, val_pin4 = 0;
bool allerta = false, attesa = false;
void setup()
{
TinyWireM.begin();
TinyWireM.beginTransmission(MPU);
TinyWireM.send(0x6B);
TinyWireM.send(0);
TinyWireM.endTransmission();
pinMode(I1,INPUT);
pinMode(I2,INPUT);
pinMode(pin_allarme,OUTPUT);
digitalWrite(pin_allarme,LOW);
t_acce = t_attesa = t_suono = 0;
}
void loop()
{
val_pin3 = digitalRead(I1);
val_pin4 = digitalRead(I2);
if( (val_pin3 == 1) && (val_pin4 == 1) )
{
if(!allerta && !attesa)
{
attesa = true;
t_attesa = millis();
}
}
else if( (val_pin3 == 0) && (val_pin4 == 0) )
{
allerta = attesa = false;
digitalWrite(pin_allarme,LOW);
}
if(attesa && (t_attesa + 8000 < millis()))
{
if(!allerta)
{
salva_posizione();
allerta = true;
attesa = false;
t_attesa = millis();
}
}
else if(attesa)
{
if(millis() - t_suono > 2000)
{
t_suono = millis();
}
}
if(allerta && (millis() - t_acce > 700))
{
Motion();
if((AcX > (att_x + 30) || AcX < (att_x - 30) ) || (AcY > (att_y + 30) || AcY < (att_y - 30)) )
{
digitalWrite(pin_allarme, HIGH);
}
t_acce = millis();
}
// This needs to be here
TinyWireS_stop_check();
delay(100);
}
void Motion()
{
TinyWireM.beginTransmission(MPU);
TinyWireM.send(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
TinyWireM.endTransmission();
TinyWireM.requestFrom(MPU,14);
AcX = (TinyWireM.receive()<<8|TinyWireM.receive()) / 55; // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY = (TinyWireM.receive()<<8|TinyWireM.receive()) / 55; // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
TinyWireM.receive()<<8|TinyWireM.receive(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
TinyWireM.receive()<<8|TinyWireM.receive(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
TinyWireM.receive()<<8|TinyWireM.receive(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
TinyWireM.receive()<<8|TinyWireM.receive(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
TinyWireM.receive()<<8|TinyWireM.receive(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
AcX = ((AcX < 0) ? -AcX : AcX);
AcY = ((AcY < 0) ? -AcY : AcY);
}
void salva_posizione()
{
delay(130);
TinyWireM.beginTransmission(MPU);
TinyWireM.send(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
TinyWireM.endTransmission();
TinyWireM.requestFrom(MPU,14);
att_x = (TinyWireM.receive()<<8|TinyWireM.receive()) / 55; // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
att_y = (TinyWireM.receive()<<8|TinyWireM.receive()) / 55; // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
TinyWireM.receive()<<8|TinyWireM.receive(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
TinyWireM.receive()<<8|TinyWireM.receive(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
TinyWireM.receive()<<8|TinyWireM.receive(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
TinyWireM.receive()<<8|TinyWireM.receive(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
TinyWireM.receive()<<8|TinyWireM.receive(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
att_x = ((att_x < 0) ? -att_x : att_x);
att_y = ((att_y < 0) ? -att_y : att_y);
}