Avviso per gli smemorati

L’importanza di sapere dove sono gli oggetti

Sapere dove sono le proprie risorse è (a volte) fondamentale. La necessità può nascere per scopi privati o aziendali. Per conoscere la posizione di un oggetto serve un GPS tracker, dispositivo acquistabile per pochi euro su ebay/aliexpress/amazon ma spesso questi dispositivi non incontrano le nostre esigenze perché oltre alla posizione vogliamo trasmettere altri dati, magari raccolti da un sensore o perché vogliamo che il modulo possa ricevere dei comandi da remoto.

Prototipo su breadboard per un localizzatore con GPS e GSM

Come funziona?

Per creare il vostro GPS tracker scegliete una scheda a microcontrollore come arduino nano every (ha più memoria di un arduino nano/uno e costa poco) e collegategli un modulo GSM e un modulo GPS. Come modulo GSM potete scegliere il modello SIM800 economico e di piccole dimensioni (GPRS Quad-Band). Non serve che sia 5G! perchè i dati trasmessi in queste applicazioni sono limitati. Il modulo, per poter trasmettere deve avere una SIM dati come quelle di ThingsMobile, ideali per questo tipo di applicazioni.

Il modulo GPS fornirà le posizioni della scheda e le trasmetterà via GSM. I due moduli comunicano via seriale e quindi la scheda dovrà gestire due seriali contemporaneamente. Se utilizzate delle SoftwareSerial le dovete temporizzare così che possano funzionare simultaneamente. 

La SIM800 per funzionare correttamente richiede un’alimentazione indipendente e in grado di fornire almeno 2/3A: quando trasmette richiede molta potenza!

Se la scheda è alimentata a batteria è necessario prendere delle precauzioni per allungare la durata.

Arduino con una shield GSM per la trasmissione dei dati.

Dove finiscono i dati?

Per ricevere i dati è necessario un server con dei servizi web. Potete utilizzare protocolli moderni come MQTT o i servizi REST che richiedono la trasmissione di poche byte, ma anche una pagina php può essere adatta. L’endpoint (pagina o servizio) salverà i dati in una tabella di database che potrete utilizzare per i vostri scopi. Nei casi più semplici possiamo anche scrivere in un semplice file di testo.

Risorse video

Usare un modulo SIM800 con Arduino

Usare un modulo GPS con Arduino

Moduli NRF24L01 e Arduino 

Se invece l’hardware non è il vostro pane quotidiano… 

Interpellatemi!

Realizzo GPS tracker personalizzati con varie tecnologie con sensori e attuatori. 

Prototipi completi con circuito stampato e firmware.

Perché non riparo più le schede delle lavatrici?

e perché vi spiego come farlo da soli…

Fig. 1 – Schede di elettrodomestici

Alcuni anni fa ho avviato il laboratorio di riparazioni elettroniche Reelco (Reborn Electronic Company). Inizialmente lavoravo in mansarda ma dopo poco il lavoro prese piede e mi ritrovai con la stanza piena di schede e la necessità di ingrandire il business: non potevo più lavorare da solo e cercai dei collaboratori. In quei primi anni di attività riparavamo di tutto, o almeno ci si provava. Una buona percentuale delle schede che giungevano in laboratorio provenivano da privati. Abbiamo riparato centinaia di schede di lavatrici, lavastoviglie, frigoriferi, asciugatrici, forni. Purtroppo ad un certo punto abbiamo smesso di accettare queste schede.  Perché?

Perché non è conveniente ripararle e c’è un alto rischio di insuccesso (in parte dovuto a come sono costruite). Di queste schede raramente si trova uno schema elettrico e quindi si deve cercare di capire con l’intuito e l’esperienza come sono state realizzate e come funzionano. Nei casi più fortunati l’analisi e la riparazione richiedono un’ora di tempo che può aumentare parecchio nel caso di schede più problematiche e complesse. Alla manodopera aggiungiamo il costo dei materiali che in media è di una decina di euro. Quando è possibile si cerca di provare la scheda a banco simulando sensori e segnali. Immaginando di pagare il tecnico come un meccanico per auto (40 euro l’ora iva esclusa), aggiungendo il materiale e i costi “fissi” del laboratorio, superiamo facilmente un costo di 100 euro iva inclusa. La stessa scheda nuova si trova in vendita per la stessa cifra o anche meno. A questo aggiungiamo che il più delle volte la riparazione non va a buon fine a causa di molte insidie presenti su questi oggetti e quindi il cliente vuole un rimborso. Con queste premesse, un laboratorio che deve pagare il suo tecnico non sta in piedi.

Voi lo fareste?

Ecco perché riparare schede di questo tipo non è conveniente. Lo è solo se trovate un riparatore che lo fa a tempo perso (in nero/senza scontrino o fattura) oppure se ve la riparate in autonomia. 

Come riparare la scheda elettronica di una lavatrice?

Come prima cosa scattate delle foto dettagliate della scheda sia nella parte superiore che inferiore. Queste foto vi serviranno per verificare di aver rimontato tutti i componenti nel posto giusto: condensatori e diodi con la polarità corretta, valore dei resistori ecc ecc.

Fig. 2 – Prima di lavorare sulla scheda è meglio fare delle foto.

La prima analisi da fare è visiva e olfattiva, in cerca di possibili parti danneggiate. Solitamente le parti che “saltano” sono quelle di alimentazione o di potenza (relè, transistor, mosfet, triac). Un componente bruciato è già un buon punto di partenza.

Se la scheda è intatta si può provare ad alimentarla per vedere se si accende e se ci sono le tensioni logiche. Per alimentarla bisogna individuare il connettore o i contatti a cui fornire tensione (solitamente lavorano a 230VAC ma sempre meglio controllare). Cercate online gli schemi utilizzando i codici stampati sul circuito. Nella scheda della foto precedente leggiamo Bitron 15003261-01. Cerchiamo quindi su google “15003261-01 pdf” o “15003261-01 schematic” (anche in google immagini).

Se non troviamo nulla, non disperiamo e proseguiamo nell’analisi. Se alimentandola non rileviamo le tensioni logiche potrebbe essere partito il modulo di alimentazione.

Dove misuriamo queste tensioni? Individuiamo il microcontrollore e cerchiamo il suo datasheet da cui individuare i pin di alimentazione. Solitamente questi pin fanno capo anche a qualche condensatore elettrolitico. A volte potrebbero esserci delle piazzole con dei test point in cui effettuare le misure. Altri punti in cui rilevare le tensioni sono i pin di alimentazione di chip logici (ttl o cmos) che sono sempre in posizioni abbastanza standard.

Se le tensioni ci sono potremmo verificare se il micro è attivo, testando i pin e il segnale di clock con un oscilloscopio. 

Un’altra analisi interessante e spesso utile per capire se ci sono dei componenti in corto (es. dei chip o la CPU collassati) si può fare con una termocamera oppure con un termometro di precisione. Un chip o un transistor che si surriscaldano “a vuoto” indicano di sicuro un problema. 

Spesso in queste schede si brucia lo stadio di alimentazione che fornisce i 5 e 12V utilizzati sulla scheda. I moduli utilizzano dei chip switching abbastanza noti tipo gli LNK o i VIPer. La tensione a 230VAC è raddrizzata in economia con un semplice diodo e fatta arrivare su un primo condensatore di livellamento (lo si riconosce perché ha una tensione di lavoro di 300 o 400 volt). La tensione livellata è poi portata al chip tramite un resistore di basso valore e una bobina. Solitamente questi sono gli elementi che cedono. Controllateli e se sono danneggiati, sostituiteli assieme al chip di alimentazione. Nella scheda della foto 3 è accaduto proprio questo e tra l’altro anche il chip è esploso. Come fare a sapere che chip utilizzare in questi casi? dobbiamo cercare delle foto della scheda o in qualche forum sperando di trovarne traccia. 

In alcuni casi per colpa di sbalzi di tensione la scheda non si accende a causa dei condensatori di protezione posti all’ingresso della tensione di alimentazione di rete (sono condensatori a film di sicurezza con valori da 10 a 100 nF e contrassegnati dalla sigla X2).

Fig. 3 – Scheda di lavastoviglie con chip di alimentazione bruciato. 

Se la scheda si accende ma non esegue delle operazioni potete provare ad esaminare transistor, triac, relè che fanno capo ai connettori verso l’esterno. I componenti vanno smontati e provati. Se non c’è un optoisolamento tra i triac (per esempio) e il microcontrollore (cosa frequentissima), il danno al triac raggiunge la CPU e non c’è possibilità di riparazione.

Se la scheda va e non va, cioè si ferma a metà di un ciclo o non completa alcune operazioni probabilmente non è riparabile a causa di problemi del firmware. L’elettrodomestico durante il funzionamento tiene traccia del suo stato (del punto in cui è arrivato nel lavaggio per esempio). Se togliete la corrente, dovrebbe ripartire da dove si è fermato. Queste informazioni sono scritte in memorie EEPROM che hanno una durata limitata. 

Un tempo le EEPROM erano montate esternamente ai microcontrollori e sostituendole potevate riparare il guasto, oggi preferiscono usare le EEPROM interne al chip condannando la scheda  a una fine predeterminata. Quando la EEPROM interna non è più scrivibile, potete buttare la scheda.

Fig. 4 – Scheda tecnica della scheda con annotazione dei componenti.

Per smontare i componenti sospetti io faccio un disegno della scheda su cui annoto tutto. Il disegno mi serve per annotare informazioni e poi capire come rimontare il tutto. A fianco di ogni componente scrivo il valore effettivo ed eventualmente quello misurato (fig. 4).

I componenti danneggiati li segno in rosso, in verde quelli funzionanti e in giallo quelli dubbi. Per sicurezza sostituisco sempre tutti i condensatori. I componenti gialli e rossi formano l’elenco delle parti da acquistare.

Fig. 5 – Stazione per la dissaldatura dei componenti.

Individuate le parti danneggiate si inizia a dissaldare utilizzando un dissaldatore (fig. 5). Sebbene sia possibile intervenire con un saldatore e una pompetta aspirante per lo stagno, vi accorgerete che il compito è veramente arduo senza gli strumenti giusti.

La saldatura si effettua con stagno di buona qualità (da 30 a 50 euro a bobina), si tagliano i terminali in eccesso e poi si ripulisce la scheda con appositi solventi per rimuovere i residui del flussante.

Se la scheda utilizza dei componenti SMD (a montaggio superficiale) potete usare anche un saldatore ad aria, utile sia per rimuovere che per saldare rapidamente i componenti. Con i componenti SMD è meglio usare stagno con diametro più piccolo e il liquido flussante. I componenti si maneggiamo con pinzette di precisione e serve un visore o una lente per poter vedere bene.

Che strumenti servono? ecco un elenco:

  • stazione di saldatura (https://amzn.to/34a6301)
  • stazione dissaldante (https://amzn.to/3IR2Npi)
  • pinzette di precisione e strumenti vari
  • lente d’ingrandimento da tavolo con lampada (https://amzn.to/3IIf7bI)
  • tester/multimetro (https://amzn.to/3HCvTHU)
  • oscilloscopio (facoltativo) (https://amzn.to/35oOVnO)
  • alimentatore da banco (https://amzn.to/3C6UPWN)
  • variac (facoltativo) (https://amzn.to/3hxmVB9)
  • saldatore ad aria (facoltativo) (https://amzn.to/3HFJJcp)
  • capacimetro con misurazione ESR (https://amzn.to/3hBq4Q9)

Spero che queste informazioni vi possano aiutare nella riparazione delle vostre schede e che vi abbia anche fatto capire le difficoltà di questo lavoro.

Se invece dovete riparare SCHEDE ELETTRONICHE INDUSTRIALI, possiamo farlo con reelco.

Buona fortuna!

Risorse

Ho scritto un libro sulla riparazione degli alimentatori switching con informazioni generali anche sulle riparazioni elettroniche (solo in pdf). 

LSWR ha pubblicato un mio libro sulle riparazioni in generale: “Riparare (quasi) ogni cosa”.

Sviluppare PCB con KiCAD

Una delle cose che mi rilassa di più è lo sbroglio delle piste di un circuito stampato. Esistono software che lo fanno in automatico, ma serve intelligenza e per ora mi fido solo della mia e di quanto ho appreso in questi anni tramite i miei errori. Qui sotto vedete un momento dello sbroglio delle piste con KiCAD, software gratuito ma con ottime prestazioni. Provate anche voi seguendo la mia playlist (la prima parte è su KiCad4… cambia poco ma è meglio partire dalla nuova versione). Oppure, se andate di fretta, chiedetemi uno sviluppo ad hoc

P.25 Stringhe

Fino ad ora abbiamo utilizzato le stringhe in modo abbastanza semplice e istintivo ma questo tipo di “oggetti” in Python offrono varie possibilità di elaborazione. Una stringa è un messaggio, un testo o semplicemente una sequenza di caratteri delimitati da una coppia di virgolette.

Leggi tutto “P.25 Stringhe”

P.23 Dizionari

Python prevede l’utilizzo di dizionari, cioè delle strutture dati in cui inseriamo delle coppie chiave-valore. Un dizionario funziona proprio come l’omonimo oggetto: cerco una parola e ne trovo il significato. Anche la rubrica del telefono è un esempio di “dizionario”: all’interno ci sono dei nominativi in ordine alfabetico con associato un numero di telefono.

Leggi tutto “P.23 Dizionari”

P.21 Tuple

A prima vista una tupla è come una lista, ma differenza di questa è immutabile, cioè il suo contenuto non può essere modificato. Gli elementi di una tupla sono disposti in ordine e possiamo richiamarli con un indice, proprio come per le liste. Possiamo avere anche elementi ripetuti, appunto perché sono distinti dalla loro posizione. Possiamo usare delle tuple per memorizzare dati differenti (es. il nome di un prodotto,la sua quantità e il prezzo), preferendo le liste per dati omogenei (tutti dello stesso tipo e significato).

Le tuple essendo a sola lettura sono ottimizzate e hanno tempi di accesso più brevi.

Questa è una lista:

lista = [1, 2, 3]

e questa è una tupla:

mytupla = ("apple", "banana", "cherry")

L’unica differenza sono le parentesi: quadre per la liste e tonde per la tupla. Non ci sono vincoli a quello che possiamo inserire in una tupla e quindi possiamo anche avere anche tipi “misti”:

mytupla = ("Ciao", 100, 3.14)
print(mytupla)

Possiamo stampare direttamente una lista passandola a print(), oppure scorrendo gli elementi uno a uno con un ciclo:

for x in mytupla:
    print(x)

Possiamo accedere agli elementi con un indice che parte da 0:

print(mytupla[1])

Il numero di elementi è dato da:

len(tupla)

Possiamo contare quante volte un elemento compare in una lista utilizzando count():

lettere = ("A", "B", "C", "B", "D")
print(lettere.count("B"))

Le tuple ci permettono di utilizzare il meccanismo di “impacchettamento/spacchettamento” (packing/unpacking) che ci permette di creare una tupla elencando delle variabili o dei valori seguiti da delle virgole:

dati = "cane", 100, 3.14
print(dati)

Lo spacchettamento prende il contenuto di una tupla e lo assegna a più variabili. Il numero delle variabili deve essere pari al numero di elementi contenuti nella tupla:

a, b, c = dati

print(a)      # cane
print(b)      # 100
print(c)      # 3.14

Non è possibile modificare, cancellare, aggiungere elementi ad una tupla ma possiamo cercarli con index(). Per ottenere la posizione della lettera C all’interno della tupla lettere scriveremo:

lettere = ("A", "B", "C", "B", "D")
posizione = lettere.index("C")
print(posizione)

Pre verificare la presenza di un elemento in una tupla utilizziamo in:

lettere = ("A", "B", "C", "B", "D")
if “A” in lettere:
    print(“A e’ presente”)

Gli operatori di Python permettono di svolgere operazioni esotiche con le tuple. Possiamo unire due tuple, sommandole e questo non dovrebbe stupirci:

t = (1,2,3)
p = (4,5)
print(t + p)

Ottenendo:

(1, 2, 3, 4, 5)

Possiamo però moltiplicare una tupla, per esempio per 2, raddoppiando i suoi elementi!

t = (1,2,3)
print(t * 2)

producendo:

(1,2,3,1,2,3)

Cose da provare

Come puoi stampare gli elementi di una tupla con un while?

P.20 Break e Continue nel ciclo While

L’istruzione break interrompe totalmente l’esecuzione di un ciclo. L’abbiamo utilizzata con i cicli for, ma funziona anche con while. Riprendiamo il listato 1.30, modifichiamolo così che arrivi fino a 9 e inseriamo nel corpo del ciclo l’istruzione break, richiamata quando il conteggio arriva a 5:

count = 0
while (count < 10):
    print(count, end=" ")
    count += 1
    if (count == 5):
        break
print("END")

Listato 1.33 – Utilizzo di break con un ciclo while.

Eseguendo il codice otterremo:

0 1 2 3 4 END

L’istruzione continue invece fa saltare un’iterazione, ma quando si utilizza all’interno di un ciclo while, bisogna fare molta attenzione a dove la inseriamo perché se la richiamassimo prima dell’istruzione di incremento della variabile count, rischieremmo di non uscire mai dal ciclo.

count = 0
while (count < 10):
    print(count, end=” “)
    count += 1
    if count == 5:
        print(“salto”)
        continue
print(“END”)  

Listato 1.34 – Utilizzo di break con un ciclo while.

Ecco il risultato prodotto dall’esecuzione del listato 1.34:

0 1 2 3 4 salto
5 6 7 8 9 END

Qui di seguito riporto una differente versione del listato 1.34: qui l’istruzione di incremento è posta dopo la chiamata alla continue. Il ciclo procede incrementando il valore di count fino a che questo non è pari a 5. A questo punto “scatterà” l’if, richiamando la continue e rimandando l’esecuzione all’inizio del ciclo. Purtroppo non raggiungeremo mai l’istruzione di incremento, count resterà ferma a 5 e rimarremo imprigionati nel ciclo.

count = 0
while (count < 10):
    print(count, end=" ")    
    if count == 5:
        print("salto")
        continue
    count += 1
print("END")  

Listato 1.35 – Utilizzo non corretto di continue all’interno di un ciclo while.

Cose da provare

  • Scrivete un programma con while e continue che stampi i numeri pari fino a 50.
  • Scrivete un programma che conta da 1 a 100 e si interrompe con break al numero 50.
  • Modificate il programma precedente chiedendo a che numero si deve interrompere.

P.19 Il ciclo While

A volte abbiamo bisogno di ripetere delle operazioni senza sapere quando sarà necessario terminare. Immaginate di voler costruire un sistema automatico per riscaldare una pentola d’acqua con una resistenza elettrica. Un sensore misurerà la temperatura per poter spegnere l’elemento riscaldante quando abbiamo raggiunto la temperatura di 100°C. Il codice di controllo:

  • attiva l’elemento riscaldante;
  • misura la temperatura del liquido;
  • se la temperatura è pari a 100°C interrompe la sequenza di riscaldamento.

È chiaro che il tempo necessario per riscaldare l’acqua dipenderà dalla sua quantità e quindi non sappiamo a priori quante iterazioni saranno necessarie. In questi casi è preferibile utilizzare l’istruzione while, che ripete delle istruzioni fino a che la condizione che controlla è vera (funziona un po’ come se fosse un if).

Per realizzare un conteggio da 0 a 4 possiamo scrivere:

count = 0
while (count < 5):
	print(count, end=” ”)
	count += 1 

Listato 1.30 – Programma per contare da 0 a 4 utilizzando un ciclo while.

Utilizziamo una variabile count, inizialmente a 0. Eseguiremo il corpo del ciclo while fino a che count è minore di 5. Ad ogni iterazione stamperemo il valore di count con una print(). L’ultima istruzione del ciclo while è quella che incrementa il valore di count di una unità. In forma compatta scriveremo:

count += 1

che equivale a:

count = count + 1

Eseguendo il codice otterremo la sequenza:

0 1 2 3 4 

Il ciclo while è indicato nel caso volessimo creare un programma che stampa numeri casuali fino a che non estraiamo il 7. Per ottenere dei numeri casuali utilizzeremo l’istruzione randind(0, 9) che genera numeri a caso tra 0 e 9. La condizione del ciclo while sarà:

while not(n == 7):

La variabile n, che contiene i numeri casuali va creata prima del ciclo while e conterrà inizialmente il valore 0. Alla prima esecuzione del ciclo incontriamo il test:

not (n == 7)

Quindi con n pari a 0, (n == 7) sarà False. Per entrare nel corpo del ciclo abbiamo bisogno di “ribaltare” il suo valore booleano. Anteponiamo la negazione not. Ora la scrittura not (n == 7) avrà il valore True fino a che n non varrà 7, interrompendo le ripetizioni.

import random
n = 0;
while not(n == 7):
    n = random.randint(0,10)
    print(n, end=”, ”)
print("Ho trovato il 7!")

Listato 1.31 – Programma per generare generare numeri fino a che non si ottiene il 7.

Eseguendo il codice otterremo una sequenza simile alla seguente:

10, 6, 3, 1, 9, 7, Ho trovato il 7!

I numeri del Lotto

Proviamo a scrivere un programma che ci fornisca i numeri per giocare al Lotto fino a che ne abbiamo necessità. Dopo ogni estrazione, ci verrà chiesto se desideriamo proseguire e potremo rispondere con “s” o “n”.

Utilizzeremo la libreria random per generare numeri casuali. Creiamo una variabile risposta, inizialmente impostata al valore “s”:

risposta = 's'

Il ciclo while verifica se risposta è pari a “s”:

while risposta == 's':

All’interno del ciclo estraiamo un numero casuale e lo stampiamo, quindi chiediamo al giocatore se vuole proseguire. La risposta fornita a input() è inserita nella variabile risposta che sarà valutata alla prossima iterazione.

import random
risposta = 's'
while risposta == 's':
    print(random.randint(1,90))
    risposta = input('estraggo un nuovo numero (s/n)? ')

print('fine')    

Listato 1.32 – Programma per generare i numeri del Lotto.

Ecco una possibile esecuzione:

66
estraggo un nuovo numero (s/n)? s
71
estraggo un nuovo numero (s/n)? s
83
estraggo un nuovo numero (s/n)? n
fine

Cose da provare

  • Provate a creare una versione del programma che genera una lista di 10 numeri casuali, utilizzando un ciclo while anziché il for.
  • Modificate il precedente programma in modo che possiate prima scegliere quanti numeri aggiungere alla lista.