Cercando di fare l'upload di uno sketch sulla nuova arrivata, un clone cinese di una Arduino Esplora, mi sono trovato nei guai perche' ogni volta c'erano errori di scrittura, errori nella fase di verifica o addirittura tutto era bloccato da un messaggio di Port Busy
la soluzione a tutti i problemi non era nell'Arduino, ne' nel cavo ne' nella IDE...in pratica il pacchetto modem manager entra in conflitto con l'upload. Basta eseguire
apt-get purge modemmanager
e tutto funziona
sabato 20 aprile 2019
martedì 16 aprile 2019
Classi in C++ con CMake ed Eclipse
Questa cosa di CMake mi sta iniziando a dare fastidio....(devo ogni volta capire come sono cambiate le cose rispetto a make)
Diciamo di avere questa stupida classe
schermo.cpp
---------------------------------------------------
#include "schermo.h"
void schermo::aggiorna()
{
schermo::matrice[1] = 100;
}
schermo::schermo() {
schermo::matrice[1]=0;
}
schermo::~schermo() {
}
------------------------------------------------------
schermo.h
------------------------------------------------------
Diciamo di avere questa stupida classe
schermo.cpp
---------------------------------------------------
#include "schermo.h"
void schermo::aggiorna()
{
schermo::matrice[1] = 100;
}
schermo::schermo() {
schermo::matrice[1]=0;
}
schermo::~schermo() {
}
------------------------------------------------------
schermo.h
------------------------------------------------------
#ifndef SCHERMO_H_
#define SCHERMO_H_
class schermo {
public:
schermo();
void aggiorna();
virtual ~schermo();
int matrice [100];
private:
};
#endif /* SCHERMO_H_ */
------------------------------------------------------
ed un altro altrettanto stupido codice che chiama la classe
ad.cpp
------------------------------------------------------
#include <iostream>
#include <string>
#include "schermo.h"
using namespace std;
schermo ss;
int main(int argc, char **argv) {
int numero = ss.matrice[1];
auto s = std::to_string(numero);
cout << s << endl;
ss.aggiorna();
numero = ss.matrice[1];
s = std::to_string(numero);
cout << s << endl;
return 0;
}
------------------------------------------------------
#include <iostream>
#include <string>
#include "schermo.h"
using namespace std;
schermo ss;
int main(int argc, char **argv) {
int numero = ss.matrice[1];
auto s = std::to_string(numero);
cout << s << endl;
ss.aggiorna();
numero = ss.matrice[1];
s = std::to_string(numero);
cout << s << endl;
return 0;
}
------------------------------------------------------
per compilare la classe nella liberia esterna si deve modificare il file CMakeLists.txt come segue nella parte evidenziata (cioe' richiamando sia il sorgente che l'header della classe)
------------------------------------------------------
cmake_minimum_required (VERSION 2.6)
project (ad)
add_executable(ad ad.cpp schermo.cpp schermo.h)
------------------------------------------------------
project (ad)
add_executable(ad ad.cpp schermo.cpp schermo.h)
RealTone KP-460
Un altro esemplare funzionante di calcolatrice della seconda meta' degli anni 70 si e' aggiunto alla mia collezione. Una RealTone KP-460 made in Hong Kong con processore Western Digital FS1732-B. I contatti erano ovviamente ossidati ma non compromessi
Visto che le istruzioni sul mio modello sono poco leggibili ho ripreso questa immagine da questo sito
Visto che le istruzioni sul mio modello sono poco leggibili ho ripreso questa immagine da questo sito
venerdì 12 aprile 2019
FTDI232 e Arduino Mini Pro
Dovendo fare un progetto microscopico ho dovuto tirare fuori una Arduino Mini Pro che non avevo mai usato. Per programmarla ho scoperto che non e' necessario saldare i pin sulla scheda
E' sufficiente appoggiare i pin del programmatore FTDI232 sulla Mini Pro e si ottiene una connessione sufficientemente stabile per programmare la scheda
E' sufficiente appoggiare i pin del programmatore FTDI232 sulla Mini Pro e si ottiene una connessione sufficientemente stabile per programmare la scheda
giovedì 11 aprile 2019
Un microcontrollore all'improvviso
Mentre ero su un cantiere mi e' caduto l'occhio su questa schedina....l'ho presa per curiosita'....dovrebbe appartenere ad una luce da cantiere (quelle a luce rosse a forma di lanterna) ...anche per la presenza di un LDR
ma al centro c'e' un integrato sospetto targato 12F675, si tratta di un microcontrollore PIC. Probabilmente costava troppo fare il controllo dell'LDR ed il lampeggio con l'elettronica analogica che si e' preferito "sprecare" un microcontrollore (del resto costa meno di 30 cent euro al pezzo)
ma al centro c'e' un integrato sospetto targato 12F675, si tratta di un microcontrollore PIC. Probabilmente costava troppo fare il controllo dell'LDR ed il lampeggio con l'elettronica analogica che si e' preferito "sprecare" un microcontrollore (del resto costa meno di 30 cent euro al pezzo)
martedì 9 aprile 2019
Every circuit ....forever
Ho avuto modo di provare per un giorno Every circuit ... ma il tempo di prova era poco ed il giorno dopo, dopo le basi, volevo vedere ancora se c'erano dei componenti un po' piu' evoluti che valessero la pena di spendere 15 euro della versione completa... ma ovviamente non potevo per il blocco del periodo di prova...ho provato ad aggirare il problema
Per prima si cancella il cookie del sito. Da Chrome si digita la URL
chrome://settings/siteData
si cerca la stringa EveryCircuit e si cancella il cookie.
Per prima si cancella il cookie del sito. Da Chrome si digita la URL
chrome://settings/siteData
si cerca la stringa EveryCircuit e si cancella il cookie.
Fatto questo si puo' utilizzare un servizio di mail temporanea come https://temp-mail.org/ per attivare un nuovo account.
In conclusione ho fatto qualche altra prova. per un altro giorno ma non ho pagato il software. I componenti sono quelli base (a meno che non ne vengano sbloccati altri sulla versione a pagamento) e non vale la pena l'esborso
lunedì 8 aprile 2019
Arduino Nano Eleggo Old Bootloader
Stavo impazzendo con un clone di una Arduino Nano Elegoo perche' non riuscivo a caricare nessuno sketch
..quando e' saltato un messaggio su un forum che le Arduino Nano possono avere due bootloader e che si puo' selezionare dalla Arduino Ide. Nel mio caso era da selezionare Old Bootloader
..quando e' saltato un messaggio su un forum che le Arduino Nano possono avere due bootloader e che si puo' selezionare dalla Arduino Ide. Nel mio caso era da selezionare Old Bootloader
venerdì 5 aprile 2019
Firmware update su Dragino LG01
Per aggiornare il firmware OpenWrt (non la MCU) di un Dragino Lora Gateway LG-01 si scarica il file dragino-IoT--v4.3.6-squashfs-sysupgrade.bin da qui
http://www.dragino.com/downloads/index.php?dir=motherboards/ms14/Firmware/IoT/IoT--build-v4.3.6-20190305-2356/
Si va poi in System/Backup Flashfirmware/ Flash new firmware image
e si attende il reboot
http://www.dragino.com/downloads/index.php?dir=motherboards/ms14/Firmware/IoT/IoT--build-v4.3.6-20190305-2356/
Si va poi in System/Backup Flashfirmware/ Flash new firmware image
e si attende il reboot
LoraWan TheThingsNetwork con Arduino MKR1300
Dopo aver settato il gateway Dragino LG-01 vediamo come poter trasmettere i dati al cloud di TheThingsNetwork
Le impostazioni del gateway per LoraWAN sono le seguenti
Come si vede e' stato impostato uno spreading factor di 7, bandwith 125 KHz e CR 4 per una velocita' di circa 3400 bps. Tali valori devono essere compatibili con quelli dello sketch
Per prima cosa si imposta crea (dopo aver il gateway funzionante ed onlinea) una Application sulla console di TTN
dopo aver creato una App si devono creare i Devices
Ogni device e' identificato dal proprio EUI. Questo codice esadecimale puo' essere letto per esempio lanciando lo sketch FirstConfiguration degli esempi della libreria MKRWAN
Si passa poi alla programmazione Arduino.
Il dispositivo MKR1300 viene attivato come ABP (activation by personalization) e non OTAA. Mi e' stato spiegato sul forum di Arduino che Dragino LG-01 e' un gateway monocanale e gestisce solo ABP
E' stato modificato lo script di esempio LoraSendandReceive (eliminado la parte di ricezione che non mi serve). In giallo le modifiche sostanziali
----------------------------------------
#include <MKRWAN.h>
LoRaModem modem;
String devAddr;
String nwkSKey;
String appSKey;
void setup() {
Serial.begin(115200);
if (!modem.begin(EU868)) {
Serial.println("Failed to start module");
while (1) {}
};
//chiavi
devAddr = "26011xxxx";
nwkSKey = "C05AB32C3F7B4Dxxxxxxxxxxxxxxxxxx";
appSKey = "1C8567078CB4613B168xxxxxxxxxxxxxx";
int connected = modem.joinABP(devAddr, nwkSKey, appSKey);
if (!connected) {
Serial.println("Errore di connessione");
while (1) {}
}
{
Serial.println("connesso");
}
}
void loop() {
modem.setPort(3);
modem.setADR(true);
modem.dataRate(5);
delay(5000);
modem.minPollInterval(60);
String msg = "Luca";
int err;
modem.beginPacket();
modem.print(msg);
err = modem.endPacket(false);
if (err > 0) {
Serial.println("Message sent correctly!");
} else {
Serial.println("Error sending message :(");
}
delay(20000);
}
----------------------------------------
Ed ecco apparire i dati sul cloud
curl -X GET --header 'Accept: application/json' --header 'Authorization: key ttn-account-v2.p-Sxxxxxxx' 'https://hello_world_mkr1300.data.thethingsnetwork.org/api/v2/query'
Le impostazioni del gateway per LoraWAN sono le seguenti
Come si vede e' stato impostato uno spreading factor di 7, bandwith 125 KHz e CR 4 per una velocita' di circa 3400 bps. Tali valori devono essere compatibili con quelli dello sketch
Per prima cosa si imposta crea (dopo aver il gateway funzionante ed onlinea) una Application sulla console di TTN
dopo aver creato una App si devono creare i Devices
Ogni device e' identificato dal proprio EUI. Questo codice esadecimale puo' essere letto per esempio lanciando lo sketch FirstConfiguration degli esempi della libreria MKRWAN
Si passa poi alla programmazione Arduino.
Il dispositivo MKR1300 viene attivato come ABP (activation by personalization) e non OTAA. Mi e' stato spiegato sul forum di Arduino che Dragino LG-01 e' un gateway monocanale e gestisce solo ABP
E' stato modificato lo script di esempio LoraSendandReceive (eliminado la parte di ricezione che non mi serve). In giallo le modifiche sostanziali
----------------------------------------
#include <MKRWAN.h>
LoRaModem modem;
String devAddr;
String nwkSKey;
String appSKey;
void setup() {
Serial.begin(115200);
if (!modem.begin(EU868)) {
Serial.println("Failed to start module");
while (1) {}
};
//chiavi
devAddr = "26011xxxx";
nwkSKey = "C05AB32C3F7B4Dxxxxxxxxxxxxxxxxxx";
appSKey = "1C8567078CB4613B168xxxxxxxxxxxxxx";
int connected = modem.joinABP(devAddr, nwkSKey, appSKey);
if (!connected) {
Serial.println("Errore di connessione");
while (1) {}
}
{
Serial.println("connesso");
}
}
void loop() {
modem.setPort(3);
modem.setADR(true);
modem.dataRate(5);
delay(5000);
modem.minPollInterval(60);
String msg = "Luca";
int err;
modem.beginPacket();
modem.print(msg);
err = modem.endPacket(false);
if (err > 0) {
Serial.println("Message sent correctly!");
} else {
Serial.println("Error sending message :(");
}
delay(20000);
}
----------------------------------------
Ed ecco apparire i dati sul cloud
In questo modo i dati sono pero' abbastanza inutili ..
Per processarli sullla propria macchina conviene abilitare una Integration dalla console di TTN ed nel mio caso in particolare il Data Storage
con questa modalita' i dati vengono conservati per 7 giorni
sul servizio Swagger
da cui i dati possono essere scaricati mediante una chiamata CURL (dopo aver autorizzato il servizio mediante apposita chiave)
e questo e' un esempio di dato ricevuto
{"device_id":"mkr1300_1","raw":"THVjYTI=","time":"2019-04-05T08:54:01.208249737Z"}
altrimenti si possono scaricare i dati mediante Python con
-----------------------------------------------------
import time
import ttn
app_id = "hello_world_mkr1300"
access_key = "ttn-account-v2.g_-r8AT6eTxxxxxxxxxxxxxxxxxxxxxxxxxx"
def uplink_callback(msg, client):
print("Received uplink from ", msg.dev_id)
print(msg)
print("\n")
handler = ttn.HandlerClient(app_id, access_key)
# using mqtt client
mqtt_client = handler.data()
mqtt_client.set_uplink_callback(uplink_callback)
mqtt_client.connect()
time.sleep(600)
mqtt_client.close()
---------------------------------------------------
i dati ricevuti sono molto piu' dettagliati rispetto a quelli di Swagger
('Received uplink from ', u'mkr1300_1')
MSG(dev_id=u'mkr1300_1', counter=177, app_id=u'hello_world_mkr1300', payload_raw=u'THVjYTI=', hardware_serial=u'A8610A3233258909', port=3, metadata=MSG(location_source=u'registry', data_rate=u'SF7BW125', modulation=u'LORA', altitude=50, longitude=11.290198, airtime=51456000, coding_rate=u'4/5', frequency=868100000, gateways=[MSG(gtw_id=u'eui-a840411bf188ffff', timestamp=2951977680, longitude=11, rf_chain=0, snr=7.8, time=u'2019-04-05T08:58:15.615108Z', latitude=43.111, rssi=-62, channel=7)], time=u'2019-04-05T08:58:15.719069012Z', latitude=43.758617))
giovedì 4 aprile 2019
Python API per TheThingsNetwork
Per interagire con le API di TheThingsNetwork via Python si deve prima installare la libreria via Python
pip install ttn
in seguito e' preferibile creare una Access Key appposita per l'accesso Python andando in Console di TTN Application/Nome Applicazione/Settings/Access Key e creare una nuova chiave che abbia i permessi per Settings/Devices/Messages (non e' strettamente necessario ma essendo uno script puo' essere utile avere il controllo completo
--------------------------------------------------------------
import time
import ttn
app_id = "hello_world_mkr1300"
access_key = "mettere qui la access key prima generata"
def uplink_callback(msg, client):
print("Received uplink from ", msg.dev_id)
print(msg)
handler = ttn.HandlerClient(app_id, access_key)
# using mqtt client
mqtt_client = handler.data()
mqtt_client.set_uplink_callback(uplink_callback)
mqtt_client.connect()
time.sleep(60)
mqtt_client.close()
# using application manager client
app_client = handler.application()
my_app = app_client.get()
print(my_app)
my_devices = app_client.devices()
print(my_devices)
--------------------------------------------------------------
pip install ttn
in seguito e' preferibile creare una Access Key appposita per l'accesso Python andando in Console di TTN Application/Nome Applicazione/Settings/Access Key e creare una nuova chiave che abbia i permessi per Settings/Devices/Messages (non e' strettamente necessario ma essendo uno script puo' essere utile avere il controllo completo
--------------------------------------------------------------
import time
import ttn
access_key = "mettere qui la access key prima generata"
def uplink_callback(msg, client):
print("Received uplink from ", msg.dev_id)
print(msg)
handler = ttn.HandlerClient(app_id, access_key)
# using mqtt client
mqtt_client = handler.data()
mqtt_client.set_uplink_callback(uplink_callback)
mqtt_client.connect()
time.sleep(60)
mqtt_client.close()
# using application manager client
app_client = handler.application()
my_app = app_client.get()
print(my_app)
my_devices = app_client.devices()
print(my_devices)
--------------------------------------------------------------
Questo semplice script usa mqtt ed attende per 60 secondi eventuali messaggi di uplink dai device e poi nella parte in arancione le configurazioni della app
mercoledì 3 aprile 2019
Monostable, Bistable, Astable Multivibrator 555
Un piccolo promemoria di definizioni
Monostable: questa configurazione, detta anche One Shot, riceve un impulso e come conseguenza genera un impulso in uscita (indipendentemente dalla lunghezza dell'input) di una durata pari alla configurazione della circuito RC (tempo di carica). E' simile ad un Schmitt Trigger ma questo muta la lunghezza della riposta in base alla lunghezza dell'input
Bistable: anche detto Flip-Flop. Per ogni impulso in ingresso cambia il proprio stato da 0 a 1 e da 1 a 0
Astable : genera con continuita' una onda quadra. Puo' essere visto come due Monostabiti in sequenza in cui il primo out e' usato come ingresso del secondo
Fonte Wikipedia. Configurazione Monostabile |
Monostable: questa configurazione, detta anche One Shot, riceve un impulso e come conseguenza genera un impulso in uscita (indipendentemente dalla lunghezza dell'input) di una durata pari alla configurazione della circuito RC (tempo di carica). E' simile ad un Schmitt Trigger ma questo muta la lunghezza della riposta in base alla lunghezza dell'input
Bistable: anche detto Flip-Flop. Per ogni impulso in ingresso cambia il proprio stato da 0 a 1 e da 1 a 0
Astable : genera con continuita' una onda quadra. Puo' essere visto come due Monostabiti in sequenza in cui il primo out e' usato come ingresso del secondo
Aggiungere libreria ad un progetto Cmake
Abituato a -L -I per includere una libreria in un progetto C (tipo qui) mi sono dovuto convertire a CMake. Per includere una libreria (sia in Eclipse che in KDevelop), per esempio NCurses, si deve editare il file CMakeLists.txt e aggiungere la riga
target_link_libraries(nome_progetto ncurses)
target_link_libraries(nome_progetto ncurses)
Update MKRWAN1300 firmware
AGGIORNAMENTO : come suggerito dal forum di Arduino c'e' un metodo molto piu' semplice. Si aggiorna la libreria MKRWAN e poi si lancia lo skecth MKRWANFWUpdate_standalone. Nella directory della libreria c'e' l'ultimo firmware disponibile senza la necesssita' di scaricarlo a parte
Per aggiornare il firmware di una Arduino MKR1300 si parte scaricando il firmware compilato da link https://github.com/arduino/mkrwan1300-fw/releases
Al momento di scrivere questa nota l'ultima release e' la 1.1.6 (la 1.1.9 non risulta in formato bin) mentre nella Mkr1300 che mi e' arrivata e' montato un ARD-078 1.1.5
Si copia il file mlm32l07x01.bin nella stessa directory dove e' presente lo sketch MKRWANFWUpdate_standalone incluso negli esempi della libreria MKRWAN e si lancia il comando da terminale
echo -n "const " > fw.h && xxd -i mlm32l07x01.bin >> fw.h
si lancia quindi lo sketch ed aprendo il terminale seriale si vedranno i seguenti comandi
Wrote and verified address 0x08012700 (98%)
Wrote and verified address 0x08012800 (98%)
Wrote and verified address 0x08012900 (98%)
Wrote and verified address 0x08012a00 (99%)
Wrote and verified address 0x08012b00 (99%)
Wrote and verified address 0x08012c00 (99%)
Wrote and verified address 0x08012d00 (100%)
Done.
Starting execution at address 0x08000000... done.
Flashing ok :)
ARD-078 1.1.6
Per aggiornare il firmware di una Arduino MKR1300 si parte scaricando il firmware compilato da link https://github.com/arduino/mkrwan1300-fw/releases
Al momento di scrivere questa nota l'ultima release e' la 1.1.6 (la 1.1.9 non risulta in formato bin) mentre nella Mkr1300 che mi e' arrivata e' montato un ARD-078 1.1.5
Si copia il file mlm32l07x01.bin nella stessa directory dove e' presente lo sketch MKRWANFWUpdate_standalone incluso negli esempi della libreria MKRWAN e si lancia il comando da terminale
echo -n "const " > fw.h && xxd -i mlm32l07x01.bin >> fw.h
si lancia quindi lo sketch ed aprendo il terminale seriale si vedranno i seguenti comandi
Wrote and verified address 0x08012700 (98%)
Wrote and verified address 0x08012800 (98%)
Wrote and verified address 0x08012900 (98%)
Wrote and verified address 0x08012a00 (99%)
Wrote and verified address 0x08012b00 (99%)
Wrote and verified address 0x08012c00 (99%)
Wrote and verified address 0x08012d00 (100%)
Done.
Starting execution at address 0x08000000... done.
Flashing ok :)
ARD-078 1.1.6
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...
-
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...