ShieldBoard Ext1 példák processing/wiring nyelven

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
keresztg
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2008. szeptember 9. kedd, 6:00

ShieldBoard Ext1 példák processing/wiring nyelven

Hozzászólás Szerző: keresztg »

Sziasztok!

Vettem egy AVR-Duino-t ShieldBoard Ext1-gyel (LCDstül), és végre van időm foglalkozni a küttyel. Mivel úgyis ismerkedéssel telik az idő, gondoltam az egyes alrendszerekkel kapcsolatban megírt példákat beküldöm ide, hátha okul belőle más is.

A processing/wiring nyelvek és/vagy környezetekkel kapcsolatban kicsit kavarodás van, hogy melyik melyiknek leszármazottja, l. http://en.wikipedia.org/wiki/Proce55ing . A lényeg az, hogy a C nyelv szintakszisára alapulnak, kölcsönöznek egy kicsit a C++-ból ill. a Javaból is. A Wiring mikrokontrolleres környezetre van kihegyezve, a Processing kicsit általánosabb, multiplatformos, grafikus ténykedésre van kihegyezve (van pl. javascriptben írt interpretere is...).

A megalkotásukkor cél volt, hogy egyszeri művészemberek egyszerűen tudjanak kompjúterrel dolgokat előállítani, így pl. az Arduino (l. http://arduino.cc ) fejlesztőkornyezete (ami asszem konkrétan Wiring leszármazott, és abból a környezetből át is vett egy csomó libet) is arra van kihegyezve, hogy a fejlesztőnek ne azzal menjen el az ideje, hogy C fordítót paraméterez, megfelelő headereket includeál, megfelelő libekkel linkkel, majd pedig feltölt az eszközre.

Inkább van egy egyszerű sketchnek nevezett fájlja, amibe megírja a főleg C-re, kicsit C++-ra (igen, vannak osztályok...) hajazó kódját, nyom egy gombot, és kisvártatva ott van az eszközre feltöltve a programja, és működik (optimális esetben ;) ). Valójában eközben az IDE preprocesszálja a sketch-t, csinál belőle egy C++ fájlt a megfelelő headerekkel, lefordítja (az AVR-es gcc-t használja ehhez), összelinkeli a megfelelő libekkel, és feltölti.

Mivel GNU-s fordítóval és libc-vel (l. http://www.nongnu.org/avr-libc/ ) operál, ezért az azokban megengedett dolgokat szabadon művelheti az ember, így effektíve síma C kódot is lehet írni, azt is lefordítja az Arduino IDE.

A környezetnek van néhány specialitása (pl. a Wire libben, ami az I2C-t implementálja, minden cím 7 bites mondván, hogy a 8. bit az irást ill. olvasást különbözteti meg, és azt a lib kezeli magától; így a ShieldBoard Ext1 doksijában megadott címeket egy bittel jobbra shiftelve kell a libnek megadni!), de ez minden környezettel így van, nemde? ;)

Ja, és az Arduinohoz kiindulásnak: http://arduino.cc/en/Tutorial/Foundations
A hozzászólást 1 alkalommal szerkesztették, utoljára keresztg 2008. november 5. szerda, 19:59-kor.
Avatar
keresztg
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2008. szeptember 9. kedd, 6:00

LCD és az I2C-s hőmérő

Hozzászólás Szerző: keresztg »

Alább egy egyszerű példát láthattok, ami egyszerre mutatja be az LCD panel, és az I2C-s TCN75ös (l. pl. http://www.microchip.com/wwwproducts/De ... e=en010752 ) használatát. A kód az arduino-0012 verzióban alapértelmezetten megtalálható LiquidCrystal és Wire (az I2C kezelő) libet használja (l. http://arduino.cc/en/Reference/Libraries ). Még annyit, hogy a 13-as digital lábon (ez az arduino számozása, amiről itt találsz bővebb infót: http://arduino.cc/en/Reference/Atmega168Hardware vagy http://www.arduino.cc/en/Hacking/PinMapping ) található az LCD háttérvilágitása az alap AVR-Duino panelen levő LEDdel együtt...
Íme a kód, ami másodpercenként lekérdezi a hőmérsékletet, és kiírja az LCD-re:

Kód: Egész kijelölése

#include <Wire.h>
#include <LiquidCrystal.h>

// LiquidCrystal display with:
// rs on pin 4
// rw: ez alapból földelve van a ShieldBoardExt1-gyen, így teljesen mindegy, mit irunk ide, csak ne zavarjon senkit...
// itt a 12-es pinnel csak az a baj, hogy nem tudom mit csinal, mintha
// az RS-485-os 75176 illesztovel lenne kapcsolatban, de azt ugy sem hasznalom ;) mindensestre hianyzik a doksibol...
// enable on pin 5
// d0, d1, d2, d3 on pins 6, 7, 8, 9
LiquidCrystal lcd(4, 12, 5, 6, 7, 8, 9);

byte TemperatureByte;
byte LowerByte;

void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  Wire.begin();
}

void loop()
{
    delay(1000);
    // clear the screen
    lcd.clear();
  
    LM75(0);
    // TemperatureByte = (TemperatureByte << 1 ) | (LowerByte >> 7);
    lcd.print(TemperatureByte, DEC);
    if ((LowerByte >> 7))
    {
      lcd.print('.', BYTE);
      lcd.print('5', BYTE);
    }
}

int LM75(byte reg)
{
  Wire.beginTransmission(0x90>>1);
  Wire.send(reg); // sends one byte
  Wire.endTransmission(); // stop transmitting

  Wire.requestFrom(0x90>>1, reg==1?1:2);
  while(Wire.available()) // slave may send less than requested
  {
    TemperatureByte = Wire.receive();
    LowerByte = Wire.receive();
  }
  return TemperatureByte;
}
U.i.: Tudtátok, hogy a TCN75 csak 25 fok felett képes a fél fokos pontosságra (azon kívül 3 fok)? A speckójában ez van. Én csalódtam egy kicsit...
Avatar
keresztg
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2008. szeptember 9. kedd, 6:00

valós idejű óra

Hozzászólás Szerző: keresztg »

A ShiledBoard Ext1-en az I2C buszon van egy RTC. A doksi szerint PCF8583 (igen, ez van leírva az 5. oldalon). Viszont...
Szerencsémre bénáztam egy sort az I2C-s címével (csak eggyel kell jobbra shiftelni, és nem héttel... :oops: ), így megnéztem közelről a panelt. S mit látok? Egy PCF8563-at... Hiába kerestem volna azt a sok szabadon használható RAM-ot, meg a századmásodperceket... De cserébe van rendes calendar benne...

Példát majd akkor küldök, ha kialudtam magam...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A TCN75 közelítő mérésre való. Pontos mérésre (jobb együttfutás, pontosabb) az 1-Wire DS1820 családot érdemes használni (én a DS18B20-t nyúztam/nyúzom).

A Processing beépítve az 1-Wire-t is támogatja:).
Avatar
keresztg
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2008. szeptember 9. kedd, 6:00

valós idejű óra

Hozzászólás Szerző: keresztg »

No, csak sikerült formába öntenem. Megfűszereztem egy kis soros port kezeléssel is, így ez nem az LCD-re ír. A kódot megpróbáltam jól megkommentezni, bocs a tördelés hiányáért... (Elvileg az egyszerű copy-paste jól fogja átvinni a sortöréseket még akkor is, ha a böngésző betördeli a hosszú sorokat...)

Kód: Egész kijelölése

#include <Wire.h> // ez hozza be az arduino I2C libjet (amit az Atmeles nepek egyebkent TWI-nek hivnak...)

#define ORA_ADDR (0xA2>>1) // o igen, az arduino I2C libje 7 bites cimet var... az utolso (iranyjelzo) bitet maga kezeli!
uint8_t response; // A valasz bajt az RTCtol.
unsigned long lasttime; // ebben taroljuk a legutolso soros portra iras idejet

/**
 * Kiolvassa az RTC 'reg' parameter altal megadott regisztert.
 * Pontosan 1 byte valaszt var csak! (Ez a specko szerint itt eleg lesz).
 */
void readOra(uint8_t reg) {
  Wire.beginTransmission(ORA_ADDR);
  Wire.send(reg); // elkuldunk 1 bajtot, ami a regisztert cimzi meg
  Wire.endTransmission(); // befejezzuk a kuldest

  Wire.requestFrom(ORA_ADDR, 1); // pontosan 1 bajtnyi valaszt varunk
  while(Wire.available()) {
    response=Wire.receive();
  }
}

/**
 * Beirja az RTC 'reg' parameter altal megadott regiszterebe a data bajtot.
 */
void writeOra(uint8_t reg, uint8_t data) {
  Wire.beginTransmission(ORA_ADDR);
  Wire.send(reg);
  Wire.send(data);
  Wire.endTransmission();
}

/**
 * A writeOra() segitsegevel beallitja az RTC-ben a datumot es az idot.
 * A beiras elott leallitja az orat, majd utana elinditja.
 * A regiszter szamok a specifikacioban megtalalhatok)
 */
void setTime(uint8_t ev, uint8_t honap, uint8_t nap, uint8_t ora, uint8_t perc, uint8_t masodperc) {
  writeOra(0, 0x20); // stop clock

  writeOra(8, ev); // ev
  writeOra(7, honap); // honap BCD
  writeOra(5, nap); // nap BCD
  writeOra(4, ora); //ora BCD
  writeOra(3, perc); //perc BCD
  writeOra(2, masodperc); // masodperc BCD

  writeOra(0, 0); // restart clock
}

char bcdstr[3];
/**
 * Ez egy RAM takarekos 1 bajtos BCD -> NULL-altal-lezart-string konverter akar lenni,
 * mivel a Serial.print(x, HEX) nem rakja ki a kezdo 0-t.
 * Mindig ugyanazt (bcdstr) buffert hasznalja az atalakitashoz, igy minden hivaskor felulirodik annak tartalma!
 */
char *bcdToString(uint8_t i) {
  bcdstr[0]=(i>>4)+0x30;
  bcdstr[1]=(i&0x0f)+0x30;
  bcdstr[2]='\0';
  return bcdstr;
}

void setup()
{
  pinMode(13, OUTPUT); // ezzel a ket sorral beallitjuk a 13-as labon levo LED-et, hogy vilagitson egy RESET eseten
  digitalWrite(13, HIGH);

  Serial.begin(9600); // Soros port inditasa 9600 baudon (egyebektn 8N1 a tobbi konfig, RTS/CTS asszem lenyegtelen)
  Serial.print("Starting...");
  Wire.begin(); // I2C lib inditasa
  lasttime=millis();
}

void loop()
{
  unsigned long now=millis();
  if (now-lasttime >= 5000) { // csak 5 masodpercenkent irunk a soros portra
    digitalWrite(13, LOW); // kikapcsoljuk a LEDet, eleget vilagitott mar...
    lasttime=now;

    uint8_t month=0;
    readOra(7); // A honap regiszter olvasasa, de ez nem csak azt tartalmazza! A legfelso bitje a szazadot adja meg! Ezert ez a trukkozes.
    month=response;
    if (response&0x80) Serial.print(0x19, HEX);
    else Serial.print(0x20, HEX);
    readOra(8); Serial.print(bcdToString(response)); Serial.print("."); // Ev kiolvasasa, es kiirasa.
    Serial.print(month&0x1f, HEX); Serial.print("."); // Az elmentett honap regiszter kiirasa, megfeleloen maszkolva.
    readOra(5); Serial.print(bcdToString(response&0x3f)); Serial.print(". "); // Nap kiirasa (itt is kell a spec. szerint maszkolni!)
    readOra(4); Serial.print(bcdToString(response&0x3f)); Serial.print(":"); // Ora kiirasa (itt is kell a spec. szerint maszkolni!)
    readOra(3); Serial.print(bcdToString(response&0x7f)); Serial.print(":"); // Perc kiirasa (itt is kell a spec. szerint maszkolni!)
    readOra(2); Serial.print(bcdToString(response&0x7f)); // Masodperc kiirasa, es itt is kell a spec. szerint maszkolni, mivel
    Serial.print((response&0x80)?" N":" Y"); Serial.print(" "); // a legfelso bit azt mutatja, hogy az RTCben levo ido korrekt-e. (Y ha igen, N ha elegtelen volt a tapellatas, vagy mas miatt megallt a kristaly)
    readOra(6); Serial.print(response&0x07, HEX); // a het napjanak kiirasa: 0=vasarnap, 1=hetfo, ..., 6=szombat (l. spec.)
    Serial.println("");
  }

  if (Serial.available()) { // ha erkezett karakter a soros porton, akkor megnezzuk, hogy nem egy parancs-e
    int s=Serial.read();
    if (s=='s') {
      // ha kapunk egy 's' betut a soros porton, akkor varunk tovabbi 12 szamot,
      // amibol beallithatjuk a datumot es idot
      setClockFromSerial();
    } else if (s=='n') {
      // ha kapunk egy 'n' betut, akkor varunk egy darab 0 es 6 kozotti szamot,
      // ami az aktualis nap a heten (0=vasarnap, 6=szombat), es azt beallitjuk az oraban
      uint8_t c=Serial.read();
      c-=0x30;
      if (c<7) writeOra(6, c);
    }
  }
  delay(100);
}

/**
 * Beolvassa a sorosportrol az 's' utani szamokat es beallitja belole az RTC-t.
 * formatum: 081115191800 (es ez ele jon meg az 's' betu...)
 * Nem viszi tulzasba a hibaellenorzest...
 */
void setClockFromSerial()
{
    uint8_t setupIdx, datum[6]; 
    setupIdx=0;
    while (Serial.available() && setupIdx<6) {
      uint8_t c1=Serial.read();
      uint8_t c2=Serial.read();
      c1-=0x30;
      c2-=0x30;
      if (c1>=0 && c1<=9 && c2>=0 && c2<=9) {
        datum[setupIdx]=(c1<<4) | (c2&0x0F);
      }
      setupIdx++;
    }
    setTime(datum[0], datum[1], datum[2], datum[3], datum[4], datum[5]);
}
Avatar
keresztg
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2008. szeptember 9. kedd, 6:00

licensz

Hozzászólás Szerző: keresztg »

Még mielőtt valaki megkérdezné, minden kód, amit ide én beírok, az public domain. Azt csináltok vele, amit akartok. :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Köszönjük szépen a fejlesztői közösség nevében!
Avatar
kissci
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2008. október 20. hétfő, 6:00

AVR-Duino ShieldBoard Ext1 eeprom

Hozzászólás Szerző: kissci »

melyik 24lc-s eeprom van a lapon?
Jól gondolom, hogy az Arduino-ba beépített eeprom könyvtár A chip belső 512 byte-os memoriáját kezeli?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

24LC256 I2C-s eeprom.

Jól. Az EEPROM a belső EEPROM kezelést valósítja meg.

Az I2C-s eeprom kezelése a fenti minták alapján byte alapú írás-olvasás könnyen implementálható.
Avatar
kissci
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2008. október 20. hétfő, 6:00

köszi

Hozzászólás Szerző: kissci »

Csinálgatom a romkezelést, majd felrakom, ha kész, csak most az RTC alarmjában vagyok :)
Avatar
keresztg
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2008. szeptember 9. kedd, 6:00

Re: köszi

Hozzászólás Szerző: keresztg »

kissci írta:Csinálgatom a romkezelést, majd felrakom, ha kész, csak most az RTC alarmjában vagyok :)
A versenyre beadott kódomban (http://avr.tavir.hu/modules.php?name=Co ... resztfalvi) találsz egy I2CEEPROM.pde fájlt, amiben láthatod hogyan is lehet azt kezelni. Próbáltam azért kommentekkel ellátni, de nincs túlbonyolítva a dolog.

Néhány fontos dolog:
1. megfelelő mennyiségű időt kell hagyni az EEPROM-nak az írási művelet befejezésére (lásd a konkrét típus speckóját), elvileg ezt ACK-ra figyeléssel ki lehetne váltani...
2. meg kell nézni a konkrét típus speckójában, hogy az egy bájt írása tényleg csak egy bájtot ír-e az EEPROMba, vagy többet (esetleg 4 bájtot, vagy egy komplett page-t), mert ebben az esetben egy bájtonkénti írásnál csökken az elérhető írási ciklusok száma...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az EEPROM-ok beírási ideje ~4msec.
A legegyszerűbb a byte-s mód, igaz ekkor a kihasználható 1M ciklus lecsökken. 1 M Byte-laponként! Ez általában 16- vagy 64 byte-köteg....

Tényleg, Gábor kódja tartalmazta ez Processingként!
Avatar
Muchanski
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2009. december 19. szombat, 7:00

ext1

Hozzászólás Szerző: Muchanski »

Sziasztok!

Azt szeretném kérdezni, hogy a ShieldBoard Ext1-hez processing/wiring nyelven tudna valaki adni valamilyen tutorialt az ethernet, valamint az infra vevő részéhez?

Igazából amit nagyon szeretnék csinálni az az, hogy elérjem weben keresztül az Ext1 shildet és azon a csatlakozón felületen keresztül ahova az LCD csatlakozik infra LED-eket tudjak ki, illetve be kapcsolni.

Nagyon örülnék neki, ha tudna valaki segíteni.

Előre is köszönöm.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Avatar
Muchanski
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2009. december 19. szombat, 7:00

ext1

Hozzászólás Szerző: Muchanski »

Kedves Róbert!

Köszönöm, hogy válaszoltál, de én nem pont erre gondoltam. Lehet, hogy nem pontosan írtam le mit is szeretnék. Az ethernet shiledhez találtam példákat, hogy hogyan lehet az azonon lévő zöld LED-et kapcsolgatni.

Amit én szeretnék, hogy az Ext1 shieldet érjem el etherneten keresztül. Megpróbáltam az ethernet shieldhez való kóddal. A jumpert is átraktam arrébb, de nem működik. A ping-es példát próbáltam először.
Előfordulhat, hogy valamit rosszul csinálok?
Válasz küldése