Orodha ya maudhui:

Mawasiliano yaliyosimbwa kwa njia isiyo na waya Arduino: Hatua 5
Mawasiliano yaliyosimbwa kwa njia isiyo na waya Arduino: Hatua 5

Video: Mawasiliano yaliyosimbwa kwa njia isiyo na waya Arduino: Hatua 5

Video: Mawasiliano yaliyosimbwa kwa njia isiyo na waya Arduino: Hatua 5
Video: Использование Melexis MLX90614 Инфракрасный термометр с Arduino 2024, Novemba
Anonim
Mawasiliano yaliyosimbwa kwa njia isiyo na waya Arduino
Mawasiliano yaliyosimbwa kwa njia isiyo na waya Arduino

Halo kila mtu, Katika nakala hii ya pili, nitakuelezea jinsi ya kutumia chip Atecc608a kupata mawasiliano yako yasiyotumia waya. Kwa hili, nitatumia NRF24L01 + kwa sehemu isiyo na waya na Arduino UNO.

Chip ndogo ya ATECC608A imeundwa na MicroChip na imepata zana nyingi za usalama. Kwa mfano, chip hii inaweza kuhifadhi Funguo za ECC, Funguo za AES (kwa AES 128) na SHA2 Hash.

Nakala hiyo: NRF24L01 + Arduino UNO + ATECC608A

Wakati wa mawasiliano kati ya kitu mbili cha IoT, mashambulio kadhaa yanaweza kuwapo: Mtu wa upole, Nakala ya habari na zaidi.. Kwa hivyo wazo langu ni rahisi sana:

  1. Utumiaji wa data iliyosimbwa kwa njia fiche kati ya kitu cha IoT mbili au zaidi.
  2. Vifaa vya gharama nafuu
  3. Unaweza kufanya kazi na Arduino UNO

Kwa upande wangu, ninatumia

  • Atecc608a kuhifadhi Kitufe changu cha AES na kusimba / kusimbua data yangu.
  • Arduino Uno kama Mdhibiti Mdogo
  • NRF24L01 kutuma data yangu

Unahitaji kufuata hatua hizo kwa mradi huu:

  1. Sanidi chip ATECC608A
  2. Fanya mzunguko (Node ya Mwalimu na Node ya Watumwa)
  3. Sehemu ya nambari
  4. Nenda zaidi !

Kwa hatua za kwanza "Weka chip ATECC608A", niliandika nakala nyingine inayoelezea kila hatua kwa mpangilio. Kiungo kiko hapa:

Sasa anza!

Vifaa

Kwa mradi huu unahitaji:

  • 2 Arduino UNO au Arduino NANO au Arduino Mega
  • Baadhi ya waya
  • 2 Atecc608a (kila gharama chini ya $ 0.60)
  • 2 NRF24L01 +
  • 2 capacitor (10 μF)
  • Mikate ya mkate

Unganisha na nakala yangu ambayo inaelezea jinsi ya kuanzisha chip ATECC608A -> Jinsi ya kuanzisha Atecc608a

Hatua ya 1: 1. Sanidi Atecc608a

1. Sanidi Atecc608a
1. Sanidi Atecc608a
1. Sanidi Atecc608a
1. Sanidi Atecc608a

Sitatoa maelezo kila hatua ya kufuata kuanzisha ATECC608A kwa sababu niliandika nakala kamili inayoelezea kila hatua ya kuifanya. Ili kuiweka, unahitaji kufuata "Hatua ya 4" ya nakala hii inayoitwa "2. Usanidi wa Chip (Atecc608a)"

Kiungo ni: Jinsi ya kuanzisha ATECC608A

Pia, unahitaji kuweka usanidi sawa kwa Atecc608a, upande mkuu na upande wa mtumwa, vinginevyo hautaweza kusimba data yako

Onyo:

Ili kuanzisha chip hii, unahitaji kufuata kila hatua ya kifungu hapo juu kwa utaratibu. Ikiwa hatua moja haipo au chip haijafungwa, haungeweza kufanya mradi huu

Zilizosalia:

Hatua ya kufuata kwa hii:

  • Unda kiolezo cha usanidi
  • Andika templeti hii kwa chip
  • Funga eneo la Usanidi
  • Andika ufunguo wako wa AES (128 Bits) kwenye slot
  • Funga eneo la Takwimu

Hatua ya 2: 2. Ubunifu wa Mzunguko (Mwalimu na Mtumwa)

2. Ubunifu wa Mzunguko (Mwalimu na Mtumwa)
2. Ubunifu wa Mzunguko (Mwalimu na Mtumwa)
2. Ubunifu wa Mzunguko (Mwalimu na Mtumwa)
2. Ubunifu wa Mzunguko (Mwalimu na Mtumwa)

Katika mradi huu, utakuwa na Node ya Mwalimu na Node ya Watumwa.

Node kuu itachapisha data iliyotumwa na node ya mtumwa wazi. Itahitaji data kutoka kwa node ya watumwa kila mara X.

Node ya watumwa itasikiliza "mtandao" na wakati itapokea "Omba data", itaizalisha, kuisimba na kuipeleka kwa nodi kuu.

Kwa pande zote mbili, bwana na mtumwa mzunguko ni sawa:

  • Nano mmoja arduino
  • ATECC608A moja
  • NRF24L01 moja

Niliunganisha mzunguko kwa hatua hii (tazama picha hapo juu).

Kwa ATECC608A kwa Arduino UNO, hii ni pini 8 ya kupendeza. Niliongeza "mwonekano wa juu" hapo juu:

  • ARDUINO 3.3V -> PIN 8 (Atecc608a)
  • ARDUINO GND -> PIN 4 (Atecc608a)
  • ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
  • ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)

Kwa NRF24L01 kwa Arduino:

  • ARDUINO 3.3V -> VCC (nrf24l01)
  • ARDUINO GND -> GND (nrf24l01)
  • ARDUINO 9 -> CE (nrf24l01)
  • ARDUINO 10 -> CSN (nrf24l01)
  • ARDUINO 11 -> MOSI (nrf24L01)
  • ARDUINO 12 -> MISO (nrf24l01)
  • ARDUINO 13 -> SCK (nrf24l01)
  • ARDUINO 3 -> IRQ (nrf24l01) -> tu kwa nodi ya Utumwa, haitumiwi katika hali ya Master

Kwa nini utumie pini ya IRQ ya NRF24L01

Pini ya IRQ ni muhimu sana, pini hii inaruhusu kusema (LOW) wakati pakiti inapopokelewa na NRF24L01, kwa hivyo tunaweza kushikamana na Kukatiza kwa pini hii kuamsha node ya mtumwa.

Hatua ya 3: 3. Kanuni (Mtumwa na Mwalimu)

3. Kanuni (Mtumwa na Mwalimu)
3. Kanuni (Mtumwa na Mwalimu)

Node ya Mtumwa

Ninatumia kuokoa nguvu kwa Node ya mtumwa kwa sababu haiitaji kusikiliza kila wakati.

Jinsi inavyofanya kazi: node ya mtumwa sikiliza na subiri kupokea "pakiti ya AMKA". Pakiti hii hutumwa na node ya Mwalimu kuuliza data kutoka kwa mtumwa.

Katika kesi yangu mimi hutumia safu ya mbili int:

// Pakiti ya UP

const int wake_packet [2] = {20, 02};

Ikiwa nodi yangu inapokea pakiti,

  1. amka, soma pakiti hii, ikiwa pakiti ni "Amka"
  2. hutoa data,
  3. ficha data,
  4. tuma data kwa bwana, subiri pakiti ya ACK,
  5. lala.

Kwa Usimbuaji wa AES, ninatumia ufunguo katika nambari ya yanayopangwa 9.

Hii ndio nambari yangu ya nodi ya Mtumwa

# pamoja na "Arduino.h" # pamoja na "avr / sleep.h" # pamoja na "avr / wdt.h"

# pamoja na "SPI.h"

# pamoja na "nRF24L01.h" # pamoja na "RF24.h"

# pamoja na "Wire.h"

// Maktaba ya ATECC608A

# pamoja na "ATECCX08A_Arduino / cryptoauthlib.h" # pamoja na "AES BASIC / aes_basic.h"

#fafanua ID_NODE 255

#fafanua AES_KEY (uint8_t) 9

ATCAIfaceCfg cfg;

Hadhi ya ATCA_STATUS;

Redio ya RF24 (9, 10);

const uint64_t masteraddresse = 0x1111111111;

const uint64_t slaveaddresse = 0x1111111100;

/**

Kazi fupi iliyotekelezwa wakati usumbufu umewekwa (IRQ LOW) * * * / utupu wakeUpIRQ () {wakati (redio haipatikani ()) {int data [32]; redio.soma (& data, 32); ikiwa (data [0] == 20 && data [1] == 02) {float temp = 17.6; kuelea hum = 16.4;

data ya uint8_t [16];

uint8_t cypherdata [16];

// Jenga Kamba ili kuweka Thamani yangu yote

// Kila thamani imetengwa na "|" na "$" inamaanisha mwisho wa data // ONYO: Lazima iwe chini ya urefu wa 11 Kamba tmp_str_data = Kamba (ID_NODE) + "|" + Kamba (temp, 1) + "|" + Kamba (hum, 1) + "$"; // saizi ya 11 Serial.println ("tmp_str_data:" + tmp_str_data);

tmp_str_data.getBytes (data, sizeof (data));

// Encrypt data

Hali ya ATCA_STATUS = aes_basic_encrypt (& cfg, data, sizeof (data), cypherdata, AES_KEY); ikiwa (status == ATCA_SUCCESS) {rand ndefu = random ((ndefu) 10000, (ndefu) 99999);

// tengeneza UUID kulingana na nambari tatu ya kwanza = node ya kitambulisho

Kamba uuid = Kamba (ID_NODE) + Kamba (rand); // Ukubwa wa 8

uint8_t tmp_uuid [8];

data_ya_kutuma [32];

uuid.getBytes (tmp_uuid, sizeof (tmp_uuid) + 1);

memcpy (data_to_send, tmp_uuid, sizeof (tmp_uuid));

memcpy (data_to_send + sizeof (tmp_uuid), cypherdata, sizeof (cypherdata)); // Acha kusikiliza redio. Acha Kusikiliza ();

rslt ya bool;

// Tuma Takwimu rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Anza kusikiliza redio. Anza Kusikiliza (); ikiwa (rslt) {// Mwisho na hali ya kulala Serial.println (F ("Imefanywa")); }}}}}

kuanzisha batili ()

{Serial.begin (9600);

// Init kondakta wa maktaba

cfg.iface_type = ATCA_I2C_IFACE; // Aina ya mawasiliano -> I2C mode cfg.devtype = ATECC608A; // Aina ya chip cfg.atcai2c.slave_address = 0XC0; // I2C addresse (thamani chaguo-msingi) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_chelewesha = 1500; // Kuchelewa kwa kuamka (1500 ms) cfg.rx_retries = 20;

redio.anza ();

redio.setDataRate (RF24_250KBPS); redio.maskIRQ (1, 1, 0); radio.enableAckPayload (); seti ya redio. Reti (5, 5);

radio.openWritingPipe (masteraddresse);

radio.openReadingPipe (1, slaveaddresse); // Ambatisha kukatiza kwa pini 3 // Rekebisha 1 na O ikiwa unataka kukatiza kwa pini 2 // KUANGUKA MODE = Piga kwa kiambatisho CHINI (1, wakeUpIRQ, FALLING); }

kitanzi batili ()

{ // Hakuna haja }

Node ya Mwalimu

Node kuu huamka kila sekunde 8 kuuliza data kutoka kwa Node ya mtumwa

Jinsi inavyofanya kazi: Node kuu hutuma pakiti ya "WakeUP" kwa mtumwa na baada ya kusubiri jibu la mtumwa na data.

Katika kesi yangu mimi hutumia safu ya mbili int:

// Pakiti ya UP

const int wake_packet [2] = {20, 02};

Ikiwa node ya mtumwa hutuma pakiti ya ACK baada ya bwana kutuma pakiti ya WakeUp:

  1. Mwalimu ameweka katika hali ya Usikilize na subiri mawasiliano
  2. Ikiwa mawasiliano
  3. Toa baiti 8 ya kwanza, pakua kaiti tatu za kwanza za ka 8, ikiwa hii ndio node ya kitambulisho
  4. Toa baiti 16 ya cypher
  5. Ficha data
  6. Chapisha data katika Serial
  7. Hali ya kulala

Kwa Usimbuaji wa AES, ninatumia ufunguo katika nambari ya yanayopangwa 9.

Hii ndio nambari yangu ya nodi ya Mwalimu

# pamoja na "Arduino.h"

# pamoja na "avr / sleep.h" # pamoja na "avr / wdt.h" # pamoja na "SPI.h" #jumuisha "nRF24L01.h" # pamoja na "RF24.h" # pamoja na "Wire.h" // ATECC608A maktaba # pamoja na "ATECCX08A_Arduino / cryptoauthlib.h" # pamoja na "AES BASIC / aes_basic.h" #fafanua ID_NODE 255 #fafanua AES_KEY (uint8_t) 9 ATCAIfaceCfg cfg; Hadhi ya ATCA_STATUS; Redio ya RF24 (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // pakiti ya kuamka const int wake_packet [2] = {20, 02}; // mbwa anayetazama hukatiza ISR (WDT_vect) {wdt_disable (); // afya ya mwangalizi} batili njia ya kulala () {// afya ADC ADCSRA = 0; // futa bendera anuwai za "kuweka upya" MCUSR = 0; // kuruhusu mabadiliko, afya WDTCSR = kidogo (WDCE) | kidogo (WDE); // kuweka hali ya kukatiza na muda WDTCSR = kidogo (WDIE) | kidogo (WDP3) | kidogo (WDP0); // weka WDIE, na sekunde 8 kuchelewesha wdt_reset (); // weka upya njia ya kutazama set_sleep_mode (SLEEP_MODE_PWR_DOWN); hakunaKukatizwa (); // mlolongo uliowekwa kwa wakati unafuata usingizi_owezeshwa (); // zima rangi ya hudhurungi - wezesha programu MCUCR = kidogo (BODS) | kidogo (BODSE); MCUCR = kidogo (BODS); huingilia (); // inahakikishia maagizo yafuatayo yaliyotekelezwa sleep_cpu (); // kufuta usingizi kama tahadhari sleep_disable (); } usanidi batili () {Serial.begin (9600); // Init kondakta wa maktaba cfg.iface_type = ATCA_I2C_IFACE; // Aina ya mawasiliano -> I2C mode cfg.devtype = ATECC608A; // Aina ya chip cfg.atcai2c.slave_address = 0XC0; // I2C addresse (thamani chaguo-msingi) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_chelewesha = 1500; // Kuchelewa kwa kuamka (1500 ms) cfg.rx_retries = 20; redio.anza (); redio.setDataRate (RF24_250KBPS); redio.maskIRQ (1, 1, 0); radio.enableAckPayload (); seti ya redio. Reti (5, 5); radio.openWritingPipe (slaveaddresse); radio.openReadingPipe (1, masteraddresse); } kitanzi batili () {bool rslt; // Tuma Takwimu rslt = radio.write (& wake_packet, sizeof (wake_packet)); ikiwa (rslt) {// Anza kusikiliza redio. anza Kusikiliza (); wakati (redio haipatikani ()) {uint8_kujibu [32]; redio.soma (& jibu, saizi ya (jibu)); uint8_t node_id [3]; uint8_t cypher [16]; memcpy (node_id, jibu, 3); memcpy (cypher, jibu + 3, 16); ikiwa ((int) node_id == ID_NODE) {uint8_t pato [16]; Hali ya ATCA_STATUS = aes_basic_decrypt (& cfg, cypher, 16, pato, AES_KEY); ikiwa (status == ATCA_SUCCESS) {Serial.println ("Imesimbwa Takwimu:"); kwa (size_t i = 0; i <16; i ++) {Serial.print ((char) pato ); }}}}}} mwingine {Serial.println ("Ack not kupokea kwa Wakup Packet"); } // Njia ya kulala 8 sekunde za kulala (); }

Ikiwa una swali, niko hapa kujibu

Hatua ya 4: 4. Nenda Zaidi

Mfano huu ni rahisi ili uweze kuboresha mradi huu

Maboresho:

  • AES 128 ni ya msingi na unaweza kutumia algorithm nyingine ya AES kama AES CBC kuwa salama.
  • Badilisha moduli isiyo na waya (NRF24L01 imepunguzwa na mzigo wa baiti 23)

Ukiona uboreshaji wa kufanya, ueleze kwenye eneo la majadiliano

Hatua ya 5: Hitimisho

Natumaini nakala hii itakuwa muhimu kwako. Samahani ikiwa nilikosea katika maandishi yangu lakini Kiingereza sio lugha yangu kuu na ninazungumza vizuri kuliko ninavyoandika.

Asante kwa kusoma kila kitu.

Furahia.

Ilipendekeza: