Arduino ja Python

Sain kotitehtäväksi testata pythonin ja arduinon välistä rajapintaa serialin kautta. Ensimmäinen tehtävä on lukea tietokoneella Arduinon lähettämää tietouomasin koodin kirjoittamisen aikana, että koneellani oleva python 3.30 versio ei pysty lähettämään seriaaliin kirjaimia sellaisenaan, vaan ne on muutettava ensin biteiksi. Tämä tapahtuu kirjoittamalla metodiin write() encode-metodin, esimerkiksi write(’5’) riittäisi pythonin aikaisemmille versioille, mutta python 3.30 tulee kirjoittaa write(’5’.encode(’UTF-8’)).

Kirjoitin komentokehotteella seuraavan python-koodin:

import serial

s = serial.Serial(”/dev/ttyACM0”, 9600); //ensimmäinen polku viittaa porttia, johon arduinoni oli kytketty, tarkista oman arduinosi portti ja täydennä koodiin. 9600 viittaa serialmonitorin kanavaan jota käytetään datan lähettämiseen

while True:
print(s.readline());

ja Arduino IDE:lle kirjoitin

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.println(”this will be readable at computer screen”);
delay(1000);
}

python-ohjelma tulostaa seuraavia rivejä sekunnin välein:
B’this will be readable at computer screen\r\n

Seuraavana tehtävänä oli kirjoittaa tietokoneelta arduinolle , tämäkin onnistuu pythonilla käytteäen
serial-porttia Arduinolla

String s;
void setup() {
Serial.begin(9600);
}

void loop() {
while(Serial.available() || s.length() == 18) { //varmistetaan että dataa tulee ja rivin pituus vastaa python-ohjelmaan annettua lausetta
char c = Serial.read();
s = s + c;
}

Serial.println(s);
s = ””;
delay(1000); //odottaa sekunnin
}

ja Pythonille seuraava koodi:

import serial
import time

ser = serial.Serial(”/dev/ttyACM0”, 9600);

while True:
ser.write(”readable at arduino”.encode(’UTF-8’));
time.sleep(2); //odottaa 2 sekuntia

Syöte on luettavissa arduinon serialmonitorilta 9600 baudin kohdalta. Ohjelma tulostaa vuorotellen tekstirivin ja tyhjän rivin johtuen delayn ja time.sleepin aikaerosta

Seuraavana tehtävänä minun tuli tehdä ohjelma, joka kytkee arduinossa olevan ledin päälle ja pois
Sijoitin arduinon digitaaliseen pinniin nro 12 ja GND:hen ledin. seuraavaksi tein seuraavan koodin pythonilla:

import serial
import time

s = serial.Serial(’/dev/ttyACM0’, 9600);

while True:

s.write(’A’.encode(’UTF-8’)); // kirjain A on merkkinä ledin käynnistämisestä Arduinolla
s.close();
print(”led is ON”); //Ilmoitetaan komentokehotteella että ledin pitäisi nyt palaa
time.sleep(5); // odotetaan 5 sekuntia
s.open();
s.write(’B’.encode(’UTF-8’)); // kirjain B on merkkinä ledin sammuttamisesta
s.close();
print(”led is OFF”);
time.sleep(5);
s.open();

ja arduinoon seuraavan koodin

char ser;
void setup() {
Serial.begin(9600);
pinMode(12, OUTPUT);
}

void loop() {
if (Serial.available()) { //Arduino tarkistaa, onko seriaalin kautta tulossa dataa
ser = Serial.read();

if (ser == ’A’) { // mikäli seriaalissa lukee A, laitetaan ledi päälle
digitalWrite(12,HIGH);
}
else if (ser == ’B’) { //mikäli seriaalissa lukee B, laitetaan ledi pois
digitalWrite(12,LOW);
}

Mainokset

Avainsanat: , , , , ,

About Krister Holmström

Opiskelen Haaga-Heliassa Tietojenkäsittelyn koulutusohjelmassa. Kerään kotitehtäviini ja projekteihin liittyviä raportteja ja materiaaleja blogiini, jotta tieto olisi helpommin saatavilla.
%d bloggers like this: