Archive for Návody

Merkurino a vlastní znaky na LCD

Merkurino / Arduino může jednoduše ovládat nastavení znakové sady na znakovém LCD  displeji.
Každý znak je definován maticí bodů 8 řádků x 5 sloupců.
Základní tabulku anglických znaků – malá a VELKÁ písmena bez diakritiky a číslice má displej uložen v paměti, proto ho stačí jen zavolat. Pokud chceme vlastní znaky, musíme si je nadefinovat sami.

Vlastní znaky

Vlastní znaky

Příklad kódu je zde:

#include <LiquidCrystal.h>
// upravil: L. Vohralík, 2014, MerkurRobot.cz
LiquidCrystal lcd(13, 12, 8, 7, 4, 2);

byte smiley[8] = {  //definice znaku smiley
  B00000,           // jednička svítí
  B10001,           // nula nesvítí
  B00000,
  B00000,
  B10001,
  B01110,
  B00000,
};
byte r_hacek[8] = {  //definice znaku r s háčkem = ř
  B01010,           // jednička svítí
  B00100,           // nula nesvítí
  B01110,
  B01001,
  B01000,
  B01000,
  B00000,
};
byte mezera[8] = {  //definice znaku mezera
  0, 0, 0, 0, 0, 0, 0,
};

void setup() {
  lcd.createChar(0, smiley);   //odeslání definice 1. znaku (znak 0)
  lcd.createChar(1, r_hacek);   //odeslání definice 2. znaku
  lcd.createChar(2, mezera);   //odeslání definice 3. znaku
  lcd.begin(16, 2);            //inicializace displeje
  lcd.write(byte(0));    //zobrazí smajlík (znak 0)
  lcd.write(byte(1));    //zobrazí ř (znak 1)
  lcd.write(byte(0));    //zobrazí smajlík (znak 0)
  lcd.write(byte(2));     //zobrazí mezeru (znak 2)
  lcd.write("ahoj");     //zobrazí text
  
}

void loop() {}

Merkurino 01 a hodiny RTC

Jak si naprogramovat budík? Jak spouštět čerpadlo jen v určitý čas podle změřené teploty?

K Merkurinu (Arduinu) stačí připojit modul s obvodem reálného času (DS1307) do konektoru pro seriovou komunikaci zvanou I2C.

modul RTC na i2c

modul RTC na i2c

Zapojení je jednoduché, stačí 4 vodiče nebo piny.
0V (Gnd),
+5V (Vcc),
data (Sda) na vstup A4 a
hodiny (Scl) na vstup A5.

Zobrazení reálného času

Zobrazení reálného času

připojení modulu

Připojení modulu

Příklad nastavení a čtení času:

// popis Merkurino 01: www.MerkurRobot.cz
// rtc modul na i2c - jen čtení času s ds1307
#include "Wire.h" // knihovna pro i2c komunikaci
#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527

#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 8, 7, 4, 2);
// definice proměnných
int lcd_key = 0;
int adc_key_in = 0;

char cas[8]; //pole znaků pro čas
char datum[10]; //pole znaků pro datum

void setup(){   // procedura setup ----------------------------
  Wire.begin();
  Serial.begin(9600);
  //setDateTime(); //MUST CONFIGURE IN FUNCTION
         //pokud chceme nastavit čas v hodinách,
         //zrušit lomítka a nastavit ve funkci přesný čas.
         //Po nastavení opět zapoznámkovat
  lcd.begin(16, 2); // start LCD library
  lcd.setCursor(0,0); // nastavení pozice kurzoru
  lcd.print("Nyni");  
  lcd.setCursor(0,1); //
  lcd.print("je:");                  
} // konec procedura setup ----------------------------

//----------------------------------------------------------
void loop(){  // procedura loop ----------------------------
  printDate();
  lcd.setCursor(8,0); // nastavení pozice kurzoru
  lcd.print(cas);
  lcd.setCursor(6,1); // nastavení pozice kurzoru
  lcd.print(datum);
  delay(1000);
} // konec procedura loop ----------------------------------
//----------------------------------------------------------

// procedury pro nastavení a čtení času v hodinách ds1307 -------
void setDateTime(){ 
  byte second =00; //0-59
  byte minute =53; //0-59
  byte hour =14; //0-23
  byte weekDay = 0; //1-7 (0-6, neděle – sobota
  byte monthDay =19; //1-31
  byte month = 9; //1-12
  byte year= 14; //0-99 (msd’s 4-digit year ignored
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  //DS1307 RTC Libraries And Examples V2.1.Docx 11
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(zero); //start
  Wire.endTransmission();
}
byte decToBcd(byte val){
  // Convert normal decimal numbers to binary coded decimal
  return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val){
  // Convert binary coded decimal to normal decimal numbers
  return ( (val/16*10) + (val%16) );
}
void printDate(){
  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday -Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());
  //print the date EG 23.01.2011 23:59:59
  sprintf(cas,"%02d:%02d:%02d",hour,minute,second);
  sprintf(datum,"%02d.%02d.20%02d",monthDay,month,year);
  Serial.print(datum); Serial.print(" "); Serial.print(cas);
  Serial.println();
  
}
// konec procedur pro nastavení a čtení času v hodinách ds1307 -------

Merkurino 01 – Arduino nano pro roboty

Řešili jste někdy, jak jednoduše ovládat nějaký stroj s motory a několika senzory? Abyste se zároven nemuseli moc zabývat kabeláží a kam a jak namontovat různé moduly? Podívejte se na projekt Merkurino:

Základem je standardní procesor AVR Mega328 s programováním v prostředí Arduino, standardní modul Arduino Nano r3. To má 8 analogových vstupů a 14 digitálních výstupů, a samozřejmě se všechny dají přenastavit jak vstupní, tak výstupní.

Základní sestava obsahuje:

  • Arduino Nano rev.3
  • LCD 16×2,
  • 6x HW PWM výstup
  • samostatný 3x H-můstek 500mA, 9V
  • 6x analogové tlačítko pro ovládání na pinu A0
  • 3x dvojité analogové tlačítko piny A5-A7
  • 4x plné vstupy A1-A4, třípin
  • napájení: 5V z Arduino Nano nebo lépe externí 7-15V DC (7805)

 

Pohled ze strany displeje:
DSCN0028

Pohled ze strany arduina a konektorů, zde je zapojen na I²C modul reálného času:
DSCN0030

Schema zapojení v1.3:
merkurino_01-v1.3-f

Schema zapojení v1.4.4:

merkurino01_sch_v1-4-4

Rozměry desky:
merkurino_01-v1.3-f-dokumentace – rozmery

Rozmístění konektorů v.1.3.f:

Merkurino 01 – rozmístění konektorů

Rozmístění konektorů v.1.4.4:

merkurino01_con_v1-4-4

Dokumentace ke stažení : merkurino-01-datasheet.pdf

Merkurino 01 – displej LCD a klávesnice

Jak použít LCD displej 16×2 na Merkurinu – Arduinu Nano.

Jediná změna oproti standardnímu použití u Arduina jsou použité piny.

Kód je zde:

/**********************************************************************
Tento program otestuje Merkurino 01 s displejem a klávesnicí
MerkurRobot.cz 2014
**********************************************************************/
//Jednoduché použití LiquidCrystal knihovny
#include <LiquidCrystal.h> 
// použité piny pro Merkurino 01 LCD panel
LiquidCrystal lcd(13, 12, 8, 7, 4, 2);
// definice proměnných 
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnENTER 4
#define btnESC 5
#define btnNONE 6

int read_LCD_buttons() // procedura čtení tlačítek  --------------------------
{
  adc_key_in = analogRead(0); // čtení "napětí" na vstupu A0
  //lcd.setCursor(12,1);lcd.print(adc_key_in); lcd.print("   ");
  if (adc_key_in > 1000) return btnNONE; // žádné tlačítko není stisknuto
  // pro Merkurino 01 plati tyto hodnoty:
  if (adc_key_in < 40) return btnESC; 
  if (adc_key_in < 110) return btnLEFT;
  if (adc_key_in < 300) return btnDOWN;
  if (adc_key_in < 450) return btnUP;
  if (adc_key_in < 700) return btnRIGHT;
  if (adc_key_in < 850) return btnENTER;
  
  return btnNONE; // žádné tlačítko není stisknuto// konec procedura čtení tlačítek  --------------------------
void setup()  //--- procedura setup --------------------------
{
  lcd.begin(16, 2); // start the library
  lcd.setCursor(0,0);
  lcd.print("Stiskni tlacitko"); // print a simple message
}  //--- konec procedura setup --------------------------
void loop() //--- začátek nekonečné smyčky --------------------------
{
  lcd.setCursor(8,1); // přemístí kursor na 2. řádek (1) a 9. pozici
  lcd.print(millis()/1000); // zobrazí vteřiny od zapnutí 
  lcd.setCursor(0,1); // přemístí kursor na začátek 2. řádku
  lcd_key = read_LCD_buttons(); // zavolej čtení tlačítka
  switch (lcd_key) // vyvolej akci podle stisknutého tlačítka
  {
    case btnRIGHT:
    {
      lcd.print("vpravo  ");
      break;
    }
    case btnLEFT:
    {
      lcd.print("vlevo   ");
      break;
    }
    case btnUP:
    {
      lcd.print("nahoru     ");
      break;
    }
    case btnDOWN:
    {
      lcd.print("dolu   ");
      break;
    }
    case btnENTER:
    {
      lcd.print("potvrd ");
      break;
    }
    case btnESC:
    {
      lcd.print("zpet    ");
      break;
    }
    case btnNONE:
    {
      lcd.print("nic   ");
      break;
    }
  }
} //--- konec nekonečné smyčky --------------------------

Letujeme horkovzduchem smd

Někteří z nás se setkali s potřebou vyměnit mnohanohou součástku smd.
Buď můžeme nožičky opatrně odříznout nebo odštípat a pak jednu po druhé páječkou odendavat, nebo opatrně použít zdroj horkého vzduchu.

Narazil jsem na pěkné video, které hezky ukazuje celý postup.

Nejdříve odstraníme původní součástku. Zde je použita pro uchopení součástky podtlaková přísavka. Já mám docela dobré zkušenosti s tvrdou ostrou ohnutou „jehlou“ ze sady nástrojů, které prodávají třeba v GMe. Musí se s ní pracovat velmi opatrně, protože pokud zapáčíte a nemáte nožičky ( součástku ) dostatečně prohřáté, můžete lehce utrhnout pad na plošňáku  a je zaděláno na velký problém.

Další doporučení je natrénovat si teplotu a množství vzduchu. Když ho přeženete, tak horký proud vám odfoukne malé odpory a jako „bonus“ přidá rozfoukané malé kuličky cínu do míst, která nejsou vidět a mohou způsobit zkrat, třeba až za několik měsíců. Nejlepší je si natrénovat na starých deskách ze šrotu.

To je ta jednodušší část.

Ve videu ukázané letování pájecí pasty je mnohem obtížnější na cvik a trpělivost, ale jak je vidět, když dostatečně natrénujete, tak výsledek se dostaví a je čím se chlubit 🙂