Ripartendo da questo post qui si studia l'interazione con lo User Button della STM32F446RE
Se l'utente preme lo User Button viene cambiato lo stato del led LD2
-------------------------------------------------------------
while (1)
{
if (!HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)) {
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
}
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
-------------------------------------------------------------
giovedì 28 febbraio 2019
mercoledì 27 febbraio 2019
Raspberry e Windows 10
E' di qualche giorno fa la notizia di poter installare Windows 10 (versione ARM) su Raspberry...in realta' gia' qualche anno fa Microsoft aveva rilasciato una versione di Windows per Raspeberry ma si trattava di una versione priva di desktop ed indirizzata all'IoT
Il progetto si trova a questo indirizzo http://jhanc.altervista.org/jargon/Intro.html ma diciamo che le cose sono partite subito un po' male ...l'installer non voleva saperne di funzionare
Dopo un po' di lettura del forum degli sviluppatori in cui venivano descritti errori e rimedi l'installazione e' andata a buon fine
ma il problema principale e' che la Raspberry con il solo desktop di Windows 10 e' sempre in picco con il processore sopra al 90% se non al 100%. Il sistema quindi non risponde ai comandi (se non molto lentamente). Non oso pensare quando l'utente inizia a fare girare un applicativo
In conclusione un progetto interessante ma piu' una curiosita' che non uno strumento da utilizzare
Il progetto si trova a questo indirizzo http://jhanc.altervista.org/jargon/Intro.html ma diciamo che le cose sono partite subito un po' male ...l'installer non voleva saperne di funzionare
Dopo un po' di lettura del forum degli sviluppatori in cui venivano descritti errori e rimedi l'installazione e' andata a buon fine
ma il problema principale e' che la Raspberry con il solo desktop di Windows 10 e' sempre in picco con il processore sopra al 90% se non al 100%. Il sistema quindi non risponde ai comandi (se non molto lentamente). Non oso pensare quando l'utente inizia a fare girare un applicativo
In conclusione un progetto interessante ma piu' una curiosita' che non uno strumento da utilizzare
Blink Led su STM32 Nucleo 64 con AC6 System Workbench
Non riuscendo ad installare una IDE funzionante su Linux sono passato a Windows e le cose sono migliorate (anche se non e' una passeggiata)
In questo esempio viene mostrato come lanciare un programma per far lampeggiare il led su una scheda STM32F446RE Nucleo 64 utilizzando STM32CubeMX per impostare il progetto di base, AC6 SystemWorkbench per compilare e debuggare il codice
Si installa la IDE AC6 System Workbench con la toolchain GCC da http://www.openstm32.org/HomePage. Si tratta di una versione di Eclipse con i plugin gia' installati e con GCC, GDB per Arm ed i driver STLink inclusi
In seguito si crea un nuovo progetto in STM32CubeMX
Si seleziona Start my project from STBoard, nella finestra di ricerca si digita Nucleo e si seleziona NUCLEO-F446RE. Nel caso in cui il firmware della scheda non sia mai utilizzato si dovra' scaricare (e' un pacchetto corposo)
Si fa doppio clic sulla foto della scheda e si risponde yes ad Initialize all peripherals.
Si va in Project Manager, si sceglie un nome per il progetto e nella ToolChain/IDE si indica SW4STM32.
Si apre in progetto e nel ciclo while (1) riga 99 si inserisce il codice. I progetti creati con STNM32CubeMX sono generati con le librerie HAL (un layer di astrazione sull'hardware...ci sono commenti discordanti sull'utilizzo di questo sistema)
---------------------------------------------------------
while (1)
{
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
---------------------------------------------------------
da STM32CubeMX si vede che la porta GPIO a cui e' collegato al porta denominata LD2_GPIO con il nome del pin denominato LD2_Pin
Il comando TooglePin cambia semplicemente lo stato del Pin (se e' attivo lo disattiva e l'ovvio contrario)
Si fa collega la scheda alla porta USB ed abbbiamo il programma in funzione, L'aspetto piu' interessante e' il fatto di poter eseguire un debug step by step del codice
Per concludere segnalo che il codice di base di STM32CubeMX abilita la porta seriale UART2. Per inviare messaggi sulla porta seriale via USB e' sufficiente
---------------------------------------------------------
char *msg = "Test\n\r";
In questo esempio viene mostrato come lanciare un programma per far lampeggiare il led su una scheda STM32F446RE Nucleo 64 utilizzando STM32CubeMX per impostare il progetto di base, AC6 SystemWorkbench per compilare e debuggare il codice
Si installa la IDE AC6 System Workbench con la toolchain GCC da http://www.openstm32.org/HomePage. Si tratta di una versione di Eclipse con i plugin gia' installati e con GCC, GDB per Arm ed i driver STLink inclusi
In seguito si crea un nuovo progetto in STM32CubeMX
Si seleziona Start my project from STBoard, nella finestra di ricerca si digita Nucleo e si seleziona NUCLEO-F446RE. Nel caso in cui il firmware della scheda non sia mai utilizzato si dovra' scaricare (e' un pacchetto corposo)
Si fa doppio clic sulla foto della scheda e si risponde yes ad Initialize all peripherals.
Si va in Project Manager, si sceglie un nome per il progetto e nella ToolChain/IDE si indica SW4STM32.
Si apre in progetto e nel ciclo while (1) riga 99 si inserisce il codice. I progetti creati con STNM32CubeMX sono generati con le librerie HAL (un layer di astrazione sull'hardware...ci sono commenti discordanti sull'utilizzo di questo sistema)
---------------------------------------------------------
while (1)
{
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
---------------------------------------------------------
da STM32CubeMX si vede che la porta GPIO a cui e' collegato al porta denominata LD2_GPIO con il nome del pin denominato LD2_Pin
Il comando TooglePin cambia semplicemente lo stato del Pin (se e' attivo lo disattiva e l'ovvio contrario)
Si fa collega la scheda alla porta USB ed abbbiamo il programma in funzione, L'aspetto piu' interessante e' il fatto di poter eseguire un debug step by step del codice
Per concludere segnalo che il codice di base di STM32CubeMX abilita la porta seriale UART2. Per inviare messaggi sulla porta seriale via USB e' sufficiente
---------------------------------------------------------
char *msg = "Test\n\r";
HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 0xFFFF);
---------------------------------------------------------
I parametri sono di default 115200 8N1 ma si possono modificare nella funzione MX_USART2_UART_Init contenuta in main.c
martedì 26 febbraio 2019
MBed IDE per STM32 Nucleo STM32F446RET6
Lo ammetto, per ora non sono riuscito ad installare una IDE locale per sviluppare su STM32 su Linux. Sono arrivato a compilare il codice con AC6 System Workbench ma non riesco a fare il debug per problemi con libopencm3 ed il server stlink
Usando l'IDE online per MbedOS le cose sono decisamente piu' lineari anche perche' il codice e' astratto dall'hardware
Per iniziare il progetto si deve prima selezionare l'hardware in uso
Successivamente si puo' usare un codice di esempio oppure scrivere da zero
Al momento della compilazione viene scaricato un file .bin
Per caricare il file .bin sulla scheda si usa il software StLink traminte il comando
st-flash write programma.bin 0x8000000
La scheda che ho usato (la STM32F446RET6) ha un ST-LINKV2 debugger integrato per cui e' sufficiente collegare la porta USB
Usando l'IDE online per MbedOS le cose sono decisamente piu' lineari anche perche' il codice e' astratto dall'hardware
Per iniziare il progetto si deve prima selezionare l'hardware in uso
Successivamente si puo' usare un codice di esempio oppure scrivere da zero
Al momento della compilazione viene scaricato un file .bin
Per caricare il file .bin sulla scheda si usa il software StLink traminte il comando
st-flash write programma.bin 0x8000000
La scheda che ho usato (la STM32F446RET6) ha un ST-LINKV2 debugger integrato per cui e' sufficiente collegare la porta USB
venerdì 22 febbraio 2019
Olivetti M24 incontra monitor LCD VGA
Quando usavo quotidianamente l'Olivetti M24 (primi anni 90) il problema piu' sensibile era quello di avere una scheda grafica con risoluzione CGA ed una risoluzione di 640 pixels ma solo a due colori....in un mondo di VGA era un dettaglio non d poco
Solo in questi giorni ho scoperto che e' possibile montare una scheda VGA sugli slot VGA (disattivando la scheda grafica nativa) agendo sui microswitch e addirittuta e' possibile usare un comune monitor VGA usando la scheda grafica interna. Lo schema delle connessioni e' il seguente
Con mia grande sorpresa ha funzionato alla prima nonostante il monitor continuasse a lamentare un fuori frequenza
Solo in questi giorni ho scoperto che e' possibile montare una scheda VGA sugli slot VGA (disattivando la scheda grafica nativa) agendo sui microswitch e addirittuta e' possibile usare un comune monitor VGA usando la scheda grafica interna. Lo schema delle connessioni e' il seguente
Questo ' il connettore con un DB 25 femmina ed un connettore VGA (rispetto allo schema Olivetti dove e' presente un D15 con due file di pin ho usato un DSUB DB15 a 3 file di pin perche' e' lo standard dei monitor VGA ormai da molti anni...la numerazione risulta identica)
martedì 19 febbraio 2019
Gnome Boxes e risoluzione schermo Windows Host
Visto che non ho piu' voglia di litigare con Virtualbox su Debian 9 ho provato a migrare su Gnome Boxes per le cose piu' semplici
Il livello di configurazione e' molto meno dettagliato rispetto a Virtualbox ed e' abbastanza spiazzante il modo per manadare ad alta risoluzione lo schermo
Una volta installata la macchina virtuale Windows, si devono scaricare, da dentro la macchina virtuale) da https://www.spice-space.org/download.html gli spice tools (il corrispettivo delle Guest Additions di VirtualBox) per Windows e sembra non accadere niente.
Al riavvio della macchina virtuale la risoluzione non e' cambiata e non e' scalata con due bande nere ai lati. Cliccando destro sul Desktop di Windows/Impostazione Schermo si puo' cambiare la risoluzione dello schermo. In pratica la risoluzione non viene in automatico scalata come avviene in Virtualbox ma la si deve impostare in modo manuale
Il livello di configurazione e' molto meno dettagliato rispetto a Virtualbox ed e' abbastanza spiazzante il modo per manadare ad alta risoluzione lo schermo
Una volta installata la macchina virtuale Windows, si devono scaricare, da dentro la macchina virtuale) da https://www.spice-space.org/download.html gli spice tools (il corrispettivo delle Guest Additions di VirtualBox) per Windows e sembra non accadere niente.
Al riavvio della macchina virtuale la risoluzione non e' cambiata e non e' scalata con due bande nere ai lati. Cliccando destro sul Desktop di Windows/Impostazione Schermo si puo' cambiare la risoluzione dello schermo. In pratica la risoluzione non viene in automatico scalata come avviene in Virtualbox ma la si deve impostare in modo manuale
lunedì 18 febbraio 2019
Ambiente di sviluppo STM32 su Debian
Si scarica il pacchetto principale da
git clone https://github.com/ve3wwg/stm32f103c8t6.git
e lo si scompatta nella directory stm32
poi si scarica libopncm3
git clone https://github.com/libopencm3/libopencm3.git
e si scompatta nella sottodirectory /libopnmc3 di /stm32
apt-get install build-essential libgtk-3-dev libusb-1.0-0-dev cmake gcc-arm-none-eabi gdb-arm-none-eabi
si puo' quindi lanciare la compilazione andando in /stm32 e digitando
make
-------------------------------------
modifica : in Debian esiste il pacchetto stlink-tools
-------------------------------------
non e' ancora finita perche' Debian non ha nei repository i tool st-flash ed st-info e si devono compilare da sorgenti partendo da https://github.com/texane/stlink. Si scompatta lo zip e lo si mette in /stm32/stlink e si seguono le istruzioni da https://github.com/texane/stlink/blob/master/doc/compiling.md
venerdì 15 febbraio 2019
RTL-SDR e telecomando cancello FAAC
Volevo curiosare come funziona il telecomando dell'apricancello usando RTL-SDR. Frugando un po' ho trovato che il telecomando funziona a 433.84 MHz, Quando si schiaccia il pulsante di fatto vengono emesse due frequenze molto vicine attorno a 433.84 MHz. La prima e' una emissione continua mentre la seconda e' una trasmissione ad impulsi (indicativamente il secondo contiene il codice per apire il cancello, il numero di impulsi e' la chiave)
Lora SX1278 con AS15-USB-T2 e AS32-TTL-100
Volevo provare Lora con Arduino e mi sono comprato i due moduli AS15-USB-T2 e AS32-TTL-100 (il primo per la connessione al computer via USB ed il secondo il vero e proprio modulo radio con SX 1278)
Quando mi e' arrivata la coppia di radio l'ho inserita in due computer ed ho aperto Minicom per vedere se riuscivo a creare un collegamento visto che i moduli possono essere usati anche seriali virtuali
La cosa ha funzionato (dopo aver impostato la connessione 9600 8N1 mettendo ad OFF Hardware Flow Control) ma al momento di trasferire un file la connessione e' crollata
Ho provato a montare un SX1278 ad una Arduino via Seriale ma dopo aver trasmesso un po' di byte ancora una volta la trasmissione si e' arrestata. Ed a questo punto RTFM....leggendo infatti nel dettaglio le istruzioni che si trovano a questo link si vede che la trasmissione e' a pacchetti (piu' nel dettaglio a pacchetti da 58 byte). Non si puo' inviare semplicemente un flusso di dati ma basta mettere un ritardo di tempo tra due pacchetti
Per esempio questo script funziona
70 millisecondi e' l'intervallo minimo per cui si deve separare due pacchetti, per tempi piu' brevi viene spedito un solo pacchetto
Per le connessioni su Arduino ho usato un level converter per portare tutto a 3.3 V nonostante i pin siano dati per compatbili per 3.3V e 5V ma se si guarda la configurazione di AS15-USB-T2 si vede che e' configurato a 3.3 V
Per settare il Mode 0 (ovvero trasmissione) ho connesso sia MD0 che MD1 a GND. Il pin D1TX di Arduino e' stato connesso (via level converter) a RXD di SX1278
=================================================
void setup() {
Serial.begin(9600);
}
void loop() {
for (int t=0; t<40; t++)
{
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0);
Serial.println(voltage);
}
delay(70);
}
=================================================
https://github.com/Bob0505/E32-TTL-100/blob/master/E32-TTL-100.ino
Ho provato ad usarlo con AS32-TTL-1000 con le connessioni suggerite anche se al posto dei suggeriti resistori da 4.7 KOhm ho connesso con un level converter
| D7 | <------------------> | M0 |
| D8 | <------------------> | M1 |
| A0 | <------------------> | AUX |
| D10(Rx)| <------------------> | Tx |
| D11(Tx)| <------------------> | Rx |
Con questa connessione e' possibile programmare la modalita' di LoRa comandandando D7 e D8
Per usare il file .ino si deve inserire nella medesima directory anche il file E32-TLL-100.h
Per settare la modalita' trasmissione ricezione/trasmissione si deve modificare il parametro alla riga 133 (DEVICE_B per trasmettere, DEVICE_A per ricevere)
Quando mi e' arrivata la coppia di radio l'ho inserita in due computer ed ho aperto Minicom per vedere se riuscivo a creare un collegamento visto che i moduli possono essere usati anche seriali virtuali
La cosa ha funzionato (dopo aver impostato la connessione 9600 8N1 mettendo ad OFF Hardware Flow Control) ma al momento di trasferire un file la connessione e' crollata
Ho provato a montare un SX1278 ad una Arduino via Seriale ma dopo aver trasmesso un po' di byte ancora una volta la trasmissione si e' arrestata. Ed a questo punto RTFM....leggendo infatti nel dettaglio le istruzioni che si trovano a questo link si vede che la trasmissione e' a pacchetti (piu' nel dettaglio a pacchetti da 58 byte). Non si puo' inviare semplicemente un flusso di dati ma basta mettere un ritardo di tempo tra due pacchetti
Per esempio questo script funziona
70 millisecondi e' l'intervallo minimo per cui si deve separare due pacchetti, per tempi piu' brevi viene spedito un solo pacchetto
Per le connessioni su Arduino ho usato un level converter per portare tutto a 3.3 V nonostante i pin siano dati per compatbili per 3.3V e 5V ma se si guarda la configurazione di AS15-USB-T2 si vede che e' configurato a 3.3 V
Per settare il Mode 0 (ovvero trasmissione) ho connesso sia MD0 che MD1 a GND. Il pin D1TX di Arduino e' stato connesso (via level converter) a RXD di SX1278
=================================================
void setup() {
Serial.begin(9600);
}
void loop() {
for (int t=0; t<40; t++)
{
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0);
Serial.println(voltage);
}
delay(70);
}
=================================================
mentre questo non funziona
=================================================
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0);
Serial.println(voltage);
}
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0);
Serial.println(voltage);
}
=================================================
A seconda della posizione di M0 ed M1 si possono ottenere le impostazioni di configurazione oppure modalita' di powersave
A questo link c'e' una libreria per il modulo E32-TTL-100 molto simile a quello che uso.
Ho provato ad usarlo con AS32-TTL-1000 con le connessioni suggerite anche se al posto dei suggeriti resistori da 4.7 KOhm ho connesso con un level converter
| D7 | <------------------> | M0 |
| D8 | <------------------> | M1 |
| A0 | <------------------> | AUX |
| D10(Rx)| <------------------> | Tx |
| D11(Tx)| <------------------> | Rx |
Con questa connessione e' possibile programmare la modalita' di LoRa comandandando D7 e D8
Per usare il file .ino si deve inserire nella medesima directory anche il file E32-TLL-100.h
Per settare la modalita' trasmissione ricezione/trasmissione si deve modificare il parametro alla riga 133 (DEVICE_B per trasmettere, DEVICE_A per ricevere)
RTL-SDR e Lora SX1278
Ho provato a vedere il comportamento della radio Lora del modulo SX1278 mediante il programma gqrx
La larghezza di banda della Lora nella configurazione di base risulta essere di 500 KHz. Non si tratta di un picco ma sul grafico la trasmissione si configura come un rettangolo
giovedì 14 febbraio 2019
UBX Parser Python
un lettore di file derivanti da progetto Zero
-----------------------------
import sys
contatore = 0
#i messaggi UBX-RXM-RAWX hanno classe 2 e id_messaggio 15
with open("02121413.TXT") as f:
while True:
c = f.read(1)
if not c:
break
if (ord(c) == 0xB5):
contatore = contatore + 1
print(str(contatore) +" ########### ")
print("Sync Char 1 " + hex(ord(c)))
c=f.read(1)
if (ord(c) == 0x62):
buffer = []
print("Sync Char 2 " + hex(ord(c)))
########## CLASS ######################
c=f.read(1)
print "Class " + hex(ord(c))
buffer.append(ord(c))
######### MESSAGE #######################
c=f.read(1)
print "Message " + hex(ord(c))
buffer.append(ord(c))
#############P1 ##########################
c=f.read(1)
print "Lunghezza Payload HB " + hex(ord(c))
hb = ord(c)
buffer.append(ord(c))
#############P1 ##########################
c=f.read(1)
print "Lunghezza Payload LB " + hex(ord(c))
lb = ord(c)
buffer.append(ord(c))
###########LUNGHEZZA PAYLOAD ##############
lunghezza = hb+(lb*255)
print "Lunghezza Payload " + str(lunghezza)
#inizia a leggere il payload
if (lunghezza < 1000):
for count in range(1,lunghezza):
c=f.read(1)
#inserisce il payload in un buffer per validarlo
buffer.append(ord(c))
#calcolo del chacksum
# https://gist.github.com/tomazas/3ab51f91cdc418f5704d
#CALCOLA CHECKSUM E STAMPA PAYLOAD
CK_A,CK_B = 0, 0
for i in range(len(buffer)):
print hex(buffer[i])
CK_A = CK_A + buffer[i]
CK_B = CK_B + CK_A
# ensure unsigned byte range
CK_A = CK_A & 0xFF
CK_B = CK_B & 0xFF
print "UBX packet checksum:", ("0x%02X,0x%02X" % (CK_A,CK_B))
#lettura primo checksum
c=f.read(1)
ck_a1 = ord(c)
print "CK_A ric " + hex(ck_a1)
#lettura secondo checksum
c=f.read(1)
ck_b1 = ord(c)
print "CK_B ric " + hex(ck_b1)
if (CK_A == ck_a1):
print "############################VALIDATO############"
print "\n\n\n"
sys.stdin.readline()
-----------------------------
import sys
contatore = 0
#i messaggi UBX-RXM-RAWX hanno classe 2 e id_messaggio 15
with open("02121413.TXT") as f:
while True:
c = f.read(1)
if not c:
break
if (ord(c) == 0xB5):
contatore = contatore + 1
print(str(contatore) +" ########### ")
print("Sync Char 1 " + hex(ord(c)))
c=f.read(1)
if (ord(c) == 0x62):
buffer = []
print("Sync Char 2 " + hex(ord(c)))
########## CLASS ######################
c=f.read(1)
print "Class " + hex(ord(c))
buffer.append(ord(c))
######### MESSAGE #######################
c=f.read(1)
print "Message " + hex(ord(c))
buffer.append(ord(c))
#############P1 ##########################
c=f.read(1)
print "Lunghezza Payload HB " + hex(ord(c))
hb = ord(c)
buffer.append(ord(c))
#############P1 ##########################
c=f.read(1)
print "Lunghezza Payload LB " + hex(ord(c))
lb = ord(c)
buffer.append(ord(c))
###########LUNGHEZZA PAYLOAD ##############
lunghezza = hb+(lb*255)
print "Lunghezza Payload " + str(lunghezza)
#inizia a leggere il payload
if (lunghezza < 1000):
for count in range(1,lunghezza):
c=f.read(1)
#inserisce il payload in un buffer per validarlo
buffer.append(ord(c))
#calcolo del chacksum
# https://gist.github.com/tomazas/3ab51f91cdc418f5704d
#CALCOLA CHECKSUM E STAMPA PAYLOAD
CK_A,CK_B = 0, 0
for i in range(len(buffer)):
print hex(buffer[i])
CK_A = CK_A + buffer[i]
CK_B = CK_B + CK_A
# ensure unsigned byte range
CK_A = CK_A & 0xFF
CK_B = CK_B & 0xFF
print "UBX packet checksum:", ("0x%02X,0x%02X" % (CK_A,CK_B))
#lettura primo checksum
c=f.read(1)
ck_a1 = ord(c)
print "CK_A ric " + hex(ck_a1)
#lettura secondo checksum
c=f.read(1)
ck_b1 = ord(c)
print "CK_B ric " + hex(ck_b1)
if (CK_A == ck_a1):
print "############################VALIDATO############"
print "\n\n\n"
sys.stdin.readline()
venerdì 8 febbraio 2019
Harlem GlobeTrotters Firenze 7 febbraio 2018 Firenze San Marcellino
Esibizione per i giovani giocatori di basket di Firenze di due rappresentanti degli Harlem Globe Trotters al palazzetto di San Marcellino
giovedì 7 febbraio 2019
Mai giocare con le LiPo
Ieri stavo lavorando sul banco per forare una scatola in plastica. Per una serie di sfortunate coincidenze (oltre al fatto che usavo un trapano non mio in cui e' rimasto incastrato il grilletto) la punta del trapano e' entrata in contatto con una LiPo.....e sono stato avvolto dalle scintille
Fortunatamente sono riuscito togliere la spina prima che la punta del trapano mi ferisse e senza che la LiPo esplodesse
Fortunatamente sono riuscito togliere la spina prima che la punta del trapano mi ferisse e senza che la LiPo esplodesse
U-Blox U-Center e Wine
U-Center di U-Blox funziona correttamente in Wine su Debian
L'unica accortezza e' che si deve creare un symlink della porta USB verso un COM virtuale con
ln -s /dev/ttyACM0 /home/luca/.wine/dosdevices/com5
a questo punto il GPS verra' visto in U-Center sotto COM5
L'unica accortezza e' che si deve creare un symlink della porta USB verso un COM virtuale con
ln -s /dev/ttyACM0 /home/luca/.wine/dosdevices/com5
a questo punto il GPS verra' visto in U-Center sotto COM5
martedì 5 febbraio 2019
Arduino MKR1400
E' arrivata sulla scrivania la concorrente diretta della Particle Electron (e molto probabilmente la vincitrice), la Arduino MKR1400 una MKR1000 con in aggiunta un modulo GSM
La scheda funziona con le microSIM e non con le nanoSIM (come la Electron) e supporta senza nessun problema Things Mobile
Una prima cosa strana: la scheda mi e' arrivata senza antenna nonostante sullo store ne viene segnalata la presenza. Ho utilizzato quella della Electron
Ho avuto problemi di connessione con la porta seriale. In caso di necessita' di reset della scheda si deve premere due volte in modo ravvicinato il tasto di reset
Il connettore della LiPo e' di tipo JST-PH
Per controllare il livello della batteria si puo' usare questo sketch
----------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(ADC_BATTERY);
float voltage = sensorValue * (4.3 / 1023.0);
Serial.print(voltage);
Serial.println("V");
}
----------------------------------------------------------------------------
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(ADC_BATTERY);
float voltage = sensorValue * (4.3 / 1023.0);
Serial.print(voltage);
Serial.println("V");
}
----------------------------------------------------------------------------
Per inviare SMS il codice piu' semplice e' il seguente.
Negli sketch deve essere sempre inserita la parte in giallo di configurazione della seriale
Alla SIM e' stato rimosso il pincode per cui non e' necessario configuralo nello sketch
----------------------------------------------------------------------------
#include <MKRGSM.h>
GSM gsmAccess;
GSM_SMS sms;
void setup() {
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
bool connected = false;
while (!connected) {
if (gsmAccess.begin() == GSM_READY) {
connected = true;
} else {
Serial.println("Not connected");
delay(1000);
}
}
Serial.println("GSM initialized");
}
void loop() {
delay(1000);
sms.beginSMS("+393471xxxxxxx");
sms.print("Prova MKR14000");
sms.endSMS();
Serial.println("Inviato");
delay(60000);
}
--------------------------------------------------------
Nel momento di provare ad usare la MKR1400 in accoppiata con un ADXL345 sono entrato in una serie di problemi apparentemente senza uscita perche' ogni volta che cercavo di configurare il canale I2C la scheda perdeva la configurazione della porta seriale su USB e non eseguiva nessuno sketch
Dopo un'oretta di prove a caso ho messo un delay di 5 secondi all'inizio della funzione di setup() e l'accelerometro ha iniziato a funzionare in modo corretto
![]() |
| MKR1400 e ADXL345 |
----------------------------------------------------------
/
#include <MKRGSM.h>
GSM gsmAccess;
GSM_SMS sms;
#include <SparkFun_ADXL345.h> // SparkFun ADXL345 Library
ADXL345 adxl = ADXL345(); // USE FOR I2C COMMUNICATION
int interruptPin = 2; // Setup pin 2 to be the interrupt pin (for most Arduino Boards)
void setup(){
Serial.begin(9600);
while (!Serial)
{};
delay(5000);
Serial.println("SMS Messages Sender");
// Start the serial terminal
Serial.println("SparkFun ADXL345 Accelerometer Hook Up Guide Example");
Serial.println();
adxl.powerOn(); // Power on the ADXL345
adxl.setRangeSetting(16); // Give the range settings
// Accepted values are 2g, 4g, 8g or 16g
// Higher Values = Wider Measurement Range
// Lower Values = Greater Sensitivity
adxl.setSpiBit(0); // Configure the device to be in 4 wire SPI mode when set to '0' or 3 wire SPI mode when set to 1
// Default: Set to 1
// SPI pins on the ATMega328: 11, 12 and 13 as reference in SPI Library
adxl.setActivityXYZ(1, 0, 0); // Set to activate movement detection in the axes "adxl.setActivityXYZ(X, Y, Z);" (1 == ON, 0 == OFF)
adxl.setActivityThreshold(75); // 62.5mg per increment // Set activity // Inactivity thresholds (0-255)
adxl.setInactivityXYZ(1, 0, 0); // Set to detect inactivity in all the axes "adxl.setInactivityXYZ(X, Y, Z);" (1 == ON, 0 == OFF)
adxl.setInactivityThreshold(75); // 62.5mg per increment // Set inactivity // Inactivity thresholds (0-255)
adxl.setTimeInactivity(10); // How many seconds of no activity is inactive?
adxl.setTapDetectionOnXYZ(0, 0, 1); // Detect taps in the directions turned ON "adxl.setTapDetectionOnX(X, Y, Z);" (1 == ON, 0 == OFF)
// Set values for what is considered a TAP and what is a DOUBLE TAP (0-255)
adxl.setTapThreshold(50); // 62.5 mg per increment
adxl.setTapDuration(15); // 625 μs per increment
adxl.setDoubleTapLatency(80); // 1.25 ms per increment
adxl.setDoubleTapWindow(200); // 1.25 ms per increment
// Set values for what is considered FREE FALL (0-255)
adxl.setFreeFallThreshold(7); // (5 - 9) recommended - 62.5mg per increment
adxl.setFreeFallDuration(30); // (20 - 70) recommended - 5ms per increment
// Setting all interupts to take place on INT1 pin
//adxl.setImportantInterruptMapping(1, 1, 1, 1, 1); // Sets "adxl.setEveryInterruptMapping(single tap, double tap, free fall, activity, inactivity);"
// Accepts only 1 or 2 values for pins INT1 and INT2. This chooses the pin on the ADXL345 to use for Interrupts.
// This library may have a problem using INT2 pin. Default to INT1 pin.
// Turn on Interrupts for each mode (1 == ON, 0 == OFF)
adxl.InactivityINT(1);
adxl.ActivityINT(1);
adxl.FreeFallINT(1);
adxl.doubleTapINT(1);
adxl.singleTapINT(1);
attachInterrupt(digitalPinToInterrupt(interruptPin), ADXL_ISR, RISING); // Attach Interrupt
}
/****************** MAIN CODE ******************/
/* Accelerometer Readings and Interrupt */
void loop(){
// Accelerometer Readings
int x,y,z;
adxl.readAccel(&x, &y, &z); // Read the accelerometer values and store them in variables declared above x,y,z
// Output Results to Serial
/* UNCOMMENT TO VIEW X Y Z ACCELEROMETER VALUES
Serial.print(x);
Serial.print(", ");
Serial.print(y);
Serial.print(", ");
Serial.println(z); */
ADXL_ISR();
// You may also choose to avoid using interrupts and simply run the functions within ADXL_ISR();
// and place it within the loop instead.
// This may come in handy when it doesn't matter when the action occurs.
}
/********************* ISR *********************/
/* Look for Interrupts and Triggered Action */
void ADXL_ISR() {
// getInterruptSource clears all triggered actions after returning value
// Do not call again until you need to recheck for triggered actions
byte interrupts = adxl.getInterruptSource();
// Free Fall Detection
if(adxl.triggered(interrupts, ADXL345_FREE_FALL)){
Serial.println("*** FREE FALL ***");
//add code here to do when free fall is sensed
}
// Inactivity
if(adxl.triggered(interrupts, ADXL345_INACTIVITY)){
Serial.println("*** INACTIVITY ***");
//add code here to do when inactivity is sensed
}
// Activity
if(adxl.triggered(interrupts, ADXL345_ACTIVITY)){
Serial.println("*** ACTIVITY ***");
//add code here to do when activity is sensed
}
// Double Tap Detection
if(adxl.triggered(interrupts, ADXL345_DOUBLE_TAP)){
Serial.println("*** DOUBLE TAP ***");
//add code here to do when a 2X tap is sensed
}
// Tap Detection
if(adxl.triggered(interrupts, ADXL345_SINGLE_TAP)){
Serial.println("*** TAP ***");
bool connected = false;
// Start GSM shield
// If your SIM has PIN, pass it as a parameter of begin() in quotes
while (!connected) {
if (gsmAccess.begin() == GSM_READY) {
connected = true;
} else {
Serial.println("Not connected");
delay(1000);
}
}
Serial.println("Luca mi ha toccato");
delay(1000);
sms.beginSMS("+3934710xxxxxx");
sms.print("Luca mi ha toccato");
sms.endSMS();
Serial.println("Inviato");
delay(60000);
}
}
SDA SCL per ADXL345 con ESP32 Vroom
Questo e' un promemoria per ricordarmi i pin del canale i2C su Esp32 Vroom 32 altrimenti detto ESP32_Core_Board_v2
Come da pinout
SCL = IO22
SDA = IO21
Come da pinout
SCL = IO22
SDA = IO21
lunedì 4 febbraio 2019
Comparatore di tensione
Il motivo di questo post era rispondere alla domanda: posso generare un interrupt per una Arduino anche quando il dispositivo di misura non dispone di tale funzione (per esempio un puro strumento analogico con uscita della lettura come variazione di tensione??)
Una risposta puo' essere usare un comparatore di voltaggio mediante circuito operazionale che si comporti come un ADC ad un solo bit. Se il valore letto e' minore di quello di riferimento il circuito risponde con una tensione di uscita zero (stato zero) mentre se e' superiore risponde con uno stato 1 (tensione pari a 5V)
Simulazione effettuate con Every Circuit
Sul - dell'operazionale si imposta la tensione di riferimento Vr (la soglia a cui si vuole che il circuito cambi stato) e si pone per esempio a 3V. La V+ di alimentazione dell'operazione e' posta a 5V mentre la V- di alimentazione e' posta a zero
Nel + dell'operazione (pin non invertente) si inserisce la tensione pilota (Vp). Nel caso in cui Vr<Vp il circuito entra nello stato 1 ed all'uscita dell'operazionale si ha una tensione di 5V. In caso contrario si ha una tensione pari a 0
Nel primo caso la tensione sul - dell'operazionale (pin invertente) risulta essere di 3V mentre la tensione sul + dell'operazione e' di 4 V. In questa condizione in uscita dall'operazionale si ha un valore di Vcc a cui e' alimentato l'operazionale (quindi 5V)
Nel secondo caso la tensione sul + risulta inferiore al valore di riferimento
Dal punto di vista pratico si possono usare LM311, LM345 e LM741
Andando sul dettaglio estremo non e' vero che il circuito puo' assumere solo valori tra 0 e 5V. In un intorno di 10 mv intorno alla tensione di cambio di stato la tensione in uscita assume un valore intermedio tra 0 e 5V ma al mio fine pratico cio' non interessa
http://everycircuit.com/app/
http://www.bristolwatch.com/ele2/comparator.htm
Una risposta puo' essere usare un comparatore di voltaggio mediante circuito operazionale che si comporti come un ADC ad un solo bit. Se il valore letto e' minore di quello di riferimento il circuito risponde con una tensione di uscita zero (stato zero) mentre se e' superiore risponde con uno stato 1 (tensione pari a 5V)
Simulazione effettuate con Every Circuit
Sul - dell'operazionale si imposta la tensione di riferimento Vr (la soglia a cui si vuole che il circuito cambi stato) e si pone per esempio a 3V. La V+ di alimentazione dell'operazione e' posta a 5V mentre la V- di alimentazione e' posta a zero
Nel + dell'operazione (pin non invertente) si inserisce la tensione pilota (Vp). Nel caso in cui Vr<Vp il circuito entra nello stato 1 ed all'uscita dell'operazionale si ha una tensione di 5V. In caso contrario si ha una tensione pari a 0
Nel primo caso la tensione sul - dell'operazionale (pin invertente) risulta essere di 3V mentre la tensione sul + dell'operazione e' di 4 V. In questa condizione in uscita dall'operazionale si ha un valore di Vcc a cui e' alimentato l'operazionale (quindi 5V)
Nel secondo caso la tensione sul + risulta inferiore al valore di riferimento
Dal punto di vista pratico si possono usare LM311, LM345 e LM741
Andando sul dettaglio estremo non e' vero che il circuito puo' assumere solo valori tra 0 e 5V. In un intorno di 10 mv intorno alla tensione di cambio di stato la tensione in uscita assume un valore intermedio tra 0 e 5V ma al mio fine pratico cio' non interessa
http://everycircuit.com/app/
http://www.bristolwatch.com/ele2/comparator.htm
Salvatempo COOP e Windows
Aggiornamento : dopo un mese e mezzo ho trovato in errore anche il lettore di codici a barre da cui si arriva al modello Zebra MK500
Quando uno si chiede come funzionano i salvatempo delle COOP e ne trova uno in bootloop
Per la cronaca il salvatempo e' un Datalogic Joya X1 con Windows CE (e costa un botto)
Quando uno si chiede come funzionano i salvatempo delle COOP e ne trova uno in bootloop
Per la cronaca il salvatempo e' un Datalogic Joya X1 con Windows CE (e costa un botto)
giovedì 31 gennaio 2019
ESP32 Vroom Sleep + Interrupt
Esempio di Esp32 su scheda Esp-Vroom-32 con modalita' di risveglio da Sleep mode mediante un interrupt fisico (in questo caso un contatto sul pin 33)
Per aggiungere la scheda alla IDE di Arduino si deve aggiungere questo link alle additional boards
https://dl.espressif.com/dl/package_esp32_index.json
Queste sono le impostazioni per programmare la scheda nella IDE
tra gli esempi si trova questo codice che imposta la modalita' deeep sleep e risveglio da pin 33
il consumo di corrente e' inferiore a 0.01A (questo e' il limite inferiore del mio misuratore di corrente USB)
=======================================================
/*
Deep Sleep with External Wake Up
=====================================
This code displays how to use deep sleep with
an external trigger as a wake up source and how
to store data in RTC memory to use it over reboots
This code is under Public Domain License.
Hardware Connections
======================
Push Button to GPIO 33 pulled down with a 10K Ohm
resistor
NOTE:
======
Only RTC IO can be used as a source for external wake
source. They are pins: 0,2,4,12-15,25-27,32-39.
Author:
Pranav Cherukupalli <cherukupallip@gmail.com>
*/
#define BUTTON_PIN_BITMASK 0x200000000 // 2^33 in hex
RTC_DATA_ATTR int bootCount = 0;
/*
Method to print the reason by which ESP32
has been awaken from sleep
*/
void print_wakeup_reason(){
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();
switch(wakeup_reason)
{
case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Wakeup caused by timer"); break;
case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break;
case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break;
default : Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break;
}
}
void setup(){
Serial.begin(115200);
delay(1000); //Take some time to open up the Serial Monitor
//Increment boot number and print it every reboot
++bootCount;
Serial.println("Boot number: " + String(bootCount));
//Print the wakeup reason for ESP32
print_wakeup_reason();
esp_sleep_enable_ext0_wakeup(GPIO_NUM_33,1); //1 = High, 0 = Low
//If you were to use ext1, you would use it like
//esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH);
//Go to sleep now
Serial.println("Going to sleep now");
esp_deep_sleep_start();
}
void loop(){
}
Per aggiungere la scheda alla IDE di Arduino si deve aggiungere questo link alle additional boards
https://dl.espressif.com/dl/package_esp32_index.json
Queste sono le impostazioni per programmare la scheda nella IDE
il consumo di corrente e' inferiore a 0.01A (questo e' il limite inferiore del mio misuratore di corrente USB)
=======================================================
/*
Deep Sleep with External Wake Up
=====================================
This code displays how to use deep sleep with
an external trigger as a wake up source and how
to store data in RTC memory to use it over reboots
This code is under Public Domain License.
Hardware Connections
======================
Push Button to GPIO 33 pulled down with a 10K Ohm
resistor
NOTE:
======
Only RTC IO can be used as a source for external wake
source. They are pins: 0,2,4,12-15,25-27,32-39.
Author:
Pranav Cherukupalli <cherukupallip@gmail.com>
*/
#define BUTTON_PIN_BITMASK 0x200000000 // 2^33 in hex
RTC_DATA_ATTR int bootCount = 0;
/*
Method to print the reason by which ESP32
has been awaken from sleep
*/
void print_wakeup_reason(){
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();
switch(wakeup_reason)
{
case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Wakeup caused by timer"); break;
case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break;
case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break;
default : Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break;
}
}
void setup(){
Serial.begin(115200);
delay(1000); //Take some time to open up the Serial Monitor
//Increment boot number and print it every reboot
++bootCount;
Serial.println("Boot number: " + String(bootCount));
//Print the wakeup reason for ESP32
print_wakeup_reason();
esp_sleep_enable_ext0_wakeup(GPIO_NUM_33,1); //1 = High, 0 = Low
//If you were to use ext1, you would use it like
//esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH);
//Go to sleep now
Serial.println("Going to sleep now");
esp_deep_sleep_start();
}
void loop(){
}
Beta testing Alexa Skills
Per sviluppare Alexa Skills puo' essere necessario un programma di beta testing. Cio' e' possibile con l'unica (e non banale) limitazione che tutti i beta tester siano registrati come developer presso Amazon
Per permettere ad altri sviluppare a fare da beta tester si puo' usare questo metodo
https://developer.amazon.com/it/blogs/post/Tx2EN8P2AHAHO6Y/How-to-Add-Beta-Testers-to-Your-Skills-Before-You-Publish
anche se non e' attualmente funzionante in Italia sembra che nel futuro il beta testing seguira' invece la procedura indicata da questo link
https://developer.amazon.com/it/blogs/alexa/post/42e7de5c-f7ef-4e3e-8391-c61fe24f6caa/improve-skill-quality-with-the-new-beta-testing-tool-for-alexa-skills-beta
Per permettere ad altri sviluppare a fare da beta tester si puo' usare questo metodo
https://developer.amazon.com/it/blogs/post/Tx2EN8P2AHAHO6Y/How-to-Add-Beta-Testers-to-Your-Skills-Before-You-Publish
anche se non e' attualmente funzionante in Italia sembra che nel futuro il beta testing seguira' invece la procedura indicata da questo link
https://developer.amazon.com/it/blogs/alexa/post/42e7de5c-f7ef-4e3e-8391-c61fe24f6caa/improve-skill-quality-with-the-new-beta-testing-tool-for-alexa-skills-beta
IBM Netfinity 3000 alias Flip
La mia collezione si e' arricchita di un IBM Netfinity 3000, tecnicamente una workstation anche se e' stata usata nel tempo anche come server
Ho un legame particolare con questo computer perche' e' stato il mio primo computer di lavoro "serio" come amministratore di rete (il nome di rete della mia macchina era Flip, i nomi di rete derivavano tutti dalla Banda di Topolino)
Si tratta di PIII a 700 MHZ. La cosa pregevole (ed attualmente rara da ritrovare) e' la presenza di un disco di sistema SCSI)
Non ricordavo che le schede ISA fossero montate su una riser board ma ricordavo perfettamente quanto pesa il computer
Attualmente e' montato Windows NT 4.0 SP6 ma non so se montero' qualcosa di piu' recente
Ho un legame particolare con questo computer perche' e' stato il mio primo computer di lavoro "serio" come amministratore di rete (il nome di rete della mia macchina era Flip, i nomi di rete derivavano tutti dalla Banda di Topolino)
Si tratta di PIII a 700 MHZ. La cosa pregevole (ed attualmente rara da ritrovare) e' la presenza di un disco di sistema SCSI)
Non ricordavo che le schede ISA fossero montate su una riser board ma ricordavo perfettamente quanto pesa il computer
Attualmente e' montato Windows NT 4.0 SP6 ma non so se montero' qualcosa di piu' recente
Iscriviti a:
Post (Atom)
LLama3 Anita
A seguito di questo post ho provato a vedere ho provato a vedere cosa accadeva ad utilizzare un modello specifico per la lingua italiana in...
-
Aggiornamento questo e' la risposta degli sviluppatori First of all, almost all operating systems on both mobile and laptop/desktop n...
-
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...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...





































