![Անլար կոդավորված հաղորդակցություն Arduino. 5 քայլ Անլար կոդավորված հաղորդակցություն Arduino. 5 քայլ](https://i.howwhatproduce.com/images/006/image-17809-j.webp)
Բովանդակություն:
2025 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2025-01-23 14:48
![Անլար կոդավորված հաղորդակցություն Arduino Անլար կոդավորված հաղորդակցություն Arduino](https://i.howwhatproduce.com/images/006/image-17809-1-j.webp)
Ողջույն բոլորին, Այս երկրորդ հոդվածում ես ձեզ կբացատրեմ, թե ինչպես օգտագործել Atecc608a չիպը `ձեր անլար հաղորդակցությունն ապահովելու համար: Դրա համար ես կօգտագործեմ NRF24L01+ անլար մասի և Arduino UNO- ի համար:
Միկրոչիպը ATECC608A- ն նախագծվել է MicroChip- ի կողմից և ստացել է անվտանգության բազմաթիվ գործիքներ: Օրինակ, այս չիպը կարող է պահել ECC բանալիներ, AES բանալիներ (AES 128 -ի համար) և SHA2 Hash:
Հոդվածը ՝ NRF24L01 + Arduino UNO + ATECC608A
Երկու IoT օբյեկտի միջև հաղորդակցության ընթացքում կարող են լինել բազմաթիվ հարձակումներ. Մարդը մեղմ է, տեղեկատվության պատճենը և ավելին: Այսպիսով, իմ գաղափարը շատ պարզ է.
- Երկու կամ ավելի IoT օբյեկտի միջև կոդավորված տվյալների օգտագործումը:
- Lowածր արժեքի մատակարարումներ
- Կարող է աշխատել Arduino UNO- ի հետ
Իմ դեպքում ես օգտագործում եմ
- Atecc608a- ն ՝ իմ AES բանալին պահելու և իմ տվյալները գաղտնագրելու/վերծանելու համար:
- Arduino Uno- ն որպես միկրոկոնտրոլեր
- NRF24L01 ՝ իմ տվյալները ուղարկելու համար
Այս ծրագրի համար դուք պետք է հետևեք հետևյալ քայլերին.
- Կարգավորեք ATECC608A չիպը
- Կատարեք միացում (Master Node և Slave Node)
- Կոդի մաս
- Առաջ գնա !
«Ստեղծեք ATECC608A չիպը» առաջին քայլերի համար ես գրեցի մեկ այլ հոդված, որը բացատրում է յուրաքանչյուր քայլը հերթականությամբ: Հղումն այստեղ է ՝
Հիմա սկսի!
Պարագաներ
Այս նախագծի համար ձեզ հարկավոր է.
- 2 Arduino UNO կամ Arduino NANO կամ Arduino Mega
- Որոշ մետաղալարեր
- 2 Atecc608a (յուրաքանչյուրի արժեքը 0.60 $ -ից պակաս է)
- 2 NRF24L01+
- 2 կոնդենսատոր (10 μF)
- Breadboards
Հղում իմ հոդվածին, որը բացատրում է, թե ինչպես կարգավորել ATECC608A չիպը -> Ինչպես կարգավորել Atecc608a
Քայլ 1: 1. Կարգավորեք Atecc608a- ն
![1. Կարգավորեք Atecc608a- ն 1. Կարգավորեք Atecc608a- ն](https://i.howwhatproduce.com/images/006/image-17809-2-j.webp)
![1. Կարգավորեք Atecc608a- ն 1. Կարգավորեք Atecc608a- ն](https://i.howwhatproduce.com/images/006/image-17809-3-j.webp)
Ես չեմ մանրամասնի ATECC608A- ի ստեղծման համար անհրաժեշտ յուրաքանչյուր քայլ, քանի որ ես գրել եմ ամբողջական հոդված, որը բացատրում է դա անելու բոլոր քայլերը: Այն կարգավորելու համար հարկավոր է հետևել սույն հոդվածի «Քայլ 4» -ին, որը կոչվում է «2. Չիպի կազմաձևում (Atecc608a)»
Հղումը հետևյալն է. Ինչպես ստեղծել ATECC608A
Բացի այդ, դուք պետք է նույն կոնֆիգուրացիան դնեք Atecc608a- ի, գլխավոր կողմի և ստրուկ կողմի համար, այլապես չեք կարողանա գաղտնագրել ձեր տվյալները:
Գուշացում
Այս չիպը կարգավորելու համար դուք պետք է հաջորդաբար կատարեք վերը նշված հոդվածի յուրաքանչյուր քայլ: Եթե մեկ քայլ բացակայում է կամ չիպը կողպված չէ, դուք չեք կարողանա անել այս նախագիծը:
Մնացածը ՝
Դրա համար պետք է հետևել հետևյալ քայլերին
- Ստեղծեք կազմաձևման ձևանմուշ
- Գրեք այս կաղապարը չիպի վրա
- Կողպեք կազմաձևման գոտին
- Գրեք ձեր AES բանալին (128 բիթ) բնիկում
- Կողպեք տվյալների գոտին
Քայլ 2: 2. Շղթայի ձևավորում (վարպետ և ստրուկ)
![2. Շրջանի ձևավորում (վարպետ և ստրուկ) 2. Շրջանի ձևավորում (վարպետ և ստրուկ)](https://i.howwhatproduce.com/images/006/image-17809-4-j.webp)
![2. Շրջանի ձևավորում (վարպետ և ստրուկ) 2. Շրջանի ձևավորում (վարպետ և ստրուկ)](https://i.howwhatproduce.com/images/006/image-17809-5-j.webp)
Այս նախագծում դուք կունենաք Master Node և Slave Node:
Գլխավոր հանգույցը հստակ կտպագրի ստրուկի հանգույցի ուղարկած տվյալները: Այն յուրաքանչյուր պահի կպահանջի տվյալներ ստրուկի հանգույցից:
Ստրուկի հանգույցը կլսի «ցանցը» և երբ ստանա «Պահանջել տվյալներ», այն կստեղծի, կծածկագրի և կուղարկի հիմնական հանգույցին:
Երկու կողմերի համար էլ տիրույթը և ստրուկը միացումն են նույնը.
- Մեկ arduino Nano
- Մեկ ATECC608A
- Մեկ NRF24L01
Ես միացրեցի սխեման այս քայլին (տես վերևի նկարը):
Arduino UNO- ի ATECC608A- ի համար սա 8 փին է: Ես վերևում ավելացրեցի «վերևի տեսքը».
- ARDUINO 3.3V -> PIN 8 (Atecc608a)
- ARDUINO GND -> PIN 4 (Atecc608a)
- ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
- ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)
NRF24L01- ի համար 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) -> միայն Slave հանգույցի համար, որը չի օգտագործվում Master ռեժիմում
Ինչու՞ օգտագործել NRF24L01- ի IRQ կապը
IRQ քորոցը շատ օգտակար է, այս քորոցը թույլ է տալիս ասել (LOW), երբ փաթեթը ստացվում է NRF24L01- ի միջոցով, այնպես որ մենք կարող ենք կցել ընդհատում այս քորոցին ՝ ստրուկի հանգույցն արթնացնելու համար:
Քայլ 3: 3. ծածկագիրը (ստրուկ և վարպետ)
![3. ծածկագիրը (ստրուկ և վարպետ) 3. ծածկագիրը (ստրուկ և վարպետ)](https://i.howwhatproduce.com/images/006/image-17809-6-j.webp)
Ստրուկի հանգույց
Ես օգտագործում եմ էներգախնայողություն ստրուկի Node- ի համար, քանի որ այն ամբողջ ժամանակ լսելու կարիք չունի:
Ինչպես է այն աշխատում. Ստրուկի հանգույցը լսեք և սպասեք «Wake UP packet» ստանալուն: Այս փաթեթը ուղարկվում է Master հանգույցի կողմից ՝ ստրուկից տվյալներ խնդրելու համար:
Իմ դեպքում ես օգտագործում եմ երկու int զանգված.
// Wake UP փաթեթ
const int wake_packet [2] = {20, 02};
Եթե իմ հանգույցը ստանա փաթեթ,
- արթնացիր, կարդա այս փաթեթը, եթե փաթեթը «Արթնացիր»,
- այն առաջացնում է տվյալներ,
- ծածկագրել տվյալները,
- ուղարկեք տվյալները վարպետին, սպասեք ACK փաթեթ,
- քնել.
AES կոդավորման համար ես օգտագործում եմ բանալին 9 համարի բնիկում:
Սա ստրուկի հանգույցի իմ ծածկագիրն է
#ներառել "Arduino.h" #include "avr/sleep.h" #include "avr/wdt.h"
#ներառել «SPI.h»
#ներառել «nRF24L01.h» #ներառել «RF24.h»
#ներառել «Wire.h»
// ATECC608A գրադարան
#ներառել «ATECCX08A_Arduino/cryptoauthlib.h» #ներառել «AES BASIC/aes_basic.h»
#սահմանել ID_NODE 255 -ը
#սահմանել AES_KEY (uint8_t) 9
ATCAIfaceCfg cfg;
ATCA_STATUS կարգավիճակ;
RF24 ռադիո (9, 10);
const uint64_t masteraddresse = 0x1111111111;
const uint64_t slaveaddresse = 0x1111111100;
/**
* / համառոտ Գործառույթը կատարվում է, երբ ընդհատումը սահմանվում է (IRQ LOW) * * */ void wakeUpIRQ () {while (radio.available ()) {int data [32]; radio.read (& տվյալներ, 32); if (տվյալներ [0] == 20 && տվյալներ [1] == 02) {float temp = 17.6; բոց բզզոց = 16.4;
uint8_t տվյալներ [16];
uint8_t ցիպեր տվյալներ [16];
// Կառուցեք տող ՝ իմ ամբողջ արժեքը սահմանելու համար
// Յուրաքանչյուր արժեք առանձնացված է «|» - ով: իսկ «$» նշանակում է տվյալների վերջը // ARԳՈՇԱՈՄ. Պետք է լինի 11 -ից փոքր երկարությամբ տող tmp_str_data = Լար (ID_NODE) + "|" + Լար (ջերմաստիճան, 1) + "|" + Լար (բզզոց, 1) + "$"; // չափը 11 Serial.println ("tmp_str_data:" + tmp_str_data);
tmp_str_data.getBytes (տվյալները, չափը (տվյալները));
// Գաղտնագրել տվյալները
ATCA_STATUS կարգավիճակ = aes_basic_encrypt (& cfg, data, sizeof (data), cypherdata, AES_KEY); եթե (կարգավիճակ == ATCA_SUCCESS) {երկար ռանդ = պատահական ((երկար) 10000, (երկար) 99999);
// առաջացնել UUID ՝ հիմնված երեք առաջին թվի = ID հանգույցի վրա
Լար uuid = Լար (ID_NODE) + Լար (ռանդ); // Չափը ՝ 8
uint8_t tmp_uuid [8];
uint8_t տվյալներ_ուղարկել [32];
uuid.getBytes (tmp_uuid, sizeof (tmp_uuid) + 1);
memcpy (data_to_ndnd, tmp_uuid, sizeof (tmp_uuid));
memcpy (data_to_nden + sizeof (tmp_uuid), cypherdata, sizeof (cypherdata)); // Դադարեցրեք լսել radio.stopListening ();
bool rslt;
// Ուղարկեք տվյալներ rslt = radio.write (& data_to_send, sizeof (data_to_send)); // Սկսեք լսել radio.startListening (); if (rslt) {// Ավարտի և քնի ռեժիմ Serial.println (F («Կատարված է»)); }}}}}
դատարկ կարգավորում ()
{Serial.begin (9600);
// Գրադարանի կառուցման սկիզբ
cfg.iface_type = ATCA_I2C_IFACE; // Կապի տեսակը -> I2C ռեժիմ cfg.devtype = ATECC608A; // չիպի տեսակը cfg.atcai2c.slave_address = 0XC0; // I2C հասցե (կանխադրված արժեք) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Արթնացման հետաձգում (1500 ms) cfg.rx_retries = 20;
radio.begin ();
radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radio.setRetries (5, 5);
radio.openWritingPipe (masteraddresse);
radio.openReadingPipe (1, slaveaddresse); // Կցել ընդհատում 3 -ի կապում // Փոփոխել 1 -ը O- ով, եթե ցանկանում եք, որ ընդհատումը լինի 2 -րդ քորոցին // FALLING MODE = Pin at LOW attachInterrupt (1, wakeUpIRQ, FALLING); }
դատարկ շրջան ()
{ // Կարիք չկա }
Վարպետ հանգույց
Գլխավոր հանգույցն արթնանում է յուրաքանչյուր 8 վայրկյանում ՝ ստրուկի հանգույցից տվյալներ պահանջելու համար
Ինչպես է այն աշխատում. Գլխավոր հանգույցը «WakeUP» փաթեթ է ուղարկում ստրուկին և սպասելուց հետո ստրուկի պատասխանը տվյալներով:
Իմ դեպքում ես օգտագործում եմ երկու int զանգված.
// Wake UP փաթեթ
const int wake_packet [2] = {20, 02};
Եթե ստրուկի հանգույցը ուղարկում է ACK փաթեթ, այն բանից հետո, երբ վարպետն ուղարկում է WakeUp փաթեթ.
- Վարպետը կարգավորվեց Լսելու ռեժիմում և սպասեք հաղորդակցությանը
- Եթե հաղորդակցություն
- Հանել 8 առաջին բայթը, թալանել 8 բայթից երեք առաջին բայթը, եթե սա ID հանգույցն է
- Քաղեք 16 բայթ շիֆերը
- Գաղտնագրել տվյալները
- Տպեք տվյալները Սերիալում
- Քնելու ռեժիմ
AES կոդավորման համար ես օգտագործում եմ բանալին 9 համարի բնիկում:
Սա Վարպետ հանգույցի իմ ծածկագիրն է
#ներառել «Arduino.h»
#ներառել "avr/sleep.h" #include "avr/wdt.h" #include "SPI.h" #include "nRF24L01.h" #include "RF24.h" #include "Wire.h" // ATECC608A գրադարան #ներառել «ATECCX08A_Arduino/cryptoauthlib.h» #ներառել «AES BASIC/aes_basic.h» #սահմանել ID_NODE 255 #սահմանել AES_KEY (uint8_t) 9 ATCAIfaceCfg cfg; ATCA_STATUS կարգավիճակ; RF24 ռադիո (9, 10); const uint64_t masteraddresse = 0x1111111111; const uint64_t slaveaddresse = 0x1111111100; // Wake UP packet const int wake_packet [2] = {20, 02}; // դիտորդը ընդհատում է ISR- ն (WDT_vect) {wdt_disable (); // անջատել watchdog} void sleepmode () {// անջատել ADC ADCSRA = 0; // մաքրել տարբեր «վերակայման» դրոշներ MCUSR = 0; // թույլ տալ փոփոխություններ, անջատել վերականգնումը WDTCSR = բիթ (WDCE) | բիթ (WDE); // սահմանել ընդհատման ռեժիմ և միջակայք WDTCSR = բիթ (WDIE) | բիթ (WDP3) | բիթ (WDP0); // սահմանել WDIE և 8 վայրկյան ուշացում wdt_reset (); // վերականգնել դիտորդի set_sleep_mode (SLEEP_MODE_PWR_DOWN); noInterrupts (); // ժամանակային հաջորդականությունը հետևում է sleep_enable (); // անջատել brown ‐ out- ը միացնել ծրագրակազմում MCUCR = bit (BODS) | բիթ (BODSE); MCUCR = բիթ (BODS); ընդհատում (); // երաշխավորում է sleep_cpu կատարված հաջորդ հրահանգը (); // չեղյալ համարել քունը որպես նախազգուշական քուն_ընդհատել (); } void setup () {Serial.begin (9600); // Գրադարանի կառուցիչ ներդիր cfg.iface_type = ATCA_I2C_IFACE; // Կապի տեսակը -> I2C ռեժիմ cfg.devtype = ATECC608A; // չիպի տեսակը cfg.atcai2c.slave_address = 0XC0; // I2C հասցե (կանխադրված արժեք) cfg.atcai2c.bus = 1; cfg.atcai2c.baud = 100000; cfg.wake_delay = 1500; // Արթնացման հետաձգում (1500 ms) cfg.rx_retries = 20; radio.begin (); radio.setDataRate (RF24_250KBPS); radio.maskIRQ (1, 1, 0); radio.enableAckPayload (); radio.setRetries (5, 5); radio.openWritingPipe (slaveaddresse); radio.openReadingPipe (1, masteraddresse); } void loop () {bool rslt; // Ուղարկել տվյալներ rslt = radio.write (& wake_packet, sizeof (wake_packet)); if (rslt) {// Սկսել լսել radio.startListening (); while (radio.available ()) {uint8_t պատասխան [32]; radio.read (& պատասխան, չափս (պատասխան)); uint8_t node_id [3]; uint8_t ցիֆեր [16]; memcpy (node_id, պատասխան, 3); memcpy (cypher, պատասխան + 3, 16); եթե ((int) node_id == ID_NODE) {uint8_t ելք [16]; ATCA_STATUS կարգավիճակ = aes_basic_decrypt (& cfg, cypher, 16, output, AES_KEY); if (կարգավիճակ == ATCA_SUCCESS) {Serial.println ("Գաղտնագրված տվյալներ."); for (size_t i = 0; i <16; i ++) {Serial.print ((char) ելք ); }}}}} այլ {Serial.println («Ack not get for Wakup Packet»); } // Քնի ռեժիմ 8 վայրկյան քնի ռեժիմ (); }
Եթե ունեք հարցեր, ես այստեղ եմ ՝ դրան պատասխանելու համար:
Քայլ 4: 4. Շարունակիր:
Այս օրինակը պարզ է, որպեսզի կարողանաք բարելավել այս նախագիծը
Բարելավումներ
- AES 128 -ը հիմնական է, և ավելի ապահով լինելու համար կարող եք օգտագործել AES- ի այլ ալգորիթմ ՝ որպես AES CBC:
- Փոխեք անլար մոդուլը (NRF24L01- ը սահմանափակվում է 23 բայթ բեռնվածությամբ)
- …
Եթե տեսնում եք, որ պետք է կատարելագործվեք, բացատրեք դա քննարկման դաշտում
Քայլ 5: Եզրակացություն
Հուսով եմ, որ այս հոդվածը օգտակար կլինի ձեզ համար: Կներեք, եթե ես սխալվել եմ իմ տեքստում, բայց անգլերենը իմ հիմնական լեզուն չէ, և ես ավելի լավ եմ խոսում, քան գրում եմ:
Շնորհակալություն ամեն ինչ կարդալու համար:
Վայելիր.
Խորհուրդ ենք տալիս:
SmartHome անլար հաղորդակցություն. MQTT- ի ծայրահեղ հիմունքները. 3 քայլ
![SmartHome անլար հաղորդակցություն. MQTT- ի ծայրահեղ հիմունքները. 3 քայլ SmartHome անլար հաղորդակցություն. MQTT- ի ծայրահեղ հիմունքները. 3 քայլ](https://i.howwhatproduce.com/images/002/image-5383-j.webp)
SmartHome անլար հաղորդակցություն. MQTT- ի ծայրահեղ հիմունքներ. MQTT հիմունքներ. Այս Instructable- ը հիմք է, թե ինչպես կարելի է տեղադրել MQTT- ն ՝ իմ հետագա Instructables- ում օգտագործելու համար: Ինչպես
LoRa 3 կմ -ից 8 կմ անլար հաղորդակցություն ցածր գնով E32 (sx1278/sx1276) սարք Arduino- ի, Esp8266- ի կամ Esp32- ի համար ՝ 15 քայլ
![LoRa 3 կմ -ից 8 կմ անլար հաղորդակցություն ցածր գնով E32 (sx1278/sx1276) սարք Arduino- ի, Esp8266- ի կամ Esp32- ի համար ՝ 15 քայլ LoRa 3 կմ -ից 8 կմ անլար հաղորդակցություն ցածր գնով E32 (sx1278/sx1276) սարք Arduino- ի, Esp8266- ի կամ Esp32- ի համար ՝ 15 քայլ](https://i.howwhatproduce.com/images/001/image-540-15-j.webp)
LoRa 3Km- ից 8Km անլար հաղորդակցություն ցածր գնով E32 (sx1278/sx1276) Սարք Arduino- ի, Esp8266- ի կամ Esp32- ի համար. Ես ստեղծում եմ գրադարան ՝ EBYTE E32- ը կառավարելու համար ՝ LoRa սարքի Semtech շարքի հիման վրա, շատ հզոր, պարզ և էժան սարք: Դուք կարող եք գտնել 3Km տարբերակ այստեղ, 8Km տարբերակ այստեղ Նրանք կարող են աշխատել 3000 մ -ից 8000 մ հեռավորության վրա, և նրանք ունեն բազմաթիվ հնարավորություններ
Երկար հեռավորություն, 1.8 կմ, Arduino- ից Arduino անլար հաղորդակցություն HC-12- ով. 6 քայլ (նկարներով)
![Երկար հեռավորություն, 1.8 կմ, Arduino- ից Arduino անլար հաղորդակցություն HC-12- ով. 6 քայլ (նկարներով) Երկար հեռավորություն, 1.8 կմ, Arduino- ից Arduino անլար հաղորդակցություն HC-12- ով. 6 քայլ (նկարներով)](https://i.howwhatproduce.com/images/002/image-4099-27-j.webp)
Երկար հեռավորություն, 1.8 կմ, Arduino- ից Arduino անլար հաղորդակցություն HC-12- ի հետ. կապի մոդուլ, որը շատ օգտակար է, չափազանց հզոր և հեշտ օգտագործման համար: Նախ կթողնեք
Անլար հաղորդակցություն ՝ օգտագործելով NRF24L01 հաղորդիչ մոդուլը Arduino- ի վրա հիմնված նախագծերի համար. 5 քայլ (նկարներով)
![Անլար հաղորդակցություն ՝ օգտագործելով NRF24L01 հաղորդիչ մոդուլը Arduino- ի վրա հիմնված նախագծերի համար. 5 քայլ (նկարներով) Անլար հաղորդակցություն ՝ օգտագործելով NRF24L01 հաղորդիչ մոդուլը Arduino- ի վրա հիմնված նախագծերի համար. 5 քայլ (նկարներով)](https://i.howwhatproduce.com/images/003/image-6694-21-j.webp)
Անլար հաղորդակցություն ՝ օգտագործելով NRF24L01 հաղորդիչ մոդուլը Arduino- ի վրա հիմնված նախագծերի համար. Սա իմ երկրորդ ուսանելի ձեռնարկն է ռոբոտների և միկրոկարգավորիչների մասին: Իսկապես զարմանալի է տեսնել ձեր ռոբոտին կենդանի և աշխատած սպասվածի պես: Հավատացեք ինձ, ավելի զվարճալի կլինի, եթե արագ և արագ կառավարեք ձեր ռոբոտին կամ անլար այլ իրերին:
Անլար հաղորդակցություն ՝ օգտագործելով էժան 433 ՄՀց ՌԴ մոդուլներ և Pic միկրոկոնտրոլերներ: Մաս 2: 4 քայլ (նկարներով)
![Անլար հաղորդակցություն ՝ օգտագործելով էժան 433 ՄՀց ՌԴ մոդուլներ և Pic միկրոկոնտրոլերներ: Մաս 2: 4 քայլ (նկարներով) Անլար հաղորդակցություն ՝ օգտագործելով էժան 433 ՄՀց ՌԴ մոդուլներ և Pic միկրոկոնտրոլերներ: Մաս 2: 4 քայլ (նկարներով)](https://i.howwhatproduce.com/images/002/image-5328-94-j.webp)
Անլար հաղորդակցություն ՝ օգտագործելով էժան 433 ՄՀց ՌԴ մոդուլներ և Pic միկրոկոնտրոլերներ: Մաս 2. Այս հրահանգի առաջին մասում ես ցույց տվեցի, թե ինչպես ծրագրավորել PIC12F1822- ը ՝ օգտագործելով MPLAB IDE և XC8 կոմպիլյատոր, մի պարզ տող անլար ուղարկելու համար ՝ օգտագործելով էժան TX/RX 433MHz մոդուլներ: Ստացողի մոդուլը USB- ի միջոցով միացված էր UART TTL- ին մալուխային գովազդ