Attiny85 encoder pcb

Attiny85 encoder pcb è il primo test eseguito sulla board che ho realizzato per leggere un encoder rotativo via I2C

Attiny85 encoder pcb top mounted

e trasferire i dati ad un device in grado di fungere da Master IIC.

Programmazione ISP dell’Attiny85 encoder pcb

La programmazione del attiny85 encoder pcb devi eseguirla attraverso il connettore ISP predisposto sulla parte sinistra della board.

Lo standard del connettore è il medesimo presente su arduino:

avrispmkII-pin-out_ISP

a cui ho collegato il mio programmatore, auto costruito:

attiny85 attiny84 programmer pro micro

secondo quanto puoi vedere in questa foto:

Attiny85 Encoder connettore ICSP

ma puoi tranquillamente utilizzare un arduino come programmatore ISP per trasferire lo sketch che abilita l’Attiny85 encoder pcb ad essere utilizzato come Slave IIC.

Lo sketch Attiny85 encoder pcb

Dopo aver selezionato, nell’IDE arduino, l’Attiny85 con Internal Clock 16MHz puoi utilizzare lo sketch che hai già letto in altri articoli dedicati agli encoder rotativi attiny85 come slave IIC:

#define I2C_SLAVE_ADDRESS 0x8 // Address of the slave
 
#include <TinyWireS.h>
#include "avr/interrupt.h"; 

#define encA 3
#define encB 4
#define swtc 1

volatile byte currentValue = 0;
volatile int  lastEncoded  = 0;

void setup() {
    TinyWireS.begin(I2C_SLAVE_ADDRESS); // join i2c network
    TinyWireS.onRequest(requestEvent);
 
    pinMode(encA, INPUT);
    pinMode(encB, INPUT);
    pinMode(swtc, INPUT);
    digitalWrite(encA, HIGH);
    digitalWrite(encB, HIGH);
   
    GIMSK = 0b00100000;       // Enable pin change interrupts
    PCMSK = 0b00011010;       // Enable pin change interrupt for PB3 and PB4 and PB1
    sei();                    // Turn on interrupts
}
 
void loop() { TinyWireS_stop_check(); }

void requestEvent() {
    counter++;
    TinyWireS.send(currentValue);
    TinyWireS.send(digitalRead(swtc));
}

ISR(PCINT0_vect) {
  byte MSB = digitalRead(encA); //MSB = most significant bit
  byte LSB = digitalRead(encB); //LSB = least significant bit
  
  int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value
 
  if(sum==0b1101||sum==0b0100||sum==0b0010||sum==0b1011) currentValue++;
  if(sum==0b1110||sum==0b0111||sum==0b0001||sum==0b1000) currentValue--;
  
  lastEncoded = encoded; //store this value for next time
}

trovi la descrizione dello sketch nell’articolo encoder attiny slave in cui lo sketch è stato spiegato linea per linea, in questa occasione è importante sapere che la linea 01 definisce l’indirizzo che devi configurare sul Master i2c che invia le chiamate.

Riporto anche lo sketch, di esempio, che ho utilizzato per la lettura dell’encoder rotativo con Arduino:

//Code for the Arduino Master
#include <Wire.h>
 
#define TARGET_ID 0x08
 
void setup()
{
 Wire.begin(); // join i2c bus (address optional for master)
 Serial.begin(9600); // start serial for output
}
  
void loop() {
  Wire.requestFrom(TARGET_ID, 2); // request 1 byte 
                                                     // from slave device
  
  while(Wire.available() > 0) {
    byte i = Wire.read();
    byte sw = Wire.read();
     
    Serial.print( "Enc: " );
    Serial.print( i );
    Serial.print( " - Switch: " );
    Serial.println( sw );
   }
  
delay(100);
}

la cui descrizione e spiegazione puoi leggerla nell’articolo “AtTiny85 Encoder – Attiny Slave” e che produce come output il seguente:

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/attiny85-encoder-pcb.html

1 ping

  1. […] encoder attiny85 neopixel si distacca dall’utilizzo per cui è nata la rotary encoder attiny85 come hai letto nell’articolo di […]

Lascia un commento

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.