02 martie 2017

PanAdapter pentru YAESU FT897D

            Aparitia pe piata a stick-urilor TV care folosesc chipset-ul RTL2832U, mi-a atras atentia asupra facilitatilor si posibilitatilor acestuia.  Am fost deosebit de incintat sa descopar ca poate receptiona aproape orice tip de emisiune intr-o gama larga de frecvente ce se intinde de la citiva zeci de megahertzi pina la cca 2GHz. O alta facilitate, destul de interesanta pentru zilele noastre, este aceea  prin care acesta permite inregistrarea unui spectru radio, de 2MHz, permitind ascultarea ulterioara a acesteia, pe fiecare emisiune sau frecventa in parte. Acest stick este o adevarata bijuterie, foarte ieftin, care in functie de imaginatia fiecaruia permite o varietate de functii. Dintre toate mi-a atras atentia posibilitatea lui de a fi folosit pe post de Panoramic Adapter la transceivere de generatie veche sau mai recenta. Acest adaptor permite vizualizarea pe calculator a unui segment de banda radio si posibilitatea de schimbare rapida a frecventei in transceiver, printr-un simplu click. Personal, nu sint fan al acestui adaptor in unde scurte, deoarece gradul de incarcare al benzii este destul de mare. In schimb, in unde ultrascurte, unde mai aproape tot timpul este zgomot de fond, acesta devine destul de util prin descoperirea la timp a unor emisiuni radio noi aparute. Primele teste le-am facut in vara anului trecut si au avut ca rezultat, identificarea in timp real ale unor statii noi aparute, urmat de legatura radio cu acestea. Aceste experiente reusite m-au convins asupra utilitatii lui si astfel am inceput sa ma gindesc tot mai serios la modul de adaptare al acestuia la echipamentul pe care il folosesc eu, un FT897D. Pe internet este sugerat a se conecta in statia radio la prima frecventa intermediara, inainte de filtru. Desi exista doua puncte de conectare, cel mai convenabil este punctul B, deoarece aici influenta stick-ului asupra receptiei este minima, aproape insesizabila. In punctul A, datorita cuplajului strins din filtru, acesta influenteaza in mod negativ caracteristica acestuia, producind o atenuare semnificativa a semnalului.


           Pentru a micsora la maxim influenta stick-ului asupra statiei si invers, am hotarit sa il cuplez la frecventa intermediara printr-un etaj amplificator separator. Un simplu amplificator cu FET am considerat ca este deajuns si astfel am trecut la treaba. Eu folosesc pentru receptia emisiunilor un stick de la firma TerraTec model Cinergy TStickRC Rev. 3. 


            Schema de principiu folosita este prezentata mai jos. Alimentarea etajului amplificator separator se face cu tensiune de 3.3V care se ia direct din stick. Singurele modificari efectuate acestuia au fost eliminarea conectorului USB si a senzorului IR pentru telecomanda. Astfel pinul folosit pentru alimentarea senzorului a fost utilizat pentru alimentarea etajului amplificator.


            Pentru punerea in practica a celor descrise aici, am proiectat un cablaj imprimat cu dimensiunile 59 x 97 mm, in care am dispus convenabil amplificatorul separator si modulul stick. Pentru conectarea externa cu calculatorul personal am dispus folosirea unui conector USB tip B.



          Din motive ergonomice, mi-am dorit ca acest modul sa fie montat in interiorul statiei. Astfel am hotarit sa il montez in cutia de acumulatori, deoarece exista disponibil foarte mult spatiu si nu intentionez sa folosesc vreodata echipamentul pe acumulatori. Pentru fixarea modulului am dat doua gauri in suportul de metal, fara sa afectez in vreun fel functionarea sau stabilitatea mecanica a statiei. Astfel dupa montare, conectorul USB trebuie sa se afle pozitionat in dreptul conectorului CHG - B de la acumulatori. Iata citeva detalii constructive:







          Realizarea practica a modulului nu prezinta nicio problema. Trebuie acordata putina atentie fixarii acestuia si a modului cum sint alesi distantierii, acestia fiind inegali. Recomand fixarea mai intii a modulului in gaurile deja existente, marcarea si apoi gaurirea celorlalte. Cea mai mare atentie trebuie acordata conectarii cablului coaxial care face legatura dintre modul si frecventa intermediara. Firele trebuiesc cositorite inainte de lipire, identificat corect punctul de conexiune si apoi cu putin profesionalism se executa lipitura. Nu au fost probleme deosebite.
            Astfel, cu modulul gata montat am trecut la teste. Eu folosesc pentru a vizualiza semnalele programul HDSDR setat pe frecventa 68339000 Hz si un offset de 9000 Hz, iar pentru acordul automat prin functia CAT, folosesc Omnirig. Setupul complet este descris de catre K4AX in videoclipul sau. In urma testelor facute prin conectarea si deconectarea la frecventa intermediara a modulului, variatia semnalelor la receptie,  in difuzorul statiei, este insesizabila. 


           La final as dori sa precizez ca nimic din ceea ce am descris aici nu este nou, original. Este doar o solutie, un mod de rezolvare a problemelor propuse, conform cerintelor proprii si sugestiilor din internet. 

La executarea proiectului m-am inspirat din:


06 februarie 2017

Microfon cu Bluetooth pentru conectare CAT la Yaesu FT897

            Nu sint fan CAT si nici nu-mi place sa comand transceiverul din calculator. Ma simt bine cind rotesc vernierul, cind simt cu adevarat acordul, cind sunetul este asa cum il doresc eu. Si totusi exista momente cind avantajele CAT sint de neinlocuit. Nu ma voi apuca sa descriu aici avantajele si dezavantajele folosirii acestuia dar voi spune ca am luat decizia folosirii CAT pentru comanda statiei dupa ce am facut primele teste ale unui Pan Adapter cu RTL2832U la transceiverul meu FT897D. Este minunat cind esti in 2m sa poti vizualiza banda sau un segment de banda si sa poti descoperii la timp aparitia unui corespondent pe o alta frecventa apropiata tie. Dar cum aceasta nu este deajuns, observind si principalele neajunsuri, am luat hotarirea sa completez cu CAT receptia mea panoramica. Initial luasem hotarirea folosirii unui cablu intre transceiver si calculator pe care era intercalat un convertor USB la RS232 si o adaptare optoizolata conform schemei de aici. Navigind pe internet am descoperit o idee mult mai simpla, moderna si eleganta: conectarea statiei printr-un modul bluetooth. Ideea nu era noua si a fost descrisa pentru intiia data, dupa cunostintele mele, de catre Dan YO3GGX, pe pagina personala. Dar cum nici aceasta nu era deajuns, pe pagina personala a lui SP3SWJ, apare descrisa montarea si conectarea bluetooth-ului in interiorul microfonului MH31A8J cu care sint inzetrate transceiverele FT857 si FT897.


            Deoarece aveam prin casa disponibil un modul GW-040, care este suportul de baza al modulului bluetooth HC-06, pe care il achizitionasem pentru diferite teste, am luat hotarirea sa il sacrific acestui proiect. Si cum descrierea nu parea prea complicata in scurt timp am trecut la treaba.


1. Am demontat capacul microfonului, placuta cu componente si am indepartat armatura de plastic care sustine microfonul dinamic. Prin indepartare am facut loc montarii modulului intre placuta cu componente si carcasa. Aceasta armatura nu a afectat in mod negativ stablitatea sau functionarea microfonului.


2. Am pregatit modulul bluetooth prin conectarea unor fire de culori diferite pentru conectarea acestuia la microfon. 


3. Folosindu-ma de schema originala a microfonului MH31A8J dupa scurtare am conectat firele la placuta cu componente conform schemei alaturate.



4. Am introdus cu atentie modulul in microfon si am montat placuta cu componente si capacul de la microfon.




5. Cu ajutorul menu-ului 59 din FT897D am activat functionarea modulului prin selectarea functiei
' CAT '. Modulul este descoperit in retea cu ID-ul 'HC-06' si parola este '1234'.

La testarea acestuia am folosit un telefon mobil cu Android pe care am instalat programul lui Dan YO3GGX, respectiv PocketRxTx Free. Modulul a functionat de prima data fara nicio problema. Nu l-am testat pe adaptorul panoramic, dar aceasta va fi subiectul unor experimente viitoare.

La executarea proiectului m-am inspirat din:

Constantin Badican  - YO7FWS
---  73's   YO7FWS  ---

31 decembrie 2016

Retea privata Dynamic DNS cu ESP8266 ( partea 2 )

Client si Server Dyn DNS - versiunea Arduino


            Cind am hotarit pentru prima oara sa scriu programe pentru NodeMCU, am avut de ales intre limbajele eLua si Arduino. Cistigator a fost eLua deoarece era mult mai apropiat de limbajele pe care le cunosc eu. Cu timpul am descoperit ca datorita simplitatii, limbajul eLua este foarte limitat. Atunci, de voie-de nevoie, am decis sa invat limbajul Arduino. Cu ajutorul unui tutorial simplu, aproape totul intr-o singura pagina, am inceput, incet-incet, sa il invat. La scurt timp au aparut si primele rezultate. Dar cea mai mare provocare a fost cind am luat hotarirea sa-mi traduc propriile programe din eLua, in Arduino. Desi rezultatele nu se aseamana cu sursele lor, am reusit sa implementez majoritatea functiilor si facilitatilor din programele sursa. Personal, cred ca am reusit. Azi fac public sursele programelor Server si Client Dyn DNS versiunea Arduino. Nu ma astept sa fie perfecte si probabil pe alocuri mai pot fi cosmetizate, dar garantez ca sint perfect functionale. Cel mai greu a fost implementarea agendei in care se memoreaza numele clientilor si IP-urile acestora. Sincer, in eLua era chiar mai simplu. Sper ca cineva, cu mult mai multa experienta, sa corecteze codul meu. 
Deoarece 2016 este la final si 2017 bate la usa, urez tuturor, 
La multi ani cu multa sanatate si prosperitate !

19 decembrie 2016

Retea privata Dynamic DNS cu ESP8266 ( partea 1 )

            Intotdeauna cind vei dori sa accesezi de la distanta prin internet un dispozitiv, o camera IP, un mic server sau un simplu senzor, te vei lovi mereu de aceeasi problema: unde si la ce adresa din internet se gaseste dispozitivul tau? Asa am patit si eu, la inceput, cind m-am hotarat sa accesez informatia de pe un mic server cu NodeMCU dispus la mine acasa. Dar problema expusa nu este noua, ea fiind rezolvata de multi altii inaintea mea. Solutia adoptata de catre acestia consta in apelarea la serviciile de redirectionare IP ale unor site-uri precum DynDNS, No-IP, FreeDNS, etc. La inceput am fost tentat si eu, sa folosesc un astfel de serviciu dar studiind bine oferta providerului meu de internet, RCS RDS, am constatat ca nu mai era necesar. Acesta ofera serviciul gratuit de redirectionare IP pentru clientii sai. Astfel, setand un domeniu pe site-ul lor si un port forward pe routerul meu am facut posibila aparitia mea pe internet la adresa ywar2.go.ro:9876. Dar lucrurile nu stau intotdeauna asa bine. Cind m-am hotarat sa fac aceeasi setare intr-o alta locatie a familiei mele, aceasta nu mai era posibila. Providerul local nu ofera servicii de redirectionare. Astfel, cautand solutii pe internet, mi-a venit ideea: de ce nu mi-as face propria mea retea privata de redirectionare IP? Oare ar fi posibil? De ce as avea nevoie?
            Fara sa intru in amanunte si descriind aspecte la care nu ma pricep, am constatat ca majoritatea retelelor sint constituite dintr-un server dispus la un IP fix, unul sau mai multi clienti care au IP-urile dinamice si un protocol de comunicatie intre acestia. Protocolul este simplu si consta dintr-un mesaj prin care clientul isi face cunoscuta identitatea si apartenenta la retea, iar serverul memoreaza identitatea si IP-ul la care se afla acesta. La aparitia unui vizitator care doreste sa ia legatura cu clientul, serverul trimite adresa IP unde se afla acesta, astfel stabilindu-se legatura intre vizitator si client. Daca asa stau lucrurile, atunci de ce as avea nevoie? In primul rand de un IP fix sau relativ fix, de un server, un client si un protocol de comunicatie intre acestia. IP fix sau relativ fix am de la providerul meu de internet. El este relativ fix deoarece in realitate este dinamic, dar adresa la care acesta este gasit, respectiv ywar2.go.ro, este fixa. Pentru server si client m-am hotarit sa folosesc modulele cu ESP8266, respectiv NodeMCU. Sint simplu de folosit, mici si ieftine, si se conecteaza usor la internet. In privinta protocolului de comunicatie m-am inspirat din mesajele pe care le trimit furnizorii de astfel de servicii pe care datorita simplitatii retelei le-am adaptat cerintelor minime de functionare. Iata cum arata in realitate reteaua mea privata !



Protocolul de comunicatie


           Pentru functionarea corecta a retelei periodic, la un anumit interval de timp, clientul trebuie sa comunice cu serverul. Acesta trebuie sa anunte de existenta si apartenenta sa la retea. Personal, datorita simplitatii retelei, dar si datorita faptului ca este privata, am renuntat la partea de mesaj cu apartenenta acestuia. Aceasta consta intr-o parola prin care isi confirma autenticitatea. Nu am si nu intentionez sa am asa multi clienti incat sa apara conflicte la nivelul serverului. Serverul confirma receptia mesajului, detecteaza IP-ul clientului si il memoreaza alaturi de identitatea acestuia. Cind un vizitator interogheaza serverul despre un client, serverul trimite vizitatorului o pagina HTML de redirectionare a acestuia catre adresa IP la care se gaseste clientul cautat. In continutul paginii HTML se gaseste un script care se executa automat si care directioneaza browserul clientului la adresa IP solicitata. Continutul paginii HTML este inspirat exact de aici. Iata mai exact schimbul de mesaje intre client, server si vizitator.


Serverul


            Gestionarea retelei, mai precis evidenta clientilor, detectarea IP-urilor si redirectionarea vizitatorilor catre destinatari este deservita de catre server. Desi, la prima vedere, pare ca acesta are destul de mult de lucru, in realitate nu este asa. Cea mai mare parte din timpul functionarii sale este ocupata cu traficul si evidenta clientilor, iar cea mai mica parte din timp, cu raspunsul la interogarea vizitatorilor. Ce face concret acesta ? Ori de cate ori un client trimite un mesaj de improspatare a datelor, continutul acestora este analizat, este extras numele clientului, detectat IP-ul acestuia si apoi memorate impreuna. Daca toate acestea sint realizate, serverul confirma clientului receptia corecta a mesajului. Desi nu am prevazut explicit acest caz, cind continutul mesajului este alterat, severul raspunde clientului cu pagina de redirectionare catre o pagina WEB care avertizeaza eroarea. La aparitia unui vizitator serverul poate raspunde in mai multe moduri. Daca vizitatorul interogheaza doar adresa serverului, fara numele unui client, acesta raspunde cu o pagina WEB prin care se identifica. Atunci cind interogarea contine si numele unui client, serverul verifica clientii din memoria sa si daca acesta exista, trimite pagina de redirectionare cu IP-ul clientului cautat. Daca clientul nu exista sau continutul este alterat, este redirectionat catre o pagina WEB care avertizeaza eroarea. Acestea sint pe scurt toate procesele pe care le desfasoara serverul. 

Clientul


            Rolul clientilor in aceasta retea este acela de a comunica serverului numele clientilor care beneficiaza de serviciul de redirectionare. Numele clientilor alaturi de IP-urile lor vor fi memorate de catre server pentru a fi furnizate ulterior vizitatorilor. Pentru a nu aglomera inutil serverul si pentru prevenirea aparitiei de coliziuni, este indicat ca rata de reimprospatare a datelor din server sa se faca o data la 10..15 minute. Astfel serverul poate gestiona un numar mare de clienti si utilizatori. Orice conectare corecta la server, dar si deconectarea, sint indicate de aprinderea sau stingerea LED-ului de pe placa. Desi nu este indicat, temporar, pana la resetarea IP-ului sau chiar a serverului, update-ul se poate face si manual, respectand regulile din imaginea de mai sus, dintr-o pagina WEB, fara a fi necesara existenta unui modul client. Acesta este un caz particular, posibil ca o  facilitate a acestui sistem.

Realizarea practica


            Pentru crearea serverului si clientului, m-am orientat catre modulele NodeMCU. Acestea beneficiaza de o gramada de facilitati care le fac perfecte realizarii proiectului. Pentru scrierea programelor care gestioneaza serviciile acestora am folosit limbajul eLua. Nu voi intra in amanunte legat de ceea ce am scris, dar voi da lamuriri daca mi se vor cere. Programele sint open source si pot fi modificate dupa bunul plac. Ambele variante, server si client sint versiuni Lite care asigura minimul de functii necesare functionarii corecte a retelei. Toate imbunatarile de care vor beneficia acestea, vor fi publicate pe viitor. Experimentele continua !

Online Dynamic DNS Server: ywar2.go.ro:9876.
Descarca codul sursa.

Pentru realizarea proiectului m-am inspirat din:


Constantin Badican  - YO7FWS
---  73's   YO7FWS  ---

14 octombrie 2016

Interconectare GPS - ESP8266

      Intentionez sa ma apuc de un nou proiect. Vreau sa im construiesc o baliza radio WSPR. Din schemele publicate pe internet reiese necesitatea folosirii unui GPS, pentru sincronizarea corecta a balizei radio si detectarea pozitiei acesteia. Cu ajutorul site-urilor specializate in vinzari - cumparari, am gasit la un pret destul de modic un Mouse GPS model Fortuna U2 folosit la extinderea functiilor pocket-urilor. Prima operatie pe care am facut-o a fost demontarea acestuia, inlaturarea cablurilor de legatura si conectarea unor fire subtiri necesare testelor ce vor urma. Conectarea firelor am facut-o conform figurii de mai jos. Am cautat prin seratarele mele si am gasit un modul convertor USB2Serial care dupa instalarea driverelor in Windows am constatat ca nu functiona corect, fiind compatibil cu versiuni mai vechi. Ce este de facut?  Cum pot vizualiza semnalele NMEA receptionate de GPS daca nu am niciun adaptor de port serial? Astfel mi-a venit ideea: il conectez pe serialul lui NodeMCU. La treaba, urmeaza experimente !

Schema conectare GPS - NodeMCU V3

      Pentru a vizualiza semnalele NMEA care sint transmise prin intermediul portului serial cu ajutorul modulului NodeMCU imi era necesar realizarea unui bridge de date intre portul serial al acestuia si internet. Pentru aceasta am scris un mic program care transfera datele astfel incit ele pot fi vizualizate cu ajutorul unui client TCP din internet. Dupa citeva teste programul a fost gata si am trecut la experimente. Dupa conectarea iesirii de date de la GPS la modulul NodeMCU si alimentarea acestuia am inceput a vizualiza pe internet datele transmise de acesta. Nu mica mi-a fost mirarea sa constat ca erau caractere alfanumerice aleatoare, nimic din ce mai vazuzesem pe internet. M-am intors dinou la browser si dupa citeva cautari descopar in descrierea unui videoclip recomandarea: Baud rate: 4800, inverted signal levels. Desii am incercat software sa inversez semnalele inainte de a le transmite pe internet, rezultatele au fost un esec total.  Daca nu am reusit software atunci sa incercam hardware. Am luat un tranzistor BC171  si cu o rezistenta de 10K si cu ajutorul lor am construit o poarta inversoare pe care am conectat-o intre iesirea de date GPS si intrarea modulului NodeMCU. Am pornit montajul si satisfactie maxima: au aparut datele mult asteptate. Concluzie: GPS-ul functioneaza. Pozitionat in dreptul ferestrei a receptionat cu destula intirziere patru sateliti si mi-am putut vedea coordonatele pozitie mele.

Semnalele NMEA receptionate de GPS

      Pentru cine este interesat pun la dispozitie schema de interconectare GPS cu NodeMCU si softul pe care l-am folosit pentru a viziona datele din internet.
      Concluzie: inca un experiment reusit!

            GPS2Internet Bridge.lua

            Pentru realizarea experimentului m-am inspirat din:
            https://www.youtube.com/watch?v=NrUjZwZolA4
            http://www.blitzortung.org/Documents/TOA_Blitzortung.pdf


---  73's   YO7FWS  ---



Constantin Badican  - YO7FWS
---  73's   YO7FWS  ---

03 iunie 2016

Trimiterea mesajelor Email cu ajutorul lui ESP8266


Navigind pe internet in cautarea diferitelor aplicatii pentru modulul ESP8266 am fost placut surprins sa gasesc un mic program cu ajutorul caruia acest modul poate trimite mesaje de tip email. Programul a fost publicat de utilizatorul Miguel pe site-ul Github .
             Dupa ce am citit codul sursa, la sfatul autorului mi-am creat un cont de email pe site-ul
AOL.com. Am modificat codul sursa cu datele contului meu si l-am incarcat in modul. Dupa restart, in cca 10…20 secunde, timp in care modulul s-a preocupat cu logarea si trimiterea unui email, am fost anuntat de un notificator ca am primit un email pe adresa mea de Yahoo. Surpriza mare: functioneaza !
             Am fost foarte bucuros de aceasta, deoarece trimiterea independenta a unui mesaj email, fara interventia utilizatorului, poate crea noi oportunitati pentru viitoare proiecte si experimentari. Cel mai bun exemplu este monitorizarea unui proces oarecare si notificarea prin email in cazul unei modificari al acestuia. Daca tot experimentez mini Dx Cluster-ul folosind acest modul, ce ar fi daca as incerca sa imi implinesc un vis mai vechi: sa am propriul Dx Robot precum cel de la adresa de aici. Adica un program care sa monitorizeze toate spoturile de pe cluster, sa le filtreze, i-ar la aparitia unor indicative cautate, a unor legaturi intr-o anumita banda, s-au a unei propagari deoasebite, sa fiu notificat in timp real prin email. Mi se pare o idée buna, mai cu seama ca poate fi facuta cu un modul de dimensiunile unei jumatati de pachet de tigari care poate fi alimentat cu doua baterii de telecomanda. In curind voi incepe noi experimentari, iar rezultatele acestora le voi face publice aici.
             Deoarece am rezolvat problema uploadului pentru codul sursa, solutia fiind Google Drive, nu voi publica codul sursa, dar il voi pune si eu la dispozitie, desii acesta poate fi descarcat si de pe Github.
             Inca odata mentionez codul sursa nu-mi apartine, eu nu am facut decit sa il testez.

- send_email_smtp.lua
- base64.lua


Constantin Badican  - YO7FWS
---  73's   YO7FWS  ---



21 mai 2016

mini DX Cluster cu ESP8266 ( partea 2 )

Si experimentele continua…
      In prima parte solutia pe care am gasit-o la realizarea proiectului consta in crearea unui client TCP care se conecta la DX Cluster ( DXC ) si apoi crearea unui server TCP care gestiona conectarile clientilor la acesta. Transferul datelor, a spoturilor in sine, se facea odata la 100 msec cu ajutorul unui timer. Solutia aceasta nu mi-a placut deloc in sine, deoarece mi se parea corect ca trimiterea spoturilor catre clientul serverului, trebuia sa se faca ‘on event’, adica in momentul receptionarii unui spot. Plecind de la aceasta dorinta am gasit solutia optima, si probabil cea mai corecta. Mai intii creez serverul TCP, serverul care va gestiona conectarea clientilor catre DXC si il pun in asteptarea unui viitor client. Cind un client se conecteaza la server, creez o conexiune TCP si ma conectez la DXC, iar in momentul receptionarii spoturilor le trimit catre clientul serverului. Cind clientul se deconecteaza, conexiunea TCP cu DXC se inchide, serverul revenind dinou in starea de asteptare.  Aceasta solutie functioneaza foarte bine si astfel nu voi pierde niciun spot receptionat, iar serverul va va fi ocupat decit pe durata conectarii clientului sau.
      Pe timpul experimentelor am constatat si alte evenimente paralele cu aplicatia, evenimente nedorite. Citeva dintre acestea au fost: intreruperea conexiunii de internet dintre routerul meu si provider sau intreruperea conexiunii wireless. Deoarece in programul scris de mine nu au fost prevazute asemenea momente, modulul raminea fara conexiune si chiar daca totul revenea la normal, acesta nu se mai reconecta deloc.  Pentru rezolvarea acestor probleme, am setat un timer care odata la 10 secunde se verifica starea conexiunii wireless si daca se constata nereguli, modulul se restarteaza automat. Deasemenea, pentru a prevenii eventuale disfunctionalitati in conexiunea cu internetul, am prevazut ca odata pe ora, numai daca nu am un client conectat, modulul sa se restarteze automat, indiferent de starea conexiunilor wireless si internet in sine. Am simulat diferite momente, respectiv pierderea conexiunii wireless sau internet si apoi revenirea acestora. Modulul s-a comportat corect restabilind cu succes conexiunea.
      Am adaugat si unele briz-briz-uri, caci altfel nu se poate, conectarea unui client la server este semnalizata de un LED ce se gaseste pe modulul ESP8266.
      Deoarece pina voi rezolva problema uploadarii codului sursa arhivat pe blog, il voi publica aici, in continuare.
      Daca nu fac experimente si modulul este liber, puteti sa incercati functionarea conexiunii,  conectindu-va cu un program client TCP la adresa: http://ywar2.go.ro:9876
      Acum ma grabesc sa inchid, deoarece mi-a mai venit inca o idée…

---------------------------------------------------------------
--                         v1.5.7                            --
---------------------------------------------------------------
-- se verifica existenta conexiunii WiFi la fiecare 10 secunde
-- din ora in ora restartez automat modulul daca nu am niciun
-- client conectat
-- se afiseaza ip-ul userului conectat
-- conectarea utilizatorilor este semnalizata prin LED-ul WiFi
---------------------------------------------------------------

    -- setez id wireless si parola
    ssid = "YO7FWS"
    pass = "********"

    -- configurez wifi in client mode
    wifi.setmode(wifi.STATION)

    -- wifi config start
    wifi.sta.config(ssid,pass)
    
    -- wifi connect
    wifi.sta.connect()
    
    -- variabila folosita la contorizarea unei ore
    t = 0

    -- variabila care indica daca am un utilizator conectat
    -- true -> conectat, false -> deconectat
    conectat = false
    
    -- pinul la care este conectat ledul de pe modulul WiFi
    -- led ON -> client conectat, led OFF -> client deconectat
    pin = 4
    
    --  setez pinul ca iesire
    gpio.mode(pin, gpio.OUTPUT)
    
    -- verific daca mai sint conectat la reteaua WiFi
    -- daca sint deconectat atunci restart modul
    tmr.alarm(0, 10000, 1, function()
        if wifi.sta.status() == 1 then node.restart() end
        if wifi.sta.status() == 2 then node.restart() end
        if wifi.sta.status() == 3 then node.restart() end
        if wifi.sta.status() == 4 then node.restart() end

        -- cronometrez o ora
        t = t + 1

        -- cind a trecut o ora, daca nu am niciun client
        -- conectat, atunci restart modul
        -- 1[h]*60[min]*60[sec]*1000[msec]/10000[msec] = 360
        if (t >= 360) and (conectat == false) then node.restart() end
    end)

    -- creez un server viitor dx cluster
    server = net.createServer(net.TCP,28800)
    
    -- variabile care memoreaza spoturile ptr a fi retransmise
    spot = ''
    
    -- serverul sta in stand by pina ce se conecteaza un client 
    -- cind un client s-a conectat atunci...
    server:listen(9876, function(server)

        -- creez o conexiunea client la un dx cluster
        client = net.createConnection(net.TCP, false)
    
        -- ma conectez la dx clusterul lui N2YO
        client:connect(7300,"dxc.n2yo.net")
        
        -- debugg
        print('Client conectat')
        
        -- aprind ledul
        gpio.write(pin, gpio.LOW)

        -- indic client conectat
        conectat = true
        
        -- interoghez serverul despre IP
        ip,port = server:getpeer()
        
        -- trimit un mesaj de intimpinare
        server:send('Bine ati venit pe Dx Clusterul meu\nVizionare placuta !\nIP-ul dvs este '..ip..'\n')
        
        -- cind se receptioneaza un mesaj sau spot
        client:on("receive", function(sck, spot) 
        
            -- daca mesajul este de logare atunci transmit clusterului indicativul
            if spot == 'login: ' then 
                client:send("yo7fws\n") 
            else 
                -- altfel transmit clientului meu spotul  
                server:send(spot)
            end
            
            -- debugg
            --print(spot)
        end)
        
        -- cind clinetul se deconecteaza 
        server:on('disconnection', function(server)
        
            -- inchid conexiunea cu dx cluterul
            client:close()
            
            -- debugg
            print('Client deconectat') 


            -- indic client deconectat
            conectat = false

            -- resetez contorul de restart la 1 ora
            t = 0
            
            -- sting ledul
            gpio.write(pin, gpio.HIGH)
        end)
    end)
    
    
---------------------------------------------------------------
--                     YO7FWS - MAI 2016                     --
---------------------------------------------------------------

Pentru gasirea unor solutii pe timpul scrierii programului m-am mai inspirat si de aici:
https://nodemcu.readthedocs.io/en/dev/en/modules/gpio/


Constantin Badican  - YO7FWS
---  73's   YO7FWS  ---

15 aprilie 2016

mini DX Cluster cu ESP8266 ( partea 1 )

                De curind am descoperit pe internet un modul WiFi gestionat de un microcontroler Tensilica capabil de conexiuni TCP/IP, construit de o firma chineza Espressif. Acest modul se cheama ESP8266 si pina la momentul actual a fost construit in mai multe versiuni. Nu voi intra foarte mult in detalii legate de capabilitatile acestui modul deoarece ele sint descrise detaliat pe pagina producatorului cit si pe o multime de pagini din internet. Acest modul poate fi programat de utilizatori folosind diferite limbaje de programare, dintre cele mai utilizate fiind Lua, C++ si Arduino, dar si comenzile 'AT', atunci cind folositi un microcontroler extern. Din nefericire pentru mine niciunul dintre aceste limbaje nu imi este bine cunoscut, dar uitindu-ma peste sursele diferitelor aplicatii publicate pe internet, Lua se apropie cel mai bine de cunostintele mele in programare. Asa ca de voie, de nevoie, m-am apucat sa invat din mers... LUA. Pentru a scrie in Lua este nevoie ca in  modul sa fie incarcat un interpretor, respectiv firmware-ul NodeMCU. Va sfatuiesc sa intrati pe pagina oficiala NodeMCU si sa va uitati pe diferitele programe date ca exemplu, mai mult ca sigur o sa ramineti pe ginduri.
                Deoarece marea majoritate a modulelor sint construite minimal, pentru aplicatii simple unde este nevoie decit de alimentare si citeva conexiuni cu exteriorul, eu am optat pentru o placa de dezvoltare. Principalele motive sint: 
- usor de programat deoarece contine interfata USB - Serial
- alimentarea se face atit prin intermediul portului micro USB cit si prin pini dedicati. Deobicei o alimentez din USB-ul calculatorului, iar cind sint plecat folosesc incarcatorul telefonului mobil
- port serial prin pini dedicati pentru conexiuni cu exteriorul
- si nu in ultimul rind, o gramada de porturi GPIO
               Placa de dezvoltare pe care am cumparat-o este 'teoretic' construita de firma LoLin, am gasit-o pe un site de vinzari - cumparari din tara noastra.


Softul folosit de mine pentru incarcarea programului scris in Lua este ESP8266 LuaLoader.


                Programul in sine redirectioneaza toate spoturile transmise de un DX Cluster ( DXCL ) catre un client TCP, conectat de aceasta data la serverul ESP8266. Nu am incercat conectarea si retransmiterea in acelasi timp a spoturilor din doua sau mai multe clustere, dar o voi incerca pe viitor. Ceea ce este inedit la aceasta aplicatie, este faptul ca inafara de alimentare si citeva setari in routerul de internet, avem cel mai mic si mai simplu server si client TCP. Ca facilitati, doar folosind clientul TCP al DXCL, se pot implementa in acesta filtrarea spoturilor. De exemplu spoturile care anunta propagarea Es sporadic sau Aurora, pot fi filtrate si retransmise catre un client. Alta posibila aplicatie ar putea fi anuntarea clientului prin trimiterea unui SMS sau email, a unui spot anume. Si posibiltatile mai pot fi multe altele. 
               Simplitatea presupune si dezavantaje. Un dezavantaj observat de mine este faptul ca serverul nu poate gestiona mai mult de un client. In momentul conectarii celui de al doilea client, toate spoturile sint redirectionate catre acesta, primul client nemai receptionind nimic. Probabil functioneaza si aceasta, sau poate nu, ramine de studiat pe viitor.
                O problema pentru mine a fost extragerea spotului receptionat de catre clientul DXCL si retransmiterea lui catre server. Desii am incercat mai multe variante de a reimprospata datele din server cu cele din clientul DXCL, nu am avut niciun rezultat multumitor. Singura solutie, care marturisesc ca nu mi-a placut, a fost sa fac refresh cu ajutorul unui timer setat arbitrar de mine la 100 msec. Un dezavantaj ar fi ca daca in decursul a 100 msec vin doua spoturi, unul dintre ele se va pierde sigur. O alta solutie incercata de mine, cu sanse foarte mari de reusita era sa transmit datele pe iesirea portului serial si printr-o bucla, sa le reintroduc pe intrarea aceluiasi port. Functioneaza, chiar foarte bine, dar din cauza logo-ului din restartul modulului, NodeMCU 0.9.6 build 20150704  powered by Lua 5.1.4, acesta nu poate restarta corect programul, facind restart continuu. Problema se putea rezolva cu ajutorul unei porti exterioare comandata intirziat de un registru GPIO, dar atunci proiectul isi pierde din farmecul simplicitatii lui. Pe partea de client, spoturile transmise de serverul ESP8266, pot fi vizualizate cu ajutorul unui client TCP. Pe smartphone am folosit aplicatia TCP Client pe care o descarcati din Google Store, iar in Windows am folosit aplicatia Hercules Setup Utility.
Iata in continuare programul meu:

---------------------------------------------------------------
--                         v1.4                              --
---------------------------------------------------------------
 -- setez id wireless si parola
 ssid = "YO7FWS"
 pass = "********"

 -- configurez wifi in client mode
 wifi.setmode(wifi.STATION)

 -- numai pentru debug, afisez modul
 --print('set mode=STATION (mode='..wifi.getmode()..')\n')

 -- setez SSID si parola wifi
 wifi.sta.config(ssid,pass)

 -- ma conectez wifi
 wifi.sta.connect()

 -- creez o conexiunea client la un dx cluster
 client = net.createConnection(net.TCP, false)

 -- creez un server viitor dx cluster
 server = net.createServer(net.TCP)

 -- variabila care memoreaza portul din routerul meu
 -- unde poate fi accesat clusterul
 port = 9876

 -- variabile care preia spotul de la clientul dx cluster
 -- si il transmite viitorului server dx cluster
 spot = ''

 -- variabila care memoreaza ultimul spot retransmis
 mem = spot

 -- atunci cind clientul a receptionat un mesaj sau spot
 client:on("receive", function(sck, c) 
    -- daca cere sa ma loghez atunci transmit indicativul
    if c == 'login: ' then client:send("yo7fws\n") end  
    -- extrag spotul sau mesajul pentru a fi retransmis 
    spot = c
 end )

 -- atunci cind la server s-a conectat un client 
 server:listen(port, function(server)
    -- la fiecre conectare a unui client afisez un logo
    server:send("Bine ati venit pe clusterul lui YO7FWS\n\n")
    -- nu-mi place asta, dar n-am gasit nicio solutie
    -- execut odata la 100 msec
    tmr.alarm(0, 100, 1, function()
        -- daca spotul este diferit de ceea ce a fost 
        -- retransmis anterior, atunci
        if mem ~= spot then
            -- numai pentru debug, afisez spotul
            --print(spot) 
            -- transmit clientului spotul
            server:send(spot)
            -- memorez acest spot pentru 
            -- a nu-l retransmite dinou
            mem = spot
        end
    end )
 end)

 -- ma conectez ca client la dx clusterul lui N2YO
 client:connect(7300,"dxc.n2yo.net")
---------------------------------------------------------------
--                     YO7FWS - APR 2016                     --
---------------------------------------------------------------

                Proiectul descris aici nu este mare lucru. Este o solutie din alte multe altele. Un simplu smartphone face mult mai mult decit aici. Dar placerea este cu mult mai mare cind am gasit eu rezultatul la provocarea: ia sa vedem, eu pot ? Si am putut...
Pe curind !

Cind nu fac experimente, puteti accesa clusterul pe adresa: http://ywar2.go.ro:9876

Ca surse de inspiratie am folosit:

Si totul a plecat de aici:


Constantin Badican  - YO7FWS
---  73's   YO7FWS  ---