In alcuni casi, per esempio copiare tutti i file mp3 da una collezione, puo' essere utile un comando che cerchi in automatico tutti i file con una determinata estensione e li metta tutti in una directory senza rispettare l'albero delle directory originario.
Tale operazione puo' essere fatta con un solo comando
find . -name "*.mp3" -type f -exec cp {} ../destinazione/ \;
(attenzione allo spazio tra l'ultima slash e backslah)
mercoledì 7 ottobre 2015
martedì 6 ottobre 2015
Ibernazione Xbee
In questo esempio viene mostrato come impostare la modalita' di ibernazione di un modulo Xbee utilizzando un pin comandato da Arduino
Per prima cosa si deve procedere ad una modifica hardware sullo shield Xbee saldando un connettore da piedino 9 dello Xbee e portandolo dentro la porta D9 di Arduino
Se il pin 9 di Xbee si trova nello stato low (ground) viene abilitata la trasmissione/ricezione del modulo, se il pin 9 si trova nello stato high (che per Xbee vuol dire 3.3 V !!) la radio viene spenta
Visto che su Arduino le uscite digitali sono a 5 V (e contrariamente a quello che viene citato qui che non ci sono problemi ad alimentare un piedino a 3.3V con un tensione da 5V) lo sketch Arduino utilizza la modalita' PWM del pin D9 di Arduino per impostare un corrente di 3.3 V
Dal punto di vista software bisogna configurare XBee con XCTU a funzionare come End Device (si puo' fare questa modificando solo modificando il firmware mediante Update Firmware) e modificando i valori di Serial Interfacing/D7 DIO7 Configuration su 0 Disable ed impostando SM ad 1 (Pin Wake Mode)
----------------------------------------------------------------------
#define XBEE_SLEEP 9
void setup() {
//setta il pin 9 come controllo dello sleep di XBEE
pinMode(XBEE_SLEEP,OUTPUT);
analogWrite(XBEE_SLEEP,0);
}
void loop() {
analogWrite(XBEE_SLEEP,168); //spenge XBEE, 3.3V PWM
delay(sleep_time); //tempo di standby
analogWrite(XBEE_SLEEP,0); //risveglia XBEE
----------------------------------------------------------------------
lunedì 5 ottobre 2015
Configurazione moduli XBee
Per impostare un modulo Xbee si possono utilizzare vari dispositivi.
Il primo passo e' pero' trovare un socket che permetta di connettere il modulo Xbee. A causa della distanza dei piedini non e' possibile inserire Xbee su una breadboard standard
Utilizzo di Arduino
Si puo' utilizzare una Arduino come programmatore di XBee ponticellando i pin RST e GND (cio' esclude il collegamento del processore a bordo dell'Arduino) e collegando i pin TX-TX ed RX-RX tra Arduino e Xbee (di solito si usa collegare incrociando TX ed RX ma in questo caso e' giusto cosi')
FOCA Board
Una soluzione a basso costo (meno di 10 euro) e' quello di utilizzare una FOCA Board . Da notare l'orientamento del modulo con l'antenna in direzione della USB (sulla schedina non sono riportate indicazioni molto chiari su quale sia la numerazione dei pin). Importante: prima di connettere la corrente sincerarsi che l'interruttore/selettore bianco sulla Foca Board sia impostato su 3.3 V
XBee Explorer Usb
Simile alla FOCA Board ma decisamente piu' costosa (circa 30 euro) c'e' la XBee Explorer. Le indicazioni dei pin sono molto chiare
Funduino Xbee
Per terminare c'e' il modulo Xbee di Funduino (che sul mercato cinese si trova anche a 5 euro)
Per orientare la Xbee basta seguire il disegno stampato sulla piastra (l'antenna e' dalla parte opposta alla porta USB)
Il primo passo e' pero' trovare un socket che permetta di connettere il modulo Xbee. A causa della distanza dei piedini non e' possibile inserire Xbee su una breadboard standard
Utilizzo di Arduino
Si puo' utilizzare una Arduino come programmatore di XBee ponticellando i pin RST e GND (cio' esclude il collegamento del processore a bordo dell'Arduino) e collegando i pin TX-TX ed RX-RX tra Arduino e Xbee (di solito si usa collegare incrociando TX ed RX ma in questo caso e' giusto cosi')
FOCA Board
Una soluzione a basso costo (meno di 10 euro) e' quello di utilizzare una FOCA Board . Da notare l'orientamento del modulo con l'antenna in direzione della USB (sulla schedina non sono riportate indicazioni molto chiari su quale sia la numerazione dei pin). Importante: prima di connettere la corrente sincerarsi che l'interruttore/selettore bianco sulla Foca Board sia impostato su 3.3 V
XBee Explorer Usb
Simile alla FOCA Board ma decisamente piu' costosa (circa 30 euro) c'e' la XBee Explorer. Le indicazioni dei pin sono molto chiare
Funduino Xbee
Per terminare c'e' il modulo Xbee di Funduino (che sul mercato cinese si trova anche a 5 euro)
Per orientare la Xbee basta seguire il disegno stampato sulla piastra (l'antenna e' dalla parte opposta alla porta USB)
Leggere la porta seriale da Linux
Alcune volte puo' essere utile leggere il flusso da una porta seriale in Linux direttamente da shell senza passare da Minicom o simili
Per esempio si puo' leggere il flusso seriale da una Arduino (che di solito e'configurata come 9600 8N1)
Per prima cosa si devono impostare le giuste configurazione per la porta seriale (una Arduino collegata via USB ad una Linux Box di solito si presenta su /dev/ttyACM0
dopo di cio' e' sufficiente
cat /dev/ttyACM0
per vedere il flusso dati
venerdì 2 ottobre 2015
Soddisfazioni
Quando un amico/cliente ti manda un SMS come quello sotto riportato ti rendi conto che il tuo lavoro non e' proprio inutile (sorvoliamo sull'italiano....)
giovedì 1 ottobre 2015
Ricevitore GPS per Arduino
Sto lavorando per interfacciare Arduino con un ricevitori GPS e ne ho presi un paio, di prezzo nettamente differente, per delle prove
GY-NEO6MV2per un costo di circa una decina di euro si puo' acquistare il ricevitore GY-NEO6MV2.
Adafruit GPS Breakout
Ad un costo di circa 4 volte superiore (40 euro) si puo' trovare il modulo GPS Breakout di Adafruit che risulta essere di un'altra classe rispetto a GY-NEO6MV2.
E' disponibile un piedino per accendere o spengere il dispositivo, e' abilitata la ricezione dei segnali SBAS/EGNOS per il posizionamento DPGS, e' possibile variare il tipo di sentenze ricevute e la velocita' con cui vengono generate (da 100 milliHz a 10 Hz) e la velocita' della seriale.
Per l'uso con Arduino si puo' usare la libreria Adafruit-GPS-Library in cui sono contenuti vari esempi
C'e' da notare un bug nel firmware. Caricando lo sketch echo (che rimanda sulla seriale le stringhe NMEA del dispositivo) compaiono dei caratteri anomali
$PGTOP,11,2*6E
$PGTOP,11,2*6Equesti sono codici di programmazione del modulo MTK3339 e non dovrebbero essere presenti nel flusso NMEA (peraltro non c'e' modo di sopprimerli, si possono eliminare solo in postprocessing)
Il modulo viene riportato per avere una assorbimento di 20 mA in modalita' operativa e dalle mie prove tale valore risulta conforme al teorico
Di seguito il codice Arduino da poter usare con Gps Adafruit con impostata la richiesta della modalita' DPGS
----------------------------------------------------------------------
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
unsigned long delaytime=250;
SoftwareSerial mySerial(3, 2);
Adafruit_GPS GPS(&mySerial);
#define GPSECHO true
boolean usingInterrupt = false;
void useInterrupt(boolean);
void setup() {
Serial.begin(9600);
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate
GPS.sendCommand(PGCMD_ANTENNA);
//enable DPGS
GPS.sendCommand(PMTK_ENABLE_SBAS);
GPS.sendCommand(PMTK_ENABLE_WAAS);
useInterrupt(true);
delay(1000);
mySerial.println(PMTK_Q_RELEASE);
}
SIGNAL(TIMER0_COMPA_vect) {
char c = GPS.read();
#ifdef UDR0
//if (GPSECHO)
//if (c) UDR0 = c;
#endif
}
void useInterrupt(boolean v) {
if (v) {
OCR0A = 0xAF;
TIMSK0 |= _BV(OCIE0A);
usingInterrupt = true;
} else {
TIMSK0 &= ~_BV(OCIE0A);
usingInterrupt = false;
}
}
uint32_t timer = millis();
void loop() {
if (! usingInterrupt) {
char c = GPS.read();
//if (GPSECHO)
//if (c) Serial.print(c);
}
if (GPS.newNMEAreceived()) {
if (!GPS.parse(GPS.lastNMEA()))
return;
}
if (timer > millis()) timer = millis();
if (millis() - timer > 1000) {
timer = millis(); // reset the timer
//NOME DELLA STAZIONE
Serial.print("ST01-");
//GPS
Serial.print(GPS.hour,DEC);
Serial.print(":");
Serial.print(GPS.minute,DEC);
Serial.print(":");
Serial.print(GPS.seconds,DEC);
//Serial.print(".");
//Serial.print(GPS.milliseconds,DEC);
Serial.print(" ");
Serial.print(GPS.day, DEC); Serial.print('/');
Serial.print(GPS.month, DEC); Serial.print("/20");
Serial.print(GPS.year, DEC);
if (GPS.fix)
{
Serial.print("-");
Serial.print(GPS.latitude,4);
Serial.print("-");
Serial.print(GPS.lat);
Serial.print("-");
Serial.print(GPS.longitude,4);
Serial.print("-");
Serial.print(GPS.lon);
Serial.print("-");
Serial.print(GPS.HDOP,4);
Serial.print("-");
Serial.print((int)GPS.fixquality);
Serial.print("-");
Serial.print((int)GPS.satellites);
}
Serial.println();
}
}
-------------------------------------------
Il modulo puo' essere messo in stato di ibernazione con i comandi
GPS.standby()
GPS.wakeup()
Una Arduino Uno con il modulo GPS attivo consuma circa 20 mA mentre la stessa configurazione con il GPS in ibernazione scende al di sotto dei 10 mA
Ovviamente dopo aver riacceso il modulo, il sistema deve effettuare da zero il Fix GPS (e' quindi consigliabile inserire la batteria tampone per le effemeridi)
GY-NEO6MV2per un costo di circa una decina di euro si puo' acquistare il ricevitore GY-NEO6MV2.
Si tratta di un semplice dispositivo con 4 connessioni (VCC 2.7-5V, GND, TX ed RX). Non e' di fatto programmabile ed il modulo trasmette dati sulla seriale (9600, 8N1) in formato NMEA ad 1Hz
Per l'uso con Arduino si puo' usare la libreria TinyGPS
Avendo un cavo FTDI si puo' collegare direttamente il dispositivo al PC leggendo i dati NMEA direttamente in un emulatore di terminale
Adafruit GPS Breakout
Ad un costo di circa 4 volte superiore (40 euro) si puo' trovare il modulo GPS Breakout di Adafruit che risulta essere di un'altra classe rispetto a GY-NEO6MV2.
E' disponibile un piedino per accendere o spengere il dispositivo, e' abilitata la ricezione dei segnali SBAS/EGNOS per il posizionamento DPGS, e' possibile variare il tipo di sentenze ricevute e la velocita' con cui vengono generate (da 100 milliHz a 10 Hz) e la velocita' della seriale.
Per l'uso con Arduino si puo' usare la libreria Adafruit-GPS-Library in cui sono contenuti vari esempi
C'e' da notare un bug nel firmware. Caricando lo sketch echo (che rimanda sulla seriale le stringhe NMEA del dispositivo) compaiono dei caratteri anomali
$PGTOP,11,2*6E
$PGTOP,11,2*6Equesti sono codici di programmazione del modulo MTK3339 e non dovrebbero essere presenti nel flusso NMEA (peraltro non c'e' modo di sopprimerli, si possono eliminare solo in postprocessing)
Il modulo viene riportato per avere una assorbimento di 20 mA in modalita' operativa e dalle mie prove tale valore risulta conforme al teorico
Di seguito il codice Arduino da poter usare con Gps Adafruit con impostata la richiesta della modalita' DPGS
----------------------------------------------------------------------
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
unsigned long delaytime=250;
SoftwareSerial mySerial(3, 2);
Adafruit_GPS GPS(&mySerial);
#define GPSECHO true
boolean usingInterrupt = false;
void useInterrupt(boolean);
void setup() {
Serial.begin(9600);
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate
GPS.sendCommand(PGCMD_ANTENNA);
//enable DPGS
GPS.sendCommand(PMTK_ENABLE_SBAS);
GPS.sendCommand(PMTK_ENABLE_WAAS);
useInterrupt(true);
delay(1000);
mySerial.println(PMTK_Q_RELEASE);
}
SIGNAL(TIMER0_COMPA_vect) {
char c = GPS.read();
#ifdef UDR0
//if (GPSECHO)
//if (c) UDR0 = c;
#endif
}
void useInterrupt(boolean v) {
if (v) {
OCR0A = 0xAF;
TIMSK0 |= _BV(OCIE0A);
usingInterrupt = true;
} else {
TIMSK0 &= ~_BV(OCIE0A);
usingInterrupt = false;
}
}
uint32_t timer = millis();
void loop() {
if (! usingInterrupt) {
char c = GPS.read();
//if (GPSECHO)
//if (c) Serial.print(c);
}
if (GPS.newNMEAreceived()) {
if (!GPS.parse(GPS.lastNMEA()))
return;
}
if (timer > millis()) timer = millis();
if (millis() - timer > 1000) {
timer = millis(); // reset the timer
//NOME DELLA STAZIONE
Serial.print("ST01-");
//GPS
Serial.print(GPS.hour,DEC);
Serial.print(":");
Serial.print(GPS.minute,DEC);
Serial.print(":");
Serial.print(GPS.seconds,DEC);
//Serial.print(".");
//Serial.print(GPS.milliseconds,DEC);
Serial.print(" ");
Serial.print(GPS.day, DEC); Serial.print('/');
Serial.print(GPS.month, DEC); Serial.print("/20");
Serial.print(GPS.year, DEC);
if (GPS.fix)
{
Serial.print("-");
Serial.print(GPS.latitude,4);
Serial.print("-");
Serial.print(GPS.lat);
Serial.print("-");
Serial.print(GPS.longitude,4);
Serial.print("-");
Serial.print(GPS.lon);
Serial.print("-");
Serial.print(GPS.HDOP,4);
Serial.print("-");
Serial.print((int)GPS.fixquality);
Serial.print("-");
Serial.print((int)GPS.satellites);
}
Serial.println();
}
}
-------------------------------------------
Il modulo puo' essere messo in stato di ibernazione con i comandi
GPS.standby()
GPS.wakeup()
Una Arduino Uno con il modulo GPS attivo consuma circa 20 mA mentre la stessa configurazione con il GPS in ibernazione scende al di sotto dei 10 mA
Ovviamente dopo aver riacceso il modulo, il sistema deve effettuare da zero il Fix GPS (e' quindi consigliabile inserire la batteria tampone per le effemeridi)
Arduino con batteria Lipo e pannello solare
Gia' in precedenza avevo provato ad usare un pannello solare per alimentare Arduino ma stavolta per un progetto piu' serio avevo necessita' di un sistema di alimentazione a batteria ricaricabile a sua volta ricaricata da un pannello solare. La batteria permette di mantenere l'operativita' quando l'irraggiamento solare e' scarso od assente
Ho quindi impiegato un solar charger shield 2.2 (di Seedstudio) accoppiato ad una batteria Lipo da 3000 mAh ed un pannello solare da 100x80 mm da 1 W. Le connessioni sono tutte con JST 2.0
La batteria puo' essere ricaricata sia dal pannello solare che da una connessione microUsb
Lo shield ha anche la possibilita' di connettere il pin A0 per misurare la quantita' di energia residua nella batteria. Cio' si ottiene cortocircuitando due connettori R7 sulla scheda (vicino ad R8 e con a destra la sigla A0)
Piu' semplice a dirsi che a farsi....come si puo' vedere c'e' stata la necessita' di fare un ponticello con un cavo extra (in verde nella foto)
per ottenere il valore in Volt della carica istantanea della batteria si procede con il seguente codice. Da notare che il calcolo del voltaggio sul pin A0 non e' quello standard per passare dal Digital Number al voltaggio per i pin analogici su Arduino (viene inserito un fattore 2 di correzione); questo non e' un errore ed e' dovuto alla caratteristica dello shield
--------------------------------------------------
const int analogInPin = A0;
int BatteryValue = 0;
float outputValue = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
BatteryValue = analogRead(analogInPin);
outputValue = (float(BatteryValue)*5)/1023*2;
Serial.print(" voltage = ");
Serial.println(outputValue);
Serial.println("V \n");
delay(1000);
}
--------------------------------------------------
--------------------------------------------------
Un breve calcolo per calcolare il tempo di ricarica (dati il pannello solare da 1W/5V e la batteria da 3000 mAh, ovvero 3Ah)
Il pannello eroga 1W/5V = 0.2 A. Per la ricarica si divide 3Ah/0.2A e si ottiene il tempo di ricarica di 15 ore
Iscriviti a:
Post (Atom)
Debugger integrato ESP32S3
Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede nell'ID USB della porta Jtag. Nel modulo...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...