test di VERIFICA CON OSCILLOSCOPIO
Applicazioni personali didattiche
Si utilizzano 2 moduli:
Configurazione dei moduli
Un modulo posizionato sul:
Prima verifica pratica: il duty cycle dei segnali di comando della trasmittente
Per questa esercitazione utilizzerò :
Funzionamento vedere link: FREQUENZA - PWM -PERIODO - DUTY CYCLE oscilloscopio digitale-Arduino-Servo
Ho effettuato il BINDING (riconoscimento) con la Ricevente FS -IA10B .
Set a disposizione
Collegamenti effettuati:
FISHINO - PIN 2(azzurro) ==> Ricevente CH1 PIN 3(bianco) ==> Ricevente CH2
Alimento la ricevente 5 Volt collegando il + e il - ad un qualsiasi pin della rispettiva linea (vedi foto sopra)
Test precedente con BINDING ricevente a 6 canali:
Collegamenti effettuati:
ARDUINO PIN 2 3 >>> Ricevente FS-IA6 CH1 - CH2
Conoscendo la funzionalità dei servi utilizzerò ARDUINO per una verifica dei segnali della trasmittente.
Il segnale della Trasmittente prevede un impulso che si ripete ogni 20 ms, corrispondente ad una frequenza di 50 Hz.
La durata della larghezza del segnale alto all'interno di un impulso(PERIODO), determina una funzione specifica della meccanismo elettronico a cui è rivolto.
Es. per un Servo, se l'ampiezza dell'impulso alto, ripetitivo, è pari a:
La curiosità è soddisfatta: I segnali della trasmittenti hanno un Periodo di 20 ms ==> Frequenza 50 Hz
PROGRAMMA PER RILEVARE IL duty cycle della Trasmittente/Ricemente
POSIZIONE CENTRALE DELLO STICK:
Canale 2° tutto in posizione superiore:
Canale 2° tutto in posizione inferiore:
Lo stick del Canale 1 (movimento orizzontale):
La larghezza dell'impulso durante lo spostamento orizzontale di decrementa(verso sx) o aumenta(verso dx) a seconda della posizione.
Il multimetro DIGITAL MORPILOT mi permette di rilevare la Frequenza ed il duty cycle, ecco la modalità pratica.
Opero con il canale 1. Frequenza rilevata 50 Hz
In elettronica si utilizza anche il duty cycle che rappresenta, in valori percentuali, il rapporto tra la durata del segnale "alto" ed il periodo.
Es.: duty cycle = (1.5 ms/20 ms) x 100 = 7.5 % duty cycle = (2 ms /20 ms) x100 = 10 % duty cycle = (1 ms /20 ms)x100 = 5 %
La curiosità è soddisfatta: I segnali della trasmittenti hanno un Periodo di 20 ms ==> Frequenza 50 Hz
Ecco un programma completo diverso dal precedente:
permette di rilevare Frequenza, Ampiezza del segnale ON e relativo Duty Cycle.
Opero con il canale 2^ (per una migliore manovrabilità) e si utilizza il PIN 7 di Fishino (va bene Arduino, Nano,..)
POSIZIONE CENTRALE DELLO STICK: circa 1.5 ms
Canale 2° tutto in posizione superiore: circa 2 ms
Canale 2° tutto in posizione inferiore: circa 1 ms
Lo stick del Canale 1 (movimento orizzontale):
Questo è tutto.....
PRONTO PER I TEST operiamo sul canale 2
Collegamento oscilloscopio ricevente FlySky:
Impostare il valore del SEC/DIV su 1 ms - ogni quadretto(orizzontale) è uguale a 1 ms
Movimentare lo stick del canale 2 sulla trasmittente.
Posizione centrale duty cycle 7.5% x 20 ms larghezza dell'impulso alto è pari a 1.5 ms
Posizione in alto duty cycle 10% x 20 ms larghezza dell'impulso alto è pari a 2 ms
Posizione in basso duty cycle 5% x 20 ms larghezza dell'impulso alto è pari a 1 ms
A differenza degli altri stick il Trottle - Acceleratore -Spinta (canale CH3), al suo rilascio, non ritorna automaticamente nella posizione centrale.
Controlla la potenza erogata dai motori aumentando o diminuendo il numero di giri.
I motori sono collegati alle eliche ed il throttle ne controlla direttamente la spinta.
Il throttle può essere paragonato al movimento lineare di un tipico resistore lineare:
Questo è il risultato:
Fatto questo iniziamo a progettare il guanto con i moduli.
Trasmissione/ricezione angolare del perno di un servomeccanico.
Primo test didattico da effettuare:(distanza di circa 5 km.)
Ruotando il perno del potenziometro vario la posizione angolare del perno del servo (0° - 180°)
Test di funzionamento.
I programmi proposti , necessitano di "aggiustamenti" di visualizzazione su OLED e programmazione.
Programma di TRASMISSIONE:
//FILE:INVIO_POSIZIONE CON POTENZIOMETRO PER
SERVO_16_7_2021
//SCHEDA Hardware: SX1276 V2 Lora ESP32 LX6 Dual-Core
//0.96" Blue OLED Bluetooth WiFi Kit 32 Modulo CP2012 868MHZ-915MHz
//SCHEDA IDE: TTGO LoRa32-OLED v2.1.6
//IDE:Arduino 1.8.14
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include "SSD1306.h"
#define SCK 5 // GPIO5 -- SX1278's SCK
#define MISO 19 // GPIO19 -- SX1278's MISO
#define MOSI 27 // GPIO27 -- SX1278's MOSI
#define SS 18 // GPIO18 -- SX1278's CS
#define RST 14 // GPIO14 -- SX1278's RESET
#define DI0 26 // GPIO26 -- SX1278's IRQ(Interrupt Request)
#define BAND 433E6
static const int potentiometerPin = 12;// pin printed as G12 or 12
int servoPosition =0;
SSD1306 display(0x3c, 4, 15);
String rssi = "RSSI --";
String packSize = "--";
String packet ;
void setup() {
pinMode(16,OUTPUT);
digitalWrite(16, LOW); // set GPIO16 low to reset OLED
delay(50);
digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high
Serial.begin(115200);
while (!Serial);
Serial.println();
Serial.println("LoRa Sender Test");
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(SS,RST,DI0);
if (!LoRa.begin(433E6)) {
Serial.println("Starting LoRa failed!");
while (1);
}
//LoRa.onReceive(cbk);
// LoRa.receive();
Serial.println("init ok");
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
delay(1500);
}
void loop() {
int servoPosition = map(analogRead(potentiometerPin), 0, 4096, 0, 180);
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_10);
display.drawString(0, 0, "POSIZIONE GRADI: ");
display.drawString(96, 0, String( servoPosition) );
Serial.println(String(servoPosition));
display.display();
// send packet
LoRa.beginPacket();
//LoRa.print("hello ");
LoRa.print(servoPosition);
LoRa.endPacket();
// wait for a second
}
Programma di RICEZIONE:
//
FILE:RICEZIONE_POSIZIONE_CON_POTENZIOMETRO_CON_ SERVO_ 16_7_2021
//SCHEDA Hardware: DollaTek LORA32 V2.0 433MHz ESP32 Lora OLED 0.96"
//SD Card Display Blu modulo WiFi Bluetooth con Antenna
//SCHEDA IDE: TTGO LoRa32-OLED v2.1.6
//IDE:Arduino 1.8.14
// Scheda SD non abilitata è stato inserito OLED SUPPLEMENTARE
#include <Servo_ESP32.h>
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include "SSD1306.h"
#define SCK 5 // GPIO5 -- SX1278's SCK
#define MISO 19 // GPIO19 -- SX1278's MISO
#define MOSI 27 // GPIO27 -- SX1278's MOSI
#define SS 18 // GPIO18 -- SX1278's CS
#define RST 14 // GPIO14 -- SX1278's RESET
#define DI0 26 // GPIO26 -- SX1278's IRQ(Interrupt Request)
#define BAND 433E6
SSD1306 display(0x3c, 21, 22);
// OLED SDA 21 SCL 22
//String rssi = "RSSI --";
static const int servoPin = 23; // pin printed as G14 or 14
Servo_ESP32 servo1;
String packSize = "--";
String packet ;
void loraData(){
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_10);
// display.drawString(0 , 15 , "Received "+ packSize + " bytes");
display.drawStringMaxWidth(0 , 26 , 128, packet);
// display.drawString(0, 0, rssi);
display.display();
// Serial.println(rssi);
}
void cbk(int packetSize) {
packet ="";
packSize = String(packetSize,DEC);
for (int i = 0; i < packetSize; i++) { packet += (char) LoRa.read(); }
//rssi = "RSSI " + String(LoRa.packetRssi(), DEC) ;
loraData();
}
void setup() {
servo1.attach(servoPin);
pinMode(16,OUTPUT);
digitalWrite(16, LOW); // set GPIO16 low to reset OLED
delay(50);
digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high、
Serial.begin(115200);
while (!Serial);
Serial.println();
Serial.println("LoRa Receiver Callback");
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(SS,RST,DI0);
if (!LoRa.begin(433E6)) {
Serial.println("Starting LoRa failed!");
while (1);
}
//LoRa.onReceive(cbk);
LoRa.receive();
Serial.println("init ok");
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
delay(1500);
}
void loop() {
int packetSize = LoRa.parsePacket();
Serial.print("packet ");
Serial.println(packet);
int pos = packet.toInt();
Serial.println(pos);
//int servoPosition = map( (int(pos)), 0, 4096, 0, 180);
servo1.write(pos);
Serial.print("POSIZIONE ");
Serial.println(pos);
// Serial.println(servoPosition);
delay(20);
//Serial.println(packetSize);
if (packetSize) { cbk(packetSize); }
delay(10);
}
TEST di accensione di un LED distante circa 4-5 km dalla trasmittente.
PIN 12 sulla Trasmittente PIN 13 sulla Ricevente
Continua.....