Croduino i Python

Uvod

 
Python je jedan od najpopularnijih i najkorištenijih programskih jezika današnjice, a predviđa mu se još i svjetlija budućnost. Ono što nas više zanima je da omogućava "razgovor" s Croduino putem jednostavnog serijskog sučelja. Svi UNIX sustavi mogu čitati i pisati serijske uređaje, a posao je uvelike olakšan s pySerial libraryom.

Instalacija:Python i pySerial

 
Prije nego krenemo s programiranjem serijskog porta idemo instalirati Python i pySerial.NAPOMENA: u ovom tutorialu koristiti ćemo Python 2.7. Ako želite koristiti Python 3.x pri kraju se nalaze kratka upustva kako prilagoditi kod.
 
Kratko upustva kako instalirati .tar file:
U terminalu izvršite sljedeće naredbe:

tar xfvz /Users/*imekorisnika*/Downloads/pyserial-2.7.tar.gz
cd pyserial-2.7
sudo python setup.py install

Ukoliko koristite Windows OS preuzmite .msi file.

Arduino kod

 
Prvi korak je natjerati Croduino da šalje podatke preko serijskog porta. Ovo je isto kao i kada koristimo serial monitor, dakle koristimo funkciju Serial.print(). Radili smo već nekoliko primjera s printom u Serial Monitor pa ćemo to i iskoristiti. Koristiti ćemo HC-SR04 ultrazvučni modul, a kako možete se prisjetiti u KKM tutorialu.
Za početak idemo spojiti modul na Croduino:
 

Napraviti ćemo i sitne preinake u kodu:

const int trig = 11;        // Trig na PIN11
const int echo = 12;        // Echo na PIN12
 
void setup() {
   
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
   
  Serial.begin(9600);  // zapocinjem serijsku komunikaciju
   
}
 
void loop() {
   
// buduci da ne koristimo library, dolje je napisan nacin komunikacije s modulom
   
  double vrijeme, udaljenost;
   
  digitalWrite(trig, HIGH);   // Slanje triga
  delayMicroseconds(10);      // Odaslani trig traje 10 μs = 0.1 ms
  digitalWrite(trig, LOW);
   
  vrijeme = pulseIn(echo, HIGH);       // Primanje reflektiranog triga
  udaljenost = (vrijeme/2) / 28;       // Racunanje udaljenosti, u centimetrima
                                       // konacna udaljenost senzora od predmeta
                                       // u cm je varijabla "udaljenost"
     
  Serial.println(udaljenost);  
  delay(50);  // preporucena pauza izmedu ocitanja ne bi trebala biti manja od 50ms 
}

Iako, preinake nisu nužne prilagoditi ćemo kod kako bismo mogli nastaviti nove Croduino i Python lekcije na ovaj tutorial.
 
Prije pisanja skripte važno je zapamtiti koji baud rate smo odabrali, te na kojem je portu naš Croduino. Baud rate zadajemo prilikom izvršenja Serial.begin() funkcije, pa pronađimo je u kodu gore:

Serial.begin(9800);

Dakle, baud rate je 9800 bitova po sekundi. pySerial može koristiti razne standardne i nestandardne rateove, a cijeli popis možete pronaći ovdje.
Već smo pričali pronaći vritualni COM port na kojem se nalazi Croduino u tutorialu o Arduino IDE. Ako ste nešto snalažljiviji možete koristiti i Terminal:
 
Mac OS X

ls /dev/tty.*

Linux

ls /dev/ttyUSB*

Python kod

 
Python kod možemo pisati i izvršavati na razne načine, radi jednostavnosti prikaza koristiti ćemo IDLE. Na Windowsima ga možete pronaći na: Start - All programs - Python - IDLE. Ako koristite OSX IDLE se nalazi u Application\Python folderu.
 
Prvi korak je dodati pySerial libray u kod:

import serial 

Nakon toga otvaramo konekciju:

croduinoSerial = serial.Serial('COM71', 9600)

Imajte na umu da su 'COM71' i baud 9600 specifične za Windows računalo koje koristim trenutno. Više pročitajte na pySerial API.
 
Sljedeći korak je napraviti loop koji će neprestano čitati podatke sa serijskog porta:

while True: #beskonacni loop
    if (croduinoSerial.inWaiting() > 0): #ako postoje neki podaci
        myData = croduinoSerial.readline() #spremi podatke u myData
        print (myData)

 
Skriptu možete pokrenuti s F5 tipkom. Nakon toga u Python Shell-u vidimo ispis podataka koje Croduino šalje preko serijskog porta. Imate li potrebu dalje obrađivati primljene podatke, imajte na umu da readline() varijable sprema kao string. U float ih možete promjeniti pomoću:

myData_number = float(myData)

S Pythona na Croduino

 
Slati podatke na Croduino s Python 2.x je vrlo jednostavno:

import serial #ako vec nije dodana, dodajte pySerial library

croduinoSerial = serial.Serial('COM71', 9600) 
croduinoSerial.write('tekst')

Pythona 3.x

 
U python 3.x string je unicode sam po sebi. Kako bi library uspješno radio moramo ga konvertati u byte, što nije bilo nužno za Python 2.x:

croduinoSerial.write(b'tekst')

Što još?

 
Postoji nekoliko vrlo dobrih open-source platformi za ostvarivanje ove komunikacije. Večina njih ima GUI (Graphical User Interface) framework za kontrolu, a pojedini prikazuju i prikupljene podatake u realtime-u u obliku dijagrama. Naše preporuke su:
Instrumentino
Python Firmata
GUI s pySerial i Matplotlib
 
Plan je u idućim lekcijama nešto slično i sami napraviti, kako bismo što bolje shvatili način komuniciranja Croduina i Pythona. Ako imate problema s izvođenjem slobodno ostavite pitanje ili komentar kako bi unaprijedili ovaj tutorial...

Leave a Reply