vineri, 22 martie 2013

Interfata USB-TTL PL2303HX

   In prima comanda-test de la DealExteme - dx.com am inclus si o interfata USB-TTL cu integratul PL2303HX.

   Dupa ce am lansat comanda mi-am dat seama ca acest modul nu are "reset extern" si am inceput sa caut rezolvarea.
   Pe forum-ul Arduino este o schema a unui adaptor USB-TTL cu PL2303HX:

- resetare manuala (trebuie apasat butonul de RESET pe durata scrierii sketch-ului)

- auto-reset


    Pentru a doua varianta trebuie "tras" un fir de la pinul 2 (DTR_N) al integratului PL2303HX si conectat printr-un condensator de 100nF (0,1uF) la pinul 1 de RESET al microcontrolerului ATMega8, ATMega16 sau ATMega168 care are deja "bootloader"-ul incarcat, deci e un "Arduino de casa" sau va fi inclus in componenta unui montaj mai complex, urmand a fi programat sau reprogramt cu un anumit sketch.
   Deoarece eram curios daca e functional, am conectat interfata la calculator si s-a aprins un LED rosu
apoi a fost depistat ca nu are driver-ul instalat:
   Am cautat repede pe net driverul si l-am gasit la http://www.prolific.com.tw/
  Am instalat driverul:



   Din pacate nu am putut gasi momentan, la un pret decent, un microcontroler sa-i scriu bootloader-ul pentru a testa placa.

marți, 19 martie 2013

Senzorul ultrasonic de distanta HC-SR04 si Arduino

    Am facut (si primit dupa 5 saptamani) o comanda-test de 7,70$ la chinezii de la DealExtreme (dx.com) pentru 3 produse, dintre care si un senzor ultrasonic de distanta HC-SR04, care poate masura distanta intre senzor si un obiect intre 2cm si 4m (4,5-5m dupa alte surse) la un unghi de maxim 15 grade, cu o precizie de 3mm. 




   Modulul HC-SR04 are 4 pini:
- alimentare +5V
- initiere semnal (TRIGGER)
- raspuns semnal (ECHO)
- masa (GND)



   Am gasit 2 variante de fisa tehnica (datasheet): una la  http://www.micropik.com/PDF/HCSR04.pdf si una la http://jaktek.com/wp-content/uploads/2011/12/HC-SR04.pdf.
   Din cele 2 am extras ca dupa trimiterea unui semnal pe terminalul TRIGGER cu durata de 10us (zece microsecunde), se asteapta raspunsul pe terminalul ECHO, iar durata acestui impuls obtinut impartit la 38 va da distanta pana la un obiect in cm; daca nu este nici un obstacol, timpul de raspuns este de 58ms. Durata impulsului obtinut la terminaul ECHO are durata intre 150us, corespunzatoare distantei de 2,58cm, si 25ms, corespunzatoare distantei de 4,31m=431cm.
   La o prima cautare a unui articol despre modulul HC-SR04 si Arduino, am dat de How to interface the HC-SR04 ultrasonic ranging module to Arduino in care este prezentat si un sketch, pentru afisarea pe ecranul calculatorului a distantei.

/*
 * Define the pins you want to use as trigger and echo.
 */

#define ECHOPIN 2        // Pin to receive echo pulse
#define TRIGPIN 3        // Pin to send trigger pulse

/*
 * setup function
 * Initialize the serial line (D0 & D1) at 115200.
 * Then set the pin defined to receive echo in INPUT 
 * and the pin to trigger to OUTPUT.
 */
 
void setup()
{
  Serial.begin(115200);
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
}

/*
 * loop function.
 * 
 */
void loop()
{
  // Start Ranging
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);
  // Compute distance
  float distance = pulseIn(ECHOPIN, HIGH);
  distance= distance/58;
  Serial.println(distance);
  delay(200);
}
    Schema se conectare a modului la Arduino fiind:



   Aceasta schema se poate completa cu un afisaj LCD cu 2 randuri a 16 coloane.

   Va recomand sa studiati si articolul Ping Ultrasonic Range Finder de pe site-ul oficial ARDUINO este prezentat un senzor cu 3 pinii, adica e un terminal comun pentru trimitere si primire date despre distanta.




miercuri, 20.03.2013
   Dupa ce am realizat realizat montajul, am incarcat sketch-ul putin modificat deoarece eu am conectat terminalul TRIG la terminalul digital 9 (D9) al lui Arduino, iar pe ECHO la D8, deoarece eu am si partea de afisaj conectata:

#define ECHOPIN 8       // Pin to receive echo pulse
#define TRIGPIN 9        // Pin to send trigger pulse





   Dupa incarcarea sketch-ului am constat ca pe ecranul de monitorizare seriala am numai ciudatenii, datorita diferentei dintre viteza de transfer pe serial, in sketch de 115200bps, iar la monitorizare de 9600bps. Dupa ce am modificat la ecranul de monitorizare la 115200bps valorile au inceput sa arate normal.





   Am verificat distanta cu o rigla pentru o distanta mica de cca. 40cm si a fost ok, apoi o distanta de cca. 2m cu un telemetru si eroarea a fost de cca. 2mm, deci e ok.

  Am adaptat sketch-ul pentru a afisa distanta pe afisajul LCD 16x2:


// from http://www.xappsoftware.com/wordpress/2012/03/15/how-to-interface-the-hc-sr04-ultrasonic-ranging-module-to-arduino/

#define ECHOPIN 8      // Pin to receive echo pulse
#define TRIGPIN 9        // Pin to send trigger pulse

// from  http://arduino.cc/en/Tutorial/LiquidCrystalDisplay
// The circuit LCD 16x2:
// * LCD RS pin to digital pin 12
// * LCD Enable pin to digital pin 11
// * LCD D4 pin to digital pin 5
// * LCD D5 pin to digital pin 4
// * LCD D6 pin to digital pin 3
// * LCD D7 pin to digital pin 2
// * LCD R/W pin to ground
// * 10K resistor:
// * ends to +5V and ground
// * wiper to LCD VO pin (pin 3)

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// adapted sketch for ultrasonic module HC-SR04 and 16x2 LCD by niq_ro
// http://www.tehnic.go.ro 
// http://www.nicuflorica.blogspot.com

void setup()
{
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("www.tehnic.go.ro");
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay(2000);
  // clear the screen
  lcd.clear();
}

/*
 * loop function.
 * 
 */
void loop()
{
  // Start Ranging
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);
  // Compute distance
  float distance = pulseIn(ECHOPIN, HIGH);
  distance= distance/58;
  // prind data on LCD  
  lcd.setCursor(0, 0);
  lcd.print("distanta este de");
  lcd.setCursor(2, 1);
  lcd.print("            ");
  lcd.setCursor(5, 1);
  lcd.print(distance);
  lcd.print("cm");
  delay(1000);
  //lcd.clear();
  
}




    Am modificat sketch-ul sa afiseze in mm, fara zecimale si sa faca o medie a 100 de masuratori, fiecare realiazata la 10ms una de alta:


// from http://www.xappsoftware.com/wordpress/2012/03/15/how-to-interface-the-hc-sr04-ultrasonic-ranging-module-to-arduino/

#define ECHOPIN 8        // Pin to receive echo pulse
#define TRIGPIN 9        // Pin to send trigger pulse

// from  http://arduino.cc/en/Tutorial/LiquidCrystalDisplay
// The circuit LCD 16x2:
// * LCD RS pin to digital pin 12
// * LCD Enable pin to digital pin 11
// * LCD D4 pin to digital pin 5
// * LCD D5 pin to digital pin 4
// * LCD D6 pin to digital pin 3
// * LCD D7 pin to digital pin 2
// * LCD R/W pin to ground
// * 10K resistor:
// * ends to +5V and ground
// * wiper to LCD VO pin (pin 3)

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// adapted sketch for ultrasonic module HC-SR04 and 16x2 LCD by niq_ro
// http://www.tehnic.go.ro 
// http://www.nicuflorica.blogspot.com

void setup()
{
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("www.tehnic.go.ro");
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay(2000);
  // clear the screen
  lcd.clear();
}

/*
 * loop function.
 * 
 */
void loop()
{
  float medie = 0.00;
  float distance1;
  for (int i=0; i <= 100; i++){ 
   // Start Ranging
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);
  // Compute distance
  float distance = pulseIn(ECHOPIN, HIGH);
  distance1 = 10*distance/58;
  medie = medie + distance1;
  delay(10);
  }
  int dist = medie/100;
  // prind data on LCD  
  lcd.setCursor(0, 0);
  lcd.print("distanta este de");
  lcd.setCursor(2, 1);
  lcd.print("            ");
  lcd.setCursor(5, 1);
  lcd.print(dist);
  lcd.print("mm");
  delay(200);
  //lcd.clear();
  
}






    Am realizat 3 filmulete cu functionarea:
ultrasonic distance sensor with Arduino and LCD16x2:
ultrasonic distance sensor with Arduino and LCD16x2 (2)
ultrasonic distance sensor with Arduino and LCD16x2 (3)

    M-am gandit ca un indicator al gamei de masura poate fi mai sugestiv, asa ca ma considerat ca 4m este suficient, asa ca din cele 16 coloane ale unui rand pe ecranul LCD, pasii sunt de 250mm (25cm).
    Sketch-ul este:


// from http://www.xappsoftware.com/wordpress/2012/03/15/how-to-interface-the-hc-sr04-ultrasonic-ranging-module-to-arduino/

#define ECHOPIN 8        // Pin to receive echo pulse
#define TRIGPIN 9        // Pin to send trigger pulse

// from  http://arduino.cc/en/Tutorial/LiquidCrystalDisplay
// The circuit LCD 16x2:
// * LCD RS pin to digital pin 12
// * LCD Enable pin to digital pin 11
// * LCD D4 pin to digital pin 5
// * LCD D5 pin to digital pin 4
// * LCD D6 pin to digital pin 3
// * LCD D7 pin to digital pin 2
// * LCD R/W pin to ground
// * 10K resistor:
// * ends to +5V and ground
// * wiper to LCD VO pin (pin 3)

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// adapted sketch for ultrasonic module HC-SR04 and 16x2 LCD by niq_ro
// http://www.tehnic.go.ro 
// http://www.nicuflorica.blogspot.com

void setup()
{
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print first message to the LCD.
  lcd.print("www.tehnic.go.ro");
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay(2500);
  // clear the screen
  lcd.clear();

// Print second message to the LCD.
  lcd.setCursor(0, 0);
  lcd.print("masurare dist.cu");
  lcd.setCursor(0, 1);
  lcd.print("HC-SR04 ver.2m3");
  delay(2500);
  // clear the screen
  lcd.clear();
  
}

/*
 * loop function.
 * 
 */
void loop()
{
  float medie = 0.00;
  float distance1;
  for (int i=0; i <= 50; i++){ 
   // Start Ranging
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);
  // Compute distance
  float distance = pulseIn(ECHOPIN, HIGH);
  distance1 = 10*distance/58;
  medie = medie + distance1;
  delay(10);
  }
  int dist = medie/50;
  // print data on first row at LCD  
  lcd.setCursor(0, 0);
  lcd.print("distanta: ");
  lcd.setCursor(9, 0);
  lcd.print("            ");
  lcd.setCursor(9, 0);
  lcd.print(dist);
  lcd.print("mm");
  delay(200);
  
  // print moving star on second row at LCD
  lcd.setCursor(0, 1);
  lcd.print("----------------");
     if (dist >= 3750)
  {
  lcd.setCursor(14, 1);
  lcd.print(">>");
  }
     else if (dist >= 3500)
  {
  lcd.setCursor(14, 1);
  lcd.print("*");
  }
     else if (dist >= 3250)
  {
  lcd.setCursor(12, 1);
  lcd.print("*");
  }
     else if (dist >= 3000)
  {
  lcd.setCursor(11, 1);
  lcd.print("*");
  }
     else if (dist >= 2750)
  {
  lcd.setCursor(10, 1);
  lcd.print("*");
  }
     else if (dist >= 2500)
  {
  lcd.setCursor(9, 1);
  lcd.print("*");
  }
     else if (dist >= 2250)
  {
  lcd.setCursor(8, 1);
  lcd.print("*");
  }
     else if (dist >= 2000)
  {
  lcd.setCursor(7, 1);
  lcd.print("*");
  }
     else if (dist >= 1750)
  {
  lcd.setCursor(6, 1);
  lcd.print("*");
  }
     else if (dist >= 1500)
  {
  lcd.setCursor(5, 1);
  lcd.print("*");
  }
   else if (dist >= 1250)
  {
  lcd.setCursor(4, 1);
  lcd.print("*");
  }
   else if (dist >= 1000)
  {
  lcd.setCursor(3, 1);
  lcd.print("*");
  }
   else if (dist >= 750)
  {
  lcd.setCursor(2, 1);
  lcd.print("*");
  }
   else if (dist >= 500)
  {
  lcd.setCursor(1, 1);
  lcd.print("*");
  }
 else if (dist >= 250)
  {
  lcd.setCursor(0, 1);
  lcd.print("*");
  }
}








    Am facut si un filmulet, numit ultrasonic distance sensor with Arduino and LCD16x2 (4):

luni, 18 martie 2013

Placa de verificare integrat AN6884, optocuplor PC817 si LED-uri

    Dupa ce am achizitionat 2 integrate AN6884 de la MIVAROM, am constatat ca sunt inscriptionate diferit, asa ca m-am gandit sa-mi fac o placuta de testare.

    Deoarece integratul are o capsula SIL cu 9 pini (9 pini in linie), am folosit 2 socluri DIL unul de 14 pini si unul de 8 pini lipite, deoarece baretele mama (folosite la Arduino) nu asigurau un contact bun.



   Schema este pe care am realizat-o este cea din datasheet si pe care am mai prezentat-o in articolul VU-metru stereo cu AN6884.
    Am realizat un filmulet, numit AN6884 on test board:


    Acolo mai tratasem o varianta de completare cu un canal de pauza/negativ, dar am realizat niste masuratori si am constata ca tensiunile variaza funtie de tensiunea de alimentare, deoarece LED-urile sunt alimentate prin surse de curent constant de 15mA.

   M-am gandit ca ar fi mai buna o varianta cu optocuplor, inseriind LED-ul acestuia cu LED-ul nr. 1. Am recuperat un optocuplor PC817 dintr-o sursa PC defecta. PC817 este in capsula DIP cu 4 pini, asa ca am mai montat un soclu cu 6 pini.


    Am realizat un filmulet numit 5+1 LED VU-meter with AN6884 and PC817:
    Pentru a nu reactiona instantaneu LED-ul pentru canalul negativ (sau de pauza), se pune un condensator de 1..10uF la iesirea tranzistorului din optocuplor:

vineri, 8 martie 2013

De unde cumpar(am) componente electronice

   Deoarece am tot fost intrebat de unde cumpar componente electronice sau ce as recomanda, m-am gandit sa fac o mica prezentare.
   Dupa "revolutie" cumparam revista RET de la distribuitorul lor local din Craiova, care apoi si-a facut firma ADELAIDA, care concura cu cele existente DIODA  si magazinul MUZICA (care nu mai sunt active).
   O perioada destul de lunga, am cumparat numai de la Adelaida, cu toate mutarile punctelor de vanzare: Brestei, langa Gradina Botanica, pe Fratii Buzesti si acum langa fostul cinema MODERN.
   Am avut si o perioada cand am lasat mai moale cu electronica, asa ca nu am mai urmarit piata, dar achizitionand placa de dezvoltare Arduino am fost nevoit sa mai achizitionez componente, asa ca situatia este urmatoarea:
- urmaresc site-ul firmei ADELAIDA si functie de oferta, am comandat on-line (cand era o oferta sa faca pachet cu piesele comandate si le ridicai de la magazin, fara alte costuri), mai cumpar din magazin, dar partea proasta este ca preturile de pe site nu sunt reale, fiind mult mai mici decat in realitate, iar in stoc nu sunt cele prezentate... si nu aduc la comanda componente aparent uzuale (LED-uri RGB) chiar daca se solicita:



- mai cumpar de la QUINTRIX, care are 2 magazine, unul central, langa ADELAIDA si unul pe Calea Bucuresti (intre Rotonda si Facultatea de Mecanica), preturile nu difera prea mult de Adelaida, dar sunt sub pretul acesteia... 

- piese marunte si uzuale (barete, cablaje de test, circuite integrate, etc) cu preturi decente cumpar de la ANKH, care este pe Calea Bucuresti

- urmaresc site-ul firmei TME si compar cu preturile de la Adelaida; nu am cumparat direct de la ei, deoarece trimit doar prin curierat rapid deci costurile cresc cu cca. 20 lei pentru transport.. la comanda mica nu e rentabil, dar ii recomand, deoarece au marfa multa si diversificata, iar sistemul de prezentare a stocului este foarte bine pus la punct.
- desi urmaresc de f. mult timp site-ul firmei MIVAROM din Alexandria, abia acum am riscat sa cumpar on-line de la ei, doarece pe net nu au o imagine f. buna, dar ce am comandat eu sunt la pret excelent, calitatea e ok, iar coletul a fost trimis cu Posta iar costurile sunt mici, cca. 7,5lei.
- un distribuitor mare este VITACOM la care nu am apelat, dar multe magazine cumpara en-gros de la ei.
- am lansat de vreo luna o comanda mica (simbolica chiar) la chinezii de la DealExtreme - dx.com, dar inca nu a ajuns coletul sa-mi dau cu parerea de calitate.
   
   Cam atat pentru moment... astept parerile voastre si, poate, si ale celor mentionati mai sus ;-)