sâmbătă, 5 septembrie 2015

Am crezut cã este uşor de programat ATTiny85 ….

Cu ideea din titlu, am cumpãrat 4 buc ATTiny 85  neştiind cã  Arduino  IDE trebuie upgradat pentru a putea programa şi acest microcontroller. Am fost nevoit sã mã  "cultiv" din nou pe internet.....
 Arduino IDE trebuie complectat pentru programare  ATTiny 85 cu cîteva fişiere.  O bibliografie bunã şi accesibilã cu ce şi cum se face am gãsit pe siteul :

Pentru cã  pinii lui ATTiny85, precum  şi pinii soclului sânt scurţi şi nu fac contacte sigure pe placa de încercãri (am constatat asta la primele încercãri ) am fãcut o placã –PCB-) care sã aibã:
- conector pentru programare SPI;
- conectori pentru legãturi exterioare;
Nu m-am mai complicat sã schimb frecvenţa de funcţionare , am renunţat la  quarţ , şi lucrez pe 1Mhz.

PCB ATTiny 85

Semnificaţie pini ATTiny 85




Pinii mapaţi în libraria ATTiny (cu culoare violet/verde în poza de sus) sint : 




Pentru cã  pinii lui ATTiny85, precum  şi pinii soclului sânt scurţi. La primele încercãri am constatat cã ei nu fac contacte sigure pe placa de incercare.A trebuit sã fac o placã dedicatã ATTiny85  care sã aibã:
 - conecor pentru programare SPI;
- conectori pentru legãturi exterioare;
Nu m-am mai complicat sã schimb frecvenţa de funcţionare , am renunţat la  quarţ , şi lucrez pe 1Mhz.
Schema PCB: 


Desen cablaj:

Dupã ce am fãcut toate adaptãrile, am cuplat montajul la programatorul  USBTinyIsp, şi am încãrcat sketch-ul BlinkTiny.ino




Nota:
 - am fãcut download din https://code.google.com/p/arduino-tiny/downloads/list poziţia arduino-tiny-0150-020.zip si am dezarhivat-o într-un director, pe un stik ;  am deschis fişierul Readmy.txt şi am parcurs pas cu pas instructiunile, adicã: în directorul unde sint salvate  programele din Arduino IDE (a se vedea locaţia acestuia din  meniul File ->Preferences :


Apoi, trebuie creat directorul “hardware” , unde am copiat fişierele dezarhivate, şi am fãcut fişierul boards.txt : 
      C:\.................................\Arduino\hardware\tiny\license.txt
      C:\.................................\Arduino\hardware\tiny\Prospective Boards.txt
      C:\.................................\Arduino\hardware\tiny\README
      C:\.................................\Arduino\hardware\tiny\bootloaders\
      C:\..................................\Arduino\hardware\tiny\cores\

In plus , am mai fãcut download  de la    aceeaşi  adresã  pentru fişierul tiny-isp-2-0100-0001.zip pe care l-am dezarhivat, într-un director denumit TinyIsp în locatia unde pãstreazã Arduino IDE programele salvate.Acest fişier  (echivalentul lui Arduino ISP din Arduino IDE) transforma Arduino Uno in programator pentru ATTiny .
L-am uloadat pe Arduino Uno , şi  am fãcut conexiunile cu ATTiny 85 . 
Cu încercãrile terminate , am mai fãcut  cîteva etichete pe bord, ca utilizarea sã  fie mai usoarã  














marți, 1 septembrie 2015

Afisaj LDC cu interfata I2c si senzor brick LM50 !

 Am vrut sã scap de cablarea cu fire multe dintre LCD şi Arduino şi mi-am propus sã fac o aplicaţie cu interfaţa I2C. 
 Toate bune şi frumoase , pânã am instalat librãria LiquidCrystal_I2C  şi am constatat cã existã diferenţe faţã de LiquidCrytsal .

Am încercat exemplele “CustomChars.ino” şi “Hello World.ino” din LiquidCrystal_I2C; 
Apoi , am încercat  sã adaptez la I2C  şi exemplele din LiquidCrystal, ca sã mã familiarizez  cu modul de lucru.
Si pentru cã aveam un senzor LM50, am trecut la încercãri.
Ca întotdeauna, am cãutat mai întîi pe modele lucrate de  altcineva  – mi-am zis cã e mai comod.
Am gãsit un exemplu pe:
l-am încercat cu afişare pe SerialMonitor  şi apoi l-am modificat  la afişarea pe LCD I2C.

Cea mai buna bibliografie, pentru explicarea algoritmului 
şi calculelor matematice este pe  site-ul :
ttp://users.utcluj.ro/~rdanescu/pmp-c08.pdf  pagina 31.Tot de aici am preluat şi inaginea paginii 31, cu caracteristicile senzorului LM50 :



............................................................................................................................................
Conexiuni
De la modulul I2c, pinul  SDA  la pinul  A4 de la Ardu Uno
De la modulul I2c , pinul SCL la pinul A5 Ardu Uno
De la Brickul LM50, pinul Out la pinul A0  Ardu Uno

GND – este comun ; Vcc la +5v, comun
............................................................................................................................................

Codul modificat şi complectat (am blocat afişarea pe Serial Monitor ) este redat mai jos :
//…………………………………
//temperaturaC_I2C.ino
//…………………………………
#include <Wire.h>
#include <LiquidCrystal_I2C.h>   
// cu senzor brick LM 50
// am plecat de la schita de pe Robofun cu LM50 si
//http://users.utcluj.ro/~rdanescu/pmp-c08.pdf  pagina 31
//  am adaugat cod pentru afisare pe LCD I2C 16x2
//.......................................
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup(){
 // Serial.begin(9600);
     lcd.init();                      // initialize the lcd
     lcd.backlight(); 
    // Print a message to the LCD.
     lcd.print("Temperatura: ");  
}

void loop(){
 Serial.print("Temperatura: ");
  float temperatura = readTempInCelsius(10,0); //apeleaza functia, cu 10 citiri pe pinul analg A0)
// functia returneaza media a 10 citiri succesive
lcd.setCursor(0,1);
lcd.print(temperatura);
lcd.setCursor ( 6, 1 ); // sare pe linia 2
lcd.print((char)223); // Tipareste cerculetul de la grade Celsius  pe linia 2
lcd.setCursor ( 7, 1 ); // sare pe linia 2
lcd.print("C");
 // Serial.print(temperatura);
 // Serial.print("  ");
  //Serial.write(176);
  //Serial.println("C");
  //delay(200);
  delay(1000);
}

// functia pentru citirea temperaturii , referinte :http://www.robofun.ro/senzor-temperatura-brick
//http://users.utcluj.ro/~rdanescu/pmp-c08.pdf exemplu pagina 31
float readTempInCelsius(int count, int pin) { //unde count= numarul de citiri; la pin-ul specigicat-0
       
        float sumaTemperatura;
        for (int i =0; i < count; i++) { // pentru i de la 1  la 10
            int reading = analogRead(pin);  // citeste pinul analog 0
            float voltage = reading * 5.0;  // 5 este rezolutia la tensiunea de referinta 5V pt Arduino Uno
            voltage /= 1024.0; // imparte la rezolutie senzor
            float temperatureCelsius = (voltage - 0.5) * 100 ; //scade deplasament
            sumaTemperatura = sumaTemperatura + temperatureCelsius;
            }
          return sumaTemperatura / (float)count; //calculeaza media
          }


Succes la cine doreşte sã  încerce !