Discussione:
Carica batterie con Arduino
(troppo vecchio per rispondere)
alfio
2017-10-15 15:36:29 UTC
Permalink
mi avanzano un Arduino Uno, un display LCD 16x2, e la scatola di un
vecchio carica batterie a 4 posti, e mi e' venuto in mente di unire le 3
cose in un unico progetto, ma prima di reinventare la ruota, chiedo:
che voi sappiate, esiste gia' un progetto che usi un Arduino per
realizzare un carica/scarica batterie nimh "intelligente" stile i Lacrosse
?
http://www.lacrossetechnology.com/bc700
robby_1
2017-10-15 16:12:56 UTC
Permalink
Post by alfio
mi avanzano un Arduino Uno, un display LCD 16x2, e la scatola di un
vecchio carica batterie a 4 posti, e mi e' venuto in mente di unire le 3
che voi sappiate, esiste gia' un progetto che usi un Arduino per
realizzare un carica/scarica batterie nimh "intelligente" stile i Lacrosse
?
http://www.lacrossetechnology.com/bc700
Proprio come quello forse no,
ma ci sono progettini per 1 batteria, sta a te capire se riesci a farne
replicare 4 con lo stesso principio.
Qui è per una 9 V, ma credo che riesci a fare in modo da adattarti alla
tensione di ogni singola cella.
Tutte e 4 in serie non è un bel lavoro, se ne hai una messa male, tutto il
gruppo ne risente,
oppure leggi le 4 tensioni e vedi quale batteria è "strana" e fermi la
carica.
https://create.arduino.cc/projecthub/aleksand1975/intelligent-charger-for-9v-nimh-rechargeable-batteries-v1-61cbd6?ref=search&ref_id=battery%20charger&offset=0

Saluti.
alfio
2017-10-15 16:52:00 UTC
Permalink
Post by robby_1
Post by alfio
mi avanzano un Arduino Uno, un display LCD 16x2, e la scatola di un
vecchio carica batterie a 4 posti, e mi e' venuto in mente di unire le 3
che voi sappiate, esiste gia' un progetto che usi un Arduino per
realizzare un carica/scarica batterie nimh "intelligente" stile i Lacrosse
?
http://www.lacrossetechnology.com/bc700
Proprio come quello forse no,
ma ci sono progettini per 1 batteria, sta a te capire se riesci a farne
replicare 4 con lo stesso principio.
Qui è per una 9 V, ma credo che riesci a fare in modo da adattarti alla
tensione di ogni singola cella.
Tutte e 4 in serie non è un bel lavoro, se ne hai una messa male, tutto il
gruppo ne risente,
oppure leggi le 4 tensioni e vedi quale batteria è "strana" e fermi la
carica.
https://create.arduino.cc/projecthub/aleksand1975/intelligent-charger-for-9v-nimh-rechargeable-batteries-v1-61cbd6?ref=search&ref_id=battery%20charger&offset=0
Saluti.
e' un punto di partenza.
robby_1
2017-10-15 17:05:34 UTC
Permalink
Post by alfio
Post by robby_1
Post by alfio
mi avanzano un Arduino Uno, un display LCD 16x2, e la scatola di un
vecchio carica batterie a 4 posti, e mi e' venuto in mente di unire le 3
che voi sappiate, esiste gia' un progetto che usi un Arduino per
realizzare un carica/scarica batterie nimh "intelligente" stile i Lacrosse
?
http://www.lacrossetechnology.com/bc700
Proprio come quello forse no,
ma ci sono progettini per 1 batteria, sta a te capire se riesci a farne
replicare 4 con lo stesso principio.
Qui è per una 9 V, ma credo che riesci a fare in modo da adattarti alla
tensione di ogni singola cella.
Tutte e 4 in serie non è un bel lavoro, se ne hai una messa male, tutto il
gruppo ne risente,
oppure leggi le 4 tensioni e vedi quale batteria è "strana" e fermi la
carica.
https://create.arduino.cc/projecthub/aleksand1975/intelligent-charger-for-9v-nimh-rechargeable-batteries-v1-61cbd6?ref=search&ref_id=battery%20charger&offset=0
Saluti.
e' un punto di partenza.
A pensarci bene, magari tra un po' ci sentiamo, potrebbe interessare anche a
me.
Buon lavoro.
alfio
2017-10-15 21:04:34 UTC
Permalink
Post by robby_1
A pensarci bene, magari tra un po' ci sentiamo, potrebbe interessare anche a
me.
il regolatore lineare, come hanno usato in quel progetto, non mi piace
molto, io vorrei caricare con correnti di 1A o piu'.
stavo pensando di usare questi moduli step-down, visto che costano poco:
<https://www.aliexpress.com/item/1pcs-LM2596-LED-Driver-DC-DC-Step-down-Adjustable-CC-CV-Power-Supply-Module/32590034552.html?spm=a2g0s.8937460.0.0.3WRWNA>
questo dovrebbe essere il loro schema:
<Loading Image...>

la mia idea e' di regolare il trimmer per la V max a circa 2V, togliere
il trimmer per la I max e portare l'ingresso del LM358 all'uscita PWM di
Arduino, opportunamente filtrata.
Visto che quei regolatori partono da 1,3V, credo basti inserire in serie
all'uscita un diodo per aggiungere la caduta necessaria, anche se poi
scaldera' parecchio.

ora mi serve un circuito per la scarica.
che ne dite di un semplice MosFet, pilotato in zona lineare ?
anche con 1A di scarica deve dissipare solo 1W circa, poi basta tenerlo
spento e puo' rimanere in parallelo alla batteria durante la carica.
LAB
2017-10-16 08:48:41 UTC
Permalink
Lacrosse e simili sono alimentati a tensione bassissima, mi sembra 3V.
Credo, quindi, che abbiano regolatori di corrente lineari ela tensione
di alimentazione sia bassa per limitare la dissipazione dei transistor.

Tieni sotto controlla la tensione di ciascuno dei 4 elementi e comanda 4
transistor in PWM. Usi ciascun transistor come generatore di corrente
costante di 1A (con una semplice resistenza in serie all'emettitore) e
lo moduli in PWM quando imposti correnti di carica inferiori.

Quando viene rilevato un abbassamento della tensione dell'elemento si
interrompe la carica. Prevedi anche un sensore di temperatura per
ciascun elemento e un'interruzione della carica di ogni elemento dopo
circa 3/I di carica (considerando che un elemento non può richiedere più
di 3Ah).

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
LAB
2017-10-16 08:51:05 UTC
Permalink
Anche un rapido innalzamento della temperatura (a prescindere dal valore
assoluto) indica il completamento della carica: da quel momento, tutta
l'energia fornita si trasforma in calore).

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
alfio
2017-10-16 09:51:30 UTC
Permalink
Post by LAB
Anche un rapido innalzamento della temperatura (a prescindere dal valore
assoluto) indica il completamento della carica: da quel momento, tutta
l'energia fornita si trasforma in calore).
---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
La sonda di temperatura non l'avevo prevista, se la metto non mi
basta più un Arduino Uno per caricare 4 pile.
:-(
--
----Android NewsGroup Reader----
http://usenet.sinaapp.com/
LAB
2017-10-16 10:03:20 UTC
Permalink
Perché???

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
LAB
2017-10-16 10:07:56 UTC
Permalink
6 I/O per il display
3 I/O per un encoder
4 per leggere le tensioni
4 PWM per i transistor di carica
4 per i transistor di scarica
----
21
Se usi l'oscillatore interno hai a disposizione anche PB6 e PB7: 21 I/O! :-)

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
LAB
2017-10-16 10:08:45 UTC
Permalink
Scusa: 22 I/O! :-)

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
LAB
2017-10-16 10:13:13 UTC
Permalink
Puoi metterci anche un cicalino :-)

Utilizzando saggiamente i pin, puoi collegare anche dei LED: se mandi le
tensioni agli ingressi analogici tramite una resistenza (ad es. da 47k)
puoi collegare sui pin dei LED tramite 330 ohm e normalmente pilotare i
LED; ogni 5 secondi, poi, commuti i pin in ingressi, attendi 100uS e
leggi la tensione, dopodiché commuti nuovamente i pin in uscite e
reimposti lo stato dei LED.

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
alfio
2017-10-16 10:37:48 UTC
Permalink
Post by LAB
Puoi metterci anche un cicalino :-)
Utilizzando saggiamente i pin, puoi collegare anche dei LED: se mandi le
tensioni agli ingressi analogici tramite una resistenza (ad es. da 47k)
puoi collegare sui pin dei LED tramite 330 ohm e normalmente pilotare i
LED; ogni 5 secondi, poi, commuti i pin in ingressi, attendi 100uS e
leggi la tensione, dopodiché commuti nuovamente i pin in uscite e
reimposti lo stato dei LED.
---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
Devo ripassare un po di teoria su Arduino :-)
Io sonio rimasto a 14 I/O digitali e 6 _ingressi_ analogici.
La commutazione degli analogici in uscite digitali non la sapevo,
ma non credo che basti fare quello che dici, c'è comunque
collegata la batteria, oppure non ho capito la tua
idea.

Questa sera posto lo schema di quello che avevo in mente.
--
----Android NewsGroup Reader----
http://usenet.sinaapp.com/
LAB
2017-10-16 11:02:36 UTC
Permalink
Nel mio contatore Geiger ho fatto così:
http://www.radioactivityforum.it/forum/download/file.php?id=6099&mode=view

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
LAB
2017-10-16 11:04:01 UTC
Permalink
Nota la lettura di Vb e di Vcc su A1 e A2. Nel forum trovi anche il
collegamento a Github con tutto il programma.

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
LAB
2017-10-16 11:08:44 UTC
Permalink
PB6 e PB7 sono normalmente inutilizzati, in quanto su quei pin fisici
viene collegato il quarzo. Se usi l'oscillaotre interno, però, puoi
commutare i due pin del quarzo su PB6 e PB7, avendo poi a disposizione
tutti gli 8 bit della porta B.

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
LAB
2017-10-16 11:20:04 UTC
Permalink
Tempo fa avevo provato a usare PB6 e PB7:

void setup()
{
DDRB|=B11100000;
}

void loop()
{
PORTB|=B01100000;
// Porta a 1 PB6 e PB7
delay(500);

PORTB&=B10011111;
// Porta a 0 PB6 e PB7
delay(500);
}

Naturalmente devi impostare i "Fuse" per usare l'oscillatore interno.
Basta aggiungere la configurazione che segue all'interno del file
boards.txt in D:\Programmi\Arduino 1.8.2\hardware\arduino\avr o simile,
secondo dove hai installato l'IDE.


##############################################################

uno1MHz.name=Arduino uno 1MHz (ATmega328)

uno1MHz.upload.tool=avrdude
uno1MHz.upload.protocol=arduino
uno1MHz.upload.maximum_size=32256
uno1MHz.upload.maximum_data_size=2048
uno1MHz.upload.speed=9600

uno1MHz.bootloader.tool=avrdude
uno1MHz.bootloader.low_fuses=0x62
uno1MHz.bootloader.high_fuses=0xd9
uno1MHz.bootloader.extended_fuses=0xfd
uno1MHz.bootloader.unlock_bits=0x3F
uno1MHz.bootloader.lock_bits=0x0F
uno1MHz.bootloader.file=optiboot/optiboot_atmega328.hex

uno1MHz.build.mcu=atmega328p
uno1MHz.build.f_cpu=1000000L
uno1MHz.build.board=AVR_UNO_1MHz
uno1MHz.build.core=arduino
uno1MHz.build.variant=standard

##############################################################

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
LAB
2017-10-16 11:22:43 UTC
Permalink
Guarda anche qui:
https://www.google.it/search?q=arduino+xtal+I/O

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
LAB
2017-10-16 11:26:20 UTC
Permalink
Ooops.. Qui ho impostato il clock a 1MHz per ridurre il consumo, ma si
può impostare a 8MHz.

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
alfio
2017-10-16 19:28:46 UTC
Permalink
Post by LAB
http://www.radioactivityforum.it/forum/download/file.php?id=6099&mode=view
c'e' modo di vederlo senza registrarsi ?
LAB
2017-10-16 21:26:47 UTC
Permalink
Post by alfio
Post by LAB
http://www.radioactivityforum.it/forum/download/file.php?id=6099&mode=view
c'e' modo di vederlo senza registrarsi ?
Credo di no, ma è un forum molto interessante, con gente preparata. E'
molto istruttivo. Registrati, ne vale la pena! (Quale pena???... :-) )
alfio
2017-10-17 17:46:44 UTC
Permalink
Post by LAB
Post by alfio
Post by LAB
http://www.radioactivityforum.it/forum/download/file.php?id=6099&mode=view
c'e' modo di vederlo senza registrarsi ?
Credo di no, ma è un forum molto interessante, con gente preparata. E'
molto istruttivo. Registrati, ne vale la pena! (Quale pena???... :-) )
non ho letto le regole del forum, ma la semplice registrazione non mi fa
scaricare il file che mi hai linkato. :-(

se mi dai il link alla discussione in cui c'e' il tuo progetto, comincio
a leggere quella.
LAB
2017-10-20 13:36:44 UTC
Permalink
La discussione sta qui:
http://www.radioactivityforum.it/forum/viewtopic.php?f=19&t=2052

Per avere l'accesso completo devi presentarti nell'apposita sezione.
Bastano poche parole...

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
alfio
2017-10-16 21:07:05 UTC
Permalink
Post by alfio
Questa sera posto lo schema di quello che avevo in mente.
ecco lo schema che ho partorito adesso :-)

il modulo step-down sarebbe uno di questi cosi qui a basso costo:
http://www.ebay.com/itm/251066005460

la parte di controllo della corrente l'ho affidata a due operazionali
esterni, e un mosfet per la scarica (quale mi consigliate ?).

L'uscita PWM di arduino diventa il riferimento in tensione tramite un
semplice filtro passa basso RC a 1Hz circa.
una uscita digitale decide se il riferimento va usato come corrente di
carica o scarica.

il dc-dc step-down dovra' essere regolato per max 2V di uscita.

4 pulsanti per la selezione rapida della batteria in esame, e 4 pulsanti
per i vari menu, che devo ancora decidere.

l'ingesso AREF andra' regolato per 2V circa per aumentare la precisione
di lettura (se serve).

[FIDOCAD]
MC 80 190 0 0 115
LI 80 180 80 190
MC 90 190 0 0 115
LI 90 180 90 190
MC 100 190 0 0 115
LI 100 180 100 190
MC 110 190 0 0 115
LI 110 180 110 190
MC 65 210 0 1 074
MC 130 210 2 0 170
MC 130 220 2 0 170
MC 130 230 2 0 170
MC 130 240 2 0 170
MC 80 250 0 0 115
MC 90 250 0 0 115
MC 100 250 0 0 115
MC 110 250 0 0 115
MC 80 260 0 0 045
MC 90 260 0 0 045
MC 100 260 0 0 045
MC 110 260 0 0 045
LI 110 200 110 250
LI 100 200 100 250
LI 90 200 90 250
LI 80 200 80 250
MC 65 220 0 1 074
MC 65 230 0 1 074
MC 65 240 0 1 074
LI 65 210 120 210
LI 65 220 120 220
LI 65 230 120 230
LI 65 240 120 240
LI 130 210 140 210
LI 130 240 140 240
LI 140 230 130 230
LI 130 220 140 220
LI 140 210 140 260
MC 140 260 0 0 045
TY 75 200 5 3 90 0 0 * 1M
TY 75 260 5 3 90 0 0 * 22k
LI 200 180 200 190
LI 190 180 190 190
LI 180 180 180 190
LI 170 180 170 190
TY 120 205 5 3 90 0 0 * 1u
TY 75 180 5 3 90 0 0 * D11
TY 85 180 5 3 90 0 0 * D10
TY 95 180 5 3 90 0 0 * D9
TY 105 180 5 3 90 0 0 * D3
TY 165 180 5 3 90 0 0 * D13
TY 175 180 5 3 90 0 0 * D12
TY 185 180 5 3 90 0 0 * D8
TY 195 180 5 3 90 0 0 * D7
TY 80 165 5 3 0 0 0 * ____PWM____
LI 60 240 55 240
LI 55 240 55 295
MC 170 190 1 0 074
MC 180 190 1 0 074
MC 190 190 1 0 074
MC 200 190 1 0 074
MC 130 385 2 0 580
MC 105 380 2 0 200
MC 105 360 2 0 200
MC 140 410 3 0 115
MC 160 375 0 0 580
MC 185 380 3 0 115
MC 205 380 0 0 200
MC 225 385 0 0 115
MC 230 380 0 0 445
MC 200 375 3 0 200
MC 135 325 0 0 450
MC 135 345 1 0 000
MC 135 325 3 0 000
LI 135 320 135 315
LI 250 315 250 375
LI 250 385 250 410
LI 250 410 150 410
LI 130 385 135 385
LI 155 410 155 385
LI 155 385 160 385
LI 160 375 130 375
LI 155 375 155 305
LI 200 360 200 305
LI 105 360 200 360
LI 200 375 200 380
LI 195 380 205 380
LI 220 380 230 380
LI 225 380 225 385
LI 90 380 90 360
LI 90 370 85 370
MC 135 415 0 0 115
LI 140 410 135 410
LI 135 350 135 415
LI 225 430 85 430
LI 225 395 225 430
LI 135 425 135 430
SA 135 315
SA 135 385
SA 135 410
SA 135 430
SA 155 410
SA 155 375
SA 200 360
SA 200 380
SA 225 380
SA 90 370
MC 155 300 1 0 074
MC 200 300 1 0 074
MC 85 370 2 0 074
LI 155 295 155 300
LI 55 295 155 295
LI 200 300 200 195
TY 70 290 5 3 0 0 0 * Riferimento corrente
TY 195 290 5 3 90 0 0 * 0=Carica 1=Scarica
LI 250 315 85 315
MC 85 315 2 0 010
MC 85 430 2 0 020
TY 105 390 5 3 0 0 0 * LM358
TY 115 330 5 3 0 0 0 * BATT
TY 60 365 5 3 0 0 0 * Pin 4
TY 60 370 5 3 0 0 0 * Feedback
TY 60 375 5 3 0 0 0 * LM2596
TY 60 315 5 3 0 0 0 * Uscita
TY 60 320 5 3 0 0 0 * Modulo
TY 60 325 5 3 0 0 0 * Step down
TY 60 330 5 3 0 0 0 * LM2596
MC 135 430 0 0 045
LI 95 65 95 130
LI 100 65 100 130
MC 80 75 3 0 114
LI 85 70 85 65
LI 90 75 95 75
LI 80 75 75 75
LI 75 75 75 85
LI 75 85 100 85
TY 80 145 5 3 90 0 0 * AREF
TY 90 65 5 3 90 0 0 * GND
TY 95 65 5 3 90 0 0 * VCC
TY 80 65 5 3 90 0 0 * V0
LI 90 110 95 110
LI 80 110 75 110
MC 80 110 1 1 114
LI 85 115 85 130
LI 75 130 75 110
MC 85 120 0 0 170
TY 90 145 5 3 90 0 0 * GND
TY 95 145 5 3 90 0 0 * 5V
TY 70 145 5 3 90 0 0 * 3v3
MC 185 70 1 0 860
MC 185 85 1 0 860
MC 185 100 1 0 860
MC 185 115 1 0 860
MC 205 70 1 0 860
MC 205 85 1 0 860
MC 205 100 1 0 860
MC 205 115 1 0 860
LI 110 65 110 130
LI 115 65 115 130
LI 120 65 120 130
LI 125 65 125 130
LI 130 65 130 130
LI 135 65 135 130
LI 145 75 135 75
LI 145 90 130 90
LI 145 105 125 105
LI 145 120 120 120
LI 160 120 190 120
LI 190 120 190 115
LI 170 115 170 120
LI 160 105 190 105
LI 190 105 190 100
LI 170 100 170 105
LI 160 90 190 90
LI 190 90 190 85
LI 170 85 170 90
LI 160 75 190 75
LI 190 75 190 70
LI 170 70 170 75
LI 185 70 185 130
LI 205 70 205 130
MC 160 75 0 1 200
MC 160 90 0 1 200
MC 160 120 0 1 200
MC 160 105 0 1 200
TY 115 140 5 3 90 0 0 * D4
TY 120 140 5 3 90 0 0 * D2
TY 125 140 5 3 90 0 0 * D1
TY 130 140 5 3 90 0 0 * D0
TY 110 140 5 3 90 0 0 * D5
TY 105 140 5 3 90 0 0 * D6
TY 105 65 5 3 90 0 0 * RS
TY 110 65 5 3 90 0 0 * E
TY 115 65 5 3 90 0 0 * DB7
TY 120 65 5 3 90 0 0 * DB6
TY 125 65 5 3 90 0 0 * DB5
TY 130 65 5 3 90 0 0 * DB4
TY 180 140 5 3 90 0 0 * A4
TY 200 140 5 3 90 0 0 * A5
RV 75 40 145 65
RV 65 130 215 180
MC 230 170 2 0 074
MC 230 160 2 0 074
MC 230 150 2 0 074
MC 230 140 2 0 074
LI 225 170 215 170
LI 215 160 225 160
LI 225 150 215 150
LI 215 140 225 140
LI 230 170 250 170
LI 250 170 250 315
TY 245 290 5 3 90 0 0 * Tensione batteria
SA 250 315
TY 210 140 5 3 0 0 0 * A0
TY 210 150 5 3 0 0 0 * A1
TY 210 160 5 3 0 0 0 * A2
TY 210 170 5 3 0 0 0 * A3
SA 110 240
SA 100 230
SA 90 220
SA 80 210
TY 125 155 5 3 0 0 0 * Arduino Uno
TY 125 415 5 3 0 0 0 * 0.1
TY 145 405 5 3 0 0 0 * 0.1
TY 95 45 5 3 0 0 0 * Display 16x2
LI 95 100 55 100
LI 55 100 55 105
MC 55 105 0 0 045
SA 95 100
LAB
2017-10-17 08:05:24 UTC
Permalink
Uhmm... Non ho mai condiviso dei pulsanti con il display. Come gestisci
i pulsanti sul bus del display? Se devi usarli uno per volta, è più
semplice mettere i pulsanti sulle uscite di un partitore resistivo e
leggere la tensione con un ingresso analogico. Usando resistenze pesate
potresti anche rilevare la pressione di due pulsanti contemporaneamente.

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
alfio
2017-10-17 18:54:21 UTC
Permalink
Post by LAB
Uhmm... Non ho mai condiviso dei pulsanti con il display. Come gestisci
i pulsanti sul bus del display? Se devi usarli uno per volta, è più
semplice mettere i pulsanti sulle uscite di un partitore resistivo e
leggere la tensione con un ingresso analogico. Usando resistenze pesate
potresti anche rilevare la pressione di due pulsanti contemporaneamente.
il display legge i 4 bit dei dati solo quando i 2 ingressi E e RS sono
attivi, per cui mentre non comandi il display puoi scrivere i 4 bit come
ti pare.
io li comando uno per volta, e poi leggo lo stato dei 2 ingressi,
memorizzo cio' che leggo, cosi' ho lo stato degli 8 pulsanti in un byte,
poi ci faccio quello che mi serve, antirimbalzo compreso.
in questo modo gli 8 pulsanti sono indipendenti.

di seguito il codice che ho gia' usato in altri progetti.
la funzione va chiamata ciclicamente nel loop, possibilmente a
intervalli fissi.


#define BR1_PIN A4 // buttons row input
#define BR2_PIN A5

#define BC1_PIN 0 // buttons column output
#define BC2_PIN 1 // buttons column output
#define BC3_PIN 2 // buttons column output
#define BC4_PIN 4 // buttons column output

#define BUT_1 0x01
#define BUT_2 0x02
#define BUT_3 0x04
#define BUT_4 0x08
#define BUT_5 0x10
#define BUT_6 0x20
#define BUT_7 0x40
#define BUT_8 0x80


int oldbut,oldbut1,oldbut2;
unsigned long nextscan;

int buttons ( void )
{
int b = 0;
digitalWrite( BC1_PIN,LOW );
digitalWrite( BC2_PIN,HIGH );
digitalWrite( BC3_PIN,HIGH );
digitalWrite( BC4_PIN,HIGH );
if( digitalRead( BR1_PIN )==LOW ) b |= BUT_1;
if( digitalRead( BR2_PIN )==LOW ) b |= BUT_2;
digitalWrite( BC1_PIN,HIGH );
digitalWrite( BC2_PIN,LOW );
if( digitalRead( BR1_PIN )==LOW ) b |= BUT_3;
if( digitalRead( BR2_PIN )==LOW ) b |= BUT_4;
digitalWrite( BC2_PIN,HIGH );
digitalWrite( BC3_PIN,LOW );
if( digitalRead( BR1_PIN )==LOW ) b |= BUT_5;
if( digitalRead( BR2_PIN )==LOW ) b |= BUT_6;
digitalWrite( BC3_PIN,HIGH );
digitalWrite( BC4_PIN,LOW );
if( digitalRead( BR1_PIN )==LOW ) b |= BUT_7;
if( digitalRead( BR2_PIN )==LOW ) b |= BUT_8;
int but = b & oldbut1 & oldbut2; // 3 scantime debounce
oldbut2 = oldbut1;
oldbut1 = b;
return but;
}


void setup()
{
// put your setup code here, to run once:
nextscan = millis();
oldbut = oldbut1 = oldbut2 = 0;
}


void loop()
{
// put your main code here, to run repeatedly:

if ( millis() >= nextscan )
{
nextscan += 50; // every 50 millis
int but = buttons();
int pressed = but & ( but ^ oldbut );
int released = oldbut & ( but ^ oldbut );
oldbut = but;

if ( BUT_1 & pressed )
; // do action for rising edge
if ( BUT_1 & released )
; // do action for falling edge
if ( BUT_1 & but )
; // do action while active
}
}
LAB
2017-10-20 13:59:22 UTC
Permalink
Sì, è vero :-)
E' difficile, però, gestire le due cose con certezza. Inoltre, ti
converrebbe scrivere su BR1 e BR2 e leggere parallelamente BC1...4,
usando PORT e PIN per velocizzare parecchio l'operazione:

PORTC&= 11101111; // Mette a 0 A4
BUT_A= PIND &00010111; // Legge I/O 0,1,2,4
BUT_1= BUT_A&00000001; // BUT_1=I/O 0
BUT_2=(BUT_A&00000010)>>1; // BUT_2=I/O 1
BUT_3=(BUT_A&00000100)>>2; // BUT_3=I/O 2
BUT_4=(BUT_A&00010000)>>4; // BUT_4=I/O 4

PORTC&= 11101111; // Mette a 0 A5
BUT_B=PIND&00010111; // Legge I/O 0,1,2,4
BUT_5= BUT_A&00000001; // BUT_5=I/O 0
BUT_6=(BUT_A&00000010)>>1; // BUT_6=I/O 1
BUT_7=(BUT_A&00000100)>>2; // BUT_7=I/O 2
BUT_8=(BUT_A&00010000)>>4; // BUT_8=I/O 4

(Salvo errori...)

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
LAB
2017-10-20 14:03:50 UTC
Permalink
Ooops... Mancano tutte le "B" per indicare la notazione binaria e ho
sbagliato A5!

PORTC&= B11101111; // Mette a 0 A4
BUT_A= PIND &B00010111; // Legge I/O 0,1,2,4
BUT_1= BUT_A&B00000001; // BUT_1=I/O 0
BUT_2=(BUT_A&B00000010)>>1; // BUT_2=I/O 1
BUT_3=(BUT_A&B00000100)>>2; // BUT_3=I/O 2
BUT_4=(BUT_A&B00010000)>>4; // BUT_4=I/O 4

PORTC&= B11011111; // Mette a 0 A5
BUT_B= PIND &B00010111; // Legge I/O 0,1,2,4
BUT_5= BUT_A&B00000001; // BUT_5=I/O 0
BUT_6=(BUT_A&B00000010)>>1; // BUT_6=I/O 1
BUT_7=(BUT_A&B00000100)>>2; // BUT_7=I/O 2
BUT_8=(BUT_A&B00010000)>>4; // BUT_8=I/O 4

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
alfio
2017-10-20 15:50:10 UTC
Permalink
Post by LAB
Sì, è vero :-)
E' difficile, però, gestire le due cose con certezza.
non ho capito
Post by LAB
converrebbe scrivere su BR1 e BR2 e leggere parallelamente BC1...4,
bisogna pero' aggiungere altri 2 diodi, e va verificato se l'ingresso
con 1,2V viene letto come 0.
i diodi su BC1..4 ci vanno perche' sono comunque delle uscite quando
viene comandato il display, e vanno aggiunti anche su BR1..2 perche'
diventano uscite nella lettura dei pulsanti, questo perche' bisogna
proteggere le uscite nel caso di pressione contemporanea di 2 o piu'
pulsanti.

piuttosto, che menu ci mettiamo ?
io direi:
- configurazione
* capacita' nominale [mAh]
* corrente di carica [mA]
* corrente di scarica [mA]
* corrente di mantenimento [mA]
* n° cicli di test
- comando
* esegui carica
* esegui scarica
* esegui scarica e carica
* esegui cicli di test (scarica + carica)
* interrompi
- visualizzazione
* tensione batteria [V]
* tempo trascorso [h:m:s]
* accumulatore [mAh]
* resistenza interna [mOhm]
LAB
2017-10-20 17:01:14 UTC
Permalink
Post by alfio
bisogna pero' aggiungere altri 2 diodi, e va verificato se l'ingresso
con 1,2V viene letto come 0.
Beh... Per protezione ci puoi mettere due resistenze, oppure 4 se vuoi
considerare che due pulsanti dello stesso gruppo potrebbero essere
premuti contemporaneamente. In realtà, però, non dovrebbero essere
necessarie perché mi sembra che ol 328 sia ben protetto. E' stato scelto
apposta... :-)
LAB
2017-10-20 17:13:55 UTC
Permalink
Post by alfio
Post by LAB
E' difficile, però, gestire le due cose con certezza.
non ho capito
Ah... Tra l'altro usi due ingressi solo per quello, quindi non devi fare
commutazioni dei pin uscita/ingresso.

Voglio dire che l'alternanza è caotica... Immagino che i pulsanti
interferiscano un po' con la scrittura del display. Può succedere che il
display perda qualche carattere, a meno che tu riscriva il display a
ogni ciclo (il che rallenta notevolmente il ciclo!). Il display va
aggiornato solo quando c'è da cambiare qualche carattere nel testo
scritto o bisogna scrivere una "pagina" totalmente diversa.
alfio
2017-10-20 19:06:56 UTC
Permalink
Post by LAB
Post by alfio
Post by LAB
E' difficile, però, gestire le due cose con certezza.
non ho capito
Ah... Tra l'altro usi due ingressi solo per quello, quindi non devi fare
commutazioni dei pin uscita/ingresso.
questo lo so, il codice che ho postato e' parte di un progetto funzionante
Post by LAB
Voglio dire che l'alternanza è caotica... Immagino che i pulsanti
interferiscano un po' con la scrittura del display. Può succedere che il
display perda qualche carattere, a meno che tu riscriva il display a
ogni ciclo (il che rallenta notevolmente il ciclo!). Il display va
aggiornato solo quando c'è da cambiare qualche carattere nel testo
scritto o bisogna scrivere una "pagina" totalmente diversa.
sinceramente non capisco perche' il display dovrebbe perdere dei caratteri.
LAB
2017-10-20 23:09:08 UTC
Permalink
Stavo notando che non ti occorre fare commutazioni
ingresso/uscita. Inizialmente credevo che rientrassi commutando 2
uscite in ingressi.
--
----Android NewsGroup Reader----
http://usenet.sinaapp.com/
LAB
2017-10-20 23:13:36 UTC
Permalink
Mah... Non fai una alternanza precisa dei dati del display è di
quelli dei pulsanti. Io, se avessi pensato di farlo, mi sarei
posto il problema di alternare precisamente i dati ma, se
funziona bene come dici, basta non porsi il problema.
:-)
--
----Android NewsGroup Reader----
http://usenet.sinaapp.com/
unknown
2017-10-16 16:54:31 UTC
Permalink
Post by LAB
6 I/O per il display
3 I/O per un encoder
4 per leggere le tensioni
4 PWM per i transistor di carica
4 per i transistor di scarica
----
21
Se usi l'oscillatore interno hai a disposizione anche PB6 e PB7: 21 I/O! :-)
potrebbe anche usare dei moduli esterni ADC/DAC controllati da un
unico bus seriale (I2C o SPI)
--
bye
!(!1|1)
LAB
2017-10-17 07:55:16 UTC
Permalink
Le sonde DS18B20 sono one-wire e possono essere collegate in parallelo,
quindi puoi leggerle tutte con un solo I/O.

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
LAB
2017-10-16 10:14:32 UTC
Permalink
Google ne trova:
https://www.google.it/search?q=arduino+AA+battery+charger

---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
Patrick Lauvergne
2017-10-20 12:45:56 UTC
Permalink
Buongiorno,
Siete alla ricerca di finanziamento per sia rilanciare le vostre attività; sia per la realizzazione di un progetto, sia per comperarvi un appartamento ma purtroppo la banca li pone a condizioni di cui siete incapaci di riempire. Più preoccupazione. Io sono un particolare che assegna prestiti che vanno di 1.000 € a 2.300.000 € ad ogni persona capace di rispettare i suoi impegni. D'altra parte il tasso d'interesse è pari al 3% l'anno. Sia avete necessità di denaro per altre ragioni. Non esitate di contattarlo per ulteriori informazioni.
Posta elettronica: ***@hotmail.com
Whatsapp : +330754190215

Grazie!
Patrick Lauvergne
2017-10-23 20:16:15 UTC
Permalink
Buongiorno,
Siete alla ricerca di finanziamento per sia rilanciare le vostre attività; sia per la realizzazione di un progetto, sia per comperarvi un appartamento ma purtroppo la banca li pone a condizioni di cui siete incapaci di riempire. Più preoccupazione. Io sono un particolare che assegna prestiti che vanno di 1.000 € a 2.300.000 € ad ogni persona capace di rispettare i suoi impegni. D'altra parte il tasso d'interesse è pari al 3% l'anno. Sia avete necessità di denaro per altre ragioni. Non esitate di contattarlo per ulteriori informazioni.
Posta elettronica: ***@hotmail.com
Whatsapp : +330754190215

Grazie!

Loading...