Sto cercando una schedina di sensore laser da utilizzare con Arduino Nano per realizzare un distanziometro che misuri la distanza fino a 50/100 metri.
C'è qualcuno che mi può dare delle informazioni?
Grazie da Saverio.
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.
P.S.: Evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ...
Scusate la mia distrazione.
Saverio.
Prova a guardare QUI ... ci sono vari oggetti ... ma NON costano poco ...
Guglielmo
Grazie per l'informazione.
Una nuova domanda.
Posso collegare in parallelo 3 sensori con uscita I2C e con indirizzi diversi su A4 e A5 di Arduino? Esempio: Display LCD, Inclinometro e Distanziometro?
Grazie.
Si, certo, il bus I2C è un bus dove colleghi più oggetti, purché ciscuno abbia un suo indirizzo differente ... maggiori info QUI e QUI.
Guglielmo
Grazie mi hai tolto un grosso dubbio.
Ho tre programmi separati con 3 Arduino Nano, questi utilizzano un sensore ad ultrasuoni, un inclinometro e una bussola Tutti e tre funzionano bene.
Ora vorrei fonderli in un unico programma mantenendo i blocchi per una facile modifica.
Ho fatto dei tentativi ma senza riuscire a compilare il programma.
Di seguito inserisco lo schema a blocchi di come mi sembrava di poterlo fare. Scusate la forma elementare del tutto, ma sono un dilettante.
Raramente il merge di tre sketch in uno funziona senza errori.
Per potere dire di più dovrei vedere i tre programmi.
Puoi allegarli?
Ciao.
In generale, non si può semplicemente appiccicare insieme tre programmi, tanto più se non sono fatti bene. Bisogna lavorarci un po' e verificare che non interferiscano fra loro per i pin usati, velocità di esecuzione (per esempio, per uso disinvolto dei delay) e altro.
I programmi del distanziometro e dell'inclinometro li ho testati e funzionano mentre la bussola non l'ho ancora completato. Questi programmi li ho trovati in rete.
Avevo anche pensato di passare da un programma all'altro con un "goto" anche se non è visto di buon occhio.
Il display è comune per i tre programmi e gli stessi vanno a scrivere su di una riga diversa.
// Metro con Arduino nano e display I2C del 03/06/2023
//
// misura di una distanza con il sensore a ultrasuoni SRF05
// allarme acustico tramite buzzer con il superamento di soglie prefissate
// visualizzazione della distanza e dello stato del buzzer sul monitor seriale
//
//
// Inizializzazione dispay I2C
//
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
//
char rx; // Valore letto
int num=0; // numero di caratteri scritti nella riga
int riga=0; // numero di righe scritte
#define COLONNE 16
#define RIGHE 2
//
int t,d; // t=tempo, d=distanza
void setup()
{
//
//mySerial.print();
lcd.begin();
lcd.backlight();
//
// Pin controllo display
//
DDRD=(INPUT); // configura la porta D come ingresso
pinMode(A5,OUTPUT); // pin 24 - A5 Arduino per diplay (SCL)
pinMode(A4,INPUT); // pin 23 - A4 Arduinoper display (SDA)
//
// Inizializzazione messaggio su display
//
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" DISTANZIOMETRO");
delay(500);
//
Serial.begin(9600);
pinMode (5,INPUT); // pin echo
pinMode (6,OUTPUT); // pin trigger
pinMode (7,OUTPUT); // pin buzzer
Serial.println("");
Serial.println("Viene misurata la distanza tra sensore e oggetto");
Serial.println("se minore di 20 cm viene segnalata dal suono di un buzzer");
Serial.println("");
//
//Serial.print();
//
delay(1000); // ritardo iniziale
}
void loop ()
{
digitalWrite(6,LOW); // livello basso sul pin trigger
delayMicroseconds(2); // per 2 ms
digitalWrite(6,HIGH); // livello alto sul pin trigger
delayMicroseconds(10); // per 2 ms
digitalWrite(6,LOW); // livello basso sul pin trigger
t=pulseIn(5,HIGH); // comando per la misura del tempo
d=t/58; // calcolo della distanza
// visualizzazione dei dati sul monitor seriale
Serial.print("distanza");
Serial.print("\t");
Serial.print(d);
Serial.print("\t");
Serial.println("cm");
if(d>10 && d<20)
{
// se la distanza è compresa tra 10 cm e 20 cm
tone (7, 262, 500); // il buzzer suona a intermittenza
Serial.println("stato del buzzer: attivo con suono a intermittenza");
}
if(d<=10)
{
// se la distanza è minore o uguale a 10 cm
tone (7, 330, 2000); // il buzzer suona continuamente
Serial.println("stato del buzzer: attivo con suono continuo");
}
if(d>=20) // se la distanza supera i 20 cm
Serial.println("stato del buzzer: non attivo");
delay(2000); // ritardo tra due misure
//
// lcd.clear();
//
lcd.setCursor(0,1); // scrivi sulla secoda riga
lcd.print("Centimetri = ");
lcd.setCursor(13,1); // posizione dato sul display riga 2 posizione da 8
lcd.print(d); // visualizza su display distanza
delay(800);
}
// *********************************************************
/ 3 - Inclinometro senza uso della libreria 07/06/2023
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
#define COLONNE 20
#define RIGHE 4
#include <SPI.h>
#include <Wire.h>
#define MPU 0x68 // I2C address of the MPU-6050
double AcX, AcY, AcZ;
int Pitch, Roll;
void setup()
{
lcd.begin();
lcd.backlight();
lcd.clear();
// lcd.setCursor(0,0);
// lcd.print(" INCLINOMETRO");
delay(500);
Serial.begin(9600);
init_MPU(); // Inizializzazione MPU6050
}
void loop()
{
FunctionsMPU(); // Acquisisco assi AcX, AcY, AcZ.
Roll = FunctionsPitchRoll(AcX, AcY, AcZ); //Calcolo angolo Roll
Pitch = FunctionsPitchRoll(AcY, AcX, AcZ); //Calcolo angolo Pitch
Serial.print("Pitch: ");
Serial.print(Pitch);
Serial.print("\t");
Serial.print("Roll: ");
Serial.print(Roll);
Serial.print("\n");
delay(1000);
}
void init_MPU() {
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
delay(1000);
}
//Funzione per il calcolo degli angoli Pitch e Roll
double FunctionsPitchRoll(double A, double B, double C) {
double DatoA, DatoB, Value;
DatoA = A;
DatoB = (B * B) + (C * C);
DatoB = sqrt(DatoB);
Value = atan2(DatoA, DatoB);
Value = Value * 180 / 3.14;
return (int)Value;
}
//Funzione per l'acquisizione degli assi X,Y,Z del MPU6050
void FunctionsMPU()
{
Wire.beginTransmission(MPU);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // request a total of 14 registers
AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
lcd.clear(); // cancella seconda riga
lcd.setCursor(0,0);
lcd.print(" INCLINOMETRO");
lcd.setCursor(0,2); // scrivi sulla seconda riga
lcd.print(" X =");
lcd.setCursor(5,2); // scrivi X nella seconda riga
lcd.print(Pitch);
lcd.setCursor(10,2); // scrivi sulla terza riga
lcd.print(" Y =");
lcd.setCursor(15,2); // scrivi Y nella terza riga
lcd.print(Roll);
// lcd.setCursor(0,3); // scrivi sulla quarta riga
// lcd.print("Z =");
// lcd.setCursor(4,3); // scrivi Z nella quarta riga
// lcd.print(AcZ);
delay(1000);
}
// ******************************************
// Bussola con HMC 271
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include <Wire.h>
#include <HMC58X3.h>
HMC58X3 magn;
void setup(void)
{
Serial.begin(9600);
Wire.begin();
// no delay needed as we have already a delay(5) in HMC5843::init()
magn.init(false); // Dont set mode yet, we'll do that later on.
// Calibrate HMC using self test, not recommended to change the gain after calibration.
magn.calibrate(1, 32); // Use gain 1=default, valid 0-7, 7 not recommended.
// Single mode conversion was used in calibration, now set continuous mode
magn.setMode(0);
}
void loop()
{
int ix,iy,iz;
float fx,fy,fz;
delay(10);
// Get values, as ints and floats.
magn.getValues(&ix,&iy,&iz);
magn.getValues(&fx,&fy,&fz);
// also available HMC5843::getValues(float *xyz) you can pass to it an array of 3 floats
// Print int values
Serial.print("Ints x:");
Serial.print(ix);
Serial.print(",");
Serial.print(iy);
Serial.print(",");
erial.print(iz);
erial.print(",");
// Print float values
Serial.print(" Floats x:");
Serial.print(fx);
Serial.print(" y:");
Serial.print(fy);
Serial.print(" z:");
Serial.print(fz);
Serial.print(" Heading: ");
float heading = atan2(fy, fx);
if(heading < 0)
{
heading += 2 * M_PI;
}
Serial.println(heading * 180/M_PI);
// x and y axis are swapped above with respect to the above paper as our Z axis points to the sky while in the paper it points to the bottom
}
DDRD: tutte le porte all'accensione sono impostate come ingressi, quindi non serve impostare gli ingressi. INPUT, d'altra parte, è definito 0x0 in
pinMode A4, A5: per usare l'I2C si possono lasciare come ingressi, quindi non dichiarati.
_
lcd.clear();
lcd.setCursor(0,0);
all'inizio non servono.
_
tone (7, 262, 500); // il buzzer suona a intermittenza
Le pause dell'intermittenza dipendono dal tempo di esecuzione del loop!
_
tone (7, 330, 2000); // il buzzer suona continuamente
Suona continuamente perché si accavallano suoni della durata di 2 secondi ciascuno...
_
delay(2000); // ritardo tra due misure
Questo, appunto, rallenta tutto il loop, comprese le altre misure!
_
/ 3 - Inclinometro senza uso della libreria 07/06/2023
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
La libreria del display già l'hai inclusa all'inizio!
_
#define COLONNE 20
#define RIGHE 4
All'inizio le hai definite diversamente! E' un display 16x2 o 20x4?...
Insomma: ci sono un bel po' di cose da rivedere... Anzi: devi fare una struttura unica e poi inserire solo le funzioni che servono presenti nei tre programmi.
Seguiamo molto interessati
In realtà, ho caricato i tre programmi solo per descriverli ma non gli ho ancora collegati e caricati su Arduino.
Il cicalino non verrà usato.
La diversità dei due display è dovuta al fatto che li ho testato i due programmi separatamente con due tipi diversi.
Mi piacerebbe sapere se il collegamento tra i 3 programmi possono essere fatti come indicato nel primo schema a blocchi che ho postato. Naturalmente tolto gli errori.
Grazie.
Sì, l'impostazione è corretta. Puoi anche mettere i tre programmi in tre funzioni e visualizzare i risultati in ogni funzione, oppure visualizzare tutto in una quarta funzione.
Grazie per il conforto.
Farò delle prove ma sicuramente avrò ancora bisogno di voi.
Mi è andata bene. Ho inserito su Arduino nano due dei tre programmi, distanziometro e inclinometro. Funzionano bene.
Il terzo, la bussola provata da sola, non sono riuscito a testarlo poichè non me lo compila.
Cercherò di scoprire in cosa sbaglio e se non riesco chiederò il vostro prezioso aiuto.
Era previsto, ho ancora bisogno di voi.
Ho carica diversi programmi per la bussola con GY-271 trovati in rete, ma dopo averli compilati con successo, nel caricamento su Arduino mi da sempre un messaggio di errore che allego.
Sono imbranato, mi potete aiutare?
Dice solo che non risponde...
Hai impostato la porta sbagliata?
Il numero della porta è 5 e viene disposta automaticamente.
In realtà caricando gli altri due programmi sullo stesso Arduino vengono caricati.
Non sarà per caso un problema di librerie per il GY-271?
Quali sono i nomi delle librerie che devo essere caricate?