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.
- Run
sudo raspi-config
. - Use the down arrow to select
9 Advanced Options
- Arrow down to
A7 I2C
. - Select
yes
when it asks you to enable I2C - Also select
yes
when it tasks about automatically loading the kernel module. - Use the right arrow to select the
<Finish>
button. - 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.
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.
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
Wire.begin(8);
a másik pedig
Wire.begin(9);
A programfeltöltés részletei → ITT.
#include <Wire.h> int x = 0; int LED = 13; void setup() { pinMode (LED, OUTPUT); Wire.begin(8); // join i2c bus with address #8 Wire.onReceive(receiveData); // register event Wire.onRequest(sendData); } void loop() { delay(100); } // function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveData(int) { x = Wire.read(); // receive byte as an integer if(x > 10){ digitalWrite(LED, HIGH); } else{ digitalWrite(LED, LOW); } } void sendData(){ Wire.write(x); }
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.
És az ATmega328 lábai
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.
Az ATmega tehát kap egy számot, amit a programja szerint összehasonlít 10-el.
if(x > 10){ digitalWrite(LED, HIGH); }
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.
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.

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.
ezt probáld ki pls:
Működik, szóval ez a végleges kód: