Raspberry és Atmega328 közötti I2C kommunikáció

Ez a cikk lényegében a folytatása a I2C kommunikáció két ATmega328 közöttinek, ami ITT elérhető. A pH és a hőmérséklet mérés adatainak átvitelére I2C-t használunk, aztán jött a CO2 szenzor ami csak az UART-ot ismeri. Nagyon nem akartunk egy másik adatátviteli módot implementálni, így a megoldás az lesz, hogy a szenzor UART-on elküldi az adatokat az ATmega csipnek, ami meg I2C-n továbbítja a Raspberry felé.

I2C on Pi

Configuration

I2C is not turned on by default. Again, we can use raspi-config to enable it.

  1. Run sudo raspi-config.
  2. Use the down arrow to select 9 Advanced Options
  3. Arrow down to A7 I2C.
  4. Select yes when it asks you to enable I2C
  5. Also select yes when it tasks about automatically loading the kernel module.
  6. Use the right arrow to select the <Finish> button.
  7. Select yes when it asks to reboot.

https://learn.sparkfun.com/tutorials/raspberry-pi-spi-and-i2c-tutorial

Installáljuk a I2C  perifériák detektálására használható alkalmazást.

sudo apt-get install i2c-tools

Futtatás után

i2cdetect -y 1

ezt kell látnunk, vagy valami hasonlót, függően az I2C eszközök címétől és számától.

ket eszkoz az i2c-n

 

Végre erőt vettem magamon és csináltam egy állandó panelt. Próbáltam a teljesen sajátot is, megtervezni, rávasalni, lemaratni, kifúrni, de azt elbaltáztam, szerencsére volt kéznél egy gyárilag fúrt is aztán ez lett belőle.

IMG_0028

Ez két ATmega csipet tartalmaz, lényegében 1-1 Arduinónak felel meg USB interface nélkül.

Mindkettőre feltöltöttem a következő programot, azzal a különbséggel, hogy a címet megváltoztattam, az egyik

a másik pedig

A programfeltöltés részletei → ITT.

Képgaléria

Összeköttetési segédlet

A Raspberry PI 3.3V-os logikai jelszinttel működő eszköz, az Arduino 5V-os. A neten megoszlanak a vélemények, a jelszint illesztő használatát illetően, ha a Raspberry mint master üzemel. Én a józan észre hallgattam a 3,3 az nem 5 és fordítva, úgyhogy beépítettem egy jelszint illesztőt az áramkörbe. Ennek bekötése elég egyszerű, van egy 3,3V-os és egy 5V-os odala.

Raspberry Jelszint illesztő Atmega 328
3,3 LV  –
GND GND 8,22
3 (GPIO2) SDA LV1    ↔   HV1 27
5 (GPIO3) SCL LV2    ↔  HV2  28
5V  HV 7,20

 

Minden további 5V-os I2C eszköz, esetünkben egy második ATmega328 27 (SDA) megy HV1-be a 28-as pin (SCL) pedig a HV2-be.

raspberry_pi_circuit_note_fig2a

És az ATmega328 lábai

ATMEGA328-900

Adatküldés az ATmega328-nak

Ha minden jól csináltunk és látjuk az eszközt, akkor a következő paranccsal elküldünk egy számot az ATmega-nak.

i2cset -y 1 0x08 14 

A 8-as buszon lévő eszköznek elküldtünk egy értéket, ami 14, ezt egy logikai analizátorral is megnéztem, ami így néz ki, a cikk első felében bővebben volt erről szó → ITT.

sent 14 to 08

Az ATmega tehát kap egy számot, amit a programja szerint összehasonlít 10-el.

Ha ez a szám nagyobb mint 10 akkor a 19-es pint felhúzza 5V-ra, a LED kigyullad, ha kisebb akkor kialszik.

Van egy másik parancs amivel olvasni lehet:

i2cget -y 1 0x08

erre ezt az értéket kapom vissza 0xff, na itt elakadtam…..

2016-07-03

Javítottam a kódot, a probléma az volt, hogy a receiveData függvényen belül az x-et lokálisan deklaráltam

int x = Wire.read();

ezt most globálissá deklaráltam

x = Wire.read();

így működik.

Felhasznált irodalom

jdesktop.com

Share This:

 
Loading Facebook Comments ...

COMMENTS

  • Guttmann Krisztián Guttmann Krisztián

  • Néha megy néha nem, pl. ma stabilan azt a számod adja vissza, amit elküldök neki. Amúgy meg ha nem működik, akkor meg mindig 0-t ad vissza (ha berakom a kódrészleted), ugye a 255-öt kiküszöbölted. A logikai analizátorban nézve 255 van elküldve, aztán lezárja a kommunikációt, gondolom ez az érték beíródik a változóba.
    I2C kommuniláció analízis

    Meg itt van az analízis forrása:
    http://weblaboratorium.hu/wp-content/uploads/2016/08/I2c_pH_temp_on.zip

    ezzel meg tudod nézni
    Software Logic Analyzer Linux Ubuntu Software.
    https://www.saleae.com/downloads

  • Ebből, hogy tudom kiolvasni az adatot i2c-tools-al?
    mert i2cget -y 1 0x08 mindig 0x00 ad vissza.

    • Guttmann Krisztián Guttmann Krisztián

      ezt probáld ki pls:

  • Működik, szóval ez a végleges kód:

Leave a Comment