marți, 18 februarie 2014

Text deplasabil pe matrice 24x6 LED-uri

mici modificari in 20.2.2022
  Am gasit un articol numit Make a 24X6 LED matrix, care se tot repeta pe net in aceasi prezentare (vezi si articolul Led Matrix). 
   In acest(e) articol(e) este prezentat si filmul numit 24X6 LED matrix
   M-am apucat sa iau la mana sketch-urile din articol si am inceput cu definirea literelor, cifrelor si simbolurile:

- litera A (BA = big A) din articol:
- litera A, propusa de mine:
- litera a (LA = little A):
- litera B:
- litera B, propusa de mine:
- litera b:
- litera C:
- litera C, propusa de mine:
- litera c:
- litera D:
- litera d:
- litera E:
- litera e:
- litera F:
- litera f:
- litera G:
- litera g:
- litera H:
- litera h:

- litera I:
- litera I, propusa de mine:
- litera i:
- litera J:
- litera j:
- litera K:
- litera k:
- litera L:
- litera l:
- litera M:
- litera m:
- litera N:
- litera n:
- litera O:
- litera o:
- litera P:
- litera p:
- litera Q:
- litera q:
- litera R:
- litera r:
- litera S:
- litera s:
- litera T:
- litera t:
- litera U:
- litera u:
- litera V:
- litera v:
- litera W:
- litera w:
- litera X:
- litera x:
- litera Y:
- litera y:
- litera Z:
- litera Z, propusa de mine:
- litera z:
- cifra 0:
- cifra 1:
- cifra 2:
- cifra 3:
- cifra 4:
- cifra 4, propusa de mine:
- cifra 5:
- cifra 5, propusa de mine:
- cifra 6:
- cifra 6, propusa de mine:
- cifra 7:
- cifra 7, propusa de mine:
- cifra 8:
- cifra 8, propusa de mine:
- cifra 9:
- cifra 9, propusa de mine:
- semnul intrebarii:
- semnul exclamarii:
- doua puncte:
- virgula:
- punct:
- liniuta:
- spatiu:
  Schema si cablajul:
iar conectarea LED-urilor in matrice este:

4.12.2014
   Am realizat si eu un montaj, fiind inca in teste, dar am facut mai multe filmulete, din care prezint pe cel numit 24x6 led matrix test (8)


20.2.2022
   Am recuperat poze din timpul realizarii si testarii montajului:

marți, 11 februarie 2014

Transferarea unui proiect Arduino pe un cablaj

   Miniorga de lumini cu placuta Arduino Pro Mini, prezentata in articolul Miniorga de lumini cu Arduino o s-o transfer ca proiect independent pentru a nu-mi bloca placa Arduino, breadboard-ul si firele.
   Cea mai simpla metoda a fost sa proiectez un cablaj pentru miniorga cu 4 canale, cu minimul de componente, folosindu-ma de programul specializat EAGLE PCB Software:
   O varianta de cablaj a fost realizata de Nelu Gulie:
   Pe acest cablaj, am montat 2 randuri de riglete mama de cate 12 pini fiecare pentru introducerea placutei Arduino Pro Mini, una tata de 5 pini pentru conectarea unor LED-uri externe sau a unor optocuploare si a o transforma in orga de lumini cu becuri, o rigleta tata cu 3 pini pentru conectarea unui (pre)amplificator audio si o mufa pentru alimentare.
   Nu am finalizat montajul, dar am facut teste cu un LED RGB si unul alb, dupa cum se vede in filmuletul Arduino light organ (11)

   Urmatorul pas este transferarea proiectului, pentru o orga de lumini cu becuri, folosindu-ma de un ATmega328 cu bootloader de Arduino...
   Schema arata cam asa, dar momentan nu-s trecute valorile, dar cam asa ar arata:
   Revin cu poze ale montajului nefinalizat, si cu ceva corecturi pe partea cu lipituri:
 
 
si poze cu montajul in teste:
 
 
13.02.2014
   Am primit de la Adrian Roman un cablaj pentru orga de lumini:
17.02.2014
   Dupa ce "mi-am batut joc" de partea cu piese, deoarece am avut temperatura prea mica la fierul de calcat, acum placa e gaurita:
si are "plantate" cateva componente:
19.02.2014
   Am mai "plantat" si lipit cateva piese:
 
20.02.2014
   Am finalizat montajul de miniorga de lumini cu Arduino Pro Mini:

   Am facut si un filmulet, numit Arduino light organ (12):

luni, 10 februarie 2014

Mai multi senzori de tip DS18B20 (sau MAX31820) in paralel (2)

   In articolul anterior, Mai multi senzori de tip DS18B20 (sau MAX31820) in paralel, am conectat 3 senzori din familia DS18x20 (unul DS18B20 si 2 de tipul MAX31820), acum ca am primit inca 2 monstre de tipul DS18B20 de la Dallas Semiconductor (Maxim Integrated), cum primisem, in ianuarie, si pe cei 2 senzori MAX31820, am zis ca pot citi temperatura in 5 puncte.
 
   Schema de conectare a senzprilor este identica, toti 5 vor fi in paralel:
iar prezentarea datelor am facut-o pe un afisaj LCD alfanumeric cu 16 coloane si 2 randuri (1602 sau 16x2):
   Montajul arata asa:
   Am adaptat sketch-ul folosit in articolul Mai multi senzori de tip DS18B20 (sau MAX31820) in paralel combinandu-l cu cel din articolul Interfata i2c la LCD pentru Arduino:
// full sketch by niq_ro from http://nicuflorica.blogspot.com
// or http://www.tehnic.go.ro
// or http://arduinotehniq.blogspot.com/

#include <Wire.h> // for i2c protocol

#include <OneWire.h>
// http://www.pjrc.com/teensy/td_libs_OneWire.html
// http://milesburton.com/Dallas_Temperature_Control_Library
OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)  

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2); // 0x20 is adresss for LCC 16x2

byte grad[8] = {
  B01110,
  B10001,
  B10001,
  B01110,
  B00000,
  B00000,
  B00000,
};

int ics =0; //count number of sensor

void setup(){
  lcd.init(); 
  lcd.backlight(); //backlight is now ON
  // set up the LCD's number of columns and rows: 
  lcd.createChar(0, grad);
  lcd.begin(16, 2);
  // Print a logo message to the LCD.
  lcd.print("www.tehnic.go.ro");  
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay (2500);
  lcd.clear();
   
  // Print a message to the LCD.
  lcd.setCursor(1, 0);
  lcd.print("temperatura in");
  lcd.setCursor(1, 1);
  lcd.print("mai multe zone");
  delay (2500);
  lcd.clear();
}



void loop(){
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
  
  
  if ( !ds.search(addr)) {
    lcd.clear();   
    lcd.setCursor(0, 1);
    lcd.print("doar ");
    lcd.print(ics);
    lcd.print(" senzor(i)");    
    ds.reset_search();
    ics=0;
    return;
  }
  
ics++; 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }
  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }

lcd.clear();
lcd.setCursor(0, 1);
  lcd.print("ROM=");
  for( i = 0; i < 8; i++) {
    lcd.print(' ');
    lcd.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      lcd.print("CRC is not valid!");
      return;
  }

  celsius = (float)raw / 16.0;

  lcd.setCursor(0,0);
  lcd.print("Temp");
  lcd.print(ics);
  lcd.print(" = ");
  lcd.print(celsius);
  lcd.write(byte(0));
  lcd.print("C   ");
  
  delay(3000);
}
   Am facut si 2 filmulete:
- masurare temperatura in mai multe puncte cu DS18B20 si MAX31820 folosind Arduino si LCD1602 cu i2c
- multipoint thermometer with DS18B20 and MAX31820, Arduino and LCD1602 with i2c interface
11.02.2014
   Am desenat schema completa de conectare a senzorilor din familia DS18x20 (DS18B20, DS18S20, DS1822, MAX31820) si a afisajului LCD 1602 cu interfata i2c:

miercuri, 5 februarie 2014

Arduino si un servomotor (II)

   In articolul Arduino si un servomotor am folosit un servomotor mititel, acum voi testa unul mai "fortos", model MG996R, care are rotile dintate ale reductorului confectionate din metal, fata de celalalt, care le are din plastic.
   
   Deoarece la comanda de se duce in zero, se simtea ca se forteaza, a fost desfacut, sa constat daca are vreun defect mecanic:
 
 
 
 
   Nedepistand nimic mecanic, am ajuns la concluzia ca este partea de comparare a pozitiei, cea cu potentiometru care poate avea rezistent ala capetele de cursa si cea spre masa mai mare... oricum am rezolvat-o din soft, in sensul ca in loc de comanda de a se duce la 00, se duce la 70, care e ok pentru el, iar 1800 devine 1860.
   Sketch-ul folosit este:
/*
Arduino Servo Test sketch
http://www.hobbytronics.co.uk/arduino-tutorial2-servos
and 
SWEEEP by BARRAGAN http://barraganstudio.com
adapted by niq_ro from http://nicuflorica.blogspot.com
*/

#include <Servo.h>
Servo servoMain; // Define our Servo

void setup()
{
servoMain.attach(9); // servo on digital pin 9
pinMode(13, OUTPUT); // initialize the digital pin no 13 as an output.
}

void loop()
{
// this serve has real 0 degree when comand is 7... 45 is 52=45+7, etc 
   servoMain.write(7);   // Turn Servo Left to 0 degrees
   digitalWrite(13, HIGH);  // turn ON the LED  
   delay(5000);          // Wait 1 second
   digitalWrite(13, LOW);  // turn OFF the LED
   servoMain.write(52);  // Turn Servo Left to 45 degrees
   delay(1000);          // Wait 1 second
   servoMain.write(97);  // Turn Servo back to center position (90 degrees)
   delay(1000);          // Wait 1 second
   servoMain.write(142); // Turn Servo Right to 135 degrees
   delay(1000);          // Wait 1 second
   servoMain.write(186); // Turn Servo Right to 180 degrees
   delay(2000);          // Wait 1 second
   servoMain.write(142); // Turn Servo Right to 135 degrees
   delay(1000);          // Wait 1 second
   servoMain.write(97);  // Turn Servo back to center position (90 degrees)
   delay(1000);          // Wait 1 second
   servoMain.write(52);  // Turn Servo Left to 45 degrees
   delay(1000);          // Wait 1 second
   servoMain.write(7);   // Turn Servo Left to 0 degrees
   digitalWrite(13, HIGH);  // turn ON the LED
   delay(1000);          // Wait 1 second
   digitalWrite(13, LOW);  // turn OFF the LED

// adapted part from SWEEP example
  for(int pos = 7; pos < 187; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    servoMain.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  }
 delay(1000); 
  for(int pos = 186; pos>=7; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    servoMain.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
delay (1000);
}
   Schema de conectare este aceeasi:
   Am facut un filmulet, numit un servomotor MG996R conectat la Arduino, care arata cum reactioneaza servomotorul la comenzile date de Arduino:
07.02.2014    Pentru a va da seama de diferenta dintre primul servomotor si cel din primul articol, le-am facut poze impreuna:
   Servomotorul din poza (micro servo 9g) e nou, altul decat cel initial, asa ca l-am pus la probe si, am constatat, ca nici el nu se duce in 0, asa ca am modificat putin sketch-ul sa imi fie usor de modificat valorile. la minim am lasat 100, iar la maxim 1700.
/*
Arduino Servo Test sketch
http://www.hobbytronics.co.uk/arduino-tutorial2-servos
and 
SWEEEP by BARRAGAN http://barraganstudio.com
adapted by niq_ro from http://nicuflorica.blogspot.com
*/

#include <Servo.h>
Servo servoMain; // Define our Servo

void setup()
{
servoMain.attach(9); // servo on digital pin 9
pinMode(13, OUTPUT); // initialize the digital pin no 13 as an output.
}

int minim = 0;  // theoretical zero degree
int maxim = 180; // theoretical 180 degree
int eroarejos = 10; // error at minimum (restricted area)
int eroaresus = -10; // error at maximum (restricted area)
int zero = minim + eroarejos; // practical minimum allowed
int plin = maxim + eroaresus; // practical maximum allowed
int jumate = (plin-zero)/2; // half position (90 degree)
int sfert = (plin-zero)/4; // quarter
int farasfert = 3*(plin-zero)/4; // theree quarter


void loop()
{
// this serve has real 0 degree when comand is 7... 45 is 52=45+7, etc 
   servoMain.write(zero);   // Turn Servo Left to 0 degrees
   digitalWrite(13, HIGH);  // turn ON the LED  
   delay(1000);          // Wait 1 second
   digitalWrite(13, LOW);  // turn OFF the LED
   servoMain.write(sfert);  // Turn Servo Left to 45 degrees
   delay(1000);          // Wait 1 second
   servoMain.write(jumate);  // Turn Servo back to center position (90 degrees)
   digitalWrite(13, HIGH);  // turn ON the LED  
   delay(3000);          // Wait 1 second
   digitalWrite(13, LOW);  // turn OFF the LED
   servoMain.write(farasfert); // Turn Servo Right to 135 degrees
   delay(1000);          // Wait 1 second
   servoMain.write(plin); // Turn Servo Right to 180 degrees
   delay(2000);          // Wait 1 second
   servoMain.write(farasfert); // Turn Servo Right to 135 degrees
   delay(1000);          // Wait 1 second
   servoMain.write(jumate);  // Turn Servo back to center position (90 degrees)
   digitalWrite(13, HIGH);  // turn ON the LED  
   delay(3000);          // Wait 1 second
   digitalWrite(13, LOW);  // turn OFF the LED
   servoMain.write(sfert);  // Turn Servo Left to 45 degrees
   delay(1000);          // Wait 1 second
   servoMain.write(zero);   // Turn Servo Left to 0 degrees
   digitalWrite(13, HIGH);  // turn ON the LED
   delay(1000);          // Wait 1 second
   digitalWrite(13, LOW);  // turn OFF the LED

// adapted part from SWEEP example
  for(int pos = zero; pos < plin; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    servoMain.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  }
 delay(1000); 
  for(int pos = (plin-1); pos>=zero; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    servoMain.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
delay (1000);
}