• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Odbiornik do sygnalizatorów fischtronic (videotronic nova)
#11
No przy okazji napiszesz tu wiele ciekawych rzeczy. To radio nadaje systemem trójkowym, RCswitch obsługuje taki tryb, ale biblioteki też trzeba się nauczyć - jak ją obsługiwać.
Dwa szerokie sygnały to 1, dwa wąskie to 0, szeroki i wąski to F. Analogicznie jak liczby binarne czy dziesiętne układ trójkowy ma trzy cyfry. Czyli tą samą liczbę można zapisać na trzy sposoby:
Decimal: 250304 (18Bit) Binary: 111101000111000000 Tri-State: 11F0F1000 , z tym że system trójkowy tutaj to tylko 3^9 wartości, więc jest mniej efektywny niż binarny, bo marnuje połowę impulsów, a nie ma 2x cyfr dzięki temu, no i nie jest ta sama liczba tak do końca, czy w ogóle, tylko interpretacja tego samego układu impulsów,
Więc zamiast bawić się kolejkami pozostaje wymyślić jak to odczytać, masz czasy w tablicy, można znaleźć wartość synchronizacji >10 i <20k, potem idąc w tył tablicy odczytać 0 i 1, złożyć z niej 18 bitów do liczby uint32_t (ma to sens, jeśli wstecz da się odczytać z 36 pozycji 18 bitów) i porównywać ją przy kolejnych odczytach RAW, a jak się coś tam będzie zgadzać to po prostu wysłać zapisany we flasz ten sygnał RAW, który zaświeci lampę.
Taką mam luźną koncepcję, bo sam tego nigdy nie robiłem.
Nie wiem na ile się to uda, bo jak patrzę na liczby to w jednej sekcji wąskie są np. po 220, a w kolejnej zdarzają się wartości poniżej 150, te przy 300 to już lepiej wygląda, 368 - 300, te przy 2000 to już raczej spokojnie poniżej +/- 10%.
Czyli kursować się, pisać, testować, bo prawdopodobieństwo, że ktoś z tym urządzeniem w torbie miał potrzebę napisać w Arduino zapalanie światełka jest bardzo niskie, więc jak sam tego nie zrobisz, to sobie raczej nie poświecisz.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#12
Dobrze że ktoś odpisuje.........
Z tej strony
https://test.sui.li/oszi/
pobrałem inny sketh , służy do dodawania protokołów RCswitch ( durzo nierozumnie)
Ale po odczytaniu raw i wklejeniu tam wyszło  to o czym czytałem ptotokół MM
wyszło 18 bitów ale nie dokonca bo faktycznie jak opisujesz jest 9 bitów
ogólnie z datszeta doczytałem sie że na układzie pierwsze 5 mozna  kodowac trzy stanowo a pozostałe 4 dwu stanowo..
Udało sie napisać nadajnik przyda sie do alarmu, połąncze to z czujka ruchu i do statywu.
to mój własny kod nadajnika:
Kod:
//Emulator nadajnika M145026B1/MC145027
int code[]={1,1,2,0,2,0,0,0,0};//odczytanie stanów pinów od A1 do A9 z układu  M145026B1/MC145027 00=0(do minusa) ; 11=1(do plusa) ; 10=2 (nie podłąnczony)
                               //lub odczytac z nieobrobionych danych RAW
                               //Piny od a1 do A5 posiadaja trzy stany, a od A6 do A9 posiadaja dwa stany.
                               
int tx=6;                 //Pin wyjscia do nadajnika
const int pin_wyslij=2;             //Pin włąnczajacy sygnał
int wyslij=0; //

int dpik=1852;      //         dpik              kpik
int pdpik=296;      //       ........  ........  ...        ...
int kpik=244;       //       |      |  |      |  |  |       |  |
int pkpik=1904;     //       |      |  |      |  |  |       |  |      przerwa
int przerwa=13172;  //--------       ---      ---    .....---  .....---------------
                    //              pdpik             pkpik
                   
void setup() {

pinMode(tx, OUTPUT);
digitalWrite(tx, LOW);
pinMode(wyslij, INPUT);
}

void loop() {
wyslij = digitalRead(pin_wyslij);
if (wyslij == HIGH) {
sygnal();

}
}

void sygnal(void) {
for (int pik=0; pik<6; pik++)

for (int BIT=0; BIT<9; BIT++)
{
if (code[BIT]==0) {
  for (int i=0; i<2; i++)
  {  digitalWrite(tx, HIGH);
     delayMicroseconds(kpik);
    digitalWrite(tx, LOW);
     delayMicroseconds(pkpik);
     }
 
        }
 
if (code[BIT]==1) {
  for (int i=0; i<2; i++)
   { digitalWrite(tx, HIGH);
     delayMicroseconds(dpik);
     digitalWrite(tx, LOW);
     delayMicroseconds(pdpik);
      }
 
}
if (code[BIT]==2) {
     digitalWrite(tx, HIGH);
     delayMicroseconds(dpik);
     digitalWrite(tx, LOW);
     delayMicroseconds(pdpik);
     digitalWrite(tx, HIGH);
     delayMicroseconds(kpik);
    digitalWrite(tx, LOW);
     delayMicroseconds(pkpik);
}

}
delayMicroseconds(przerwa);

}
delay(2000);
}

Nadajnik napisałem tylko jak zrozumniec odbiornik..
Teraz nie wiem jak zrozumniec synchronizacje bo nie wiem czy łapać sie sygnału niskiego , czy wysokiego , czy zbocza .
za małe doświadczenie (prawie wcale)..
krótkie fragmenty kodu jakies przykłady łopatologicznie opisane by pomogły.
Ps nikomu nie karze pisac całego kodu . tylko o jaką pomoc, moga byc linki ..
 
Odpowiedź
#13
Z odbiornikiem mam taki problem ,ze skacze bez wysylania danych raz 0 raz 1 itp....
Zastanawia mnie czy jak bym zrobil tablice z czasami , to jak uwzglednic toleracje w czasach .
Tablica[]= czasy bla bla +-10 %
Czy tak sie da ....
 
Odpowiedź
#14
Podłączyłeś się teraz pod chip nadajnika?
Myślałem, że rozgryzłeś protokół tym szkicem, a na razie to wygląda na kolejny skaner. Wykres też wygląda na odwrócony względem tego co jest w PDF do chipa.
Jak Ci się uda zapisać to co odczytujesz jako protokół do RCSwitch, to jest tam opcja, że ustalasz w % tolerancje, najpierw powinieneś zrobić kilka odczytów, narysować wykresy, z nich spisać czasy do odpowiednich kolumn w excelu i wyznaczyć maksymalne odchylenia, tak by chociaż większość się łapała do prawidłowych, a protokół zdefiniować na wyciągniętej średniej.
Nie musisz też się bawić w arytmetykę trójkową, skoro każdą wartość trzybitową da się zapisać w systemie dwójkowym, a w Arduino są liczby 32 bitowe to ona bez stresu pomieści 18 bitów, rcswitch generuje sygnał trzybitowy z ciągu znaków char 0 1 i F,  Ty tu zapisujesz jako cyfry 0,1,2, co oczywiście ma więcej sensu.
Ale wygląda podobnie Big Grin
Decimal: 250304 (18Bit) Binary: 111101000111000000 Tri-State: 11F0F1000
int code[]={1,1,2,0,2,0,0,0,0} - tu 0 za 2 jest u mnie 1.
Protokoły są zapisane w pliku RCSwitch.cpp, tam gdzie jest taki ciąg:
Kod:
static const RCSwitch::Protocol PROGMEM proto[] = {
#endif
  { 350, {  1, 31 }, {  1,  3 }, {  3,  1 }, false },    // protocol 1
  { 650, {  1, 10 }, {  1,  2 }, {  2,  1 }, false },    // protocol 2
  { 100, { 30, 71 }, {  4, 11 }, {  9,  6 }, false },    // protocol 3
  { 380, {  1,  6 }, {  1,  3 }, {  3,  1 }, false },    // protocol 4
  { 500, {  6, 14 }, {  1,  2 }, {  2,  1 }, false },    // protocol 5
  { 450, { 23,  1 }, {  1,  2 }, {  2,  1 }, true },     // protocol 6 (HT6P20B)
...
};

i masz tu dopisać swoją linijkę na końcu przed };
Legenda:
{pulse najmniejsza jednostka us, syncbit{czas wysoki,czas niski},0 logiczne{czas niski, czas wysoki}, 1 logiczna {czas wysoki, czas niski}, odwrocenie logiki},
No i czytając, że znalazłeś generator to myślałem, że masz już taką linijkę.
Albo napisać swój program do odczytu, jeśli opcje dostępne w RCSwitch nie są wystarczające do określenia taką liczbą parametrów protokołu.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#15
Photo 
To tak znalazłem wersje rc_switch która rozpoznaje nie znane protokoły i sugeruje co dołożyć do linijki.

https://github.com/Martin-Laclaustra/rc-...r/examples

wada jest taka ze ucina 1 bit jest 17 zamiast 18 bitów (może ktoś to poprawi)

ale rozpoznaje sygnalizatory i nadaje jakiś numer.....

Więc zmontowałem lampę ,używając taniej z giełdy ..(wada 3 paluszki AA daje 4,5V, może da rade)

wygląda ona tak.

   

upchałem wszystko zaraz nad koszykiem baterii

   

   

Nie znam się , ale szkic przerobiłem tak.(teoretycznie działa ) robi to co chce.
Odbiornik
Kod:
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
////////////////////////
int ledPin = 9;    // Pin pasków led
int sensorPin = A0;//Potencjometr
long czas = 0;
long code1 = 127233;//odczytane kody syg
long code2 = 127256;
long code3 = 127238;
long code4 = 127328;
long codea = 127232;
/////////////////////////
void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  mySwitch.enableReceive(0);  // odbiornik pod pin 2
}
void loop() {
  czas = analogRead(sensorPin);
  //Serial.println(czas);
  if ((0 <= czas) && (0 >= czas)) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

  if ((mySwitch.getReceivedValue() == code1) || (mySwitch.getReceivedValue() == code2) || (mySwitch.getReceivedValue() == code3) || (mySwitch.getReceivedValue() == code4) || (mySwitch.getReceivedValue() == codea)) {
    Serial.println( mySwitch.getReceivedValue() );
    digitalWrite(ledPin, HIGH);
    delay(czas * 60 * 10);
    digitalWrite(ledPin, LOW);
    mySwitch.resetAvailable();
  }
}


i mam pytanie czy idzie poprawić  zasięg(czułość odbiornika) przez te bibliotekę
czy problemem jest 4,5v a nie 5v choć pod laptopem nie widzę różnicy a jest tam 5v.
Antena to drut ok.17 cm ten z arduino dolutowany gold pin i nałożony zaraz przy odbiorniku.
wczoraj się zagiął był na dole dziś umocowałem koniec u góry.
Przepraszam za bałagan ale może ktoś będzie chciał sobie tez zrobić poprawić projekcik.
czekam na jakies sensowne propozycje.
 
Odpowiedź
#16
By zwiększyć zasięg trzeba dobrać odpowiednio długość anteny i jej ułożenie względem nadajnika. Trzeba wziąć drucik nieco dłuższy niż wyliczony w kalkulatorze i docinać po 1mm, obserwować które cięcie nie poprawi zasięgu i przestać, albo zabawa od nowa z nowym drucikiem. 
Napięcie ma większe znaczenie dla nadajnika, gdzie dla modułu nadawczego może mieć nawet 12V, pewnie przez jakiś tranzystor trzeba to połączyć.
3 baterie AA (nowa 1.55V) to jednak za mało, startuje to z poziomu 4.8V i kończy się przy 3V, a to jest za mało dla modułu Arduino 16MHz, a 4 to za dużo. Lepiej użyć 4 aku AA (1.4V), które startują z poziomu 5.6V i kończą oddawać sensowny prąd przy 4V.
Jak masz czysty uC 328p  a tylko używany z Arduino i jest ustawiony na 8MHz to może być zasilany z 3V, ale jak się radio będzie zachowywać to nie wiem. W PDF uC jest wykresik, minimum Vcc to 1.8V dla 4MHz. Ważne by absolutnie nie przekroczyć 6V, bo to zabije uC, dla 4MHz można zasilić normalnie w zakresie 1.8-5.5V.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#17
O własnie jak ostawić na 4Mhz i co bo nie za bardzo rozumiem. Pamiętaj jestem wędkarzem.
przerobiłem blinka na tki generator 50 procent wypełnienia .oddalając nadajnik kreciłem chyba to filtr na odbiorniku.(patrząc na kreślarkę)
zeby jak najlepiej odwzorował ten sam sygnał.
uzyskałem większa odległość .
Nano na foto jak zmienić na te 4Mhz
i jak ograniczyć prąd wysysany przez nano z baterii.
wymyśliłem żeby wydłubać diody z nano ..i co się uda Smile
czytałem o usypianiu , ale chyba tu się nie sprawdzi
Pomyślałem sobie jeszcze o pwm akurat ten pin obsługuje.(ściemniać aż nie zobaczę zmianę oświetlenia.
jest tam wlutowany tranzystor bd139 i rezystor 1K) czy to by coś zaoszczędziło)

Ps po kręceniu tym zielonym filtrem zasięg zadowalający ,
została prądożerność nano

jeszcze myślę osunąć delaye w odbiorniku, żeby każdy pik dodawał długości świecenia i nie blokował procka.(bo sie doczytałem że tak jest)
Planuje zrobić alarm na czujnik pir i dołożyć pilocik do zapalania na stałe i gaszenia swiatła.
 
Odpowiedź
#18
Jak masz Nano to nic istotnie nie zaoszczędzisz, bo tam jest konwerter USB-UART i on sam pobiera 40mA, LEDy 5mA, a uC z 15mA. Czyli jak uśpisz uC (tak na amen to 150nA, w lekkim uśpieniu kilkaset uA), albo obniżysz mu taktowanie do 4MHz (będzie z 5mA bez uśpienia) to globalnie dla płytki Arduino zmieni się z 60 na 50, min 45mA. Zysk z obniżenia taktowania jest taki, że możesz go zasilać niższym napięciem i będzie działać, poniżej ustawionego progu płytka aktywuje zabezpieczenia, czyli NANO około 4.3V, żeby nie zaczęła robić różnych głupot przy zasilaniu spoza katalogowych parametrów, to po prostu się wyłącza, nazywa się to BOD. Jak masz ustawione 4MHz to BOD można ustawić na 1.8V.
W typowym Arduino nie ma wyboru ustawienia płytki na 4MHz czy zmienić nastawę BOD, trzeba zainstalować dodatek MINICORE, tam wybrać uC, który masz w NANO, zmienić parametry płytki, wewnętrzny zegar 4MHz, BOD 1.8, wypalić bootloader, skompilować na nowo program i przetestować czy działa prawidłowo.
Nic to nie zmienia dla odbiornika 433, on ma podane, że działa na 5V, a jakie od tego są dopuszczalne odchylenia to już sobie poszukaj w Google.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#19
Ale konwerter po zakończeniu testów mogę wylutować czy nie...
Teraz sprawdziłem to 200m jest a namiot dalej nie jest.
A ten minicore to do aplikacji arduino czy biblioteka ?
Sory za głupie pytania ...
https://majsterkowo.pl/forum/programowan...80-75.html
I czy o to chodzi?
 
Odpowiedź
#20
200m to górne zasięgi dla takich modułów WIFI, więc masz w okolicach zajebistości.
Wątek z majsterkowo jest o tym samym, w szczególności jak zaprogramować goły uC przez płytkę Arduino bez osobnego programatora - Arduino może być programatorem, wystarczy taki program do niego wgrać.
Minicore to zestaw płytek do ARduino, wpiszesz w Google to znajdziesz skąd pobrać i instrukcję instalacji.
W normalnych czasach Atmega328p to koszt 8zł, do tego płytka uniwersalna, dwa rezystory, trzy kondensatory, podłączasz pod baterię i działa. Tutorial własnego projektu znajdziesz na hasło "Atmega minimalne podłączenie" http://mikrokontrolery.blogspot.com/. Niestety dzisiaj Atmega328P to może być koszt 50zł + wysyłka.
Dużo łatwiej zlutować taki zestaw (nawet na pająka bez płytki) niż wylutować układ scalony SMD i ryzykować wyrwanie ścieżek z NANO. Nano to płytka do prototypowania, robisz, testujesz, wgrywasz, testujesz,poprawiasz, a ostatecznie robi się swój układ. Albo gdy zużycie prądu nie ma znaczenia, bateria wystarczy na wymagany czas to bierzesz NANO i nie dzielisz włosa na czworo, przy odbiorniku i tak nie będziesz usypiał. Dla nadajnika to zamiast działać 3h bez, to z usypianiem możesz czas działania zamienić na 3 lata. Masz pilot do auta czy o bramy to chyba wiesz ile działa bez wymiany malutkiej baterii pastylkowej.
Ale może nie potrzebujesz Atmega328, może wystarczy Atmega88 - 8kB Flash (ile zajmuje program) i 1kB RAM (ile zajmują zmienne), flasz może być na styk, RAM lepiej mieć z zapasem x2 wobec tego co pokazuje Arduino po kompilacji. Czasami takie tablice zmiennych, gdybyś wysyłał ten odczyt RAW, można zapisać do flash zwalniając RAM, a tylko w czasie wysyłania odczytywać do flash po 1 bajcie i od razu go "spieniężać" bez zajmowania RAM.
Bez instalacji dodatkowego core można wybrać płytkę Arduino NG, a w niej Atmega8, to chyba najtańszy uC do którego ten projekt może się zmieścić. Teoretycznie powinien wystarczyć Attiny85, ale po prostu biblioteka nie obsługuje tego uC.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 2 gości