Il LiDAR è un metodo di telerilevamento che utilizza un raggio laser pulsante per misurare distanze.
Per realizzare il sistema di rilevamento per generare una nuvola di punti utilizzerò le seguenti tecnologie:
TFMini Plus Lidar
Primo test di funzionamento con Seriale P.C. e ARDUINO -FISHINO:
#include <SoftwareSerial.h>
SoftwareSerial Serial1(2,3); //
Serial1 PIN 2 RX (Verde) PIN 3 TX(Bianco)
int dist;
int strength;
float temprature;
int check;
int i;
int uart[9];
const int HEADER=0x59; void setup() {
Serial.begin(9600);
Serial1.begin(115200); // BIT RATE della Serial1 - connessione LiDAR con Arduino
}
void loop() {
if (Serial1.available()) {
if(Serial1.read() == HEADER) {
uart[0]=HEADER;
if (Serial1.read() == HEADER) {
uart[1] = HEADER;
for (i = 2; i < 9; i++) {
uart[i] = Serial1.read();
}
check = uart[0] + uart[1] + uart[2] + uart[3] + uart[4] + uart[5] + uart[6] +
uart[7];
if (uart[8] == (check & 0xff)){
dist = uart[2] + uart[3] * 256;
strength = uart[4] + uart[5] * 256;
temprature = uart[6] + uart[7] *256;
temprature = temprature/8 - 256;
Serial.print("distanza rilevata = ");
Serial.println(dist);
}
}
}
}
}
OK ... Funziona
Secondo test di funzionamento con LCD OLED :
#include <SoftwareSerial.h>
SoftwareSerial Serial1(2,3); // Serial1 PIN 2 RX (Verde) PIN 3 TX(Bianco)
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 0 // GPIO0
Adafruit_SSD1306 display(OLED_RESET);
int dist;
int strength;
float temprature;
int check;
int i;
int uart[9];
const int HEADER=0x59;
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Serial1.begin(115200); // BIT RATE della Serial1 - connessione LiDAR con Arduino
}
void loop() {
if (Serial1.available()) {
if(Serial1.read() == HEADER) {
uart[0]=HEADER;
if (Serial1.read() == HEADER) {
uart[1] = HEADER;
for (i = 2; i < 9; i++) {
uart[i] = Serial1.read();
}
check = uart[0] + uart[1] + uart[2] + uart[3] + uart[4] + uart[5] + uart[6] +
uart[7];
if (uart[8] == (check & 0xff)){
dist = uart[2] + uart[3] * 256;
strength = uart[4] + uart[5] * 256;
temprature = uart[6] + uart[7] *256;
temprature = temprature/8 - 256;
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(" DISTANZA");
display.println();
display.setTextSize(2);
display.print(dist);
display.println(" cm.");
display.display();
}
}
}
}
}
OK ... Funziona
N.B. CONTROLLARE SEMPRE IL COLORE DELLE CONNESSIONI DELLE BOBINE
Motore passo passo da 200 STEP
Driver Dual H -Bridge 2012 RobotBase
Dopo una giornata di ricerche,forse perchè datato, sono riuscito a farlo funzionare.
Motore passo passo :
IDE Arduino 1.8.12:
#include <Stepper.h>
#define pin_EA 2 // Definizione pin ENABLE Va messo HIGH o 1
#define pin_EB 4 // Definizione pin ENABLE Va messo HIGH o 1
// IDE: Arduino 1.8.12
//SCHEDA: MAKER UNO + o Arduino uno
//FILE :MOTORE_PASSO_PASSO2_27_DICEMBRE_2023
// Numero di step (passi) per effettuare una rotazione completa
const int stepPerRotazione = 200;
// Creazione dell’istanza dello Stepper
Stepper mioStepper(stepPerRotazione, 8, 9, 10, 11);
void setup()
{
pinMode(pin_EA, OUTPUT); //setto il pin come uscita
pinMode(pin_EB, OUTPUT); //setto il pin come uscita
// impostazione della rotazione a 20 rpm:
mioStepper.setSpeed(20);
// inizializzazione della porta seriale:
// Serial.begin(9600);
digitalWrite(pin_EA, HIGH); //setto il pin Segnale Alto 5 volt
digitalWrite(pin_EB, HIGH); //setto il pin Segnale Alto 5 volt
}
void loop()
{
// una rotazione in una direzione
//Serial.println("Rotazione oraria");
mioStepper.step(stepPerRotazione);
delay(500);
// una rotazione in una direzione
//Serial.println("Rotazione antioraria");
mioStepper.step(-stepPerRotazione);
delay(500);
}
Alimentazione della scheda con 6 Vcc.
Collegare la massa dei 6 volt della scheda con la massa di Arduino.
Parametri da tenere in considerazione: Periodo e Frequenza.
Il Periodo rappresenta il Tempo(s) che impiega un segnale( digitale o analogico) per compiere una oscillazione completa.
La Frequenza definisce il numero di volte che il segnale( digitale o analogico) si ripete in un secondo.
Bisogna tenere presente che:
Vedere grafici sottostanti.
Il periodo del segnale è pari a 20 ms
T = 1/f T = 1/50
Per facilitare il calcolo facciamo in modo che al denominatore compaia 1000
Moltiplichiamo il numeratore e denominatore per 20 ed avremo
T = 20/1000 Pertanto il periodo del segnale è pari a 20 ms
Con un aumento eccessivo della frequenza avremo una minore coppia ed una eventuale perdita del passo.
In questo caso:
T = 1/1250 l periodo del segnale è pari a 0.8 ms
Ritorniamo a noi.
Motore passo passo da 200 STEP, occorrono 200 impulsi per compiere un giro completo.
Es. pratico e considerazioni personali.
Motore che compie 60 giri al minuto, l'albero motore compie un giro in un secondo.
Significa che:
Con un periodo di 5 ms ho constatato che l'albero perde qualche passo.
Mi conviene avere un periodo,per essere sicuro, di 10 ms
E' opportuno utilizzare il numero i giri che siano dei sottomultipli di 60 ed evitare valori decimali.
Pertanto 60 - 30 - 15, ecc..
Se imposto una velocità pari a 30 giri al minuto
L'albero motore per effettuare un giro completo occorrono 2 secondi
Significa che:
T = 1/f T = 1/100
Per facilitarci il calcolo facciamo in modo che al denominatore compaia 1000
Moltiplichiamo il numeratore e denominatore per 10 ed avremo
T = 10/1000 Pertanto il periodo del segnale è pari a 10 ms
SPECIFICHE:
Nome: modulo driver motore a ponte doppio H
Modalità di funzionamento: Driver a ponte H (doppio)
Tensione logica: 5 v
Tensione di esercizio: 5 V - 35 V
Corrente logica: 0 mA-36 mA.
Corrente di azionamento: 2 a (ponte singolo MAX)
Temperatura di stoccaggio: da -20 °C a +135 °C.
Potenza massima: 25 w
Peso: 30 g
Dimensioni: 43 x 43 x 27 mm.
Alimentazione scheda driver di 6 Volt per evitare surriscaldamento del motore passo passo.
L'uscita da 5 Volt essendo stabilizzata alimenta l'Arduino Nano.
Per verificare la polarità delle uscite (A+ A- B+ B-) utilizzare il multimetro digitale in modalità :
Ricerca tensione in corrente continua, in questo caso la tensione è pari a circa 3.3 volt
// Inclusione della libreria
stopper
#include <Stepper.h>
// IDE: Arduino 1.8.12
//SCHEDA: MAKER UNO + Arduino uno e NANO
//FILE :MOTORE_PASSO_PASSO nano_9_gennaio 2024
// Numero di step (passi) per effettuare una rotazione completa
const int stepPerRotazione = 200;
// Creazione dell’istanza dello Stepper
Stepper mioStepper(stepPerRotazione, 10, 9, 8, 7);
void setup()
{
// impostazione della rotazione a 30 rpm:
mioStepper.setSpeed(30);
// inizializzazione della porta seriale:
// Serial.begin(9600);
}
void loop()
{
// una rotazione in una direzione
//Serial.println("Rotazione oraria");
mioStepper.step(stepPerRotazione);
delay(1000);
// una rotazione in una direzione
//Serial.println("Rotazione antioraria");
mioStepper.step(-stepPerRotazione);
delay(1000);
}
Funziona correttamente anche con i motori passo passo:
11HS12-0674S
42BYGHW811
continua...
CNC Shield V3 Scheda di Sviluppo impilata su FISHINO Rev.3
Posizione dei Pin digitali ed analogici sulla scheda:
Terzo test di funzionamento con SHIELD CNC - FISHINO e OLED e LIDAR:
#include <SoftwareSerial.h>
SoftwareSerial Serial1(9,10); // Serial1 PIN 9 RX (Verde) PIN
10 TX(Bianco)
LIDAR
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 0 // GPIO0
Adafruit_SSD1306 display(OLED_RESET);
int dist;
int strength;
float temprature;
int check;
int i;
int uart[9];
const int HEADER=0x59;
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Serial1.begin(115200); // BIT RATE della Serial1 - connessione LiDAR con Arduino
}
void loop() {
if (Serial1.available()) {
if(Serial1.read() == HEADER) {
uart[0]=HEADER;
if (Serial1.read() == HEADER) {
uart[1] = HEADER;
for (i = 2; i < 9; i++) {
uart[i] = Serial1.read();
}
check = uart[0] + uart[1] + uart[2] + uart[3] + uart[4] + uart[5] + uart[6] +
uart[7];
if (uart[8] == (check & 0xff)){
dist = uart[2] + uart[3] * 256;
strength = uart[4] + uart[5] * 256;
temprature = uart[6] + uart[7] *256;
temprature = temprature/8 - 256;
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(" DISTANZA");
display.println();
display.setTextSize(2);
display.print(dist);
display.println(" cm.");
display.display();
}
}
}
}
}
OK ... Funziona
Quarto test di funzionamento con SHIELD CNC - FISHINO e motori passo passo :
#define EN 8
//Direzione pin
#define X_DIR 5
#define Y_DIR 6
//Step pin
#define X_STP 2
#define Y_STP 3
int steps = 50; // Passi da effettuare
void setup() {
// Impostazione di pin
pinMode(X_DIR, OUTPUT); pinMode(X_STP, OUTPUT);
pinMode(Y_DIR, OUTPUT); pinMode(Y_STP, OUTPUT);
pinMode(EN, OUTPUT);
digitalWrite(EN, LOW);
}
void loop() {
for (int i = 0; i < steps; i++) {
digitalWrite(Y_DIR, HIGH); // rotazione oraria
digitalWrite(Y_STP, HIGH);
delay(1);
digitalWrite(Y_STP, LOW);
delay(1);
digitalWrite(X_DIR, HIGH); // rotazione oraria
digitalWrite(X_STP, HIGH);
delay(1);
digitalWrite(X_STP, LOW);
delay(1);
}
delay (2000);
}
Cod. prodotto: 8300 - CNCNANOSET (Futura Elettronica - Gallarate)
PIN: EN = 8 X_DIR = 2 X_STEP = 5 Y_DIR = 3 Y_STEP = 6 Z_DIR = 4 Z_STEP = 7
TEST di funzionamento (FULL STEP IDE 1.6.7 NANO - Old Bootloader):
Dopo varie peripezie elettroniche sono riuscito a far effettuare al motore passo 1/8 dello STEP:
Ho utilizzato il PIN 12 (messo HIGH) per attivare la funzione 1/8
Motore passo passo :
SHIELD realizzata personalmente, secondo le mie necessità, impilata su Arduino :
Vedi secondo test di funzionamento con LCD OLED :( programma realizzato con Fishino)
OK ... Funziona
DRV8825 Stepper Driver
Il driver regola la corrente che circola nelle bobine dello statore.
Durante il funzionamento dei motori passo passo non bisogna superare il valore di targa della corrente che circola negli avvolgimenti.
Una corrente superiore comporta un riscaldamento sia degli avvolgimenti che della carcassa di contenimento del motore.
La formula pratica per il driver A8825 è sintetizzata nella figura sottostante.
Per il nostro motore la Imax è pari a 0.67 A meno il 10% avremo 0.6 A.
Vref sarà uguale 0.6 / 2 Volt
Metodo pratico per la calibrazione :
Impilare correttamente i driver sulla shield (Riferimento PIN EN)
MULTIMETRO:
Cacciavite : Becco a coccodrillo al + Rotazione del Trimmer
Puntale della massa sul pin GND del driver A4988
Ruotare il TRIMMER fino a far comparire sull'LCD 0.295 Volt
Quinto test di funzionamento con SHIELD CNC - FISHINO -Motori STEP -LIDAR e OLED :
#define EN 8
//Direction pin
#define X_DIR 5
#define Y_DIR 6
//Step pin
#define X_STP 2
#define Y_STP 3
int steps = 50; // Passi da effettuare
//#include <SoftwareSerial.h>
//SoftwareSerial Serial1(9,10); // Serial1 PIN 9 RX (Verde) PIN 10 TX(Bianco)
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 0 // GPIO0
Adafruit_SSD1306 display(OLED_RESET);
int dist;
int strength;
float temprature;
int check;
int i;
int uart[9];
const int HEADER=0x59;
void setup() {
//Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Serial.begin(115200); // BIT RATE della Serial1 - connessione LiDAR con
Arduino
// Impostazione di pin
pinMode(X_DIR, OUTPUT); pinMode(X_STP, OUTPUT);
pinMode(Y_DIR, OUTPUT); pinMode(Y_STP, OUTPUT);
pinMode(EN, OUTPUT);
digitalWrite(EN, LOW);
}
void loop() {
if (Serial.available()) {
if(Serial.read() == HEADER) {
uart[0]=HEADER;
if (Serial.read() == HEADER) {
uart[1] = HEADER;
for (i = 2; i < 9; i++) {
uart[i] = Serial.read();
}
check = uart[0] + uart[1] + uart[2] + uart[3] + uart[4] + uart[5] + uart[6]
+ uart[7];
if (uart[8] == (check & 0xff)){
dist = uart[2] + uart[3] * 256;
strength = uart[4] + uart[5] * 256;
temprature = uart[6] + uart[7] *256;
temprature = temprature/8 - 256;
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(" DISTANZA");
display.println();
display.setTextSize(2);
display.print(dist);
display.println(" cm.");
display.display();
delay (200);
for (int i = 0; i < steps; i++) {
digitalWrite(Y_DIR, HIGH); // rotazione oraria
digitalWrite(Y_STP, HIGH);
delay(1);
digitalWrite(Y_STP, LOW);
delay(1);
digitalWrite(X_DIR, HIGH); // rotazione oraria
digitalWrite(X_STP, HIGH);
delay(1);
digitalWrite(X_STP, LOW);
delay(1);
}
delay (200);
}
}
}
}
}
N.B. E' necessario un aggiustamento del programma
VISICAD :Sistema CAD per la progettazione dei componenti di supporto
SOGI M1-250
FENIX 4 (Fresatrice realizzata dallo scrivente)
ANYCUBIC MEGA S
MATEMATICA: Le coordinate sferiche (XYZ) -(un pò di matematica non guasta)
Per determinare le coordinate 3D del punto P è necessario fare riferimento ai due piani cartesiani XZ e XY .
Con il piano cartesiano
Esempio pratico
Dati iniziali noti:
H = L x sin (28.125°) = 24.35 x 0.47139 = 11.478 m.
OM = L x cos (28.125°) = 24.35 x 0.88192 = 21.474 m.
Il segmento OM rappresenta la proiezione di L sul piano XY
MN(Y-) = OM x sin (28.8°) = 21.474 x 0,48175 = 10.345 m.
ON(X) = OM x cos (28.8°) = 21.474 x 0,87630 = 18.817 m.
Controllo effettuato del punto P con il CAD:
Le formule matematiche sopra esposte saranno utilizzate nel programma di Arduino
Spezzone del programma con simulazione senza Lidar (Funzione RANDOM della distanza)
Microstep 1/2 - Ad ogni impulso l'albero motore ruota di 0.9°
400 impulsi per far effettuare al motore passo passo 1 giro completo.
Importazione nuvola di punti in VISICAD
Caratteristica del file TXT della nuvola di punti.
Il file completo è costituito da blocchi di 240 (definiti arbitrariamente) punti XYZ
240
intestazione del gruppo di punti
11.63 73.08 0.00
12.37 73.97 0.00
12.77 72.89 0.00
13.53 73.77 0.00
13.92 72.68 0.00
14.68 73.55 0.00
15.26 73.43 0.00
15.62 72.33 0.00
.............................
240 intestazione
del gruppo di punti
11.63 73.08 3.48
12.20 72.99 3.48
12.77 72.89 3.48
13.53 73.77 3.48
14.11 73.66 3.48
14.49 72.57 3.48
15.06 72.45 3.48
15.84 73.31 3.48
.............................
Importa e unisce automaticamente gruppi di 240 punti con una curva.
Ottengo tante curve di livello a Z costanti quanti sono i gruppi presenti nel file TXT. .
Poi personalmente unisco le curve, a coppia, ed ottengo la superficie scansionata della grotta in 3D
ESP32
Codificazione dei PIN con i ripettivi GPIO.
Per motivi grafici sono stati eliminati alcuni componenti elettronici dal circuito originale.
ESP32 UTILIZZATO (30 pin)
N.B. Non bisogna confondere la numerazione dei PIN dell'ESP con la numerazione dei GPIO.
N.B.Nella programmazione si utilizza la numerazione dei GPIO.
N.B. I pin GPIO non tollerano i 5 volt , sono 3,3 volt per logica ALTA (1).
PIN GPIO:
OLED 21 e 22
LIDAR 16 e 17 RXD2 e TXD2 (Verde e Bianco)
Secondo test di funzionamento con ESP32 LIDAR e LCD OLED:
// File:LIDAR_ESP32_18_GIUGNO_2022
// con oled 164x48
#include <Wire.h>
#include "SSD1306.h"
SSD1306 display(0x3c, 21, 22);
#define RXD2 16
#define TXD2 17
int dist; /*—actual distance measurements of LiDAR—*/
int strength; /*—signal strength of LiDAR */
float temprature;
unsigned char check; /*—save check value */
int i;
unsigned char uart[9]; /*—save data measured by LiDAR */
const int HEADER=0x59; /*—frame header of data package */
int rec_debug_state = 0x01;//receive state for frame
void setup() {
delay(2000);
Serial.begin(115200);
Serial.println("\nBenewake TFmini-PLUS UART LiDAR Program");
Serial2.begin(115200);
//******************************************************************
//Next section includes processing LiDARs Data and printing it to the terminal.
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
}
void loop() {
Get_Lidar_data();
}
void Get_Lidar_data(){
// display.init();
display.clear();
if (Serial2.available()) //check if serial port has data input
{
if(rec_debug_state == 0x01)
{ //the first byte
uart[0]=Serial2.read();
if(uart[0] == 0x59)
{
check = uart[0];
rec_debug_state = 0x02;
}
}
else if(rec_debug_state == 0x02)
{//the second byte
uart[1]=Serial2.read();
if(uart[1] == 0x59)
{
check += uart[1];
rec_debug_state = 0x03;
}
else{
rec_debug_state = 0x01;
}
}
else if(rec_debug_state == 0x03)
{
uart[2]=Serial2.read();
check += uart[2];
rec_debug_state = 0x04;
}
else if(rec_debug_state == 0x04)
{
uart[3]=Serial2.read();
check += uart[3];
rec_debug_state = 0x05;
}
else if(rec_debug_state == 0x05)
{
uart[4]=Serial2.read();
check += uart[4];
rec_debug_state = 0x06;
}
else if(rec_debug_state == 0x06)
{
uart[5]=Serial2.read();
check += uart[5];
rec_debug_state = 0x07;
}
//Benewake
else if(rec_debug_state == 0x07)
{
uart[6]=Serial2.read();
check += uart[6];
rec_debug_state = 0x08;
}
else if(rec_debug_state == 0x08)
{
uart[7]=Serial2.read();
check += uart[7];
rec_debug_state = 0x09;
}
else if(rec_debug_state == 0x09)
{
uart[8]=Serial2.read();
if(uart[8] == check)
{
dist = uart[2] + uart[3]*256;//the distance
strength = uart[4] + uart[5]*256;//the strength
temprature = uart[6] + uart[7] *256;//calculate chip temprature
temprature = temprature/8 - 256;
Serial.print("dist = ");
Serial.print(dist); //output measure distance value of LiDAR
Serial.print('\n');
//Benewake
Serial.print("strength = ");
Serial.print(strength); //output signal strength value
Serial.print('\n');
Serial.print("\t Chip Temprature = ");
Serial.print(temprature);
Serial.println(" celcius degree"); //output chip temperature of Lidar
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_16);
display.drawString(0, 0, "DISTANZA cm. ");
display.setFont(ArialMT_Plain_24);
String myStr;
myStr = String(dist);
display.drawString(32, 28, myStr);
display.display();
while(Serial2.available()){Serial2.read();}
}
rec_debug_state = 0x01;
}
}
}
Questo è il risultato
N.B. CONTROLLARE SEMPRE IL COLORE DELLE CONNESSIONI DELLE BOBINE
Motore passo passo da 200 STEP
Driver Dual H -Bridge 2012 RobotBase
Dopo una giornata di ricerche,forse perchè datato, sono riuscito a farlo funzionare.
Motore passo passo :
IDE Arduino 1.8.12:
#include <Stepper.h>
#define pin_EA 2 // Definizione pin ENABLE Va messo HIGH o 1
#define pin_EB 4 // Definizione pin ENABLE Va messo HIGH o 1
// IDE: Arduino 1.8.12
//SCHEDA: MAKER UNO + o Arduino uno
//FILE :MOTORE_PASSO_PASSO2_27_DICEMBRE_2023
// Numero di step (passi) per effettuare una rotazione completa
const int stepPerRotazione = 200;
// Creazione dell’istanza dello Stepper
Stepper mioStepper(stepPerRotazione, 8, 9, 10, 11);
void setup()
{
pinMode(pin_EA, OUTPUT); //setto il pin come uscita
pinMode(pin_EB, OUTPUT); //setto il pin come uscita
// impostazione della rotazione a 20 rpm:
mioStepper.setSpeed(20);
// inizializzazione della porta seriale:
// Serial.begin(9600);
digitalWrite(pin_EA, HIGH); //setto il pin Segnale Alto 5 volt
digitalWrite(pin_EB, HIGH); //setto il pin Segnale Alto 5 volt
}
void loop()
{
// una rotazione in una direzione
//Serial.println("Rotazione oraria");
mioStepper.step(stepPerRotazione);
delay(500);
// una rotazione in una direzione
//Serial.println("Rotazione antioraria");
mioStepper.step(-stepPerRotazione);
delay(500);
}
Alimentazione della scheda con 6 Vcc.
Collegare la massa dei 6 volt della scheda con la massa di Arduino.
Parametri da tenere in considerazione: Periodo e Frequenza.
Il Periodo rappresenta il Tempo(s) che impiega un segnale( digitale o analogico) per compiere una oscillazione completa.
La Frequenza definisce il numero di volte che il segnale( digitale o analogico) si ripete in un secondo.
Bisogna tenere presente che:
Vedere grafici sottostanti.
Il periodo del segnale è pari a 20 ms
T = 1/f T = 1/50
Per facilitare il calcolo facciamo in modo che al denominatore compaia 1000
Moltiplichiamo il numeratore e denominatore per 20 ed avremo
T = 20/1000 Pertanto il periodo del segnale è pari a 20 ms
Con un aumento eccessivo della frequenza avremo una minore coppia ed una eventuale perdita del passo.
In questo caso:
T = 1/1250 l periodo del segnale è pari a 0.8 ms
Ritorniamo a noi.
Motore passo passo da 200 STEP, occorrono 200 impulsi per compiere un giro completo.
Es. pratico e considerazioni personali.
Motore che compie 60 giri al minuto, l'albero motore compie un giro in un secondo.
Significa che:
Con un periodo di 5 ms ho constatato che l'albero perde qualche passo.
Mi conviene avere un periodo,per essere sicuro, di 10 ms
E' opportuno utilizzare il numero i giri che siano dei sottomultipli di 60 ed evitare valori decimali.
Pertanto 60 - 30 - 15, ecc..
Se imposto una velocità pari a 30 giri al minuto
L'albero motore per effettuare un giro completo occorrono 2 secondi
Significa che:
T = 1/f T = 1/100
Per facilitarci il calcolo facciamo in modo che al denominatore compaia 1000
Moltiplichiamo il numeratore e denominatore per 10 ed avremo
T = 10/1000 Pertanto il periodo del segnale è pari a 10 ms
SPECIFICHE:
Nome: modulo driver motore a ponte doppio H
Modalità di funzionamento: Driver a ponte H (doppio)
Tensione logica: 5 v
Tensione di esercizio: 5 V - 35 V
Corrente logica: 0 mA-36 mA.
Corrente di azionamento: 2 a (ponte singolo MAX)
Temperatura di stoccaggio: da -20 °C a +135 °C.
Potenza massima: 25 w
Peso: 30 g
Dimensioni: 43 x 43 x 27 mm.
Alimentazione scheda driver di 6 Volt per evitare surriscaldamento del motore passo passo.
L'uscita da 5 Volt essendo stabilizzata alimenta l'Arduino Nano.
Per verificare la polarità delle uscite (A+ A- B+ B-) utilizzare il multimetro digitale in modalità :
Ricerca tensione in corrente continua, in questo caso la tensione è pari a circa 3.3 volt
// Inclusione della libreria
stopper
#include <Stepper.h>
// IDE: Arduino 1.8.12
//SCHEDA: MAKER UNO + Arduino uno e NANO
//FILE :MOTORE_PASSO_PASSO nano_9_gennaio 2024
// Numero di step (passi) per effettuare una rotazione completa
const int stepPerRotazione = 200;
// Creazione dell’istanza dello Stepper
Stepper mioStepper(stepPerRotazione, 10, 9, 8, 7);
void setup()
{
// impostazione della rotazione a 30 rpm:
mioStepper.setSpeed(30);
// inizializzazione della porta seriale:
// Serial.begin(9600);
}
void loop()
{
// una rotazione in una direzione
//Serial.println("Rotazione oraria");
mioStepper.step(stepPerRotazione);
delay(1000);
// una rotazione in una direzione
//Serial.println("Rotazione antioraria");
mioStepper.step(-stepPerRotazione);
delay(1000);
}
Funziona correttamente anche con i motori passo passo:
11HS12-0674S
42BYGHW811
continua...