Grazie al vostro aiuto sono riuscito a far comunicare Pico85 e Arduino via seriale e poichè le istruzioni sono sparpagliate all'interno del thread, riassumo in un unico post come realizzare la comunicazione seriale con il Pico85 su windows. Si presuppone di aver già installato ArduOpen e di essere in grado di caricare sketch sul Pico85.
Impostare il clock del Pico85 a 16 Mhz
1. andare su \hardware\tools\avr\bin nell'IDE di ArduOpen o Arduino
2. lanciare il comando, sostituendo alla COM3 la vostra COM: avrdude -p ATtiny85 -c stk500v1 -b 19200 -P COM3 -U lfuse:w:0xf1:m
3. verificare che tutto sia andato bene
4. andare su /sketchbook/hardware/attiny45_85 (la cartella che avete creato quando avete installato ArduOpen)
5. aprire il file boards.txt. In questo file cambiare tutte le voci attinyx5avrisp.build.f_cpu=1000000L in attinyx5avrisp.build.f_cpu=16000000L (in alternativa si può creare una nuova scheda duplicando le righe e modificando i valori come detto)
Modificare la libreria NewSoftSerial:
1. andare in /libraries/NewSoftSerial su ArduOpen (ultima versione)
2. Aprire il file NewSoftSerial.cpp con un editor di testo.
3. Cercare la funzione void NewSoftSerial::enable_timer0(bool enable)
4. Modificare il codice da così:
{
if (enable)
#if defined(__AVR_ATmega8__)
sbi(TIMSK, TOIE0);
#else
sbi(TIMSK0, TOIE0);
#endif
else
#if defined(__AVR_ATmega8__)
cbi(TIMSK, TOIE0);
#else
cbi(TIMSK0, TOIE0);
#endif
}
a così:
{
#if defined(__AVR_ATmega8__) || defined(__AVR_ATtinyX5__)
sbi(TIMSK, TOIE0);
#else
sbi(TIMSK0, TOIE0);
#endif
#if defined(__AVR_ATmega8__) || defined(__AVR_ATtinyX5__)
cbi(TIMSK, TOIE0);
#else
cbi(TIMSK0, TOIE0);
#endif
}
E ora un programma di prova.
Cosa serve:- Pico85- Arduino 2009 / Uno
Collegamenti:
- Alimentare Pico85 con 5v e gnd presi da Arduino
- Collegare la USB all'Arduino
- Pin 0 Pico 85 ---> Pin 12 Arduino
- Pin 1 Pico 85 ---> Pin 11 Arduino
- Pin 2 Pico 85 ---> Pin 13 Arduino
Il codice del Pico85 fa lampeggiare un paio di volte il led posto sul pin 13 dell'Arduino e poi lo lascia costantemente acceso.Poi invia sulla seriale i caratteri 0123456789 in continuazione.
Codice da caricare su Pico85:
#include <NewSoftSerial.h>
NewSoftSerial mySerial(0, 1);
int i=0;
int k=0;
void setup()
{
mySerial.begin(38400);
pinMode(2, OUTPUT);
digitalWrite(2, HIGH);
delay(1000);
digitalWrite(2, LOW);
delay(1000);
digitalWrite(2, HIGH);
delay(1000);
digitalWrite(2, LOW);
delay(1000);
digitalWrite(2, HIGH);
}
void loop()
{
for (k=0; k<10; k++)
{
mySerial.print(k);
delay(5);
}
}
Il codice dell'Arduino fa una prova di stampa sul monitor seriale per verificare che tutto stia funzionando.Poi legge i valori sui pin 11 e 12 inviati dal Pico85 e li stampa sul monitor seriale in questo modo:
01234
56789
01234
56789
01234
56789 all'infinito
Codice da caricare su Arduino:
#include <NewSoftSerial.h>
int i = 0;
int k=0;
NewSoftSerial mySerial(11, 12);
void setup()
{
Serial.begin(38400);
mySerial.begin(38400);
pinMode(13, INPUT);
Serial.println("Inizio setup");
for (k=0; k<10; k++)
{
Serial.print(k);
delay(5);
}
Serial.println();
Serial.println("fine setup");
}
void loop()
{
if (mySerial.available()) {
Serial.print((char)mySerial.read());
i++;
}
if (i > 4) {
Serial.println();
i = 0;
}
}