Raspbery ir Arduino sujungimas naudojant SPI sąsają

Sujungus Arduino RS232 nuosekliu portu maksimalus duomenų perdavimo greitis pasiektas 912600 bod. Arduino analoginių portų nuskaitymo greitis pasiektas ~100 reikšmių viename testiniame 50 Hz signalo periode (sinusoidėje). Signalo perdavimas vyko tekstiniu formatu. Vienos sinusoidės duomenų paketas siekė 100 x 3+1=400 baitų.

Čia:

100 yra reikšmių skaičius,

3 – formatas – perduodamos vienos reikšmės dydis nuo 0 iki 1023, dažniausia būna triženklis (pvz. 568), taigi sudaro tris skaitmenis- ,

1 – atskirtus kableliu: ‘,’ kas padidina duomenų srautą dar vienu baitu.

Taigi reikalingas duomenų srautas yra 400 x 6 = 2400 baitų per 20ms (vieno 50Hz testinio signalo periodas), arba 120 kilobaitų/sek arba 0,96 megabitų/sek (1 baitas=8 bitai)
Tai įmanom ir naudojant RS232 porto maksimalų greitį. Tačiau darant prielaidas, kad matuojamo signalo dažnis bus kintamas  nuo 0 iki ~400Hz ir matavimo taškų pageidautina turėti daugiau – tarkim 256 per periodą, RS232 sąsaja gali būti per lėta.

Kitas sprendimas perduoti informaciją per SPI sąsają. Arduino techninė informacija https://www.arduino.cc/en/Reference/SPI nurodo: If you are using a chip rated at 15 MHz, use 15000000, t.y galima tikėtis 15Mb/sek duomenų perdavimo srauto, kas būtų 15 kartų daugiau, nei RS232 maksimalus greitis.

Telieka pasidaryti SPI sujungimo kabelį ir pabandyti.

Arduino (Leonardo versija) pusėje SPI 6 išvadų kontaktai turi sekantį išdėstymą:

icspheader

Raspberry (Pi versija) GPIO jungtis, kurioje yra ir SPI išvadai atrodo sekančiai:gpio-led

Signalo lygiai nevienodi. Arduino turi 5V lygius, Raspberry – 3,3V. Čia reikalingas lygių keitiklis. Diskusijoje: http://forum.arduino.cc/index.php?topic=139716.0 rekomenduojamas kaip geriausias sprendimas naudoti TXB0104 mikroschemą. Čia pat dalyvis fungus pataria naudoti varžų daliklį. Tokį jau naudojome SD kortelės prijungimui prie Arduino. Schema paprasta: http://robotics.hobbizine.com/raspiduino.html.

Suinstaliavus Raspberry OS SPI sąsaja būna uždrausta. Ją įgalinti galima pakeitus /boot/config.txt failą. Nuimkite komentarą eilutei: dtparam=spi=on.

Arduino sujungimas su Raspbery

Po kurio laiko pasijungus Raspberry nekorektiškai užsikrauna sistema – pajungus per HDMI kabelį prie monitoriaus matosi komandinės eilutės tekstas su bėgančiu tekstu, kuriame galima įskaityti informaciją, kad nekurie failai prarasti. pavyksta prisijungti ‘putty’ pagalba adresu 192.168.2.177 (root logino nepriima, tenka logintis pi::raspberry). Kaip patikrinti SD kortelę, kurioje yra sistema? Pagalba guglėje (ty

Frepa

————————————————————————————————

/dev/mmcblk0p2 is the root file system, so it is not easily unmounted. It could probably be re-mounted as read-only, but a simpler way is to schedule a fsck at the next reboot.

sudo touch /forcefsck

then reboot. Or reboot with

shutdown -rF now

which does the same. (from http://superuser.com/questions/401217/how-to-check-root-partition-with-fsck)

Another option of course is to do the fsck on another linux computer with a card reader.

——————————————————————————————————-

Kita bėda – nekokia HDMI sujungimo ekrano rezoliucija. Norėtųsi nustatyti pageidaujamą. Čia reikia koreguoti /boot/config.txt failą sekančiai:

atkomentuojame šio failo sekančias eilutes ir įrašome norimas skiriamosios gebos reikšmes, pvz. 1280 x 1024, kas atitinka 17″ ir 19″ ‘native resolution’.

framebuffer_width=1280

framebuffer_height=1024

Dabar atėjo eilė prakalbinti Arduiną pajungtą prie Raspberry per USB jungtį. Užklausus Raspberry per komandinę eilutę ‘lsusb’, gauname atsakymą:

————————————————————————————————-

Bus 001 Device 007: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory
Bus 001 Device 006: ID 046d:c06c Logitech, Inc. Optical Mouse
Bus 001 Device 005: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 004: ID 2341:8036 Arduino SA Leonardo (CDC ACM, HID)
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

————————————————————————————————-
čia Arduino SA Leonardo yra mūsų įrenginys.

Pasinaudosime pavyzdžiu iš guglės:

——-

Run Python 2 on Raspberry Pi. You will find this from the menu under Programming, you should use Python 2 not 3.

Type the following after >>>

import serial
ser = serial.Serial('/dev/ttyACM0', 9600)

The first argument – /dev/ttyACM0 is the name for the USB interface used. To find out the port name, we need to run this command in terminal without Arduino plugged in:

ls /dev/tty*

Now plug in your Arduio and run the command again. If a new name appears, then this is the name of your port.

The second argument – 9600 is the baud rate and should match with what you set in the Arduino program.

Now lets start a loop listening for messages from the Arduino.

while 1 :
    ser.readline()

You will need two hit enter twice after you type the second line. Messages ‘Hi’ should now start to appear every 2 seconds. You can press Ctrl + C to stop (interrupt) the Python program.

———————–

Mano atveju Arduino išveda į nuoseklų portą Analoginio porto reikšmę (0-1023). Arduino programa paprasta:

void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  Serial.println(„Programos startas „);
}

void loop() {
  int x;
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  x=analogRead(A5);
  Serial.println(x);
}
Sekantis žingsnis iš Raspbery perduoti informaciją į Arduino. Tame pačiame ineto puslapyje: https://oscarliang.com/connect-raspberry-pi-and-arduino-usb-cable/

 

Įtampos matavimo adapteris

Užduotis: sukonstruoti galvaniškai izoliuotą matuoklį, matuojantį 0-1000V diapazono įtampą, su 0,1V paklaida. Tikslumas gaunasi 10000 padalų. 16 bitų keitiklis turės 2^16=65536 padalų. Srovės matavimo riba turėtų siekti 50A.

Primesta schema:

Panaudosime srovės matavimo elementą:

T60404-N4644-X400

4644-X400_en-240845 paimtą iš inverterių schemotechnikos, galintis matuoti iki 31A (pagal techninnes specifikacijas palaiko OverCurrent iki 92A). Mažiausia matavimo srovė yra 3A. Gal pavyks išmatuoti ir mažesnę srovę. Matysim po operacinių stiprintuvų koregavimo grįžtamu ryšiu.

operaciniai stiprintuvai dirba neinvertuojančio stiprintuvo režimu:

NeinvertOpStipr

 

įtampos stiprinimo koeficientas skaičiuojamas pagal formulę

Uis=Uin*(R1+R2)/R1

Trys srovės ir trys įtampos matavimo taškai pajungti prie Atmel procesoriaus analoginių įėjimų. Atmel procesoriaus ADC 10 bitų matavimo ribos 0…5V ir čia sutelpa 1024 matavimų. Matavimo paklaida gausis 0,1% arba -+10V (jeii matuosime minusinę įtampą tai 0,2% arba 20V ?!). Problema perslinkti operacinio stiprintuvo išėjimo įtampą nuo -2.5V..+2.5V iki 0-5V. Čia bus reikalingas techninis sprendimas.

Pabandysime primesti maitinimo bloką šiai schemai. Procesoriui reikės +5V įtampos, na o štai operaciniams stiprintuvams reikėtų +15V ir -15V įtampos. Įsivaizduokime, kad turime +12 V akumuliatorių, kaip maitinimo bloką,  iš kurio formuosime reikiamas įtampas. +5V pagaminsime per 7805 stabilizavimo elementą, o minusinei įtampai jau reikia keitiklio. Nesinori velti čia impulsinio maitinimo bloko, tačiau to neišvengsime, nes dar bus reikalinga akumuliatoriaus krovimo schema.

 

Programos adaptavimas iš Android į Raspbery, 2 dalis

Įdomu. Kiek maksimaliai įrašų įrašytų Raspbery į MySQL’ą?

1000 įrašų įrašė per 14 sekundžių.

Taigi tęsiame:

Klaida kompiliuojant test.c failą:

#gcc-o test.o test.c -L /usr/local/mysql/lib 'mysql_config-cflags-libs'

klaida: mysql_config-cflags-libs: command not found

įdiegiame modulį:  apt-get install php5-mysql

Klaida ta pati. Gal būt kompiliavimo eilutėje klaida? Pakoreguojame kopiliavimo raktą sekančiai (pagal google rastą dmoore patarimą: http://forums.codeblocks.org/index.php?topic=9236.0)

#gcc-o test.o test.c -L /usr/local/mysql/lib 'mysql_config --cflags --libs'

tekstinio failo ištrauka:

sprintf(qstr2, „%i”, exit1);//į qstr2 string tipo kintamąjį įrašo exit1 int tipo reikšmę
qstr3[0]=’\0′;//nulina string tipo kintamojo reikšmę
strcpy(qstr3, qstr1);//prie qstr3 kintamojo prideda qstr1 kintamąjį
strcat(qstr3, qstr2);
strcat(qstr3, „,1,1,1,1,1)”);
//printf(„%s”,qstr3);//išveda qstr3 kintamojo reikšmę į ekraną
//printf(„\n”);//išveda naują eilutę į ektaną
res = mysql_perform_query(conn, qstr3);//įvykdo qstr3 string kintamąjame esančią eilutę mysql serveryje
mysql_free_result(res);//atlaisvina res buferį  – mysql serverio rezultatą

Kaip ir veikia. Išsiaiškinkim, kiek įrašų galėsime įrašyti į 1GB SDcard kortelę.

Paleidžiam programą su 100000 exit1 kintamojo reikšme:startavo 14:31, baigė 14:54 laisvos vietos SD kortelėje yra 3,6GBbackup failas užima 6MB, įrašų skaičius 100000. Jei MySQL engine tipas yra InoDB, tai vieta jau turi būti rezervuota. Reikia ieškoti, kiek yra laisvos vietos MySQL serveryje.

Taigi, darom pertrauką, dabar konstruosime įtampos matavimo adapterį.

Programos adaptavimas iš Android į Raspbery

Manau čia bus ką veikti. Teks papildomai suinstaliuoti gcc bibliotekas ir MySQL dev paketą. Vienas iš skirtumų – duomenų neberašysime į kortelę, o rašysime į MySQL DB. Taigi. Patogumo dėlei suinstaliuotas mc (midnight commander) leidžia jungtis per ftp. Kopijuoju seną studentui rašytą programą finger.c ir emIII programą, kuri dirbo su Android.

Pradžiai ‘riešutėlis’ – komandinė eilutė ‘gcc test.c test.o’ užsispiria – rašo no such file, galvoju gal nebus C kompiliatoriaus, tačiau klaida kur kas žemiškesnė: komandinėje eilutėje nurodomas rezultato failas turi būti lydimas ‘-o’ rakto. Tenka žiūrėti ankstesnį savo pasidarytą instrukciją, kaip paruošti Raspberry.

Pirma kompiliacijos pastebėjimas #include komanda tokia pat, Android ir Raspberry. Juk čia ta pati C. Komentuoju visus includus, žiūrėsim, kai kokių nors reiks, suksimės. Dar iškyla klausimas? Kaip Raspberry atsimena laiką? Sinchronizuojasi, kai atsiranda inetas? turi savo RTC chipą? ar yra RTC baterija Raspberyje? Atsakymų paieškosime vėliau.

Kompiliavimo eilutė ‘gcc test.c -o test.o’. Rašo, kad trūksta failo mysql.h. Aha, pridedame papildomą modulį:

apt-get install libmysqlclient-dev

Dar viena klaida:

fatal error: pigpio.h: No such file or directory
 #include 

The gpio utilitė yra wiringPi bibliotekoje. Ją instaliuojame sekančiai:

sudo apt-get install wiringpi

Tačiau tai nepadeda išvengti klaidos. išmetu -lpigpio kompiliavimo raktą ir deklaravimo eilutę „#include pigpio.h” ir pradinio teksto. matomai tai pytono biblioteka ir ji dabar nereikalinga.

Dabar trūksta mysql_init reference. Tikriausia reikia paruošti MySQL DB ir lenteles. DB pavadinkime ‘vejojegaines’. Ideologija tokia: nenaudokime didžiųjų raidžių lentelių ir laukų pavadinimuose. Priėjimą prie DB suteikime vartotojui ‘vejojegaines’ su tokiu pat slaptažodžiu.

#mysql -u root

mysql>grant all on vejojegaines.* to vejojegaines identified by ‘vejojegaines’;

Pastaba: mysql root vartotojas be slaptažodžio! Antros kortelės instaliavime root vartotojui suteiktas ‘root’ slaptažodis.

Laikas pagalvoti apie DB lentelių struktūrą. Vieną iš jų pavadinkime ‘duomenys’. Į šią lentelę rašysime duomenis, analogiškus Arduino programos rašomiems į SD kortelę. Patogumo dėlei, koreguojame /etc/mysql/my.cnf failą užkomentuodami eilutę ‘bind address’, tuo leisdami prisijungti prie MySQL serverio iš bet kurio adreso. Dabar jungiamės iš darbinio kompiuterio su programa ‘MySQL query browser’ adresu 192.168.2.177 (tokį nustatėme kaip statinį adresą /etc/networks/interfaces faile – -pasenęs metodas. Antros kortelės instaliavime statinis tinklo adtesas aprašomas /etc/dhcpd.conf faile).

Lentelėje ‘duomenys’ rašysime jėgainių darbo parametrus kaip: laikas, srovė, įtampa, temperatūra, vėjo greitis. Kiekviena jėgainė turi savo ‘vid’ identifikatorių, kuris įrašomas kartu su kitais duomenimis. vid ir gid – grupės identifikatorius apibrėžia grupę, kuriai priklauso jėgainė. Ši priklausomybė įrašoma į lentelę ‘grupes’. Dar viena lentelė jegaine aprašo jėgainės pavadinimą. Čia galimi ir kiti parametrai, kaip adresas, galingumas ir kiti nekintantys parametrai. Lentelių struktūra aprašyta atskirame straipsnyje:

MySQL, Apache, PHP instaliavimas

Pasileidžiu termilnalą pasitiktinti, gal yra PHP?
#sudo su –
#find / -name php.ini
Nieko nerado. Tada einu į Menu->Preferences->Add/Remove Software.Randu Apache HTTP Server (apache2-2.4.10-10+deb8u4), pažymiu varnele ir spaudžiu OK. Prašo autorizacijos, pasirinkimui useris: pi arba root. Šiaip sistemoje root nesuteiktas slaptažodis, tačiau čia root be slaptažodžio netinka. Pakeičiu root slaptažodį į ‘root’ komanda ‘passwd root’ tame pačiame, kaip ir failo paieškos terminaliniame lange. Toliau ieškau php5 paketo. Randu server-side, HTML-embeded scripting language(metapackage). Instaliuojam. Sekantis paketas MySQL database server. Papildomai suinstaliuojame mc paketą.

Teko perinstaliuoti visą SD kortelę, taigi pakartoti visas komandas. Čia pateiksiu santrauką, ką reikia instaliuoti
Radau rekomenduotiną eiliškumą su papildomais paketais:

apt-get install mysql-server mysql-client
apt-get install apache2 (apt-get install apache2 -y - ką reiškia raktas -y?)
apt-get install php5 libapache2-mod-php5 
(
paskutinėje Rpi versijoje jau php7 instaliuojamas 
apt-get install php libapache2-mod-php -y 
pataisyti short_open_tag=on faile /etc/php/7.0/apache2/php.ini
Kad veiktų apache su mysql:sudo apt-get install php-mysqli.
kad išvedinėtų klaidas pataisom: display_errors=on nustatymą php.ini faile. 
Be jo error_reporting() funksija neveikia
)
apt-get install proftpd 
apt-get install libmysqlclient-dev 
apt-get install wiringpi 
apt-get install iptraf

Po to perstartuojame apache servisą:
Jei reikia kitų paketų:

apt-get install php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl

Enable Remote Access (Grant) Home / Tutorials / Mysql / Enable Remote Access (Grant) If you try to connect to your mysql server from remote machine, and run into error like below, this article is for you.

Change mysql config
Start with editing mysql config file

vim /etc/mysql/my.cnf

Comment out following lines.

#bind-address           =127.0.0.1
#skip-networking

If you do not find skip-networking line, add it and comment out it.

Restart mysql server.

~/etc/init.d/mysql restart

Change GRANT privilege

Raspbery OS instaliavimas

Iš svetainės https://www.raspberrypi.org/downloads/noobs/ asisiunčiame NOOBS_lite_v1_9. Iš svetainės  https://www.sdcard.org/downloads/formatter_4/eula_windows/index.html atsisiunčiame SD Formatter for Windows.

Suinstaliuojame Formater’į, paleidžiame jį, atliekame kortelės formatavimą, sumetame išzipuotus NOOBS_lite_v1_9 failus į kortelę.

Kortelę įdedam į Raspberį, prijungiam tinklo (LAN) kabelį, USB klaviatūrą, ‘pelę’.  Displėjus pajungtas per HDMI kabelį. Per micro USB jungtį paduodame maitinimą.

IMG03075-20160414-0509

Ekrane atsiranda instaliavimo instrukcija, siūloma prisijungti prie LAN, kad būtų pradėtas tinklinis instaliavimas:

IMG03077-20160414-0511

Pasirenkame Raspbian OS, spaudžiame ‘install’.

IMG03078-20160414-0513

Po geroko laiko (yra progreso juosta apačioje) gauname pranešimą apie sėkmingą sistemos instaliavimą. Paspaudus ‘OK’ Raspbery  persikrauna ir matome tipišką ‘Linux’ OS užsikrovimą. Jis baigiamas grafinės terpės pasikrovimu.

IMG03079-20160414-0552IMG03080-20160414-0553

Sekantis žingsnis MySQL, Apache, PHP instaliavimas.

p.s. geras metas nustatyti laikrodį. date komanda shel’e rodo dviejų valandų nukrypimą. Matomai nenustatyta laiko juosta. Rekomendacijos lokalės ir laiko zonos nustatymui (TY mwd27):

  1. sudo raspi-config
  2. Select Internationalisation Options
  3. Select I2 Change Timezone
  4. Select your Geographical Area
  5. Select your nearest City
  6. Select Finish
  7. Select Yes to reboot now

 

  1. prieš šią operaciją:root@raspberrypi:/home/pi# date
    Thu 17 Nov 07:20:25 UTC 2016
    root@raspberrypi:/home/pi# raspi-config
  2. Current default time zone: ‘Europe/Vilnius’
    Local time is now:      Thu Nov 17 09:21:11 EET 2016.
    Universal Time is now:  Thu Nov 17 07:21:11 UTC 2016.Po jos:
  3. root@raspberrypi:/home/pi# date
    Thu 17 Nov 09:21:23 EET 2016
    root@raspberrypi:/home/pi#

Statinio adreso nustatymui naudojame /etc/dhcpd.conf failą:

by ben2202
I have maybe a solution by editing your /etc/dhcpcd.conf and add the resevation at this end like this :

Code: Select all
    interface eth0
    static ip_address=192.168.2.177
    static routers=192.168.2.1
    static domain_name_servers=192.168.2.1
    static domain_search =

and reboot

rc.local servisas duoda klaidą: failed to start /etc/rc.local Compatibility

Statinio adreso suteikimas: į failą /etc/dhcpcd.conf įrašome eilutes:

interface eth0
static ip_address=192.168.2.177
static routers=192.168.2.1
static domain_name_servers=192.168.2.1
static domain_search=

Leidžiam dirbti su SSH (nutylint uždrausta):

raspi-config

Interfacing options->P2 SSH->Yes

Patogu dirbti suinstaliavus mc paketą:

sudo apt-get install mc