Temperatūros matavimas

Matuosime generatoriaus temperatūrą. Daviklis bus termopora, įmontuota pačiame generatoriuje. Pabandysime analoginį termoporos signalą konvertuoti į skaitmeninį.

Kaip visada geras Kam to reikia? Ir atsakymas: paprastų sprendimų mes neieškom. O tiksliau: pritrūkom analoginių įėjimų Arduino modulyje. Teks naudoti skaitmeninius. Yra chipas MAX31856: Precision Thermocouple to Digital Converter
with Linearization. Tarsi jus turi viską ko reikia. Lemonoje galima jį užsakyti, kaina 9 €. Paieškokim dar. gal rasim kažką iš kompiuterinio laužo. Neblogas pamokymas yra puslapyje: http://garagelab.com/profiles/blogs/tutorial-show-the-temperature-of-the-enviornment-with-the-arduino su LM35 puslaidininkiniu temperatūriniu davikliu, kurio kaina 1,59€

 

PWM dažnio padidinimo funkcija:

void setPwmFrequency(int pin, int divisor) {
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
if(pin == 5 || pin == 6) {
TCCR0B = TCCR0B & 0b11111000 | mode;
} else {
TCCR1B = TCCR1B & 0b11111000 | mode;
}
} else if(pin == 3 || pin == 11) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x07; break;
default: return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}

Automatinis modemo prijungimas po atsijungimo

Užsikrovus Raspbian OS paleidžiamas autostartuojantis /etc/rc.local failas, kuriame įrašyta wvdial komanda.
Dingus ryšiui inicijuojamas modemo perkrovimas. Praktika parodė, kad pakanka modemo maitinimo išjungimo-įjungimo. Suprojektuokime 3G modemo įtampos padavimą per elektroninį raktą, valdomą GPIO7 išvadu. Schema atrodytų sekančiai:

Parašykim programėlę GPIO7 išvado valdymui: 3gonoff.

#include <iostream>
#include <stdio.h>
#include <sstream> // for std::stringstream
using namespace std;
#include <string.h>        //used by string
#include <wiringPi.h>
int main(int argc, char *argv[]) {
cout << "Raspbery GPIO 7 porto valdymas: on/off\n";
wiringPiSetup ();
pinMode (7, OUTPUT);
if (argc>1) {
std::stringstream convert(argv[1]);
int myint;
if (!(convert >> myint))
myint = 0;
if (myint==1) {
cout << "įjungiama\n";
digitalWrite(7, HIGH);
} else if (myint==0) {
cout << "išjungiamas\n";
digitalWrite(7, LOW);
} else {
cout << "argumentas turi būti 0 arba 1. Pvz: './3gonoff 0'\n";
}
} else {
cout << "argumentas turi būti 0 arba 1. Pvz: './3gonoff 0'\n";
}
return 0;
}

Kompiliavimo komanda: „g++ 3gonoff.c -o 3gonoff.o -lwiringPi”

Komandinė eilutė: „./3gonoff 1” – reiškia įjungimo komandą, „./3gonoff 0” reiškia išjungimo komandą.

Išsijungia gana lėtai: per 1-3 sek. Matosi kaip gęsta mėlynas 3g modemo indikatorius

Ši programa paruošta, bet dar nenaudojama. Tikiuosi kitų sprendimų, siekiant užtikrinti nenutrūkstamą Ineto darbą.

Dinaminio DNS registravimas

Bernt Cristian Egeland komentaras http://uavmatrix.com/viewpost/2/62/116/0/PX4-PixHawk/Setting-Up-Raspberry-Pi-A+-and-USB-3G-Modem%C2%A0

netinka, kadangi no-ip.com abonentas nemokamas tik pirmą mėnesį, be to nurodyta konfigūracija neveikia o google nurodo į nekorektišką inadtn client debian paketą. Taigi inadyn pakeyas išinstaliuojamas. apt-get remove inadyn.
Next we will install DynDns software which allows us to use a dynamic name to connect our laptop to RPI when using cellular network.
This is not required if your cell operator gives you static ip adress, but normally they dont.
So instead of finding your cell IP adress every time, we use Dynamic andress of your choice.

There are many DynDns vendors, pick one.  Im using No-ip.
Create a account and a Host name.

Lets say for this tutorial your host (dns) are myairplane.no-ip.info
Install Inadyn software into RPI which will sync your IP against your dns.
Type this syntax

 

aptget install inadyn

 

Then we need to change the config to match our account at No-Ip

/etc/inadyn.conf

If the file above do not exists, it will create one.

paste in the bellow lines and change your username and password to your needs. (same credentials to log on No-Ip site)
Type your DynDns adress as alias. ( for this tutorial we use myairplane.no-ip.info .
ina
If you are using dndns.org dont change the dyndns_system. If you e.g using no-ip.info, change the
dyndns_system to default@no-ip.com

username USERNAME

password PASSWORD

alias

dyndns_system dyndns@dyndns.org

background

update_period_sec 60

Then we need to add this to startup script, so we dont need to start inadyn manually.

Type this syntax, just before the exit 0.

vi /etc/rc.local

  1. add this line
  1. /usr/sbin/inadyn &

Reboot Rpi.

 

Vietoj dinaminio DNS naudosime kolegos Goga sukurtą skriptą, kurio funkcija periodiškai (kas 5min.) į VJserver DB įrašys IP adresą, kurį turi jėgainės kontroleris. Kodėl to reikia? ogi jėgainės kontroleris per USB 3G modemą gauna inetą su kintamu IP adresu. Skriptas užrašytas faile /etc/host2mysql faile. Jo esmė yra ifconfig komanda nuskaityti valdiklio IP adresą ir jį kartu su host identifikatoriumi, kuris šiuo atveju yra ‘vejas001’  įrašyti į nutolusią (šiuo atveju ‘defas.lt’) DB (šiuo atveju ‘VJserver’). Jo turinys:
#!/bin/bash
sudo ifconfig ppp0 |grep „inet” | awk -F „:” ‘{print $2}’| awk ‘{print „insert into hosts(host,IP) values(\x27vejas001\x27,\x27” $1 „\x27)” }’ |mysql -h defas.lt -uvejas -p********* VJserver

Periodiškai paleidinėsime šį skriptą, tad įrašome eilutę į CRONTAB’ą.

komanda crontab -e:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /etc/host2mysql >/dev/log/crontab.log 2>&1

Čia nurodytą skriptą paleidžiame kas 5 min.

VJserver DB lentelės hosts struktūra (nutolusiame serveryje):

DROP TABLE IF EXISTS `VJserver`.`hosts`;
CREATE TABLE  `VJserver`.`hosts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`host` varchar(45) NOT NULL,
`IP` varchar(15) NOT NULL,
`ModDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=latin1;

 

USB GSM modemo instaliavimas

Tikslas – turėti internetą laukuose.
pirmą kartą įjungus USB GSM modemą š USB portą ‘lsusb’ komanda grąžina:
root@raspberrypi:~# lsusb

Bus 001 Device 006: ID 12d1:14fe Huawei Technologies Co., Ltd.

po vieno perinstaliavimo radau tokią reikšmę:

Bus 001 Device 006: ID 12d1:1c05 Huawei Technologies Co., Ltd. E173s 3G broadband stick (modem on)

Čia įrenginio id 12d1:14fe atpažįstama kaip diskinis kaupiklis. Pervesime į modemo režimą:
Įjungus įrenginį, matome, kad sistema detektuoja:

root@raspberrypi:/home/pi# lsusb

Bus 001 Device 006: ID 046d:c06c Logitech, Inc. Optical Mouse

Bus 001 Device 005: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard

Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter

Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. LAN9500 Ethernet 10/100 Adapter / SMSC9512/9514 Hub

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Kaip Huawei modemą.

ifconfig išveda naują tinklo sąsają:

wwan0     Link encap:Ethernet HWaddr 58:2c:80:13:92:63

inet addr:169.254.169.80 Bcast:169.254.255.255 Mask:255.255.0.0

inet6 addr: fe80::3d2:b0ae:25df:f0c5/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:69 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:0 (0.0 B) TX bytes:13408 (13.0 KiB)

Ši sąsaja atsiranda po minkšto perkrovimo komanda ‘reboot’.

sujungimas įvyksta komanda ‘wvdial 3gconnect &’. Čia naudojamas konfigūracinis failas: /etc/wvdial.conf:

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2
Modem Type = Analog Modem
Baud = 9600
New PPPD = yes
Modem = /dev/ttyUSB0
ISDN = 0

[Dialer 3gconnect]
Init1 = ATZ
Init2 = AT+CPIN=0203
Init3 = AT+CGDCONT=1,”IP”,”Tele2″
;Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
;Init3 = AT+CGDCONT=1,”IP”,”internet”
Stupid Mode = 1
Modem Type = Analog Modem
ISDN = 0
Phone = *99#
Modem = /dev/gsmmodem
Username = { }
Password = { }
Baud = 460800

Gateway pakeitimas į USB stick:
route del default
route add default dev ppp0

Kaip ir veikia, tačiau po 20-30 ping operacijų modemas atsijungia ir sistema pakimba.
testuojam. Visų pirma modemą. Jame yra Omnitel Windows OS programinė įranga. Suinstaliuojam į NB, paleidžiam ping – viskas veikia. Bandau suinstaliuoti 3g modemą į kitą kompą, tik šį kartą su LINUX OS. Įdomu, kad pirmą kartą įdėjus modemą jį detektavo kaip 12D1:14xx. po perkrovimo to neberadau, liko 12d1:1506 – modemo režimas. Vadinasi nebereikia modeswitch programos?

Taip, nebereikia. Pakanka „wvdial 3gconnect &” komandinės eilutės. O pingas sustodavo dėl USB įrenginio atsijungimo dėl nepakankamo USB maitinimo. Pajungus atskirais 4 laidais USB įrenginį, kuriam maitinimas paduodamas iš maitinimo šaltinio gautas 18 val ištisas ping’avimas 18 val. bėgyje. Viso supinginta 57000 paketų. Šią komandą įdedu į /etc/rc.local failą su „sleep 100” su 100 sekundžių delsa.
Visgi dėl atsitiktinio modemo atsijungimo sukurkime crontab komandą, kuri kas 15min. pabandys atnaujinti ryšį. Jeigu 3g ryšys bus veikiantis, tai tiesiog gausime pranešimą, kad USBmodemas yra užimtas. Taigi komanda

crontab -e

įterpkime eilutę:

15 0 * * * /etc/host2mysql >>/var/log/crontab.log

kuri suveikia kas 15 min..

* * * * * komanda vykdymui
| | | | +—– savaitės diena (0 – 6) (Sekmadienis=0)
| | | +——- mėnuo (1 – 12)
| | +——— mėnesio diena (1 – 31)
| +———– valanda (0 – 23)
+————- minutė (0 – 59)
* reiškia bet kurį
Crontabo darbo logą įrašysime į failą:

Gar vienas pastebėjimas: po maždaug 8 val. darbo, modemas tarsi atsijungia: lsusb mato modemą, ls /dev/gsmmodem irgi yra. Crontab.log faile įdomybės: gaunama klaida inicializuojant SIM kortelę: Sending AT+CPIN=xxxx (čia xxxx PIN’as) gaunama klaida +CME ERROR: 3 / Bad Init String.Ši klaida reiškia ‘Operation not allowed’. Klaidos pavyko išvengti /etc/wvdial.conf faile užkomentavus Init1 eilutę ir PIN operaciją iškėlus į atskirą sekciją (TY: pschyska):

[Dialer pin]
Init3 = AT+CMEE=1
Init4 = AT+CPIN=xxxx

[Dialer checkpin]
Init3 = AT+CPIN?