luni, 28 aprilie 2014

Sisteme de comanda radio folosind HT12E si HT12D

   Sistemele de transmisie a datelor sau comenzilor la distanta scurta, si nu numai, trebuie sa fie cumva "codate" pentru evitatarea receptionarii unor comenzi false, de la un alt emitator sau de la un semnal aleator.
   Pe piata se gasesc mai multe integrate "pereche" care asigura codarea, resepctiv decodarea informatiilor transmise, iar eu m-am oprit la perechea HT12E/HT12D produsa de Holtek.
   Integratul codor de tipul HT12E se poate alimenta cu tensiune de la 2,4V pana la 12V, fiind utilizat inclusiv in telecomenzile alarmelor de masina sau pentru acces garaj.
   HT12E poate fi pus pe una din 28 adrese (A0..A7) si permite 4 comenzi (AD8..AD11), iar frecventa de lucru este functie de o resistenta externa si tensiunea de alimentare.
   O schema de aplicatie recomandata de producator este:
 iar una simplificata:
   Valoarea rezistentei externe se alege din graficul de mai jos:
   Eu vreau sa alimentez emitatorul de la 3V, deoarece nu am nevoie de distanta mare de comanda (cu cat tensiunea de alimentare este mai mare, emitatorul are puterea de emisie mai mare), iar frecventa de oscilatie recomandata in fisa de catalog (datasheet) este de 3kHz, rezulta ca trebuie sa pun o rezistenta de 820k.
   Partea de decodare cu HT12D are schema tipica de conectare:
   Tensiunea de alimentare este tot intr-un domeniu larg, de la 2,4V la 12V, iar adresele sunt tot 28, ca numar si 4 comenzi (D8..D11).
   Rezistenta externa se alege in functie de frecventa necesara pentru decodorul HT12D si de tensiunea de alimentare.
     In cazul meu, frecventa decodorului trebuie sa fie de 150kHz (de 50 de ori mai mare ca a codorului), iar tensiunea de alimentare o aleg a fi 5V (pentru a putea interactiona ulterior cu o placa Arduino), asa ca valoarea necesara este de 51k.
   Dupa cum apare si in schemele tipice, ele se pot conecta la module de emisie, respectiv receptie pe aceeasi frecventa (cele uzuale sunt pe 315MHz sau 433MHz).
   Cand m-am gandit sa le folosesc, am gasit pe piata, la TME, pe HT12E in varianta SMD, iar pe HT12D in varianta THT, clasica, asa ca am desenat cablajele dupa acestea:
2.mai.2014
   Am reusit sa asamblez un emitator si 2 receptoare sa vad cum se comporta si am facut si 3 filmulete:

vineri, 18 aprilie 2014

Raspberry Pi - prima impresie

   Deoarece am fost, cat de cat, cuminte, am primit un Paspberry Pi insotit de un card de 8Gb si un alimentator de 5V/1A.
   Raspberry Pi este un "computer (capabil sa ruleze Linux) de dimensiunea unui card de credit, cu placa de retea Ethernet inclusa, conector HDMI, 2 port-uri USB, 512 MB RAM, procesor ARM la 700 MHz".
   Am facut cateva poze mai detaliate ale placii si accesoriilor





   Punand cardul SD intr-un cititor am descoperit ca am mai multe sisteme de operare.
   M-au uitat pe cutia in care fusese placa si cardul si era scris sa vizitez adresa http://www.element14.com/raspberrypi si am descoperit ca pe card este o aplicatie numita NOOBS, cu care pot instala unul din cele 6 sisteme de operare:
- Arch Linux
- OpenELEC (Xbox Media Centre)
- Pidora
- RISC OS
- RaspBMC (Xbox Media Centre)
- Raspbian
   Tot pe acolo am gasit un articol numit Installing OS With NOOBS... in care se prezinta modul cum se instaleaza un sistem de operare folosind interfeta NOOBS...
   Desi sunt mai multe filmulete explicative, am pe primul gasit numit NOOBS: The Easiest Raspberry Pi Setup
   Nu sust total pregatit pentru teste, dar astept sa-mi vina o carcasa si un cablu adaptor HDMI la VGA (pentru a folosi un monitor de calculator).
(23.05.2014 - Din pacate, cablul adaptor HDMI-VGA nu functioneaza, trebuie un adaptor HDMI la VGA).

   Din primele informatii, am descoperit ca Raspberry Pi nu are intrari analogice, dar se poate folosi de un Arduino, cu care sa comunice pe protocol i2c prin intermediul unei interfete bidirectionale (deoarece Raspbbery nu accepta decat nivel logic de 3,3V iar Arduino lucreaza cu 5V). 
 
   In articolul numit Raspberry Pi with I2C-Arduino-Slave se gaseste prezentat acest mod de comunicare:
    Ca un rezumat, primele impresii sunt bune... urmeaza in curand teste si experimente, dupa sarbatorile de Paste...

miercuri, 16 aprilie 2014

Indicator date mediu pentru masina (3)

   Dupa o mica pauza, am reluat partea cu indicatorul de date mediu pentru masina:
- temperatura exterioara, masura cu un senzor DS18B20
- temperatura si umiditate interior masina, masurate cu senzorul DHT11
- tensiunea de pe baterie (acumulator), prin intermediul unui divizor rezistiv.
   Partea descriptiva am prezentat-o in articolul Indicator date mediu pentru masina, iar partea cu teste cu Arduino in articolul Indicator date mediu pentru masina (2), dar ideea a fost sa pun pe masina un montaj independent, asa ca am desenat cu ajutorul programului Eagle PCB Software o schema, dupa care am desenat si cablajul.
   Cablajul a fost realizat de Cristi din Satu Mare, prin metoda transferului de tonner de la o imprimanta laser.
   Am dat gauri in cablaj si m-am apucat de plantat si lipit piesele:
   Dupa ce am pus minimul de piese necesare, am conectat interfata USB si am alimentat si incarcat sketch-ul:
   Neavand intrarile conectate, apar mesaje ciudate la tensiune si temperaturi, dar e bine din punct de vedere al functionarii, dupa cum vedeti si in filmuletul indicator mediu - masina (II)
   A urmat trecelea la alimentarea dintr-o sursa stabilizata reglabila cu tensiunea de 14,5V (valoarea maxima de pe masina) si am lasat vreo 8 ore si nu s-a incalzit regulatorul de tensiune de tip 7805, iar prezentarea experimentului este in filmuletul indicator mediu - masina (III)
   Alimentatorul reglabil folosit de mine a fost prezentat in articolul LM317 si este realizat dupa o schema publicata in Almanahul Tehnium din 1990, iar despre partea de stabilizare de 5V folosita pe placa puteti citi in articolul 78xx.
   Sketch-ul trebuie modificat un pic fata de cel prezentat in articolul Indicator date mediu pentru masina (2) deoarece sunt folositi alti pini pentru afisaj:
// http://nicuflorica.blogspot.ro/2014/04/indicator-date-mediu-pentru-masina-3.html
// original sketch by niq_ro
#include <LiquidCrystal.h>
// folosesc libraria pentru afisaje LCD simple
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
// indic modul de legare, vezi mai jos:
/*                                    -------------------
                                      |  LCD  | Arduino |
                                      -------------------
 LCD RS pin to digital pin 7          |  RS   |   D7    |
 LCD Enable pin to digital pin 8      |  E    |   D8    |
 LCD D4 pin to digital pin 9          |  D4   |   D9    |
 LCD D5 pin to digital pin 10         |  D5   |   D10   |
 LCD D6 pin to digital pin 11         |  D6   |   D11   |
 LCD D7 pin to digital pin 12         |  D7   |   D12   |
 LCD R/W pin to ground                |  R/W  |   GND   |
                                      -------------------
*/
// http://arduino.cc/en/Reference/LiquidCrystalCreateChar

byte grad[8] = {
  B01100,
  B10010,
  B10010,
  B01100,
  B00000,
  B00000,
  B00000,
};

// variables 

float R1, R2, R3; // rezsistors in voltage divisor
float k1; // adjustment for divisor
float u1, u11, u12; // for voltage

int ti; // temperature inside of car;

// data
int VPin = A0; // voltage pin
int DHTPin = A1; // data pin from DHT11
//int DSPin = A2; // 

// for DHT11 sensor
#include "DHT.h"
#define DHTPIN A1     // what pin we're connected to
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);



#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 10 on the Arduino
#define ONE_WIRE_BUS A2
#define TEMPERATURE_PRECISION 9
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
// arrays to hold device addresses
DeviceAddress outsideThermometer;


void setup() {

R1 = 4.7; // R1 = 4k7
R2 = 10;  // R2 = 10k
R3 = 4.7; // R3 = 4k7
k1 = 1/1.033;


  lcd.createChar(0, grad);
    
  lcd.begin(16, 2); // set up the LCD's number of columns and rows: 
 
// initialing the DHT11 sensor;
dht.begin();

 lcd.clear(); // clear the screen
 lcd.setCursor(1, 0); // put cursor at colon 2 and row 0 = left/up
 lcd.print("indicator bord"); // print a text
 lcd.setCursor(2, 1); // put cursor at colon 0 and row 0 = left/down
 lcd.print("1.0 by niq_ro"); // print a text
 delay (2000);
 lcd.clear(); // clear the screen
 
// Start up the DS18B20 sensor
  sensors.begin();
// adress for ds sensor  
//   DeviceAddress outsideThermometer  = { 0x28, 0xAC, 0x7A, 0xD4, 0x04, 0x00, 0x00, 0x7E };
//  DeviceAddress outsideThermometer = { 0x28, 0xAC, 0x7A, 0xD4, 0x4, 0x0, 0x0, 0x7E };
// set the resolution to 9..12 bit
  sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);


} // END void setup




  
void loop(){
  
u1 = analogRead(VPin);
u11 = k1*5.0*u1/1023*(R1+R2+R3)/R1;
u12 = u11 + 0.05;
//u12=11.4; // for test
// u12=7.5;  //for test;

if (u12<10.0)
{
  lcd.setCursor(12, 0);
  lcd.print(u12,1);
  lcd.print("V");
  delay(500);
  lcd.setCursor(12, 0);
  lcd.print("    ");
  }  
else
{
  lcd.setCursor(11, 0);
  lcd.print(u12,1);
  lcd.print("V");
  delay(500);
}

// DHT11 part
 int h = dht.readHumidity();
 int ti = dht.readTemperature();

  lcd.setCursor(0, 1);
  lcd.print("int:");
//ti=0; // for test;
//ti=7;  // for test;
//ti=29;  // for test;
  if (ti<1) {
  lcd.setCursor(5, 1);
  lcd.print(" 0");
  lcd.write(byte(0));
  lcd.print("C");
  delay(500);
  lcd.setCursor(5, 1);
  lcd.print("     ");
  }
  else
  if (ti>=9) {
  lcd.setCursor(4, 1);
  lcd.print("+");
  lcd.print(ti);
  lcd.write(byte(0));
  lcd.print("C");
  }
  else
  //if (ti>=1 || ti<10)
  {
  lcd.setCursor(5, 1);
  lcd.print("+");
  lcd.print(ti);
  lcd.write(byte(0));
  lcd.print("C");
  }

  lcd.setCursor(11, 1);
  lcd.print(h);
  lcd.print("%um");

// 
 DeviceAddress outsideThermometer = { 0x28, 0xAC, 0x7A, 0xD4, 0x4, 0x0, 0x0, 0x7E };
 sensors.requestTemperatures();
 float te = sensors.getTempC(outsideThermometer);
// printTemperature(DeviceAddress outsideThermometer);
 delay(300);
//te=-24;
//te=-2;
//te=-0.4;
// te=0;
//te=0.3;
//te=5;
//te=17;
//te=17.6;


lcd.setCursor(0, 0);
lcd.print("ext:");


if (te<-10) {
 lcd.setCursor(4, 0);
 lcd.print(te,0);
lcd.write(byte(0));
lcd.print("C   ");
}
else
if (te>-10 || te<0) {
  lcd.setCursor(5, 0);
lcd.print(te,0);
lcd.write(byte(0));
lcd.print("C   ");
}

else
if (te=0) {
lcd.setCursor(5, 0);
lcd.print("=0");
lcd.write(byte(0));
lcd.print("C   ");
}

if (te>0) 
{
lcd.setCursor(5, 0);
lcd.print("+");
lcd.print(te,0);
lcd.write(byte(0));
lcd.print("C   ");
}

if (te>=10) {
lcd.setCursor(4, 0);
lcd.print("+");
lcd.print(te,0);
lcd.write(byte(0));
lcd.print("C   ");
}
}   
   Am pus si rezistentele si senzorii si, am costatat ca noul senzor DHT11 consuma peste 1A, undeva la 1,2A.. si se incinge rau LM7805... l-am deconectat si am pus altu' si acum e ok... consumul montajului este de aproximativ 30mA..
 
   Ce am testat arata ca in filmuletul indicator mediu - masina (IV)
   La un consum exagerat (peste 1A) nu au avut nicio sansa stabilizatoarele de tensiune de pe placile Arduino la testele anterioare... 

luni, 7 aprilie 2014

Resetare multifunctionale Canon MP180 (sau similare)

   Am un multifunctional Canon MP180 (imprimanta cu jet de cerneala si scaner + "copiator"), care a inceput sa ma "supere", in sensul ca listez foarte putine pagini si ma trezesc ca am cartusele goale, am eroare la recunoastere cartuse si atunci nu pot nici macar scana..
   L-am achizitionat acum ceva ani, in ideea de a-l folosi pentru uz caznic, sa zic asa... cu toata aceasta "grija" pentru multifunctional, am fost fost nevoit sa cumpar cateva cartuse noi, ca ori se "ardeau cip-urile" ori se infundau "diuzele" ca il foloseam prea rar..
   Cu toate ca aceaste cartuse au "cip"-uri, ele se pot reseta si reincarca de cateva ori... cel color,e mai sensibil si se cam "arde"... dupa o perioada trebuie "resetata" si imprimanta astfel incat sa recunoasca cartusele incarcate.
   Un utilitar, rusesc, se pare, care face acest lucru, este MPTool.. pe care un l-am gasit pe un blog lituanian in articolul MPTool Multi Resetter For Canon MP si acolo se mentioneaza ca  e bun pentru seriile MP150, MP160, MP170, MP180, MP450, MP460.

   Pentru a aduce imprimanta in modul de service, se parcurg etapele:
   1) Se scoate stecherul din priza (sau daca prelungitorul in care este introdus are intrerupator, se deconecteaza alimentarea de acolo)
   2) Se tine apasat butonul ON/OFF (de pornire/oprire) si se alimenteaza multifunctionalul
   3) Cand LED-ul indicator e verde, se apasa si apoi se elibereaza butonul STOP/RESET (simbolul este de triunghi intors cu varful in jos intr-un cerc rosu)
   4) Se elibereaza butonul ON/OFF
   LED-ul aprins in verde se stinge, iar cel de avarie se va aprinde in culoarea galbena, indicand intrarea in modul de service.
   Calculatorul va "vedea" o noua imprimanta (care va ramane si ulterior, putand fi redenumita pentru a nu apare confuzii, cu un nume de genul Canon Service Mode)

   Deschideti utilitarul si resetati contoarele celor 2 cartuse (Reset Counters - Reset Blank si apoi Reset Color)
   Se opreste imprimanta si se scoate stecherul din priza si se reporneste. 


22.04.2014
   Niste "printscreen"-uri din timpul rescrierii EEPROM-ului: