Vėjo jėgainės valdiklio atskira realizacija, koreguojanti vėjo kryptį nuo generatoriaus apsisukimų.
Schema: Ziogas_schema, plokštė
Ziogas_plokste.
Rpi suinstaliuotas OS, panašiai, kaip ir VJV (vėjo jėgainės valdiklio. user’is pi/vejojegaines, root be slaptažodžio). Šis Rpi turi WLAN, nenaudosime GSM ryšio. Tačiau paimsime duomenis iš Arduino, kaip ir VJV atveju. Taigi,
ruošiame kompiliavimui tokį pat failą, kaip ir VJV Rpi. Perkopijuojame iš VJV failą test2.c ir naudojame komandinę eilutę:
gcc -o test2.o -L/usr/lib/test1 -lmysqlclient -I/usr/local/include -L/usr/local/lib -lwiringPi test2.c
Po kurio laiko test2.c failas stipriai modifikuotas buvo pervadintas į failą ziogas.c ir kompiliuojamas jau jis, gaunant vykdomąjį failą ziogas.o. Gaunu pranešimą mysql.h – no such file. Instaliuojame mysql:
apt-get install mysql-server mysql-client
Pridedam ir:
apt-get install libmysqlclient-dev
Nepanikuojam, jei gaunam pranešimą libmysqlclient-dev is missing or absolete. Pasirodo paketo vardas pasikeitė. Dabar reikia naudoti:
apt-get install default-libmysqlclient-dev
Paruošiame darbui su SSH. Pagal nutylėjmą neveikia. Raspi-config čia tinkama. Kažkas buvo susimaišęs su sertifikatų failais – nepavykdavo prisijungti. Pagalba iš googles:
pi@raspberrypi ~ $ sudo rm -f /etc/ssh/ssh_host* pi@raspberrypi ~ $ sudo dpkg-reconfigure openssh-server
Neveikia:
spi: nebuvo kontakto plokštėje MOSI signalas nenukeliaudavo iji Rpi. Dabar nėra CLK signalo, arba nepamatuojamas oscilu. proftpd: suinstaliuojame komanda
apt-get install pro-ftpd
Pajungus išorinį +12V maitinimą impulsai D12 pin’e sumažėja iki 1V. Nuo USB maitinimo – normalūs
Arduino Nano modulio, naudojamo čia išvadai:
nano
Nano vaizdas iš viršaus:
ir iš apačios
Panašu SPI neveikia su Arduino. Pagooglinau ir radau tokį atsakymą:Arduino Nano is based on the ATmega168/328 chip, which does support SPI in hardware. Ką darom? bandom paimti duomenis per USB. Pajungus USB laidą Rpi-Arduino su komanda lsusb randame įrenginį
Bus 001 Device 004: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
. Usman rašo: I was wondering if I can find any helpful materials or tutorials on how to read data and transfer data from one device to another Raspberry PI device using USB ports. In short it would be reading data through USB. – keista, pasirodo nėra sunku.
Pabandysime perduoti duomenis iš Arduino per USB nuoseklų portą realizuotą USB adapterio būdu. Pasitikrinam, kaip atrodo Arduino prijungtas prie Rpi per USB sąsają. Pažiūriu užkrovimo informacinį failą užklausdamas:
dmesg |grep tty
ir gaunu atsakymą:
[ 5.785336] usb 1-1.2: ch341-uart converter now attached to ttyUSB0
Sukursime DB lentelę, į kurią periodiškai įrašinėsime duomenis iš nuoseklaus porto. DB pavadinimas ziogas, lentelės pavadinimas Duomenys ir slaptažodis – ziogas. Lentelės laukai:
id – identifikatorius
VK – vejo kryptis AD keitiklio reikšmė. integer 0…1023. A7 Arduino įvadas
GD1 – generatoriaus dažnis realizuotas per optroną. integer – 4 baitai. D2 Arduino įvadas
GD2 – generatoriaus dažnis realiz. per komparatorių. integer – 4 baitai. D3 Arduino įvadas
KP – korekcija potenciometru – kiek nusukti vėjo krypties daviklio reikšmę. A0 Arduino įvadas
K0 – vėjo krypties daviklio kalibravimas. integer 0…1023. A1 Arduino įvadas
GD2 – generatoriaus analoginė reikšmė realiz. per operacinį stiprinuvą. integer – 4 baitai. A5 Arduino įvadas
TS – milis() funkcija iš Arduino, rodanti paketo laiką. Integer tipas.
Data – duomenų fiksavimo data ir laikas. Duomenų tipas timestamp su CURRENT_TIMESTAMP numatytąja reikšme
Sukuriamas mysql root slaptažodis ‘ziogas’.
/usr/bin/mysqladmin -u root password 'ziogas'
Sukuriama duomenų bazė ir suteikiama useriui ziogas priejimas prie jos:
MariaDB [(none)]> create database ziogas; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> grant all on ziogas.* to ziogas identified by 'ziogas';
Ir vėl pasikeitimai: failas /etc/mysql/my.cnf dabar linkintas o leisti išorinį prisijungimą galima užkomentuojant eilutę faile /etc/mysql/mariadb.conf.d: #bind-address=127.0.0.1
Tolimesnės užduotys:
DB struktūra:
DROP TABLE IF EXISTS `ziogas`.`Duomenys`; CREATE TABLE `ziogas`.`Duomenys` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'identifikatorius', `VK` int(10) unsigned NOT NULL COMMENT 'vejo kryptis AD keitiklio reikšmė. integer 0...1023. A7 Arduino įvadas', `GD1` int(10) unsigned NOT NULL COMMENT 'generatoriaus dažnis realizuotas per optroną.', `GD2` int(10) unsigned NOT NULL COMMENT 'generatoriaus dažnis realiz. per komparatorių.', `KP` int(10) unsigned NOT NULL COMMENT 'korekcija potenciometru - kiek nusukti vėjo krypties daviklio reikšm', `K0` int(10) unsigned NOT NULL COMMENT 'vėjo krypties daviklio kalibravimas', `GV` int(10) unsigned NOT NULL COMMENT 'Analogine generatoriaus itampa', `TS` int(10) unsigned NOT NULL COMMENT 'data ir laikas, duomenų fiksavime', `Date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data ir laikas mysql irase', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=77096 DEFAULT CHARSET=utf8mb4;
C+ failas ziogas.c. Padaryti vykdomuoju.
Pasiaiškinti, kodėl programa lūžta atjungus USB sąsają.
Arduino kodas ziogas projekte:
Pavyko perduoti duomenis per USB sąsają. Perdavimo greitis: 2ms/paketas.
Kaista transformatorius. Kodėl?
Kaista 7805 stabilizatorius. Kiek srovės naudoja visa sistema?
Patikrinti, ar veikia Apache. Ne. Suinstaliuojam pagal nuorodą: http://vejas.defas.lt/?p=39.
Perkelti duomenų nuskaitymo php failą. vgreitis.php.index.php
Problema: kaista maitinimo stabilizatorius IC U1 L7805, maitinanti Rpi. Pakeista iškirptu NB plokštės fragmentu, žr. foto nuotrauką.
.
Mėlynas laidas +12V, Geltonas GND, oranžinis +5V. Valdymo IC TPS51020. Enable – 20kOm varža sujungta EN (9pin TPS51029) ir VIN (24pin TPS51020).
Išjungti RPI mygtuko paspaudimu. Radau nuorodą: shutdown-restart. Instaliavimas:
sudo apt install python3-gpiozero sudo mkdir -p /usr/local/bin chmod +x shutdown_button.py sudo cp shutdown_button.py /usr/local/bin sudo cp shutdown_button.service /etc/systemd/system sudo systemctl enable shutdown_button.service sudo systemctl start shutdown_button.service
jei reikia atsisiųsti kodą: nuoroda: scruss/shutdown_button.
Mygtukas jungiamas tarp GPIO 27 ir GND kontaktų. Jeigu Rpi turi 40 kontaktų GPIO kontaktų grupę, naudojama septinta skaičiuojant nuo kairės kontaktų pora, kaip parodyta paveikslėlyje.
Naudojimas:
Rpi perkraunamas, jei mygtukas laikomas paspaustas daugiau, nei dvi sekundės, bet mažiau nei penkios sekundės. Rpi išjungiamas palaikius nuspaustą mygtuką ilgiau, nei penkios sekundės. Laikų nustatymai, kaip ir mygtuko kontakto numerio parinkimas gali būti pakeisti python shutdown_python.py faile.
Perkelti registracijos failą. Failas /etc/host2mysql. Jį pakoreguoju, išmesdamas eilutes susijusias su 3G modemo inicializacija, palieku tik paskutinę eilutę ir HOST vardą keičiu į ziogas. Jo turinys atrodo taip:
echo "--------------------------" sudo ifconfig wlan0 |grep "inet " |awk -F ":" '{print $1}'| awk '{print "insert into hostai (host,IP) values(\x27ziogas\x27,\x27" $2 "\x27)" }' |mysql -hdefas.lt -uvejas -p******** VJserver
dar įrašau į crontab’ą eilutę, kad kas penkiolika minučių sistema padarytų įrašą defas.lt serveryje komanda crontab -e:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /etc/host2mysql >>/var/log/crontab.log
Aplikacijos ziogas.o automatinis paleidimas.
Įrašomos dvi paleidimo eilutės /etc.rc.local faile. sleep komandą rašau pagal pirmą VJV projektą – nespėdavo pasileisti mySQL’as. Ten būdavo sleep 100. Čia užteko reikšmės 30, kas reiškia 30 sekundžių uždelsimą, prieš programos startą, po OS sistemos užsikrovimo.
sleep 30 sudo /home/pi/ziogas.o &
Rpi programos kodas:ziogas.c
Parašyti finalinį koregavimo algoritmą.
Pradžiai pavaizduosiu vėjo krypties priklausomybę nuo vėjo greičio esant koregavimui. Koregavimas realizuotas Arduino programos algoritmu:
int VKKoregavimas(int VK, int VG) { signed int KOR; unsigned long x, A; unsigned int a; float y,z, P, R, PX,KPOT, XA,XC, XV, Y, B; if (VGUS<VGUSmin) { KOR=VGUS*(VKmax-VKmin)/4/VGUSmin/(1+((512-POT)/512)); P=VGUS; R=VGUSmin-VGUS; KORmax=(VKmax-VKmin)/4; KPOT=VGUSmin; PX=512-POT; PX=PX/512; KPOT=KPOT*PX; B=VGUSmin-VGUS+KPOT; if (B<0) {B=0;} Y=VGUSmin+KPOT; XA=B; XC=Y; y=B/Y; KOR=y*KORmax; if (VK>Puse) return VK-KOR; else return VK+KOR; } else return VK; }
Ši funkcija turi du argumentus: vėjo kryptį VK ir generatoriaus greitį VG, o grąžina koreguotą vėjo kryptį VKO. Arduino programoje algoritmas realizuotas paprastais aritmetiniais veiksmais, nes surašius į ilgą formulę, rezultatas būna nenuspėjamas. Galbūt reikėtų visus argumentus paversti į FLOAT tipo, pabandysiu vėliau.
Algoritmo principas parodytas paveiksle:
Algoritmas:
Procedūra:
int VKKoregavimas(int VK, int GG) { int KOR; float y, PX,KPOT, XV, Y, B; if (GGUS<GGUSmin) { //KOR=GGUS*(VKmax-VKmin)/4/GGUSmin/(1+((512-POT)/512)); KORmax=(VKmax-VKmin)/4; KPOT=GGUSmin; PX=512-POT; PX=PX/512; KPOT=KPOT*PX; B=GGUSmin-GGUS+KPOT; if (B<0) {B=0;} Y=GGUSmin+KPOT; y=B/Y; KOR=y*KORmax; if (VK>Puse) return VK-KOR; else return VK+KOR; } else return VK; }
Nulinti GGUS skaitliuką, jei nėra pertraukimo (timeout funkcija) Arduino modulyje.
Įvedu tikrinimą pagrindinėje programoje: jei generatoriaus periodo laikas didesnis nei trigubas, tarkime, kad generatorius stovi ir GGUS kintamąjam priskirkim maksimaliai didelę reikšmę.
if ((micros()-GGUS_prev)>2*GGUS) {GGUS=-1;}
TODO:
Atskirti valdymo svetainėje (php) atskiras jėgaines pagal HOST vardą.
Padaryti atsarginę Rpi OS kopiją.
Įdėti funkciją truncate Duomenys ir duomenų perkopijavimą.
Apvali vejo krypties diagrama. Dalinai atlikta. chart.js tipas doughnut.
Pakeisti DB, kad rodytų išduodamą koreguotą vėjo kryptį
Pataisyti vėjo krypties daviklį: yra ‘mirtina’ zona, kur nesikeičia įtampa, keičiant kryptį.
Dėžė – konstrukcija, sugalvoti. Nepamiršti išvesti matavimo taškų
JS grafike po ‘DB klaida’ pranešimo stabdyti arba automatiškai paleisti duomenų perdavimą, gerai būtų mirksintis rutuliukas, skirtingų salvų – dirba ar nedirba
Jei lūžta programa, ją reikia iš naujo pakelti. Gal čia Goga padės?
Resetinti MySQL duomenis, kas kiek laiko.
Pasiruošimas deryboms. Argumentai: GSM ryšys – mėnesinis mokestis, aptarnavimas – naujos savybės, aprašymas (laikmena, ar popierius)
Pirmasis bandymas lauke pareikalavo prisijungimo prie kito WLAN. Pašarinau savo mob. tel. su SSID AndriodAP_art, psw: aaaaaaaaaa. WLAN tinklai konfigūruojami /etc/wpa_supplicant/wpa_supplicant.conf
faile. Daugiau info: https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md
paleisti naujai wlan0: ifconfig wlan0 down ir atitinkamai up.
perkonfigūruoti komanda: wpa_cli -i wlan0 reconfigure
Tarp kitko eth0 interfeiso adresas 192.168.2.177 (192.168.2.57 – wlan0 ir tai darbe). Bet jėgainė į uzsakymų programą neprisiduoda. Užkomentinam dhcpd.conf faile wlan fiksuotus adresus. ir pašalinam eth0 kaip gataway: route del default eth0.
Dar pastebėjimas – bloga data – nesuinstaliuotas ntpdate paketas. Kalam: apt-get install ntpdate. Jei gavom klaidą: 404 Not Found [IP: 93.93.128.193 80], paleidžiam apt-get update komandą.