Sto provando a programmare un attiny85 tramite il mio arduino UNO, facendogli acquisire dei dati da un sensore di prossimità APDS-9930.
La parte di programmazione l’ho conclusa con successo, ma sto avendo degli strani comportamenti per quanto riguarda l’hardware.
Lo schema di collegamento che sto utilizzando si può vedere nell’immagine sottostante.
L’attiny dovrebbe leggere i dati dal sensore e, quando un oggetto si trova in prossimità del sensore, dovrebbe accendere il led su PB4.
Con questa configurazione, Arduino viene usato per l’alimentazione a 3.3V e per il debugging. Ho cortocircuitato il pin di RESET con il GND e ho collegato al pin TX dell’arduino il corrispettivo pin TX usato nell’attiny. Ciò mi permette di leggere i messaggi inviati dall’attiny via seriale sul mio pc.
Il codice usato nel progetto è il seguente
#include <SoftwareSerial.h>
#include <Wire.h>
#include <APDS9930.h>
#define LED_PIN 4 // PB4 = pin fisico 3
// RX = -1 (non usato), TX = 3 (PB3, pin fisico 2)
SoftwareSerial mySerial(-1, 3);
APDS9930 apds = APDS9930();
void setup() {
// LED
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW); // LED spento all'avvio
mySerial.begin(9600);
for (int i = 3; i > 0; i--) {
mySerial.print(F("Inizio in... "));
mySerial.println(i);
delay(1000);
}
mySerial.println(F("\n--- DIAGNOSTICA APDS-9930 ---"));
Wire.begin();
// Wire.setClock(100000); // opzionale
if (apds.init()) {
mySerial.println(F("Inizializzazione: OK"));
} else {
mySerial.println(F("Inizializzazione: FALLITA"));
}
if (!apds.enableProximitySensor(false)) {
mySerial.println(F("Errore abilitazione prossimita'"));
}
}
void loop() {
uint16_t proximity_data = 0;
if (!apds.readProximity(proximity_data)) {
mySerial.println(F("Errore lettura dati!"));
digitalWrite(LED_PIN, LOW); // sicurezza
} else {
mySerial.print(F("Valore: "));
mySerial.println(proximity_data);
if (proximity_data == 1023) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
}
}
L’unica cosa che mance nel setup è la scelta delle resistenze di pull-up R1 e R2.
In giro per il forum / su internet ho letto che vanno bene resistenze da 4.7K o 10K. Ho provato con tali valori, ma l’attiny continuava a stampare “Errore lettura dati”.
Ho cominciato a provare di tutto: aggiungere condensatori elettrolitici da pochi nF tra VCC e GND vicino al sensore o all’attiny, aumentare il valore delle resistenze, diminuire il valore delle resistenze, cambiare il codice, cambiare breadboard…
Ad un tratto qualcosa ha però fatto funzionare il tutto: collegando il pin A4 dell’arduino al pin PB2 dell’attiny, e il pin A5 dell’arduino al pin PB0 dell’attiny magicamente la comunicazione è partita. La configurazione “funzionante” diventa dunque la seguente
Non ho assolutamente compreso come mai questa configurazione “aiuti” l’attiny. Si consideri che nell’arduino sta girando il codice dello sketch di esempio “ArduinoISP” (giacché l’avevo appena usato per programmare l’attiny), ma comunque il pin RESET e GND sono cortocircuitati.
Facendo altri esperimenti, ho notato alcuni setup (sempre precari) che aiutavano l’attiny a comunicare correttamente con il sensore senza la necessità di collegare A4 e A5 di Arduino:
- mettere un led al posto delle resistenze di pull-up
Per qualche motivo tale led rende la comunicazione perfetta e non ci sono errori - mettere una resistenza di pull-up da 10K e toccare con le dita le sue due estremità
In tal caso, solo ed esclusivamente se tocco le estremità della resistenza mentre è collegata si avvia la comunicazione correttamente - al posto di una singola resistenza di pull-up, metterne 3 in serie (10K + 10K + 47 = 20047)
In tal caso la comunicazione funzionava per circa un minuto, poi crollava - al posto della resistenza di pull-up, mettere un resistore variabile 0→20k e provare a “giocherellare” con la manopola mettendolo circa ad un valore di 18K
Giusto per escludere ogni dubbio, ho provato anche a cambiare il clock dell’attiny (normalmente lo setto a 8MHz, ho provato a metterlo a 1MHz), ma non ha aiutato per nulla.
Ho provato a spostare qualche condensatore elettrolitico qua e là, ma nemmeno ciò è stato d’aiuto. Finora l’unica configurazione che rimane sempre stabile è quella che richiede A4 e A5 connessi all’attiny. Tutti gli altri metodi sono abbastanza “aleatori” e probabilmente il loro funzionamento dipende anche da altri fattori esterni che non sto considerando.
Giusto per fornire tutti i dettagli, noto che su A4 e A5 c’è una tensione di circa 0.10V. Inoltre il sensore funziona senza problemi se usato direttamente con Arduino. Faccio notare che potrebbe anche essere che il modulo in sé non è di ottima fattura, considerato che viene da Aliexpress. Comunque lascio una foto per completezza
Qualcuno più esperto di me saprebbe fornire qualche ipotesi su come mai si verifica questo comportamento ed eventualmente come affrontarlo ? E come mai il collegare i pin A4 e A5 aiuta così tanto ?



